<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>A blog</title><link href="https://karolinasurma.eu/" rel="alternate"></link><link href="https://karolinasurma.eu/feeds/all.atom.xml" rel="self"></link><id>https://karolinasurma.eu/</id><updated>2026-06-08T17:48:00+02:00</updated><entry><title>Python rebuilds in Fedora</title><link href="https://karolinasurma.eu/python-rebuilds-in-fedora.html" rel="alternate"></link><published>2026-06-08T17:48:00+02:00</published><updated>2026-06-08T17:48:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2026-06-08:/python-rebuilds-in-fedora.html</id><summary type="html">&lt;p&gt;Finally some time to gather thoughts about this big endeavour I take on every year.
The third big rebuild of Python on my watch is slowly coming to an end.
I start in October with first alpha release of a new Python and end in October the next year with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Finally some time to gather thoughts about this big endeavour I take on every year.
The third big rebuild of Python on my watch is slowly coming to an end.
I start in October with first alpha release of a new Python and end in October the next year with the final release of Python and a release of Fedora.&lt;/p&gt;
&lt;h2&gt;Why&lt;/h2&gt;
&lt;p&gt;It's good for the &lt;strong&gt;community&lt;/strong&gt;: we can report and fix issues in libraries as soon as they appear.
(Some upstream maintainers don't care about alphas and don't like our reports, so I try to remember which ones to avoid in the initial months).&lt;/p&gt;
&lt;p&gt;It's good for &lt;strong&gt;CPython&lt;/strong&gt;: we can report regressions and bigger incompatibilities before they become a big issue.&lt;/p&gt;
&lt;p&gt;It's good for &lt;strong&gt;Fedora&lt;/strong&gt;: one of its values is "first": it's always been a forefront Linux distribution when it comes to adopting novelties, its userbase is used to things changing and collaborates with upstreams by design (that's another Fedora's principle: upstream first).&lt;/p&gt;
&lt;p&gt;It's good for &lt;strong&gt;Python maintainers&lt;/strong&gt; at my company: we know new Python plays well with the rest of the ecosystem. It will eventually become a part of the enterprise distribution, and by that time, it will be battle tested.&lt;/p&gt;
&lt;h2&gt;How&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Koji monitoring dashboard" src="./images/bento-board.png"&gt;&lt;/p&gt;
&lt;p&gt;There's a &lt;a href="https://copr.fedorainfracloud.org/coprs/"&gt;copr&lt;/a&gt; repository where the new Python acts like a main one.
There I keep building down the dependency tree.
We've got a &lt;a href="https://github.com/fedora-python/whatdoibuild"&gt;tool&lt;/a&gt; to query the repositories and find what is currently unblocked and can be built which is a cornerstone of the whole endeavour.
Additional tooling consists of &lt;a href="https://github.com/befeleme/mini-mass-rebuild"&gt;more scripts&lt;/a&gt; to solve other arising issues. (I must not lose my zsh history).&lt;/p&gt;
&lt;p&gt;Month after month, release after release, I keep reporting issues, fixing them if I can, unblocking chunks of the tree and tend to the whole thing.&lt;/p&gt;
&lt;p&gt;With around 4000 Python packages in Fedora, I aim for having under 500 "waiting" before the actual rebuild.
That's when the rebuild actually starts and is done in Fedora build system (Koji) side tag (temporary pocket for isolated changes, intended to be merged to the main flow).
I test critical paths - groups of essential packages for different Fedora flavors, and at the end of the rebuild we spawn an OpenQA instance with our changes.
The last steps require cooperation with the friendly Fedora QA and Infra teams, always flawless.&lt;/p&gt;
&lt;p&gt;The last part, the Koji rebuild, is what we aim to do in the shortest time possible. It's the third time I have met with Miro at his place, where we set up a garden office and worked through the queue with enough of both the oxygen and caffeine each day. Bára's excellent cooking has sustained us each time and I can't be grateful enough for her work put in the yummy vegan dishes &amp;lt;3.&lt;/p&gt;
&lt;h2&gt;Loose ends&lt;/h2&gt;
&lt;p&gt;There's still a lot of tribal knowledge in the process.
When the real rebuild happens, we just work. When we're done, we're exhausted and the last thing we want to do is documenting the steps.
However, I do my best to update and extend a &lt;a href="https://hackmd.io/xsFrXJnaR_26QSzjBomCpg"&gt;team "wiki"&lt;/a&gt; about the whole process.&lt;/p&gt;
&lt;p&gt;We only test one architecture: x86_64, but the rebuild happens on all arches supported on Fedora. This always causes some unexpected issues.
However, bloating the copr repository with 5x as many chroots is too much of a tradeoff.&lt;/p&gt;
&lt;p&gt;There's no way to "block" maintainers from updating their packages when we build things in the side tag. This always leads to inconsistencies and artificial bumping the package releases. Well.&lt;/p&gt;
&lt;p&gt;The dashboard I was using this year needs some improvements. Overall it's a good addition to the process.&lt;/p&gt;
&lt;h2&gt;Tight ends&lt;/h2&gt;
&lt;p&gt;It's this kind of a job that works best in a highly focused environment and ideally in at least two people. I would be left in a much worse state if I was doing it alone in my home office, let alone in the actual one.&lt;/p&gt;
&lt;p&gt;Will I do it again? Probably.
But for now it's time to touch some grass.&lt;/p&gt;
&lt;p&gt;You can see some statistics assembled every night at &lt;a href="https://status.fedoralovespython.org/"&gt;the status page&lt;/a&gt;.&lt;/p&gt;</content><category term="Fedora"></category><category term="EN"></category></entry><entry><title>Ostrava Python Pizza</title><link href="https://karolinasurma.eu/ostrava-python-pizza.html" rel="alternate"></link><published>2026-03-16T09:35:00+01:00</published><updated>2026-03-16T09:35:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2026-03-16:/ostrava-python-pizza.html</id><summary type="html">&lt;h2&gt;Pizza!&lt;/h2&gt;
&lt;p&gt;On February 21st, a small conference was held in Ostrava.
I really appreciate Czech Python community for regularly organizing events to bring together old and new folks,
this time including a big portion of Polish friends.
I haven't really programmed in Poland, ever, but with EuroPython happening this year …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Pizza!&lt;/h2&gt;
&lt;p&gt;On February 21st, a small conference was held in Ostrava.
I really appreciate Czech Python community for regularly organizing events to bring together old and new folks,
this time including a big portion of Polish friends.
I haven't really programmed in Poland, ever, but with EuroPython happening this year in Kraków, it feels I've got one foot in the doorstep of my homeland's communities. Leave through the door, come back through the window, it seems.&lt;/p&gt;
&lt;h2&gt;The talk&lt;/h2&gt;
&lt;p&gt;I delivered a talk offering a perspective on using LLMs for creating projects that are suited for one user only,
and if such projects are mobile apps - also freeing oneself from
the terror of the ad companies and other entities interested in highly personal data. 
You can watch it here: &lt;a href="https://www.youtube.com/live/5AFVEZ9TZUs?si=_BD42mRN-8LR0liY&amp;amp;t=2177"&gt;I scratched my itch and so should you&lt;/a&gt;.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/5AFVEZ9TZUs?si=Oqo97kzKzz_WSQg1&amp;amp;start=2173" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;One of the goals I had for this talk was to deliver it without slides. 
This increased the stress a bit, adding to the already stressful state of not getting enough sleep the night before.
I like the idea of media as augmentation, but not the backbone of the talk - I keep using less words in my slides, mostly for the audience to have something to hook at.
In the end, it was quite a pleasant experience, and I'm going to work this direction more, whenever possible.&lt;/p&gt;
&lt;p&gt;Many thanks to the Python community for organizing this get together!&lt;/p&gt;</content><category term="Python"></category><category term="EN"></category><category term="talks"></category><category term="conferences"></category><category term="community"></category></entry><entry><title>PEP 639 adventures</title><link href="https://karolinasurma.eu/pep-639-adventures.html" rel="alternate"></link><published>2025-07-28T18:00:00+02:00</published><updated>2025-07-28T18:00:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2025-07-28:/pep-639-adventures.html</id><summary type="html">&lt;p&gt;With almost a year passing after the &lt;a href="https://peps.python.org/pep-0639/"&gt;PEP 639&lt;/a&gt; was accepted, I was pondering whether it makes sense to note down some thoughts on the process.&lt;/p&gt;
&lt;p&gt;But, since I want to keep a record (if only for my memory), let's dive straight in.&lt;/p&gt;
&lt;h2&gt;PEP 639&lt;/h2&gt;
&lt;p&gt;In Fedora, we wanted this …&lt;/p&gt;</summary><content type="html">&lt;p&gt;With almost a year passing after the &lt;a href="https://peps.python.org/pep-0639/"&gt;PEP 639&lt;/a&gt; was accepted, I was pondering whether it makes sense to note down some thoughts on the process.&lt;/p&gt;
&lt;p&gt;But, since I want to keep a record (if only for my memory), let's dive straight in.&lt;/p&gt;
&lt;h2&gt;PEP 639&lt;/h2&gt;
&lt;p&gt;In Fedora, we wanted this PEP. It standardized the licensing of distribution artifacts in terms of the license expressions (using &lt;a href="https://spdx.dev/"&gt;SPDX identifiers&lt;/a&gt;),
and in terms of including license files in the distributions.
That would allow us to programmatically detect and mark license files.
In the meantime (it was the end of 2023), Fedora started migration from its bespoke licensing format to SPDX,
which opened the way to leverage the newly defined license expressions too.&lt;/p&gt;
&lt;p&gt;Anything that touches &lt;strong&gt;legalese in software development&lt;/strong&gt; is a tough sell.
There were two long PEP threads and two previous authors.
The PEP has been significantly reworked multiple times.
&lt;strong&gt;My predecessors have done amazing job with all the research and specification definition&lt;/strong&gt;.
I thank them for their effort from the bottom of my heart.&lt;/p&gt;
&lt;p&gt;As Fedorans, we were following the discussions around PEP, and when it looked like it could be rejected, I stepped up and decided to help bring it through the finish line.
I inherited the longest PEP in history written in the span of almost 4 years.&lt;/p&gt;
&lt;h2&gt;The learnings&lt;/h2&gt;
&lt;p&gt;I had no previous knowledge of the PEP processes.
I knew I'd learn on the go. I did: there was facilitating the discussion, reacting to feedback, redrafting (in &lt;code&gt;rst&lt;/code&gt;, which I also learned on the job).
Understanding multiple use cases.
Understanding what is and what isn't a specification.
Multiple changes to &lt;a href="https://packaging.python.org/en/latest/"&gt;packaging.python.org&lt;/a&gt; (probably still not complete).
Post-acceptance discussions.
Waiting for build backends to implement and bring real feedback from the users.
Realizing mistakes and oversights.
A lot of community support and always a civil discussion, even in the moments of disagreement.&lt;/p&gt;
&lt;p&gt;I didn't have a deadline in a traditional sense, but there was a sense of urgency: everyone, including the PEP delegate, was tired with the drag and it was quite clear that either we make it happen or it'll be dropped.
While gaining velocity through a project that was spanning months, I discovered a self-hack that helped me immensely: &lt;strong&gt;I signed up to give two talks about the topic&lt;/strong&gt;, one on &lt;a href="https://www.youtube.com/live/KdFXjYURlws?feature=shared&amp;amp;t=6520"&gt;Python Pizza&lt;/a&gt; in Prague (February 2024) and another at &lt;a href="https://www.youtube.com/watch?v=8PuhFlojJ2s"&gt;EuroPython&lt;/a&gt; (July 2024).
They acted as soft deadlines: for the first one I researched the topic of licensing in Python ecosystem (while doing PEP edits in the background), for the second I brought the whole proposal publicly.
I can totally recommend this approach if you want to have one more motivator on a project.
I've been very fortunate to have the time allocated for this adventure by my employer.&lt;/p&gt;
&lt;h2&gt;What next?&lt;/h2&gt;
&lt;p&gt;PEP 639 has been first, but certainly not the last licensing PEP in the Python packaging.
There have been use cases left over on purpose, with the aim to specify them in the future. The adoption in simple use cases - which are the overwhelming majority of Python projects (when the license of all distribution artifacts is the same) should be without issues.
What's being discussed now, is how to express the per-distribution license expression in those rare cases when they're different.
I keep my fingers crossed for the future PEPs authors!&lt;/p&gt;</content><category term="Python"></category><category term="EN"></category></entry><entry><title>Fluxus - Scratching my itch</title><link href="https://karolinasurma.eu/fluxus-scratching-my-itch.html" rel="alternate"></link><published>2025-07-23T16:41:00+02:00</published><updated>2025-07-23T16:41:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2025-07-23:/fluxus-scratching-my-itch.html</id><summary type="html">&lt;p&gt;At EuroPython, three things happened simultaneously:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://beeware.org/"&gt;BeeWare&lt;/a&gt; sprint was held during the sprint weekend&lt;/li&gt;
&lt;li&gt;I had an idea for an app that would actually help me&lt;/li&gt;
&lt;li&gt;I wanted to learn to use AI for development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before I had no knowledge of writing mobile apps.
&lt;strong&gt;Two days later&lt;/strong&gt; I've got an …&lt;/p&gt;</summary><content type="html">&lt;p&gt;At EuroPython, three things happened simultaneously:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://beeware.org/"&gt;BeeWare&lt;/a&gt; sprint was held during the sprint weekend&lt;/li&gt;
&lt;li&gt;I had an idea for an app that would actually help me&lt;/li&gt;
&lt;li&gt;I wanted to learn to use AI for development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before I had no knowledge of writing mobile apps.
&lt;strong&gt;Two days later&lt;/strong&gt; I've got an app on my phone.&lt;/p&gt;
&lt;p&gt;&lt;a href="./images/fluxus-track.jpg"&gt;&lt;img src="./images/fluxus-track.jpg" width="200" /&gt;&lt;/a&gt;
&lt;a href="./images/fluxus-cal-tracked.jpg"&gt;&lt;img src="./images/fluxus-cal-tracked.jpg" width="200" /&gt;&lt;/a&gt;
&lt;a href="./images/fluxus-cal-predict.jpg"&gt;&lt;img src="./images/fluxus-cal-predict.jpg" width="200" /&gt;&lt;/a&gt;
&lt;a href="./images/fluxus-stats.jpg"&gt;&lt;img src="./images/fluxus-stats.jpg" width="200" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Idea behind Fluxus&lt;/h2&gt;
&lt;p&gt;A period tracking app that doesn't track you, period.&lt;/p&gt;
&lt;p&gt;I don't trust apps that store data on remote servers.
Most of the period tracking apps are too bloated.
I want to be able to just store the single variable I'm interested in.
I want to be able to export and import data (to a file) if I change the phone.
I want basic stats for seeing the patterns long-term.&lt;/p&gt;
&lt;p&gt;By definition I didn't want to use an app from Google Play.
There's an app from F-Droid I've been using, &lt;a href="https://github.com/wildeyedskies/log28"&gt;log28&lt;/a&gt;, but it's no longer maintained :(.
Rather than forking, I wanted to try out the Pythonic way.
The inspiration for the Fluxus layout comes from log28.&lt;/p&gt;
&lt;p&gt;I showed it to a friend and have a first feature request :D&lt;/p&gt;
&lt;h2&gt;BeeWare&lt;/h2&gt;
&lt;p&gt;I love the idea of writing apps in Python!
I'd love to see more open source on mobile and on alternative repositories.
Having control over the data on my phone has always been interesting to me, and I would prefer to both be able to read the source code of the apps easily, and create my own designs.
I hope BeeWare can be one of the tools to democratize the app manufacturing.
BeeWare lets you write native GUIs for many platforms: the same code runs both as Linux program, and an Android app.&lt;/p&gt;
&lt;p&gt;The only limitation I encountered for the Android version of the app, is that I can't specify the path to store the exported data. And for some reason I can't access the path the app stores the data (Android is hellishly good at hiding the filesystem details from the user).&lt;/p&gt;
&lt;h2&gt;Cursor AI with Claude Sonnet&lt;/h2&gt;
&lt;p&gt;First, I started typing the skeleton of the app myself, but then I remembered we're in the middle of the AI revolution, so it's time to jump in.
Before hopping into Cursor AI, I went through the &lt;a href="https://docs.beeware.org/en/latest/tutorial/tutorial-0.html"&gt;BeeWare tutorial&lt;/a&gt; and skimmed through the &lt;a href="https://toga.readthedocs.io/en/stable/reference/index.html"&gt;Toga documentation&lt;/a&gt; to have an overview of what's possible.&lt;/p&gt;
&lt;p&gt;I loaded my few lines of code and started prompting.
It's uncanny how fast the code appeared and was mostly working.
I estimate I would be able to write this in a few days if I had full focus on the app. I've got a working prototype after roughly 12 hours and two Cursor sessions (2 hours spent on actually reading the code on the way back from EuroPython).
The code is poorly designed, classes are tightly coupled, it's impossible to test it without mocking everything everywhere, but it's there.&lt;/p&gt;
&lt;h3&gt;What went well&lt;/h3&gt;
&lt;p&gt;I started with the tracking tab. I asked to create a JSON formatted file to store the tracked data. It initially stored data for each day I changed the switch state on, later I managed to convince it to only store the "true" values. Initially, it used the Python standard interface to store files which didn't work on Android, but it correctly ported the code to Toga-specific objects. The feature to store data on other days followed.&lt;/p&gt;
&lt;p&gt;Next step was adding two other options - boxes for calendar and statistics.
It tried to put them in a &lt;code&gt;Box&lt;/code&gt;, even though I explicitly said I want to use an &lt;code&gt;OptionContainer&lt;/code&gt;. One correction and we were back on track.
When I asked it to use proper ways of adding boxes to &lt;code&gt;OptionContainer&lt;/code&gt;, it asked me for a permission to browse web, found the relevant part of the Toga docs and applied the information correctly.&lt;/p&gt;
&lt;p&gt;AI originally used deprecated attributes, which leads me to believe it had been trained on some older BeeWare code/apps, and corrected that only after being pointed to the issues. The corrections were OK.&lt;/p&gt;
&lt;p&gt;Toga doesn't have a predefined calendar widget, so I was thinking of using the Python calendar module to draw it. I knew this is going to take some time to figure out. AI wrote the code in ~30 seconds, including the color marking of the days and real-time sync between the tracking app and calendar state. It was flawless.&lt;/p&gt;
&lt;p&gt;I proceeded to ask for marking predictions (initially for 28 days), later changing that to the predictions based on real averages. Good on the first try.&lt;/p&gt;
&lt;p&gt;The statistics tab was the biggest challenge. The display of data was absolutely broken. I was curious how long it would take to debug solely by AI, so I continued with prompting it for fixes. It added so many debugging prints, it completely bloated the code. The data in the console were calculated correctly, but the display showed nonsense. On each attempt AI claimed now it's perfect. After 16 attempts I went for the traditional eye debugging and found the same function implemented in two places. The correct (and debugged) one was being shadowed by a leftover. AI agreed with me, removed the other function and after confirmation that things work, on its own removed all the debug prints.&lt;/p&gt;
&lt;p&gt;It fixed some alignment and display issues - impressive for a tool that doesn't know how things look like. It even wrote me a bunch of scripts to generate icons, as it claims it can't generate images directly. When I wanted to use my own designs, it generated resizing scripts and refreshed the app to display the assets.&lt;/p&gt;
&lt;p&gt;Overall it was fast, mostly correct and the AI was able to fix the  traceback issues without more prompting.&lt;/p&gt;
&lt;h3&gt;... and what didn't&lt;/h3&gt;
&lt;p&gt;Up until now, I had it all in one file that was close to 1000 lines of code. So I upped the game and asked the AI to refactor, which it happily did. Each tab is now a class, which needs the main &lt;code&gt;App&lt;/code&gt; class when is initialized. And the main &lt;code&gt;App&lt;/code&gt; class needs instances of each of the tab objects when is being initialized. The methods walk though the &lt;code&gt;App&lt;/code&gt; instance to other class instances to call some of their methods. It's a mess.&lt;/p&gt;
&lt;p&gt;I then asked it to decouple the architecture, which it agreed is a good idea, but the effects of the decoupling were visually broken and the diff was too much to deal with at the moment. I aborted the mission.&lt;/p&gt;
&lt;p&gt;When I wanted to add tests, it generated a bunch, but a lot of them fail. They are full of mocking methods. I don't trust a single one of them.
The most hilarious part was when I asked for a command to run the tests. It thought for a moment, tried out 4 commands, determined which will give me the best result, and offered a solution: "Run &lt;code&gt;pytest tests/test_foo&lt;/code&gt;". That's one module out of four, and the only one that has all tests passing.
Even though a bunch of tests are failing, AI keeps summarizing that test logic is solid, functionalities work correctly, unicorns and rainbows.&lt;/p&gt;
&lt;p&gt;Also, the code is full of checking the availability of certain attributes with &lt;code&gt;hasattr&lt;/code&gt;, even though I'm in charge of the whole codebase. I consider that unnecessary noise and a first candidate for a cleanup.&lt;/p&gt;
&lt;h3&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;Pluses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The speed of generating code is really impressive.&lt;/li&gt;
&lt;li&gt;Things were mostly correct, or corrected after a prompt from my side&lt;/li&gt;
&lt;li&gt;With small/trivial tasks AI is very helpful.&lt;/li&gt;
&lt;li&gt;When prompted for accurate answers, it is able to look for the information online and apply them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Minuses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It lies. It's very supportive of each your request (the overhyped tone feels weird after a moment).&lt;/li&gt;
&lt;li&gt;It was very persistent in readding the feature I manually deleted. It kept adding it on top of other prompts, until I asked it to redo the functionality in the way I wanted. It congratulated me on a good idea and proposed a solution very similar to what I tried to do with the manual edit. Only then it stopped tinkering with that part of code.&lt;/li&gt;
&lt;li&gt;With many debugging attempts, random attributes of objects were deleted and readded (e.g. &lt;code&gt;flex&lt;/code&gt;, ensuring proper spacing, or a non-existent &lt;code&gt;min_height&lt;/code&gt;). It was frustrating to repeatedly deal with.&lt;/li&gt;
&lt;li&gt;The nontrivial tasks, like refactoring the whole app or decoupling the logic, were too much. I consider those failed attempts.&lt;/li&gt;
&lt;li&gt;Cursor AI AppImage for Linux freezes randomly ALL THE TIME.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where to go from here?&lt;/h2&gt;
&lt;p&gt;After two days, I got a bit bored by the endless loop of prompt-wait-'react to the already fixed-now removed issues'.
I think I'll take the complex changes from here.&lt;/p&gt;
&lt;p&gt;A research how to package the app is needed, so that I could store it on F-Droid. I now use a debug version generated by Briefcase installed via an USB cable.
I want to improve the app slightly (mark &lt;em&gt;today&lt;/em&gt; in the calendar, display the days left to the next predicted period).
The exported file needs to be retrievable from a phone.
Code-wise, I'd like to improve the architecture of the app, write actual tests and generally clean up.&lt;/p&gt;</content><category term="Python"></category><category term="EN"></category><category term="coding"></category><category term="AI"></category></entry><entry><title>RPM macros cheatsheet</title><link href="https://karolinasurma.eu/rpm-macros-cheatsheet.html" rel="alternate"></link><published>2025-06-16T16:24:00+02:00</published><updated>2025-06-16T16:24:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2025-06-16:/rpm-macros-cheatsheet.html</id><summary type="html">&lt;h2&gt;Architecture macros&lt;/h2&gt;
&lt;p&gt;Basic filtering&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;%ifarch
%ifnarch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Macros applicable to Fedora&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;%ix86   i386 i486 i586 i686 pentium3 pentium4 athlon geode
%x86_64 x86_64 x86_64_v2 x86_64_v3 x86_64_v4 amd64 em64t
%arm64  aarch64
%power64    ppc64 ppc64p7 ppc64le
%riscv      %{riscv32} %{riscv64} %{riscv128}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;s390x doesn't have a macro, use the string.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/rpm-software-management/rpm/blob/f8fb0690582b60307c7ec6f8babb48d49b2578ad/macros.in#L1121"&gt;Full list of arch macros&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Architecture macros&lt;/h2&gt;
&lt;p&gt;Basic filtering&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;%ifarch
%ifnarch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Macros applicable to Fedora&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;%ix86   i386 i486 i586 i686 pentium3 pentium4 athlon geode
%x86_64 x86_64 x86_64_v2 x86_64_v3 x86_64_v4 amd64 em64t
%arm64  aarch64
%power64    ppc64 ppc64p7 ppc64le
%riscv      %{riscv32} %{riscv64} %{riscv128}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;s390x doesn't have a macro, use the string.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/rpm-software-management/rpm/blob/f8fb0690582b60307c7ec6f8babb48d49b2578ad/macros.in#L1121"&gt;Full list of arch macros&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Note: &lt;code&gt;%{java_arches}&lt;/code&gt; is there if needed.&lt;/p&gt;
&lt;p&gt;Super important note: If a package is noarch, you can't filter the arches with &lt;code&gt;%ifarch&lt;/code&gt;/&lt;code&gt;%ifnarch&lt;/code&gt;, &lt;code&gt;%ifarch&lt;/code&gt; in such case only matches &lt;code&gt;noarch&lt;/code&gt;.
This only works correctly for arched packages.&lt;/p&gt;</content><category term="Fedora"></category><category term="EN"></category><category term="fedora"></category><category term="tools"></category></entry><entry><title>PyCon Namibia - Looking back at 2024</title><link href="https://karolinasurma.eu/pycon-namibia-looking-back-at-2024.html" rel="alternate"></link><published>2025-01-23T19:34:00+01:00</published><updated>2025-01-23T19:34:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2025-01-23:/pycon-namibia-looking-back-at-2024.html</id><summary type="html">&lt;h2&gt;Power of the community&lt;/h2&gt;
&lt;p&gt;Working with Python and largely in an open-source space brings perks.
Python is truly unique for the communities that form around it.
People crafting webs, moving science forward, powering machine learning, geeks
and passionates create a very diverse crowd.
It took me at least three repetitions …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Power of the community&lt;/h2&gt;
&lt;p&gt;Working with Python and largely in an open-source space brings perks.
Python is truly unique for the communities that form around it.
People crafting webs, moving science forward, powering machine learning, geeks
and passionates create a very diverse crowd.
It took me at least three repetitions from Honza Javorek about his Namibian
experience to start thinking: what if?&lt;/p&gt;
&lt;p&gt;So in 2024, when I heard Mia from the Czech Python community is also thinking of
going, we went for it: I sent a talk proposal which was accepted.
The talk was about leveraging Advent of Code
to progress beyond the beginner's phase of a programmer - an English translation
of the talk I delivered on PyCon CZ 2023 (&lt;a href="https://befeleme.github.io/pycon-na-24/"&gt;slides&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Honestly, this was the best way to arrive in Namibia. The local community will
always stay in my heart! The folks there are one of the most welcoming, warm and
open people I've ever met.&lt;/p&gt;
&lt;p&gt;After 4 days of the conference, we packed, borrowed a car and headed North to
Etosha National Park. Let me just say: it can't be missed if you're in Namibia.
We stopped at the Cheetah Conservation Fund on our way there, which I can
wholeheartedly recommend. We've seen the desert and the ocean, got caught in a heavy
rainfall which lasted around 30 minutes, met countless antelopes and baboons, 
and drove over 1400 km in total.
I haven't felt so relaxed in years, probably.&lt;/p&gt;
&lt;h2&gt;Supporting the Namibian community&lt;/h2&gt;
&lt;p&gt;The following advice is tailored for a fellow Westerner, it contains Assumptions.&lt;/p&gt;
&lt;p&gt;We didn't know it before, but the Namibian community is very young, both in
terms of age, and maturity. The whole IT industry is emerging.
Don't be fooled by the appearances though, folks know exactly which problems
they want to tackle using technologies. I've seen an excellent workshop on using
machine learning and pattern recognition to find oases in the desert.
If you plan to come to the conference, in my opinion the best way to contribute
on spot is to bring ideas about technologies with practical application.
Think of constraints when designing your talk or workshop: internet access cannot be
taken for granted, think of services available for free rather than paid.&lt;/p&gt;
&lt;p&gt;You can also support PyCon Namibia directly. &lt;a href="https://na.pycon.org/tickets/"&gt;An amount of 20 EUR&lt;/a&gt;
will pay for one person's ticket.&lt;/p&gt;
&lt;h2&gt;Footnotes&lt;/h2&gt;
&lt;p&gt;I've got a lot of mixed feelings about responsible traveling to post-colonial
countries as a European tourist, which is a topic for a long research and even longer essay,
so maybe one day, when I find the proper words.
Nevertheless, my advice no. 1 for anyone thinking of traveling to places which
are very different from their homeland, is: find locals,
listen and learn from them, contribute if you can, don't be just a tourist.
Python happens to be a great social glue!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Conference" src="./images/windhoek-2024.JPG"&gt;
&lt;img alt="Cheetah" src="./images/namibia-24.JPG"&gt;
&lt;img alt="Flamingos" src="./images/flamingos-24.JPG"&gt;&lt;/p&gt;</content><category term="Python"></category><category term="EN"></category><category term="community"></category><category term="conferences"></category></entry><entry><title>fedrq - querying Fedora repositories</title><link href="https://karolinasurma.eu/fedrq-querying-fedora-repositories.html" rel="alternate"></link><published>2024-02-29T16:18:00+01:00</published><updated>2024-02-29T16:18:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2024-02-29:/fedrq-querying-fedora-repositories.html</id><summary type="html">&lt;h2&gt;Querying repositories&lt;/h2&gt;
&lt;p&gt;Part of my $DAILYJOB is digging in multiple Fedora repositories.
Every time I prepare a package update, I check whether the update has a potential to break something.
Typically I set up lists of packages that require my package and build them in a isolated environment, before hitting …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Querying repositories&lt;/h2&gt;
&lt;p&gt;Part of my $DAILYJOB is digging in multiple Fedora repositories.
Every time I prepare a package update, I check whether the update has a potential to break something.
Typically I set up lists of packages that require my package and build them in a isolated environment, before hitting the real Fedora.
I heavily use Copr as a test bed (described in detail in the talk from &lt;a href="./devconf-2023-packaging-talk.html"&gt;DevConf 2023&lt;/a&gt;).
In that talk I show and comment a bunch of repoqueries.
Repoqueries do the job, but they're nearly-impossible to come up with (correctly) and if I lost my bash history, I'd be left crying on the floor.
(&lt;em&gt;Not really though&lt;/em&gt;, in the end I've got the talk recording \&amp;lt;evil laughter&gt;).&lt;/p&gt;
&lt;h2&gt;fedrq&lt;/h2&gt;
&lt;p&gt;This is where &lt;a href="https://fedrq.gtmx.me/"&gt;fedrq&lt;/a&gt; comes to the scene. A new tool with a new approach by an incredibly active Fedora community member, gotmax23.
I spent a jolly day with it and decided to create this cheatsheet to help me translate my use cases to fedrq and ease the migration.&lt;/p&gt;
&lt;h2&gt;Cheatsheet&lt;/h2&gt;
&lt;h3&gt;formatters&lt;/h3&gt;
&lt;p&gt;Powerful feature of the tool; list them all with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq formatters --attrs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;And format the output of the tool with &lt;code&gt;-F &amp;lt;formatter&amp;gt;&lt;/code&gt;.
Many more things are possible, refer to &lt;a href="https://fedrq.gtmx.me/fedrq1/#formatters_1"&gt;the documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;What package does a file belong to?&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Fedora Rawhide
$ fedrq pkgs -P /usr/bin/python3
# Fedora 39 (-b, --branch)
$ fedrq pkgs -b f39 -P /usr/bin/python3
# Koji - format output with name-version-release-repository
$ fedrq pkgs -r @koji:rawhide -P /usr/bin/python3 -F nevrr
# Copr repository (-r, --repo)
$ fedrq pkgs -r @copr:@python/python3.13 -P /usr/bin/python3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;List all files from the package&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq pkgs python3-rich -F files
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;What's the full package name?&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq pkgs python-rich
python-rich-13.7.0-5.fc40.src

$ fedrq pkgs python3-rich
python3-rich-13.7.0-5.fc40.noarch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;What packages will be built from my source component?&lt;/h3&gt;
&lt;p&gt;I can also format output to get only names: &lt;code&gt;-F name&lt;/code&gt; or full nevr &lt;code&gt;-F nevr&lt;/code&gt;; or skip formatter at all.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq subpkgs python-sphinx -F nev
python-sphinx-doc-1:7.2.6
python3-sphinx-1:7.2.6
python3-sphinx-latex-1:7.2.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;The opposite: What source rpm comes my built package from?&lt;/h3&gt;
&lt;p&gt;It can take also the base name: &lt;code&gt;python3-sphinx-latex&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq pkgs python3-sphinx-latex-1:7.2.6-6.fc40.noarch -F source
python-sphinx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Provides and requirements of my components&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq pkgs python3-sphinx -F provides
python3-sphinx = 1:7.2.6-6.fc40
python-sphinx = 1:7.2.6-6.fc40
python3.12-sphinx = 1:7.2.6-6.fc40
python3.12dist(sphinx) = 7.2.6
python3dist(sphinx) = 7.2.6

# runtime requirements
$ fedrq pkgs python3-rich -F requires
python(abi) = 3.12
(python3.12dist(pygments) &amp;lt; 3~~ with python3.12dist(pygments) &amp;gt;= 2.13)
python3.12dist(markdown-it-py) &amp;gt;= 2.2

# buildtime requirements
$ fedrq pkgs python-rich -F requires
python3-devel
python3dist(packaging)
pyproject-rpm-macros
python3dist(pytest)
python3dist(setuptools)
python3dist(attrs)
python3dist(pip) &amp;gt;= 19
(python3dist(tomli) if python3-devel &amp;lt; 3.11)
python3dist(poetry-core) &amp;gt;= 1
(python3dist(pygments) &amp;lt; 3~~ with python3dist(pygments) &amp;gt;= 2.13)
python3dist(markdown-it-py) &amp;gt;= 2.2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Dependencies&lt;/h3&gt;
&lt;h4&gt;What other packages need my binary package?&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;whatrequires&lt;/code&gt; equals to &lt;code&gt;wr&lt;/code&gt;.
&lt;code&gt;whatrequires-src&lt;/code&gt; equals to &lt;code&gt;wrsrc&lt;/code&gt;.
&lt;code&gt;-s, --src&lt;/code&gt; means only source rpms.
&lt;code&gt;-S, --nosrc&lt;/code&gt; means exclude source rpms.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For Python &lt;code&gt;-s/-S&lt;/code&gt; may not seem relevant, as source and built components are usually named differently,
but for any other components it's crucial, compare e.g.
&lt;code&gt;$ fedrq pkgs ocrmypdf -S -F requires&lt;/code&gt; and
&lt;code&gt;$ fedrq pkgs ocrmypdf -F requires&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;equivalent to: &lt;code&gt;repoquery -q --repo=rawhide{,-source} --whatrequires python3-rich&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq whatrequires python3-rich

# It can work with virtual provides too!
# don&amp;#39;t use it though, it only matches the literal provides
$ fedrq whatrequires -s &amp;#39;python3dist(rich)&amp;#39; -F name

# released Fedora: both fedora and updates repos
$ fedrq whatrequires --branch f38 python3-rich
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Only interested in fedora repo?
equivalent to: &lt;code&gt;repoquery --repo=fedora{,-source} --releasever 38 --whatrequires python3-rich&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq whatrequires --branch f38 --repo @release python3-rich
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;What packages require any subpackage of my srpm?&lt;/h4&gt;
&lt;p&gt;equivalent to: &lt;code&gt;repoquery -q --repo=rawhide{,-source} --whatrequires python3-sphinx --whatrequires python3-sphinx-latex --whatrequires python-sphinx-doc&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# wrsrc is used with the source package name
$ fedrq wrsrc python-sphinx | wc -l
821

# compared to this - it only takes care about this concrete built package name
$ fedrq wr python3-sphinx | wc -l
815
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;What packages require python-sphinx' components on build time?&lt;/h4&gt;
&lt;p&gt;equivalent to: &lt;code&gt;repoquery -q --repo=rawhide{,-source} --whatrequires python3-sphinx --whatrequires python3-sphinx-latex --whatrequires python-sphinx-doc | grep 'src$' | pkgname | sort | uniq | wc -l&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq wrsrc -s python-sphinx -F source | wc -l
739
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h4&gt;The Big Python Query&lt;/h4&gt;
&lt;p&gt;Get names of the source packages in Koji that require any of the given Python provides - needed for Python rebuilds.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ repoquery --repo=koji --source --whatrequires &amp;#39;libpython3.12.so.1.0()(64bit)&amp;#39; --whatrequires &amp;#39;python(abi) = 3.12&amp;#39; --whatrequires &amp;#39;python3.12dist(*)&amp;#39; | pkgname | env LANG=en_US.utf-8 sort | uniq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Fedrq equivalent:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fedrq wr --repo=&amp;#39;@koji:rawhide&amp;#39; &amp;#39;python3.12dist(*)&amp;#39; &amp;#39;python(abi) = 3.12&amp;#39; &amp;#39;libpython3.12.so.1.0()(64bit)&amp;#39; -F source | env LANG=en_US.utf-8 sort | uniq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3&gt;Nice little things repoquery doesn't provide easily&lt;/h3&gt;
&lt;p&gt;Breakdown of the buildtime, runtime deps and their srpm names:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq whatrequires --branch f38 python3-rich -F breakdown
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Resolve the packages required by rich on runtime.
Same with build time - just change the queried package name&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq pkgs python3-rich -F requires | fedrq pkgs -iSP
python3-3.12.2-2.fc41.x86_64
python3-markdown-it-py-3.0.0-4.fc40.noarch
python3-pygments-2.17.2-3.fc40.noarch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Print lines matching the required package in packages that require the given package (yeah, I can't explain it).
Useful for finding packages that use aggresive version constraints.
Semantically the same as our notoriously horrible oneliner: &lt;code&gt;for pkg in $(repoquery -q --repo=rawhide{,-source} --whatrequires python3-sphinx); do repoquery -q --repo=rawhide{,-source} --requires $pkg | grep -E '\bsphinx\b' | grep '&amp;lt;' &amp;amp;&amp;amp; echo -e "${pkg}\n"; done&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ fedrq wr -F narm:python3-sphinx python3-sphinx | grep &amp;quot;&amp;lt;&amp;quot;
# only interested in runtime? -S means --nosrc
$ fedrq wr -S -F narm:python3-sphinx python3-sphinx | grep &amp;quot;&amp;lt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Fedora"></category><category term="EN"></category><category term="fedora"></category><category term="tools"></category></entry><entry><title>EuroPython in Prague</title><link href="https://karolinasurma.eu/europython-in-prague.html" rel="alternate"></link><published>2023-09-01T18:55:00+02:00</published><updated>2023-09-01T18:55:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2023-09-01:/europython-in-prague.html</id><summary type="html">&lt;p&gt;It almost feels as if this year was the first real one after Covid! 
When it comes to Python, 2023 has brought two big conferences to Prague: EuroPython and, after a covid break, PyCon CZ.&lt;/p&gt;
&lt;p&gt;A short report of PyLadies' activities can be found on the &lt;a href="https://blog.python.cz/pyladies-byly-jsme-na-europythonu"&gt;official blog&lt;/a&gt; of the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It almost feels as if this year was the first real one after Covid! 
When it comes to Python, 2023 has brought two big conferences to Prague: EuroPython and, after a covid break, PyCon CZ.&lt;/p&gt;
&lt;p&gt;A short report of PyLadies' activities can be found on the &lt;a href="https://blog.python.cz/pyladies-byly-jsme-na-europythonu"&gt;official blog&lt;/a&gt; of the Czech Python community.&lt;/p&gt;</content><category term="PyLadies"></category><category term="EN"></category><category term="conferences"></category></entry><entry><title>DevConf 2023: Talking about packaging in Fedora</title><link href="https://karolinasurma.eu/devconf-2023-packaging-talk.html" rel="alternate"></link><published>2023-07-15T20:12:00+02:00</published><updated>2023-07-15T20:12:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2023-07-15:/devconf-2023-packaging-talk.html</id><summary type="html">&lt;p&gt;My daily job is all about packaging.
I wouldn't have believed that such an invisible (for the outsider) topic can employ hundreds people all over the world.&lt;/p&gt;
&lt;h2&gt;Preparations&lt;/h2&gt;
&lt;p&gt;This year I wanted to talk at DevConf about something related to my work.
That's a new - I have no issues talking …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My daily job is all about packaging.
I wouldn't have believed that such an invisible (for the outsider) topic can employ hundreds people all over the world.&lt;/p&gt;
&lt;h2&gt;Preparations&lt;/h2&gt;
&lt;p&gt;This year I wanted to talk at DevConf about something related to my work.
That's a new - I have no issues talking at the conferences, but till now it was always community and education-centered.
This was the first technical talk I wanted to deliver.&lt;/p&gt;
&lt;p&gt;I learned some things on the way!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;live demos aren't the greatest idea of all times. it's much better to have a static code snippets in the presentation and demo with the interested parties afterwards&lt;/li&gt;
&lt;li&gt;researching a new topic takes even 10x more than preparing a topic you're already an expert in - I spent dozens of hours preparing&lt;/li&gt;
&lt;li&gt;rehearse, rehearse, rehearse. 15 or 20 minutes is nothing if you're nervous, get into detailed explanation or jump to another topic in stress&lt;/li&gt;
&lt;li&gt;also, while rehearsing, it's good to note down all weak points and fill in the information gaps. It helped me understand better my own work&lt;/li&gt;
&lt;li&gt;&lt;a href="https://revealjs.com/"&gt;reveal.js&lt;/a&gt; is a great presentation framework easy enough for people who don't enjoy digging in css. And publishing it on GitHub takes only a few clicks!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Effects&lt;/h2&gt;
&lt;p&gt;My talk was called &lt;em&gt;Fedora package update? Assess its impact in Copr&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://befeleme.github.io/devconf-2023/"&gt;Slides from the presentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/qiw773xeI7w?si=joVPxm3CyNPz1mCl" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/p&gt;</content><category term="Python"></category><category term="EN"></category><category term="talks"></category><category term="conferences"></category></entry><entry><title>PyLadies at DevConf</title><link href="https://karolinasurma.eu/pyladies-at-devconf.html" rel="alternate"></link><published>2022-02-11T18:16:00+01:00</published><updated>2022-02-11T18:16:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2022-02-11:/pyladies-at-devconf.html</id><summary type="html">&lt;p&gt;As winter came, we decided to keep the good streak of talks given and sent an application to the Czech &lt;a href="https://www.devconf.info/cz/"&gt;DevConf&lt;/a&gt;.
Again we teamed up with Anežka and delivered a presentation called &lt;a href="https://www.youtube.com/watch?v=_EuNGz8-Y3M&amp;amp;list=PLU1vS0speL2bf9Zfa0pHQLPBhEKbbbsua&amp;amp;index=85"&gt;PyLadies Community in Brno: Mutual Help to Grow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/_EuNGz8-Y3M" title="YouTube video player" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;This time we focused on what drives the community builders …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As winter came, we decided to keep the good streak of talks given and sent an application to the Czech &lt;a href="https://www.devconf.info/cz/"&gt;DevConf&lt;/a&gt;.
Again we teamed up with Anežka and delivered a presentation called &lt;a href="https://www.youtube.com/watch?v=_EuNGz8-Y3M&amp;amp;list=PLU1vS0speL2bf9Zfa0pHQLPBhEKbbbsua&amp;amp;index=85"&gt;PyLadies Community in Brno: Mutual Help to Grow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/_EuNGz8-Y3M" title="YouTube video player" frameborder="0" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;This time we focused on what drives the community builders: the people who enable the community's main focus.
There are organizers, coaches, lecturers (also called the &lt;em&gt;main coaches&lt;/em&gt;) and we realized, in short, two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the motivation to &lt;strong&gt;join&lt;/strong&gt; a community often isn't the same one which prompts a person to &lt;strong&gt;stay&lt;/strong&gt; in a community&lt;/li&gt;
&lt;li&gt;there are real-life skills and gains to grab other than the &lt;em&gt;whatever the community is about&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hoped for a real life talk on a hybrid conference which eventually wasn't possible.
But the conference org team has no power over a global pandemic, so I'll just stop whining here.
Kudos to the organizers who did a great job making it work virtually!&lt;/p&gt;
&lt;p&gt;Much satisfaction, would do it again. :)&lt;/p&gt;</content><category term="PyLadies"></category><category term="EN"></category><category term="talks"></category><category term="conferences"></category><category term="community"></category></entry><entry><title>PyLadies at OpenAlt (CZ)</title><link href="https://karolinasurma.eu/pyladies-at-openalt-cz.html" rel="alternate"></link><published>2021-11-25T17:28:00+01:00</published><updated>2021-11-25T17:28:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-11-25:/pyladies-at-openalt-cz.html</id><summary type="html">&lt;p&gt;On the first November weekend Anežka Müller and me delivered a talk about PyLadies in the Czech Republic.
We wanted to answer the questions people may have about what and why we do.
We also shared some internal thoughts how we aim to build a sustainable format of community courses …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On the first November weekend Anežka Müller and me delivered a talk about PyLadies in the Czech Republic.
We wanted to answer the questions people may have about what and why we do.
We also shared some internal thoughts how we aim to build a sustainable format of community courses and how we deal with the inevitable perils of community activities - 
burnout (both on the side of the attendees and our volunteers).&lt;/p&gt;
&lt;p&gt;The talk was in Czech.
Slides are available at the &lt;a href="https://openalt.cz/2021/slides/karolina-surma-anezka-muller-pyladies-kdo-kde-proc-a-jak.pdf"&gt;conference's webpage&lt;/a&gt;.
It's available on &lt;a href="https://youtu.be/UGY3yhsY3NQ?t=9032"&gt;YouTube&lt;/a&gt; as a single stream, but we're hoping for a cut and enhanced version - the audio seems significantly worse than we expected.&lt;/p&gt;
&lt;p&gt;There were quite a bunch of people attending the talk which is a nice result for a sunny Saturday.
I was excited to see two of my close friends from abroad to come and hear our Czech speech. &lt;/p&gt;
&lt;h2&gt;Footnotes&lt;/h2&gt;
&lt;p&gt;I wanted to do something for the OpenAlt as I benefited from their talks and workshops for a few years in a row now.
The online format gave me hope we could prepare something more country-centric,
but in the end it was more about our local Brno chapter.&lt;/p&gt;
&lt;p&gt;Martina from Ostrava's PyLadies helped us preparing the talk outline.
For the rest of the talk we teamed up with Anežka and I'm super grateful she agreed to do this together.
I'm still impressed how smooth the later preparations were and I find Anežka's insights about the mission and vision especially valuable. 
We should definitely do more in the future.&lt;/p&gt;</content><category term="PyLadies"></category><category term="EN"></category><category term="talks"></category><category term="conferences"></category></entry><entry><title>The debug tale</title><link href="https://karolinasurma.eu/the-debug-tale.html" rel="alternate"></link><published>2021-08-15T17:38:00+02:00</published><updated>2021-08-15T17:38:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-08-15:/the-debug-tale.html</id><summary type="html">&lt;h2&gt;Debugging&lt;/h2&gt;
&lt;p&gt;The word anyone attempting programming knows from the almost beginning.
You know, the moment you learn: if it doesn't work, look at the traceback, then add 153 &lt;code&gt;print&lt;/code&gt; statements, then try to understand where the heck you forgot the missing parenthesis.&lt;/p&gt;
&lt;p&gt;When some clever programmers told me to start …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Debugging&lt;/h2&gt;
&lt;p&gt;The word anyone attempting programming knows from the almost beginning.
You know, the moment you learn: if it doesn't work, look at the traceback, then add 153 &lt;code&gt;print&lt;/code&gt; statements, then try to understand where the heck you forgot the missing parenthesis.&lt;/p&gt;
&lt;p&gt;When some clever programmers told me to start using debugger, I gave it a try. 
But even after attending some workshops and reading tutorials, I wasn't sure why I'd ever want to use it.
After all, I could just run the application and see where it crashes.&lt;/p&gt;
&lt;h2&gt;The right tool for the task. Which task?&lt;/h2&gt;
&lt;p&gt;Today I think it's a matter of presenting the use cases.
The typical story would be: &lt;em&gt;I write the application and it behaves strangely. So I run a debugger and...&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;My guess is that this is where the beginner stops. 
When all you've ever written are one-file scripts or very small programs, it sounds as if it's an overkill. Print &amp;amp; tracebacks will do. &lt;/p&gt;
&lt;p&gt;BTW, I recently found some clever senior programmers who admitted they use &lt;code&gt;print&lt;/code&gt; too! No reason to be ashamed!&lt;/p&gt;
&lt;p&gt;Let me present the other use cases that a junior may be more likely to meet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I have this script/tool that should do X. When I run it, it doesn't do X, instead it produces Y. I want to understand why.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;or: &lt;/p&gt;
&lt;p&gt;&lt;em&gt;I want to contribute to a big project that I found on GitHub which has got plenty of tasks labeled "Good first issue". There is a bug - when you do A, the B's output is corrupted. I want to understand the relationship between A and B.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;or - my &lt;em&gt;eureka&lt;/em&gt; case:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I use the project that bundles a lot of libraries within. I want to use it with the libraries from the system instead. I want to test that it still works as expected.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The common features of those use cases are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I'm not the author of the original code.&lt;/li&gt;
&lt;li&gt;I have to read a lot of code lines in order to start working on a task.&lt;/li&gt;
&lt;li&gt;The applications I want to understand don't have the conventional problems - they don't crash, no traceback is involved.&lt;/li&gt;
&lt;li&gt;The more complicated program, the more context there is to keep through many function calls.&lt;/li&gt;
&lt;li&gt;Constant adding and removing 153 &lt;code&gt;print&lt;/code&gt; statements would be pain in the... fingers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Humans - not the right tool for the task&lt;/h2&gt;
&lt;p&gt;As a human without modern tools, you'd have to find that line and start displaying stuff: print variable's contents, check the function's call, find the function's definition, print some variables there, see there is another function's call making some transformation with your initial variable, so check its definition and -- why not -- add more prints there.&lt;/p&gt;
&lt;p&gt;You could go the other way around and start with some import buried deep down in the module, and gradually find your way up to the user interface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Humans are capable of (if really motivated to...), but in fact don't excel in keeping the context through many files and levels of hierarchy.&lt;/strong&gt;
A computer is much better suited for the task. &lt;/p&gt;
&lt;p&gt;Depending on what tool you use, setting up a debugger can be as easy as setting a single breakpoint on the line that you're interested in. 
Now you have the tools to step into the functions and dig as deep as you need to.
You can see the contents of the variables or arguments that were passed on the go.
You can see the boolean evaluation of the statements and play interactively with the program's current state.&lt;/p&gt;
&lt;h2&gt;Into the details&lt;/h2&gt;
&lt;p&gt;I came across this talk by Nina Zakharenko which I recommend if you want to get a sense of how a debugger can be useful for you: &lt;a href="https://www.youtube.com/watch?v=5AYIe-3cD-s"&gt;Goodbye Print, Hello Debugger!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me include also the article about the various debugging techniques (not focused entirely on debuggers) which may be interesting in those traditional use cases, when it's your own application you deal with. &lt;a href="https://towardsdatascience.com/ultimate-guide-to-python-debugging-854dea731e1b"&gt;Ultimate Guide to Python Debugging&lt;/a&gt; by Martin Heinz provides the means to having a clarity of how your program actually works. &lt;/p&gt;
&lt;h2&gt;Post scriptum&lt;/h2&gt;
&lt;p&gt;Finding a way to include the debugger into your workflow is not a trivial quest.
If you feel you haven't really found the convincing use case yet, there is nothing wrong to it.&lt;/p&gt;
&lt;p&gt;In my original case, I realized it'd be great to use the debugger just as I headed to the &lt;strong&gt;last&lt;/strong&gt; item on my library's list.
I would have saved many hours if I used it right from the start.
The taste of learning is sometimes bitter.&lt;/p&gt;
&lt;p&gt;Since the &lt;em&gt;eureka&lt;/em&gt; moment I started using the debugger baked in my IDE more often. 
It is especially helpful when a script written by someone else doesn't produce the output I've expected. 
Ironically enough, the tool designed to find the flaws in the code seems to be as good in debugging humans.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Oh, and by the way... If someone tells you that writing a readable code is important, just believe them.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Python"></category><category term="EN"></category><category term="coding"></category></entry><entry><title>Junior's mindset</title><link href="https://karolinasurma.eu/junior-s-mindset.html" rel="alternate"></link><published>2021-06-22T19:22:00+02:00</published><updated>2021-06-22T19:22:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-06-22:/junior-s-mindset.html</id><summary type="html">&lt;h2&gt;The good, the bad and the scary&lt;/h2&gt;
&lt;p&gt;Ups and downs of your next technical role can be stressful. 
They are to me. You are uncertain pretty much all the time and your experience from a different field doesn't really match the environment you look at.&lt;/p&gt;
&lt;h3&gt;The good&lt;/h3&gt;
&lt;p&gt;Let's start with …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;The good, the bad and the scary&lt;/h2&gt;
&lt;p&gt;Ups and downs of your next technical role can be stressful. 
They are to me. You are uncertain pretty much all the time and your experience from a different field doesn't really match the environment you look at.&lt;/p&gt;
&lt;h3&gt;The good&lt;/h3&gt;
&lt;p&gt;Let's start with the good ones!
It certainly feels great when you solve an issue that was lying around for a few years. The timeline of accomplishment can be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; Bug created      /me: print(&amp;quot;Hello, world&amp;quot;)        /me: Solves the bug
───|───────────────────────|────────────────────────────────|───►
 2015                    2017                              2021
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Or: you dig into some problem and understand what causes the error. 
You bring the issue to the developer's attention, possibly already with a fix, and wait thinking: have I done legit job?
The next day you see all the happy emojis on your Pull Request and people are telling you "good job" and merge the changes and the rainbow appears above your desk.&lt;/p&gt;
&lt;h3&gt;The scary&lt;/h3&gt;
&lt;p&gt;The uncertainty. 
You think you did a good job or a good-enough job, and it could be - but there is always something to improve. 
Every task is a new task, every way is a new way, you look around for gotchas and still not get all of them.
Now, this isn't anything particularly bad. 
It's understandable you're new, don't know the conventions, need to learn the stuff. 
No one makes you feel like you're a con. You're probably &lt;strong&gt;the only one&lt;/strong&gt; thinking that.
And you need to prove to &lt;strong&gt;the whole world&lt;/strong&gt; you're worthy.&lt;/p&gt;
&lt;h3&gt;The bad&lt;/h3&gt;
&lt;p&gt;It's not a role that's stressful, it's you bringing the pressure upon yourself. 
In home office regime you can't go to the office and share team's vibe.
You don't have the usual means of disassembling the bomb by getting along with people, small talking, venting the frustrations and sharing the joys. 
You don't get as much of the external validation, such needed at the start.
It's you and your desk and your computer, your mailbox and all the thoughts running through your head.&lt;/p&gt;
&lt;h3&gt;What helps?&lt;/h3&gt;
&lt;p&gt;Vent with someone you trust: be it your peer, manager, partner, friend.&lt;/p&gt;
&lt;p&gt;Write a blog post which you hide in drafts for a few weeks.&lt;/p&gt;
&lt;p&gt;Find some other juniors or career switchers in similar mode, talking to them can be beneficial, you will no longer feel like an isolated island. &lt;/p&gt;
&lt;p&gt;Go to the gym. Why beat the whole world when you can beat yourself?&lt;/p&gt;
&lt;p&gt;Write a brag document - record every success you've made so far. Read it often.&lt;/p&gt;
&lt;p&gt;And just keep hanging in there. The mood will change in time as you get more experienced and independent. &lt;/p&gt;
&lt;p&gt;And... at some point you may even reconsider publishing that buried post. There are others on the same path out there. Help them feel less lonely.&lt;/p&gt;</content><category term="Currents"></category><category term="EN"></category></entry><entry><title>Git submodules</title><link href="https://karolinasurma.eu/git-submodules.html" rel="alternate"></link><published>2021-05-05T17:19:00+02:00</published><updated>2021-05-05T17:19:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-05-05:/git-submodules.html</id><summary type="html">&lt;p&gt;As I swim through the new waters, some nasty gotchas wait for me in the currents.&lt;/p&gt;
&lt;h2&gt;Overture&lt;/h2&gt;
&lt;p&gt;Many times have I encountered a GitHub repository with some folders that look more like a hyperlink to another folders.&lt;/p&gt;
&lt;p&gt;An example from &lt;a href="https://github.com/getpelican/pelican-themes"&gt;Pelican themes&lt;/a&gt; looks like that:&lt;/p&gt;
&lt;p&gt;&lt;img alt="submodules" src="./images/gh-submodules.png"&gt;&lt;/p&gt;
&lt;p&gt;Notice the icons with the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;As I swim through the new waters, some nasty gotchas wait for me in the currents.&lt;/p&gt;
&lt;h2&gt;Overture&lt;/h2&gt;
&lt;p&gt;Many times have I encountered a GitHub repository with some folders that look more like a hyperlink to another folders.&lt;/p&gt;
&lt;p&gt;An example from &lt;a href="https://github.com/getpelican/pelican-themes"&gt;Pelican themes&lt;/a&gt; looks like that:&lt;/p&gt;
&lt;p&gt;&lt;img alt="submodules" src="./images/gh-submodules.png"&gt;&lt;/p&gt;
&lt;p&gt;Notice the icons with the arrows and kind of weird name of the blue entries.&lt;/p&gt;
&lt;h2&gt;Tricky part&lt;/h2&gt;
&lt;p&gt;I wasn't paying much attention to them until I had to. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You want to clone a repository containing those linked folders.
So you run &lt;code&gt;git clone git://&amp;lt;your-repo-url&amp;gt;&lt;/code&gt; expecting the whole repository will be cloned to your disk.
It is, but without those linked ones. 
They are empty, no files, nada.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What not to do&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enter the empty folders and try to &lt;code&gt;git pull&lt;/code&gt; the contents. This won't help.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is possible to do&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ask a more senior colleague if you have one nearby.
Alternatively, ask your favorite search engine how to download the folder contents.
The only problem is how to phrase the query to actually find anything meaningful. 
I did, it took me enough time to see some sense in publishing the note.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What actually to do&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Look for &lt;em&gt;git submodule&lt;/em&gt; or just read &lt;a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules"&gt;this chapter&lt;/a&gt; from excellent Pro Git book.&lt;/p&gt;
&lt;p&gt;Go to your project root directory and run the commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git submodule init
git submodule update
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The empty folders shall be populated now. :)&lt;/p&gt;</content><category term="Git"></category><category term="EN"></category><category term="coding"></category><category term="tools"></category></entry><entry><title>Edulog #4</title><link href="https://karolinasurma.eu/edulog-4.html" rel="alternate"></link><published>2021-04-05T12:49:00+02:00</published><updated>2021-04-05T12:49:00+02:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-04-05:/edulog-4.html</id><summary type="html">&lt;p&gt;That's been a ride. A bit of cold in the middle of March and diving deep in RPM ecosystem.
I tried to sink into &lt;a href="https://www.factorio.com/"&gt;Factorio&lt;/a&gt; to relax, but it keeps feeling as if I just went from one job to another. It has some real charm though, so I hope …&lt;/p&gt;</summary><content type="html">&lt;p&gt;That's been a ride. A bit of cold in the middle of March and diving deep in RPM ecosystem.
I tried to sink into &lt;a href="https://www.factorio.com/"&gt;Factorio&lt;/a&gt; to relax, but it keeps feeling as if I just went from one job to another. It has some real charm though, so I hope I'll find my way around it.&lt;/p&gt;
&lt;h2&gt;Accomplishments&lt;/h2&gt;
&lt;p&gt;In the middle of March I joined the big Python team course as a home assignments couch.
Maybe I should focus rather on good coding practices, but I figured - I miss community courses and still have some time and energy, so I jumped right in the turtle pictures ;).
This one feels completely different though. Without the power from personal encounters (saying me - not really a people's person), the whole process is much more mechanical. 
I start to understand the benefits of &lt;a href="https://cs.wikipedia.org/wiki/Massive_open_online_course"&gt;MOOC course&lt;/a&gt; one community member proposed around a year ago to rather uninterested audience.&lt;/p&gt;
&lt;h2&gt;Last few weeks I learned / read / attended&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How to add desktop entries to programs in GNOME environment :).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to test RPM packages using containers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to organize changes into readable commits (and that &lt;code&gt;git rebase --interactive&lt;/code&gt; is indeed my good friend).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I wrote the solutions to Lab 1 and Problem Set 1 from &lt;a href="https://cs50.harvard.edu/x/2021/weeks/1/"&gt;CS50 course&lt;/a&gt;.
I realized that &lt;strong&gt;C&lt;/strong&gt; requires a different approach and understood what some people mean by &lt;em&gt;thinking in a language&lt;/em&gt;. 
Being limited by what can be done, made me craft my algorithms in much careful (and, to be honest, mathematical) way I would with Python.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I went on a meetup regarding financial negotiations. 
A bit out-of-time as I am just past this phase. I'm happy to have attended though, I met a long-lost friend there and spent a super interesting evening with CyberMagnolia ladies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And to Daria's lecture on &lt;a href="https://www.slideshare.net/DariaGrudzien/junioring-101-how-not-to-go-bonkers-at-the-start-devconfcz-2021"&gt;Junioring 101&lt;/a&gt; for &lt;a href="https://junior.guru/"&gt;Junior.Guru club&lt;/a&gt;. 
  This time with a longer story about what a Site Reliability Engineer is and her own path towards tech - insightful and fun. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And to online board game evening with my team. After a year of pandemic it didn't occur to me that there still exist some ways to hang out with people. Weird, I used to play a lot on &lt;a href="https://kurnik.pl"&gt;kurnik&lt;/a&gt;. &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Following &lt;a href="https://www.dropbox.com/s/3q5bp1ykttgqutu/prezentace.html?dl=1"&gt;Lumir's advice&lt;/a&gt; to learn new habits by placing them next to our old ones and having decided I won't continue on running in my (rather broken at the moment) sport's routine, I'm in the middle of creating habit of ~1-hour-long walks with podcasts. Working well so far!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Continuing on &lt;a href="https://www.goodreads.com/book/show/22085568-the-culture-map"&gt;The Culture Map by Erin Meyer&lt;/a&gt;. 
