GNUstep is a mature Framework, suited both for advanced GUI desktop applications as well as server applications. The framework closely follows Apple's Cocoa APIs and is portable to a variety of platforms and architectures.Reading this comment really brought back memories of being an Objective-C developer in the early MacOS X days. One thing I lamented in those days was that whatever I wrote was stuck on the Mac and GNUstep gave me hope that it didn't need to be.
High school me used to think how cool Objective-C and Cocoa was and how it was the future. And thanks to the iPhone, for a long time I was right.
But the web won the war for Cross-platform development and most days I'm glad it did.
I’ve been starting on a refactoring of Tanzawa to help improve maintainability.
I’m taking a layered approach where each package is broken down into a data layer (models) at the bottom, queries (data access) above that, application (business logic) above that and finally your views at the top.
The idea being that the top layers can go down the stack, but upper layers can’t go up. I’m not sure if I’m going to enforce it via linting, but I probably will, eventually.
We’ve been using a similar structure at work and once you get used to it, it’s quick to find the code you’re looking for and keeps things tidy. And linting helps enforce it when we forget or want to be lazy. 😀
Plugins can now be enabled and disabled in production (when running in gunicorn/uWSGI) without bringing the server down 😀.
The issue was that only a single process (the one that handled the request) got the plugin dynamically enabled. When the other processes tried to lookup urls/templates from the plugin, it didn't exist as it's not enabled and returned an error.
When enabling or disabling plugins in Tanzawa, for urls to register correctly across all sub-processes, you must restart all processes, not just fiddle with the process that made the request.
The complete changes are in PR #121, but the line of interest is below.
import os import signal os.kill(os.getppid(), signal.SIGHUP)
Where getppid gets the process id of the parent process (gunicorn, uwsgi, etc...) and sends it a HUP signal.
For decades, the development of information technology has been characterized by a very strong growth orientation, which is now coming to an end with the fading of Moore's Law and environmental change. Academic research in computing has only recently begun to wake up to the fact that there are limits to growth, and that a more fundamental paradigm shift is required to achieve sustainable computing; mere technical tinkering is not enough.
Growth-centricity has also dictated the development of digital esthetics, which will thus need to change as well. I suggest that the guidelines for this change should be sought in subcultures of computer art whose esthetic ideals are very different from the mainstream Maximalism and Virtualism – the self-serving glorification of the big and plentiful and the hiding of the technical basis of things. I have chosen demo art, chip music, pixel graphics and glitch art as examples of these subcultures. The ideals of "digitality" are also being challenged by post-digitality, so I will also look at these subcultures through this concept.
I will conclude with reflections on the possible impacts of environmental change on digital esthetics and computing more generally, and on the ways in which computer art subcultures could play a pioneering role in these developments.I haven't actually read all of this, but from what I have I'm completely on board. Mostly a reminder for myself to finish reading this.
SerenityOS is a love letter to ’90s user interfaces. Andreas Kling demos some of the best aspects of his new operating system.Maybe it's just nostalgia, but SerenityOS looks great. As the big OSes integrate into opaque web services, the mental model of your PC has become too complex. In many ways it feels like usability is getting worse. SerenityOS is such a breath of fresh air.
Commuting with noise canceling ear buds, in my case AirPodPros, changes the experience entirely. Just putting them in transports you to a quiet, peaceful place. When you take them out and your eardrums get assaulted by the noisy world is when you realize, you can’t go back.
I've been blocked with Tanzawa development for a while as I mull how to simultaneously use Tanzawa to make my own unique site and let it be flexible enough for others without making them adapt to everything I do. If someone else is using Tanzawa to power their site, I want it to be an expression of them, not me.
I recently figured out the answer to allow this: plugins.
Inspired by @maique's Tanzawa Love post, I finally sat down and started working on what plugins might look like. Ideally a plugin should be able to customize or extend anything anywhere, but I'm starting small: adding things to public pages.
This is the first plugin: a widget to display the current localtime in the top nav.
I imagine the capabilities growing over time. I'd like to let plugins store and manage data (e.g. settings), let them schedule periodic work ( e.g. call this api every hour and do something ), and maybe even run background tasks. But for now they're simple. Thank you for the inspiration @maique!
At the office.
I'd donate to you for a theme decoupling. This is high on my list! :)I appreciate the sentiment 😃. It's not money that's preventing me, it's time.
I've been thinking about how to handle theming for Tanzawa properly. It's a big task, but not impossible. There's 2 different ways to think of theming: 1) css only changes theme support, 2) complete theme support (i.e. colors and layout). The move from css only changes wouldn't be much less work than allowing full customization.
Roughly here's what I think would be required:
- Extract all mentions of tailwind colors from templates/public (e.g. bg-negroni-700 ) and replace them with a common name – perhaps role based?
- Create a record / setting somewhere ( django-admin?) to track the active theme.
- Create a custom template loader (or other shim) that will prioritize rendering with the selected theme's public themes.
- Set Tanzawa to only include the css of the selected theme.
- Document how to make a custom theme.