Skip to content

Commit 40328f6

Browse files
committed
deploy: 642dfb9
1 parent f9a41ef commit 40328f6

12 files changed

+265
-35
lines changed
Loading

index.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,17 @@
66
<description>Recent content on Leipzig Gophers</description>
77
<generator>Hugo -- gohugo.io</generator>
88
<language>en-us</language>
9-
<lastBuildDate>Fri, 28 Mar 2025 08:00:00 +0200</lastBuildDate><atom:link href="https://golangleipzig.space/index.xml" rel="self" type="application/rss+xml" />
9+
<lastBuildDate>Thu, 01 May 2025 08:00:00 +0100</lastBuildDate><atom:link href="https://golangleipzig.space/index.xml" rel="self" type="application/rss+xml" />
10+
<item>
11+
<title>Hybrid Meetup #50 wrap-up</title>
12+
<link>https://golangleipzig.space/posts/meetup-50-wrapup/</link>
13+
<pubDate>Thu, 01 May 2025 08:00:00 +0100</pubDate>
14+
15+
<guid>https://golangleipzig.space/posts/meetup-50-wrapup/</guid>
16+
<description>Live and Let Die: The Mail is Not Enough Hybrid Meetup #50 took place 2025-04-29 19:00 at Basislager Leipzig and we had an insightful presentation on How a Go project dies; lessons learned, challenges to revive it and the scars I got on the way.
17+
Leandro tooks us on a journey into the postfix mail transport agent (MTA) monitoring project controlcenter, written in Go, how it started and factors that contributed to its stalling.</description>
18+
</item>
19+
1020
<item>
1121
<title>Hybrid Meetup #50 invitation</title>
1222
<link>https://golangleipzig.space/posts/meetup-50-invitation/</link>

posts/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,19 @@
3737

3838
<ul>
3939

40+
<li>
41+
<a href="/posts/meetup-50-wrapup/">Hybrid Meetup #50 wrap-up
42+
</a>
43+
44+
45+
<div class="post-meta"><time datetime="2025-05-01">May 1, 2025</time><div class="tags">
46+
Tags
47+
<a class="tag" href="https://golangleipzig.space/tags/summary/">summary</a>
48+
<a class="tag" href="https://golangleipzig.space/tags/meetup/">meetup</a>
49+
</div>
50+
</div>
51+
</li>
52+
4053
<li>
4154
<a href="/posts/meetup-50-invitation/">Hybrid Meetup #50 invitation
4255
</a>

posts/index.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,17 @@
66
<description>Recent content in Posts on Leipzig Gophers</description>
77
<generator>Hugo -- gohugo.io</generator>
88
<language>en-us</language>
9-
<lastBuildDate>Fri, 28 Mar 2025 08:00:00 +0200</lastBuildDate><atom:link href="https://golangleipzig.space/posts/index.xml" rel="self" type="application/rss+xml" />
9+
<lastBuildDate>Thu, 01 May 2025 08:00:00 +0100</lastBuildDate><atom:link href="https://golangleipzig.space/posts/index.xml" rel="self" type="application/rss+xml" />
10+
<item>
11+
<title>Hybrid Meetup #50 wrap-up</title>
12+
<link>https://golangleipzig.space/posts/meetup-50-wrapup/</link>
13+
<pubDate>Thu, 01 May 2025 08:00:00 +0100</pubDate>
14+
15+
<guid>https://golangleipzig.space/posts/meetup-50-wrapup/</guid>
16+
<description>Live and Let Die: The Mail is Not Enough Hybrid Meetup #50 took place 2025-04-29 19:00 at Basislager Leipzig and we had an insightful presentation on How a Go project dies; lessons learned, challenges to revive it and the scars I got on the way.
17+
Leandro tooks us on a journey into the postfix mail transport agent (MTA) monitoring project controlcenter, written in Go, how it started and factors that contributed to its stalling.</description>
18+
</item>
19+
1020
<item>
1121
<title>Hybrid Meetup #50 invitation</title>
1222
<link>https://golangleipzig.space/posts/meetup-50-invitation/</link>