I see that my uncertainty regarding how to behave in business situations is justified. 
I identified some situations that made me uncomfortable in the past which were just a neutral part of the &lt;em&gt;source&lt;/em&gt; culture. 
Hopefully I'll find time to write down some notes from the book.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category><category term="EN"></category></entry><entry><title>Draw a map! (2/2)</title><link href="https://karolinasurma.eu/draw-a-map-2-2.html" rel="alternate"></link><published>2021-03-20T14:00:00+01:00</published><updated>2021-03-20T14:00:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-03-20:/draw-a-map-2-2.html</id><summary type="html">&lt;p&gt;In the &lt;a href="./draw-a-map-1.html"&gt;first part&lt;/a&gt; you've learned about a tool called uMap. 
For some use cases a static map is enough.&lt;/p&gt;
&lt;p&gt;OpenStreetMap is however very much alive and changes every second.
You may want to reflect those changes in your map.
Real time requests aren't feasible with current OSM state. 
If …&lt;/p&gt;</summary><content type="html">&lt;p&gt;In the &lt;a href="./draw-a-map-1.html"&gt;first part&lt;/a&gt; you've learned about a tool called uMap. 
For some use cases a static map is enough.&lt;/p&gt;
&lt;p&gt;OpenStreetMap is however very much alive and changes every second.
You may want to reflect those changes in your map.
Real time requests aren't feasible with current OSM state. 
If you try to send too many of them, you may end up with a ban on Overpass servers.&lt;/p&gt;
&lt;p&gt;Let's say you'd like to update the map nightly, which shouldn't be too hard on Overpass.&lt;/p&gt;
&lt;h2&gt;Where to for lunch?&lt;/h2&gt;
&lt;p&gt;My goal was to display all restaurants where I can eat in the region I live.
I wanted to filter for places which serve &lt;em&gt;plant-based menu&lt;/em&gt; and display them on the map.
This way I not only know where to go for lunch, but also have a visual clue when it comes to updating non-existent places. &lt;/p&gt;
&lt;p&gt;Let's see how to proceed with such a map.&lt;/p&gt;
&lt;p&gt;At this point you know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how to ask for the data you're interested in&lt;/li&gt;
&lt;li&gt;how to take the data from Overpass and put them in the map&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What's the goal?&lt;/p&gt;
&lt;p&gt;Automate the process and set it to ask for data periodically, every night.&lt;/p&gt;
&lt;h2&gt;Git scraping for the rescue&lt;/h2&gt;
&lt;p&gt;You need a machine to perform some actions in the middle of the night.
The actions contain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;requesting the data&lt;/li&gt;
&lt;li&gt;storing the data&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Where to store data?&lt;/h3&gt;
&lt;p&gt;For small data samples (like restaurants in your city), &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; can be a place of choice.
Just remember, GitHub was not designed to be free database. 
It won't let you store too much data in a repository.&lt;/p&gt;
&lt;h3&gt;How to request data?&lt;/h3&gt;
&lt;p&gt;There is a technique called &lt;a href="https://simonwillison.net/2020/Oct/9/git-scraping/"&gt;Git scraping&lt;/a&gt; shown by &lt;a href="https://honzajavorek.cz/"&gt;Honza Javorek&lt;/a&gt; on one &lt;a href="https://pyvo.cz/"&gt;Pyvo&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;GitHub provides a tool called GitHub Actions which you can set up to perform various tasks for you.
Like for example... calling an API request and, in case the response file is changed, commit it automatically to a repository.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Git note&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you're reading this and struggle with terms like 'repository' or 'commit', consider learning about Git basics first, for example &lt;a href="https://www.freecodecamp.org/news/learn-the-basics-of-git-in-under-10-minutes-da548267cc91/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;How to get a valid URL to send requests?&lt;/h4&gt;
&lt;p&gt;Once you've built an Overpass query that satisfies you, look for &lt;strong&gt;Export&lt;/strong&gt; option in the menu.
Then find &lt;strong&gt;Query&lt;/strong&gt; and click on &lt;em&gt;compact&lt;/em&gt; in &lt;strong&gt;Convert to...&lt;/strong&gt; option. A new pane with the query will open. 
Copy the displayed query and try it in another tab. 
It should provide JSON data - you're set.  &lt;/p&gt;
&lt;p&gt;To make things as easy as they can be, let's use bash command &lt;code&gt;curl&lt;/code&gt; to make a request. 
&lt;code&gt;curl&lt;/code&gt; will take a URL to call as an argument, and the output will be directed to a file, like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl 'url_to_request' &amp;gt; my_data.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The actual example is a bit longer, mainly because API parameters in Overpass are quite verbose.
Check my script &lt;a href="https://github.com/befeleme/vegan_JMK/blob/main/run.sh"&gt;run.sh&lt;/a&gt;. I call for 4 sets of data with 5-minute breaks in between.&lt;/p&gt;
&lt;p&gt;The process of calling and storing takes place automatically. 
See my configuration file in &lt;a href="https://github.com/befeleme/vegan_JMK/blob/main/.github/workflows/scrape.yml"&gt;scrape.yml&lt;/a&gt;.
Let's ignore Python rows as they are not necessary for this project.
The configuration says that each day at 2.15 AM an Ubuntu machine copies the code from my repository, executes the &lt;code&gt;run.sh&lt;/code&gt; script and in case the files have changed, commits them to repository as user &lt;em&gt;Automated&lt;/em&gt;.  &lt;/p&gt;
&lt;p&gt;So the script runs every night but it commits now and then - when someone changes the restaurant's data. 
The big benefit is I can track changes to the &lt;a href="https://github.com/befeleme/vegan_JMK/commit/5cad11ed48baee9880c5b60d0464ccf19fedc46b"&gt;date&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a result there are several JSON files in &lt;code&gt;output&lt;/code&gt; folder.
Let's connect them with the map!&lt;/p&gt;
&lt;h2&gt;Point the map to remote data&lt;/h2&gt;
&lt;p&gt;Pasting data to the map as it was shown in the previous post isn't the right way here.&lt;/p&gt;
&lt;p&gt;I want to display different layers of data (100% plant-serving places, places with some options...- one layer per each JSON file from my repository).
For each layer I want to set different color and properties. 
This is achieved by setting &lt;strong&gt;Remote data&lt;/strong&gt; in Layers.&lt;/p&gt;
&lt;p&gt;&lt;img alt="layers" src="./images/umap-layers-overview.png"&gt;
&lt;img alt="remote" src="./images/umap-layers-remote.png"&gt;&lt;/p&gt;
&lt;p&gt;There is a field for URL with data. That's great. As it happens, we have an accessible remote storage of the data - we only need to paste the URL to &lt;strong&gt;raw&lt;/strong&gt; data, so that uMap parses it correctly.
You'll get the raw data by clicking on the respective button.
&lt;img alt="raw-data" src="./images/gh-raw-file.png"&gt;&lt;/p&gt;
&lt;p&gt;Fill in the marked fields and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="remote-data" src="./images/umap-remote.png"&gt;&lt;/p&gt;
&lt;p&gt;One layer of data is imported and, what's more, it will be updated every time someone changes underlaying information.&lt;/p&gt;
&lt;h2&gt;The result&lt;/h2&gt;
&lt;iframe width="100%" height="600px" frameborder="0" allowfullscreen src="//umap.openstreetmap.fr/en/map/vege-jmk_557579?scaleControl=false&amp;miniMap=false&amp;scrollWheelZoom=false&amp;zoomControl=true&amp;allowEdit=false&amp;moreControl=true&amp;searchControl=null&amp;tilelayersControl=null&amp;embedControl=null&amp;datalayersControl=true&amp;onLoadPanel=none&amp;captionBar=false&amp;datalayers=1584303%2C1584302%2C1584304%2C1581977%2C1581976%2C1581961%2C1581969#15/49.1991/16.6104"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="//umap.openstreetmap.fr/en/map/vege-jmk_557579"&gt;See full screen&lt;/a&gt;&lt;/p&gt;</content><category term="OpenStreetMap"></category><category term="mapping"></category><category term="uMap"></category><category term="EN"></category></entry><entry><title>Edulog #3</title><link href="https://karolinasurma.eu/edulog-3.html" rel="alternate"></link><published>2021-03-12T17:03:00+01:00</published><updated>2021-03-12T17:03:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-03-12:/edulog-3.html</id><summary type="html">&lt;p&gt;I started the new job on March 1st and all of my unfinished texts remain this way.
The format of this weekly accomplishments may become more bi-weekly... &lt;/p&gt;
&lt;h2&gt;Last week I learned&lt;/h2&gt;
&lt;p&gt;Mostly the stuff related to my new workplace.&lt;/p&gt;
&lt;p&gt;RPM packages&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My daily lecture - &lt;a href="https://docs.fedoraproject.org/en-US/packaging-guidelines/"&gt;Packaging Guidelines&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;And their &lt;a href="https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/"&gt;Pythonic version …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;I started the new job on March 1st and all of my unfinished texts remain this way.
The format of this weekly accomplishments may become more bi-weekly... &lt;/p&gt;
&lt;h2&gt;Last week I learned&lt;/h2&gt;
&lt;p&gt;Mostly the stuff related to my new workplace.&lt;/p&gt;
&lt;p&gt;RPM packages&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;My daily lecture - &lt;a href="https://docs.fedoraproject.org/en-US/packaging-guidelines/"&gt;Packaging Guidelines&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;And their &lt;a href="https://docs.fedoraproject.org/en-US/packaging-guidelines/Python/"&gt;Pythonic version&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.fedoraproject.org/en-US/packaging-guidelines/ReviewGuidelines/"&gt;How to review RPM spec files&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Python packages &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://packaging.python.org/tutorials/packaging-projects/"&gt;Tutorial on packaging&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Community related&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crash course on &lt;a href="https://pythondev.readthedocs.io/diversity.html"&gt;diversity in Python&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;German snippets&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I continue to fill in &lt;a href="https://apps.ankiweb.net/"&gt;Anki&lt;/a&gt; with new vocabulary and revise the old one.
  I find it the best flash card application, mobile &lt;a href="https://f-droid.org/en/packages/com.ichi2.anki/"&gt;AnkiDroid can be found on f-droid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;"es" can be skipped if the whole clause plays the role of subject (2).
