I originally bought this camera for my daughter. But since she moved on to other forms of art, I had to rescue this treasure from a miserable life on the shelf. Let’s start with a few technical highlights:
20.4 Megapixel Live MOS Sensor with TruPic VIII Quad Core Processor: Delivers high-resolution images and improved processing speed.
Advanced 5-axis Image Stabilization: Provides up to 5.5 stops of shake correction, and up to 6.5 stops with compatible Olympus IS lenses, for sharper images and smoother video.
Dual F.A.S.T. AF: Combines contrast and phase detection autofocus with 121 all cross-type points for fast and accurate focusing performance.
50 MP Tripod Hi-res Shot Mode: Captures incredibly detailed images by combining multiple shots into a single high-resolution image.
4K Cinema Video: Records high-quality video at 3840 Ć 2160 with 30, 25, and 24 fps at a bit rate of 102 Mbps.
Vari-Angle Touch LCD: Offers flexible framing options with a fully articulating touchscreen display.
Lightweight and Weather-Sealed Body: Compact and durable design that is resistant to dust and moisture.
With these specs, the E-M5 III doesnāt need to hide behind newer cameras. Realistically, I only have two gripes with it.
When it comes to running websites, providing a seamless and respectful user experience is essential. Using privacy-friendly analytics is a great way to achieve this without the hassle of intrusive cookie banners. In this post, Iāll share how I use Plausible Analytics to gather valuable insights for my two websitesābrejoc.com and jochenbreuer.photographyāwhile keeping visitorsā privacy intact.
Traditional analytics tools like Google Analytics rely on cookies to track user behavior. While this can provide in-depth data, it also requires compliance with privacy laws such as GDPR, which often leads to those disruptive cookie banners. To avoid those pesky things, and still understand my websites’ performance, I turned to Plausible Analytics. Plausible is a lightweight, privacy-focused analytics tool that doesn’t use cookies, doesn’t collect personal data, and complies with GDPR, CCPA, and other privacy regulations by design. This means I can track website metrics without requiring intrusive consent pop-ups.
An EDC very much depends on the environment you are usually in. For me, this is going to look like this in 2024.
The OM System TG-7 is my perfect every day camera. This camera can take pretty much every situation I can think of. But admittedly that’s mostly heavy rain here in Germany. And bumping it around of course. The image quality is so much better than what you get from a phone. And maybe even more importantly: It fit in the pockets of my pants! Not just the jacker!!! š¤Æ
The Joker? What are we talking about here? It’s not the comic book villain for sure. I’m talking about Joker the Clojure dialect: “Joker is a small interpreted dialect of Clojure written in Go. It is also a Clojure(Script) linter.”
The aspect I’d like to focus on here is the interpreter. Unlinke Clojure, Joker does not require the JVM and has a fast startup time. A simple “Hello world” only takes a few milliseconds. And since Joker is written in Go, no additional dependencies are needed. Perfect for writing scripts. “But we’ve got Babashka for that!”, you might think. And you are right about that. Babashka is an even more complete Clojure implementation. That does not mean that Joker doesn’t have some batteries included. Also Joker has a⦠Joker up it’s sleeve: It runs pretty much everywhere!
When working in teams the inevadible question starts popping up: What’s actually agile? Is it Scrum, is it Kanban, is it story points, having retros, aso? Usually my answer is: āWhatever works for the teamā. That is of course cheating, because a team could decide to do waterfall and that is very much not agile.
But what is agile from my point of view? Let’s take a look at the agile manifesto:
During the COVID lockdowns I tried to maintain my health. I shifted my exercises from the bouldering gym to my basement and everything was kind of okay for a while. But eventually I had to pay the toll of that time too, so I decided to change some things. I needed something to get out more often and photography seemed like a neat idea. So I bought a Canon 250D in the beginning of 2022 and just started to go out and take pictures. Best idea ever! Iām even deeper into that hobby now and it proved to be a fun and rewarding rabbit hole for me. So if you are thinking about picking that hobby up too, I can only encourage you. But at the beginning of that journey, there is always one question: Which camera?
A few weeks ago I was conducting an experiment: Could Cobbler be sped up with Rust?
So what’s the problem? We noticed that generating configs for around 160 systems (systems as in Cobbler systems) is not particularly fast. Changing a distribution and regenerating the configs takes a around 15 minutes and of course Uyuni - which is using Cobbler under the hood - is running into a timeout and shows an internal server error. So after some profiling and more investigations together with Enno it was clear that there is not much we could do without taking this completely apart. Don’t get me wrong - we might still do this, but that’s not what this post is about. At some point of time I was wondering if templating, which is taking up roughly 18% of the execution time, couldn’t be improved. So we did some googling and it turned out that Cheetah, the templating system that Cobbler is using, isn’t that slow. Actually it’s just a few milliseconds slower than Jinja in most test scenarios. Although Jinja would be a more sane choice. But the day came to an end and the (temporary) solution was to increase the timeout to 20 minutes.
When 35 liters of rain per m² are coming down in around 45 minutes you better have a prefect sewage system. I donāt - and thatās why my garage, the lab and parts of the basement were magically transformed into a swimming pool yesterday. No fun at all! Usually we donāt have that amount of rain in such a short time in my area. Last time I saw that much rain was in Thailand. But I guess weāll have to get used to heavy rain now, since climate change is slowly but steadily also hitting us here in Europe and we need to get prepared.
Spoiler alert: This will only work on Linux, since seccomp is a feature of the Linux kernel. With seccomp you can limit the kernel syscalls a program can use and you can do that from the program itself. The good news is that it’s dead simple to do this from Go!
Yes, you heard right. But you might ask youself why? Good question! Sometimes you might want to send a script to a customer just so that they can execute it. But this script might need an interpeter that is not already pre-installed on the target system or not even pre-packaged on that platform. That’s where you need a Trojan Horse. In this case the Trojan Horse is a Bash script, that comes with two payloads. The first payload is the static binary of the Joker interpreter. The second is the Joker LISP script that is executed.
Yesterday I’ve noticed a great presentation by Tim Bell with the title Dynamic web pages without Javascript, that was given at PyCon AU 2018. He gives an introduction to creating dynamic web applications with intercooler.js and even mentiones django-intercoolerjs, my little Django wrapper, at some point. Go check it out if you are interested in creating dynamic web applications without fiddeling with JavaScript too much.
I had an expanding battery some days ago up to the point where the battery deformed the frame of the laptop. Dell support was really stellar and replaced the battery the next day. One of the benefits, if you are working for SUSE.
But I started to digg into the topic and now I’m convinced to buy a new fire extinguisher. Why? Well, if a lithium-ion battery starts to burn, the fire doesn’t need oxygen. Everything the fire needs is coming from the battery itself. If the laptop is still plugged in, we’ve got three kinds of fires. An electrical, a chemical and a metal fire. So you can’t choke the fire. Pouring water on the fire only makes things worse. Burning materials might fly into the room, the fire might re-ignite again and on top you might risk getting electrocuted. Apparently there is only one reasonable thing you can do and this is buying a Class D Copper Powder Extinguisher. Yes, they aren’t cheap, but a burnt down house would have been worth the money. The only other thing you can do, if you’ve no extinguisher around, is using dry sand. Let’s move to the beach! š
If you haven’t been living under a rock, you’ve certainly noticed that Salt is one of the hot topics within openSUSE and SUSE. It is used in many of the major openSUSE projects like DeepSea for managing and automating Ceph deployments, in Kubic to provision Kubernetes cluster or the newly announced Spacewalk fork Uyuni project to manage your whole IT infrastructure. Therefore I think it’s time to take a closer look at how Salt itself is being packaged and shipped and how you might collaborate.
Don’t you miss the good old games sometimes? Okay, opinions diverge when it comes to exactly this Ultima. Ultima 8 is indeed much different from the previous Ultima titles in the saga, which reached its peak with Ultima 7. Don’t get me wrong, the story is still awesome and you can dive into a world with great depth. But with the Avatar walking around alone, all the jumping and the much different fight system Ultima 8 was simply too different for most of the fans.
Two month ago I started this survey and the results are finally here. Many thanks to all who took the time to send this in.
All of this is based on 66 answers. All of the answers where mandatory with one possible answer, besides the last two that where multiple choice and completely optional.
Are you already a DO customer?
Are you an openSUSE user?
Are you using other cloud hosting providers because of their openSUSE support?
Yesterday I’ve set up an OBS repository for ssht. ssht allows you to directly connect to a running tmux session on a remote host via ssh. So if you are using openSUSE (Leap or Tumbleweed), Fedora, CentOS or RedHat you can finally make use this instead of building the package yourself. The easiest way is to just search for ssht at software.opensuse.org. Then you can pick the disto you’ve installed and choose to download the package directly or you can add the repo with the 1-click installer. Couldn’t get easier!
This has been my first openSUSE Conference and it has been great. Thanks to all the organizers and supporters!
My Highlights
I have to admit, that I lost track of openSUSE and SUSE about ten years ago and I was really surprised to see such a mature and compelling ecosystem. Yes, the ecosystem is the most compelling thing to me. Don’t get me wrong, openSUSE and SLES are great Linux distributions, but the ecosystem is what elevates this above all the others!
This is one of the blog posts, that is adressing the future me but might also be useful for you too. You might have gotten this error because you are using PIL or Pillow in a Python project.
IOError - decoder jpeg not available - I’ve had this error out of the blue and was a bit confused. Nothing in the virutalenv had been changed, dependencies where still in place and I couldn’t find anything missing. So I removed the virtualenv, created a new one and installed all eggs again. Still the same error.
The service locator pattern is a design pattern used in software development to encapsulate the processes involved in obtaining a service with a strong abstraction layer. This pattern uses a central registry known as the “service locator”, which on request returns the information necessary to perform a certain task. Source: Wikipedia
I’ve noticed, that a lot of PHP frameworks are eagerly adopting new patterns like service locators recently. I wasn’t really happy to see that, because service locators are introducing an other abstraction layer, which adds complexity and moves dependencies away from the source. Also errors are entirely moved into runtime. One could argue that everything happens in runtime with interpreted languages, but that is also not entirely true in this case.
There is really no reason to not use valid HTTPS certificates anymore. Let’s Encrypt is easy to use and free. So without further ado here is how your setup could look like with Nginx and acmetool.
acmetool is a Go program that can handle all your Let’s Encrypt related tasks without messing with you configs. But keep in mind that Let’s Encrypt offers domain validation. So Let’s Encrypt makes sure, that you are the one that controls e.g. the domain example.com. This is in detail explaine on the How it works page on the Let’s Encrypt webiste. So you need to master the challenges and from time to time your certificates need a renewal (which is also secured via challenges). acmetool can handle that entirely.
Being a Digital Nomad has a lot of benefits, but there are also some major downsides. Not having permanent access to the energy grid is one of them. Pluging your laptop or smartphone into the next outlet might not always be possible. Heck, there might not even be an outlet.
I’m in Spain right now and Spain has a surprisingly decent network coverage. But roaming around in a camper often leads you to remote places. Using the 12V batteries of the camper is not yet possible. So right now I have to solely rely on power banks to charge two laptops, two phones, three tablets and two smart watches. At least not every device needs to be fully charged all the time.
Current versions of Internet Explorer aren’t as bad as it used to be. Some even claim that Safari is the new IE. We usually don’t have to optimize for a particular browser very often. If it works in Firefox and Chrome, the others are just fine. But one thing that didn’t work for one of our customers (yes, he sadly uses Internet Explorer exclusively) was the localization of DecimalField. So instead of comma, which is the decimal separator in Germany and many other countries, IE would only allow a dot.
If you are running a Django application behind a proxy, Django cannot automatically know if encryption is used. This can cause problems e.g. with redirects. Django, not knowing it should use HTTPS, redirects to http://example.com/foobar/ and this might cause a series of other problems. But Django is awesome and you can let Django know if encryption is used or not.
In this example I’m using Nginx. In your proxy settings you’ll have to set a header for X-Forwarded-Proto with the current $scheme. This can either be http or https.
In this example I’m setting a time limit for code execution. If the execution takes too long, the TimeoutException is beeing raised and we can proceed with the rest of the program.
Do you remember the good old days, when everything was stateless and there was, at least most of the times, a response for every request? Those times are gone. Nowadays we want rich, interactive web applications, that not only respond instantly without reloading the entire website, but also push changes directly to the browser and send notifications.
Lets admit it, Django started to look old and busted. If you wanted to use WebSockets e.g, you had to use some 3rd party eggs that where more or less well integrated and in some cases already abandoned. I know, the grass is always greener on the other side, but Rails is a serious competitor when it comes to implementing compelling features for web developers. But at least Django has Channels now and I’m really excited about it! Why? Because the demand is already there!
Today backups saved someones bacon again. A customer messaged me and asked if I could restore a file from yesterday. Luckily this is a piece of cake (just like it should be).
Our production systems are not yet using ZFS and this will definetly change in the future. But our backup systems are using ZFS extensively. No matter how backups are performed on-site, the backups are transfered to the backup systems via rsync. After that a ZFS snapshot is created. This way we don’t have to pay attention to how the backup was performed on-site. We just mount the snapshot from that day and restore the files needed. Only transfering ZFS snapshots directly would be easier and I definitely see that in our future.
ssht is not exactly new, but I’ve never blogged about it and it’s a really handy timesaver. If you are working on the terminal a lot, there is a big chance, that you are using tmux. tmux allows you to have multiple windows and panes in one shell - locally and remote.
Now ssht allows you to ssh to a remote computer and directly connect to a running tmux session. If there is no tmux session a new session is created. That’s it.
I’ve been evaluating drone.io yesterday and I’m quite impressed with the integration and simplicity. You can use drone as a SAAS or install it on your own hardware. It’s really easy. Drone comes with batteries included. After setting up OAuth with your repository system (e.g. Gitlab in our case), you are good to go. You can just select the project from a list and then you are asked to place a .drone.yml in the project root - which could look like this:
Which is of course not true. Setting ssl_protocols to ssl_protocols TLSv1 TLSv1.1 TLSv1.2; will activate TLSv1, v1.1 and v1.2. So why am I writing this?
The documentation clearly states that ssl_protocols can be set in the context of http and server. Which is true. But you can set ssl_protocols only once per port. Sadly this is not mentioned in the documentation. I don’t know if Nginx stops after the first definition or takes the last definition, but that was exacly my problem.
I had a server with multiple site-configurations on one port (aka vhosts on port 80). Since I was testing new configurations, I only enabled TLSv1.2 for one config⦠and nothing happend; only TLSv1 was possible. So the search began.
We’ve been using PlantUML in the past to outline dependencies and relations between classes or to simply get the relations in databases right. There is a nice Confluence plugin and serveral editors availabe, that let you edit your PlantUML file in the browser and show the generated graph image right beside it. That is neat, but I prefere my own computer and I like vim. But re-running the command to generate the image every 10 seconds manually is tedious.
Three month ago I’ve been installing elementary OS on my Dell XPS 13. The sputnik edition. The XPS 13 is my main workstation that follows me everywhere I go ā so this is more or less like a full switch to elementary for me.
Previously I’ve been using Ubungu GNOME on the XPS, which is an official flavour of Ubuntu, featuring the GNOME desktop environment. But I’m also using Kubuntu from time to time and vanilla Ubuntu with Unity nearly every day on an iMac. There is also a MacBook with OS X that is used for iOS and Mac related stuff. One could say I’m trying to stay on top of things when it comes to desktop environments. ;)
Last year I’ve started a port of SuperGenPass in Go. After my initial release Mathias Gumz totally dominate the project and made huge improvements. gosgp was born ā a command-line application to generate passwords for domains (or any other string you enter).
Since I’m still using SuperGenPass for many Passwords, gosgp is something I install frequently on my Linux boxes. Recently a new Macbook found its way into my bag and I had to compile gosgp again for OS X. Not a problem at all, but I got reminded of the homebrew tap for ssht and decided to throw together a recipe.
This is more or less a reminder for me. With this little gist, the Bootstrap carousel and FancyBox2 are working hand in hand when it comes to browsing images. Normally those two don’t care for each other ā but it would be much nicer, if the carousel would display the next set of images, when one of them was loaded in the FancyBox modal. Well, these few lines of code make it possible:
Once uppon a time there has been a website called Is Freya released yet, that is no longer needed. Why? Because the Beta 1 of elementary OS has been released and it looks awesome. So IFRY is no longer needed, but I’d like to publish some numbers here:
99,783 unique visitors with 581,546 total requests in roughly two month. Nearly 9,700 visitors a day. Most of the visitors already run Linux (52,336), but 19,408 visitors used Windows. I guess the 20,393 visitors with Unknown Operating Systems are using iOS or Android.
Most people visited IFRY directly. G+ brought 11,847 visitors and vk.com (don’t know what it is) 7,436. Interestingly reddit and fuckyeah-elementaryos.tumblr.com are nearly on par with 5,592 and 4,333 visitors.
And a whole bunch of people googled for the URL. ;)
Do you still remember Cuttlefish? With this neat application your computer becomes aware of its surroundings and can react to a switch of the wifi network, a plugged in USB devices, aso. These would be the triggers.
What makes Cuttlefish so very useful are the reactions you can combine this with. E.g. I’m turning the phone in my home office off whenever I’m not at home. Makes sense, doesn’t it? And there is plenty more you can do. But this should be something that is baked right into the OS itself. A local IFTTT if you will. Why shouldn’t your computer be the control center for this? The internet of the things could start with your computer. We don’t need extra gadgets for this!
I’ve been playing more with docker recently and decided to deploy OwnCloud with it. Turns out it is not so easy to finde a Dockerfile for OwnCloud that actually works flawlessly. One thing that strikes me, is the fact that most people tend to forget the config folder. Once you want to update your OwnCloud container, you really need the config from that folder. Otherwise your database config is lost and you’ll have to reconfigure everything.
Attention:This blog post is from 2014, but still seems to get a lot attention. Many things have changed. LXD has been released and there is ZFS support in LXC, which is far superior to this method. I’ll post an update soon.
If you are using Linux containers for deployment, you might want to backup a whole container instead of just the application data. This comes with a down side. If your application has some sort of state and is saving data in the file system or a database, you’ll have to shutdown the container to make a backup. Otherwise you might lose data, since some of the data might still be in RAM and RAM won’t be saved to the backup. At least not with this method. So this method should only be used if the container has not to be up 24/7. But usually the backup is pretty fast and only takes a few seconds.
Father of two. Founder, CEO and Head of Cloud Development at dajool.com, a start-up in Germany that develops solutions for mobile and web in pretty much all areas.
Skills
Over ten years of experience in programming with various languages and frameworks. First Linux distribution came on 5 ¼ floppy discs and was a RedHat Linux. Almost six years of experience in project and personnel management. Agile and pragmatic team-worker. Experience with remote working teams for six years.
Happy new year everyone! I hope you could spend a nice time with your family and friends.
I’m very sorry, that the third part took me so long. The end of the year is always a tough time, but this year was especially busy. We had a lot work over at dajool and I needed to take some time off during the holidays to relax a bit.
The last part outlined the bigger picture of the setup. Now we’ll get a bit more into the details.
reprepro
You’ll get several benefits from using reprepro:
Security
With a GPG-Key at hand you will be able to sign the packages. Your client systems (the webservers are meant) will check these signatures from the repository server during installation. Also, but this has nothing to do with reprepro directly, deb packages (can) contain checksums within the packages for each file included. If something is bogus with the package apt-get will notify you and stop the installation. This is very important if you are working in a more security sensitive environment.
With the checksums from the deb package and debsums installed you also get a lightweight IDS. Running debsums in a very frequently started cron job with just your web applications (and dependencies) as a target will let you sleep better. If someone was able to change one of the files, you can let the sirens howl and take the application offline to check out what happend.
Limiting your frequent debsums check to your web applications and dependencies simply has to do with resources. A full system check takes very long and can produce substantial IO on lower end systems. You should only do this once or twice a week.
In this short series I will explain how to deploy applications with deb packages ā but without the usual pain involved. My focus will be deb, because we are using Ubuntu LTS nearly everywhere at dajool. With a few sidenotes from me and a few google searches from you, you’ll quickly adopt this to RPM (and perhaps soon FreeBSD). You will be free from any vendor lock-in and you will have the freedom to deploy anywhere: Your own servers, cloud and even your customers data center. There is no special sauce to apply.
This is really ugly and you will absolutely need it if you’d like to json serialize form errors in Django. Why? Because you’d like to reply to an AJAX request and just pass trough the errors your form has generated.
simplejson itself is not able to serialize the ErrorDict. But not the ErrorDict itself is the problem - the proxy objects within the ErrorDict are the problem. Those proxy objects represent a string (unicode here) and will be casted whenever needed. This ensures that you won’t run into problems with internationalization.
Just a quick note on the wonderful Juno framework, which I’ve been using for a small project. Sadly the documentation isn’t quite clear when it comes to deployment with mod_wsgi. At least I had some head scratching while reading through the documentation and had to figure out how to do it.
This is what you find in the documentation:
** WSGI Notes **
Since mod_wsgi requires a function named 'application', you would need to put Juno
in 'wsgi' mode >and call run() like so:
config('mode', 'wsgi')
application = run()
Those functions will make more sense later.
Perhaps it’s just me, but that didn’t make much sense to me. So I basically tried some stuff, until I had a working solution. I’m using the config scripts from django_hoster as a basis. You might want to take a look at the templates.
Recently I’ve been thinking about an alternative for the widespread way of commenting to blogs or websites in general. Nowadays nearly everyone (including me) has a blog and writes uberimportant stuff to the world. That’s nice and fine, but since we have web 2.0 we need to let others comment the stuff we write. This way we get a communication where everyone can participate - and I think that is the really important thing here. But can really everyone participate?