Feeds
Python Bytes: #390 Coding in a Castle
Junichi Uekawa: July.
roose.digital: Tips for creating calculators in Drupal using Webforms and the Computed Twig element
Tryton News: Newsletter June 2024
In the last month we focused on speeding-up performance issues, fixing bugs and improving the behaviour of things - building on the changes from our last release. We also added some new features which we would like to introduce to you in this newsletter.
For an in depth overview of the Tryton issues please take a look at our issue tracker or see the issues and merge requests filtered by label.
Changes for the User Sales, Purchases and ProjectsWe use a dedicated Web Shop-page on the product form which contains web shop related fields.
We’ve added relates from sale and purchase lines to their stock moves and invoice lines.
Purchase and sale amendments now allow to update the secondary unit of its lines.
Now Tryton deletes a purchase request when its related product is deleted. Previously such a purchase request was kept in the system, but we decided that is better to remove it.
Accounting, Invoicing and PaymentsPayments with zero amount are allowed again in the system. This allows to correctly handle full refunds for some payment gateways that use zero amounts on them.
Stock, Production and ShipmentsWhen counting inventories with lots we now also show the lot in addition to the product, as a product may have many lots.
User InterfaceSao now uses a grid to display trytond.model.fields.Dict items to add more flexibility.
To make Tryton more accessible we now make the contents of the message-dialog selectable and copiable.
Data and ConfigurationWe improved the user experience when importing CSV data. This eases the adoption of Tryton by lowering the barrier to load initial data in to the system. Here is a list of the relevant changes:
- The import wizard does no longer close the import window on error.
- Error messages include row and column numbers to ease the manual error correction.
- We raise an user error when the import data has a different number of columns as defined in the import wizard.
The CSV export also got new features. It now supports different languages per column in one export. This is specially useful when working with translatable master data like for example product names.
We now replace the “Accounting Party” user access group by the “Accounting” user access group. There is no need to limit accounting fields from party to a specific group by default.
New DocumentationThe ldap_authentication module is now documented.
Did you know, that a Model._rec_name must point to a trytond.model.fields.Char field?
New ReleasesWe released bug fixes for the currently maintained long term support series
7.0 and 6.0, and for the penultimate series 7.2.
We added a new configuration section [report] with option convert_command to be able to use a different document converter.
Now the trytond-admin command validates the email-value. The interactive email input loops until a valid email address is entered.
Changes for Implementers and DevelopersWe added the option --export-translations to the trytond-admin command. It exports the translation of any activated module to their respective locale folder.
1 post - 1 participant
Specbee: Why Stylus is more flexible than SCSS and how to implement it in Drupal
Zato Blog: Understanding API rate-limiting techniques
Enabling rate-limiting in Zato means that access to Zato APIs can be throttled per endpoint, user or service - including options to make limits apply to specific IP addresses only - and if limits are exceeded within a selected period of time, the invocation will fail. Let's check how to use it all.
API rate limiting works on several levels and the configuration is always checked in the order below, which follows from the narrowest, most specific parts of the system (endpoints), through users which may apply to multiple endpoints, up to services which in turn may be used by both multiple endpoints and users.
- First, per-endpoint limits
- Then, per-user limits
- Finally, per-service limits
When a request arrives through an endpoint, that endpoint's rate limiting configuration is checked. If the limit is already reached for the IP address or network of the calling application, the request is rejected.
Next, if there is any user associated with the endpoint, that account's rate limits are checked in the same manner and, similarly, if they are reached, the request is rejected.
Finally, if the endpoint's underlying service is configured to do so, it also checks if its invocation limits are not exceeded, rejecting the message accordingly if they are.
Note that the three levels are distinct yet they overlap in what they allow one to achieve.
For instance, it is possible to have the same user credentials be used in multiple endpoints and express ideas such as "Allow this and that user to invoke my APIs 1,000 requests/day but limit each endpoint to at most 5 requests/minute no matter which user".
Moreover, because limits can be set on services, it is possible to make it even more flexible, e.g. "Let this service be invoked at most 10,000 requests/hour, no matter which user it is, with particular users being able to invoke at most 500 requests/minute, no matter which service, topping it off with per separate limits for REST vs. SOAP vs. JSON-RPC endpoint, depending on what application is invoke the endpoints". That lets one conveniently express advanced scenarios that often occur in practical situations.
Also, observe that API rate limiting applies to REST, SOAP and JSON-RPC endpoints only, it is not used with other API endpoints, such as AMQP, IBM MQ, SAP, task scheduler or any other technologies. However, per-service limits work no matter which endpoint the service is invoked with and they will work with endpoints such as WebSockets, ZeroMQ or any other.
Lastly, limits pertain to with incoming requests only - any outgoing ones, from Zato to external resources - are not covered by it.
Per-IP restrictionsThe architecture is made even more versatile thanks to the fact that for each object - endpoint, user or service - different limits can be configured depending on the caller's IP address.
This adds yet another dimension and allows to express ideas commonly witnessed in API-based projects, such as:
- External applications, depending on their IP addresses, can have their own limits
- Internal users, e.g. employees of the company using VPN, may have hire limits if their addresses are in the 172.x.x.x range
- For performance testing purposes, access to Zato from a few selected hosts may have no limits at all
IP-based limits work hand in hand are an integral part of the mechanism - they do not rule out per-endpoit, user or service limits. In fact, for each such object, multiple IP-using limits can be set independently, thus allowing for highest degree of flexibility.
Exact or approximateRate limits come in two types:
- Exact
- Approximate
Exact rate limits are just that, exact - they en that a limit is not exceeded at all, not even by a single request.
Approximate limits may let a very small number of requests to exceed the limit with the benefit being that approximate limits are faster to check than exact ones.
When to use which type depends on a particular project:
-
In some projects, it does not really matter if callers have a limit of 1,000 requests/minute or 1,005 requests/minute because the difference is too tiny to make a business impact. Approximate limits work best in this case.
-
In other projects, there may be requirements that the limit never be exceeded no matter the circumstances. Use exact limits here.
Alright, let's check how to define the limits in the Zato Dashboard. We will use the sample service below:
# -*- coding: utf-8 -*- # Zato from zato.server.service import Service class Sample(Service): name = 'api.sample' def handle(self): # Return a simple string on response self.response.payload = 'Hello there!\n'Now, in web-admin, we will configure limits - separately for the service, a new and a new REST API channel (endpoint).
Points of interest:
- Configuration for each type of object is independent - within the same invocation some limits may be exact, some may be approximate
- There can be multiple configuration entries for each object
- A unit of time is "m", "h" or "d", depending on whether the limit is per minute, hour or day, respectively
- All limits within the same configuration are checked in the order of their definition which is why the most generic ones should be listed first
Now, all is left is to invoke the service from curl.
As long as limits are not reached, a business response is returned:
$ curl http://my.user:password@localhost:11223/api/sample Hello there! $But if a limit is reached, the caller receives an error message with the 429 HTTP status.
$ curl -v http://my.user:password@localhost:11223/api/sample * Trying 127.0.0.1... ... < HTTP/1.1 429 Too Many Requests < Server: Zato < X-Zato-CID: b8053d68612d626d338b02 ... {"zato_env":{"result":"ZATO_ERROR","cid":"b8053d68612d626d338b02eb", "details":"Error 429 Too Many Requests"}} $Note that the caller never knows what the limit was - that information is saved in Zato server logs along with other details so that API authors can correlate what callers get with the very rate limiting definition that prevented them from accessing the service.
zato.common.rate_limiting.common.RateLimitReached: Max. rate limit of 100/m reached; from:`10.74.199.53`, network:`*`; last_from:`127.0.0.1; last_request_time_utc:`2020-11-22T15:30:41.943794; last_cid:`5f4f1ef65490a23e5c37eda1`; (cid:b8053d68612d626d338b02)And this is it - we have created a new API rate limiting definition in Zato and tested it out successfully!
More resources➤ Python API integration tutorial
➤ What is an integration platform?
➤ Python Integration platform as a Service (iPaaS)
➤ What is an Enterprise Service Bus (ESB)? What is SOA?
Ben Hutchings: FOSS activity in June 2024
- I continued participating in Debian kernel team meetings.
- For initramfs-tools:
- I reviewed several more merge requests and merged some of them.
- I released version 0.143 and uploaded it to Debian experimental.
- For the Debian firmware-free package:
- I responded to an update on the bug report “firmware-linux-free uses prebuilt blobs instead of building from source” and the accompanying merge request “Build some firmware files from source”.
- I split off the new issue into a separate bug report “firmware-free: Incomplete source for carl9170-1.fw”, and merged the MR.
- I made some other necessary changes to the package and uploaded version 20240610-1 to unstable.
- For the Debian linux package:
- I responded to the following bug reports:
- linux: ext4 corruption with symlinks I bisected this and (re-)reported it upstream. I tested the upstream fix for this, but it hasn’t yet been applied.
- I answered questions about its required build environment.
- I uploaded:
- linux version 6.9.2-1~exp1 to experimental.
- linux version 4.19.316-1 to buster-security, for which I issued DLA 3840-1.
- linux-5.10 version 5.10.218-1~deb10u1 to buster-security, for which I issued DLA 3843-1.
- I issued DLA 3841-1 and DLA 3842-1 for the earlier uploads of linux-5.10 that I had failed to announce.
- I reviewed and merged the following merge requests:
- I opened merge requests:
- I started a backport of Linux 6.1 to bullseye, for when bullseye enters LTS and bullseye-backports is closed.
- I responded to the following bug reports:
- For the Debian linux-base package:
- Following discussion on a systemd merge request and in a kernel team meeting, I added the linux-sysctl-defaults package to provide a default sysctl configuration independent of which init system or kernel packages are used. I also requested that procps Depend on or Recommend it.
- I updated the debian/copyright file and fixed most of the open bugs.
- I uploaded version 4.10 and version 4.10.1 to unstable.
- For the Debian firmware-nonfree package:
- I finished reviewing and merged Diederik de Haas’s major (non-upstream) update to firmware-nonfree.
- I uploaded version 20230625-3~exp1 to experimental, but it was auto-rejected. I fixed a lintian override to satisfy the older lintian version on ftp-master, then uploaded version 20230625-3~exp2.
- I merged my changes to support and use wildcards in file lists.
- Diederik’s changes included package splits that could cause file loss in conjunction with the /usr-move in this release cycle. I applied Helmut Grohne’s fix from the above bug report, then uploaded version 20230625-3~exp3 to unstable.
- I prepared an update to the latest upstream version.
Ben Hutchings: FOSS activity in May 2024
- For the Debian kernel security tracker:
- I implemented some static checks in CI.
- I continued work on automated handling of kernel CVEs, but it is still not quite ready to merge.
- I implemented improved reporting on top of those changes.
- For the Debian linux package:
- I reviewed and merged the following merge requests:
- Update to 6.8.X + 6.8.X-rtY
- [arm*,riscv64] drivers/pps/clients: Enable PPS_CLIENT_GPIO as module
- [arm64,riscv64] drivers/leds/rgb: Enable LEDS_GROUP_MULTICOLOR and LEDS_PWM_MULTICOLOR as modules
- [arm64] Further improve support for SolidRun HoneyComb
- sound: Enable TAS2781 Smart Amp modules
- [arm64] net/rfkill: Enable RFKILL_GPIO as module
- [arm64] Increase max CPU count to 512
- Enable SND_VIRTIO as module
- d/templates: Change firmware-linux-free from Recommends to Suggests
- I reviewed but did not merge:
- I responded to the following bug reports:
- I opened my own merge requests:
- I uploaded:
- linux-5.10 version 5.10.216-1~deb10u1 to buster-security.
- linux version 6.1.90-1~bpo11+1 to bullseye-backports.
- linux version 6.7.12-1~bpo12+1 to bookworm-backports.
- linux version 6.8.9-1 to unstable.
- I reviewed and merged the following merge requests:
- I attended the mini-DebConf in Berlin and very much enjoyed it. Thanks to all the organisers, volunteers and presenters.
- I supported Salvatore Bonaccorso’s proposal of regular kernel team meetings, and attended the first one.
- I answered Andreas Tille’s questions about the kernel team.
- I uploaded ktls-utils version 0.10-1 to unstable.
- I uploaded wireless-regdb version 2024.05.08-1 to unstable.
- I reviewed all open merge requests for initramfs-tools, and merged most of them.
- For the Debian firmware-nonfree package:
- I started reviewing Diederik de Haas’s major (non-upstream) update to firmware-nonfree.
- I opened a merge request intended to simplify future work: Add support for and start using wildcards in package file lists.
- I uploaded iw version 6.9-1 to unstable.
Get Started With Selenium: 4 Short Video Tutorials
In just 8 minutes you too will be ready to start using Selenium AT-SPI.
Working to make your apps accessible to everybody, while reducing its power usage and improving its quality by doing more system testing, may seem as daunting as climbing Mount Everest. Luckily, KDE provides a lift to help you, Selenium AT-SPI.
Check out the following four-part guide to get started with this wonderful tool! Part 1 "An Introduction to Selenium" can be viewed here:
Click to watch Part 2 "Setting up Selenium", Part 3 "Identifying Accessibility Issues", and Part 4 "Writing Selenium Tests".
Selenium AT-SPI, originally based on the Selenium web application for automating testing purposes, has been ported to Qt by Harald Sitter. With this tool, KDE can reach all three of its current goals:
We are thankful to Season of KDE 2024 contributor Pradyot Ranjan for his excellent work preparing these video guides.
Let's make KDE community's software the best it can be. Have a great time using it!
Interested In Contributing?Selenium AT-SPI is hosted here. If you are interested in contributing, you can join the Matrix channels KDE Eco and Automation & Systematization Goal and introduce yourself. Thank you to the Season of KDE 2024 admin and mentorship team, the KDE e.V., and the incredible KDE community for supporting this project.
KDE Plasma 6.1.2, Bugfix Release for July
Tuesday, 2 July 2024. Today KDE releases a bugfix update to KDE Plasma 6, versioned 6.1.2.
Plasma 6.1 was released in June 2024 with many feature refinements and new modules to complete the desktop experience.
This release adds a week's worth of new translations and fixes from KDE's contributors. The bugfixes are typically small but important and include:
- Discover: Fix share dialog. Commit. Fixes bug #488976
- Libtaskmanager: improve efficiency when window icon frequently changes. Commit. Fixes bug #487390
- Do not hide panel settings when a panel-parented dialog takes focus. Commit. Fixes bug #487161
Seth Michael Larson: Lockdown Mode for Apple devices
Published 2024-07-02 by Seth Larson
Reading time: minutes
Back in September 2023 the libwebp vulnerability (also known as BLASTPASS) was being actively exploited to target a journalist's mobile device. After reading the report from Citizen Lab I learned about an iOS feature called "Lockdown Mode" for Apple devices.
I've been running Lockdown Mode for almost a year now, and at the time I promised a write-up of my experience with the feature, so here it is!
How does Lockdown Mode keep your phone more secure?Lockdown Mode prevents some methods of sending or injecting data into your phone without your active engagement (such as preloading data, injecting data into unsecured connections, etc). Data that's processed by your phone automatically, such as images, can exploit flaws in image format parser in order to escape and begin executing code.
BLASTPASS exploited memory safety issues in the libwebp library which processes WebP images. The malicious WebP image was delivered to the target's device via a PassKit attachment which can be sent in a text message.
What does Lockdown Mode disable?Here's the full list of disabled or degraded features when Lockdown Mode is enabled, quoted from Apple's docs on the feature:
- Most message attachment types are blocked. Some features such as links and link previews are unavailable.
- Certain complex web technologies are blocked. (ie JavaScript JIT)
- FaceTime calls from unknown contacts are blocked. SharePlay and Live Photos are unavailable.
- Photo location information is excluded. Shared Albums are removed and disabled.
- Wi-Fi must be secure for device to connect to a network. 2G cellular support is disabled.
- Mobile Device Management and Configuration Profiles are disabled.
The biggest impacts for day-to-day usage is two-fold: Message Links and Search.
With Lockdown Mode enabled, links will not highlight like they typically do, and they won't show the fancy preloaded image that gives you a preview of the content on the other side of a click.
Not having links and link previews in messages is a real inconvenience. The fastest work-around to extract a link in the middle of a text message is to either copy the whole message into your own message box and then copy the URL or to screenshot the message and use Live Text to copy-and-paste directly from your screenshot.
If you're able to persuade your partner to send links in a separate message, that also speeds up the copy-and-paste process by copying the whole message. Persuading your partner is left as an exercise to the reader :)
The other major impact is not being able to search through my messages. This feature is super helpful when you're trying to recall something from years ago, but not something you're using every day usually. This feature being disabled has never been such a problem that I've had a memorable negative outcome, but it definitely is frustrating when you know the answer is somewhere in your messages.
The only other time Lockdown Mode has introduced friction is during Trina and I's wedding. The wedding party was sharing pictures and videos via a Shared Album which aren't available when Lockdown Mode is enabled. Fortunately, I could disable Lockdown Mode for a short time after the wedding was over, copy all the photos that I wanted, and then re-enable Lockdown Mode to work-around this.
Beyond this, some image formats don't load in any context (likely WebP?) and I haven't noticed any slowdown from not having a JavaScript JIT.
Would I recommend Lockdown Mode?For most people: no. If you have a decent reason to expect you'd be the target of a cyberattack, then you should definitely consider it.
There is a non-zero amount of extra friction to using your phone, but as someone who's trying to actively reduce my phone usage anyway it wasn't a big issue over the year that I've had it enabled.
Bonus tip: Quick one-time disabling of biometric authenticationPrivacy gated by biometrics (ie, "Face ID" or fingerprint scanners) doesn't have the same legal protections as a password. Biometrics are quite convenient, especially if you've configured a relatively short amount of time that your phone will lock itself after a lack of use.
So how can one have the benefits of biometrics while maintaining the ability to disable biometrics if needed?
By holding down the volume up and side button on your iPhone you'll bring up the screen that offers to shut down your phone or enter "SOS mode". If you select cancel on this screen your phone will become locked again but will require non-biometric authentication for the next phone unlock.
Give it a try on your phone, so you understand what to do ahead of time.
Because this process is fast (takes less than a second of holding the two buttons) it's great to have in your back pocket in case you need it. It's also useful for one-time activities when you're separated from your device such as crossing a security checkpoint.
Thanks for reading! ♡ Did you find this article helpful and want more content like it?
Get notified of new posts by subscribing to the RSS feed or the email newsletter.
This work is licensed under CC BY-SA 4.0
Quansight Labs Blog: An overview of the Sparse Array Ecosystem for Python
Ben Hutchings: FOSS activity in April 2024
- I answered a query about the continued need for an executable stack on Linux/m68k.
- I reported and fixed some regressions on the Linux 4.19-stable branch.
- I proposed a fix for the regression of rsync and scp support in dput-ng.
- I updated the linux (4.19) package for Debian 10 “buster” to upstream version 4.19.311, but didn’t make an upload this month.
- I started work on more automated handling of kernel CVEs for Debian.
Paul Wise: FLOSS Activities June 2024
This month I didn't have any particular focus. I just worked on issues in my info bubble.
Changes- gt: fix manual page
- Debian wiki pages: CopyrightReviewTools, MassRebuilds, PortsDocs/New, Teams/DPL/New
- Conffile removal in apparmor
- Features in KDE, rss-blogroll-network
- Warnings in python3-azure, python3-commonmark-bkrs
- Respond to queries from Debian users and contributors on IRC
All work was done on a volunteer basis.
Sahil Dhiman: Personal ASNs From India
Internet and it’s working are interesting and complex. We need an IP address to connect to the Internet. A group of IP addresses with common routing policy is known as an Autonomous System (AS). Each AS has a globally unique Autonomous System Number (ASN) and is maintained by a single entity or individual(s). Your ISP would have an ASN. IP addresses/prefixes are advertised (announced) by an AS through Border Gateway Protocol (BGP) to its peers (ASes which it connects to) to steer traffic in its direction or back.
Take for example Google DNS service at 8.8.8.8 owned and operated by AS15169 Google LLC. AS15169 through BGP announcements, lets all its peers know that traffic for whole of 8.8.8.0/24 (including 8.8.8.8) prefix should be sent to them. See the following screenshot response of mtr -zt 8.8.8.8 from my system. From my Internet Service Provider (ISP), AS133982 Excitel Broadband, traffic travels to AS15169 to reach 8.8.8.8 (dns.google) and returns via the same path. This Inter-AS traffic makes the Internet tick.
ASes comes in different sizes and purposes. Like AS749 DoD Network Information Center which holds more than 200 million+ IPv4 addresses for historical reasons or AS23860 Alliance Broadband Services which has 68 thousand+ IPv4 address for purpose of providing consumer Internet.
Similarly, some individuals also run their personal ASN including a bunch of Indians. Most of these Indian ASNs are IPv6 (primary or only) networks run for hobby and educational purposes. I was interested in this data, so complied a list of active ones (visible in the global routing table) from BGP.Tools:
- AS213326 Kalpak Mukhopadhyay Network Lab
- AS207941 Jiten Pathy
- AS149794 Daryll Swer
- AS203145 Debdut Biswas
- AS202340 Sanoj Kumar
- AS200730 Ankit Yadav
- AS199693 Bihaan Sen
- AS199347 Ishan Jain
- AS210965 Soundarahari Parthiban
- AS198383 Suhail Haris
- AS216452 Edvin Basil Samuval
- AS214676 Arun Malik
Let me know if I’m missing someone.
ADCI Solutions: What to do if a warehouse system displays the remaining stock incorrectly
TestDriven.io: Reusable Components in Django with Stimulus and Tailwind CSS - Part 2
Parabola GNU/Linux-libre: restart sshd immediately after upgrade
from arch:
After upgrading to openssh-9.8p1, the existing SSH daemon will be unable to accept new connections. When upgrading remote hosts, please make sure to restart the sshd service using systemctl try-restart sshd right after upgrading.
We are evaluating the possibility to automatically apply a restart of the sshd service on upgrade in a future release of the openssh-9.8p1 package.
Talking Drupal: Talking Drupal #457 - Drupal Architecture
Today we are talking about Drupal Architecture, Common Site Building questions, and How we solve things with Drupal with guest Alexander Varwijk. We’ll also cover Drupal 10.3 as our module of the week.
For show notes visit: www.talkingDrupal.com/457
Topics- Where do you start when thinking about a new site or feature.
- Where is the line for extending vs forking
- Do you have solutions that you default to when building a feature
- Do you find people come to Drupal with specific third party requirements
- What do you think about Headless
- When do you choose to contribute a new module to Drupal
- Will recipes change your architecture
- How do you learn about new ways of doing things
- Where did you get your username, are you the king of the Netherlands
- Drupal Core Issues to split "Site builder" functionality into more granular chunks
- Fibers for concurrency in core (and the Revolt Event Loop)
- Change records for Drupal 10.3
- Bigpipe to Revolt
- ChatGPT / CKEditor Issue
- Config update issue
- Issue for update hook divergence
- Tinode
- A free, unlimited, and flexible open source messaging platform that’s been built mobile-first
- View transitions api
- Change in supported versions for the Open Social distribution
Alexander Varwijk - alexandervarwijk.com Kingdutch
HostsNic Laflin - nLighteneddevelopment.com nicxvan John Picozzi - epam.com johnpicozzi Baddý Sonja Breidert - 1xINTERNET baddysonja
MOTW CorrespondentMartin Anderson-Clutz - mandclu.com mandclu
- Brief description:
- Have you been wanting to use Workspaces, Single Directory Components, Recipes, or the new admin menu in your Drupal site? The new Drupal 10.3 release is better for using all of these and more.
- Module name/project name:
- Brief history
- How old: It was tagged on Jun 20 by catch of Tag1 and Third & Grove
- Features and usage
- In this new minor version, Workspaces is now declared stable, and Single Directory Components are now fully integrated into core, instead of being in an experimental module.
- Drupal 10.3 also includes the new Access Policy API that was funded as part of the Pitchburgh process kicked off at DrupalCon Pittsburgh
- The “super user” access policy that automatically grants user 1 every permission can now be turned off in services.yml
- Also, Recipes and the new Navigation menu are available as experimental features
- The Actions UI, Book, and Statistics modules are deprecated, and contrib projects are available
- Install profiles can now be uninstalled, and new sites can be installed without any profile at all
- 10.3 also includes a revision UI for taxonomy terms, and they can also be used with content moderation
- All core-provided image styles now include WebP conversion
- The state service now uses a cache collector for performance, which requires opt in within settings.php for existing sites
- There are other performance improvements, including: POST requests are now render cacheable, duplicate queries during logins are avoided, and big pipe requests now avoid reading session from the database multiple times
- With 10.3 developer can also make use of a new AJAX command to open a URL in a dialog, and a new DraggableListBuilderTrait, among a host of other changes
- Of course, there are some additional deprecations, so the Project Update Bot has already been busy creating new MRs
RoseHosting Blog: How to Install Python on Ubuntu 24.04
In this tutorial, we are going to explain how to install Python on Ubuntu 24.04 OS. Python is a high-level ...
The post How to Install Python on Ubuntu 24.04 appeared first on RoseHosting.