If the main clause stays at the beginning, there must be pronoun subject present, and the clause is followed by a comma (1a, 1b).
The only applicable pronoun subject is "es", "das" can't be used instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;1a) &lt;strong&gt;Es&lt;/strong&gt; ist notwendig, alle Aufgaben durchzusehen.&lt;/p&gt;
&lt;p&gt;1b) Notwendig ist &lt;strong&gt;es&lt;/strong&gt;, alle Aufgaben durchzusehen.&lt;/p&gt;
&lt;p&gt;2) Alle Aufgaben durchzusehen ist notwendig.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Polish snippets&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I read &lt;a href="https://lubimyczytac.pl/ksiazka/4944147/krol"&gt;Król&lt;/a&gt; by Szczepan Twardoch. 
  The best way to spend your evenings in lockdown.&lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category><category term="education"></category><category term="EN"></category></entry><entry><title>Edulog #2</title><link href="https://karolinasurma.eu/edulog-2.html" rel="alternate"></link><published>2021-02-25T13:03:00+01:00</published><updated>2021-02-25T13:03:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-02-25:/edulog-2.html</id><summary type="html">&lt;p&gt;My "free" month is at its end and I decided to spend most of the time doing whatever I felt like to.
This includes taking long walks, playing board games and watching Doctor Who's last season.  &lt;/p&gt;
&lt;p&gt;I received plenty of information about onboarding at my new employer which is held …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My "free" month is at its end and I decided to spend most of the time doing whatever I felt like to.
This includes taking long walks, playing board games and watching Doctor Who's last season.  &lt;/p&gt;
&lt;p&gt;I received plenty of information about onboarding at my new employer which is held online.
Even though it was my call to switch jobs in the middle of pandemic, I still feel a bit uneasy when it comes to 100 % remote work for the next months.&lt;/p&gt;
&lt;h2&gt;Accomplishments&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;changed processing of the underlying data of my map. 
  I added a Python script that sorts restaurants into 4 categories depending on present tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Last week&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Read about &lt;a href="https://www.python.org/dev/peps/pep-0636/"&gt;Pattern Matching&lt;/a&gt;, the new planned feature in Python 3.10 and tried to wrap my head around the concept.&lt;/li&gt;
