Searching txt.sour.is

Twts matching #0
Sort by: Newest, Oldest, Most Relevant

For a very first attempt, I’m extremely happy how this tray turned out: https://lyse.isobeef.org/tmp/blechschachtel/ The photos look rougher than in person. The 0.5mm aluminium sheet was 300x200mm to begin with. Now, the accidental outside dimensions are 210x110mm. It took me about an hour to make. Tomorrow, I gotta build a simple folder, so I don’t have to hammer it anymore, but can simply bend it a little at a time.

⤋ Read More

Ignite Realtime Blog: Openfire 5.0.2 release!
The IgniteRealtime community is happy to announce a new release of its open source, real-time communications server server Openfire! Version 5.0.2 brings a number of stability improvements and bug fixes.

Notably, it addresses a recently identified security vulnerability, identifies as CVE-2025-59154. The issue allows for potential identity spoofing via unsafe Common Nam … ⌘ Read more

⤋ Read More

we are now parsing and recursively fetching remote feeds somewhat successfully, gotta work on the media proxy and markdown way more, so so many fucky edgecases….my friend’s feed with like four posts parsed correctly so i tried this account’s feed and well now im not going to bed on time

Video

⤋ Read More

search page, bookmarks page, improved thread view (that i will probably improve further), as well as a logo and a whole ui redesign. it is truly all coming together…were i to mark any items off the roadmap :p

Video

⤋ Read More

replies and following implemented! next step is further parsing of post contents, rendering threads, and then maybe i can finally start adding remote feeds…! though i kinda wanna redo the whole ui ^^’

Video

⤋ Read More
In-reply-to » @bender Oh, there’s an easy explanation. But maybe some mysteries are best left unexplained. 😃 If you want to solve this riddle: The solution is in the phlog! Somewhere! 😅

Hmm: gopher://uninformativ.de/0/phlog/2025/2025-08/2025-08-18--permacomputing.txt

That’s fairly recent, but fully justified. I give up! :-D

⤋ Read More
In-reply-to » @bender Oh, there’s an easy explanation. But maybe some mysteries are best left unexplained. 😃 If you want to solve this riddle: The solution is in the phlog! Somewhere! 😅

@movq@www.uninformativ.de I noticed that:

gopher://uninformativ.de/0/phlog/2018/2018-06/2018-06-01.txt

Is the first non-justified, and it is when you started using Markdown. The last justified one was:

gopher://uninformativ.de/0/phlog/2018/2018-05/2018-05-27.txt

So, I might have found the mystery! :-D

⤋ Read More
In-reply-to » I think I’m gonna participate in ROOPHLOCH this year: gemini://zaibatsu.circumlunar.space/~solderpunk/gemlog/announcing-roophloch-2025.gmi

@bender@twtxt.net Yeah, the acronym is funny. 😅

Wandering through the woods for 8km … gopher://uninformativ.de/0/phlog/2025/2025-09/2025-09-03–roophloch.txt

⤋ Read More

ProcessOne: Spotify’s Direct Messaging Gambit

Image

Last week, Spotify quietly launched direct messaging across its platform in selected areas, allowing users to share tracks and playlists through private conversations within the app. The feature was rolled out with mini … ⌘ Read more