posts/meetup-50-wrapup/index.html

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
7+
<title>Hybrid Meetup #50 wrap-up | Leipzig Gophers</title>
8+
9+
<style>body{margin:1em auto;padding:1em;color:#2f2d2e;max-width:45em;line-height:1.6;font-family:Georgia,serif;font-size:1.2em}h1{border-bottom:2pt solid #2f2d2e}.header-menu{float:right}ul.pagination{list-style-type:none;text-align:center;padding:0}ul.pagination>li{padding:0 .4em;display:inline-block}div.footer{border-top:1pt solid;text-align:center;padding:1em}img{max-width:100%;max-height:100%;display:block;margin-left:auto;margin-right:auto}@media(min-width:45em){div.tags{float:right}}img[src*="#half"]{width:50%}a{text-decoration:none;color:#35a7ff;border-bottom:2pt solid #fff}a:visited{color:#ff5964}a:hover{border-bottom:2pt solid #ff5964;transition:all 333ms ease-in}a.tag{padding:.1em .4em;background:#2f2d2e;color:#fff;text-decoration:none;border-radius:5pt}a.anchor{padding-right:.3em;color:#d3d3d3}blockquote{color:#838383}</style>
10+
11+
12+
13+
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
14+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
15+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
16+
<link rel="manifest" href="/site.webmanifest">
17+
<meta name='impact-site-verification' value='54840aba-1503-416b-b5d7-dafee41af763'>
18+
19+
20+
21+
</head>
22+
23+
24+
<body>
25+
<div class="header">
26+
<a href="/">Leipzig Gophers</a>
27+
<div class="header-menu">
28+
<a href="/posts/">blog</a>
29+
</div>
30+
</div>
31+
<div id="content">
32+
33+
<header>
34+
<h1 id="#hybrid-meetup-50-wrap-up">
35+
<a class="anchor" href="#hybrid-meetup-50-wrap-up">🔗</a>Hybrid Meetup #50 wrap-up</h1>
36+
37+
38+
<div class="post-meta"><time datetime="2025-05-01">May 1, 2025</time><div class="tags">
39+
Tags
40+
<a class="tag" href="https://golangleipzig.space/tags/summary/">summary</a>
41+
<a class="tag" href="https://golangleipzig.space/tags/meetup/">meetup</a>
42+
</div>
43+
</div>
44+
</header>
45+
<article>
46+
<h2 id="live-and-let-die-the-mail-is-not-enough">Live and Let Die: The Mail is Not Enough</h2>
47+
<p>Hybrid Meetup #50 took place
48+
<a href="https://www.meetup.com/leipzig-golang/events/306803728">2025-04-29</a> 19:00 at
49+
<a href="https://basislager.co">Basislager Leipzig</a> and we had an insightful
50+
presentation on <em>How a Go project dies; lessons learned, challenges to revive
51+
it and the scars I got on the way</em>.</p>
52+
<p><a href="https://www.linkedin.com/in/leandrosansilva/">Leandro</a> tooks us on a journey
53+
into the <a href="https://www.postfix.org/">postfix</a> mail transport agent (MTA) monitoring project
54+
<a href="https://gitlab.com/leandrosansilva/controlcenter">controlcenter</a>, written in
55+
Go, how it started and factors that contributed to its stalling. The company
56+
around it, <a href="https://lightmeter.io/">Lightmeter</a>, was part of the <a href="https://www.ycombinator.com/companies/lightmeter">YC-W22
57+
batch</a>, and covered by
58+
<a href="https://www.heise.de/news/Lightmeter-Neues-Monitoring-Werkzeug-fuer-den-E-Mail-Server-4647424.html">heise.de</a>,
59+
<a href="https://www.forbes.com/sites/davidjeans/2021/03/01/elastic-war-on-amazon-web-services/">Forbes</a>
60+
and others.</p>
61+
<p>The slides can be found <a href="/downloads/leipzig-gophers-50-2025-04-29-controlcenter-mta-monitoring-how-a-go-project-lives-and-dies.html">here</a>:</p>
62+
<p><a href="/downloads/leipzig-gophers-50-2025-04-29-controlcenter-mta-monitoring-how-a-go-project-lives-and-dies.html"><img src="/images/leipzig-gophers-50-how-a-go-project-lives-and-dies.png" alt=""></a></p>
63+
<h3 id="selected-takeaways">Selected takeaways</h3>
64+
<ul>
65+
<li>Monoliths are still ok!</li>
66+
<li>A monolith can look like a set of microservices too; with one database
67+
per component and intra-process communication through channels</li>
68+
<li>Reusability as beneficial <a href="https://www.dcs.gla.ac.uk/~johnson/papers/RESS/Complexity_Emergence_Editorial.pdf">emergent property</a> &ndash; and not a goal in and of itself</li>
69+
<li>Parsing postfix logs can be a challenge (cf. &ldquo;<a href="https://scispace.com/pdf/a-user-extensible-and-adaptable-parser-architecture-4nocz4o09k.pdf">A User-Extensible and
70+
Adaptable Parser Architectur</a>&quot;)</li>
71+
<li>Controlcenter took inspiration from Apple&rsquo;s <a href="https://en.wikipedia.org/wiki/Grand_Central_Dispatch">Grand Central
72+
Dispatch</a> for handling
73+
concurrency and taking advantage of multicore machines in the presence of
74+
limitations (e.g. <em>usually, SQLite allows at most one writer to proceed
75+
concurrently</em>)
76+
(<a href="https://www.sqlite.org/src/doc/begin-concurrent/doc/begin_concurrent.md">docs</a>)</li>
77+
<li>Sqlite3 <a href="https://sqlite.org/forum/info/78a60bdeec7c1ee9">does not implement</a>
78+
stored procedures, but it has <a href="https://sqlite.org/appfunc.html">application defined
79+
functions</a>; with the Go sqlite3 wrapper, you
80+
can use
81+
<a href="https://pkg.go.dev/github.com/mattn/go-sqlite3#SQLiteConn.RegisterFunc">RegisterFunc</a>
82+
to blend Go and SQL</li>
83+
<li>The universe of possible postfix setups is huge, and it is impossible to
84+
anticipate the layout of all log lines the application would ever encounter;
85+
use a crash-first approach to iterate; implemented with a custom assertion
86+
package (since Go does not have
87+
<a href="https://en.wikipedia.org/wiki/Assertion_(software_development)">assertions</a>); telemetry would help to learn about usage in the wild, but users may not support it</li>
88+
<li>Early returns, or guard clauses, or the <a href="https://scribe.rip/@matryer/line-of-sight-in-code-186dd7cdea88">left-hand rule</a> can lead to <em>else-less code</em> &ndash; also also avoid the <a href="http://wiki.c2.com/?ArrowAntiPattern">arrow anti-pattern</a></li>
89+
<li>Controlcenter decided against ORM: tighter coupling, but less complexity and more transparency</li>
90+
<li>Unfortunately, great software with users does not automatically translate to a product with customers</li>
91+
</ul>
92+
<p>The open source project is looking for contributors. If you are into mailops, then please take
93+
a look at <a href="https://gitlab.com/leandrosansilva/controlcenter">controlcenter repository</a>.</p>
94+
<h2 id="misc">Misc</h2>
95+
<ul>
96+
<li>Google <a href="https://opensource.googleblog.com/2023/03/introducing-service-weaver-framework-for-writing-distributed-applications.html">tried
97+
out</a>
98+
to a monolithic microservice approach with the now discontinued <a href="https://serviceweaver.dev/">Service
99+
Weaver</a>:</li>
100+
</ul>
101+
<blockquote>
102+
<p>Under the covers, Service Weaver will dissect your binary along component
103+
boundaries, allowing different components to run on different machines. &ndash; <a href="https://serviceweaver.dev/docs.html">docs</a></p>
104+
</blockquote>
105+
<p>Reflected upon also in <a href="https://arxiv.org/pdf/2401.11867">Modular Monolith: Is This the Trend in Software
106+
Architecture?</a>; cf. <a href="https://arxiv.org/pdf/2308.15281">Back to the Future: From
107+
Microservices to Monolith</a>.</p>
108+
<ul>
109+
<li>Go has an a bit unusual set of ORM libraries: classical ones like
110+
<a href="https://gorm.io/index.html">GORM</a>, more code-generation oriented ones like
111+
<a href="https://sqlc.dev/">sqlc</a> or <a href="https://github.com/ent/ent">ent</a>; fluent query
112+
builder, like <a href="https://github.com/stephenafamo/bob">bob</a>, or thin wrappers,
113+
like <a href="https://github.com/jmoiron/sqlx">sqlx</a>; generic
114+
<a href="https://github.com/go-goe/goe">goe</a> and more</li>
115+
<li>Object-relational mapping works best until it does not</li>
116+
<li>The Go project added telemetry and made the case that open source projects
117+
can benefit from telemetry, and that telemetry can be implemented sensible,
118+
too; Russ Cox has written about <a href="https://research.swtch.com/telemetry">Transparent
119+
Telemetry</a> as well</li>
120+
<li>Hosting an email server yourself is not too complicated (cf. <a href="https://github.com/mail-in-a-box/mailinabox">mail-in-a-box</a>), but there is a risk
121+
being blacklisted and then miss out of important messages</li>
122+
<li>If you run your own email server, you may receive less spam</li>
123+
<li><a href="https://www.emailisnotdead.com/">Is email dead</a>? Hint: while you read this
124+
blog post, the world moved 115,403,640 (legitimate) emails forward.</li>
125+
</ul>
126+
<p>Thanks again to <a href="https://www.linkedin.com/in/leandrosansilva/">Leandro</a> for the
127+
talk and insights!</p>
128+
<p><a href="https://www.meetup.com/de-DE/leipzig-golang/">Join our meetup</a> to get notified of upcoming events.</p>
129+
130+
</article>
131+
132+
133+
</div>
134+
<div class="footer">
135+
136+
137+
<div class="footer-links">
138+
<a href="https://www.meetup.com/Leipzig-Golang/">Meetup</a><span> / <span><a href="https://github.com/golang-leipzig">GitHub</a><span> / <span><a href="https://raw.githubusercontent.com/golang-leipzig/golang-leipzig.github.io/source/Impressum.txt">Imprint</a><span> / <span><a href="/qr.png">QR</a><span> / <span><a href="https://1mb.club/">1MB</a></div>
139+
140+
141+
142+
143+
</div>
144+
</body>
145+
146+
</html>

sitemap.xml

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,47 @@
33
xmlns:xhtml="http://www.w3.org/1999/xhtml">
44

55
<url>
6-
<loc>https://golangleipzig.space/tags/announcement/</loc>
7-
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
8-
</url>
9-
10-
<url>
11-
<loc>https://golangleipzig.space/posts/meetup-50-invitation/</loc>
12-
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
6+
<loc>https://golangleipzig.space/posts/meetup-50-wrapup/</loc>
7+
<lastmod>2025-05-01T08:00:00+01:00</lastmod>
138
</url>
149

1510
<url>
1611
<loc>https://golangleipzig.space/</loc>
17-
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
12+
<lastmod>2025-05-01T08:00:00+01:00</lastmod>
1813
</url>
1914

2015
<url>
2116
<loc>https://golangleipzig.space/tags/meetup/</loc>
22-
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
17+
<lastmod>2025-05-01T08:00:00+01:00</lastmod>
2318
</url>
2419

2520
<url>
2621
<loc>https://golangleipzig.space/posts/</loc>
27-
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
22+
<lastmod>2025-05-01T08:00:00+01:00</lastmod>
23+
</url>
24+
25+
<url>
26+
<loc>https://golangleipzig.space/tags/summary/</loc>
27+
<lastmod>2025-05-01T08:00:00+01:00</lastmod>
2828
</url>
2929

3030
<url>
3131
<loc>https://golangleipzig.space/tags/</loc>
32+
<lastmod>2025-05-01T08:00:00+01:00</lastmod>
33+
</url>
34+
35+
<url>
36+
<loc>https://golangleipzig.space/tags/announcement/</loc>
3237
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
3338
</url>
3439

3540
<url>
36-
<loc>https://golangleipzig.space/posts/meetup-49-wrapup/</loc>
37-
<lastmod>2025-03-26T08:00:00+01:00</lastmod>
41+
<loc>https://golangleipzig.space/posts/meetup-50-invitation/</loc>
42+
<lastmod>2025-03-28T08:00:00+02:00</lastmod>
3843
</url>
3944

4045
<url>
41-
<loc>https://golangleipzig.space/tags/summary/</loc>
46+
<loc>https://golangleipzig.space/posts/meetup-49-wrapup/</loc>
4247
<lastmod>2025-03-26T08:00:00+01:00</lastmod>
4348
</url>
4449

tags/index.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,31 +38,31 @@
3838
<ul>
3939

4040
<li>
41-
<a href="/tags/announcement/">announcement
41+
<a href="/tags/meetup/">meetup
4242
</a>
4343

4444

45-
<div class="post-meta"><time datetime="2025-03-28">Mar 28, 2025</time><div class="tags">
45+
<div class="post-meta"><time datetime="2025-05-01">May 1, 2025</time><div class="tags">
4646
</div>
4747
</div>
4848
</li>
4949

5050
<li>
51-
<a href="/tags/meetup/">meetup
51+
<a href="/tags/summary/">summary
5252
</a>
5353

5454

55-
<div class="post-meta"><time datetime="2025-03-28">Mar 28, 2025</time><div class="tags">
55+
<div class="post-meta"><time datetime="2025-05-01">May 1, 2025</time><div class="tags">
5656
</div>
5757
</div>
5858
</li>
5959

6060
<li>
61-
<a href="/tags/summary/">summary
61+
<a href="/tags/announcement/">announcement
6262
</a>
6363

6464

65-
<div class="post-meta"><time datetime="2025-03-26">Mar 26, 2025</time><div class="tags">
65+
<div class="post-meta"><time datetime="2025-03-28">Mar 28, 2025</time><div class="tags">
6666
</div>
6767
</div>
6868
</li>

tags/index.xml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,11 @@
66
<description>Recent content in Tags on Leipzig Gophers</description>
77
<generator>Hugo -- gohugo.io</generator>
88
<language>en-us</language>
9-
<lastBuildDate>Fri, 28 Mar 2025 08:00:00 +0200</lastBuildDate><atom:link href="https://golangleipzig.space/tags/index.xml" rel="self" type="application/rss+xml" />
10-
<item>
11-
<title>announcement</title>
12-
<link>https://golangleipzig.space/tags/announcement/</link>
13-
<pubDate>Fri, 28 Mar 2025 08:00:00 +0200</pubDate>
14-
15-
<guid>https://golangleipzig.space/tags/announcement/</guid>
16-
<description></description>
17-
</item>
18-
9+
<lastBuildDate>Thu, 01 May 2025 08:00:00 +0100</lastBuildDate><atom:link href="https://golangleipzig.space/tags/index.xml" rel="self" type="application/rss+xml" />
1910
<item>
2011
<title>meetup</title>
2112
<link>https://golangleipzig.space/tags/meetup/</link>
22-
<pubDate>Fri, 28 Mar 2025 08:00:00 +0200</pubDate>
13+
<pubDate>Thu, 01 May 2025 08:00:00 +0100</pubDate>
2314

2415
<guid>https://golangleipzig.space/tags/meetup/</guid>
2516
<description></description>
@@ -28,12 +19,21 @@
2819
<item>
2920
<title>summary</title>
3021
<link>https://golangleipzig.space/tags/summary/</link>
31-
<pubDate>Wed, 26 Mar 2025 08:00:00 +0100</pubDate>
22+
<pubDate>Thu, 01 May 2025 08:00:00 +0100</pubDate>
3223

3324
<guid>https://golangleipzig.space/tags/summary/</guid>
3425
<description></description>
3526
</item>
3627

28+
<item>
29+
<title>announcement</title>
30+
<link>https://golangleipzig.space/tags/announcement/</link>
31+
<pubDate>Fri, 28 Mar 2025 08:00:00 +0200</pubDate>
32+
33+
<guid>https://golangleipzig.space/tags/announcement/</guid>
34+
<description></description>
35+
</item>
36+
3737
<item>
3838
<title>2024</title>
3939
<link>https://golangleipzig.space/tags/2024/</link>

tags/meetup/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,19 @@
3737

3838
<ul>
3939

40+
<li>
41+
<a href="/posts/meetup-50-wrapup/">Hybrid Meetup #50 wrap-up
42+
</a>
43+
44+
45+
<div class="post-meta"><time datetime="2025-05-01">May 1, 2025</time><div class="tags">
46+
Tags
47+
<a class="tag" href="https://golangleipzig.space/tags/summary/">summary</a>
48+
<a class="tag" href="https://golangleipzig.space/tags/meetup/">meetup</a>
49+
</div>
50+
</div>
51+
</li>
52+
4053
<li>
4154
<a href="/posts/meetup-50-invitation/">Hybrid Meetup #50 invitation
4255
</a>

tags/meetup/index.xml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,17 @@
66
<description>Recent content in meetup on Leipzig Gophers</description>
77
<generator>Hugo -- gohugo.io</generator>
88
<language>en-us</language>
9-
<lastBuildDate>Fri, 28 Mar 2025 08:00:00 +0200</lastBuildDate><atom:link href="https://golangleipzig.space/tags/meetup/index.xml" rel="self" type="application/rss+xml" />
9+
<lastBuildDate>Thu, 01 May 2025 08:00:00 +0100</lastBuildDate><atom:link href="https://golangleipzig.space/tags/meetup/index.xml" rel="self" type="application/rss+xml" />
10+
<item>
11+
<title>Hybrid Meetup #50 wrap-up</title>
12+
<link>https://golangleipzig.space/posts/meetup-50-wrapup/</link>
13+
<pubDate>Thu, 01 May 2025 08:00:00 +0100</pubDate>
14+
15+
<guid>https://golangleipzig.space/posts/meetup-50-wrapup/</guid>
16+
<description>Live and Let Die: The Mail is Not Enough Hybrid Meetup #50 took place 2025-04-29 19:00 at Basislager Leipzig and we had an insightful presentation on How a Go project dies; lessons learned, challenges to revive it and the scars I got on the way.
17+
Leandro tooks us on a journey into the postfix mail transport agent (MTA) monitoring project controlcenter, written in Go, how it started and factors that contributed to its stalling.</description>
18+
</item>
19+
1020
<item>
1121
<title>Hybrid Meetup #50 invitation</title>
1222
<link>https://golangleipzig.space/posts/meetup-50-invitation/</link>

0 commit comments

Comments
 (0)