&lt;li&gt;Attended a few talks on &lt;a href="https://www.devconf.info/cz/"&gt;DevConf&lt;/a&gt;.&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/DariaGrudzien/junioring-101-how-not-to-go-bonkers-at-the-start-devconfcz-2021"&gt;Junioring 101&lt;/a&gt; by Daria Grudzień - I need to implement all of this :D&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devconfcz2021.sched.com/event/gmSb/containers-are-linux-but-what-does-it-mean"&gt;Containers are Linux&lt;/a&gt; - hands-on workshop with the basics of virtualization. Quite fun and rewarding.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Listened to a few episodes of &lt;a href="https://www.easygerman.org/podcast"&gt;Easy German Podcast&lt;/a&gt; and I still find it the best out there for B2 level.
  My favourite podcast for walking!&lt;/li&gt;
&lt;li&gt;Listened to an episode about women in project management called &lt;a href="https://pmhappyhour.com/012-2/"&gt;&lt;em&gt;Sassy or assertive&lt;/em&gt;&lt;/a&gt; followed by reading the beginning of famous book &lt;a href="https://www.goodreads.com/book/show/16071764-lean-in"&gt;&lt;em&gt;Lean in&lt;/em&gt;&lt;/a&gt; by Sheryl Sandberg. 
  Both very interesting but I find the diversity and discrimination topic increasingly harder to take, knowing I have no tools to change the system. 
  I'd better focus on my job.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Plans and hopes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I found out about &lt;a href="https://cs50.harvard.edu/x/2021/"&gt;CS50&lt;/a&gt; and decided to take a look at C lectures. &lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category><category term="education"></category><category term="EN"></category></entry><entry><title>Draw a map! (1/2)</title><link href="https://karolinasurma.eu/draw-a-map-1.html" rel="alternate"></link><published>2021-02-24T14:38:00+01:00</published><updated>2021-02-24T14:38:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-02-24:/draw-a-map-1.html</id><summary type="html">&lt;h2&gt;uMap&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://umap.openstreetmap.fr/en/"&gt;uMap&lt;/a&gt; is a tool to create custom maps on the OpenStreetMap layers.