⤋ Read More
In-reply-to » So, in addition to HTTPS and Gemini, my twtxt should now also be available over Gopher (gopher://hashnix.club:70/0/~dce/twtxt.txt). Not sure who, if anyone, would need this; but since my tilde provides Gopher hosting, I'd may as well mirror my twtxt there as well.

@dce@hashnix.club I switched over to following you on Gopher, because why not. 😅

⤋ Read More

So, in addition to HTTPS and Gemini, my twtxt should now also be available over Gopher (gopher://hashnix.club:70/0/~dce/twtxt.txt). Not sure who, if anyone, would need this; but since my tilde provides Gopher hosting, I’d may as well mirror my twtxt there as well.

⤋ Read More

Interactive demo of #shapely’s centroid for the triangle :)

import py5
from shapely import Polygon, Point

def setup():
    py5.size(400, 400)
    py5.stroke_join(py5.ROUND)
    
def draw():
    py5.background(200)
    pts = ((100, 100), (300, 100),
           (py5.mouse_x, py5.mouse_y))
    xs, ys = zip(*pts)
    cx = sum(xs) / len(xs)
    cy = sum(ys) / len(ys)
    tri = Polygon(pts)
    py5.no_fill()
    py5.stroke_weight(1)
    py5.stroke(0, 200, 0)
    py5.shape(Point(cx, cy).buffer(5))
    py5.stroke(0, 0, 200)
    py5.shape(tri.envelope.buffer(2))
    py5.shape(tri.envelope.centroid.buffer(5))
    py5.stroke_weight(3)
    py5.stroke(0)
    py5.shape(tri)
    py5.fill(0)
    py5.shape(tri.centroid.buffer(2))

py5.run_sketch(block=False)

#py5 #python #creativeCoding

Video

⤋ Read More

Erlang Solutions: MongooseIM 6.4: Simplified and Unified
MongooseIM is a scalable and efficient instant messaging server. With the latest release 6.4.0, it has become more powerful yet easier to use and maintain. Thanks to the internal unification of listeners and connection handling, the configuration is easier and more intuitive, while numerous new options are supported.

New features include support for TLS 1.3 with optional channel binding for improved security, single round-trip authent … ⌘ Read more

⤋ Read More

My website has 0 depreciated tags now and all identical IDs, were merged into a single class. This also improves, how the text on top of the page, is aligned on mobile.

⤋ Read More
In-reply-to » I was drafting support for showing “application icons” in my window manager, i.e. the Firefox icon in the titlebar:

@movq@www.uninformativ.de According to this screenshot, KDE still shows good old application icons:

Image

And GNOME used to have them, too:

Image

I like the looks of your window manager. That’s using Wayland, right? The only thing on this screenshot to critique is all that wasted space of the windows not making use of the full screen!!!1 At least the file browser. 8-)

This drives me nuts when my workmates share their screens. I really don’t get it how people can work like that. You can’t even read the whole line in the IDE or log viewer with all the expanded side bars. And then there’s 200 pixels on the left and another 300 pixels on the right where the desktop wallpaper shows. Gnaa! There’s the other extreme end when somebody shares their ultra wide screen and I just have a “regularish” 16:10 monitor and don’t see shit, because it’s resized way too tiny to fit my width. Good times. :-D

Sorry for going off on a tangent here. :-) Back to your WM: It has the right mix of being subtle and still similar to motif. Probably close to the older Windowses. My memory doesn’t serve me well, but I think they actually got it fairly good in my opinion. Your purple active window title looks killer. It just fits so well. This brown one (

Image

) gives me also classic vibes. Awww. We ran some similar brownish color scheme (don’t recall its name) on Win95 or Win98 for some time on the family computer. I remember other people visting us not liking these colors. :-D

⤋ Read More

@movq@www.uninformativ.de I fully agree with you on https://www.uninformativ.de/blog/postings/2025-07-22/0/POSTING-en.html!

Although, in the first screenshot, the window title background is much darker in the new version than the old one!1!1 :-P Kidding aside, the contrast in the old one is still better.

Also, note the missing underlines for the Alt hotkeys now. I just think that the underline in the old one is too thick.

⤋ Read More

I did a “lecture”/“workshop” about this at work today. 16-bit DOS, real mode. 💾 Pretty cool and the audience (devs and sysadmins) seemed quite interested. 🥳

  • People used the Intel docs to figure out the instruction encodings.
  • Then they wrote a little DOS program that exits with a return code and they used uhex in DOSBox to do that. Yes, we wrote a COM file manually, no Assembler involved. (Many of them had never used DOS before.)
  • DEBUG from FreeDOS was used to single-step through the program, showing what it does.
  • This gets tedious rather quickly, so we switched to SVED from SvarDOS for writing the rest of the program in Assembly language. nasm worked great for us.
  • At the end, we switched to BIOS calls instead of DOS syscalls to demonstrate that the same binary COM file works on another OS. Also a good opportunity to talk about bootloaders a little bit.
  • (I think they even understood the basics of segmentation in the end.)

The 8086 / 16-bit real-mode DOS is a great platform to explain a lot of the fundamentals without having to deal with OS semantics or executable file formats.

Now that was a lot of fun. 🥳 It’s very rare that we do something like this, sadly. I love doing this kind of low-level stuff.

⤋ Read More

Saw this on Mastodon:

https://racingbunny.com/@mookie/114718466149264471

