As the label states, the map is old. NATO has more members now, with at least Finland & Sweden joining since then.
- 0 Posts
- 131 Comments
ferric_carcinization@lemmy.mlto Self Hosted - Self-hosting your services.@lemmy.ml•Maybe drops open-source support - pivots to B2B data and scenario planningEnglish5·15 days agoJust the things others contributed. Unless they somehow get permission from all of their contributors, which, in this case, seems less than likely.
ferric_carcinization@lemmy.mlto Asklemmy@lemmy.ml•what's something you believe strongly but have little knowledge aboutEnglish8·15 days agoYou seem to be slightly confused, that’s how Orkish aviation works. Western FreedomPlanes™ generate lift by harnessing the power of the line that must always go up. For example, the U.S. Dollar’s line has started to go down, which has caused many U.S. airplanes to crash.
ferric_carcinization@lemmy.mlto Firefox@lemmy.ml•What does network.http.http3.sni-slicing do in Firefox?English6·15 days agoAfter a quick look, looks like it tries to split the (unencrypted) hostname into multiple packets, or at least scramble it slightly. I’m not sure how much it helps in practice, but it might help against naïve filtering/scanning, as the hostname is either sent in different packets, or split and sent unordered in the same packet. It probably only helps if encrypted client hello isn’t supported.
TL;DR: If I’ve understood everything correctly, it just moves chunks of the plaintext hostname around & tries to split it into multiple packets.
Note: Mostly based on comments, as it’s late & I’m too tired to parse too much cryptography code.
Full source of the
limit_chunks
function, formatted with Rustfmt:const fn limit_chunks<'a>( left: (u64, &'a [u8]), right: (u64, &'a [u8]), limit: usize, ) -> ((u64, &'a [u8]), (u64, &'a [u8])) { let (left_offset, mut left) = left; let (mut right_offset, mut right) = right; if left.len() + right.len() <= limit { // Nothing to do. Both chunks will fit into one packet, meaning the SNI isn't spread // over multiple packets. But at least it's in two unordered CRYPTO frames. } else if left.len() <= limit { // `left` is short enough to fit into this packet. So send from the *end* // of `right`, so that the second half of the SNI is in another packet. let right_len = right.len() + left.len() - limit; right_offset += right_len as u64; (_, right) = right.split_at(right_len); } else if right.len() <= limit { // `right` is short enough to fit into this packet. So only send a part of `left`. // The SNI begins at the end of `left`, so send the beginnig of it in this packet. (left, _) = left.split_at(limit - right.len()); } else { // Both chunks are too long to fit into one packet. Just send a part of each. (left, _) = left.split_at(limit / 2); (right, _) = right.split_at(limit / 2); } ((left_offset, left), (right_offset, right)) }
Same, but for
write_chunk
:fn write_chunk<B: Buffer>( offset: u64, data: &[u8], builder: &mut packet::Builder<B>, ) -> Option<(u64, usize)> { let mut header_len = 1 + Encoder::varint_len(offset) + 1; // Don't bother if there isn't room for the header and some data. if builder.remaining() < header_len + 1 { return None; } // Calculate length of data based on the minimum of: // - available data // - remaining space, less the header, which counts only one byte for the length at // first to avoid underestimating length let length = min(data.len(), builder.remaining() - header_len); header_len += Encoder::varint_len(u64::try_from(length).expect("usize fits in u64")) - 1; let length = min(data.len(), builder.remaining() - header_len); builder.encode_varint(FrameType::Crypto); builder.encode_varint(offset); builder.encode_vvec(&data[..length]); Some((offset, length)) }
ferric_carcinization@lemmy.mlto Open Source@lemmy.ml•Open source computer mouse by PloopyEnglish1·15 days agoIs silicone rigid enough? Adult toys have slightly different requirements from many other 3D printed things.
ferric_carcinization@lemmy.mlto Open Source@lemmy.ml•Open source computer mouse by PloopyEnglish1·16 days agoHow do you usually do that?
Do you create a negative of the model digitally or take a mold of the printed parts?
What kinds of human-friendly materials do you use? And do you need any special equipment for it?
ferric_carcinization@lemmy.mlto Privacy@lemmy.ml•Introducing Lumo, the AI where every conversation is confidential | ProtonEnglish5·16 days agoWith the new Swap™ technology, you are no longer* limited** by your RAM. Our*** brand-new**** Swap™ technology turns your unused disk space into usable***** memory at almost****** no******* perceivable performance impact. When combined with our ZSwap™ compression technology, you can now achieve an up to 5000% or better******** unused-disk-to-memory conversion ratio********* than many RAM-downloading services.**********
ferric_carcinization@lemmy.mlto Asklemmy@lemmy.ml•We all know grammar Nazis. What incorrect grammar are you completely in defence of?English2·19 days agoIsn’t that how it’s done in English (Traditional)?
I hope that the language’s
int
s are at most 32 bits. For 8 bits it could even be written by hand & the source code for a 32 bit version would only take upavg_line_len * 4GiB
space for the source code of the function. But it might take a bit of time to compile a version that supports the full range of 64 or 128 bit ints.
ferric_carcinization@lemmy.mlto Linux Gaming@lemmy.ml•Lutris: Pre-launch / Post-exit scripts not being executedEnglish5·29 days agoSo it works now? If so, then glad to be of help.
Just remember that if your shebang points to sh, you can’t rely on bash-specific features. The shebang line basically tells the kernel to run your file with the specified program. So, for example, a file with
!/bin/cat
will print the full contents of the file (including the shebang) and!/bin/echo
will print the command line. (something like ./script arg1 arg2) As the echo command does not try to interpret arguments as paths, the content of the script would be ignored in that case.
ferric_carcinization@lemmy.mlto Linux Gaming@lemmy.ml•Lutris: Pre-launch / Post-exit scripts not being executedEnglish7·29 days agoDoes the script file have a shebang? (Something like
as the first line)
ferric_carcinization@lemmy.mlto Gaming@lemmy.ml•[Ended] [Steam Key Giveaway] 3x Stardew Valley to give awayEnglish8·1 month agoIn that case, don’t look up Dwarf Fortress. I’ve also heard good things about Factorio, but I haven’t tried it yet.
ferric_carcinization@lemmy.mlto Gaming@lemmy.ml•[Ended] [Steam Key Giveaway] 3x Stardew Valley to give awayEnglish4·1 month agoAnd C++ compile times made me learn C. You must be jealous that my memory errors & race conditions compile faster than yours.
ferric_carcinization@lemmy.mlto Gaming@lemmy.ml•[Ended] [Steam Key Giveaway] 3x Stardew Valley to give awayEnglish111·1 month agoI haven’t gotten a chance yet, as rustc is using 100% CPU & RAM.
ferric_carcinization@lemmy.mlto Open Source@lemmy.ml•French City of Lyon Kicks Out MicrosoftEnglish11·1 month agoNice!
ferric_carcinization@lemmy.mlto Linux@lemmy.ml•Flathub has passed 3 billion downloadsEnglish4·2 months agoThey’re on the feddit.uk instance, so it’s more likely that they’re British. Either their VPN prefers USA servers for some reason, or they’ve only done about 138 million downloads at most.
ferric_carcinization@lemmy.mlto Programmer Humor@lemmy.ml•Why make it complicated?English4·2 months agoWhat’s disgusting about it? The only thing I can think of is the implicit return, which felt a bit icky at first.
Also, as the if expression is an expression, you can call methods on it like so:
if 1 > 2 { 3 } else { 4 }.min(5)
(the above is still an expression, so it could be used, for example, as part of a condition for another if)
Of course, you can write horrible code in any language, but the ability to use blocks where expressions are expected can be great sometimes.
ferric_carcinization@lemmy.mlto Programmer Humor@lemmy.ml•Why make it complicated?English5·2 months agoRust would allow you to
let ret = if some_condition { <a lot of expensive calculations> result_of_operations } else { <a lot of other different expensive calculations> result_of_other_operations };
Now you don’t have to declare it inside the blocks.
It’s way more common than you may realize. Intel & AMD (and other x86 CPU manufacturers of the time) did it before the first Crusoe CPU launched. (2000 according to Wikipedia)
CISC architectures are now seen as inefficient, so all the new ones are RISC and new CISC CPUs just translate the instructions to their intenal RISCier microarchitecture. The CPU’s microcode specifies what an instruction translates to.
I’m willing to count that as a bus.