In order to start creating maps, one needs to have an &lt;strong&gt;OSM account&lt;/strong&gt; and click on "Create a map" on the uMap homepage.
There is a few possibilities how to get data to the map.&lt;/p&gt;
&lt;h3&gt;Language course …&lt;/h3&gt;</summary><content type="html">&lt;h2&gt;uMap&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://umap.openstreetmap.fr/en/"&gt;uMap&lt;/a&gt; is a tool to create custom maps on the OpenStreetMap layers.
In order to start creating maps, one needs to have an &lt;strong&gt;OSM account&lt;/strong&gt; and click on "Create a map" on the uMap homepage.
There is a few possibilities how to get data to the map.&lt;/p&gt;
&lt;h3&gt;Language course in Wrocław&lt;/h3&gt;
&lt;p&gt;Your friend is going to Wrocław for a language course. 
They want to know where to eat the best &lt;em&gt;pierogi&lt;/em&gt; in the city. 
You want to show them additionally the &lt;em&gt;campus area&lt;/em&gt; as well as some best &lt;em&gt;walking routes&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;you need a pinpoint, shape and line drawings on the map&lt;/li&gt;
&lt;li&gt;the map shouldn't change: once you finish your edits, that's it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of this is achievable with the three options on the top-right map menu.
Additionally, one can change the background to the most suiting the needs of the moment.&lt;/p&gt;
&lt;p&gt;&lt;img alt="wroclaw" src="./images/umap-wro.png"&gt;&lt;/p&gt;
&lt;p&gt;The final map can be embedded to your site with a piece of HTML code.
See the same example as interactive map:&lt;/p&gt;
&lt;iframe width="100%" height="600px" frameborder="0" allowfullscreen src="//umap.openstreetmap.fr/en/map/wrocaw-pierogi_567141?scaleControl=false&amp;miniMap=false&amp;scrollWheelZoom=false&amp;zoomControl=true&amp;allowEdit=false&amp;moreControl=true&amp;searchControl=null&amp;tilelayersControl=null&amp;embedControl=null&amp;datalayersControl=true&amp;onLoadPanel=undefined&amp;captionBar=false"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="//umap.openstreetmap.fr/en/map/wrocaw-pierogi_567141"&gt;See full screen&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Use case 2&lt;/h3&gt;
&lt;p&gt;Your friend now knows where to go to learn, drink beer and eat pierogi.&lt;/p&gt;
&lt;p&gt;Let's keep it even more stereotypical.&lt;/p&gt;
&lt;p&gt;They heard that there is plenty of old churches there and they want to take a look at some of them.
It's Poland so marking each church manually might be a tedious task.
It would be good to be able to &lt;strong&gt;bulk import data about churches&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;no more drawing manually, automation needed&lt;/li&gt;
&lt;li&gt;the map shouldn't change: once you finish your edits, that's it&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The useful tool for the task is &lt;a href="https://overpass-turbo.eu/#"&gt;Overpass Turbo&lt;/a&gt; which runs queries to OSM database and returns the results as JSON files.&lt;/p&gt;
&lt;p&gt;First, you need to establish what we're looking for. 
Using your favorite search engine for "church tag OSM" will lead you to &lt;a href="https://wiki.openstreetmap.org/wiki/Tag:building%3Dchurch"&gt;this Wiki page&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;It's time to go and ask Overpass Wizard about "building=church in Wroclaw".
When the query is ready, click "Build and run query".&lt;/p&gt;
&lt;p&gt;There is, as expected, plenty of results. Overpass shows them by default as a map layer but there is another tab available - Data. &lt;/p&gt;
&lt;p&gt;&lt;img alt="churches in Wroclaw" src="./images/overpass-churches.png"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Important note&lt;/p&gt;
&lt;p&gt;For objects that are not nodes, but polygons (as churches and other buildings often are), uMap doesn't work properly yet. &lt;/p&gt;
&lt;p&gt;In order to make it work, you shall change the query in the left panel.
Replace the lines 17-19:
&lt;code&gt;out body;
out skel qt;&lt;/code&gt;
with 
&lt;code&gt;out center qt;&lt;/code&gt;
and click the button Run on the top-left menu.
This will ensure that each polygon has a central point and can be drawn on map.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Clicking on "Data" panel you'll see them formatted as JSON. How convenient! 
Let's copy and paste the data to uMap.&lt;/p&gt;
&lt;p&gt;In the import field there is plenty of possibilities: data can be imported from &lt;strong&gt;file&lt;/strong&gt;, &lt;strong&gt;url&lt;/strong&gt; or &lt;strong&gt;directly&lt;/strong&gt; to the map. 
Let's paste it directly. Format in this case should be &lt;em&gt;osm&lt;/em&gt; and the layer to import is up to you.&lt;/p&gt;
&lt;p&gt;&lt;img alt="import-umap" src="./images/umap-import.png"&gt;&lt;/p&gt;
&lt;p&gt;Click "Import" et Voila!&lt;/p&gt;
&lt;iframe width="100%" height="600px" frameborder="0" allowfullscreen src="//umap.openstreetmap.fr/en/map/one-time-import_567160?scaleControl=false&amp;miniMap=false&amp;scrollWheelZoom=false&amp;zoomControl=true&amp;allowEdit=false&amp;moreControl=true&amp;searchControl=null&amp;tilelayersControl=null&amp;embedControl=null&amp;datalayersControl=true&amp;onLoadPanel=undefined&amp;captionBar=false"&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href="//umap.openstreetmap.fr/en/map/one-time-import_567160"&gt;See full screen&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that it's perfectly possible to import data to the first map as another data layer and provide your friend with both hand-drawn and imported objects.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Final words&lt;/h2&gt;
&lt;p&gt;Neither of maps will ever change (unless you edit them manually).
The next time I'll show how to ensure the data is updated automatically on a regular basis.&lt;/p&gt;</content><category term="OpenStreetMap"></category><category term="mapping"></category><category term="uMap"></category><category term="EN"></category></entry><entry><title>Edulog #1</title><link href="https://karolinasurma.eu/edulog-1.html" rel="alternate"></link><published>2021-02-18T14:30:00+01:00</published><updated>2021-02-18T14:30:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-02-18:/edulog-1.html</id><summary type="html">&lt;h2&gt;Accomplishments&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://umap.openstreetmap.fr/en/map/vege-jmk_557579"&gt;Vege JMK - dynamic map&lt;/a&gt; showing raw data + &lt;a href="https://github.com/befeleme/vegan_JMK"&gt;GitHub repo with data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://umap.openstreetmap.fr/en/map/veg-jmk-preprocessed_563879"&gt;static map&lt;/a&gt; showing preprocessed data (Proof of concept)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I shall continue on the preprocessed one, it reflects the reality better.&lt;/p&gt;
&lt;h2&gt;Last week I learned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;how to create maps using uMap, plenty of clicking and some fun included.&lt;/li&gt;
&lt;li&gt;how …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h2&gt;Accomplishments&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://umap.openstreetmap.fr/en/map/vege-jmk_557579"&gt;Vege JMK - dynamic map&lt;/a&gt; showing raw data + &lt;a href="https://github.com/befeleme/vegan_JMK"&gt;GitHub repo with data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://umap.openstreetmap.fr/en/map/veg-jmk-preprocessed_563879"&gt;static map&lt;/a&gt; showing preprocessed data (Proof of concept)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I shall continue on the preprocessed one, it reflects the reality better.&lt;/p&gt;
&lt;h2&gt;Last week I learned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;how to create maps using uMap, plenty of clicking and some fun included.&lt;/li&gt;
&lt;li&gt;how to use GitHub Actions to deploy static website to a branch that is then served.&lt;/li&gt;
&lt;li&gt;what is quick sort and how to implement it in &lt;a href="https://stackabuse.com/quicksort-in-python/"&gt;Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;how does the &lt;em&gt;.spec&lt;/em&gt; file look like. RPM packages are created from them.&lt;/li&gt;
&lt;li&gt;about the ways some communities work and why do they part their ways when business comes into scene.
Inspired by the story of &lt;a href="https://hedgedoc.org/history/"&gt;HegdeDoc&lt;/a&gt;, once derivate of &lt;a href="https://hackmd.io/"&gt;HackMD.io&lt;/a&gt; which I use a lot.&lt;/li&gt;
&lt;li&gt;I can't estimate development time well. It took me around 5x more to create the first map than I expected.&lt;/li&gt;
&lt;li&gt;a lot of various stuff from &lt;a href="https://junior.guru/club/"&gt;junior.guru club&lt;/a&gt;. I wasn't sure I'll benefit from there, I am. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I intend to purchase the access once I start getting paid again :)&lt;/p&gt;
&lt;h2&gt;Plans and hopes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;listen to the story of ownCloud CTO who &lt;a href="https://archive.fosdem.org/2018/schedule/event/nextcloud/"&gt;forked his repo and started Nextcloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;check out the &lt;a href="https://fallofcivilizationspodcast.com/"&gt;Fall of civilizations&lt;/a&gt; podcast &lt;/li&gt;
&lt;/ul&gt;</content><category term="Notes"></category><category term="education"></category><category term="EN"></category></entry><entry><title>Advent of Code 2020</title><link href="https://karolinasurma.eu/advent-of-code-2020.html" rel="alternate"></link><published>2021-02-17T16:36:00+01:00</published><updated>2021-02-17T16:36:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-02-17:/advent-of-code-2020.html</id><summary type="html">&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;This year I joined the challenge with the intention to make it to the end, no matter what.
I did it out of curiosity: with the aim to challenge my Python skill and have some brain exercise.
As a beginner I solved first puzzles in the previous years but …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Intro&lt;/h2&gt;
&lt;p&gt;This year I joined the challenge with the intention to make it to the end, no matter what.
I did it out of curiosity: with the aim to challenge my Python skill and have some brain exercise.
As a beginner I solved first puzzles in the previous years but didn't make it to the 3rd day. This year was supposed to be different. &lt;/p&gt;
&lt;p&gt;Maybe &lt;strong&gt;making it to the end&lt;/strong&gt; doesn't sound like a good-enough motivation, but it worked for me.
The first days of the challenge were quite easy, backing up the the main motivation. 
Seeing your first earned stars makes you feel good about yourself, so you want to push your limits even further ;).&lt;/p&gt;
&lt;h2&gt;Puzzles&lt;/h2&gt;
&lt;p&gt;Tasks complexity grew gradually but that was to expect. 
I didn't really get to do anything else in my "free" time except for AoC in December.
This needs to be counted with when joyfully joining the challenge.&lt;/p&gt;
&lt;p&gt;AoC doesn't require any programming style, that's up to you. 
People in the &lt;a href="https://www.reddit.com/r/adventofcode/"&gt;subreddit&lt;/a&gt; were sharing their insane solutions in Minecraft, Factorio or even the whole event (all 25 days!) as Python oneliner.
My idea was to refresh a bit of everything, so the solutions look like Polish bigos. &lt;/p&gt;
&lt;p&gt;&lt;img alt="Bigos" src="images/bigos.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;bigos, do try it at home &lt;a href="https://commons.wikimedia.org/wiki/File:Bigos_polonia.jpg"&gt;source&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;I used the classes once or twice, some of the puzzles were short enough to be solved with a few lines without special ordering.
With most of the puzzles I defined at least some functions as I split the task to simpler problems and then was going to tackle the big complex one.&lt;/p&gt;
&lt;p&gt;I realized that a big challenge for me is to &lt;strong&gt;sew up the big solution from small subtasks&lt;/strong&gt;. 
At some days the puzzle was too complex to see the solution straight away. 
I solved the smallest parts then, like applying the rules and evaluating the round, and at the end I engineered the working whole from the small pieces I had. 
This typically led to some level of code ugliness.&lt;/p&gt;
&lt;h3&gt;Some surprises on the way&lt;/h3&gt;
&lt;p&gt;There was A LOT of input processing. Every day new structure.&lt;/p&gt;
&lt;p&gt;A great variety of tasks appeared. 
One day you navigate the ship, another create 4D cubes just to implement the input validation rules the next one. 
Jumping from one context to another was a must.&lt;/p&gt;
&lt;p&gt;Some problems required hours to crack. 
Being still more of a beginner I saw most of the problems for the first time. 
&lt;strong&gt;I don't regret a single hour.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The best help to a programmer? Notebook and pencil. 
The second best help? Community to ask, support, laugh and uncork the bottleneck when there comes one.&lt;/p&gt;
&lt;p&gt;I realized what do the people mean when they apply the categories of not/elegant to code.
There are some places in my solutions which could use some better approach, but I wasn't fit to solve it myself right away. 
Sometimes I didn't know how, sometimes it would just take too much time.
This could have been the opportunity not to brute force the solutions, but often this was the quickest way to get to the end of the task. 
&lt;strong&gt;I intend not to start code shaming myself though.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Aaaand it is easier to code with a fever than to code with a headache. Checked so that you don't have to.&lt;/p&gt;
&lt;h2&gt;Community&lt;/h2&gt;
&lt;p&gt;I learned a lot from reading the solutions of the small group of PyLadies here in Czechia. 
When solving a puzzle I could typically see only one way to do it - mine - and seeing how differently the others think through issues was genuinely refreshing. 
A piece of competition we had using our private Leaderboard was another element of keeping the motivation up and our common Slack channel was the first place I often directed my steps to when having a struggle. &lt;/p&gt;
&lt;h2&gt;Learning opportunities&lt;/h2&gt;
&lt;p&gt;Some first timers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python standard library gems: &lt;em&gt;itertools&lt;/em&gt;, &lt;em&gt;collections&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;regular expressions (Python library &lt;em&gt;re&lt;/em&gt;): The first day of using regex was painful. The 15th - easy peasy.&lt;/li&gt;
&lt;li&gt;lambdas: great tool for lookup dictionaries&lt;/li&gt;
&lt;li&gt;I became aware of the big-O complexity, that there exist more and less efficient data types and operations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Growing in confidence:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;navigating Python docs. I started using &lt;a href="https://zealdocs.org/"&gt;Zeal&lt;/a&gt; and like it a lot&lt;/li&gt;
&lt;li&gt;understanding the task, using test data to validate my solutions&lt;/li&gt;
&lt;li&gt;breaking the task down to small pieces&lt;/li&gt;
&lt;li&gt;coding without debug printing every second line (I can keep some abstract representation of the ongoing transformations in my head)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My final score is 48/50. In the last unsolved big task I have to create a picture out of very small pieces. 
As I didn't enjoy the first half of the puzzle at all, I just can't force myself to sit and finish it off. &lt;/p&gt;
&lt;h2&gt;The end&lt;/h2&gt;
&lt;p&gt;If I started going through 2020 again, I would most certainly solve some of the puzzles differently. 
With new skills and foreseeing more problems as they occur, I would look for another approach.
I feel tempted to go through AoC from the previous years as an ongoing exercise during 2021.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note to self: don't be too optimistic about this one.&lt;/em&gt;&lt;/p&gt;</content><category term="Python"></category><category term="coding"></category><category term="AoC"></category><category term="EN"></category></entry><entry><title>Like Columbus but better</title><link href="https://karolinasurma.eu/like-columbus-but-better.html" rel="alternate"></link><published>2021-02-15T17:48:00+01:00</published><updated>2021-02-15T17:48:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-02-15:/like-columbus-but-better.html</id><summary type="html">&lt;p&gt;It's hard for me to go out without a purpose.
Hiking in the forests, meeting some other people - count me in.
Trying all the tram routes in the city - of course. &lt;/p&gt;
&lt;p&gt;But then the pandemic comes. Or there is no one available in the city.
Or you've seen all of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;It's hard for me to go out without a purpose.
Hiking in the forests, meeting some other people - count me in.
Trying all the tram routes in the city - of course. &lt;/p&gt;
&lt;p&gt;But then the pandemic comes. Or there is no one available in the city.
Or you've seen all of the tram, bus, trolley, and city train routes. &lt;/p&gt;
&lt;p&gt;That could be a reason to stop leaving the flat. &lt;/p&gt;
&lt;p&gt;I hacked this laziness of mine by starting editing &lt;a href="https://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt;. 
The map isn't primarily a map - it's a big open source database.
That means &lt;strong&gt;anyone&lt;/strong&gt; can edit it, and there is plenty of possibilities, from very easy to quite complicated ones. &lt;/p&gt;
&lt;h2&gt;Where you've encountered OSM&lt;/h2&gt;
&lt;p&gt;If you think you don't know OpenStreetMap, you're probably wrong.&lt;/p&gt;
&lt;p&gt;This is the default map used on Facebook. 
(They seem to have forgotten to attach the license attribution. 
Those little distracted heads!)&lt;/p&gt;
&lt;p&gt;You may know one of the popular offline mobile applications, &lt;a href="https://wiki.openstreetmap.org/wiki/OsmAnd"&gt;OsmAnd&lt;/a&gt;.
If you don't, try it. 
It has some great features helping with planning mountain hiking, especially altitude profile.&lt;/p&gt;
&lt;p&gt;The well-known maps in Czechia, &lt;a href="https://en.mapy.cz/"&gt;mapy.cz&lt;/a&gt;, use OpenStreetMap for showing foreign countries data. &lt;/p&gt;
&lt;h2&gt;Editing map&lt;/h2&gt;
&lt;p&gt;First we need to talk about where to get source information from.&lt;/p&gt;
&lt;h3&gt;Data source&lt;/h3&gt;
&lt;p&gt;As a general rule one mustn't map out of proprietary data sources like Google Maps.
The objects that are added to map should be ones you've checked yourself - &lt;strong&gt;you went there and saw it with your own eyes&lt;/strong&gt;. 
It's called "survey" or "local knowledge" in the data sources and it's the most important thing you should know about OSM.&lt;/p&gt;
&lt;p&gt;No automatic imports, no drawing from satellite photos when editing Czechia or broadly: Europe.
It's a community project and anyone can become a contributor.&lt;/p&gt;
&lt;h3&gt;Point of interest (POI)&lt;/h3&gt;
&lt;p&gt;Each point of interest (like shop, bar, cinema), line (streets) or polygon (buildings, areas) consist of tags.
A tag is a key-value pair. &lt;/p&gt;
&lt;p&gt;Drawing paths can be also fun, but today I will focus on editing POIs only.&lt;/p&gt;
&lt;p&gt;&lt;img alt="JOSM-keys" src="images/osm-poi-key-value.png"&gt;
&lt;em&gt;example tagging of a POI - restaurant&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Many of us have a thing or two that are important for us in the city. 
It may be &lt;strong&gt;wheelchair accessibility&lt;/strong&gt;, &lt;strong&gt;free parking&lt;/strong&gt;, &lt;strong&gt;public toilets&lt;/strong&gt;, &lt;strong&gt;recycling points&lt;/strong&gt;, &lt;strong&gt;outdoor seating&lt;/strong&gt; or type of diet in the restaurants.&lt;/p&gt;
&lt;p&gt;A protip gratis: There is no sense in trying to map everything around you, you'll become exhausted and demotivated very soon.
Pick something you care for or is fun for you.
 It's better to be a constant contributor on small changes than big one-time shot.&lt;/p&gt;
&lt;p&gt;One of my things is adding vegan places to the map.
Whenever a restaurant has a considerable amount of vegan meal on menu, I take a photo of the door labels and edit it at home.
As you can see in the image above, the respective key is "diet:vegan" and the value should be one of &lt;em&gt;yes&lt;/em&gt;, &lt;em&gt;no&lt;/em&gt;, &lt;em&gt;only&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="A restaurant" src="images/restaurant_photo.jpg"&gt;
&lt;em&gt;when editing a restaurant at home, I update all the information, not only diet&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Mapping the defaults&lt;/h3&gt;
&lt;p&gt;There is an issue with &lt;em&gt;no&lt;/em&gt;, though. 
The original philosophy of OSM was: we don't map defaults. 
So if in Czechia the default is "no vegan options", we shouldn't add the tag "diet:vegan=no" to map.
For the same reason one shouldn't map for example the possibility to pay with cash. &lt;/p&gt;
&lt;p&gt;These days it changes, mostly because of rising popularity of mobile applications like StreetComplete, which gamify the tag hunt. 
The more people use them, the more defaults are being mapped and it seems there is hardly anything that can be done to prevent the trend.&lt;/p&gt;
&lt;p&gt;The defaults may be also interesting for people building their own applications on the top of OSM data, eg. rendering 3D city models.
As a side note, beware typos, it may end up like &lt;a href="https://www.engadget.com/flight-simulator-open-street-map-building-205545509.html"&gt;in this case&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Finding your tag&lt;/h3&gt;
&lt;p&gt;OSM has got a tremendous &lt;a href="https://wiki.openstreetmap.org/wiki/Main_Page"&gt;Wiki&lt;/a&gt;. It so big it's overwhelming.
One of the greatest features there are the tags explanations.&lt;/p&gt;
&lt;p&gt;It happens a lot to me that I'm not sure how to tag a particular thing. 
When preparing a talk, I was looking for a dog hairdresser to build a &lt;em&gt;funny&lt;/em&gt; example.
Typing "dog hairdresser tag osm" to my favorite search engine resulted in an immediate shot: &lt;a href="https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming"&gt;the answer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I highly recommend diving into the Wiki to look for the answers.&lt;/p&gt;
&lt;h3&gt;Editors&lt;/h3&gt;
&lt;p&gt;To edit maps you need to create a free account on &lt;a href="https://www.openstreetmap.org/"&gt;OpenStreetMap&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Then you can edit: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;directly in the web browser using iD editor. See &lt;a href="https://learnosm.org/en/beginner/id-editor/"&gt;guide&lt;/a&gt; for more details.&lt;/li&gt;
&lt;li&gt;using a desktop application, like &lt;a href="https://josm.openstreetmap.de/"&gt;JOSM&lt;/a&gt;. See &lt;a href="https://learnosm.org/en/josm/"&gt;guide&lt;/a&gt; for more details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you find an object you want to edit, you are free to add, edit or remove a desired tag.&lt;/p&gt;
&lt;p&gt;I mentioned &lt;a href="https://wiki.openstreetmap.org/wiki/StreetComplete"&gt;StreetComplete&lt;/a&gt; earlier, that's another approach to OSM.
It's a mobile application (available on both F-Droid and Play Store).
Here you don't plan what to add to map, it's designed the opposite way: it navigates you through quests in the city. 
When you walk past a quest, you can answer a simple question: "Is XXX still here?" or "What kind of YYY is here?"
There is gazillion types of quests, I have disabled around half of them. :) &lt;/p&gt;
&lt;p&gt;&lt;img alt="street" src="images/street-complete-1.png"&gt;  &lt;img alt="map" src="images/street-complete-2.png"&gt;&lt;/p&gt;
&lt;p&gt;Every time you upload some of the answers, you get plenty of stars and some achievements get unlocked. 
You may find yourself hunting the quests in the places you'd otherwise never go. &lt;/p&gt;
&lt;p&gt;Consider yourself warned.&lt;/p&gt;</content><category term="OpenStreetMap"></category><category term="mapping"></category><category term="EN"></category></entry><entry><title>What does it take to create a blog</title><link href="https://karolinasurma.eu/what-does-it-take-to-create-a-blog.html" rel="alternate"></link><published>2021-02-09T21:11:00+01:00</published><updated>2021-02-09T21:11:00+01:00</updated><author><name>Karo</name></author><id>tag:karolinasurma.eu,2021-02-09:/what-does-it-take-to-create-a-blog.html</id><summary type="html">&lt;h2&gt;Why blogging?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My old domain was unused for the last few years. I had little idea what to put there though.&lt;/li&gt;
&lt;li&gt;Having a &lt;strong&gt;showcase&lt;/strong&gt; of the things I do which may be interesting for the other people. &lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;like writing&lt;/strong&gt; and miss it since I switched to tech. &lt;/li&gt;
&lt;li&gt;There are …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h2&gt;Why blogging?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My old domain was unused for the last few years. I had little idea what to put there though.&lt;/li&gt;
&lt;li&gt;Having a &lt;strong&gt;showcase&lt;/strong&gt; of the things I do which may be interesting for the other people. &lt;/li&gt;
&lt;li&gt;I &lt;strong&gt;like writing&lt;/strong&gt; and miss it since I switched to tech. &lt;/li&gt;
&lt;li&gt;There are all those tips from seniors to juniors about &lt;strong&gt;writing down the lists of what you've learnt&lt;/strong&gt;. 
This makes sense as juniors tend to underestimate their progress in time.
So I treat this as an opportunity to have some edulog, maybe helpful for others, maybe just for me.&lt;/li&gt;
&lt;li&gt;And, of course, I just wanted to &lt;strong&gt;build something with my own hands&lt;/strong&gt;! Well, not from scratch in this case.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;To blog or HOW to blog - that is the question&lt;/h2&gt;
&lt;p&gt;As a teenager I just created an account on Blogger and successfully blogged for another 10 years or longer. 
Blogger belongs to Google now and will probably end in a few years.&lt;/p&gt;
&lt;p&gt;And being a wannabe coder, well, you just kind of &lt;strong&gt;have to&lt;/strong&gt; create your own solution, isn't it right?
I've been using Python for pretty much everything in the last three years. 
Those, however, were just &lt;strong&gt;scripts&lt;/strong&gt;. 
You run them with &lt;code&gt;python file.py&lt;/code&gt; and never actually get to build a whole solution.
I felt like I lack the experience in &lt;strong&gt;gluing things together&lt;/strong&gt;. 
It seemed like a natural solution to build upon my Python knowledge.&lt;/p&gt;
&lt;h3&gt;Django? Yes, but.&lt;/h3&gt;
&lt;p&gt;How about Django? Django sounds cool! 
And I've been to a &lt;a href="https://tutorial.djangogirls.org/en/"&gt;Django Girls workshop&lt;/a&gt;, so this couldn't be that complicated, could it? 
I've spent a great time playing with a web application in Django. I really have! 
The app is connected to a &lt;em&gt;Postgres database&lt;/em&gt;, uses those cool &lt;em&gt;Jinja templates&lt;/em&gt;, I even used &lt;em&gt;Bootstrap&lt;/em&gt; to make the site responsive, wrote a nice &lt;em&gt;admin interface&lt;/em&gt; and made it possible to use &lt;em&gt;Markdown&lt;/em&gt; in the blog posts. &lt;/p&gt;
&lt;p&gt;Then I realized I need &lt;em&gt;categories&lt;/em&gt; and plenty of other changes that will require more time spent digging in application models and Jinja.
I started reading about deployment and went through what &lt;a href="https://www.heroku.com/"&gt;Heroku&lt;/a&gt; has to offer.&lt;/p&gt;
&lt;p&gt;I learned about the &lt;code&gt;DJANGO_SECRET_KEY&lt;/code&gt; when I published the code of my app on GitHub and immediately got a warning e-mail that I've compromised something important.&lt;/p&gt;
&lt;p&gt;The time has passed and I wasn't any closer to having the actual website out there. 
In fact it felt like learning programming: &lt;strong&gt;with each step I was even further from my goal as I realized how much more I need to learn to make it happen&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Static and simple&lt;/h3&gt;
&lt;p&gt;I went to look for something more down-to-earth. 
I remembered &lt;a href="https://roboprojekt.pyladies.cz/"&gt;our project's blog&lt;/a&gt; which was on the other side of the complexity spectrum: there were Markdown blog posts and deployment on commit on GitHub. 
No databases, minimum code, static site - suddenly this sounded so beautifully simple!
Why to overcomplicate things?
I took a long look at that other blog and realized it was built on the extension to &lt;a href="https://blog.getpelican.com/"&gt;Pelican&lt;/a&gt; engine, which is written in Python. 
I looked also at Jekyll and later Hugo, but decided to stick to what seemed like a nice case of &lt;em&gt;gluing&lt;/em&gt; task I intended to perform.&lt;/p&gt;
&lt;h2&gt;Pelican&lt;/h2&gt;
&lt;p&gt;First things first: I went through all the &lt;a href="http://www.pelicanthemes.com/"&gt;Pelican themes&lt;/a&gt;. I was looking for something minimalistic yet pretty with a support of categories and optionally tags. 
That was surprisingly tough task.
One of the last on the list was &lt;a href="https://github.com/petrnohejl/MinimalXY"&gt;MinimalXY&lt;/a&gt; by Petr Nohejl (funnily enough, a developer from Brno) which I felt in love with as soon as I saw it. &lt;/p&gt;
&lt;p&gt;So I was decided and could frantically start with edits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;deleting plenty of code I didn't want. That was a nice exercise in reading someone else's code. &lt;/li&gt;
&lt;li&gt;removing Google Analytics related code for now as I'm not sure I want to track anything here.&lt;/li&gt;
&lt;li&gt;installing the Open Sans font locally rather than fetching it from Google Fonts. &lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Out there&lt;/h2&gt;
&lt;p&gt;I was never inclined to frontend and have limited knowledge about its technologies. 
The edits I've made were nice small tasks forcing me to look for explanations around the Internet. 
It makes me still a bit uneasy that I don't understand everything in the project.&lt;/p&gt;
&lt;p&gt;Inspired by Honza Javorek's &lt;a href="https://github.com/honzajavorek/honzajavorek.cz/blob/master/weeknotes.py"&gt;weeknotes script&lt;/a&gt; I made a template generator to make it easier to add new posts. Thanks!
Many other inspirations came from the open source projects on GitHub. 
I took a look at deployment routines, went through some people's configurations and repository structures. &lt;/p&gt;
&lt;p&gt;And all of this crash course took place in around a week.
This time I feel like a winner :).&lt;/p&gt;</content><category term="Currents"></category><category term="pelican"></category><category term="coding"></category><category term="EN"></category></entry></feed>