18 rules of Software Engineering

  1. You will regret complexity when on-call
  2. Stop falling in love with your own code
  3. Everything is a trade-off. There’s no “best” 3. Every line of code you write is a liability 4. Document your decisions and designs
  4. Everyone hates code they didn’t write
  5. Don’t use unnecessary dependencies
  6. Coding standards prevent arguments
  7. Write meaningful commit messages
  8. Don’t ever stop learning new things
  9. Code reviews spread knowledge
  10. Always build for maintainability
  11. Ask for help when you’re stuck
  12. Fix root causes, not symptoms
  13. Software is never completed
  14. Estimates are not promises
  15. Ship early, iterate often
  16. Keep. It. Simple.

Solid list, even though 14 is up for debate in my opinion: Software can be completed. You have a use case / problem, you solve that problem, done. Your software is completed now. There might still be bugs and they should be fixed – but this doesn’t “add” to the program. Don’t use “software is never done” as an excuse to keep adding and adding stuff to your code.

⤋ Read More

Okay, here’s a thing I like about Rust: Returning things as Option and error handling. (Or the more complex Result, but it’s easier to explain with Option.)

fn mydiv(num: f64, denom: f64) -> Option<f64> {
    // (Let’s ignore precision issues for a second.)
    if denom == 0.0 {
        return None;
    } else {
        return Some(num / denom);
    }
}

fn main() {
    // Explicit, verbose version:
    let num: f64 = 123.0;
    let denom: f64 = 456.0;
    let wrapped_res = mydiv(num, denom);
    if wrapped_res.is_some() {
        println!("Unwrapped result: {}", wrapped_res.unwrap());
    }

    // Shorter version using "if let":
    if let Some(res) = mydiv(123.0, 456.0) {
        println!("Here’s a result: {}", res);
    }

    if let Some(res) = mydiv(123.0, 0.0) {
        println!("Huh, we divided by zero? This never happens. {}", res);
    }
}

You can’t divide by zero, so the function returns an “error” in that case. (Option isn’t really used for errors, IIUC, but the basic idea is the same for Result.)

Option is an enum. It can have the value Some or None. In the case of Some, you can attach additional data to the enum. In this case, we are attaching a floating point value.

The caller then has to decide: Is the value None or Some? Did the function succeed or not? If it is Some, the caller can do .unwrap() on this enum to get the inner value (the floating point value). If you do .unwrap() on a None value, the program will panic and die.

The if let version using destructuring is much shorter and, once you got used to it, actually quite nice.

Now the trick is that you must somehow handle these two cases. You must either call something like .unwrap() or do destructuring or something, otherwise you can’t access the attached value at all. As I understand it, it is impossible to just completely ignore error cases. And the compiler enforces it.

(In case of Result, the compiler would warn you if you ignore the return value entirely. So something like doing write() and then ignoring the return value would be caught as well.)

⤋ Read More
In-reply-to » Just discovered how easy it is to recall my last arg in shell and my brain went 🤯 How come I've never learned about this before!? I wonder how many other QOL shortcuts I'm missing on 🥲

@aelaraji@aelaraji.com I use Alt+. all the time, it’s great. 👌

FWIW, another thing I often use is !! to recall the entire previous command line:

$ find -iname '*foo*'
./This is a foo file.txt

$ cat "$(!!)"
cat "$(find -iname '*foo*')"
This is just a test.

Yep!

Or:

$ ls -al subdir
ls: cannot open directory 'subdir': Permission denied

$ sudo !!
sudo ls -al subdir
total 0
drwx------ 2 root root  60 Jun 20 19:39 .
drwx------ 7 jess jess 360 Jun 20 19:39 ..
-rw-r--r-- 1 root root   0 Jun 20 19:39 nothing-to-see

⤋ Read More
In-reply-to » Fuck me sideways, Rust is so hard. Will we ever be friends?

@prologic@twtxt.net I’m trying to call some libc functions (because the Rust stdlib does not have an equivalent for getpeername(), for example, so I don’t have a choice), so I have to do some FFI stuff and deal with raw pointers and all that, which is very gnarly in Rust – because you’re not supposed to do this. Things like that are trivial in C or even Assembler, but I have not yet understood what Rust does under the hood. How and when does it allocate or free memory … is the pointer that I get even still valid by the time I do the libc call? Stuff like that.

