Feeds
Recap/Summary of the Digital Market Act workshop in Brussels
This Monday, I was in Brussels to attend a stakeholder workshop for the Digital Market Act (DMA) organized by the European Commission. For those who aren’t familiar with the DMA, it’s a new law that the European Parliament voted on recently and one of its goals is to force interoperability between messaging services by allowing small players the ability to communicate with users from the so-called gatekeepers (e.g., WhatsApp).
I attended this meeting as a representative of KDE and NeoChat. NeoChat is a client for the Matrix protocol (a decentralized and end-to-end encrypted chat protocol). I started developing it with Tobias Fella a few years ago during the covid lockdown.
I learned about this workshop thanks to NLNet, who funded previous work on NeoChat (end-to-end encryption). They put Tobias Fella and me in contact with Jean-Luc Dorel, the program officer for NGI0 for the European Commission. I would never have imagined sitting in a conference room in Brussels, thanks to my contribution to Open Source projects.
I work on NeoChat and other KDE applications as a volunteer in my free time, so I was a minor player at the workshop but it was quite enlightening for me. I expected a room full of lawyers and lobbyists, which was partially true. A considerable amount of attendees were people who were silent during the entire workshop, representing big companies and mostly taking notes.
Fortunately, a few good folks with more technical knowledge were also in the room. With, for example, people from Element/Matrix.org, XMPP, OpenMLS, Open Source Initiative (OSI), NlNet, European Digital Rights (EDRi) and consumer protection associations.
The workshop consisted of three panels. The first was more general, and the latter two more technical.
Panel 1: The Scope, Trade-offs and Potential Challenges of Article 7 of the DMA
This panel was particularly well represented by a consumer protection organization, European Digital Rights, and a university professor, who were all in favor of the DMA and the interoperability component. Simon Phipps started a discussion about whether gatekeepers like Meta should be forced to also interop with small self-hosted XMPP or Matrix instances, or if this would only be about relatively big players. I learned that, unfortunately, while it was once part of the draft of the DMA, social networks are not required to interop. If Elon had bought Twitter earlier, this would have probably been part of the final text too.
From this panel, I particularly appreciated the remarks of Jan Penfrat from the EDRi, who mentioned that this is not a technical or standardization problem, and pointed out that some possible solutions like XMPP or Matrix already exist and have for a long time. There were also some questions left unanswered, like how to force gatekeepers to cooperate, as some people in the audience fear that they would make it needlessly difficult to interoperate.
After this panel, we had a short lunch, and this was the occasion for me to connect a bit with the Matrix, XMPP and NlNet folks in the room.
Panel 2: End-to-End Encryption
This panel had people from both sides of the debate. Paul Rösler, a cryptography researcher, tried to explain how end-to-end encryption works for the non-technical people in the audience, which I think was done quite well. Next, we had Eric Rescorla, the CTO of Mozilla, who also gave some additional insight into end-to-end encryption.
Cisco was also there, and they presented their relative success integrating other platforms with Webex (e.g. Teams and Slack). This ‘interoperability’ between big players is definitively different from the direction of interoperability I want to see. But this is also a good example showing that when two big corporations want to integrate together, there are suddenly no technical difficulties anymore. Cisco is also working on a new messaging standard (which reminds me a bit of xkcd 927) as part of the MIMI working group of the IETF that they have already deployed in production.
Next, it was the turn of Matrix, and Matthew Hodgson, the CEO/CTO at Element showed a live demo of client-side bridging. This is their proposed solution to bridging end-to-end-encrypted messages across protocols without having to unencrypt the content inside a third-party server. This solution would be a temporary solution; ideally, services would converge to an open standard protocol like Matrix, XMPP or something new. He pointed out that Apple was already doing that with iMessage and SMS. I found this particularly clever.
Last, Meta sent a lawyer to represent them. The lawyer was reading a piece of paper in a very blank tone. He spent the entirety of his allocated time telling the commission that interoperability represents a very clear risk for their users who trust Meta to keep their data safe and end-to-end encrypted. He ignored Matthew’s previous demo and told us that bridging would break their encryption. He also envisioned a clear opt-in policy to interoperability so that the users are aware that this will weaken their security, and expressed a clear need for consent popups when interacting with users of other networks. It is quite ironic coming from Meta who, in the context of the GDPR and data protection, was arguing against an opt-in policy and against consent. As someone pointed out in the audience, while Whatsapp is end-to-end-encrypted, this isn’t the case for Messenger and Instagram conversations, which are both also products of Meta. The lawyer quickly dismissed that and explained that he only represented Whatsapp here and couldn’t answer this question for other Meta products. As you might have guessed, the audience wasn’t convinced by these arguments. Still, something to note is that Meta had at least the courage to speak in front of the audience, unlike other big gatekeepers like Microsoft, Apple and Google who were also in the room but didn’t participate at all in the debate.
Panel 3: Abuse Prevention, Identity Management and Discovery
With Meta in the panel again, consent was again a hot subject of discussion. Some argued that each time someone from another server joins a room, each user should consent so this new server can read their messages. This sounds very impractical to me, but I guess the goal is to make interoperability impractical. It also reminds me very much of the GDPR popup, in which privacy-invading services try to optimize using dark patterns so that the users click on the “Allow” button. In this case, users would be prompted to click on the “Don’t connect with this user coming from this untrusted and scary third party server” button.
There was some discussion about whether it was the server’s role to decide if they allow connection from a third-party server or the user’s role. The former would mean that big providers would only allow access to their service for other big providers and block access to small self-hosted instances. The latter would give users a choice. Another topic was the identifier. Someone from the audience pointed out that phone numbers used by Whatsapp, Signal and Telegram are currently not perfect as they are not unique across services and might require some standardization.
In the end, the European Commission tried to summarize all the information shared throughout the day and sounded quite happy that so many technical folks were in the room and active in the conversation.
After the last panels, I went to a bar next to the conference building with a few people from XMPP, EDRi, NlNet and OpenMLS to get beers and Belgian fries.
How platform integration in Qt/KDE apps works
There has been some recent discussions about how KDE applications (or Qt apps in general) should look and feel like outside of the Plasma desktop, particularly in a GNOME environment.
During this discussion I noticed two major disconnects between the involved parties. One of them is technical in nature, where (understandably) not everyone involved has deep knowledge about how Qt and KDE apps work. The other one is cultural in nature, where there’s opposing views about who gets to decide how an application should look and feel like on a given platform.
I can’t do much about the cultural issue, but I can help the conversation by giving some much needed overview of how any of this works on a technical level. Everyone being on the same page technically could help foster a more productive conversation about this complex topic.
First of all it’s important to note that Qt to its core is an abstraction across various plaforms (most important here are Linux, Windows, and macOS, but also to some degree Android and iOS). Whenever possible Qt tries to use the platform’s native facilities to do anything, whether that’s rendering, file dialogs, widget styles etc. This becomes somewhat messy when you consider that “Linux” isn’t exaclty a single, well-defined “platform”. Qt does usually have non-native fallbacks for things like file dialogs and widget styles, but they aren’t necessarily something you want a user to have to see. It’s also important to mention that Qt has two somewhat competing ways of defining UIs, the traditional QtWidgets, and the more recent QtQuick/QML.
There are several somewhat independent pieces involved in how a Qt application looks and feels. Jan Grulich already talked about some of them in the context of GNOME and QGnomePlatform, but there are also things specific to KDE applications that aren’t mentioned.
The first piece is the “Qt Platform Theme (QPT)”. Despite the name it doesn’t have much to do with the visual style. It is responsible for applying settings from the platforms. This for example includes font settings, the double click interval, or whether a file should be openend on single or double click. It also defines how standard dialogs look like, most importantly the file picker dialog, but also dialogs like a color picker. Third, it defines the color palette (QPalette) the application is using. More on that later. Qt itself ships platform themes for non-Linux platforms as well as somewhat generic Linux platform themes for GNOME and Plasma. Notable out-of-tree plugin exist, like plasma-integration which you are using right now if you are on Plasma, the aforementioned QGnomePlatform targeted towards GNOME (and to some degree similar environments), and qt5ct, which isn’t aligned to a specific environment and provides generic control over platformtheme things.
The second, and perhaps most well-known, knob is the widgets style (also called QStyle). It controls the majority of the appearance of a QtWidgets application. Well-known examples include Breeze (the current Plasma default), Oxygen (the KDE4-default), adwaita-qt, as well as built-in styles for Windows/macOS. Qt also comes with a built-in Fusion style. QStyles are implemented using C++ plugins. Whenever the app needs to render some piece of UI, e.g. a button, it defers that to the style plugin. Some style, like e.g. Windows then use platform native APIs to render widgets, others like Breeze draw the widgets from scratch. Application developers can also include custom styles for complete control over the appearance.
The third important concept is QPalette. A QPalette is a set of colors used to draw UI elements. The palette is defined by the platform theme(!). For example Plasma uses this to apply the color scheme set in System Settings. QGnomePlatform uses it to apply Adwaita-like colors. The selected QStyle may (or may not!) use this palette when drawing controls. The application developer can also manually query colors from the palette for drawing custom widgets while still respecting the platform’s wanted colors. A platform theme may only offer a single palette this way, or include light and dark variants, or allow the user to configure arbitrary color sets (like we do on Plasma). It is also possible for application developers to override the system-provided palette, for example to offer an in-app dark mode switch.
For applications using QML there is another relevant component: The Qt Quick Controls 2 Style. For reasons I’m not going to go into QtQuick Controls don’t use QStyle for their styling. Instead they come with their own stying system, which is itself based on QML. In Qt5 QML apps only have a very basic and broken default theme that should never be used. In Qt6 they use Fusion by default.
These are the relevant knobs every Qt app has. Some app developers choose to use them to control the appearance of their apps themselves, but many others leave it to the environment to apply a suitable look and feel. Furthermore, there are some relevant KDE-additions to this that are important to understand.
One such addition is KColorScheme. You can think of KColorScheme as a superset of QPalette, i.e. it provides additonal color roles and thus finer-grained control over colors. When changing the Colors setting in Plasma’s System Settings you are picking a color scheme. This gets applied to QPalette via the plasma-integration QPT, but can also be queried directly by the application developer for custom painting. Contrary to QPalette a KColorScheme is not porgrammatically filled based on plaform values (that happens only on Plasma), but it is a static, textual list of colors. Here we have the first problem for running KDE applications under e.g. GNOME. When running a KDE app on GNOME QGnomePlatform will apply Adwaita colors using QPalette. However, this does not affect colors the application directly pulls from KColorScheme, which unless explicitly configured has a default that resembles Breeze. This means we get mixtures of two different color sets, giving unpleasant results. This is especially noticeable when using a dark system theme combined with the light default colors from KColorScheme.
How do we solve this? Well, I’ve been banging my head against that problem for a while. Short of removing the concept of KColorScheme entirely I see two realistic options, not necessarily mutually exclusive. QGnomePlatform could create a KColorScheme definition with Adwaita-like colors and apply that to the application. If exuted correctly it would likely give very good results, but obviously only on platforms that use QGnomePlatform. The other option would be to programmatically derive a KColorScheme definition from a QPalette, which is likely much harder because KColorScheme is a superset of QPalette, but it would be a generic solution for all platforms.
The second noteworthy thing for KDE applications affects QML apps in particular. I’ve mentioned that QML has a separate theming system compared to QtWidgets. Because maintaining two style definitions for different systems is no joy KDE maintains a “hack” around this. qqc2-desktop-style implements a Qt Quick Controls style that fetches style information from a QStyle, which means all the existing QStyles out there keep working for QML apps. It works amazingly well, until it doesn’t. One of the shortcomings of this approach is that qqc2-desktop-style internally heavily relies on KColorScheme, which makes the aforementioned mismatch between QPalette and KColorScheme much more prominent. Possible solutions are the same as mentioned before.
I hope this gives some much needed overview over technology and terminology of involved components and helps with a productive way forward with addressing the problems we have. You are welcome to join this discussion. There’s some other relevant things to talk about, like icon loading, theming, and rendering, but that’s for another day.
CXX-Qt 0.5 Released
We just released CXX-Qt version 0.5!
CXX-Qt is a set of Rust crates for creating bidirectional Rust ⇄ C++ bindings with Qt. It can be used to integrate Rust into C++ applications using CMake or build Rust applications with Cargo. CXX-Qt provides tools for implementing QObject subclasses in Rust that can be used from C++, QML, and JavaScript.
For 0.5, the focus has mainly been on adding more common Qt types, support for Qt containers types, support for pointer types, and improving inheritance. Simple QML applications can now be written entirely in Rust, including implementing Qt models, without needing any boilerplate C++ code.
Some of the larger developer-facing changes are listed below.
InheritanceThis release introduces new features for interfacing with C++ inheritance from Rust. These allow you to implement subclasses in Rust without needing to write boilerplate C++ code.
When subclassing some Qt classes, you need to call methods of the base class, for example QAbstractItemModel::beginInsertRows, without necessarily overriding those methods in your subclass. A new macro #[cxx_qt::inherit] can be used on extern "C++" blocks to create Rust bindings to those methods inherited from the C++ base class.
There is also an #[inherit] macro that can be used to access signals inherited from the base class. This tells CXX-Qt to skip generating a new Q_SIGNAL and to use the base class version instead.
TypesBindings for more Qt types have been added to cxx-qt-lib:
- QByteArray
- QCoreApplication
- QGuiApplication
- QMargins
- QMarginsF
- QModelIndex
- QPersistentModelIndex
- QQmlApplicationEngine
- QQmlEngine
- QTimeZone
- QStringList
- QVector2D
- QVector3D
- QVector4D
We have also added support for Qt container types:
- QList<T>
- QVector<T>
- QSet<T>
- QHash<K, V>
- QMap<K, V>
QList and QVector can easily be converted from Rust slices and into Rust Vecs.
Many Qt types in cxx-qt-lib now have common Rust standard library traits implemented, such as Default, Display, Debug, PartialEq, Eq, PartialOrd, Ord, and arithmetic operators (Add, Sub, Mul, Div traits).
Cargo features have been added to cxx-qt-lib for easily converting between Qt types and types from widely used Rust crates:
- QColor ⇄ rgb crate
- QUrl ⇄ http and url crates
- QByteArray ⇄ bytes crate
- QDate, QDateTime, and QTime ⇄ chrono and time crates
The code generator now supports pointer types such as *mut T to refer to another Rust QObject in properties, signals, and invokables.
Build SystemThe build system can now register files from the Qt Resource System at build time, so calling a C++ function to initialize them is no longer needed. Likewise, QML types can now be registered at build time, instead of calling qmlRegisterType from C++ code. Together with new bindings for QGuiApplication and QQmlApplicationEngine, there is no longer a need for boilerplate C++ code to launch a QML application from Rust. The API is still evolving and we hope to improve this area in the next release to support the new ahead-of-time QML compilation tools.
For More InformationFind CXX-Qt on our GitHub repository and view our CHANGELOG for more details about the changes.
We also have a book with a getting started guide.
Discussions and contributions are welcome on GitHub!
About KDAB
If you like this article and want to read similar material, consider subscribing via our RSS feed.
Subscribe to KDAB TV for similar informative short video content.
KDAB provides market leading software consulting and development services and training in Qt, C++ and 3D/OpenGL. Contact us.
The post CXX-Qt 0.5 Released appeared first on KDAB.
mark.ie: Creating different styles for subsites within a Localgov Drupal website
We've had lots of requests for changing the design of subsites in LGD. Here's how I'd do it.
Django Weblog: PyCharm &amp; DSF Campaign 2023 Results
We are excited to share the results of the annual Django Developers Survey which was conducted this year in collaboration with JetBrains. Almost 5,000 Django users from 248 countries took the survey which covered a broad list of topics including Django usage, operating systems, libraries, tools, and many other insights.
View the results of the 2022 Django Developers Survey.
If you have feedback on the findings and how to improve the survey in future years please share on the official Django Forum.
Thank you to everyone who participated!
Charles Plessy: If you work at Dreamhost, can you help us?
Update: thanks to the very kind involvment of the widow of our wemaster, we could provide enough private information to Dreamhost, who finally accepted to reset the password and the MFA. We have recovered evrything! Many thanks to everybody who helped us!
Due to tragic circumstances, one association that I am part of, Sciencescope got locked out of its account at Dreamhost. Locked out, we can not pay the annual bill. Dreamhost contacted us about the payment, but will not let us recover the access to our account in order to pay. So they will soon close the account. Our website, mailing lists and archives, will be erased. We provided plenty of evidence that we are not scammers and that we are the legitimate owners of the account, but reviewing it is above the pay grade of the custommer support (I don't blame them) and I could not convince them to let somebody higher have a look at our case.
If you work at Dreamhost and want to keep us as custommers instead of kicking us like that, please ask the support service in charge of ticket 225948648 to send the recovery URL to the secondary email adddresses (the ones you used to contact us about the bill!) in addition to the primary one (which nobody will read anymore). You can encrypt it for my Debian Developer key 73471499CC60ED9EEE805946C5BD6C8F2295D502 if you worry it gets in wrong hands. If you still have doubts I am available for calls any time.
If you know somebody working at Dreamhost can you pass them the message? This would be a big, big, relief for our non-profit association.
New Video: How to Draw Dynamic Figures in Krita
This week, we have released the latest of Ramon’s Krita videos! This time there’s even a Blender file to help you pose figures!
The post New Video: How to Draw Dynamic Figures in Krita appeared first on Krita.
Qt 6 Debugging in Visual Studio and VS Code
Not all Qt developers are using Qt Creator as their main IDE for development. Some of us are using other IDEs, like Visual Studio, Visual Studio Code or CLion, per choice or because a project requires it.
On Windows, with the MSVC compiler, the debugging experience with Qt 6 can be quite frustrating for some Qt types, like QMap, QHash or QVariant. See, for example, the debug variable view for the same project running with Qt Creator (left) and Visual Studio Code (right):
I don’t know about for you but, for me, the VS Code view is gibberish. It was way better with Qt 5, as seen below:
Let’s see how to improve things…
Use the Natvis FrameworkThe Natvis framework allows developers to write custom schemas to help visualize native objects. This is already used by the Qt VS Tools for Visual Studio, with Qt 5 and a Qt 6 specific files. You can download the official Qt natvis files here: Qt VS Tool github.
They are pre-processed and copied automatically by the plugin to %HOME%\Documents\Visual Studio 2022\Visualizers. If you want to use them directly from github, make sure to remove all occurrences of ##NAMESPACE##::.
If you look closely at the size of the file, you can see that the Qt 5 Natvis file is 40.9 KB. The Qt 6 Natvis file is only 18.5 KB, which is not 50% smaller than the Qt 5 — au contraire! This means that a lot of types are not working anymore, most likely because the Qt 5 implementation didn’t work during the migration to Qt 6 due to changes in the underlying data.
Let’s see how far we can improve things here. This blog won’t be about the how (it involved a lot of cursing…), but only about the improvements made to the qt6.natvis file.
ChangesFor developers in a hurry, you can download the updated Natvis file here:
https://github.com/KDAB/KDToolBox/blob/master/qt/qt6_natvis/qt6.natvis
QMap Improvements QMap before QMap afterQMap was already working, but I wanted a nicer view, with [key]: value display.
QHash Improvements QHash before QHash afterQHash was the very reason I started the journey; I just wanted to see something, ideally, like QMap. Unfortunately, it’s not supported on CLion, which is missing support for the CustomListItems Natvis tag.
QMultiHash Improvements QMultiHash (with QHash changes) QMultiHash afterOnce QHash was done, QMultiHash was quite easy. Please note that the view is slightly different from the std::unordered_map equivalent; the Qt version is showing a list of values for one key, while the std version shows a list of (key, value) pairs with duplicated keys. Like QHash, QMultiHash view is not supported in CLion.
QVariant Improvements Static primitives Core templates Core classesAfter looking at the containers, I decided to look at QVariant. Unfortunately, not all types are properly handled, but at least the static primitives, core templates, and most of the core classes are. If the type is unknown, it will show at least the typeId, so the developer can know what is inside the QVariant. The full list is available here: Qt6 Natvis documentation
How to Use this New qt6.natvis File Visual StudioFollow the isntructions here to add a natvis file to your project: Add a .natvis file to a C++ project.
VS CodeWe already discussed it in another blog post: VS Code for Qt Applications – Part 2. Just a quick recap:
- create a launch.json file (that’s the “Debug: Add Configuration…” command)
- Set the visualizerFile property to the qt6.natvis file
This is an example launch.json file that works well with CMake project:
{ "version": "0.2.0", "configurations": [ { "name": "qt6.4.2-msvc", "type": "cppvsdbg", "request": "launch", "program": "${command:cmake.launchTargetPath}", "visualizerFile": "${workspaceFolder}/qt6.natvis", "sourceFileMap": { "C:/work/build/qt5_workdir/w/s": "C:/Qt/6.4.2/Src", "Q:/qt5_workdir/w/s": "C:/Qt/6.4.2/Src", "C:/Users/qt/work/install": "C:/Qt/6.4.2/Src", "C:/Users/qt/work/qt": "C:/Qt/6.4.2/Src" } } ] } Why Not Do the Same As Qt Creator?That’s a good question, and my first attempt at trying to fix this issue was to look at Qt Creator. After all, it’s using the same compiler and debugger. Surely, I can find something I can use. Quoting the documentation:
Qt Creator extends the command line debugger by loading the qtcreatorcdbext.dll extension library into it. The library must be available in the libs\qtcreatorcdbext64 and libs\qtcreatorcdbext32 folder. To install it there, select Qt Creator CDB Debugger Support when you install Qt Creator.
Again, quoting the documentation:
Qt Creator uses Python scripts to translate raw memory contents and type information data from native debugger backends (GDB, LLDB, and CDB are currently supported) into the form presented to the user in the Locals and Expressions views.
That’s the reason why the debugger is slower in Qt Creator (you can disable it from the Debugger->CDB preference page, with the “Use Python dumper” option). Unfortunately, it’s not usable for Visual Studio and VS Code.
ConclusionIt’s unfortunately impossible to go as far as what Qt Creator can do, but the changes to the qt6.natvis file improve the debugging experience quite a lot already, and we are close to feature parity with qt5.natvis. The file is part of our KDToolBox project. KDToolBox is a collection of useful code, scripts and snippets you are free to use; you can download it here:
https://github.com/KDAB/KDToolBox/blob/master/qt/qt6_natvis/qt6.natvis
This file can be used for Visual Studio, VS Code, and CLion IDEs, with the exception of QHash and QMutiHash not working with CLion. If something is missing, send me a note, no promises though.
About KDAB
If you like this article and want to read similar material, consider subscribing via our RSS feed.
Subscribe to KDAB TV for similar informative short video content.
KDAB provides market leading software consulting and development services and training in Qt, C++ and 3D/OpenGL. Contact us.
The post Qt 6 Debugging in Visual Studio and VS Code appeared first on KDAB.
PyCharm: PyCharm 2022.3.3 Is Out!
This build brings better code coverage and support for tox 4.
You can update to this version from inside the IDE, using the Toolbox App, or via snaps if you’re using Ubuntu. You can also download it directly from our website.
In this latest release, we have addressed various bugs and made several improvements to enhance the overall user experience. Here are the most notable fixes and updates:
- PyCharm now bundles Coverage.py v.6.5 for working with Python 3.7 and later, and v.5.5 for working with Python 2.7 and Python 3.6. [PY-41674]
- PyCharm now supports tox 4. [PY-57956]
- It is once again possible to work with Python packages on newer versions of Conda. [PY-58678]
- The Shelf tab doesn’t disappear from the Commit tool window anymore. [IDEA-305906]
- The Check RegExp action no longer results in a false Bad regular expression pattern alert. [IDEA-261269]
- The IDE correctly saves the set Docker WSL distribution option. [IDEA-305901]
Check out the release notes to see all of the resolved issues and share your feedback and report any bugs through our issue tracker. We appreciate your help in improving PyCharm.
PyCharm: PyCharm 2023.1 EAP 5 Is Out!
We are fast approaching the release of PyCharm 2023.1. This new EAP version introduces option to save multiple tool window layouts and improvements to the frontend development experience.
To see what has already been added in PyCharm 2023.1, take a look at our previous EAP blog posts.
The Toolbox App is the easiest way to get the EAP builds and keep both your stable and EAP versions up to date. You can also manually download the EAP builds from our website.
Important! PyCharm EAP builds are not fully tested and might be unstable.
Option to save multiple tool window layoutsIn PyCharm 2023.1, you can save several different tool window layouts and switch between them as needed.
To save a new layout, arrange the tool windows as desired and go to Window | Layouts | Save Current Layout as New. Once you’ve adjusted the arrangement, you can update the current setup using the Save Changes in Current Layout option or save the changes as a new custom layout. You can find the saved layouts in the list under Window | Layouts | Restore Layout – hover over the name of the layout you want to use, and click to apply it.
Option to configure HTML code completionWith PyCharm 2021.3, we changed the way code completion works for HTML. Whenever you type a tag name or an abbreviation in the editor, or invoke code completion, PyCharm shows you relevant suggestions right away. Previously, it would only show them if you typed < first. Some users found this behavior distracting when entering plain text in HTML, so we’ve added an option to disable it. You can find the new option Enable auto-popup of tag name code completion when typing in HTML text in Preferences / Settings | Editor | General | Code Completion.
Notable fixes:- When creating a new SSH interpreter, you can now disable the automatic upload of project files to the SSH server. [PY-55517]
- We fixed a performance problem triggered by recursive TypedDict definitions. [PY-56541]
- For WSL-based projects, especially on Windows 11, the console and debugger now work faster. [PY-58997]
- When a virtual environment is set as a project interpreter, it is activated in the terminal, as it should be. [PY-58930]
These are the most important updates for PyCharm 2023.1 EAP 5. For the full list of improvements, check out the release notes. Share your feedback on the new features in the comments below, on Twitter, or in our issue tracker.
Codementor: Search from a Text file using Language C
Dirk Eddelbuettel: RcppRedis 0.2.3 on CRAN: Maintenance
A new minor release 0.2.3 of our RcppRedis package arrived on CRAN today. RcppRedis is one of several packages connecting R to the fabulous Redis in-memory datastructure store (and much more). RcppRedis does not pretend to be feature complete, but it may do some things faster than the other interfaces, and also offers an optional coupling with MessagePack binary (de)serialization via RcppMsgPack. The package has carried production loads on a trading floor for several years.
This update is fairly mechanical. CRAN wants everybody off the C++11 train which is fair game given that it 2023 and most sane and lucky people are facing sane and modern compilers so this makes sense. (And I raise a toast to all those poor souls facing RHEL 7 / CentOS 7 with a compiler from many moons ago: I hear it is a vibrant job market out there so maybe time to make a switch…). As with a few of my other packages, this release simply does away with the imposition of C++11 as the package will compile just fine under C++14 or C++17 (as governed by your version of R).
The detailed changes list follows.
Changes in version 0.2.3 (2023-03-08)No longer set a C++ compilation standard as the default choices by R are sufficient for the package
Switch include to Rcpp/Rcpp which signals use of all Rcpp features including Modules
Courtesy of my CRANberries, there is also a diffstat report for this release. More information is on the RcppRedis page.
If you like this or other open-source work I do, you can now sponsor me at GitHub.
This post by Dirk Eddelbuettel originated on his Thinking inside the box blog. Please report excessive re-aggregation in third-party for-profit settings.
Send you talks for Akademy 2023 *now*!
Call for proposal ends Thursday the 30th of March
There's still a few weeks, but time is really running out.
I'm sure there's lots of interesting things you have to talk about Qt, KDE, C++, Community Management or other million things so head over to https://akademy.kde.org/2023/cfp/ or over to https://conf.kde.org/event/5/abstracts/ if you want to skip the nicely worded page that encourages you to submit a talk :)
Jelmer Vernooij: The Kali Janitor
The Debian Janitor is an automated system that commits fixes for (minor) issues in Debian packages that can be fixed by software. It gradually started proposing merges in early December. The first set of changes sent out ran lintian-brush on sid packages maintained in Git. This post is part of a series about the progress of the Janitor.
Kali Linux have been running their own instance of the Janitor for the last year, under the kali-bot user on GitLab. Their web site has some excellent documentation explaining how the bot works.
Both projects share some common components - the core janitor codebase, Silver-Platter and the various codemods (lintian-brush and deb-new-upstream). The site and some of the review logic is different for Kali.
The Kali bot has several campaigns:
The last campaign doesn’t exist in the Debian janitor, and pulls in new changes from packages that have been imported from other distributions.
For more information about the Janitor’s lintian-fixes efforts, see the landing page.
Joey Hess: the slink and a half boxed set
Today I stumbled upon this youtube video which takes a retrocomputing look at a product I was involved in creating in 1999. It was fascinating looking back at it, and I realized I've never written down how this boxed set of Debian "slink and a half", an unofficial Debian release, came to be.
As best I can remember, the CD in that box was Debian 2.1 ("slink") with the linux kernel updated from 2.0 to 2.2. Specifically, it used VA Linux Systems's patched version of the kernel, which supported their hardware better, but also 2.2 generally supported a lot of hardware much better than 2.0. There were some other small modifications that got rolled back into Debian 2.2.
I mostly remember updating the installer to support that kernel, and building CD images. Probably over the course of a few weeks. This was the first time I worked on the (old) Debian installer, and the first time I built a Debian CD. I also edited the O'Rielly book that was included in the boxed set.
It was wild when pallet loads of these boxed sets showed up. I think they sold for $19.95 at Fry's, although VA Linux Systems also gave lots of them away at conferences.
Watching the video of the installation, I was struck again and again by pain points, which the video does a good job of highlighting. It was a guided tour of everything about Debian that I wanted to fix in 1999. At each pain point I remembered how we fixed it, often years later, after considerable effort.
I remembered how the old installer (the boot-floppies) was mostly moribund with only a couple people able and willing to work on it at all. (The video is right to compare its partitioning with old Linux installers from the early 90's because it was a relic from that era!) I remembered designing a new Debian installer that was more modular so more people could get invested in maintaining smaller pieces of it. It was yes, a second system, and developed too slowly, but was intended to withstand the test of time. It mostly has, since it's used to this day.
I remembered how partitioning got automated in new Debian installer, by a new "partman" program being contributed by someone I'd never heard of before, obsoleting some previous attempts we'd made (yay modularity).
I remembered how I started the os-prober project, which lets the Debian installer add other OS's that are co-installed on the machine to the boot menu. And how that got picked up even outside of Debian, by eg Red Hat.
I remembered working on tasksel soon after that project was started, and all the difficult decisions about what tasks to offer and what software it should install.
I remembered how the horrible stream of questions from package after package was to deal with, and how I implemented debconf, which tidied that up, integrated it into the installer's UI, made it automatable, and let novices avoid seeing configuration that was intended for experts. And I remembered writing dpkg-reconfigure, so that those configuration choices could be revisited later.
It's quite possible I would not have done most of that if VA Linux Systems had not tasked me with making this CD. The thing about releasing something imperfect into the world is you start to feel a responsibility to improve it...
The main critique in the video specific to this boxed set and not to any other Debian release of this era is that this was a single CD, while 2 CDs were needed for all of Debian at the time. And many people had only dialup internet, so would be stuck very slowly downloading any other software they needed. And likewise those free forever upgrades the box promised.
Oh the irony: After starting many of those projects, I left VA Linux Systems and the lands of fast internet, and spent 4 years on dialup. Most of that stuff was developed on dialup, though I did have about a year with better internet at the end to put the finishing touches in the new installer that shipped in Debian 3.1.
Yes, the dialup apt-gets were excruciatingly slow. But the upgrades were in fact, free forever.
PS: The video's description includes "it would take many years of effort (primarily from Ubuntu) that would help smooth out many of the rough end of this product". All these years later, I do continue to enjoy people involved in Ubuntu downplaying the extent that it was a reskin of my Debian installer shipped on a CD a few months before Debian could get around to shipping it. Like they say, history doesn't repeat, but it does rhyme.
PPS: While researching this blog post, I found an even more obscure, and broken, Debian CD was produced by VA Linux in November 1999. Distributed for free at Comdex by the thousands, this CD lacked the Packages file that is necessary for apt-get to use it. I don't know if any versions of that CD still exist. If you find one, email me and I'll send some instructions I wrote up in 1999 to work around the problem.
Anton Gladky: Boost C++: default for Debian Bookworm will remain 1.74.0
Boost C++ is a popular set of free, open-source C++ libraries that provide developers with powerful tools and functionality to enhance their software development projects. The newest version, 1.81.0, has been available in Debian Bookworm for about a month now, but the default version for boost-dependent packages is still the older 1.74.0.
The transition to the newer library has been postponed due to possible regressions that could take more time to resolve. This means that the default version for boost-dependent packages in Debian Bookworm will remain 1.74.0 until after the release.
If you’re working on your own project, you can use the newest version of Boost C++ (1.81.0) to take advantage of its new features and improvements. Debian Bullseye users can also access Boost C++ 1.81.0 from the bullseye-backports repository.
Thanks Freexian for supporting this effort.
ImageX: International Women’s Day: An interview with the team
This year’s IWD’s theme is #EmbraceEquity. This should remind everyone everywhere about the importance of creating a genuinely inclusive society, challenging gender stereotypes, and calling out biases.
In the ImageX team, we are wholeheartedly aligned with these values and committed to fostering a truly equitable workplace. Even though tech is seen as a male-dominated industry, the Women of ImageX are key drivers behind the success of our organization. In celebration of this year’s day, we’re showcasing some of our team who are leaders in their areas; Mahya Golabi [design], Carol Pettirossi [development], Alla Petrovska [operations], and Kylie Aldridge-Ogden [delivery]. These four women are just a small snapshot of the awesome talent we are fortunate to work alongside everyday at ImageX, with each and every one of our women leading the way in their roles within a male dominated industry.
Getting acquainted: roles and backgroundsTo start, the team shared their roles and how they ended up where they are today:
Carol, Software Architect: “I’m a female Drupal Architect that has been working in the Tech industry for 14 years. I started creating websites back in the day of blogs.
I studied programming in high school which gave me the opportunity to start my tech career before getting a university degree. I love working with sites and platforms, building the best experience for users so they can find information and perform tasks digitally whenever possible.”
Alla, HR & Operations Manager (Ukraine): “ I’ve been with the organization for 6 years already and being an explorer in my soul with a love to connect the right people with each other and make things work, I find ImageX the perfect match for me. It is a place with a multicultural team distributed over the globe where diversity is well represented."
Kylie, Senior Portfolio Director Not-For-Profit: “My passion lives in working with non-profits. I have served on a few Non-Profit boards throughout my career, spending seven years as Director at large for a national non-profit. At ImageX, I oversee the execution of all Project and Support Agreements within the vertical.” Mahya, Lead Designer: “I started with ImageX as a UI designer back in 2018. At that point, the design team only consisted of another designer and me, and there were only a handful of female employees here at ImageX, it’s incredible how that has evolved as we’ve grown.” Talking about the meaning of IWDWe then asked the team why International Women's Day is important to them.
Mahya: “As an immigrant, I believe, recognizing and celebrating the contributions of immigrant women to society can help promote inclusion and reduce stereotypes and prejudices. It can also provide a platform for immigrant women to share their experiences and advocate for their rights.
I think Women's Day serves as a reminder that women, regardless of their background, deserve equal rights and opportunities.”
The importance of diversity in the workplaceWe were curious to know what the group thinks about diversity in the workplace, especially as it’s one of the intrinsic values of our international team.
Carol: “Women, as well as other underrepresented groups, bring diverse skill sets, viewpoints, and experiences to the workplace. Different cultures and experiences are proven to help businesses function better and also improve their processes. Each employee has their individual strengths and potential. Valuing the differences of others is what ultimately brings us all together and can be the secret to a successful, thriving workplace and a fair work culture.”
Mahya: “As a creative person, in my view, diversity brings in creativity and innovation: When people from different backgrounds and with different experiences work together, they bring different perspectives and ideas to the table. This can lead to more creative and innovative solutions to problems.”
Sharing their role modelsMany women have a role model who inspires and drives them toward greatness. So who are the role models for the women of ImageX?
Kylie: “From a professional standpoint, Sheryl Sandberg, the COO of Meta is one role model. I was introduced to her through her book, Lean In, which was recommended to me by a former male boss. Sheryl has a belief that echoes mine — if you’re going to have a family, make sure there is equity in the household. Another role model of mine is Heather Reisman, the CEO of Indigo. She was the first major female CEO in Canada and as an avid reader, I always kept an eye on her work. From a personal standpoint, my role model is my mother. I’ve always had a working mother and as a daughter, that is an amazing thing to witness.”
Mahya: “My mother is a strong entrepreneur who started as a teacher and now owns and directs three schools. She has shown me how to be an independent, strong woman when you are confident, resilient, and self-sufficient.”
Carol: “It would also be my mom. She is a symbol of resilience to me. She had a difficult upbringing and had to stop studying early. However, she overcame the difficulties and after I was born she decided to restart studying and become a nurse. She does night shifts at the hospital but she always enjoyed her job and taught me how important it is to love what you do.”
Alla: “My role model is all Ukrainian women: on the front line of the battlefield, or cultural, political, and social front lines — they all are fighting now for democracy, equity, freedom, and protection of human rights.”
Advice to women at the beginning of their careerIt can be challenging to start a path in a new professional field, especially as a woman. How can women grow professionally and fight gender stereotypes in the workplace?
Alla: “Listen to yourself and seek a role model or mentor. If you fail, learn from it - it is your opportunity to grow, don’t skip reflecting on it, as most likely you’ll fail over the same thing again in the future; have a plan…and a back-up plan.”
Kylie: “Never feel guilty to ask for what you need. While the pay gap is narrowing, more often than not, women who don’t get pay rises that mirror their male peers because they don’t ask for it. Make sure you advocate for yourself. Also, don’t internalize the labels and tropes that women are given in the workplace. For instance, “women are bossy while men are bold” or “women are emotional, men are direct”. We don’t need those, they’re not for us.”
Empowering other women in the workplaceWomen can empower other women, lift them up, and help them grow. Together, they can be an invincible force. The women of ImageX have shared some useful ways they look toto empower other women in the workplace:
Carol: “Providing mentorship and training to develop junior women into senior and leadership roles. Making sure that they are heard and have a seat at the table. Making sure that there is an open communication mechanism for women to report on situations that they feel undervalued or not heard.”
Alla: “Be yourself, accept and respect others individuality; speak openly (everyone has their own strong and weak sides — be open about them); treat everyone fairly; be approachable, offer help and be ready to back up; don’t be afraid of speaking about the failures; celebrate wins together!”
Dinner with three inspirational womenAsking everyone to choose three inspirational women, dead or alive, that they would have dinner with was one of our favourite talking points.
Kylie: “I couldn’t narrow it down to 3 so I have four:
1. Mary Wollstonecraft — She was the leader of the suffrage movement in England. She was fighting to make women people under the law. She was one of the pioneers that laid the groundwork for where we are today;
2 & 3. Gloria Steinem & Ruth Bader Ginsberg — Two feminist icons who have done more for gender equity and advocacy than anyone else. We wouldn’t have half the rights we have now without these two women. They worked together and were longtime allies, you can't have one without the other.
4. Michelle Obama — Who wouldn't want to have lunch with her? She built herself a platform and never took it for granted. She comes across as so humble and down to earth, and yet has this huge and beautiful platform that she uses for positive change.”
Carol: “1. Gloria Maria: She was a black Brazilian journalist that always talked about women being empowered. She represented the black community and had racism and feminism in her agenda. She also traveled around the world reporting different cultures. Can you imagine how wonderful a chat would be with her?
2. Susie Wolff: She is the Director of Formula 1 Academy and a former racing driver. She is now responsible for nurturing female talents in the sport. In such a male dominant field, it would be great to have dinner with her and learn how she deals with the challenges on a daily basis.
3. Helena Rizzo: She is one of the best chefs in the world and the only Brazilian female chef leading a restaurant awarded with a Michelin star. Gastronomy is another field dominated by men and she excels in it. She is also involved in many charity and feminist initiatives.”
How organizations can #EmbraceEquityThe ultimate question that wrapped up our conversation was related to the IWD 2023’s #EmbraceEquity campaign theme. How do the team feel that organizations can create a culture which supports equity?
Kylie: “I read a 2022 study from PwC on Global Workforce Hopes and Fears. The largest workplace cultural contribution to equity that can be done is for a workplace to offer flexibility of schedule. One of the things that ImageX has done well is not only offer that but stand by it — giving their employees a flexible schedule and keep pushing equity forward. At ImageX, we do it without gender labels or bias, so that nobody is penalized.”
Mahya: "In my opinion it should be two areas:
1. Promoting transparency
2. Identify biases in the organization and address them"
Alla: “Organizations can create a culture of equity by embracing it from the top — ensuring equal support and opportunities during the recruitment process; giving equal access to development opportunities upon employment; nurturing a strong sense of belonging to the workplace where differences are celebrated.”
Carol: “Providing an open communication culture where women in any position can admit to past failures and vulnerabilities without being judged. This culture paves the way for other women to have confidence that women in leadership are not super powerful. It helps everyone to understand that you can be yourself, you can fail, you can have feelings. An empowered woman doesn’t mean a Flawless and Perfect woman.”
And That’s a Wrap!We are very grateful to Kylie, Mahya, Alla, and Carol for this wonderful conversation. Hopefully, their insights and answers resonate and shed light on gender equity, diversity, and the need to empower talented women in male dominated industries.
Wishing everyone a Happy International Women's Day!
/sites/default/files/styles/original/public/2023-03/pexels-hasan-albari-1141678%20%281%29.jpg.webp?itok=_BM3l2ya Blog Category ImageX Feature as an event Off IsGated 0 IsDownloadable 0 ImageX Updates NewsMy game was illegally uploaded on Steam
Quick post for this time.
Seems my game, Penance has been uploaded on Steam by someone who I don’t know, completely without my permission. They’re selling my free game and of course I’m not gonna get any money from their sales.
If you stumble on this game outside of this page: https://akselmo.itch.io/penance then it’s not uploaded by me! It’s also very likely those illegal copies are also bundled with malware.
I have done a DMCA claim for the game already.
I’m not going to link the fake link here just in case, but it’s easy to find if you’re curious.
Just know that all my games are on itch.io https://akselmo.itch.io and all the other possible “copies” are fake and not by me. If I make a Steam page for any of my games in future, you will be let know by my Fediverse account and/or this blog.
This also serves as a PSA for fellow gamedevs: Check if your game has been uploaded into some places without your permission! Especially on Steam! I didn’t expect this to happen since uploading on Steam costs money, but someone uploaded it anyway without any permission.
Stay safe out there.
Did you know you can Meta+Ctrl+Scroll to zoom on Wayland?
I didn’t! I just discovered it today while working on fixing a bug. And boy is it awesome! Just hold down the Meta (aka “Super” or “Windows) and Ctrl keys, then scroll. Boom! Note that this only works in a Plasma Wayland session.
We don’t expose this shortcut in the UI right now, so it’s quite hidden and explains why I and probably many others didn’t know about it. We’ll work on improving this.
Mike Driscoll: Python’s Built-in Functions Video Series
I have started producing a new Python video series on Python’s built-in functions. Did you know there are over 70 built-in functions?
Here’s a listing of all the functions straight from the Python documentation:
Here’s the introduction video to my new series on The Mouse vs Python YouTube channel:
But that’s only the introduction.
You want to see a video that explains one of Python’s 70+ built-in functions, right?
I’ve got you covered:
Be sure to subscribe to The Mouse vs Python YouTube channel to get more great Python content. Thanks for watching!
The post Python’s Built-in Functions Video Series appeared first on Mouse Vs Python.