I got an interesting problem to solve the other day. A few friends have a local radio show and we want to put the recordings of it online. Of course, there are very different rules on how music can be played on radio as opposed to how is can be shared in a downloadable/podcast format so we have to remove the music from the recording. I offered to help with that, started up Audacity and got to work.
It was quickly very clear to me though, that at least in theses particular recordings, it was obvious just by looking at the wave forms where the music was. So I thought.. if I can see it, the computer can see it. And then instead of doing the work I was supposed to, I set off to solve the problem in code.
I think the work of removing all the music from all the audio files manually would have taken a couple of hours. But I opted for spending a couple of days rather to solve it.
This is a simple website, written in Django, using django-q to distribute the work to workers when there is any real work to do (as it is quite heavy to remove the music from hours of radio and my free Heroku tier would be eaten up pretty fast, the worker is an old mac-mini running Linux. It’s not fast, but it gets the work done. Eventually). The files are stored on IBM Object Storage while being processed.
The algorithm I came up with for removing music is quite simple and works for the radio recordings I had. It may work for others but there has been no extensive testing. Feel free to try it out.
I made a small game a while back. I made it in C++, since well, that is how things get done, and all was fine. Until I wanted to change stuff in it and it all just became complicated (my code was a bit of a mess). So I tried out Unity, Unreal and Godot, and in the end settled on using Godot.
So here it is. A small math puzzle I made when thinking of ways to help my daughter with her math.
The game is a bit more complex than it needs to be (implementation wise), but I wanted to test making a networked game. So this game is running in a browser but has a server backend (also written in Godot) that is running on IBM Cloud Engine and that in turn has a database/API written in Django-REST on pythonanywhere. In theory, this should all scale pretty well if that would ever be needed 🙂
If you feel like playing it, just log in with whatever username you want and a password. If the username doesn’t exist a user is created. Else you just get an error so you have to chose another name. Then select a game and play. The highscores are live, so your see how you are doing compared to everyone else that has played.
Moved the "Show All" checkbox to a menu
Added a "Stay on top" menu item
Fixed github issue 25 - Deleting of creation date
Added version information in Mac Build / Bundle
Added ability to change what character is used for "NOT" in search
Add a due: or t: if using a rec: without any due: or t:
* Undo/Redo support
* Bug: Search string could not include multiple spaces
* Qt 5.15.0
* Added possibility to remove duplicate lines (the mobile client I use for todo.txt has started adding doublets)
* Bug: Title not updated when automatic refresh
The new rec: feature has been a great addition to how I use my todo-lists and I am using it quite a lot. Probably a bit more than I should be, but it’s nice with reminders “sneaking in” to the todo-list like they do using this feature, as I am not a very big fan of reminders popping up in my phone.
I though just thought of a little use-case I would like to have for things I want to be reminded of, but not all the time. Like for example working on Todour. I don’t have a schedule for it and I don’t want one, but it would be an idea having it pop up a bit randomly (I have lots of small projects that I would like to have like that).
Anyway, I added the “p” (as in procrastination) to the rec: key just now in my development branch and it’s actually pretty neat. Example:
Work with +todour t:2019-01-30 rec:15p
This line will show up at 30/1 due to the threshold and the rec: switch will create a line just like this one when I cross out this line. The new date in t: will now be the finished date + 1-15 days. So somewhere in the coming 15 day it will pop up again.
I don’t know if this is actually useful, and it’s completely non-standard of course, but it was easy to do and now it’s there to be delivered in the next version.
This is the first Linux build since 2.02 that gets distributed. There is a debian package and a .tar.gz on the download page. I have been using a Linux build all the time since 2.02 and it is working very well, I have just never bothered learning how to do a .deb packaging. Now I did 🙂
Note that if you are updating, this version will automatically check for updates ca once per week. If you’d rather not have that happen, there is a setting to turn that off.
Added a Show All checkbox that shows the contents of the entire done.txt as well. Good for checking old stuff. Note searching will be slow if you have a big done.txt file
Added possibility to use a tray icon. When the application is closed and tray icon is active, the application is minimized to tray instead. To quit, use the menu in the tray.
Added support for coloring due: tagged lines depending on date.
Added support for same shorthand with due: dates as with thresholds. Thus due:+2d will set the due date to 2 days from now. due:+3w is three weeks from now and so on.
Title now shows how many rows are shown of total entries
Checking for updates is now more visible (and selectable). Of course, no data is ever sent. Just check a version.
Added a ‘hidden’ feature of procrastination. Either use due: or t: with the usual shortform and ‘p’ and todour will change the date to a random number of days up to the number you specify.
Example: t:+10p will put a date in the coming 10 days. And it will also add a ‘+procrastinated’ tag, so you know you maybe shouldn’t procrastinate the task again 🙂
Privacy & Cookies Policy
Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.
Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.