
Just remember that it’s never too late to start drawing. ;)
Just remember that it’s never too late to start drawing. ;)
recommended my
I don’t know how bad it is, but you should get better the more you practice.
Lemmy is written in Rust.
As the label states, the map is old. NATO has more members now, with at least Finland & Sweden joining since then.
The article requires logging in to read.
Archived version: https://archive.is/oQ8lm
After 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))
}
In that case, don’t look up Dwarf Fortress. I’ve also heard good things about Factorio, but I haven’t tried it yet.
And C++ compile times made me learn C. You must be jealous that my memory errors & race conditions compile faster than yours.
I haven’t gotten a chance yet, as rustc is using 100% CPU & RAM.
Nice!
What could that mysterious white liquid be?
What about μc or nc, a bit umder 300m/s & 3m/s, respectively.
How would other types of taxes, like in you example, gift tax, be handled?
The Vita has some good games, and it has built-in support for psp & ps1 games, which is not emulation IIRC. It can be a nice portable emulation machine, especially the Vita 1000 model, with the OLED display. The 2000 isn’t as nice due to the worse display.
Isn’t 300lb approximately equal to 1 stackoverflow user?
(I’m not USAian, so my conversion may have higher error bars than usual)
If only moonlight could use the USB connection, like vitastick.
Do the triggers from bluetooth controllers work with moonlight? I don’t remember if you can normally connect controllers to the vita, but there’s this plugin that makes the vita think that it’s a pstv, which makes it support multiple gamepads.
I haven’t used moonlight on the vita, can you map touch input to L2/R2/L3/R3? The back touch-area would probalby be good for the triggers & L3/R3 aren’t used that often, so the touchscreen might work for that.
What’s the latency like?
Neither, bat or neovim.
Last I heard, concrete is supposed to be real & tangible, unlike the action they’re threatening.
I doubt whatever they’re using is up to code.
Unlike Windows, on Linux you need to run
./<command>
instead of just<command>
for executables in you current directory.