Category: News
Mehfil e Sama – Qawali – 15th December 2022 – ARY Qtv
Subscribe Here: https://bit.ly/3dh3Yj1
#Mehfilesama #Qawali #ARYQtv
Official Facebook: https://www.facebook.com/ARYQTV/
Official Website: https://aryqtv.tv/
Watch ARY Qtv Live: http://live.aryqtv.tv/
Programs Schedule: https://aryqtv.tv/schedule/
Islamic Information: https://bit.ly/2MfIF4P
Android App: https://bit.ly/33wgto4
Ios App: https: https://apple.co/2v3zoXW
To Watch More Click Here: http://aryqtv.tv
Drupal blog: Drupal 10.0.0 is available
Thanks to 2129 contributors from 616 organizations resolving 4083 issues in the past two and a half years, Drupal 10.0.0 is available today! This new version sets Drupal up for continued stability and security for the longer term. All new features will be added to Drupal 10 going forward.
What’s new in Drupal 10.0.0?
Better looking on the frontend and backend
The new Olivero theme provides a modern look and feel. Olivero includes built-in support for multi-level menus and listings in responsive grids. The new administration theme, Claro, provides an accessible, clean interface for site management. The prior default themes Bartik and Seven are available as contributed projects if you wish to use them.
CKEditor 5 is the new content editor
With CKEditor 4 reaching end of life at the end of 2023, it was time to upgrade. Thanks to a fantastic collaboration with its developers, Drupal 10 comes with CKEditor 5 built-in. The new version brings a modern editing experience with in-place controls and support for arbitrary input and output formats. Optional premium features are also available, such as live collaborative editing. An upgrade path is provided to move editor settings over and developer tools are available to help port any custom integrations. For now, CKEditor 4 is also available as a contributed project, so you can continue using that for Drupal 10 for now until its end of support.
Internet Explorer support is removed
Microsoft has ended support for Internet Explorer and so has Drupal.This allows Drupal themes to use modern solutions for user facing problems.
Responsive grids in views
Views now supports a responsive grid display format. Instead of specifying the number of columns, and screen widths, users specify the maximum number of columns, the minimum grid cell width and the gutter spacing. When the grid cells resize to a point where they’re below the minimum width, the grid will reflow to have less columns. Alternatively, the grid will expand to fit in as many columns as permitted, while keeping the grid width above the minimum value. Dropping Internet Explorer 11 support enabled the addition of this feature.
Starterkit theme generation tool
Drupal 10 introduces a new command line tool to generate a standalone theme from a compatible base theme. We recommend using the tool to prevent breaking a sub-theme when the base theme changes. Runtime theme extension is still supported, but only advised if you have full control of the base theme (e.g. by creating it with the starterkit command).
Requires Symfony 6.2 and PHP 8.1
Drupal 10.0 depends on the Symfony 6.2 framework, and later Drupal 10 minor versions will be updated to future minor versions of Symfony 6. This sets Drupal up with the latest version of the underlying platform.
As PHP 7 reached end of life on November 28, 2022, it was clear Drupal 10 must require at least PHP 8. Symfony 6.2 requires PHP 8.1 and choosing that version provides the best support timeline for Drupal 10 itself as well. PHP 8.2 is also fully supported.
Non-essential features removed
The QuickEdit, Aggregator, HAL, RDF, and Color modules have been removed from core. They are available as contributed projects. This allows Drupal 10 to focus on the core strengths of the system.
All features added since Drupal 9.0 are still here
Drupal 10.0.0 includes all of the features that were added to Drupal since 9.0, such as lazy image loading support for better frontend performance, WebP support in image styles, a dedicated Content Editor user role, “Manage permissions” tabs for entity bundles, and bundle classes on the PHP level for better code encapsulation, among many other improvements.
Thousands of contributed projects ready at launch
Thanks to the diligent work of the Drupal community on automated code update tools, porting events and dedicated work on key projects over the past two and a half years, Drupal 10 launches with almost three thousand compatible extensions, 26% more than how many Drupal 9 launched with.
The future of Drupal 10
All new features will be added to only Drupal 10 going forward. Several key improvements are already in the works as contributed projects. The Project Browser contributed project is now in beta and includes a Composer-based user interface to install contributed projects with all their dependencies. The Automatic Updates contributed project is already stable, allowing you to apply patch-level core updates to your site. (Experimental support is included for minor version updates and contributed project updates). The Recipes initiative is less far along but already has early versions of automation functionality to ship composable bundles of Drupal modules and configuration.
All of these are planned to be added to Drupal 10 core in the future and will help users find, keep up with and combine all the fantastic contributed projects the Drupal community is famous for.
What does this release mean for me?
Drupal 9 site owners
Drupal 9 will reach end-of-life alongside two of its key components (Symfony 4 and CKEditor 4 on November 1, 2023. (There is a small chance that a final security release of Drupal 9 could be issued between November 1 and November 30, 2023 if one of these dependencies chooses to do so as well.)
Upgrades to Drupal 10 are supported from Drupal 9.4 and 9.5. However, Drupal 9.4 will no longer receive normal bugfixes. For continued bugfix support, Drupal 9 users should update to Drupal 9.5 now.
Drupal 9.4 and 9.5 will both receive security fixes until the release of 10.1 on June 21, 2023. After that date, Drupal 9.5 will be the only Drupal 9 version to receive security fixes until the November 2023 end-of-life.
Drupal 8 site owners
Drupal 8 is end of life as of November 17, 2021. There is no direct upgrade path to Drupal 10 from Drupal 8, so you will need to first upgrade from Drupal 8 to Drupal 9. There are disclosed security issues with Drupal core that are not fixed in any Drupal 8 version, so if you have not yet upgraded to Drupal 9, do so as soon as possible.
Drupal 7 site owners
Drupal 7 support was extended until November 1, 2023, and it will continue to receive bug and security fixes throughout this time. The migration path for Drupal 7 sites to Drupal 10 is stable. Choose which Drupal major version to update to based on your project timeline. Read more about the migration to Drupal 10.
Module, theme and translation contributors
Drupal 10 removes deprecated APIs. Use Upgrade Status on Drupal 9 to check your custom modules and themes for the changes needed. Upgrade Status will also give suggestions on automating the fixes.
Translators should check localize.drupal.org for any untranslated strings.
The Basics of Receiving Webhooks in Rails
Cloud Hypervisor Project Welcomes Ampere Computing as a Member
Read the original post at: Read More
The post Cloud Hypervisor Project Welcomes Ampere Computing as a Member appeared first on Linux.com.
A state-by-state look at the long-reads that captivated Pocket users in 2022
Every year, the top stories that were saved and read by Pocket’s more than 10 million users clue us in to the prevailing mood of the time. In 2020, readers looked for answers in The Atlantic’s exploration of how the pandemic might end. In 2021, The New York Times’ piece on “languishing” captured what we […]
The post A state-by-state look at the long-reads that captivated Pocket users in 2022 appeared first on The Mozilla Blog.
Andy Wingo: ephemeral success
Good evening, patient hackers 🙂 Today finishes off my series on
implementing ephemerons in a garbage
collector.
Last time, we had a working solution for ephemerons, but it involved
recursively visiting any pending ephemerons from within the copy
routine—the bit of a semi-space collector that is called when
traversing the object graph and we see an object that we hadn’t seen
yet. This recursive visit could itself recurse, and so we could
overflow the control stack.
The solution, of course, is “don’t do that”: instead of visiting
recursively, enqueue the ephemeron for visiting later. Iterate, don’t
recurse. But here we run into a funny problem: how do we add an
ephemeron to a queue or worklist? It’s such a pedestrian question
(“just… enqueue it?”) but I think it illustrates some of the
particular concerns of garbage collection hacking.
speak, memory
The issue is that we are in the land of “can’t use my tools because I
broke my tools with my tools”. You can’t make a standard List<T>
because you can’t allocate list nodes inside the tracing routine: if you
had memory in which you could allocate, you wouldn’t be calling the
garbage collector.
If the collector needs a data structure whose size doesn’t depend on the
connectivity of the object graph, you can pre-allocate it in a reserved
part of the heap. This adds memory overhead, of course; for a 1000 MB
heap, say, you used to be able to make graphs 500 MB in size (for a
semi-space collector), but now you can only do 475 MB because you have
to reserve 50 MB (say) for your data structures. Another way to look at
it is, if you have a 400 MB live set and then you allocate 2GB of
garbage, if your heap limit is 500 MB you will collect 20 times, but if
it’s 475 MB you’ll collect 26 times, which is more expensive. This is
part of why GC algorithms are so primitive; implementors have to
be stingy that we don’t get to have nice things / data structures.
However in the case of ephemerons, we will potentially need one worklist
entry per ephemeron in the object graph. There is no optimal fixed size
for a worklist of ephemerons. Most object graphs will have no or few
ephemerons. Some, though, will have practically the whole heap.
For data structure needs like this, the standard solution is to reserve
the needed space for a GC-managed data structure in the object itself. For
example, for concurrent copying collectors, the GC might reserve a word
in the object for a forwarding pointer, instead of just clobbering the
first word. If you needed a GC-managed binary tree for a specific kind
of object, you’d reserve two words. Again there are strong pressures to
minimize this overhead, but in the case of ephemerons it seems sensible
to make them pay their way on a per-ephemeron basis.
so let’s retake the thing
So sometimes we might need to put an ephemeron in a worklist. Let’s add
a member to the ephemeron structure:
struct gc_ephemeron { struct gc_obj header; int dead; struct gc_obj *key; struct gc_obj *value; struct gc_ephemeron *gc_link; // * };
Incidentally this also solves the problem of how to represent the
struct gc_pending_ephemeron_table; just reserve 0.5% of the heap or so
as a bucket array for a buckets-and-chains hash table, and use the
gc_link as the intrachain links.
struct gc_pending_ephemeron_table { struct gc_ephemeron *resolved; size_t nbuckets; struct gc_ephemeron buckets[0]; };
An ephemeron can end up in three states, then:
-
Outside a collection: gc_link can be whatever.
-
In a collection, the ephemeron is in the pending ephemeron table: gc_link is part of a hash table.
-
In a collection, the ephemeron’s key has been visited, and the ephemeron is on the to-visit worklist; gc_link is part of the resolved singly-linked list.
Instead of phrasing the interface to ephemerons in terms of visiting
edges in the graph, the verb is to resolve ephemerons. Resolving an
ephemeron adds it to a worklist instead of immediately visiting any
edge.
struct gc_ephemeron ** pending_ephemeron_bucket(struct gc_pending_ephemeron_table *table, struct gc_obj *key) { return &table->buckets[hash_pointer(obj) % table->nbuckets]; } void add_pending_ephemeron(struct gc_pending_ephemeron_table *table, struct gc_obj *key, struct gc_ephemeron *ephemeron) { struct gc_ephemeron **bucket = pending_ephemeron_bucket(table, key); ephemeron->gc_link = *bucket; *bucket = ephemeron; } void resolve_pending_ephemerons(struct gc_pending_ephemeron_table *table, struct gc_obj *obj) { struct gc_ephemeron **link = pending_ephemeron_bucket(table, obj); struct gc_ephemeron *ephemeron; while ((ephemeron = *link)) { if (ephemeron->key == obj) { *link = ephemeron->gc_link; add_resolved_ephemeron(table, ephemeron); } else { link = &ephemeron->gc_link; } } }
Copying an object may add it to the set of pending ephemerons, if it is
itself an ephemeron, and also may resolve other pending ephemerons.
void resolve_ephemerons(struct gc_heap *heap, struct gc_obj *obj) { resolve_pending_ephemerons(heap->pending_ephemerons, obj); struct gc_ephemeron *ephemeron; if ((ephemeron = as_ephemeron(forwarded(obj))) && !ephemeron->dead) { if (is_forwarded(ephemeron->key)) add_resolved_ephemeron(heap->pending_ephemerons, ephemeron); else add_pending_ephemeron(heap->pending_ephemerons, ephemeron->key, ephemeron); } } struct gc_obj* copy(struct gc_heap *heap, struct gc_obj *obj) { ... resolve_ephemerons(heap, obj); // * return new_obj; }
Finally, we need to add something to the core collector to scan resolved
ephemerons:
int trace_some_ephemerons(struct gc_heap *heap) { struct gc_ephemeron *resolved = heap->pending_ephemerons->resolved; if (!resolved) return 0; heap->pending_ephemerons->resolved = NULL; while (resolved) { resolved->key = forwarded(resolved->key); visit_field(&resolved->value, heap); resolved = resolved->gc_link; } return 1; } void kill_pending_ephemerons(struct gc_heap *heap) { struct gc_ephemeron *ephemeron; struct gc_pending_ephemeron_table *table = heap->pending_ephemerons; for (size_t i = 0; i < table->nbuckets; i++) { for (struct gc_ephemeron *chain = table->buckets[i]; chain; chain = chain->gc_link) chain->dead = 1; table->buckets[i] = NULL; } } void collect(struct gc_heap *heap) { flip(heap); uintptr_t scan = heap->hp; trace_roots(heap, visit_field); do { // * while(scan < heap->hp) { struct gc_obj *obj = scan; scan += align_size(trace_heap_object(obj, heap, visit_field)); } } while (trace_ephemerons(heap)); // * kill_pending_ephemerons(heap); // * }
The result is… not so bad? It makes sense to make ephemerons pay
their own way in terms of memory, having an internal field managed by
the GC. In fact I must confess that in the implementation I have been
woodshedding, I actually have three of these damn things; perhaps more
on that in some other post. But the perturbation to the core algorithm
is perhaps less than the original code. There are still some
optimizations to make, notably postponing hash-table lookups until the
whole strongly-reachable graph is discovered; but again, another day.
And with that, thanks for coming along with me for my journeys into
ephemeron-space.
I would like to specifically thank Erik Corry and Steve Blackburn for
their advice over the years, and patience with my ignorance; I can only
imagine that it’s quite amusing when you have experience in
a domain to see someone new and eager come in and make many of the
classic mistakes. They have both had a kind of generous parsimony in
the sense of allowing me to make the necessary gaffes but also providing
insight where it can be helpful.
I’m thinking of many occasions but I especially appreciate the advice to
start with a semi-space collector when trying new things, be it
benchmarks or test cases or API design or new functionality, as it’s a
simple algorithm, hard to get wrong on the implementation side, and
perfect for bringing out any bugs in other parts of the system. In this
case the difference between fromspace and tospace pointers has a
material difference to how you structure the ephemeron implementation;
it’s not something you can do just in a trace_heap_object function, as
you don’t have the old pointers there, and the pending ephemeron table
is indexed by old object addresses.
Well, until some other time, gentle hackfolk, do accept my sincerest waste
disposal greetings. As always, yours in garbage, etc.,