I hope that I eventually learn this over time … but I get slapped in the face at every step. It’s very frustrating and I’m always this 🤏 close to giving up (only to try again a year later).

Oh, yeah, yeah, I guess I could “just” use some 3rd party library for this. socket2 gets mentioned a lot in this context. But I don’t want to. I literally need one getpeername() call during the lifetime of my program, I don’t even do the socket(), bind(), listen(), accept() dance, I already have a fully functional file descriptor. Using a library for that is total overkill and I’d rather do it myself. (And look at the version number: 0.5.10. The library is 6 years old but they’re still saying: “Nah, we’re not 1.0 yet, we reserve the right to make breaking changes with every new release.” So many Rust libs are still unstable …)

… and I could go on and on and on … 🤣

⤋ Read More

OpenBSD has the wonderful pledge() and unveil() syscalls:

https://www.youtube.com/watch?v=bXO6nelFt-E

Not only are they super useful (the program itself can drop privileges – like, it can initialize itself, read some files, whatever, and then tell the kernel that it will never do anything like that again; if it does, e.g. by being exploited through a bug, it gets killed by the kernel), but they are also extremely easy to use.

Imagine a server program with a connected socket in file descriptor 0. Before reading any data from the client, the program can do this:

unveil("/var/www/whatever", "r");
unveil(NULL, NULL);
pledge("stdio rpath", NULL);

Done. It’s now limited to reading files from that directory, communicating with the existing socket, stuff like that. But it cannot ever read any other files or exec() into something else.

I can’t wait for the day when we have something like this on Linux. There have been some attempts, but it’s not that easy. And it’s certainly not mainstream, yet.

I need to have a closer look at Linux’s Landlock soon (“soon”), but this is considerably more complicated than pledge()/unveil():

https://landlock.io/

⤋ Read More

So I was using this function in Rust:

https://doc.rust-lang.org/std/path/struct.Path.html#method.display

Note the little 1.0.0 in the top right corner, which means that this function has been “stable since Rust version 1.0.0”. We’re at 1.87 now, so we’re good.

Then I compiled my program on OpenBSD with Rust 1.86, i.e. just one version behind, but well ahead of 1.0.0.

The compiler said that I was using an unstable library feature.

Turns out, that function internally uses this:

https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.display

And that is only available since Rust 1.87.

How was I supposed to know this? 🤨🫩

⤋ Read More

Hmmm 🧐 Not what I thought was going on… No bug…

 time="2025-06-14T15:24:25Z" level=info msg="updating feeds for 8 users"
 time="2025-06-14T15:24:25Z" level=info msg="skipping 0 inactive users"
 time="2025-06-14T15:24:25Z" level=info msg="skipping 0 subscribed feeds"
 time="2025-06-14T15:24:25Z" level=info msg="updating 80 sources (stale feeds)"

⤋ Read More

基於 Kubernetes 事件驅動的自動縮放
KEDA 是一種基於事件驅動的自動伸縮工具,能夠解決 Kubernetes 原生 HPA 在靈活性和複雜性上的不足。KEDA 支持多種事件源(如 Prometheus、Kafka、RabbitMQ 等),可根據實際需求動態調整 Pod 副本數量,甚至將副本數縮減至 0,從而優化資源利用率並降低成本。通過 ScaledObject 對象,KEDA 能夠靈活配置伸縮策略,快速響應負載變化,實現高效擴展 ⌘ Read more

⤋ Read More

Radxa UFS/eMMC Module Reader and Storage Solution Enables Fast Flashing and Scalable Embedded Storage
Radxa’s UFS/eMMC Module Reader is a compact USB 3.0 adapter for flashing OS images, accessing firmware, and transferring large files. It supports both eMMC v5.0 and UFS 2.1 modules with speeds up to 5 Gbps The adapter is compatible with eMMC and UFS modules from Radxa, and also works with modules from platforms like PINE64 and […] ⌘ Read more

⤋ Read More

Run Classic MacOS & NeXTSTEP in Your Web Browser
If you’ve been a reader of OSXDaily for a while you almost certainly have seen us mention some of the fun web apps that allow you to run full fledged versions of operating systems in your web browser, from Mac OS 9, Mac OS 8, or Mac OS 7, to even Windows 1.0. Many of … Read MoreRead more

