Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://reinout.vanrees.org/weblog/atom.xml

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <feed xmlns="http://www.w3.org/2005/Atom"
  3.      xmlns:dc="http://purl.org/dc/elements/1.1/"
  4.      xml:base="http://reinout.vanrees.org/" xml:lang="en">
  5.  <link rel="self"
  6.        href="http://reinout.vanrees.org/weblog/atom.xml" />
  7.  <link href="http://reinout.vanrees.org/weblog/"
  8.        rel="alternate" type="text/html" />
  9.  
  10.  <div xmlns="http://www.w3.org/1999/xhtml">
  11.    <a href="http://www.atomenabled.org/feedvalidator/check.cgi?url=http%3A%2F%2Freinout.vanrees.org%2Fweblog%2Fatom.xml">
  12.      <img title="Validate my Atom feed" width="88"
  13.           height="31"
  14.           src="http://www.atomenabled.org/feedvalidator/images/valid-atom.png"
  15.           alt="[Valid Atom]" border="0px" />
  16.    </a>
  17.    <p>
  18.      <span>
  19.        This is an Atom formatted XML site feed. It is intended to be viewed in
  20.        a Newsreader or syndicated to another site. Please visit
  21.      </span>
  22.      <a href="http://www.atomenabled.org/">Atom Enabled</a>
  23.      <span>
  24.        for more info.
  25.      </span>
  26.    </p>
  27.  </div>
  28.  
  29.  <title type="html">Reinout van Rees' weblog</title>
  30.  <subtitle>Python, grok, books, history, faith, etc.</subtitle>
  31.  <updated>2009-04-04T21:44:00+01:00</updated>
  32.  <id>urn:syndication:a55644db8591c020bd38852775819a9a</id>
  33.  
  34.  
  35.  <entry>
  36.    <title>My article in the German "ADJ" magazine</title>
  37.    <link rel="alternate" type="text/html"
  38.          href="http://reinout.vanrees.org/weblog/2025/06/19/anlagen-design-journal.html" />
  39.      <id>http://reinout.vanrees.org/weblog/2025/06/19/anlagen-design-journal.html</id>
  40.      <author>
  41.        <name>Reinout van Rees</name>
  42.      </author>
  43.      <published>2025-06-19T00:00:00+01:00</published>
  44.      <updated>2025-06-19T21:39:00+01:00</updated>
  45.  
  46.      
  47.      <category term="eifelburgenbahn" />
  48.      
  49.      <category term="trains" />
  50.      
  51.  
  52.      <content type="html"><![CDATA[
  53.        <div class="document">
  54. <p>I've got a realistic German model railway in my attic and I tend to take that realism
  55. seriously. So I spend a lot of time researching things like proper signalling and
  56. operation. For mainline operations, you can find a lot of information on
  57. signalling. Everything is by the book. But for simple single track branch lines, things
  58. get harder to figure out.</p>
  59. <p>How do things work when there are no electrical block systems between the stations and
  60. all you have is a telephone line? And what if the station isn't even manned? No signals?
  61. Anyway, it has been fun trying to figure it out. I've <a class="reference external" href="https://youtu.be/MhYT2wxuXKc">made a 45 minute video explaining it</a> in the context of one of my two stations.</p>
  62. <p>And... I've re-worked the video into a proper article for the German <a class="reference external" href="https://www.jaffas-moba-shop.de/anlagen-design-journal/">Anlagen Design
  63. Journal</a>, the <a class="reference external" href="https://www.jaffas-moba-shop.de/anlagen-design-journal/adj-17-juli-2025/">#17 issue</a>.</p>
  64. <img alt="https://up.picr.de/49746695jo.jpeg" src="https://up.picr.de/49746695jo.jpeg" />
  65. <p>On five pages, I'm allowed to explain the German <strong>theory</strong> and the (mostly cheap)
  66. <strong>practical solutions</strong> I used for my &quot;Eifelburgenbahn&quot; layout.</p>
  67. <p>Note: I also really like the rest of this issue, it is one of the best in the series. If
  68. you can read German and like model railways, you might want to snag a copy for just €8
  69. as an <a class="reference external" href="https://www.jaffas-moba-shop.de/buecher/">&quot;Einzelheftbestellung&quot; directly from the small publisher</a> (Tip, #6 has my other big article: a good
  70. summary of my layout.)</p>
  71. </div>
  72.  
  73.        ]]>
  74.      </content>
  75.  
  76.    </entry>
  77.    
  78.  <entry>
  79.    <title>iSAQB meetup: software architecture decision making in practice</title>
  80.    <link rel="alternate" type="text/html"
  81.          href="http://reinout.vanrees.org/weblog/2025/06/13/software-architecture.html" />
  82.      <id>http://reinout.vanrees.org/weblog/2025/06/13/software-architecture.html</id>
  83.      <author>
  84.        <name>Reinout van Rees</name>
  85.      </author>
  86.      <published>2025-06-13T00:00:00+01:00</published>
  87.      <updated>2025-06-13T08:23:00+01:00</updated>
  88.  
  89.      
  90.      <category term="python" />
  91.      
  92.  
  93.      <content type="html"><![CDATA[
  94.        <div class="document">
  95. <p>I attended <a class="reference external" href="https://www.meetup.com/isaqb-nl/events/307920595/">a meetup</a> of the <a class="reference external" href="https://www.meetup.com/isaqb-nl/">Dutch
  96. iSAQB community</a> in Utrecht (NL). The location was
  97. in the old industrial buildings of the former <a class="reference external" href="https://en.wikipedia.org/wiki/Werkspoor">werkspoor</a> train manufacturer, something I personally
  98. like :-)</p>
  99. <p>(At least three people asked me during dinner whether there were any Dutch <strong>python</strong>
  100. meetups, so I'll post the three active ones that I know of here for ease of finding
  101. them: <a class="reference external" href="https://www.meetup.com/pyutrecht/">Utrecht</a>, <a class="reference external" href="https://www.meetup.com/python-leiden-user-group/">Leiden</a> and <a class="reference external" href="https://www.meetup.com/pyamsterdam/">Amsterdam</a>. And don't forget the two one-day conferences,
  102. <a class="reference external" href="https://pygrunn.org/">PyGrunn (Groningen)</a> and <a class="reference external" href="https://pycon-nl.org/">pycon NL (Utrecht)</a>.)</p>
  103. <div class="section" id="making-significant-software-architecture-decisions-bert-jan-schrijver">
  104. <h1>Making significant software architecture decisions - Bert Jan Schrijver</h1>
  105. <p>Software architecture. <em>What is software?</em> Algorithms, code-that-works,
  106. the-part-you-cannot-kick. And <em>what is software architecture?</em> The part that is
  107. expensive to change, the structure of the system, best practices. The <strong>decisions</strong> that
  108. are important and hard and expensive to change. Software architecture is about
  109. <strong>making decisions</strong>. Decisions that hurt when you get them wrong.</p>
  110. <p>There are bad reasons for architecture decisions:</p>
  111. <ul class="simple">
  112. <li>We've always done it like this.</li>
  113. <li>We don't want to depend on XYZ.</li>
  114. <li>We need to be future-proof. (You often get elaborate complex systems with this
  115. reasoning. Isn't a simple solution more changeable and future-proof?)</li>
  116. <li>Because the product owner wants it.</li>
  117. <li>Because the architect wants it. (If the architect wants something without real
  118. feedback from the team that has to build it.)</li>
  119. </ul>
  120. <p>Some input you can use for architecture decisions:</p>
  121. <ul class="simple">
  122. <li>5xW. Why, why, why, why, why. After asking &quot;why&quot; five times, you really get to the
  123. core.</li>
  124. <li>Every architecture decision <strong>should have a business component</strong>. (Don't pick a fancy
  125. framework when there's no business need.)</li>
  126. <li>Requirements.</li>
  127. <li>Constraints.</li>
  128. </ul>
  129. <p>You also have to look at quality. <a class="reference external" href="https://www.iso25000.com/images/figures/iso_25010_en.png">ISO 25010</a> is a great
  130. checklist for software quality: self-descriptiveness, availability, recoverability,
  131. capacity, integrity, modifiability, testability, etc.</p>
  132. <p>The perfect architecture doesn't exist, there are always trade-offs. Trade-off analysis
  133. can help you. Gather requirements, figure out quality attributes and constraints, select
  134. potential solutions, discover/weigh trade-offs, pick the best fitting solution. You can look at the book <a class="reference external" href="https://www.oreilly.com/library/view/fundamentals-of-software/9781492043447/">fundamentals
  135. of software architecture</a>.</p>
  136. <p>An example? Security versus usability: 2FA is great for security, but a pain to
  137. use. Availability versus costs: more redundancy and more servers also mean it costs
  138. more. He recommends <a class="reference external" href="https://www.youtube.com/watch?v=uQ_sSC9gAsU">this video</a>.</p>
  139. <p>Something to keep in mind: <strong>organisational factors</strong>. What is the developer experience
  140. for your idea? The learning curve? IDE support? Does it integrate with the current
  141. landscape? How popular is it in the industry as a whole? What is the long-term
  142. viability? Will it still be actively developed and is there a community?</p>
  143. <p>And there are business factors. Support. Labour pool. License costs.  What are the
  144. <em>costs</em> of migration versus the <em>benefits</em> after migration? Productivity. Is there an
  145. exit strategy if you want to move away from a provider or technology?</p>
  146. <p>Some trade-offs shouldn't even need to be considered. For instance when something risks
  147. irreversible damage to your business.</p>
  148. </div>
  149. <div class="section" id="creating-effective-and-objective-architectural-decision-records-adrs-piet-van-dongen">
  150. <h1>Creating effective and objective architectural decision records (ADRs) - Piet van Dongen</h1>
  151. <p>Nothing is static. People change jobs, business goals change, budgets change, etc. Time
  152. goes on and during this time you are making decisions. When a new colleague joins, is it
  153. clear which decisions have been made beforehand? Are decisions <strong>discoverable</strong>? And can
  154. the decisions be explained? Are they <strong>appropriate</strong>?</p>
  155. <p>He asked &quot;did you ever disagree with a decision that involved you?&quot;. Almost all hands
  156. went up. Bad decisions might have been made in the past because better solutions weren't
  157. known or available at the time. Or there was time pressure. Unclarity on the
  158. requirements. All reasons for decisions to be bad.</p>
  159. <p>Decisions should be made when you really <strong>understand</strong> the context, which should be
  160. clear. And the decision should be <strong>objective</strong> and logical and clear and
  161. well-explained. And they should be made by the right stakeholders: was it a <strong>shared</strong>
  162. decision?</p>
  163. <p>Note: architecture work isn't only done by official architects.</p>
  164. <p>Some archetypes of wrong decision-making:</p>
  165. <ul class="simple">
  166. <li>Aristocrats. A decision made by a small group of self-appointed experts. Ivory
  167. tower. They only explain why their decision is perfect, but they don't concern
  168. themselves with trade-offs.</li>
  169. <li>Unobtainium. A theoretically perfect decision, but that totally isn't implementable.</li>
  170. <li>Ivory tower dump. Even more ivory tower than the <em>aristocrats</em>. Totally no input from
  171. the team.</li>
  172. <li>Pros and cons. Endless lists of pros and cons.</li>
  173. <li>Polder model. Consensus-based. A decision made by a huge group. Endless meetings.</li>
  174. </ul>
  175. <p>Now... <strong>how to make decisions in the right way?</strong> ADRs, Architecture Decision
  176. Records. A structured/standardised document that documents the decision. Structure? For
  177. instance:</p>
  178. <ul>
  179. <li><p class="first">Title + state + summary. Handy for easy scanning. State is something like &quot;decided&quot; or
  180. &quot;rejected&quot;.</p>
  181. </li>
  182. <li><p class="first">Stakeholders. Names plus the roles they had when the decision was made. Find
  183. stakeholders by looking with a 2x2 matrix: high/low power, high/low interest. A boss
  184. might be high power, low interest: keep him appropriately informed. High power, high
  185. interest: really involve them.</p>
  186. </li>
  187. <li><p class="first">Context of the decision. Clear and sharp. What is in scope, what not?</p>
  188. </li>
  189. <li><p class="first">Requirements. It is easy to come up with 1000 requirements. Stick to what is
  190. significant. What is significant? Requirements with high risk. Huge interest to
  191. high-power stakeholders. Hard-to-change items. The fewer requirements, the sharper the
  192. decision.</p>
  193. </li>
  194. <li><p class="first">Options. Nicely listed and scored. On requirements. And just don't give scores, but
  195. weigh them by the importance of the requirements. This also helps in understanding the
  196. decision afterwards.</p>
  197. <p>Options should be distinct. Don't pick very similar solutions. You should have
  198. something to choose. And drop options that you know are never going to satisfy the
  199. requirements, this clears up clutter.</p>
  200. <p>But... watch out for tweaking the weights to get to the desired decision...</p>
  201. </li>
  202. <li><p class="first">Decision. The logical conclusion.</p>
  203. </li>
  204. </ul>
  205. <p>In case the decision turned out to be wrong, you now have a nice document and you can
  206. re-evaluate it. Perhaps you missed a stakeholder? Perhaps a requirement was missed? Or a
  207. weight should be changed? You can then make a 2.0 of the ADR. You learned from your
  208. mistakes.</p>
  209. </div>
  210. </div>
  211.  
  212.        ]]>
  213.      </content>
  214.  
  215.    </entry>
  216.    
  217.  <entry>
  218.    <title>Pygrunn keynote: Homo ludens, python and play - Daniele Procida</title>
  219.    <link rel="alternate" type="text/html"
  220.          href="http://reinout.vanrees.org/weblog/2025/05/16/6-keynote-homo-ludens.html" />
  221.      <id>http://reinout.vanrees.org/weblog/2025/05/16/6-keynote-homo-ludens.html</id>
  222.      <author>
  223.        <name>Reinout van Rees</name>
  224.      </author>
  225.      <published>2025-05-16T00:00:00+01:00</published>
  226.      <updated>2025-05-16T14:58:00+01:00</updated>
  227.  
  228.      
  229.      <category term="pygrunn" />
  230.      
  231.      <category term="python" />
  232.      
  233.  
  234.      <content type="html"><![CDATA[
  235.        <div class="document">
  236. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pygrunn.html">my summaries</a> of the 2025
  237. <a class="reference external" href="https://pygrunn.org/">pygrunn conference</a> in Groningen, NL).</p>
  238. <p>Organizing a conference is a weird mix between it-is-not-my-job and
  239. it-is-a-lot-of-real-work.</p>
  240. <p>When <a class="reference external" href="https://vurt.org/">Daniele Procida</a> learned python 16 years ago, he was often
  241. told that learning python is fun! And it is easy! Often when people say it is fun and
  242. easy, that you should be suspicious.</p>
  243. <p>It actually wasn't fun. There was lots of satisfaction, though. Solving problems is
  244. nice. He didn't want to have fun and he didn't want to be a great programmer: He just
  245. wanted to solve problems!</p>
  246. <p>Fun, playful... Python early on had a bit of playfulness. Named after Monty Python, an
  247. old BBC comedic television series. Nowadays most people haven't seen Monty Python on
  248. television and actually discover it through the programming language. How does an
  249. Indonesian teenager react to the unknown Monty Python jokes?</p>
  250. <p>Same with python-the-snakes. Lots of book with snakes on the cover. Some playful, some
  251. aggressive. Some with dripping venom (that doesn't fit with a constricting type of
  252. snake...). But try talking about &quot;python&quot; in African countries where Pythons actually
  253. are a menace...</p>
  254. <p>His definition of humor: the surprising violation of an expectation of congruity. A
  255. momentary re-ordering of the world. It gives us a surprising delight.</p>
  256. <p>Python itself is full of expectations that can be violated... He was originally baffled
  257. by the term &quot;pythonic&quot;: he was just wondering whether his code worked or not, he didn't
  258. expect his code to be judged on some fit-in-with-the-locals quality like &quot;pythonic&quot;.</p>
  259. <p>An exception means you need a rule. A holiday is something different than regular
  260. days. A &quot;holiday from the rule&quot;. The special depends on the normal. Fun is a &quot;holiday
  261. from seriousness&quot;. Then: how can &quot;fun&quot; be made the expectation? A constant low-level fun
  262. is not funny.</p>
  263. <p>Johan Huizinga wrote &quot;homo ludens&quot; in 1938. Homo ludens, the playing man. <a class="reference external" href="https://en.wikipedia.org/wiki/Homo_Ludens">See wikipedia</a>. He says that play is the primary
  264. pre-condition of culture. But how? According to Daniele's examples, the holiday can't
  265. come before the work. You need to have an exception when there's a normal. God rested on
  266. the seventh day, but that only could be rest because he actually worked for six days.</p>
  267. <p>Culture? Players on a stage. Which has rules. A courtroom can be a sort of playground. A
  268. kids' playground has some boundaries. Could there be something to Huizinga's argument?</p>
  269. <p>At work, you can receive clear outcomes: recognition, rewards. The same system offers
  270. penalties. Work is a relatively clear system. A framework of rewards, value,
  271. etc. Daniele likes his work (he works for canonical/ubuntu). He's allowed to collaborate
  272. a lot.</p>
  273. <p>What can compete with that? In the weekend or the evenings? Often what you do is
  274. unclearer. When is it finished? When did you do a good job? To do something at home, he
  275. has to get tools out of the garage and he has to clean up afterwards: just grabbing a
  276. laptop at work is much easier. Grabbing his guitar takes more work. And nobody thanks
  277. him for playing on it. <em>It can be too much work even to take a holiday from work. To
  278. play.</em></p>
  279. <p>Easy-to-start-with work with good feedback is always easily available...</p>
  280. <p>There's an <strong>asymmetry</strong> of performance, failure and accountability. At work, you can
  281. get negative feedback. At home, what are they going to do? Sack him? No. Why are people
  282. talking about gamifying work? They should be talking about &quot;workifying&quot;!  That's more
  283. attractive!</p>
  284. <p>Open source: is it work or a labour of love? What about people pestering an open source
  285. project with unwanted contributions? The dance between maintainer and contributor. What
  286. when a state actor manages to get a malicious patch into a central piece of open source
  287. software (like what happened last year)?</p>
  288. <p>Does this have to do with the difference between work and play? Could open source
  289. software benefit by some explicit rules, some explicit expectations? Social
  290. expectations?</p>
  291. <img alt="https://reinout.vanrees.org/images/2025/pygrunn-6.jpeg" src="https://reinout.vanrees.org/images/2025/pygrunn-6.jpeg" />
  292. <p><em>Photo explanation: picture from our Harz (DE) holiday in 2023</em></p>
  293. </div>
  294.  
  295.        ]]>
  296.      </content>
  297.  
  298.    </entry>
  299.    
  300.  <entry>
  301.    <title>Pygrunn: python on a tractor - Wieneke Keller, Sebastian Lenartowicz</title>
  302.    <link rel="alternate" type="text/html"
  303.          href="http://reinout.vanrees.org/weblog/2025/05/16/5-python-on-a-tractor.html" />
  304.      <id>http://reinout.vanrees.org/weblog/2025/05/16/5-python-on-a-tractor.html</id>
  305.      <author>
  306.        <name>Reinout van Rees</name>
  307.      </author>
  308.      <published>2025-05-16T00:00:00+01:00</published>
  309.      <updated>2025-05-16T13:30:00+01:00</updated>
  310.  
  311.      
  312.      <category term="pygrunn" />
  313.      
  314.      <category term="python" />
  315.      
  316.  
  317.      <content type="html"><![CDATA[
  318.        <div class="document">
  319. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pygrunn.html">my summaries</a> of the 2025
  320. <a class="reference external" href="https://pygrunn.org/">pygrunn conference</a> in Groningen, NL).</p>
  321. <p>How to become an apple farmer in 5 minutes:</p>
  322. <ul class="simple">
  323. <li>You want mid-size apples, as they fetch the best price.</li>
  324. <li>You want blossom on your tree, but not too much. Otherwise the tree has to divide its
  325. water and nourishment over more apples, which makes them smaller...</li>
  326. </ul>
  327. <p>They work at <a class="reference external" href="https://aureaimaging.com/">aurea imaging</a>, maker of &quot;treescout&quot;. The
  328. treescout is a device/camera on top of a tractor that drives along the apple trees in an
  329. orchard. The device detects the tree, blossoms and other attributes of the tree. The
  330. first use case: <strong>blossom thinning</strong> to aim at the right size of apples. Blossom
  331. thinning happens with a sprayer. The blossom blossoms for just two or three weeks.</p>
  332. <p>The first season they tried their project was <em>educational</em>. Lots or problems :-) GPS
  333. tracks that were not straight. Detected trees were not in the right location. Etcetera.</p>
  334. <p>Some of the challenges:</p>
  335. <ul class="simple">
  336. <li>It is on a vehicle, so limited power.</li>
  337. <li>It is on a farm, so very limited or no connectivity.</li>
  338. <li>Agricultural standards are actually from the maritime industry. GPS that is accurate
  339. within a few meters is fine, there. But not detailed enough for locating trees...</li>
  340. <li>They were a software company, so they had to use off-the-shelf components.</li>
  341. </ul>
  342. <p>The first blossom season, their architecture looked like this:</p>
  343. <ul class="simple">
  344. <li>Python monolith with multiprocessing.</li>
  345. <li>Restarting upon failure was hard due to them using unix pipes for inter-process
  346. communication.</li>
  347. <li>Poor separation of responsibilities.</li>
  348. </ul>
  349. <p>The second blossom season they changed several things.</p>
  350. <ul class="simple">
  351. <li>They used k3s (a lightweight kubernetes).</li>
  352. <li>A single-node k3s cluster sitting on top of a tractor.</li>
  353. <li>K3s is responsible for the runtime environment and workload management.</li>
  354. <li>Rabbitmq for inter-process communication.</li>
  355. <li>A Kubernetes cluster really helps with rolling out quick updates.</li>
  356. </ul>
  357. <p>A problem they noticed is python's concurrency problem. There are some central
  358. components that are a bottleneck.</p>
  359. <p>What they're working on:</p>
  360. <ul class="simple">
  361. <li>ArgoCD, open cluster management, kairos (&quot;in-place os updates&quot;), embedded
  362. linux. They're close to fully-automatic remote upgrades.</li>
  363. <li>More flexible hardware setup.</li>
  364. <li>Machine learning and insights on tree level. BIG amount of data for an eight-man dev
  365. team...</li>
  366. <li>Increasing the number of customers.</li>
  367. </ul>
  368. <img alt="https://reinout.vanrees.org/images/2025/pygrunn-5.jpeg" src="https://reinout.vanrees.org/images/2025/pygrunn-5.jpeg" />
  369. <p><em>Photo explanation: picture from our Harz (DE) holiday in 2023</em></p>
  370. </div>
  371.  
  372.        ]]>
  373.      </content>
  374.  
  375.    </entry>
  376.    
  377.  <entry>
  378.    <title>Pygrunn: cloud native geospatial formats for field boundaries - Ivor Bosloper</title>
  379.    <link rel="alternate" type="text/html"
  380.          href="http://reinout.vanrees.org/weblog/2025/05/16/4-cloud-native-geospatial.html" />
  381.      <id>http://reinout.vanrees.org/weblog/2025/05/16/4-cloud-native-geospatial.html</id>
  382.      <author>
  383.        <name>Reinout van Rees</name>
  384.      </author>
  385.      <published>2025-05-16T00:00:00+01:00</published>
  386.      <updated>2025-05-16T11:57:00+01:00</updated>
  387.  
  388.      
  389.      <category term="pygrunn" />
  390.      
  391.      <category term="python" />
  392.      
  393.  
  394.      <content type="html"><![CDATA[
  395.        <div class="document">
  396. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pygrunn.html">my summaries</a> of the 2025
  397. <a class="reference external" href="https://pygrunn.org/">pygrunn conference</a> in Groningen, NL).</p>
  398. <p>Cloud native geospatial file formats:</p>
  399. <ul class="simple">
  400. <li>Geospatial data: you have <em>raster</em> data (= images) and <em>vector</em> data. And point data.</li>
  401. <li>Raster data: geotiff, png, jpg. Vector: (shapefiles), gpkg, geoparquet. Points: gpkg,
  402. geoparquet.</li>
  403. </ul>
  404. <p>Cloud native? Let's look at geotiff for instance. Just the old .tiff format, so a raster
  405. of pixels with some metadata. A geotiff has metadata like extent, projection, etc. There
  406. is a cloud native variant, <em>cloud optimized geotiff</em>.</p>
  407. <ul class="simple">
  408. <li>You have tiles, so the big image is subdivided into tiles for easier/cheaper/faster
  409. loading.</li>
  410. <li>There are also multiple versions of the image at various &quot;zoom levels&quot;.</li>
  411. <li>The metadata is always at a fixed place in the file, right at the front or at the
  412. back.</li>
  413. </ul>
  414. <p>Such a cloud optimized format means that it is optimized for remote geospatial access
  415. patterns. The way it happens is with &quot;http range requests&quot;. After reading the metadata
  416. for the file, the algorithm knows which parts of the big file to request from the server
  417. with such a http range request.</p>
  418. <p>He wanted to do the same for vector data. An approach is <strong>GeoParquet</strong>. Parquet is a
  419. bit of a &quot;csv format&quot;, simplified. For speed reasons it is subdivided in blocks. In the
  420. geospatial version, the blocks have an extent. (An extent is the min/max boundary around
  421. the data, btw).</p>
  422. <p><strong>Before</strong> cloud native geospatial formats, you really needed to have s special server
  423. program to host them, like geoserver. Geoserver is nice, but it is also a huge java
  424. program with loads of options. (And most people forget to properly secure it...)</p>
  425. <p>What you can do <strong>now</strong> is that you can just store your cloud-native geopspatial file
  426. online in for instance s3. As long as it supports http range requests, you're set. The
  427. big advantage is that there are good specifications and lots of implementations.</p>
  428. <p>He's now working on <a class="reference external" href="https://fiboa.org/">FIBOA</a>: FIeld BOundaries for Agriculture. An
  429. open source and open data project. There <em>are</em> many open data portals with agricultural
  430. field boundaries. But all of them have different formats. FIBOA wants to unify all that.
  431. See <a class="reference external" href="https://github.com/fiboa/specification">https://github.com/fiboa/specification</a></p>
  432. <p>For converting the current local data to their format, they used lots of python and
  433. (geo)pandas. They're trying to generalize the python+geopandas+extract+export process,
  434. as it seems handy for lots of other use cases: <a class="reference external" href="https://github.com/vecorel/">https://github.com/vecorel/</a></p>
  435. <img alt="https://reinout.vanrees.org/images/2025/pygrunn-4.jpeg" src="https://reinout.vanrees.org/images/2025/pygrunn-4.jpeg" />
  436. <p><em>Photo explanation: picture from our Harz (DE) holiday in 2023</em></p>
  437. </div>
  438.  
  439.        ]]>
  440.      </content>
  441.  
  442.    </entry>
  443.    
  444.  <entry>
  445.    <title>Pygrunn: django template LSP, smarter completion for django templates - Kees Hink</title>
  446.    <link rel="alternate" type="text/html"
  447.          href="http://reinout.vanrees.org/weblog/2025/05/16/3-django-template-lsp.html" />
  448.      <id>http://reinout.vanrees.org/weblog/2025/05/16/3-django-template-lsp.html</id>
  449.      <author>
  450.        <name>Reinout van Rees</name>
  451.      </author>
  452.      <published>2025-05-16T00:00:00+01:00</published>
  453.      <updated>2025-06-13T20:38:00+01:00</updated>
  454.  
  455.      
  456.      <category term="pygrunn" />
  457.      
  458.      <category term="python" />
  459.      
  460.      <category term="django" />
  461.      
  462.  
  463.      <content type="html"><![CDATA[
  464.        <div class="document">
  465. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pygrunn.html">my summaries</a> of the 2025
  466. <a class="reference external" href="https://pygrunn.org/">pygrunn conference</a> in Groningen, NL).</p>
  467. <p>Kees (sorry, I was accidentally typed 'Henk' here, see <a class="reference external" href="https://www.fourdigits.nl/blog/pygrunn-2025/">this page</a>) works at <a class="reference external" href="https://www.fourdigits.nl">four digits</a>, a long-time django shop.</p>
  468. <p>He had a poll at the start about peoples' favourite editor. The top three: pycharm 38%,
  469. vscode 37%, neovim 11%. (Bugger, my favourite, emacs, is not in the top three).</p>
  470. <p>Code completion is nice. Modern editors are real handy for this with good support for
  471. django and python. But... for django templates, it is missing. No auto-completion for
  472. <tt class="docutils literal">{% bl</tt> to <tt class="docutils literal">{% block</tt>. And also no knowledge of the available variables and
  473. attributes.</p>
  474. <p><strong>Pycharm</strong> is an exception, it has django language support and completion for the standard
  475. django template tags and also auto-complete in case you have class-based views.</p>
  476. <p>He showed us <em>django template LSP</em>: <a class="reference external" href="https://github.com/fourdigits/django-template-lsp">https://github.com/fourdigits/django-template-lsp</a>,
  477. wich implements similar functionality for most other editors.</p>
  478. <ul class="simple">
  479. <li>It also picks up custom template tags.</li>
  480. <li>Docker support! It can find your template tags and code inside a docker image.</li>
  481. <li>When something is not picked up, you can add a comment with a type hint.</li>
  482. <li>You can install it from vscode, the name is <tt class="docutils literal">djlsp</tt>.</li>
  483. </ul>
  484. <p>You can build such a LSP, Language Server Protocol, yourself. LSP allows a client (your
  485. IDE) to interface with the language server. &quot;A document is opened&quot;, &quot;I'm on line x,
  486. character y, is there a hint here?&quot;.</p>
  487. <p>They have a script called <tt class="docutils literal"><span class="pre">django-collector.py</span></tt> that is run with your project's python
  488. (with a fallback). It statically analyses your code and returns json for use by the rest
  489. of the LSP mechanism.</p>
  490. <p>There's an alternative, <a class="reference external" href="https://djls.joshthomas.dev/">django language server</a>,
  491. started a while after they themselves started their LSP. Written in rust. But there's
  492. not a lot of functionality yet.</p>
  493. <p>Django template LSP is open source, it is in their github repo. They're using it a lot
  494. internally. If you have ideas and pull requests: welcome!</p>
  495. <img alt="https://reinout.vanrees.org/images/2025/pygrunn-3.jpeg" src="https://reinout.vanrees.org/images/2025/pygrunn-3.jpeg" />
  496. <p><em>Photo explanation: picture from our Harz (DE) holiday in 2023</em></p>
  497. </div>
  498.  
  499.        ]]>
  500.      </content>
  501.  
  502.    </entry>
  503.    
  504.  <entry>
  505.    <title>Pygrunn: team alignment, enterprise design power - Edzo A. Botjes</title>
  506.    <link rel="alternate" type="text/html"
  507.          href="http://reinout.vanrees.org/weblog/2025/05/16/2-team-alignment.html" />
  508.      <id>http://reinout.vanrees.org/weblog/2025/05/16/2-team-alignment.html</id>
  509.      <author>
  510.        <name>Reinout van Rees</name>
  511.      </author>
  512.      <published>2025-05-16T00:00:00+01:00</published>
  513.      <updated>2025-05-16T09:37:00+01:00</updated>
  514.  
  515.      
  516.      <category term="pygrunn" />
  517.      
  518.      <category term="python" />
  519.      
  520.  
  521.      <content type="html"><![CDATA[
  522.        <div class="document">
  523. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pygrunn.html">my summaries</a> of the 2025
  524. <a class="reference external" href="https://pygrunn.org/">pygrunn conference</a> in Groningen, NL).</p>
  525. <p>He helps startups to design their business. He's got more info at
  526. <a class="reference external" href="https://www.edzob.com/page/enterprise/">https://www.edzob.com/page/enterprise/</a> , an &quot;enterprise design cheat sheet&quot;. He was a
  527. consultant for a long time and started noticing patterns. He's now in education/research
  528. and he's focused on culture.</p>
  529. <p>According to Osterwalder, success = value proposition + uniqueness + business model +
  530. timing + team alignment. In Edzo's experience, the <em>team alignment</em> is often a core problem.</p>
  531. <p>As a person, you have a skill set (behaviour and capabilities). As a team, you have a
  532. collective toolset: (structure, processes, data and tech). Those two are the <em>tangible</em>
  533. stuff. <em>Intangible</em> is your mindset (attitude and motivation) as a person, and the
  534. culture as a team.</p>
  535. <p>UX is a social contract between an app and the user. There's a social contract behind
  536. the interactions within the company. A culture. How do you want to collaborate? How you
  537. collaborate defines what you're going to be building. Conway's law. (He mentioned his
  538. talk of last year about this subject).</p>
  539. <p>His wife did a PhD about the meaning behind fairy tales. For him, as a technical person,
  540. the idea of having multiple meanings of the same physical text was initially hard. What
  541. do words mean? What is their purpose? Having good conversations about the terms and
  542. words used in, for instance, your business model/motivition canvas is a good
  543. idea. Communication is key.</p>
  544. <p>There was a lot more in his presentation, as it was intended as a fast-paced talk. Lots
  545. of way to look at your business or product. But in the end, <strong>team alignment</strong> could
  546. well be key. Optimizing your team members. Organizing them well. Collaboration?
  547. Facilitating? Key: have conversations. &quot;Invest in beer and <em>bitterballen</em>, not in
  548. courses&quot;.</p>
  549. <p>And: you should always be looking at <em>what can I destroy</em>. What in your company can be
  550. stopped, removed, destroyed? You need that to change and improve.</p>
  551. <p>His <a class="reference external" href="tps://docs.google.com/presentation/d/1vlpNUSn54sU3JxIlzk-XGXlpt24HeE7hcPRZD0mF0xY/mobilepresent#slide=id.g35997d474e0_0_17">slides are online</a>
  552. with lots of extra links and background information.</p>
  553. <img alt="https://reinout.vanrees.org/images/2025/pygrunn-2.jpeg" src="https://reinout.vanrees.org/images/2025/pygrunn-2.jpeg" />
  554. <p><em>Photo explanation: picture from our Harz (DE) holiday in 2023</em></p>
  555. </div>
  556.  
  557.        ]]>
  558.      </content>
  559.  
  560.    </entry>
  561.    
  562.  <entry>
  563.    <title>Pygrunn: how to solve a python mystery - Aivars Kalvāns</title>
  564.    <link rel="alternate" type="text/html"
  565.          href="http://reinout.vanrees.org/weblog/2025/05/16/1-solve-python-mystery.html" />
  566.      <id>http://reinout.vanrees.org/weblog/2025/05/16/1-solve-python-mystery.html</id>
  567.      <author>
  568.        <name>Reinout van Rees</name>
  569.      </author>
  570.      <published>2025-05-16T00:00:00+01:00</published>
  571.      <updated>2025-05-16T08:51:00+01:00</updated>
  572.  
  573.      
  574.      <category term="pygrunn" />
  575.      
  576.      <category term="python" />
  577.      
  578.  
  579.      <content type="html"><![CDATA[
  580.        <div class="document">
  581. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pygrunn.html">my summaries</a> of the 2025
  582. <a class="reference external" href="https://pygrunn.org/">pygrunn conference</a> in Groningen, NL).</p>
  583. <p><a class="reference external" href="https://aivarsk.com">Aivars</a> pointed at <a class="reference external" href="https://www.brendangregg.com/linuxperf.html">https://www.brendangregg.com/linuxperf.html</a>
  584. as a good overview of linux tools</p>
  585. <p>A good start is the <a class="reference external" href="https://linux.die.net/man/5/proc">/proc filesystem</a>, you can use
  586. it to gather information on processes, for instance to grab the environment used by a
  587. process:</p>
  588. <pre class="literal-block">
  589. $ cat /proc/1234455/environ || tr '\0' '\n'
  590. </pre>
  591. <p>The files/sockets used by a specific process:</p>
  592. <pre class="literal-block">
  593. $ ls /proc/12345/fd/*
  594. </pre>
  595. <p>You might have an unfindable file that takes up lots of space (like a logfile that has
  596. been deleted from a directory, but that is still open in some program). The command
  597. above will have <tt class="docutils literal">(deleted)</tt> next to deleted files, so you can search for that string
  598. in the output to find the process that still has such a big file open.</p>
  599. <p>Another handy tool: <strong>strace</strong>, it traces linux system kernel calls. You don't even need
  600. root access if you just want to trace your <em>own</em> processes. An example command:</p>
  601. <pre class="literal-block">
  602. $ strace -f -ttt -o output.txt -s 1024 -p &lt;PID&gt;
  603. $ strace -f -ttt -o output.txt -s 1024 -p your-new-process.sh
  604. </pre>
  605. <p>If your code does a system call (&quot;read something from somewhere&quot;), strace prints both
  606. the start and the end of the call. So you can find out exactly where something is
  607. blocking in case of an error. He mentioned <a class="reference external" href="https://filippo.io/linux-syscall-table/">https://filippo.io/linux-syscall-table/</a> as a
  608. good overview of the available system calls you might see in the output.</p>
  609. <p>Disk IO problems? Try <tt class="docutils literal">iostat <span class="pre">-x</span></tt> to see where the IO is happening. When testing disk
  610. throughput, don't just test huge blobs of data, but make sure to use the actual block
  611. size (often 4k or 8k).</p>
  612. <p>When debugging network access, you often use ping or traceroute. But both use protocols
  613. (ICMP and UDP) that are often blocked by network admins. He suggests <tt class="docutils literal">tcptraceroute</tt>
  614. which uses TCP and often gives a better view of reality.</p>
  615. <p>With network problems, <tt class="docutils literal">TCP_NODELAY</tt> is a possible cause. See
  616. <a class="reference external" href="https://brooker.co.za/blog/2024/05/09/nagle.html">https://brooker.co.za/blog/2024/05/09/nagle.html</a> for more information.  Read this
  617. especially when you see the magic number <tt class="docutils literal">40ms</tt> in your logs, or only get 25
  618. transactions per second.</p>
  619. <p>Tip: set timeouts for everything. The defaults are often a cause for hanging.</p>
  620. <img alt="https://reinout.vanrees.org/images/2025/pygrunn-1.jpeg" src="https://reinout.vanrees.org/images/2025/pygrunn-1.jpeg" />
  621. <p><em>Photo explanation: picture from our Harz (DE) holiday in 2023</em></p>
  622. </div>
  623.  
  624.        ]]>
  625.      </content>
  626.  
  627.    </entry>
  628.    
  629.  <entry>
  630.    <title>Pycon.de: streamlit app optimization in AWS - Darya Petrashka</title>
  631.    <link rel="alternate" type="text/html"
  632.          href="http://reinout.vanrees.org/weblog/2025/04/25/5-streamlit-optimization.html" />
  633.      <id>http://reinout.vanrees.org/weblog/2025/04/25/5-streamlit-optimization.html</id>
  634.      <author>
  635.        <name>Reinout van Rees</name>
  636.      </author>
  637.      <published>2025-04-25T00:00:00+01:00</published>
  638.      <updated>2025-04-25T12:22:00+01:00</updated>
  639.  
  640.      
  641.      <category term="pycon" />
  642.      
  643.      <category term="python" />
  644.      
  645.  
  646.      <content type="html"><![CDATA[
  647.        <div class="document">
  648. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pycon.html">my summaries</a> of the 2025
  649. <a class="reference external" href="https://2025.pycon.de/">pycon.de conference</a> in Darmstadt, DE).</p>
  650. <p>Full title: you don’t think about your streamlit app optimization until you try to
  651. deploy it to AWS</p>
  652. <p><a class="reference external" href="https://streamlit.io/">Streamlit</a> is a quick way to show your models/data to
  653. stakeholders.</p>
  654. <p>She once made a streamlit <a class="reference external" href="https://github.com/dashapetr/kana--streamlit-app">app to exercise writing Japanese characters</a>. It used some character recognition
  655. model. But... the way streamlit works, it normally downloads the model every single
  656. time. For some local testing, it is probably OK, but if you put it in production... In
  657. production, network traffic might cost money.</p>
  658. <p>Solution? You can cache it with streamlit, but you can also download it when building
  659. the docker image and store it inside the image and load it from there.</p>
  660. <p>On to authentication. You can handle everything yourself as data scientist: login
  661. widget, auth logic, user privs, etc. You can also use an external provider like Amazon
  662. Cognito. Then you only have to hook up cognito in your code, but the OPS engineer has to
  663. set up cognito for you.</p>
  664. <p>On to security. For all of them you'll need the OPS engineer, probably.</p>
  665. <ul class="simple">
  666. <li>Set up https with Route 53 and TLS certificates.</li>
  667. <li>Configure CloudFront to protect against DDoS attacks and improve performance.</li>
  668. <li>Use AWS web application firewall to block malicious traffic.</li>
  669. </ul>
  670. <p>On to credential storage. You can use AWS secret manager instead of putting <tt class="docutils literal">API_KEY =
  671. &quot;1234abcd&quot;</tt> right in your code. Using the secret manager is much more secure and that
  672. will make your OPS engineer happy.</p>
  673. <img alt="https://reinout.vanrees.org/images/2025/pycon-35.jpeg" src="https://reinout.vanrees.org/images/2025/pycon-35.jpeg" />
  674. <p><em>Photo explanation: random picture from Darmstadt (DE)</em></p>
  675. </div>
  676.  
  677.        ]]>
  678.      </content>
  679.  
  680.    </entry>
  681.    
  682.  <entry>
  683.    <title>Pycon.de: community building and task automation - Cosima Meyer</title>
  684.    <link rel="alternate" type="text/html"
  685.          href="http://reinout.vanrees.org/weblog/2025/04/25/4-automate-community.html" />
  686.      <id>http://reinout.vanrees.org/weblog/2025/04/25/4-automate-community.html</id>
  687.      <author>
  688.        <name>Reinout van Rees</name>
  689.      </author>
  690.      <published>2025-04-25T00:00:00+01:00</published>
  691.      <updated>2025-04-25T09:58:00+01:00</updated>
  692.  
  693.      
  694.      <category term="pycon" />
  695.      
  696.      <category term="python" />
  697.      
  698.  
  699.      <content type="html"><![CDATA[
  700.        <div class="document">
  701. <p>(One of <a class="reference external" href="https://reinout.vanrees.org/weblog/tags/pycon.html">my summaries</a> of the 2025
  702. <a class="reference external" href="https://2025.pycon.de/">pycon.de conference</a> in Darmstadt, DE).</p>
  703. <p>Full title: code &amp; community: the synergy of community building and task automation</p>
  704. <p>Cosima organizes PyLadies and R-Ladies events.</p>
  705. <p>Visibility is important. You have to be visible to be noticed. Time is also important:
  706. you have to put in work to create good content. But you also want to have time for other
  707. things. So she thought about creating an &quot;automated megaphone&quot; to help her and other
  708. PyLadies members be more visible.</p>
  709. <p>She created the <a class="reference external" href="https://bsky.app/profile/pyladies-bot.bsky.social">pyladies bot</a> on
  710. bluesky and mastodon. It regularly shares portraits of &quot;amazing women in tech&quot;. And it
  711. reposts messages when tagged or mentioned. It also monitors blogs and posts about
  712. them. See <a class="reference external" href="https://github.com/cosimameyer/awesome-pyladies-blogs">https://github.com/cosimameyer/awesome-pyladies-blogs</a></p>
  713. <p>The bot runs as a github action &quot;cron job&quot;.</p>
  714. <p>She started using google's &quot;gemini&quot; LLM to create short summaries of the blog posts to
  715. make it more likely for people to click on it. She picked a cheap, small model as that
  716. was good enough. In addition she does an extra automated check on harassment, dangerous
  717. content, etc.</p>
  718. <p>Lessons learned:</p>
  719. <ul class="simple">
  720. <li>You can use powerfull LLMs to enhance your applications.</li>
  721. <li>Integrating modern LLMs is straightforward and easy.</li>
  722. <li>No need to go all the way to the cloud, you can just use the models via an API.</li>
  723. <li>It is cost-effective for smasll projects and/or developers.</li>
  724. </ul>
  725. <img alt="https://reinout.vanrees.org/images/2025/pycon-34.jpeg" src="https://reinout.vanrees.org/images/2025/pycon-34.jpeg" />
  726. <p><em>Photo explanation: random picture from Darmstadt (DE)</em></p>
  727. </div>
  728.  
  729.        ]]>
  730.      </content>
  731.  
  732.    </entry>
  733.    
  734.  
  735. </feed>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//reinout.vanrees.org/weblog/atom.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda