Auch diesen Herbst bieten wir wieder unsere beliebten Arduino-Kurse an - diesmal konnten wir die Kursgebühren reduzieren, da wir anbieten mit Leihhardware statt mit Kaufhardware zu arbeiten - meldet Euch schnell an, die Teilnehmerzahl ist begrenzt:
232-55100 Programmieren lernen mit Arduino - Schnupperkurs
232-55101 Programmieren lernen mit Arduino Sensor Kit - Einstiegskurs
232-55102 Grundlagen der Arduino Internet of things (IoT) Cloud
Arduino ist die ideale Einstiegsplattform in die Welt der Maker und des Programmierens:
Arduino verknüpft einfache Programme mit der physikalischen Welt, denn man programmiert kleine Computer, sogenannte Microcontroller, die mit der Welt interagieren und z.B. Sensordaten messen oder Leds und Motoren steuern.
Man kann also den Effekt seines Programmes unmittelbar sehen oder hören und kann innerhalb kurzer Zeit Maker-Projekte wie Wetterstation, Beleuchtungssteuerung, Messen und Loggen von Strom, Wasser, einfache Robotikaufgaben etc. erlernen und selbst realisieren.
Es gibt zwar mittlerweile auch im Niedrigpreis-Segment andere beliebte Plattformen wie Raspberry Pi oder kompatible Controller (wie ESP32), aber die Arduino Plattform ist immer noch die am besten dokumentierte Plattform mit der besten Unterstützung durch einen grossen Kreis von Anwendern - so bekommt man jederzeit Hilfe zur Selbsthilfe bei den eigenen Projekten.
Die Konzepte, die wir in unseren Kursen vermitteln können dann aber auch auf andere Plattformen und Programmiersprachen übertragen und angewandt werden.
Wenn Ihr Euch vorab etwas in die Arduino-Welt einlesen wollt - hier sind links zu der englischen Arduino-Webseite und dem deutschsprachigen Funduino
Die Kursbeschreibungen im Detail findet ihr auf der VHS-Seite - siehe Links oben.
Hier nur noch etwas mehr Details über die jeweilige Zielgruppe und Kursziele:
232-55100 Programmieren lernen mit Arduino - Schnupperkurs
Diesen Kurs bieten wir kostenlos an, denn hier benötigen wir noch keine Hardware.
Alle Programme werden auf einem Simulator (auf dem PC) geschrieben.
Dieser Kurs ist für absolute Anfänger geeignet, die ausser der Benutzung eines PCs keine Vorkenntnisse mitbringen.
Wir verwenden in diesem Kurs den Arduino Simulator Autodesk Tinkercad
Kursziel ist es, ein Grundverständnis für die Funktionsweise eines Computers am Beispiel des Arduino Microcontrollers zu entwickeln und erste einfache, eigene Programme zu entwickeln, die z.B. Messwerte von Sensoren erfassen oder LEDs zum blinken bringen.
Die Programme werden zunächst “visuell programmiert” - erst im 2.Teil verwenden wir dann die Arduino Programmiersprache C.
Wir empfehlen Anfängern diesen Kurs vor den anderen Kursen zu belegen.
Geeignet ist der Kurs auch wenn ihr euch nicht sicher seid, ob das das richtige für euch ist und ihr erstmal reinschnuppern wollt, bevor ihr 100€ für die Hardware in den anderen Kursen investiert.
232-55101 Programmieren lernen mit Arduino Sensor Kit - Einstiegskurs
In diesem Kurs verwenden wir echte Hardware - einen Arduino Uno mit einem Sensorkit - und erstellen Programme auf dem PC, die wir dann auf dem Arduino zur Ausführung bringen.
Diese Programme lesen Sensorwerte (Temperatur, Luftfeuchtigkeit, Beschleunigung) des Sensorkits und kontrollieren Aktoren wie Buzzer oder LED.
Die Programme werden in der Arduino Programmiersprache C erstellt.
Auch dieser Kurs richtet sich an Anfänger in der Programmierung und wir werden alle Konzepte über Microcontroller und Programmieren von Grund auf erklären.
232-55102 Grundlagen der Arduino Internet of things (IoT) Cloud
Die Arduino IoT Cloud ermöglicht es, Arduinos und Arduino-kompatible Geräte mit dem Internet zu verbinden um dann z.B. Messwerte auf einer Smartphone-App anzuzeigen und zu visualisieren oder Geräte, die vom Arduino gesteuert werden, über eine App aus der Ferne zu steuern.
Arduino Iot Cloud Webseite auf Deutsch
In diesem Kurs setzen wir Vorkenntnisse mit Arduino-Programmierung voraus und fokussieren auf die Anbindung an die IoT Cloud.
Das heisst diese Kenntnisse solltet ihr entweder mitbringen oder davor einen der beiden anderen Kurse besuchen.
Wir werden also Arduino Grundlagen aus den Anfängerkursen nur kurz wiederholen und starten dann direkt mit einer
Einführung in die Arduino IoT Cloud (Registrieren von Endgeräten, Things, Devices, Variablen, Dashboard).
Dann erfassen wir Sensordaten mit einem Arduino Sketch (Programm)
und speichern diese Sensordaten in der Arduino IoT Cloud.
Wir erstellen dann eine App die den Sensor-Datenverlauf auf dem Smartphone anzeigen.
Ausserdem werden wir den Sensor-Datenverlauf in Google Sheets speichern und visualisieren.
LoRaWAN ist eine Übertragungstechnik, die es erlaubt, Geräte von überall kostenlos mit der Cloud zu verbinden - ohne dass ein WLAN in der Nähe ist.
Auch diese Technik lernen wir kennen und erfahren, für welche Projekte LoRaWAN geeignet ist und wo besser eine WLAN-Anbindung benutzt wird.
Hier noch einige weitere Bilder von früheren Kursen - wir bieten unsere Kurse explizit auch für Kinder und Jugendliche ab 14 Jahren an - unter 14 Jahren bitten wir um Begleitung eines Erwachsenen.
]]>You are learning a new language, such as Spanish, and have progressed beyond the level of popular tools such as “Babbel” or “Duolingo”.
You can now use Transformer LLMs as your personal language trainer, as shown below using the example of “Bing chat”, now integrated into Skype as a free technical preview.
At the time of writing you can use it to learn English, Spanish, French, German, Italian, Portuguese, Chinese and Japanese.
Whenever you want to start a new conversation or want to change the topic, send newtopic
as a one-word message to Bing Chat.
You will then need to prompt the model (give it a context in which to respond), for example, using the following prompt, translated into the target language
you intend to learn:
1 | I am English and I am learning Spanish. You are my language teacher. |
A concrete example of learning Spanish and talking about cooking recipes could be
1 | Soy alemán y estoy aprendiendo español. |
To easily translate the prompt into your target language you can use Deepl or Google translate.
I am in no way related to Skype, Microsoft, Babbel, Duolingo, Deepl or Google and do not get any payment from them.
However if you like this blog post you can pay me a coffee https://www.paypal.com/donate/?hosted_button_id=JBFJMV35LX5AY
]]>If you want to create a satellite map showing where the photos in your photo library have been taken for a given date range this is for you.
Pythonista is an app to develop in Python on an iPad.
I have created a Pythonista Python script that asks you for a date range (start and end date of your trip) and then draws a satellite map showing where the photos have been taken like the following - it also generates a GPX-Track (Geodata) .gpx file and saves the satellite map as a .png image file in your “files” App and in the clipboard:
You can find the source code here
If you like this script you can pay me a coffee https://www.paypal.com/donate/?hosted_button_id=JBFJMV35LX5AY
P.S. Based on a discussion in the Pythonista forum user @cvp and I created another version for the same use case that displays an interactive map with image thumbnails that you can zoom in to see for each photo where it was taken.
The source code is here in this gist
Ever wanted to do some Python coding on the go on your iPad (Pro)?
Pythonista is a complete development environment for writing Python scripts on your iPad or iPhone.
The good thing is it does not come just with some standard Python modules (and their documentation) - In addition to the powerful standard library, Pythonista provides extensive support for interacting with native iOS features, like contacts, reminders, photos, location data, and more.
These native iOS features allow you to automate tasks in your iOS or iPadOS workflows and I used these to create the app.
GPX, or GPS Exchange Format, is an XML schema designed as a common GPS data format for software applications. It can be used to describe waypoints, tracks, and routes. It is an open format and can be used without the need to pay license fees. Location data (and optionally elevation, time, and other information) is stored in tags and can be interchanged between GPS devices and software. (Source: https://en.wikipedia.org/wiki/GPS_Exchange_Format)
I use GPX files on my garmin hiking devices as well as popular apps like komoot or outdooractive
I am in no way related to Pythonista, komoot, garmin or outdooractive and do not get any payment from them.
However if you like this script you can pay me a coffee https://www.paypal.com/donate/?hosted_button_id=JBFJMV35LX5AY
]]>For the last 3 months I have been working with the book Zero to production in Rust and learned a lot. It is not a book to learn the language but how to use the Rust ecosystem in a professional setup.
I highly recommend buying the book or donating to Luca as he really must have spent a huge amount of time writing this excellent content - there is even a student discount and a discount for poorer regions of the world.
However, if you first want to get a feel for whether this book is for you you can also follow a selection of chapters on [Luca`s blog](https://www.lpalmieri.com/posts/2020-05-24-zero-to-production-0-foreword/)
This is not a book about learning the Rust programming language, there are other excellent books about the language itself.
Instead the book develops an end-2-end real world web application (newsletter subscription app) to introduce you to the Rust ecosystem:
The book uses a select, well-integrated subset of the Rust crates relevant to a web application with HTML form frontends and an async backend with persistence
The book also shows you how to deploy your application in a production environment
Each step in the development of the sample project expands on the previous section.
There is a Github branch for each chapter available so that you can also focus and start with individual chapters if you want and don’t have the time to go through all the content.
I think I spent about 60 hours completing the book, following all the steps in my own development environment and doing most of the optional exercises.
Sometimes I deviated from the book and used more recent versions of the crates - this resulted in subtle bugs that I hat to debug to get the test cases green again, which was perhaps the most rewarding learning experience.
I would highly recommend the book to those who think they have already learned the language but have not yet worked with Rust in a professional environment.
Even if you have done CI/CD pipelines and container deployments with other languages and frameworks you will learn a lot of Rust specific things like multi-stage Docker builds with “chef” to drastically reduce build times.
I kept track of my progress in my own github repo.
Some readers may find it useful to update the examples to more recent versions of the Rust crates - the book was written in 2020/2021 and some crates needed to be updated - for example to get rid of security vulnerabilities or build problems that were found/created after the book was published.
TLDR: This post contains some considerations for selecting rust crates and recommends to build toy examples to verify the selection. It also provides a toy CRUD example for the stack: axum-sqlx-sqlite-utoipa
Rust is a very powerful, modern programming language.
However the challenge in using it for non-trivial things comes from the wide variety of 3-rd party dependencies (called crates) that you need.
The language itself contains a rather limited standard library.
For example when you want to create a web service you need additional crates.
However there is a multitude of crates available (e.g. on crates.io ) and it is difficult to assess for each crate:
For example for web backends we have
Even if the selection of a single crate is sometimes quite easy, selecting a combination of crates that work together as a stack may be difficult
To work around that challenge I find it best to implement small educational samples using the combination of crates that I plan to use for a project before I actually start on the real project.
This allows you to save time on your real project - you will not be forced later to refactor your real project to a new crate because you have already verified the functionality with a toy example.
Also creating a limited example is much faster and you already find examples in the web that help you to quickly stick the components together.
So by focusing on the technology selection rather than your own domain problem you come to a conclusion/selection more quickly.
Here is a combination of crates for building a CRUD Rest web service including persistence (database) that I found to be
You can find my example which uses this stack here
https://github.com/Bodobolero/axum_crud_api
The example includes error handling and e-2-e testcases.
I plan to build the same sample app with actix-web and sqlx with postgres instead of sqlite.
To learn actix-web I decided to follow Luca Palmieri’s book Zero to production
I also want to extend it with a Rust WASM client implemented with yew
I can then make an informed decision whether to implement my real project with axum or actix-web and whether I will stick to sqlx or instead consider an ORM like diesel instead.
]]>Auch diesen Herbst bieten wir wieder unsere beliebten Arduino-Kurse an - meldet Euch schnell an, die Teilnehmerzahl ist begrenzt:
222-55100 Programmieren lernen mit Arduino - Schnupperkurs
222-55101 Programmieren lernen mit Arduino Sensor Kit - Einstiegskurs
222-55102 Grundlagen der Arduino Internet of things (IoT) Cloud
Arduino ist die ideale Einstiegsplattform in die Welt der Maker und des Programmierens:
Arduino verknüpft einfache Programme mit der physikalischen Welt, denn man programmiert kleine Computer, sogenannte Microcontroller, die mit der Welt interagieren und z.B. Sensordaten messen oder Leds und Motoren steuern.
Man kann also den Effekt seines Programmes unmittelbar sehen oder hören und kann innerhalb kurzer Zeit Maker-Projekte wie Wetterstation, Beleuchtungssteuerung, Messen und Loggen von Strom, Wasser, einfache Robotikaufgaben etc. erlernen und selbst realisieren.
Es gibt zwar mittlerweile auch im Niedrigpreis-Segment andere beliebte Plattformen wie Raspberry Pi oder kompatible Controller (wie ESP32), aber die Arduino Plattform ist immer noch die am besten dokumentierte Plattform mit der besten Unterstützung durch einen grossen Kreis von Anwendern - so bekommt man jederzeit Hilfe zur Selbsthilfe bei den eigenen Projekten.
Die Konzepte, die wir in unseren Kursen vermitteln können dann aber auch auf andere Plattformen und Programmiersprachen übertragen und angewandt werden.
Wenn Ihr Euch vorab etwas in die Arduino-Welt einlesen wollt - hier sind links zu der englischen Arduino-Webseite und dem deutschsprachigen Funduino
Die Kursbeschreibungen im Detail findet ihr auf der VHS-Seite - siehe Links oben.
Hier nur noch etwas mehr Details über die jeweilige Zielgruppe und Kursziele:
222-55100 Programmieren lernen mit Arduino - Schnupperkurs
Diesen Kurs bieten wir kostenlos an, denn hier benötigen wir noch keine Hardware.
Alle Programme werden auf einem Simulator (auf dem PC) geschrieben.
Dieser Kurs ist für absolute Anfänger geeignet, die ausser der Benutzung eines PCs keine Vorkenntnisse mitbringen.
Wir verwenden in diesem Kurs den Arduino Simulator Autodesk Tinkercad
Kursziel ist es, ein Grundverständnis für die Funktionsweise eines Computers am Beispiel des Arduino Microcontrollers zu entwickeln und erste einfache, eigene Programme zu entwickeln, die z.B. Messwerte von Sensoren erfassen oder LEDs zum blinken bringen.
Die Programme werden zunächst “visuell programmiert” - erst im 2.Teil verwenden wir dann die Arduino Programmiersprache C.
Wir empfehlen Anfängern diesen Kurs vor den anderen Kursen zu belegen.
Geeignet ist der Kurs auch wenn ihr euch nicht sicher seid, ob das das richtige für euch ist und ihr erstmal reinschnuppern wollt, bevor ihr 100€ für die Hardware in den anderen Kursen investiert.
222-55101 Programmieren lernen mit Arduino Sensor Kit - Einstiegskurs
In diesem Kurs verwenden wir echte Hardware - einen Arduino Uno mit einem Sensorkit - und erstellen Programme auf dem PC, die wir dann auf dem Arduino zur Ausführung bringen.
Diese Programme lesen Sensorwerte (Temperatur, Luftfeuchtigkeit, Beschleunigung) des Sensorkits und kontrollieren Aktoren wie Buzzer oder LED.
Die Programme werden in der Arduino Programmiersprache C erstellt.
Auch dieser Kurs richtet sich an Anfänger in der Programmierung und wir werden alle Konzepte über Microcontroller und Programmieren von Grund auf erklären.
222-55102 Grundlagen der Arduino Internet of things (IoT) Cloud
Die Arduino IoT Cloud ermöglicht es, Arduinos und Arduino-kompatible Geräte mit dem Internet zu verbinden um dann z.B. Messwerte auf einer Smartphone-App anzuzeigen und zu visualisieren oder Geräte, die vom Arduino gesteuert werden, über eine App aus der Ferne zu steuern.
Arduino Iot Cloud Webseite auf Deutsch
In diesem Kurs setzen wir Vorkenntnisse mit Arduino-Programmierung voraus und fokussieren auf die Anbindung an die IoT Cloud.
Das heisst diese Kenntnisse solltet ihr entweder mitbringen oder davor einen der beiden anderen Kurse besuchen.
Wir werden also Arduino Grundlagen aus den Anfängerkursen nur kurz wiederholen und starten dann direkt mit einer
Einführung in die Arduino IoT Cloud (Registrieren von Endgeräten, Things, Devices, Variablen, Dashboard).
Dann erfassen wir Sensordaten mit einem Arduino Sketch (Programm)
und speichern diese Sensordaten in der Arduino IoT Cloud.
Wir erstellen dann eine App die den Sensor-Datenverlauf auf dem Smartphone anzeigen.
Ausserdem werden wir den Sensor-Datenverlauf in Google Sheets speichern und visualisieren.
LoRaWAN ist eine Übertragungstechnik, die es erlaubt, Geräte von überall kostenlos mit der Cloud zu verbinden - ohne dass ein WLAN in der Nähe ist.
Auch diese Technik lernen wir kennen und erfahren, für welche Projekte LoRaWAN geeignet ist und wo besser eine WLAN-Anbindung benutzt wird.
Hier noch einige weitere Bilder von früheren Kursen - auch wenn ihr auf den Bildern keine Kinder seht - wir bieten unsere Kurse explizit auch für Kinder und Jugendliche ab 14 Jahren an - unter 14 Jahren bitten wir um Begleitung eines Erwachsenen.
Wie man sieht stammen die Bilder aus der Zeit der Covid-Pandemie - wir hoffen natürlich alle, dass wir die Kurse diesmal ohne Maske durchführen können und freuen uns auf Euch!
]]>I recently attended the execellent Coursera machine learning specialization by the famous Andrew Ng.
https://www.coursera.org/specializations/machine-learning-introduction
While most of the courses was a repetition of things I already know
so I rushed through it in a few hours - what really got my attention was
the reinforcement learning part in course 3. This was a new algorithm for me.
In the course the used a lunar lander example and everything was well prepared (simulator, hyperparameters) so this seemed very easy:
So I decided let’s give it a try and implement your own reinforcement
simulation and model based on some Arduino hardware that I already had.
And to my surprise it was much harder than expected to transfer the skills
from the course to a real-life experiment.
Here are my lessons learned:
(You can also find this in my public github repo under https://github.com/Bodobolero/CarSimulator/blob/main/README.md)
Car simulator to try reinforcement learning of line tracking with Arduino Robo Car
This car has 3 infrared sensor values in the front directed to the floor
that can be used for line tracking.
Conduct some experiment in real life to collect some numeric measurements of how actions/steps result in state changes.
You can then extrapolate from the measurements using simple statistics like linear regression to derive
the mathematical formulas needed for your simulator’s modeling:
In this example I collected different values for left rotation with different time intervals
and then used python statistics and visualization packages to create the formulas:
1 | import matplotlib.pyplot as plot |
for more details see https://github.com/Bodobolero/CarSimulator/blob/main/Measurements.ipynb
My initial reward function rewarded the car when a sensor was on the line after a step. The most reliable way to achieve that was by staying in the same position but just repeatedly turn left and right with the nose without moving:
After I modified the reward function to not provide any rewards on a position that was already reached previously the model learned that when it lost the line, the most reliable way to go back to the line was to always turn left until it reached the line again - however this caused the model to turn halfway and run back to the starting point:
I tried different things like
However by only tuning the reward function I could not achieve the goal.
I generated an animated gif where each model step was a frame. By stepping through the .gif (with Macos Preview) I could exactly understand where the model failed and what the problem was, as in this example where all sensors where off the line
and even a human being could not decide what to do now (turn left or right) without additional context:
Learning rate, soft update, experience replay and hyperparameters heavily influenced how quickly the
model converged and for some combinations the model oscillated around sub-optimal solutions.
Tuning these parameters is an error prone and time consuming process.
When changing the reward function the achievable total return of the model changed significantly and it
was thus hard to decide when to terminate the learning loop.
I ended up with the following hyperparameters by experiment
1 | GAMMA = 0.995 # discount factor |
I made the decision when to stop the learning loop based on a visual representation of the total reward history
for details see https://github.com/Bodobolero/CarSimulator/blob/main/LearnModel.ipynb
With a single time point of sensor values even a human being could not decide what to do when the car has already left the line. Without knowing the relative position to the line you can not reliably decide whether to turn left or right.
However by providing the sensor values of two prio steps in addition the model had enough state to decide
if it previously left the line on the left or on the right and in which direction to turn.
So garbage in -> garbage out. If you do not provide enough state the model can not copy with all situations.
After adding a sensor history of two time steps to the state tensor the model suddenly worked well:
My simulator did not correctly simulate different and complex ligthing conditions:
In the simulator
In real life
Finally I got it working by adding a (programmatic, not learned) calibration step that adjusts the sensor values to the
current lighting conditions and feeds the “corrected” sensor values to the DQN model:
Today, together with 4 other founding members, we founded the club/association IT-folks.
We want to foster the digital transformation in Germany by contributing to knowledge about IT topics in the general population.
More formally, this is the purpose of the association:
The purpose of the association is the promotion of popular and professional education, the promotion of science and research, and the promotion of civic engagement for the benefit of non-profit purposes in the field of computer and information sciences.
The statutory purpose is achieved, for example, through the dissemination of appropriate knowledge and expertise through lectures, courses and maker projects.
The association is not politically active; political statements of the members are not made in the name of the association.
The offer of the association is basically directed to people of all age groups.
The association is selflessly active; it does not primarily pursue its own economic purposes.
Our Website http://www.it-folks.de is still work in progress and not yet very helpful.
However here is our github org:
where you can for example see the presentation material and source code
of some Arduino classes we presented at VHS Tübingen.
Our association is now formally registered in the “Deutsches Vereinsregister” as “IT-folks Tübingen e.V.” and you can reach us at
info[at]it-folks.de
]]>Joined a team of IT-folks to foster education about computer stuff.
In that context I will be an instructor at Volkshochschule Tübingen for two Arduino classes.
This will be for a german audience, so description is in German
Wollten Sie schon immer mal programmieren lernen? Sind Sie interessiert an do-it-yourself Basteln?
Die Arduino Plattform ist die ideale Einstiegsplattform:
Innerhalb kurzer Zeit kann man IoT (Internet-of-things) Projekte wie Wetterstation, Beleuchtungssteuerung, Messen und Loggen von Strom, Wasser, einfache Robotikaufgaben etc. erlernen und selbst realisieren.
Voraussetzungen:
Für diesen Kurs wird keine Hardware benötigt - wir werden alle Programmieraufgaben in einem Simulator auf dem PC implementieren.
Wenn Sie in diesem Schnupperkurs Feuer gefangen habt, können Sie danach unsere weiteren Kurse besuchen, wo wir mit echter Hardware arbeiten und die Kenntnisse vertiefen.
Wollten Sie schon immer mal programmieren lernen? Sind Sie interessiert an do-it-yourself Basteln?
Die Arduino Plattform ist die ideale Einstiegsplattform:
Innerhalb kurzer Zeit kann man IoT (Internet-of-things) Projekte wie Wetterstation, Beleuchtungssteuerung, Messen und Loggen von Strom, Wasser, einfache Robotikaufgaben etc. erlernen und selbst realisieren.
Voraussetzungen:
Im Kurspreis ist eine Arduino Beginner Kit enthalten, welches aus einem Mikrokontroller und einigen Sensoren und Ausgabekomponenten besteht.
Sie erhalten dieses Kit nach Bezahlung der Kursgebühr beim ersten Kurstermin. Bei der Anmeldung entscheiden Sie sich bitte entweder für die empfohlene Original-Arduino (die teurere Variante) oder die preisgünstigere (Clone) Variante:
Arduino Sensor Kit Bundle - empfohlen - Preis ca. 40€ https://store.arduino.cc/products/arduino-sensor-kit-bundle
seeed studio Grove Beginner Kit - preisgünstige Variante - Preis ca. 24 € https://www.seeedstudio.com/grove-beginner-kit-edu
Inhalte:
TL;DR: use cloudflare tunnel to deploy your web server at home
I have long tried to securely deploy my own web server in my home network which is hard to do right.
Just some examples of what can go wrong:
The following was required but is still needed with my new solution - but the attack vectors were drastically reduced
Rust - I’m (still) in love with my new programming language Rust
after reading…
“Programming Rust
by Jim Blandy, Jason Orendorff, and Leonora F.S. Tindall, O’Reilly 2021”
and practicing the language in advent of code 2021.
I can highly recommend this book - it’s long, a little hard to read sometimes, but worth it.
]]>
Let’s see what follows…