⤋ Read More

10 Amazing Facts About the Remarkable Life of Roxelana
The courts of kings past were full of interesting people vying for power and plotting against one another. These people were, of course, often men from privileged backgrounds. But Roxelana, who rose to power in the palace of Suleiman the Magnificent, sultan of the Ottoman Empire from 1520 to 1566, was neither of these things. […]

The post [10 Amazing Facts About the Remarkable Life of Roxelana](https://listverse.com/2025/0 … ⌘ Read more

⤋ Read More

Run Classic MacOS & NeXTSTEP in Your Web Browser
If you’ve been a reader of OSXDaily for a while you almost certainly have seen us mention some of the fun web apps that allow you to run full fledged versions of operating systems in your web browser, from Mac OS 9, Mac OS 8, or Mac OS 7, to even Windows 1.0. Many of … Read MoreRead more

⤋ Read More

OeNB sieht ersten Hoffnungsschimmer
Nach zwei Rezessionsjahren in Folge erwartet die Oesterreichische Nationalbank (OeNB) für heuer wieder ein leichtes Wirtschaftswachstum, wie die Nationalbank am Freitag mitteilte. Die heimische Notenbank rechnet mit einem Plus des Bruttoinlandsprodukts (BIP) von 0,2 Prozent, nachdem sie im März noch ein Minus von 0,1 Prozent vorausgesagt hatte. In den beiden Jahren darauf soll das BIP-Wachstum laut OeNB auf 0,9 Prozent (2026) und 1,1 Prozent (2027) steigen. ⌘ Read more

⤋ Read More

Pacers stun Thunder in NBA Finals opener despite leading for only 0.3 seconds
Indiana completes another epic playoff comeback by stunning the 68-win Oklahoma City Thunder in Game 1 of the NBA Finals, with Tyrese Haliburton the hero for the Pacers once again. ⌘ Read more

⤋ Read More

Five quick hits: Behich puts Australia closer to World Cup qualification
Tony Popovic chooses substance over sparkle, Socceroos lack imagination in attack, and Aziz Behich provides an improbable wonder goal. These are five quick hits from Australia’s dramatic 1-0 defeat of Japan. ⌘ Read more

⤋ Read More

[$] LWN.net Weekly Edition for June 5, 2025
Inside this week’s LWN.net Weekly Edition:

  • Front: OpenH264 in Fedora; Wallabag; Safety certification; 6.16 Merge window; Bounce buffering; Hardening repository problems; Device-initiated I/O; Faster networking; OSPM 2025; Free software in science.

  • Briefs: Kea vulnerabilities; Alpine Linux 3.22.0; Fedora strategy; Quotes; …

  • Announcements: Newsletters, conferences, securi … ⌘ Read more

⤋ Read More

Security updates for Wednesday
Security updates have been issued by AlmaLinux (git, krb5, perl-CPAN, and rsync), Debian (tcpdf), Fedora (libmodsecurity, lua-http, microcode_ctl, and nextcloud), Red Hat (osbuild-composer), SUSE (389-ds, avahi, ca-certificates-mozilla, docker, expat, freetype2, glib2, gnuplot, gnutls, golang-github-teddysun-v2ray-plugin, golang-github-v2fly-v2ray-core, govulncheck-vulndb, helm, iperf, kernel, kernel-livepatch-MICRO-6-0_Update_2, kernel-livepatch-MICRO-6-0_Update_4, krb5, libarc … ⌘ Read more

⤋ Read More

FriendlyElec NanoPi M5 Offers RK3576, Dual LAN, MIPI-CSI, and 6 TOPS NPU
FriendlyElec has introduced the NanoPi M5, a compact single-board computer based on the Rockchip RK3576 processor. It features a 6 TOPS INT8 NPU, supports LPDDR4X or LPDDR5 memory, and offers UFS 2.0 storage along with dual Gigabit Ethernet and MIPI-CSI/DSI interfaces. Compared to recently launched boards such as the NanoPi Zero2 (RK3528A), NanoPi M6 (RK3588S), […] ⌘ Read more

⤋ Read More

Security updates for Monday
Security updates have been issued by Debian (espeak-ng, kitty, kmail-account-wizard, krb5, libreoffice, libvpx, net-tools, python-flask-cors, symfony, tcpdf, thunderbird, and twitter-bootstrap3), Fedora (chromium, dropbear, firefox, gstreamer1-plugins-bad-free, python-tornado, systemd, and thunderbird), Mageia (coreutils, deluge, glib2.0, and redis), Oracle (firefox, kernel, and systemd), Red Hat (firefox, kernel, kernel-rt, varnish, varnish:6, and zlib), SUSE (bind, curl, dnsdist, … ⌘ Read more

⤋ Read More

Apple Readies WWDC Stream on YouTube Ahead of Keynote Next Week
WWDC 2025 will kick off with Apple’s keynote on Monday, June 9 at 10 a.m. Pacific Time, and the page where the presentation will be live streamed is now available on YouTube. On the page, you can set a reminder to be notified before the keynote begins.

Apple will announce its latest software updates, including [iOS 26, iPadOS 26, macOS 26, tvOS … ⌘ Read more

⤋ Read More

Triple-0 call played, CFA captain speaks in Christmas Eve murder trial
A Supreme Court jury has heard a triple-0 call and viewed images of human remains in the trial of three people accused of kidnapping and murdering 19-year-old Charlie Gander in 2022. ⌘ Read more

⤋ Read More

Trump Is Weaponizing the Justice Department to Advance His Voter Suppression Plans
Ari Berman,  National Voting Rights Correspondent  -  Mother Jones

Stephan: I have been convinced since the Trump coup began last January that the MAGAt Republicans and their king were going to do everything they could to rig the 2026 election to keep themselves in power. And sure enough, they are.

![](https://www.schwartzreport.net/wp-content/uploads/2025/0 … ⌘ Read more

⤋ Read More

Security updates for Friday
Security updates have been issued by AlmaLinux (.NET 8.0, .NET 9.0, firefox, ghostscript, gstreamer1-plugins-bad-free, libsoup3, mingw-freetype, perl, ruby, sqlite, thunderbird, unbound, valkey, and xz), Debian (chromium, firefox-esr, libavif, linux-6.1, modsecurity-apache, mydumper, systemd, and thunderbird), Fedora (coreutils, dnsdist, docker-buildx, maturin, mingw-python-flask, mingw-python-flit-core, ruff, rust-hashlink, rust-rusqlite, and thunderbird), Red Hat (pcs), SUSE (augeas, … ⌘ Read more

⤋ Read More

Prosodical Thoughts: Prosody 13.0.2 released
We are pleased to announce a new minor release from our stable branch.

This update addresses various issues that have been noticed since the previous release, as well as a few improvements, including some important fixes for invites. Some log messages and prosodyctl commands have been improved as well.

A summary of changes in this release:

Fixes and improvements
  • mod_storage_internal: Fix queries with only start returning extra items
  • mod_invites_register: Stric … ⌘ Read more

⤋ Read More

nginx 中配置端口轉發 TCP-UDP 流量
ngxstreamcoremodule 模塊從 1.9.0 版本開始出現,默認不包含此模塊,需要通過–with-stream配置。這個模塊可用於 TCP/UDP 流量轉發,和實現負載均衡,配置示例:workerprocesses  1;events {    workerconnections  1024;}stream {代理SSH連接 server {    listen 10022; ⌘ Read more

⤋ Read More

[$] LWN.net Weekly Edition for May 29, 2025
Inside this week’s LWN.net Weekly Edition:

  • Front: Glibc security; How we lost the Internet; Encrypted DNS; 6.15 Development statistics; Filesystem stress-testing; BPF verifier; Network access from BPF; OSPM 2025.

  • Briefs: AlmaLinux 10.0; FESCo decision overturned; NixOS 25.05; Pocket, Launchpad retired; Quotes; …

  • Announcements: Newsletters, conferences, security updates, … ⌘ Read more

⤋ Read More

AlmaLinux OS 10.0 released
Version\
10 of the AlmaLinux OS distribution has been released.

The goal of AlmaLinux OS is to support our community, and AlmaLinux
OS 10 is the best example of that yet. With an unwavering eye on
maintaining compatibility with Red Hat Enterprise Linux (RHEL), we
have made small improvements to AlmaLinux OS 10 that target
specific sections of our userbase.

See [the\
release notes](https://wiki.almalinux.org/release-notes/10.0.h … ⌘ Read more

⤋ Read More