[{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/","section":"","summary":"","title":"","type":"page"},{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/posts/","section":"","summary":"","title":"","type":"posts"},{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/tags/apple/","section":"Tags","summary":"","title":"Apple","type":"tags"},{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/tags/macos/","section":"Tags","summary":"","title":"Macos","type":"tags"},{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/categories/macos/","section":"Categories","summary":"","title":"MacOS","type":"categories"},{"content":"","date":"April 19, 2025","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"I recently noticed that my Time Machine backups would fail when attaching the backup disk while my Mac (running macOS Sequoia 15.4.0) was locked. The following message would appear:\nMessage about unavailable files during Time Machine backup. So the backup failed because “some files were unavailable.” Okay. At least, it would have been nice to know which files are affected. Also, letting the backup fail entirely just because of a few files (see below) clearly isn’t optimal.\nAfter researching the error, I found this handy command that will print the desired piece of information:\n$ log show --info --style compact --predicate \u0026#39;(subsystem == \u0026#34;com.apple.TimeMachine\u0026#34;) \u0026amp;\u0026amp; (eventMessage like[cd] \u0026#34;Failed * acquire device lock assertion*\u0026#34;)\u0026#39; --last 24h It gave me six entries that looked like this example (truncation by me):\n2025-04-14 09:14:19.470 E backupd[78056:149ff8] [com.apple.TimeMachine:FileProtection] Failed to acquire device lock assertion for \u0026#39;/Volumes/com.apple.TimeMachine.localsnapshots/Backups.backupdb/MacBook Pro/2025-04-14-091246/Data/Users/aaron/Documents/[…]/WhatsApp Image 2024-07-30 at 16.52.33.jpeg\u0026#39; (assertion state: \u0026lt;dropped\u0026gt;), error: Error Domain=NSPOSIXErrorDomain Code=1 \u0026#34;Operation not permitted\u0026#34; Interesting. All of the affected files were images saved from WhatsApp. However, not all of my images saved from WhatsApp had this problem. There were even a few more in the same folder that did not suffer from this issue.\nUnix file permissions and ownership were fine (-rw-r--r--@ 1 aaron staff), so I looked at the extended attributes:\n$ xattr -l \u0026#34;/Users/aaron/Documents/[…]/WhatsApp Image 2024-07-30 at 16.52.33.jpeg\u0026#34; com.apple.macl: com.apple.quarantine: 0087;66a8fe82;WhatsApp; The presence of com.apple.quarantine isn’t surprising since I downloaded the file from WhatsApp. This shouldn’t prevent the file from being backed up while the Mac is inactive though. com.apple.macl is a bit more involved. I haven’t fully wrapped my head around it, but I read that it is related to System Integrity Protection (SIP) and was introduced with macOS Catalina and not really well-documented.\nI tried to remove both extended attributes to see if it would fix the issue:\n$ xattr -d com.apple.macl \u0026#34;/Users/aaron/Documents/[…]/WhatsApp Image 2024-07-30 at 16.52.33.jpeg\u0026#34; The command succeeded, but when inspecting the extended attributes again, I noticed that com.apple.macl was back—presumably because of SIP.\nSince only six files were affected, I stopped researching further at this point and went with a brute-force method: simply rewriting the files, which is a known method to get rid of the com.apple.macl attribute:\n$ cp -X \u0026#34;/path/to/file\u0026#34; \u0026#34;/path/to/file.tmp\u0026#34; \u0026amp;\u0026amp; mv \u0026#34;/path/to/file.tmp\u0026#34; \u0026#34;/path/to/file\u0026#34; The next backup succeeded, even though the Mac was locked.\nI put it in a script for future use (hopefully not required), or in case others face the same issue. It will preserve the creation and modification dates.\nFurther Reading # https://www.stellarinfo.com/blog/fix-time-machine-waiting-to-complete-first-backup-issue-mac/ https://blog.xpnsec.com/we-need-to-talk-about-macl/ ","date":"April 19, 2025","externalUrl":null,"permalink":"/troubleshooting-time-machine-backup-issues-on-a-locked-mac/","section":"","summary":"Time Machine backups on macOS can fail when the Mac is locked. In this post, I walk through how I diagnosed the issue using the log command and resolved it by rewriting the affected files.","title":"Troubleshooting Time Machine Backup Issues on a Locked Mac","type":"posts"},{"content":"","date":"February 3, 2024","externalUrl":null,"permalink":"/categories/apple/","section":"Categories","summary":"","title":"Apple","type":"categories"},{"content":"I have been a long-time Spotify user, but since I’m quite deep into the Apple eco-system, I was wondering if it would be a good idea to switch to Apple Music for a more streamlined experience. Based on what I knew and after a quick research, I saw several advantages.\nNote that the findings presented below are from the time between November 2023 till January 2024. If you’re reading this much later, things may have changed (I actually hope so!) So if you spot something that is not accurate, please drop me a line.\nWhy I Considered Switching in The First Place # I had been glancing at Apple Music for a while, mainly because of its tighter integration into the Apple ecosystem. But there were also other aspects, such as the ability to (easily) sync local files and support for lossless audio. Below, I detail these aspects.\nAirPlay Being a First-Class Citizen # We have more than five AirPlay-capable devices in our household, so when I listen to music, there is a good chance that audio is being streamed via AirPlay—to a single speaker or multiple speakers simultaneously thanks to AirPlay 2. On iOS, Spotify has AirPlay support, but it requires an extra tap since, not surprisingly, Spotify prefers its own Connect protocol over AirPlay. The Spotify Mac app doesn’t come with AirPlay support at all—you’d have to stream your system audio instead, which is obviously not great as it will include everything that’s playing on your Mac (such as UI sounds).\nNative UI # While the Spotify UI isn’t terrible, I generally prefer native Mac apps over cross-platform apps which aim to look exactly the same on all platforms. For instance, Spotify doesn’t respect the system’s setting for dark or light mode—a standard thing for every modern Mac app to support. Spotify however always presents itself in pure black, with no option to customize whatsoever.\nSupport for Syncing Local Files # In Apple Music, it is much easier to get local files synced across your devices (such as DJ mixes or tracks that aren’t in Apple’s catalog, for whatever reason). While Spotify has support for playing local files, it is tedious to get them synced to your devices since Spotify doesn’t support uploading them to your account. Instead, you have to manually transfer your files via USB or iCloud. I get that they want to save cost by not hosting the user’s personal files. In contrast though, Apple, who specializes in cloud storage anyway, does cloud syncing automatically whenever necessary. On the Mac, you can simply add local audio files to any playlist and they will be available on all your devices in a breeze. A potential caveat here is that Apple Music will try to match your local file to a track that they have in their catalog.\nYou can easily check the cloud syncing status by adding the “Cloud Status” column to a playlist, it can be one of:\nApple Music: The track is from the Apple Music catalog. Matched: Apple identified your local track and is using their version on your other devices. Uploaded: Your original audio file was uploaded. Ineligible: Cloud syncing not possible—for example, when you add a classic HTTP-based radio stream to a playlist. Playlist in Apple Music with “Cloud Status” column shown. Play Next Action # It sounds crazy, but Spotify does not have a Play Next action. All you can do is appending a track to the queue, which is annoying, especially if your queue is long. There is a long thread in the community forum in which the Spotify moderators insist that the feature exists, while it clearly doesn’t. (My favorite reply: “Mod – are you high?”)\n“Play Next” action in the Apple Music Mac app. Multiple Window Support # Like many Chromium-based apps, Spotify is a single-window application. You can’t open a playlist in a new window. With Apple Music on the Mac, this is possible—and actually quite useful when organizing your music.\nCustomizable Playlist Columns # Apple Music on the Mac has the option to switch playlists to the old-school column view by selecting “Songs” in the View Options menu. It lets you reorder columns and allows for adding basically all fields you can think of as columns. This is where the iTunes legacy shines through—in a good way.\nThe View Options menu in Apple Music allows for customizing the playlist columns. In contrast, Spotify offers very limited customization:\nIn Spotify, playlist view customization is limited to switching between Compact and List . Lossless Audio # If I am being honest, I am not able to tell the difference between a 256 kbit/s AAC file and lossless audio. Still, it feels good to listen to the tracks the way they were meant to sound, without any lossy encoding in between. Spotify had announced plans for lossless audio (branded “Spotify HiFi”) back in February 2021, but it never launched up until this day, and there are speculations that they will bind this to higher priced tier. Apple Music includes lossless in their standard plan—you can simply enable it.\nThe Transition # This all sounded great, so I started my Apple Music trial and synced my Spotify playlists over to Apple Music using SongShift. This was an adventure on its own, as, for some reason, I had to confirm hundreds of tracks manually, even though they clearly appeared to be the same track (same artwork, track, and artist name).\nOnly very few tracks did not sync at all because they are only on Spotify, but not on Apple Music. An example is Incise by Hobo. I’m not bothered by this since I figured I could just buy the ones that are important to me, and sync them easily using Apple Music’s cloud syncing feature discussed above.\nSo I was all set.\nWhat Went Wrong? # As you already know from the title of this blog post, I didn’t make the switch in the end. So what happened?\nStability # In my brief testing, I managed to get Apple Music on the Mac to crash or stop responding. I wonder how this passed proper QA testing.\nThe first crash I got was when I disabled the autoplay feature. To be fair, it happened once and I wasn’t able to reproduce it yet.\nToggling Auto Play in the “Playing Next” sidebar crashed Apple Music. Something you don’t want to see when you finally migrated all your playlists over to Apple Music. At some point, I also got it into a state where it stopped responding and needed a force quit. It was at the New Year’s Eve party (more about that below) when the Apple Music Mac app was set up to control Apple Music on the Apple TV.\nQueue Issues at The New Year’s Eve Party # The final nail in the coffin was the New Year’s Eve party. I had a specific use-case here—which I think shouldn’t be too uncommon:\nApple TV for playback: My Apple TV is hooked up to my stereo in the living room and connected via Ethernet. This way, I can stream music without any wireless connection involved. Plus, music will continue to play when I’m, for example, closing my MacBook or going into the basement with my iPhone in my pocket. MacBook and iPhone for queue management: During a house party, I’m either running around (and have my iPhone with me), or I’m standing behind my MacBook to pick tracks from my playlists and add them to the play queue. In both cases, I would control the Music app on the Apple TV remotely. This can be done using the “Switch to” feature in Apple Music on the Mac, or the “Control Other Speakers \u0026amp; TVs” feature on iOS.\nApple Music can remote-control another AirPlay-enabled speaker. While this is clearly a supported setup (and seemed to work at first glance when I tried it in the afternoon before the party), it was a complete disaster during the party. Adding a track to the queue using Play Next on the Mac sometimes worked, sometimes not (even though it would show up as the next track in the “Playing Next” sidebar). People were like, “hey, you said you were going to play track XYZ next? What is this?”\nAlso, sometimes the queue would display empty placeholders:\nEmpty placeholders in Apple Music’s Playing Next sidebar. Eventually, I ended up creating a regular playlist which I would add tracks to and reorder, as I hoped this would be a workaround for the problematic queue behavior. But still, something was completely off. The playlist on the Mac just didn’t reliably sync with the Apple TV. The only way to be certain that the desired track would play was double-clicking it (which would play it immediately).\nWhile Spotify also has an annoying queue bug that kicks in after using the queue for a while, the queueing experience is generally much smoother when multiple devices (or even other users) are involved.\n“Create Station” is Different From Spotify’s Song Radio # And for my use-case, it’s different in a bad way, unfortunately. Let’s start with what Apple’s “Create Station” feature has in common Spotify’s “Song Radio”:\nBoth will let you listen to tracks that are similar to a chosen track. It’s extremely useful to discover tracks you might like, or just to have something playing in the background which stays in line with a certain genre. I’ve used this feature long before Spotify’s mainstream adoption in Germany. Back in the day, I was using Amarok 1.4 on Linux (later Clementine). If memory serves correctly, it was able to suggest similar tracks and artist that you had in your local library using Last.fm. Pretty cool.\nWith the rise of music streaming services, I eventually pivoted away from having a local library and was happy to find a similar feature in Spotify: Song Radio. Now having almost every track you can think of at your fingertips, this feature was suddenly much more powerful. When playing music at a party, I would use it a lot: While a track was playing, I would start browsing tracks suggested by Song Radio, but would only add tracks to the play queue that I knew and thought would fit in well, resulting in my selection being a small subset of the overall suggestions. I basically used Song Radio as a tool to remind me which tracks could go next while staying in full control of the play queue.\nThis is where the big difference to Apple Music’s “Create Station” feature is: In Apple Music, once you click “Create Station,” playback will start immediately, interrupting the current track and overwriting your play queue without warning. So my use-case of “oh, let me find tracks that are similar to this other track and play some of them later” simply doesn’t work here. It is clearly not made for this.\nSlow UI and Visual Glitches # Seriously, why does it take several seconds to add a track from the recommend tracks to a playlist?\nYour browser cannot play this video. Download video.\nApple Music taking several seconds for adding a suggested song to a playlist. Also, did you notice the flickering album artworks? When a track is added, all other artworks disappear for a split second, come back, disappear again, and finally come back to remain shown.\nIn Spotify, adding a recommended track is happening almost instantly.\nYour browser cannot play this video. Download video.\nAdding a recommended track in Spotify is reasonably quick. And then, back to Apple Music on the Mac, there is this weird hover effect that stops highlighting the track that’s under the mouse pointer when scrolling the list:\nYour browser cannot play this video. Download video.\nInconsistent hover effect when scrolling a playlist in Apple Music. (Again, something I wasn’t able to reproduce.)\nAnnoying Limitations # Earlier in this post, I praised the View Options feature that lets you customize playlist columns and give the app a more advanced look \u0026amp; feel by fitting more rows onto the screen and seeing useful meta data at a glance. Discovering this made me very happy, but the disappointment came just a few moments later: it is not possible to apply those view options to all playlists. Even though there is an “All Playlists” view that lets you select multiple playlists, the View Options menu doesn’t apply to the selected playlists here, but to the “All Playlists” view itself. So close!\nNo Open Source Client # There is a popular open source library called librespot that implements streaming from Spotify. This enables various open source projects to include Spotify support.\nFor example, OwnTone (which I use in combination with shairport-sync for AirPlay-based multi-room audio) integrates with Spotify and can stream Spotify playlists via AirPlay—without actually installing the Spotify app anywhere.\nNot having this for Apple Music wouldn’t have been a showstopper for me (I knew about this one right from the start), but now that I have changed back to Spotify, I’m glad that I can continue using this feature.\nSummary # So, all in all, Apple Music works perfectly fine if you use it primarily on iOS to enjoy some music and receive automated recommendations. However, if you look beyond basic usage—exploring features like integration across devices, user interface on macOS, or specific functionalities like queue management—you might find yourself disappointed rather quickly. Despite my reservations about Spotify, it ultimately remains the better choice for my needs at this moment. My initial enthusiasm for switching was high, and mentally, I had already made the leap. Yet, the reality of Apple Music’s Mac app—feeling unfinished and glitchy—led me to an unexpected relief in returning to a Chromium-based app. This outcome was certainly not what I anticipated at the start of this journey.\n","date":"February 3, 2024","externalUrl":null,"permalink":"/how-i-almost-switched-from-spotify-to-apple-music/","section":"","summary":"In this post, I outline how I became excited about ditching Spotify for Apple Music, but then found more and more things that were broken or felt unfinished—or just didn’t work the way I expected them to work.","title":"How I Almost Switched From Spotify to Apple Music","type":"posts"},{"content":"After switching from Chrome to Safari, I started missing the excellent TabCopy extension that allowed me to easily copy the current tab’s URL to the clipboard, formatted as a clickable link displaying the page title. I often use this to reference web pages in emails, to-do lists, documentation, Slack, etc. Instead of dealing with potentially long URLs, I prefer pasting a human-readable link with the URL hidden behind it.\nThis post outlines how I managed to implement this specific requirement for Safari. I’m not focussing on TabCopy’s other features as they weren’t relevant for my workflow.\nTL;DR: Here’s the finished script which retrieves the URL and title of the active Safari tab, constructs an HTML link, and copies it to the macOS clipboard. It also includes a plain-text representation in Markdown syntax.\nYou can use an automation tool such as Alfred to bind this script to a hot key local to Safari and show a notification when done:\nAlfred Workflow to bind the script to a hot key and show a notification. The Script Explained # Fetching the Title # Using AppleScript, we fetch the URL and the title displayed in the frontmost Safari window.\nMassaging the Title # Starting with version 17, Safari introduced support for profiles. The profile name will be prefixed to the document title that is retrieved using AppleScript. We detect it based on the long dash (—), which Safari uses to separate the profile name from the web page title, and strip that string using sed.\nYou can extend this function to do further processing if needed.\nPreparing The HTML String # Adding the \u0026lt;meta charset='utf-8'\u0026gt; ensures that the string is treated as UTF-8 when adding it to the clipboard. Without this, special characters in the page title will break.\nI’m also adding a style tag to use the default sans-serif font when pasting the link, which I usually prefer. Your mileage may vary.\nhexdump -ve '1/1 \u0026quot;%.2x\u0026quot;' will convert a string into a stream of two-digit hexadecimal numbers, without skipping any repeated lines. This seems to be required to get the string over into the AppleScript world, which I learned in this StackOverflow post.\nPreparing a Plain Text Version # Some apps, such as Slack, are picky and won’t paste the HTML string when no plain text version is present (details in the next section below). I’m therefore adding plain text representation in Markdown syntax which includes both the page title and the link.\nSetting the Clipboard # Finally, I’m writing both strings to the clipboard, again using AppleScript.\nGetting It To Work In Slack # At first glance, all seemed to work, as the link would paste correctly in native macOS apps, such as Mail, TextEdit, or OmniOutliner. However, at some point I noticed that it wasn’t working in Slack. Performing the paste action would do nothing, not even giving me the title without the link. Maybe this is an issue with Electron apps in general, which I haven’t verified.\nI was puzzled and decided to take a deep dive into the inner workings of the macOS clipboard. I knew that copying a link from a webpage in Chrome or Safari and pasting it into Slack worked correctly, so I wanted to figure out how the raw data would look differently in the clipboard.\nApple provides a Clipboard Viewer utility as part of the Additional Tools for Xcode, which was exactly what I needed to get to the bottom of this. Despite having an icon that you’d never expect from an Apple app shipped today, it gets its job done, no frills.\nManually copying a link from a web page in Safari would write the following data in the clipboard:\nMore than I expected. There are multiple HTML and RTF representations, including a com.apple.webarchive data type, and various plain text representations in both UTF-8 and UTF-16.\nIn contrast, my script would only write two data types, both being the HTML representation:\nAfter some trial and error, I found out that the plain text version is key. Slack expects a plain text to be included, even though it won’t be using it at all. As long as a plain text is included, it will happily paste the HTML version.\nSo I updated my script to include the plain text version:\nplain=$(echo \u0026#34;[${title}](${url})\u0026#34; | sed \u0026#39;s/\u0026#34;/\\\\\u0026#34;/g\u0026#39;) osascript \u0026lt;\u0026lt;EOF set the clipboard to {«class HTML»:«data HTML${html}», string:\u0026#34;${plain}\u0026#34;} EOF For some reason, this adds a bunch of other plain text representations. But it does the trick! The link can now be pasted into Slack.\nTo make this more useful, I decided to use the Markdown syntax here.\nCredits # Header artwork generated with ChatGPT and DALL·E. https://stackoverflow.com/a/11089226/1387396 ","date":"November 11, 2023","externalUrl":null,"permalink":"/copying-the-current-safari-tab-as-a-to-the-clipboard-as-a-clickable-link/","section":"","summary":"In this post, I outline how to quickly copy the URL and title of the active Safari tab as a clickable link, a convenient feature for referencing web pages in emails, to-do lists, documentation, and messaging platforms like Slack.","title":"Copying The Current Safari Tab as a Clickable Link","type":"posts"},{"content":"Recently, I transitioned from an EdgeRouter 4 to a MikroTik CCR2004-16G-2S+ as my home router. This switch was primarily prompted by the occasional bugs and dwindling updates in EdgeOS, including issues such as default route loss during DHCP renewals with a /32 netmask, disappearing IPv6 gateway, and a memory leak in snmpd.\nAll in all, I’m quite happy with the switch to MikroTik. In this blog post, I’m sharing some of my observations and thoughts on MikroTik and their RouterOS—a platform that certainly does things its own way.\nBear in mind that I’m not a networking or router professional; these subjects are personal passions I enjoy exploring during my free time. While the majority of what I discuss here will be generally applicable, there may be critical aspects that I haven’t addressed, primarily because they don’t apply to my home setup. I’ll provide a brief overview of my setup in the following section.\nOverview of My Home Setup # Before I jump in, here’s a quick overview of my setup and the features I’m using: I’m operating on a 250/40 mbit/s VDSL connection. My DSL modem is a Telekom Speedport 4 running in bridge mode. As a result, the router connected to it takes care of setting the VLAN tag and establishing the PPPoE tunnel, which is (sadly) a requirement from my current ISP, Deutsche Telekom. I’m utilizing both IPv4 and IPv6 with a dynamic address/prefix, have multiple VLANs set up (e.g., for IoT devices and guest devices), and I use WireGuard for accessing my home network while I’m on the move. To prevent latency-sensitive applications like video calls from being disrupted by heavy downloads, I’m using smart queues. This is actually the main reason why I’m using a router that some might consider overpowered for a home setting.\nWith that said, let’s explore my findings from getting to know my first MikroTik router!\nUpdates, Updates, Updates! # RouterOS is updated frequently, which is a stark contrast to EdgeOS. EdgeOS version 2.0.9 was released in November 2020 (I’m writing this post in May 2023), and since then, only hotfixes have been shipped. This was one of my main reasons for making the switch. Both RouterOS 6 and 7 receive updates regularly, and these include new features (such as WireGuard which was added in RouterOS 7).\nNative WireGuard Support # A huge plus for WireGuard fans like myself is its native integration into RouterOS. To be fair, there’s a community-provided package for EdgeOS that has been working flawlessly for me for years—however, it needs to be updated manually and requires reinstallation whenever EdgeOS is updated.\nMikroTik Embraces NIH # Here’s something I find a bit odd. While EdgeOS largely relies on standard open-source software, MikroTik seems to take a different approach. They have their own scripting language and even a proprietary TLS library in RouterOS 7. Whether this is a good thing is up for debate—especially when it comes to security, as it’s often considered bad practice. TLS is complex and there are plenty of open-source libraries available, so I don’t really see why you’d want to reinvent the wheel and risk introducing vulnerabilities.\nFasttrack: A Bumpy Ride # The default configuration has Fasttrack enabled, which is intended to recognize packets belonging to established connections and “fast-track” them for improved performance by skipping firewall rules. However, for me, it had the opposite effect on certain connections. A 90 KB file would suddenly take over 30 seconds to download—reproducibly! Disabling Fasttrack fixed the issue consistently. I brought this up with MikroTik support, and they requested a packet capture, which I provided. Unfortunately, I haven’t heard back since. It’s also worth noting that Fasttrack is only available for IPv4. Since my router is overpowered for my needs anyway, I decided that I don’t need Fasttrack at all and stopped worrying.\nLimited DDNS Support # If you have a changing IPv4 address and IPv6 prefix, DDNS (or sometimes referred to as DynDNS) is the standard solution to get around this by automatically updating your domain’s DNS records whenever an IP address change is detected. Many routers include a utility called DDClient for this purpose, but MikroTik—surprise!—has a proprietary mechanism that only supports their own “cloud service”. I’m sure it works fine and I could simply set up a CNAME if I still wanted to use my own domain, but my personal preference is not to rely on my router vendor to publish IP changes. Thankfully, it’s relatively straightforward to create a custom DDNS script. I’m using he.net’s Free DNS service and updating the WAN IPv4 and IPv6 addresses whenever they change. Here’s the script I wrote for this task.\nRetro UI: A Blast From the Past # It seems like MikroTik is skimping on UI design. Their configuration utility, called WinBox, resembles a mid 90s UI. As someone who grew up in the Windows 95 era, this gives me a strong sense of nostalgia—in a good way, actually. Anyway, it’s worth noting that Ubiquiti’s UIs are much more shiny and polished.\nWinBox: A Windows Affair # Speaking of WinBox, it’s worth mentioning that this software is Windows-only (hence the name?). Yes, it does work fine on Wine, and they even mention this in their official documentation, but it is certainly not a smooth out-of-the-box experience on macOS. There is a 3rd-party app called winbox-mac which bundles Wine and WinBox and helps to mitigate some of the discomfort.\nYou can of course ignore it completely and just use WebFig in the browser, but it has some annoyances such as requiring you to re-login when you open a new tab, or the inability to open multiple windows. The multiple windows feature is the big plus of WinBox. It even stores the window state across reconnects which is quite handy.\nSummary # In conclusion, switching from an EdgeRouter to a MikroTik router has been a rewarding experience for me. The frequent updates of MikroTik’s RouterOS, including the native integration of WireGuard, offer reassurance that the product is continually refined and improved. While there were some quirks to get used to, such as MikroTik’s Not-Invented-Here approach, the overall functionality and performance outweigh these aspects.\nChanges # [Jun 29, 2023] Updated he.net DDNS script to support IPv6. ","date":"May 23, 2023","externalUrl":null,"permalink":"/my-journey-from-edgerouter-to-mikrotik/","section":"","summary":"I switched from an EdgeRouter 4 to a MikroTik CCR2004-16G-2S+ for my home network. I learned that MikroTik also has its quirks, but overall, I’m pleased with the transition. In this post, I will share a few insights I found particularly interesting.","title":"My Journey from EdgeRouter to MikroTik","type":"posts"},{"content":"","date":"May 23, 2023","externalUrl":null,"permalink":"/categories/networking/","section":"Categories","summary":"","title":"Networking","type":"categories"},{"content":"","date":"May 23, 2023","externalUrl":null,"permalink":"/tags/networking/","section":"Tags","summary":"","title":"Networking","type":"tags"},{"content":"","date":"May 23, 2023","externalUrl":null,"permalink":"/tags/vpn/","section":"Tags","summary":"","title":"Vpn","type":"tags"},{"content":"","date":"August 9, 2022","externalUrl":null,"permalink":"/tags/command-line/","section":"Tags","summary":"","title":"Command-Line","type":"tags"},{"content":"This article applies to macOS and iOS only. I haven’t investigated the situation on Android/Windows.\nWhen you save photos or videos from WhatsApp as a file (i.e. on iOS to iCloud Drive, or on macOS using WhatsApp Desktop to your local disk), you might notice that the Exif timestamp will be missing on those files. This can be very annoying when you want to import the photos into your photo library. Not having an Exif timestamp will make Apple Photos (and probably other photo managers, too) use the file’s creation timestamp, which is of course wrong—it’s just the current timestamp. As as result, your imported photos will be out of order.\nLuckily, there is an easy fix if you haven’t renamed your WhatsApp photos yet. ExifTool is a versatile command-line utility for dealing with (probably) any Exif-related problem. Among other things, it can parse the timestamp from the filename.\nThis is still not perfect, though. The timestamp in the filename indicates when the photo or video was received in WhatsApp, not when it was shot. However, this is as good as it gets.\nSteps # First, open Terminal.\nIf you don’t ExifTool have it installed, you can install it via Homebrew:\n$ brew install exiftool Then enter the folder in which you have stored your saved WhatsApp photos/videos. The filenames should look like this when saved from WhatsApp Desktop …\nWhatsApp Image 2022-07-14 at 18.48.47.jpeg WhatsApp Image 2022-07-14 at 18.48.48 (1).jpeg WhatsApp Image 2022-07-14 at 18.48.48.jpeg … or like this when saved or shared on iOS via the iOS Share Sheet:\nPHOTO-2022-07-14-18-48-47.jpg PHOTO-2022-07-14-18-48-48 2.jpg PHOTO-2022-07-14-18-48-48.jpg To have ExifTool create the Exif DateTimeOriginal field based on the filename, run the following command:\n$ exiftool \u0026#34;-datetimeoriginal\u0026lt;filename\u0026#34; * Done!\nAlternatively, if you do not want ExifTool to preserve the original files (with _original suffix), use this command:\n$ exiftool -overwrite_original \u0026#34;-datetimeoriginal\u0026lt;filename\u0026#34; * Verify the Result # On macOS, open one of the images in Preview and hit ⌘ I to bring up the “More Info” window.\nBefore the conversion, there was no Exif tab at all (just “General” and “JFIF”):\nAfter the conversion, the image should now have “Exif” tab including the “Date Time Original” field set the correct date based on the image’s filename:\nSuccess!\nFor videos, this works in a similar fashion. Open the video in QuickTime and also press ⌘ I. The date and time will be shown below the filename:\nSources # https://exiftool.org/forum/index.php?topic=8456.0 https://exiftool.org/forum/index.php?topic=5514.0 ","date":"August 9, 2022","externalUrl":null,"permalink":"/adding-the-correct-date-and-time-for-photos-downloaded-from-whatsapp/","section":"","summary":"When saving media from WhatsApp, it lacks an Exif timestamp which will make your media appear out of order in your photo library. This post explains how ExifTool can be used to create the Exif DateTimeOriginal field from the filename.","title":"Fixing Date and Time for Photos and Videos Saved from WhatsApp","type":"posts"},{"content":"","date":"August 9, 2022","externalUrl":null,"permalink":"/tags/ios/","section":"Tags","summary":"","title":"Ios","type":"tags"},{"content":"","date":"August 9, 2022","externalUrl":null,"permalink":"/tags/whatsapp/","section":"Tags","summary":"","title":"Whatsapp","type":"tags"},{"content":"I recently added a Macintosh SE 1/20 from 1987 to my vintage computer collection. For someone like me who grew up with DOS/Windows (and eventually Linux), and only made the switch to Mac OS X in 2010, it is quite interesting to explore the beginnings of macOS and find out which elements already existed in the early days.\nI was amazed when I learned that the keyboard shortcut for taking a screenshot (Shift + Command + 3) dates back to the initial release of classic Mac OS (called System 1). So I had to try it on my new old Macintosh which was running System 6: And it worked! A file called “Screen 0” was created in the root of my system drive. I copied it over to my M1 MacBook from 2021 and tried to open it. However, it wasn’t mapped to any applications I had installed on my system, and also the file had no extension, making it a bit harder to guess what format it could be.\nSome googling revealed that System 6 takes its screenshots in the ancient MacPaint format. I therefore tried adding the following extensions: .mac, .pntg, .pic to see if that would allow me to open the file in Preview. A Reddit user reported that he had luck with changing it to .pntg, but that doesn’t seem to work anymore.\nIt looked promising as it will add Preview to the “Open With” menu, however, it will just open Preview and stop there.\nThe two options that are in fact working on modern macOS are converting it to PNG using ImageMagick (command-line tool) or opening it in GraphicConverter (shareware GUI application).\nSide note: The MacPaint image format has a fixed size of 576×720 which explains why the screenshots from my vintage Macintosh have some white negative space at the right and at the bottom.\nCommand-Line # You can install ImageMagick via Homebrew:\n$ brew install imagemagick Assuming the screenshot from your vintage Macintosh is called “Screen 0” (without an extension), you can use the following commands to convert it to a PNG file:\n$ convert mac:Screen\\ 0 Screen\\ 0.png Note that the prefix “mac:” will tell ImageMagick which decoder to use. Alternatively, you can rename the file to “Screen 0.mac” beforehand which will have the same effect.\nWorkaround for ImageMagick Bug # There was a bug in ImageMagick that I reported while writing this blog post. The resulting image was somehow scrambled and looked like this:\nTo my surprise, the bug was fixed in less than 30 minutes! Pretty amazing.\nIf you don’t have access to the latest ImageMagick version and still experience this bug, you can use the following workaround.\nFirst, install the netpbm package:\n$ brew install netpbm Then convert the image to PBM (portable bitmap format) and then to PNG:\n$ macptopbm Screen\\ 0 \u0026gt; Screen\\ 0.pbm $ convert Screen\\ 0.pbm Screen\\ 0.png \u0026amp;\u0026amp; rm Screen\\ 0.pbm This will also delete the intermediate PBM file if the PNG conversion was successful.\nGUI Alternative # If you prefer a GUI tool, check out GraphicConverter (shareware).\n# ","date":"July 3, 2022","externalUrl":null,"permalink":"/opening-screenshots-from-a-vintage-macintosh/","section":"","summary":"Apple’s System 6 stored its screenshots in MacPaint format. Learn how to open them in recent versions of macOS.","title":"Opening Screenshots From a Vintage Macintosh in Modern macOS","type":"posts"},{"content":"","date":"July 3, 2022","externalUrl":null,"permalink":"/categories/retro-computing/","section":"Categories","summary":"","title":"Retro Computing","type":"categories"},{"content":"","date":"July 3, 2022","externalUrl":null,"permalink":"/tags/retro-computing/","section":"Tags","summary":"","title":"Retro-Computing","type":"tags"},{"content":"From time to time, it’s a good idea to completely wipe your Mac and start over with a clean system. Then, piece by piece, you only restore the things you actually need from your attached backup disk. However, a challenge with this approach is finding configurations and preferences of certain apps as those can be in various, sometimes hard to find, locations. In the case of WireGuard on macOS, it’s quite simple though—if you know where to look.\nWireGuard stores the full tunnel configurations in the login keychain (not just the private keys). So in order to restore a tunnel, you have to find the login keychain in your backup.\nCheck out this path, relative to your backup drive:\nUsers/$your_user_name/Library/Keychains/ Then follow these steps:\nDouble-click login.keychain-db. It will open in Keychain Access app. Type in “wireguard” in the search box in the upper right. You should now see a list of all your WireGuard configuration profiles. Double-click the one you’d like to restore. Check the “Show password” checkbox—this will ask for the keychain’s password which should be the old user’s system password. Here’s the interesting part: The password field contains the full tunnel configuration, including line breaks.\nClick into the password field (it’s probably showing the string “[Interface]”). Hit Cmd + A and Cmd + C (= select all, copy). Open WireGuard. Click on the plus button in the lower right and select “Add empty tunnel…” Delete everything from the configuration field and paste your clipboard contents. Click “Save”. Enjoy your restored tunnel configurations!\n","date":"April 14, 2021","externalUrl":null,"permalink":"/restoring-the-wireguard-configuration-from-a-backup/","section":"","summary":"On macOS, WireGuard stores its tunnel configurations in the login keychain. This post explains how to extract them from a backup.","title":"Restoring WireGuard Tunnel Configurations From a macOS Backup","type":"posts"},{"content":"I’ve upgraded to macOS 11 (Big Sur) only a few days after it was released in November 2020. Soon I noticed that search in Apple Mail was broken—no matter what I typed into the search box, it would just continue to show all mail that was in my inbox.\nI have two user accounts set up on my machine—one for work, and my personal one. Only my personal account (using Fastmail) was affected. My work account (using Exchange via Office 365) was working just fine from the beginning.\nI decided to wait for the next Big Sur update, hoping that it would solve the issue. However, 11.1 didn’t fix it… And 11.2 didn’t fix it either! So I started my research and found this post in the MacRumors forum that helped.\nApril 18, 2021 update: The issue is back, even after a clean install. Scroll all the way down for another workaround.\nInstructions # Quit all apps (using ⌘ Q), including Mail. Hold the Shift key (⇧) and open Mail. Quit Mail (⌘ Q). Again, hold the Shift key (⇧) and open Mail. Quit Mail (⌘ Q). Restart your Mac. Open Mail (like you normally would, without Shift). Searching should now work again.\nWhy Is This Working? # Holding Shift while opening an app prevents it from restoring the last session. Also, for some apps—I assume this includes Mail—it will launch the app in Safe Mode and will restore certain preferences.\nWhat If This Isn’t Working or Breaks Again? # Some people in the MacRumors thread are reporting that the issue came back for them after a few days. If it does, the following solution might resolve it for good. According to MacRumors user daza4, this is a solution suggested by Apple’s support chat. Other users on the MacRumors thread reported that it helped them, too. Disclaimer: I didn’t try it here. (So far, the issues hasn’t returned for me.)\nGo to System Preferences Click “Spotlight” Remove the checkbox from “Mail \u0026amp; Messages” (screenshot below) Re-check the checkbox This will cause Spotlight to reindex the mailbox. Depending on the size of your mailbox, this may take a while!\nUpdate (April 18, 2021) # The issue has returned! 🤯 I’m on macOS Big Sur 11.2.3 by now and had done a complete(!) re-install a few weeks ago. I did not migrate any settings, but I have, of course, set up the same mailboxes as before, so it re-downloaded all mail from the IMAP server. This brings me to the conclusion that there must be something about my mail that Apple Mail (or Spotlight?) doesn’t like.\nSo today, I’ve tried another workaround today that I’ve found on piunikaweb.com: Restarting the process “corespotlightd”. This has solved the issue for me, but I’m sure it’s—again—just temporary, as I don’t see how this would solve the underlying problem. Still, it is the quickest workaround the I’ve found so far.\nLaunch Activity Monitor Search for “corespotlightd”. Stop the process by clicking the Stop button (see screenshot below). Select “Quit” (not “Force Quit”). The process will restart automatically—this is expected! Once it has re-appeared, try searching in Mail again.\nSources # https://forums.macrumors.com/threads/big-sur-mail-search-is-completely-broken-doesnt-find-anything.2269995/ https://discussions.apple.com/thread/252035294 https://piunikaweb.com/2021/04/02/apple-mail-search-function-in-macos-big-sur-not-working-for-some-users/ ","date":"February 7, 2021","externalUrl":null,"permalink":"/how-to-fix-broken-search-in-mail-after-upgrading-to-big-sur/","section":"","summary":"Upgrading to macOS Big Sur broke search in Apple Mail for me. In this post, I explain different solutions that might fix this.","title":"How to Fix Broken Search in Apple Mail After Upgrading to Big Sur","type":"posts"},{"content":"HEVC (High Efficiency Video Coding), also known as H.265, is a video compression standard that, compared to it predecessor H.264, offers from 25 % to 50 % better data compression at the same level of video quality. Apple’s operating systems natively support HEVC since iOS 11 and macOS High Serria. FFmpeg can create those files, however, a certain tag is needed for the files to be recognized by Apple software.\nTL;DR # Use the -tag:v hvc1 parameter in your FFmpeg command make your HEVC file work on Apple devices.\nFull example:\nffmpeg -i input.avi -c:v libx265 -crf 28 -c:a aac -b:a 128k -tag:v hvc1 output.mp4 My Usecase: Old DV Material in iCloud Photos # I have hours of home video material lying around on my file server, recorded with an ancient Hi8 camcorder back in the 90s. I had digitalized those tapes in 2008 using a more modern Hi8 camcorder with digital output, resulting in DV-encoded AVI files. In this format, 60 minutes need around 13 GB, which is fine for high-quality long-term archival, but not for quick access from everywhere. Since my goal is to import those videos into iCloud Photos, I needed to find a suitable format to transcode to.\nUsing FFmpeg to Convert to HEVC # FFmpeg is the utility when it comes to converting video or audio files. However, when simply using the HEVC encoding command suggested in the FFmpeg H.265 Encoding Guide, you will notice that the resulting video file won’t have a thumbnail icon in Finder and won’t play in QuickTime Player or on any iDevice (it will play in VLC though).\nTo make it Apple-friendly, we’ll need to add an “hvc1” tag. We can do this with the following command (assuming your original file is called input.avi):\nffmpeg -i input.avi -c:v libx265 -crf 28 -c:a aac -b:a 128k -tag:v hvc1 output.mp4 Note: I’m using FFmpeg Version 4.1.1 here. If you’re on an older version, this might not work. You can check your FFmpeg version by running ffmpeg without any parameters.\nThe CRF Value # The number after -crf defines the video quality of the resulting file. In the example above, I have used the default CRF value of 28 (for H.264, the default was 23 which, according to FFmpeg’s encoding guide, should be visually equivalent).\nI suggest you play with this value until you find the best compromise between file size and video quality. The scale goes from 0 (lossless) to 51 (worst quality). I ended up using 22 which, at the cost of a larger file, provides better quality than the default. To determine this value, I encoded a short video clip with different CRF values (e.g. 0 for reference, 20, 22, 25, 31), took screenshots, and compared the stills to the reference until I found the difference to be small enough. I found my sweet spot at 22 where the difference to 20 was so minor that I didn’t find it worth wasting space for only subtle quality improvement. You’re mileage my vary.\nTagging Existing HEVC Files # If you have already converted a bunch of files to HEVC, but forgot to add the tag, don’t worry—you can add the tag after the fact without re-encoding the files:\nffmpeg -i input.mp4 -vcodec copy -acodec copy -tag:v hvc1 output.mp4 The -vcodec copy and -acodec copy arguments will instruct FFmpeg to copy the source streams and not to re-encode them.\nBatch-Convert a Folder # To make this even more useful, you can use the following command that recursively walks over a folder structure to convert all *.avi to HEVC. It will start in the current directory, leaving the original files untouched.\nfind . -name *.avi -exec sh -c \\ \u0026#39;ffmpeg -i \u0026#34;$1\u0026#34; -c:v libx265 -crf 28 -c:a aac -b:a 128k -tag:v hvc1 \u0026#34;${1%.avi}.mp4\u0026#34;\u0026#39; _ {} \\; Further Reading # HEVC output is not playable by QuickTime on macOS 10.13 High Sierra Beta 6 CRF Guide (Constant Rate Factor in x264 and x265) FFmpeg and H.265 Encoding Guide ","date":"March 17, 2019","externalUrl":null,"permalink":"/ffmpeg-hevc-apple-devices/","section":"","summary":"The HEVC (H.265) video codec will produce smaller file sizes at the same level of video quality. FFmpeg can create those files, however, a certain tag is needed for the files to be recognized by Apple software.","title":"Using FFmpeg to Create HEVC Videos That Work on Apple Devices","type":"posts"},{"content":"","date":"October 19, 2018","externalUrl":null,"permalink":"/tags/dev-ops/","section":"Tags","summary":"","title":"Dev-Ops","type":"tags"},{"content":"","date":"October 19, 2018","externalUrl":null,"permalink":"/categories/devops/","section":"Categories","summary":"","title":"DevOps","type":"categories"},{"content":"Ansible Vault is a nice tool that allows you to store sensitive data (such as passwords and application secrets) securely along with your Ansible Playbooks, so you have all your configuration in a single place. Obviously, you don’t want to store unencrypted secrets in your repository, so that’s why Ansible Vault encrypts them with AES-256 encryption by default.\nHowever, a big drawback is that it can easily happen that people forget to re-encrypt the vault file after editing it. You can argue that this shouldn’t happen if you use the ansible-vault edit command: this decrypts the file, opens it in your default editor (based on the $EDITOR environment variable), and takes care of re-encrypting it for you when you’re done editing. When making a lot of changes though, it can be easier to decrypt it with ansible-vault decrypt, load it in your favorite GUI editor, and the manually re-encrypt it when done. Unfortunately, in this case, no one will remind you to perform the last step. Everything will continue to work just fine. This is because your vault is just a regular YAML file that Ansible will accept as a source of configuration variables—encrypted or not.\nWhat Can Go Wrong, Will Go Wrong # Recently, I found an unencrypted Ansible Vault file in one of our Git repositories at work that contained lots of sensitive data. It turned out that four(!) months earlier, someone forgot to re-encrypt it after adding a new private key to it. No one noticed it because all deployment processes continued to work.\nSo whenever something bad happens, I try to think of ways how to improve the workflow to prevent it from happening again. In my point of view, it won’t help to indoctrinate people to never, ever do it again. Instead, I see an incident like this as a flaw in system: it should not have allowed this mistake to happen in the first place.\nGit Hooks to the Rescue # So why don’t we create a Git Hook that ensures that the vault is properly encrypted, and if it’s not, rejecting the commit? I’m certainly not the first one having this idea. As you will notice when searching Google, most people are suggesting a pre-commit hook to tackle this issue. A big advantage of this approach is indeed that the commit is checked on the client, before it is even leaving the developer’s machine. This sounds like what we want, but there is a drawback: We cannot enforce a client-side Git hook. A developer cloning the Git repository will manually need to enable the pre-commit hook before it will be executed, which, again, is something that can be easily forgotten.\nThe pre-receive Hook # So in addition to a client-side hook, we also want to have a server-side hook as a last resort.\nThis could look like this:\nThis will reject the push if it contains files called credentials.yml or matching *vault*.yml. You may want to extend or change this pattern to the file names your team is using.\nThis hook has been battle-tested for more than a month now and will work with paths or filenames containing spaces as well as submodules. Those were two cases I ran into after creating the hook based on some examples I found on GitHub.\nInstallation for GitLab # To install this hook globally on your GitLab server, store the check-vault-encryption script in the /etc/gitlab/hooks/pre-receive.d folder and ensure it is executable.\nWhen done, try pushing something to the server. You should see the following output:\naaron/test - [master] » git push Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 647 bytes | 647.00 KiB/s, done. Total 5 (delta 1), reused 0 (delta 0) remote: [vault-check] Looking for unencrypted Ansible Vault files To www.example.com:aaron/test.git c03c2b4..fb005d3 master -\u0026gt; master And in case you tried to commit something that looks like an unencrypted vault file, it will reject your commit:\naaron/test - [master] » git push Counting objects: 2, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 254 bytes | 254.00 KiB/s, done. Total 2 (delta 0), reused 0 (delta 0) remote: [vault-check] Looking for unencrypted Ansible Vault files remote: ERROR: credentials.yml must be encrypted To www.example.com:aaron/test.git ! [remote rejected] master -\u0026gt; master (pre-receive hook declined) error: failed to push some refs to \u0026#39;git@www.example.com:aaron/test.git\u0026#39; Caveats # This approach isn’t perfect. We should keep the following in mind:\nWhile this will prevent any file matching the specified pattern from being added to the Git repository, the file will still be temporarily stored on the Git server (unencrypted, of course) while it is being checked. This can be a problem. Depending on the size of the data being pushed, the check can take a couple of seconds to complete, delaying all pushes (also those that don’t contain files matching the pattern). This hook relies on the file names. If someone doesn’t adhere to the naming convention, the file won’t be checked. An improvement to this hook could a heuristic that looks for certain patterns within any file being pushed. However, this would further slow down the delay on every push. ","date":"October 19, 2018","externalUrl":null,"permalink":"/prevent-unencrypted-ansible-vaults-from-being-pushed-to-git/","section":"","summary":"Ansible Vault is a nice tool that allows you to store sensitive data (such as passwords and application secrets) securely along with your Ansible Playbooks, so you have all your configuration in a single place. Obviously, you don’t want to store unencrypted secrets in your repository, so that’s why Ansible Vault encrypts them with AES-256 encryption by default.\nHowever, a big drawback is that it can easily happen that people forget to re-encrypt the vault file after editing it. You can argue that this shouldn’t happen if you use the ansible-vault edit command: this decrypts the file, opens it in your default editor (based on the $EDITOR environment variable), and takes care of re-encrypting it for you when you’re done editing. When making a lot of changes though, it can be easier to decrypt it with ansible-vault decrypt, load it in your favorite GUI editor, and the manually re-encrypt it when done. Unfortunately, in this case, no one will remind you to perform the last step. Everything will continue to work just fine. This is because your vault is just a regular YAML file that Ansible will accept as a source of configuration variables—encrypted or not.\n","title":"Prevent Unencrypted Ansible Vaults from Being Pushed to Git","type":"posts"},{"content":"","date":"May 11, 2017","externalUrl":null,"permalink":"/categories/crypto-currencies/","section":"Categories","summary":"","title":"Crypto Currencies","type":"categories"},{"content":"","date":"May 11, 2017","externalUrl":null,"permalink":"/tags/crypto-currencies/","section":"Tags","summary":"","title":"Crypto-Currencies","type":"tags"},{"content":"","date":"May 11, 2017","externalUrl":null,"permalink":"/tags/lua/","section":"Tags","summary":"","title":"Lua","type":"tags"},{"content":"MoneyMoney is a neat banking software for the Mac, mostly targeted to the German market where most banks support the FinTS/HBCI protocol. In addition though, MoneyMoney supports many banks (and similar services such as PayPal) via HTTP-based APIs or—as a last resort—good ol’ web scraping. That’s really great, as it allows you to track virtually all your balances in a single place.\nHowever, what I like most about MoneyMoney are its API and the integrated scripting language: You can roll your own extension with Lua. First, this enables you to write your own import and exports scripts and second—which I find the most interesting—, you can interact with 3rd-party services that aren’t supported out-of-the-box.\nSo, why not add support for Kraken, my favorite crypto coin exchange?\nNot Designed for Crypto Currencies # At first glance, it looks as if you could easily integrate Bitcoin and other crypto currencies. However, at the time of writing, MoneyMoney does not support currencies that require more than two decimal places. So this sadly excludes crypto currencies.\nSecurities to the Rescue # Luckily, what I intended turned out to be much simpler: I just wanted to see the balances from my Kraken account, multiplied by their current Euro prices. Treating them as securities was an easy and elegant solution to the problem.\nAuthentication Using HMAC-SHA512 # Shortly after starting to write my Kraken extension, I realized that I would need HMAC signing with SHA512 to talk to the Kraken API. That’s something most programming languages have libraries for, but it was lacking in the limited Lua environment I was trapped in. After some unsuccessful googling, I nearly gave up, but I decided to give it a last try and wrote an email to the MoneyMoney support. I asked them if they had any idea how I could achieve my goal—without falling back to web scraping, of course.\nThe answer was surprising in a very positive way: The creator of MoneyMoney sent me a link to a test version in which he had just implemented a function called MM.hmac512 (and also MM.base64decode, which I had already done in plain Lua, but gladly replaced right away). Additionally, he sent me a few lines of code that would perform the authorization. Wow!\nOnly a small change to the code was needed and I was ready to make private requests to the Kraken API:\nfunction queryPrivate(method, request) if request == nil then request = {} end local path = string.format(\u0026#34;/%s/private/%s\u0026#34;, apiVersion, method) local nonce = string.format(\u0026#34;%d\u0026#34;, math.floor(MM.time() * 1000000)) request[\u0026#34;nonce\u0026#34;] = nonce local postData = httpBuildQuery(request) local apiSign = MM.hmac512(MM.base64decode(apiSecret), path .. hex2str(MM.sha256(nonce .. postData))) local headers = {} headers[\u0026#34;API-Key\u0026#34;] = apiKey headers[\u0026#34;API-Sign\u0026#34;] = MM.base64(apiSign) connection = Connection() content = connection:request(\u0026#34;POST\u0026#34;, url .. path, postData, nil, headers) json = JSON(content) return json:dictionary()[\u0026#34;result\u0026#34;] end Getting it to Work # Knowing Lua from Rack Extension development (those are virtual instruments for Propellerhead’s Reason), the rest was pretty straight-forward. Shortly after, I could see the balances from my test account:\nGreat success!\nDownload # You can find my extension on the MoneyMoney Extensions page or on GitHub (along with the source code).\nUpdates # Aug 15, 2017: Looks like my work inspired others to write their own crypto currency extensions. Check out the MoneyMoney Extensions page—there are now extensions to support privately-held keys, as well as other exchanges. Yay! ","date":"May 11, 2017","externalUrl":null,"permalink":"/tracking-your-kraken-balances-within-moneymoney/","section":"","summary":"I wrote a MoneyMoney extension in Lua to track crypto currency balances from a Kraken account.","title":"Tracking Your Kraken Balances in MoneyMoney","type":"posts"},{"content":"When you buy MP3s on Amazon, it is likely that they contain a “unique purchase identifier” which can be used to link the MP3 file to your Amazon account.\nStorage Format and Location # This special block of metadata is stored in private frames (PRIV). This makes it harder to be detected and removed, as most MP3 tag editors simply ignore these frames.\nThe files I analyzed had the private frame right in the beginning. They start with the identifier www.amazon.com, followed by some XML data (pretty-printed here):\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;uits:UITS xmlns:xsi=\u0026#34;http://www.w3.org/2001/XMLSchema-instance\u0026#34; xmlns:uits=\u0026#34;http://www.udirector.net/schemas/2009/uits/1.1\u0026#34;\u0026gt; \u0026lt;metadata\u0026gt; \u0026lt;nonce\u0026gt;XXXXXXXX\u0026lt;/nonce\u0026gt; \u0026lt;Distributor\u0026gt;Amazon.com\u0026lt;/Distributor\u0026gt; \u0026lt;Time\u0026gt;1970-01-01T00:00:00.000Z\u0026lt;/Time\u0026gt; \u0026lt;ProductID type=\u0026#34;UPC\u0026#34; completed=\u0026#34;true\u0026#34;\u0026gt;00889326362937\u0026lt;/ProductID\u0026gt; \u0026lt;AssetID type=\u0026#34;ISRC\u0026#34;\u0026gt;GBK3W1000391\u0026lt;/AssetID\u0026gt; \u0026lt;TID version=\u0026#34;1\u0026#34;\u0026gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\u0026lt;/TID\u0026gt; \u0026lt;Media algorithm=\u0026#34;SHA256\u0026#34;\u0026gt;95571b74ab373a50dea2981b58c6712cd7e667e1664c3e7d0c06ff6547f7056f\u0026lt;/Media\u0026gt; \u0026lt;/metadata\u0026gt; \u0026lt;signature algorithm=\u0026#34;RSA2048\u0026#34; canonicalization=\u0026#34;none\u0026#34; keyID=\u0026#34;dd0af29b41cd7d6d82593caf1ba9eaa6b756383f\u0026#34;\u0026gt;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\u0026lt;/signature\u0026gt; \u0026lt;/uits:UITS\u0026gt; (In this listing, I have replaced all strings that were unique in my file with the letter X and altered the timestamp. Note that I did not apply those changes to my audio file.)\nIt is worth noting that there’s no clear-text information about you in it as it would be the case if you had acquired the file from the iTunes Store. Apple’s AAC files contain your name and Apple ID in unencrypted, human-readable form. Luckily, Amazon is less privacy-invasive here, but they of course still have enough information in it to link the MP3 back to your account.\nStripping Private Frames # There’s a Python-based command-line tool called eyeD3 that can remove any type of ID3 frame—also those evil PRIV frames. eyeD3 requires Python 2.6 or 2.7 and can be installed with pip:\n❯ pip install eyeD3 Then you can run the following command strip off all PRIV tags and comments for each of the MP3s in the current folder:\n❯ eyeD3 --remove-frame PRIV --remove-all-comments *.mp3 This leaves all the other meta data intact. Interestingly though, the --remove-all-comments is required here. If you omit it, the MP3 will still differ from the same MP3 bought with a different account (see section Verification).\nVerification # To make sure that there’s no additional information hidden somewhere else in the file (for example as a watermark embedded into the audio data), I bought the same MP3 again from a different account and compared the two files after removing the PRIV frames with eyeD3.\nEt voilà:\n❯ shasum Account_1/02\\ -\\ Cool\\ Blue.mp3 a968cde43019a9e3c6747d750c4f7a8d4cba26da Account_1/02 - Cool Blue.mp3 ❯ shasum Account_2/02\\ -\\ Cool\\ Blue.mp3 a968cde43019a9e3c6747d750c4f7a8d4cba26da Account_2/02 - Cool Blue.mp3 Exact same file! 🎉\nOther Uses of PRIV Frames # There are also uses of PRIV frames that are less evil. For example, Traktor by Native Instruments uses them to store further meta data such as BPM, cue points, beat grids, etc. directly within your audio files. If you like that is another story, of course—but one can argue that it can be useful in many cases.\nFurther Reading # https://mjanja.ch/2013/05/remove-priv-id3-tag-from-google-play-music-mp3s/ https://binblog.info/2013/06/26/amazon-autorip-und-die-wasserzeichen/ (German) ","date":"April 6, 2017","externalUrl":null,"permalink":"/removing-personal-information-from-mp3s-bought-off-amazon/","section":"","summary":"When you buy MP3s on Amazon, it is likely that they contain a “unique purchase identifier” which can be used to link the MP3 file to your Amazon account.\nStorage Format and Location # This special block of metadata is stored in private frames (PRIV). This makes it harder to be detected and removed, as most MP3 tag editors simply ignore these frames.\n","title":"Removing Personal Information from MP3s bought on Amazon","type":"posts"},{"content":" Email # blog@aaron.cc\nGitHub # github.com/aaronk6\nSocial Media # mastodon.social/@aaronk6\ninstagram.com/aaronk_6\n","date":"April 6, 2017","externalUrl":null,"permalink":"/contact/","section":"","summary":"Email # blog@aaron.cc\nGitHub # github.com/aaronk6\nSocial Media # mastodon.social/@aaronk6\ninstagram.com/aaronk_6\n","title":"Contact","type":"page"},{"content":"","date":"April 6, 2017","externalUrl":null,"permalink":"/tags/typo3/","section":"Tags","summary":"","title":"Typo3","type":"tags"},{"content":"The first question that comes to your mind might be: “Who uses guestbooks nowadays anyway?”. Well, personally I don’t, but I maintain two sites that were created in the mid 2000s that have a guestbook installed—and people are still using it. It’s ve_guestbook for TYPO3.\nIn the past years, guestbook spam has become a real issue for me—even though I had been using the captcha TYPO3 extension (screenshot above). Apparently, spam bots have evolved over the years and can now easily circumvent those CAPTCHAs. Suddenly, the guestbooks were flooded with hundreds of spam entries:\nreCAPTCHA to the Rescue # A very popular means for distinguishing humans from bots is Google’s reCAPTCHA. Their newest version—called “Invisible reCAPTCHA”—takes this a step further and usually doesn’t require any interaction to identify you as a human. This might sound a bit scary, but it’s very effective and much more user-friendly than any other CAPTCHA—especially for users who are visually impaired.\nTo be fair, it’s not 100% invisible as it will display its logo and a link to the privacy policy in the bottom right corner. However, since it’s only shown on the guestbook’s “new entry” form, that’s acceptable for me.\nIntegration with ve_guestbook # Luckily, ve_guestbook has hooks that allow you integrate into the “new entry” form and perform additionally error checking in your own TYPO3 extension. Therefore, it was pretty straight-forward to integrate reCAPTCHA without touching any of ve_guestbook’s source.\nYou can download my TYPO3 extension here:\nak_guestbook_recaptcha_0.1.0.zip (6 KB)\nI didn’t do much testing yet but I can confirm that it’s working fine for me with TYPO3 7.6 on two sites. If you’re interested in the source code or have something to contribute, check out my GitHub repository ak_guestbook_recaptcha.\nNote: It’s not on the official TYPO3 Extension Repository yet but I’m happy to publish it there if it turns out to be useful. Let me know in the comment section.\nGetting it up and Running # Follow these steps to protect your guestbook with reCAPTCHA. This assumes you already have ve_guestbook installed.\nGo to https://www.google.com/recaptcha/intro/invisible.html and sign up—you should receive a site key and a secret key Download ak_guestbook_recaptcha_0.1.0.zip Log in to your TYPO3 backend, go to Extension Manager and upload the Zip file Enable “Guestbook Invisible reCAPTCHA” by clicking the little plus sign next to it Finally, add the following TypScript snippet to your setup:\nplugin.tx_akguestbookrecaptcha.settings { site_key = YOUR_OWN_SITE_KEY_HERE secret_key = YOUR_OWN_SECRET_KEY_HERE } Important: Make sure to add your own site key and secret key here.\nYou’re guestbook is now protected with reCAPTCHA. If all went well, you should see this indicator on your “new entry” page:\nPlease note that it’s not required to select a Captcha in the FORM plugin of ve_guestbook. Just leave this blank. My extension will automatically hook into ve_guestbook once it’s enabled.\nDrawbacks # There are a few drawbacks you might want to consider:\nRequires JavaScript to be enabled. Those who have JavaScript disabled on your site won’t be able to add entries to your guestbook anymore. Relies on a third-party service. In case reCAPTCHA goes down (which is quite unlikely though), your visitors won’t be able to post to your guestbook anymore. Google collects data about your visitors. This might be a privacy concern. However, my TYPO3 extension makes sure to only include this script on the page where the guestbook form is included. So it’s at least limited to those who actually intend to add a guestbook entry. Conclusion # Even with the drawbacks outlined above, this is my preferred solution to fight guestbook spam. It’s simple to implement it, effective, and easier to solve than any other CAPTCHA which is a big plus for the site’s usability.\nUpdates # Aug 15, 2017: After having used the TYPO3 extension for a couple of months now, I saw that there’s still some spam coming through. I didn’t had the chance yet to analyze the in greater detail. So if someone has an idea what this could be, please leave a comment below. ","date":"April 6, 2017","externalUrl":null,"permalink":"/using-googles-invisible-recaptcha-to-protect-ve_guestbook-from-spam/","section":"","summary":"The first question that comes to your mind might be: “Who uses guestbooks nowadays anyway?”. Well, personally I don’t, but I maintain two sites that were created in the mid 2000s that have a guestbook installed—and people are still using it. It’s ve_guestbook for TYPO3.\nIn the past years, guestbook spam has become a real issue for me—even though I had been using the captcha TYPO3 extension (screenshot above). Apparently, spam bots have evolved over the years and can now easily circumvent those CAPTCHAs. Suddenly, the guestbooks were flooded with hundreds of spam entries:\n","title":"Using Google’s Invisible reCAPTCHA to Protect ve_guestbook from Spam","type":"posts"},{"content":"","date":"April 6, 2017","externalUrl":null,"permalink":"/categories/web-development/","section":"Categories","summary":"","title":"Web Development","type":"categories"},{"content":"","date":"April 6, 2017","externalUrl":null,"permalink":"/tags/web-development/","section":"Tags","summary":"","title":"Web-Development","type":"tags"},{"content":"Just in case you forgot how this looks.\n","date":"March 18, 2017","externalUrl":null,"permalink":"/the-windows-95-boot-screen-as-an-endlessly-looping-gif/","section":"","summary":"Just in case you forgot how this looks.\n","title":"The Windows 95 Boot Screen As an Endlessly Looping GIF","type":"posts"},{"content":"","date":"March 18, 2017","externalUrl":null,"permalink":"/categories/home-automation/","section":"Categories","summary":"","title":"Home Automation","type":"categories"},{"content":"","date":"March 18, 2017","externalUrl":null,"permalink":"/tags/home-automation/","section":"Tags","summary":"","title":"Home-Automation","type":"tags"},{"content":"openHAB doesn’t have a binding for APC UPS devices. Luckily, there are other ways to integrate them into your openHAB setup.\nIn the following, I’m describing how the exec binding can be used to regularly poll the UPS status using the apcaccess command-line utility.\nThe result will look somehow like this:\nI’m using a APC Back-UPS BX 700VA here—a relatively cheap model with Schuko outlets and a USB connector.\nPrerequisites # APC Back-UPS connected and configured (the apcaccess command needs to work) Working openHAB 2 installation Configuration # We’ll need to add a binding, a thing, various items, and finally an entry in the sitemap.\nBindings # As aforementioned, I’m using the exec binding to poll the status of the apcaccess command-line utility on a regular basis. To install the exec binding, add exec to the binding list in services/addons.cfg.\nExample:\n# A comma-separated list of bindings to install (e.g. \u0026#34;sonos,knx,zwave\u0026#34;) binding = exec Things # To make the UPS status available to openHAB, create a new file called apc.things in your things directory and insert the following line:\nThing exec:command:apc [command=\u0026#34;/sbin/apcaccess -u\u0026#34;, interval=5, timeout=2, autorun=false] The -u parameter will suppress any units (volts, percent, seconds, etc.) This makes parsing of the output much easier.\nNote: The command above assumes that the apcaccess command-line utility is located in /sbin/. Adjust this path if necessary.\nItems # Create a new file called apc.items in your items directory and insert the following contents:\nString APC_Raw { channel=\u0026#34;exec:command:apc:output\u0026#34; } Group gAPC String APC_APC (gAPC) DateTime APC_DATE (gAPC) String APC_HOSTNAME (gAPC) String APC_VERSION (gAPC) String APC_UPSNAME (gAPC) String APC_CABLE (gAPC) String APC_DRIVER (gAPC) String APC_UPSMODE (gAPC) DateTime APC_STARTTIME (gAPC) String APC_MODEL (gAPC) String APC_STATUS (gAPC) Number APC_LINEV (gAPC) Number APC_LOADPCT (gAPC) Number APC_BCHARGE (gAPC) Number APC_TIMELEFT (gAPC) Number APC_MBATTCHG (gAPC) Number APC_MINTIMEL (gAPC) Number APC_MAXTIME (gAPC) String APC_SENSE (gAPC) Number APC_LOTRANS (gAPC) Number APC_HITRANS (gAPC) Number APC_ALARMDEL (gAPC) Number APC_BATTV (gAPC) String APC_LASTXFER (gAPC) Number APC_NUMXFERS (gAPC) DateTime APC_XONBATT (gAPC) Number APC_TONBATT (gAPC) Number APC_CUMONBATT (gAPC) DateTime APC_XOFFBATT (gAPC) String APC_SELFTEST (gAPC) String APC_STATFLAG (gAPC) String APC_SERIALNO (gAPC) DateTime APC_BATTDATE (gAPC) Number APC_NOMINV (gAPC) Number APC_NOMBATTV (gAPC) Number APC_NOMPOWER (gAPC) String APC_FIRMWARE (gAPC) The first item called APC_Raw holds the full output of the apcaccess utility. The other items don’t do anything yet—in the next step, we will create a rule to parse the output and assign values the individual items. The group gAPC is required by the rule, so don’t forget to specify it here.\nNote: If you have a different model than I have, this list might not be 100% correct. Run apcaccess to get a list of parameters available for your UPS, and adjust the list accordingly.\nRules # Create a new file called apc.rules in your rules directory and insert the following contents:\nimport java.io.BufferedReader import java.io.StringReader import java.util.Calendar import java.text.SimpleDateFormat import java.text.ParseException rule \u0026#34;APC: Parse raw output from command-line tool\u0026#34; when Item APC_Raw changed then var output = APC_Raw.state.toString var String line var String[] buffer var String value var bufReader = new BufferedReader(new StringReader(output)) var Calendar cal = Calendar.getInstance() var formatStrings = newArrayList(\u0026#39;yyyy-MM-dd HH:mm:ss Z\u0026#39;, \u0026#39;yyyy-MM-dd\u0026#39;) while((line = bufReader.readLine()) != null) { buffer = line.split(\u0026#39;:\u0026#39;, 2) for (var i = 0; i \u0026lt; 2; i++) { buffer.set(i, buffer.get(i).trim()) } // check if there’s an item for this key (e.g. APC_STARTTIME) var item = gAPC.members.findFirst[name.equals(\u0026#34;APC_\u0026#34; + buffer.get(0))] if (item != null) { value = buffer.get(1) // DateTime item: try to parse date if (item.type == \u0026#39;DateTime\u0026#39;) { var succeeded = false for (String formatString : formatStrings) { try { if (!succeeded) { // no `break` statement in openHAB :( cal.setTime(new SimpleDateFormat(formatString).parse(value)) item.postUpdate(new DateTimeType(cal).toString) succeeded = true } } catch (ParseException e) { } } // String or Number: just update the value } else { item.postUpdate(value)\t} } } end Whenever APC_Raw changes, this rule will process the command’s output and will fill in the individual items with the correctly parsed values (these can be of type String, Number, or DateTime).\nSitemap # Finally, to expose these values, create an additional entry in your sitemap. If you’re using the default sitemap, open the file sitemaps/default.sitemap and add the following:\nsitemap default label=\u0026#34;Home\u0026#34; { // … Frame label=\u0026#34;System Status\u0026#34; { Text label=\u0026#34;UPS [%s]\u0026#34; item=APC_STATUS valuecolor=[APC_STATUS==\u0026#34;ONBATT\u0026#34;=\u0026#34;#FF0000\u0026#34;,APC_STATUS==\u0026#34;ONLINE\u0026#34;=\u0026#34;#008000\u0026#34;] { Text item=APC_MODEL label=\u0026#34;Model [%s]\u0026#34; Text item=APC_STATUS label=\u0026#34;Status [%s]\u0026#34; valuecolor=[APC_STATUS==\u0026#34;ONBATT\u0026#34;=\u0026#34;#FF0000\u0026#34;,APC_STATUS==\u0026#34;ONLINE\u0026#34;=\u0026#34;#008000\u0026#34;] Text item=APC_STARTTIME label=\u0026#34;Start Time [%1$td/%1$tm/%1$ty %1$tH:%1$tM]\u0026#34; Text item=APC_LOADPCT label=\u0026#34;Load [%.1f %%]\u0026#34; Text item=APC_TIMELEFT label=\u0026#34;Time Left [%.1f min]\u0026#34; Text item=APC_LINEV label=\u0026#34;Line Voltage [%.1f V]\u0026#34; Text item=APC_BATTV label=\u0026#34;Battery Voltage [%.1f V]\u0026#34; Text item=APC_BATTDATE label=\u0026#34;Battery Date [%1$td/%1$tm/%1$ty]\u0026#34; } } } As you can see, I haven’t added all available values here. Adjust this to your needs.\nThat’s it!\nBonus: Push Notification On Power Outage # To get a notification on your mobile device whenever the power fails (and also when it returns), configure the pushover binding and add the following rule to your apc.rules:\nrule \u0026#34;APC: Notify power outage/return\u0026#34; when Item APC_STATUS changed then var msg = \u0026#39;\u0026#39; if (APC_STATUS.state == \u0026#34;ONLINE\u0026#34;) { msg = \u0026#34;Power has returned\u0026#34; } else if (APC_STATUS.state == \u0026#34;ONBATT\u0026#34;) { msg = \u0026#34;Power outage detected, remaining battery life: \u0026#34; + APC_TIMELEFT.state + \u0026#34; min\u0026#34; } if (msg != \u0026#39;\u0026#39;) { logInfo(\u0026#34;APC\u0026#34;, msg) pushover(msg) } end Further Reading # https://community.openhab.org/t/how-to-store-output-from-exec-binding-as-numbers/24556 http://docs.openhab.org/addons/actions/pushover/readme.html http://www.marcsblog.de/2015/07/pushover-openhab-benachrichtigt-ueber-das-smartphone/ (German) ","date":"March 18, 2017","externalUrl":null,"permalink":"/integrating-my-apc-ups-into-openhab-2/","section":"","summary":"openHAB doesn’t have a binding for APC UPS devices. Luckily, there are other ways to integrate them into your openHAB setup.\nIn the following, I’m describing how the exec binding can be used to regularly poll the UPS status using the apcaccess command-line utility.\nThe result will look somehow like this:\nI’m using a APC Back-UPS BX 700VA here—a relatively cheap model with Schuko outlets and a USB connector.\nPrerequisites # APC Back-UPS connected and configured (the apcaccess command needs to work) Working openHAB 2 installation Configuration # We’ll need to add a binding, a thing, various items, and finally an entry in the sitemap.\n","title":"Monitoring an APC Back-UPS With openHAB 2","type":"posts"},{"content":"“Quaak” is a simple Frogger clone for Windows from the year 1992. I got it from my father on a 3.5″ floppy disk when I was 6 or 7. I played it on my father’s workstation (at his job) and also at home on his 486 laptop running Windows 3.1.\nThe game has pretty cheap graphics. Still it was a lot of fun to play, especially at that age.\nGetting It Back In 2016 # Today, Quaak is really hard to find on the Internet. Unfortunately, I didn’t have the files anymore. There is some information about it but I couldn’t find any download link. After I searched various abandonware sites without any luck, I tried to buy it via Amazon from a third-party seller—but all they send me was the user guide. No floppy disk! Even though it said so in the product description. Of course it easy to get a refund—and I didn’t even needed to return the manual. But still no QUAAK.EXE for me.\nFinally, I found it on a Swiss auction platform called anibis.ch. The seller was very nice and sold me the game for around €12. Great success!\nFurther Reading # http://www.mobygames.com/game/win3x/bubble-quaak http://www.kultboy.com/testbericht-uebersicht/6242/ (German) ","date":"March 17, 2017","externalUrl":null,"permalink":"/quaak/","section":"","summary":"“Quaak” is a simple Frogger clone for Windows from the year 1992. I got it from my father on a 3.5″ floppy disk when I was 6 or 7. I played it on my father’s workstation (at his job) and also at home on his 486 laptop running Windows 3.1.\nThe game has pretty cheap graphics. Still it was a lot of fun to play, especially at that age.\n","title":"Quaak (1992)","type":"posts"},{"content":"“Rollin” by SAV Creations (published by Ticsoft) was one of the DOS games I played the most as a kid.\nI got it from my grandparents, and I played it with my brothers on their old PC, which had also been a gift from them. I think it was a 386. This was around 1996, when I was 9 or 10 years old. It had a Turbo key that switched between 16 MHz and 40 MHz. If I pressed that key while playing, the game became noticeably slower.\nThat machine did not have a sound card (or at least it was not working), so all I knew for years were the simple beeps from the built-in PC speaker. Only much later I found out that the game actually had a really cool soundtrack.\nI spent so much time with this game that I even dreamt about it. Not in a good way, though. It was a nightmare: I dreamt that I was falling into the purple grid, just like the ball falls off the platform in the game. When I told my mother, she was pretty shocked and thought I was spending way too much time on the computer.\nEven now, I still remember the look and the feeling of those levels very clearly.\nFurther Reading # https://en.wikipedia.org/wiki/Rollin_(video_game) ","date":"March 17, 2017","externalUrl":null,"permalink":"/rollin-1995/","section":"","summary":"“Rollin” by SAV Creations (published by Ticsoft) was one of the DOS games I played the most as a kid.\nI got it from my grandparents, and I played it with my brothers on their old PC, which had also been a gift from them. I think it was a 386. This was around 1996, when I was 9 or 10 years old. It had a Turbo key that switched between 16 MHz and 40 MHz. If I pressed that key while playing, the game became noticeably slower.\n","title":"Rollin (1995)","type":"posts"},{"content":" Diesen Artikel habe ich im Alter von 14 Jahren geschrieben. Er erschien ursprünglich auf meiner damaligen Website win-tricks.de. Die T-Online-Software läuft instabil und ist ressourcenfressend. In früheren Versionen gab es sogar Bugs, die den Benutzer zwangen, eine Internetverbindung herzustellen. Daher ist von dieser Software dringend abzuraten. Die Einwahl ins Internet über T-Online kann auch ohne die Software von T-Online erfolgen, nämlich über das DFÜ-Netzwerk von Windows.\nFolgende Daten sind dafür erforderlich:\nBundesweite Einwahl von T-Online:\nArt der Verbindung Einwahl Modem mit normalem Telefonanschluss 0191011 Modem mit einer Telefonanlage 0,,,0191011 ISDN mit normalem Telefonanschluss 0191011 ISDN mit Telefonanlage 00191011 T-DSL 0 (Keine Einwahl erforderlich) Benutzername (T-Online-Anschlusskennung + T-Online-Nummer + # + Mitbenutzernummer + @t-online.de)\nBeispiel: 0001234567893200123456789#0001@t-online.de\nKennwort (Kennwort für den Internetzugang von T-Online)\nBitte wählen Sie Ihre Windows-Version:\nWindows 95/98/Me (Anleitung für Windows 2000/XP folgt) Windows 95/98/Me # Hinweis: Diese Anleitung wurde für Windows 98 geschrieben, ist aber ebenso auf Windows 95 oder Windows Me übertragbar.\nÖffnen Sie zuerst den Arbeitsplatz. Sollten Sie dort den Ordner \u0026ldquo;DFÜ-Netzwerk\u0026rdquo; vorfinden, können Sie den folgenden Absatz überspringen. Andernfalls müssen Sie das DFÜ-Netzwerk nachinstallieren.\nGehen Sie in die Systemsteuerung (Start -\u0026gt; Einstellungen -\u0026gt; Systemsteuerung) und doppelklicken Sie auf \u0026ldquo;Software\u0026rdquo;. Klicken Sie auf \u0026ldquo;Windows-Setup\u0026rdquo; und wählen Sie aus der Liste den Eintrag \u0026ldquo;Verbindungen\u0026rdquo;. Klicken Sie nun auf die Schaltfläche \u0026ldquo;Details\u0026hellip;\u0026rdquo; und setzen Sie im nächsten Fenster ein Häkchen bei \u0026ldquo;DFÜ-Netzwerk\u0026rdquo;. Schließen Sie nun beide Fenster, indem Sie auf \u0026ldquo;OK\u0026rdquo; klicken. Eventuell wird Windows Sie jetzt dazu auffordern, die Windows-CD einzulegen, um die Dateien fürs DFÜ-Netzwerk zu kopieren. Wenn dies geschehen ist, muss Windows neu starten.\nÖffnen Sie den Ordner \u0026ldquo;DFÜ-Netzwerk\u0026rdquo; im Arbeitsplatz und doppelklicken Sie auf \u0026ldquo;Neue Verbindung erstellen\u0026rdquo;. Geben Sie der Verbindung einen Namen, wie z.B. \u0026ldquo;T-Online\u0026rdquo; und wählen Sie Feld darunter das Gerät, was zur Einwahl verwendet werden soll.\nKlicken Sie nun auf \u0026ldquo;Weiter \u0026gt;\u0026rdquo;. Geben Sie auf der nächsten Seite in das Feld \u0026ldquo;Rufnummer:\u0026rdquo; die bei Ihnen zutreffende Einwahlnummer von T-Online ein (siehe oben). Das Feld \u0026ldquo;Ortsvorwahl\u0026rdquo; wird leer gelassen.\nKlicken Sie anschließend auf \u0026ldquo;Weiter \u0026gt;\u0026rdquo; und auf der nächsten Seite auf \u0026ldquo;Fertig stellen\u0026rdquo;. Jetzt befindet sich ein neues Icon im Ordner \u0026ldquo;DFÜ-Netzwerk\u0026rdquo; mit dem von Ihnen gewählten Namen. Klicken Sie es mit der rechten Maustaste an und wählen Sie \u0026ldquo;Eigenschaften\u0026rdquo;. Entfernen Sie hier das Häkchen bei \u0026ldquo;Ortsvorwahl und Wählparameter verwenden\u0026rdquo;.\nRufen Sie jetzt die Registrierkarte \u0026ldquo;Servertypen\u0026rdquo; auf und entfernen Sie die Häkchen bei \u0026ldquo;Am Netzwerk anmelden\u0026rdquo;, \u0026ldquo;NetBEUI\u0026rdquo; und \u0026ldquo;IPX/SPX-kompatibel\u0026rdquo;.\nKlicken Sie jetzt auf \u0026ldquo;OK\u0026rdquo;. Doppelklicken Sie anschließend auf die soeben erstellte Verbindung. Geben Sie jetzt ihre Zugangsdaten von T-Online ein. Der Benutzername sieht wie folgt aus:\nBenutzername = T-Online-Anschlusskennung + T-Online-Nummer + # + Mitbenutzernummer\nIn diesem Beispiel also: 0001234567893200123456789#0001\nIn das Feld \u0026ldquo;Kennwort:\u0026rdquo; wird nur das T-Online-Kennwort eingetragen. Falls dieses gespeichert werden soll, kann ein Häkchen bei \u0026ldquo;Kennwort speichern\u0026rdquo; gesetzt werden. Andernfalls wird es bei jeder Einwahl ins Internet verlangt.\nKlicken Sie auf \u0026ldquo;Verbinden\u0026rdquo;, um sich einzuwählen.\nWenn die Verbindung erfolgreich hergestellt wurde, erscheint in der Taskleiste das Verbindungssymbol.\nWenn Sie die Verbindung wieder trennen möchten, klicken Sie dieses Symbol mit der rechten Maustaste an und wählen Sie \u0026ldquo;Trennen\u0026rdquo;.\nEs ist empfehlenswert, den Internet Explorer so einzustellen, dass er eine Verbindung zum Internet herstellt, sobald diese benötigt wird. Klicken Sie dazu mit der rechten Maustaste auf das Internet Explorer-Symbol auf dem Desktop und wählen Sie \u0026ldquo;Eigenschaften\u0026rdquo;. Klicken Sie jetzt auf \u0026ldquo;Verbindungen\u0026rdquo; und machen Sie ggf. die Verbindung zu T-Online zur Standardverbindung. Wählen Sie jetzt die Option \u0026ldquo;Immer Standardverbindung wählen\u0026rdquo; und klicken Sie auf \u0026ldquo;OK\u0026rdquo;. Diese Einstellung ist auch bei der Verwendung eines anderen Browsers sinnvoll.\nSobald der Internet Explorer eine Verbindung zum Internet benötigt, wird das folgende Fenster angezeigt.\nGeben Sie erneut Ihre Zugangsdaten ein (wie oben beschrieben). Falls die Verbindung in Zukunft von allein hergestellt werden soll, setzen Sie ein Häkchen bei \u0026ldquo;Verbindung automatisch herstellen\u0026rdquo;. Vorraussetzung dafür ist, dass das Kennwort gespeichert wird.\nDie Verbindung zu T-Online ist jetzt erfolgreich eingerichtet.\n","date":"July 25, 2002","externalUrl":null,"permalink":"/t-online-%C3%BCber-df%C3%BC-netzwerk/","section":"","summary":"Die T-Online-Software läuft instabil und ist ressourcenfressend. In früheren Versionen gab es sogar Bugs, die den Benutzer zwangen, eine Internetverbindung herzustellen. Daher ist von dieser Software dringend abzuraten. Die Einwahl ins Internet über T-Online kann auch ohne die Software von T-Online erfolgen, nämlich über das DFÜ-Netzwerk von Windows.","title":"T-Online über DFÜ-Netzwerk","type":"posts"},{"content":"","date":"July 25, 2002","externalUrl":null,"permalink":"/tags/windows/","section":"Tags","summary":"","title":"Windows","type":"tags"},{"content":" Diesen Artikel habe ich im Alter von 14 Jahren geschrieben. Er erschien ursprünglich auf meiner damaligen Website win-tricks.de. Sogar ein Autorennen haben die Programmierer von Microsoft Excel 2000 im Programm versteckt.\nStarten Sie zuerst Excel 2000. Wählen Sie jetzt \u0026ldquo;Datei\u0026rdquo; und anschließend \u0026ldquo;Speichern unter\u0026hellip;\u0026rdquo;. Geben Sie der Datei einen beliebigen Namen und Ort und wählen Sie bei \u0026ldquo;Dateityp:\u0026rdquo; \u0026ldquo;Webseite (*.htm; *.html)\u0026rdquo; aus. Jetzt haben Sie etwas weiter oben mehr Auswahlmöglichkeiten. Klicken Sie auf \u0026ldquo;Auswahl: Tabelle\u0026rdquo; und setzen Sie einen Haken bei \u0026ldquo;Interaktivität hinzufügen\u0026rdquo;. Klicken Sie jetzt auf \u0026ldquo;Speichern\u0026rdquo;.\nÖffnen Sie die Datei jetzt im Microsoft Internet Explorer und wechseln Sie in die Spalte \u0026ldquo;WB\u0026rdquo; und die Zeile \u0026ldquo;2000\u0026rdquo;. Markieren Sie jetzt die ganze Zeile, indem Sie auf die \u0026ldquo;2000\u0026rdquo; klicken. Drücken Sie einmal auf TAB, so dass Sie sich jetzt in der Spalte \u0026ldquo;WC\u0026rdquo; befinden. Halten Sie jetzt Strg + Shift + Alt gedrückt und klicken Sie auf das Office-Logo oben in der linken Ecke. Nun sollte das Autorennen starten.\nSteuerung:\nLinks / Rechts Pfeiltasten: Links / Rechts Starten / Bremsen Pfeiltasten: Oben / Unten Feuer Leertaste Ölspur O Licht H Spiel beenden Esc / Alt + F4 ","date":"March 2, 2002","externalUrl":null,"permalink":"/autorennen-in-microsoft-excel-2000/","section":"","summary":"Sogar ein Autorennen haben die Programmierer von Microsoft Excel 2000 im Programm versteckt.","title":"Autorennen in Microsoft Excel 2000","type":"posts"},{"content":"","date":"March 2, 2002","externalUrl":null,"permalink":"/tags/excel/","section":"Tags","summary":"","title":"Excel","type":"tags"},{"content":"","date":"March 2, 2002","externalUrl":null,"permalink":"/tags/microsoft/","section":"Tags","summary":"","title":"Microsoft","type":"tags"},{"content":"","date":"March 2, 2002","externalUrl":null,"permalink":"/tags/office/","section":"Tags","summary":"","title":"Office","type":"tags"},{"content":" Diesen Artikel habe ich im Alter von 12 Jahren geschrieben. Er erschien ursprünglich in der „Goldgraben-Zeitung“. Rechtschreib- und Grammatikfehler habe ich bewusst beibehalten. Jetzt kann jeder problemlos seine eigene Homepage einrichten: Überall im Internet wird kostenloser Speicherplatz für eine Webseite angeboten. Kunden von T-Online z.B. haben automatisch die Möglichkeit in wenigen Minuten ihre Webseite auf den Server zu laden. Ein kleines Programm zum Upload und ein weiteres zur Erstellung der Internetseite sind auf der CD-ROM der T-Online-Software. Allerdings sind diese noch nicht sehr ausgereift, aber für eine einfache Homepage sollte es reichen.\nWer eine professionellere Homepage ins Web stellen möchte, sollte sich z.B. bei Tripod (www.tripod.de) oder einem anderen Dienst anmelden. Dies ist auch ein kostenloser Service und bietet mehr Möglichkeiten als T-Online. Man kann bei Tripod eine Homepage mit Frames oder Formularen veröffentlichen, was bei T-Online nicht geht. Dafür benötigt man aber auch ein besseres Programm zur Erstellung. Microsoft FrontPage ist zur Herstellung von Webseiten mit Frames oder Formularen sehr gut geeignet. Für eine etwas einfachere Seite ist auch der kostenlose Microsoft FrontPage Express gut. Damit kann man keine Frames machen, allerdings simple Formulare. Wenn die Homepage fertig ist, kann man sie bei T-Online über den „Homepage-Admin“, der sich auf der T-Online-CD befindet, auf den Server laden. Sie ist dann über http://home.t-online.de/\u0026lt;Ihre T-Online-Nr.\u0026gt;/\u0026lt;Name des Dokuments\u0026gt; weltweit erreichbar. Der Name des Dokuments muss nicht angegeben werden, wenn dieser „index.htm“ oder „home.htm“ lautet. Dann wird Startseite automatisch geladen. Wem diese Adresse immer noch zu lang ist, kann sich neuerdings kostenlos bei FreeDoms (www.freedoms.de) eine Adresse wie z.B. www.IhrName.de besorgen. Allerdings öffnet sich beim Zugriff eines Benutzers ein kleines Werbefenster. Dies passiert auch bei Tripod. Da auch bei Tripod die Adresse der eigenen Homepage auch nicht besonders kurz ist, und man sich dann auch noch bei FreeDoms eine kurze URL holt, kann für den Besucher lästig sein, die vielen Fenster wegzuklicken.\n","date":"July 1, 2000","externalUrl":null,"permalink":"/die-eigene-homepage-im-www/","section":"","summary":"Jetzt kann jeder problemlos seine eigene Homepage einrichten: Überall im Internet wird kostenloser Speicherplatz für eine Webseite angeboten. Kunden von T-Online z.B. haben automatisch die Möglichkeit in wenigen Minuten ihre Webseite auf den Server zu laden.","title":"Die eigene Homepage im WWW","type":"posts"},{"content":"","date":"December 24, 1999","externalUrl":null,"permalink":"/tags/clippy/","section":"Tags","summary":"","title":"Clippy","type":"tags"},{"content":" Diesen Artikel habe ich im Alter von 11 Jahren geschrieben. Er erschien ursprünglich in der „Goldgraben-Zeitung“. Rechtschreib- und Grammatikfehler habe ich bewusst beibehalten. Der Office-Assistent in Office 97 ist Ihnen gerne behilflich. Er schaut Sie freundlich an und wird Ihnen bei allen Problemen mit Word, PowerPoint, Excel usw. helfen.\nKlicken Sie in der Symbolleiste “Standart” auf das Icon, worauf eine gelbe Sprechblase mit einem dunkelblauen Fragezeichen zu sehen ist.\nNun öffnet sich ein kleines Fenster, in dem eine Büroklammer erscheint, die fragt, was Sie tun möchten. Geben Sie in der großen gelben Sprechblase in das Textfeld ein, was Sie wissen möchten. Der Office-Assistent schreibt mit, was Sie eingeben. Wenn Sie fertig sind, klicken Sie auf “Suchen” und der Assistent sucht, was er zu diesem Thema finden kann.\nOder Sie wählen Sie eine der aufgeführten Optionen. Wenn Sie mit Office arbeiten, wird Ihnen auffallen, dass die Fragen oder Fehlermeldungen, die sonst in einem grauen Dialogfeld erscheinen, in der Sprechblase der Büroklammer stehen. Und wenn Sie Ihr Dokument speichern, macht der Assistent schreckliche Verrenkungen, um Ihnen darzustellen, das gespeichert worden ist.\nIst Ihnen die Büroklammer nicht sympathisch? Dann klicken Sie mit der rechten Maustaste auf Sie, und wählen “Optionen…” aus. Nun können Sie auf der Registrierkarte “Katalog” eine andere Figur wie z.B. einen Professor oder einen roten Ball auswählen. Jeder ist vom Charakter anders.\n","date":"December 24, 1999","externalUrl":null,"permalink":"/netter-assistent-in-office-97/","section":"","summary":"Der Office-Assistent in Office 97 ist Ihnen gerne behilflich. Er schaut Sie freundlich an und wird Ihnen bei allen Problemen mit Word, PowerPoint, Excel usw. helfen.","title":"Netter Assistent in Office 97","type":"posts"},{"content":"","date":"December 24, 1999","externalUrl":null,"permalink":"/tags/word/","section":"Tags","summary":"","title":"Word","type":"tags"},{"content":"","date":"July 1, 1999","externalUrl":null,"permalink":"/tags/2yk/","section":"Tags","summary":"","title":"2yk","type":"tags"},{"content":" Diesen Artikel habe ich im Alter von 11 Jahren geschrieben, basierend auf Berichten des Göttinger Tageblatts zum Jahr-2000-Problem. Er erschien ursprünglich in der „Goldgraben-Zeitung“. Rechtschreib- und Grammatikfehler habe ich bewusst beibehalten. Im Jahr 2000 wird es in sämtlichen Rechnern zu Problemen kommen: Keiner weiß genau, ob es eher harmlos sein wird oder so dass gar nichts mehr funktioniert. Bei vielen Computersystemen wird zum Beispiel das Jahr 1999 als \u0026ldquo;99\u0026rdquo; genommen. Deshalb wird im Jahr 2000 logischerweise \u0026ldquo;00\u0026rdquo; angezeigt. Das bedeutet für den Computer 1900. Doch nicht nur bei normalen Computern, wie man sie zu Hause auf dem Schreibtisch stehen hat, kann es Schwierigkeiten geben. Bei Stechuhren, Barcode-Lesern und Filteranlagen wird es auch nicht ganz einfach sein. \u0026ldquo;Embedded systems\u0026rdquo; werden die Bauteile von Experten genannt, die diese Fehler verursachen. Das sind eingebettete Strukturen, die wie ein kleines Zahnrad in einem großen Uhrwerk, für eine einzelne Aufgabe zuständig sind. Das Bundesamt für Sicherheit in der Informationstechnik (BSI) sagt ein Beispiel für ein solches \u0026ldquo;embedded system\u0026rdquo; in einem kleinen Speicherchip in einem Fahrstuhl: Alles funktioniert richtig. Die Bauteile wurden vor einem halben Jahr gewartet. Doch eine kleine Systemuhr in der Elektronik wird im Jahr 2000 von \u0026ldquo;99\u0026rdquo; auf \u0026ldquo;00\u0026rdquo; umspringen. Das Sicherheitssystem glaubt, es wäre das Jahr 1900 und fährt den Fahrstuhl automatisch ins Erdgeschoss, weil, so \u0026ldquo;vermutet\u0026rdquo; das System, ein 100 Jahre lang nicht kontrollierter Fahrstuhl unzumutbar ist. Das könnte in Krankenhäusern, Wolkenkratzern und anderen Hochhäusern schwierig werden. Auch im normalen Haushalt könnten Geräte betroffen sein, in denen eine elektronische Uhr eingebaut worden ist. Elektronische Backöfen, Faxgeräte, Telefone, Musikanlagen, Videorekorden und alles was noch so im Haushalt gibt. Auf der ganzen Welt sind ungefähr 25 Millionen \u0026ldquo;embedded systems\u0026rdquo; im Einsatz.\nAber warum hat nur vorher noch keiner daran gedacht? Es wird so erklärt: Die Programmierer in den siebziger Jahren wollten wertvollen Speicherplatz sparen, indem sie auf die \u0026ldquo;1\u0026rdquo; und die \u0026ldquo;9\u0026rdquo; von z.B. 1985 verzichteten. Aber noch eine andere Möglichkeit gibt es: Die Programmierer hätten es viel besser machen können. Wir Menschen rechnen mit den Ziffern von 0 bis 9. Doch die Computer rechnen im Binärsystem; nur mit 0 oder 1. Hätten die Programmierer Speicherplatz sparen wollen, so wäre eine Datumsangabe sinnvollerweise im Binärsystem und nicht im Dezimal- oder einem anderen noch aufwendigeren Zahlensystem abgespeichert worden. Zum Beispiel beträgt die Anzahl der Tage vom 1.1.1900 bis zum 31.12.1998 genau 35794. In diesem Binärsystem sind das nur 16 Speicherplätze (für den Computer ausgedrückt als 1000101111010010). Der Kalender wäre auf diese Art bis zum Jahr 2079 funktionstüchtig. Anstatt dieser guten Möglichkeit machten viele Programmierer es anders: Sie programmierten das Datum im Format Jahr/Monat/Tag (98/12/31). Dabei wurde jede Ziffer zusätzlich noch wie ein Buchstabe angesprochen und brauchte so acht Speicherstellen. Die entstehende binäre Zahlenfolge belegt 48 Stellen im Speicher. Sogar die neuste Software wie z.B. Microsoft Excel 97 wird Probleme haben. Selbst Windows 98 wird ein Update brauchen. Nach diesem Update sollte alles funktionieren, meint Microsoft.\nLebensmittel erreichen Supermärkte womöglich nicht mehr # Im vergangenen Jahr schickte der Barcode-Leser eines Lebensmittelgroßhändlers in Großbritannien Berge von Dosentomaten auf den Müll. Das kam daher, weil die Aufschrift \u0026ldquo;05\u0026rdquo; von dem Barcode-Leser für 1905 gehalten wurde, obwohl die Tomaten noch bis 2005 haltbar waren. Der Tomatenlieferant merkte das, weil er sich wunderte, wieso so viele Dosentomaten nachbestellt wurden. Was wird wohl passieren, wenn andere Supermärkte auch Probleme bei der Nachbestellung von Lebensmitteln haben?\nProbleme mit Leitungswasser? # In Coffs Harbour, einer Stadt in Australien, wurden die Uhren im Wasserklärwerk zum Test auf den 1. Januar 2000 gestellt. Gut, dass es jetzt schon ausprobiert wurde, denn sonst wäre das Wasser zu einem tödlichen Getränk für die Stadt geworden. Der Grund: Das Computersystem fügte dem Leitungswasser Reinigungschemikalien in völlig falscher Dosierung hinzu.\n","date":"July 1, 1999","externalUrl":null,"permalink":"/computerchaos-im-jahr-2000/","section":"","summary":"Im Jahr 2000 wird es in sämtlichen Rechnern zu Problemen kommen: Keiner weiß genau, ob es eher harmlos sein wird oder so dass gar nichts mehr funktioniert.","title":"Computerchaos im Jahr 2000","type":"posts"}]