GNU social JP
  • FAQ
  • Login
GNU social JPは日本のGNU socialサーバーです。
Usage/ToS/admin/test/Pleroma FE
  • Public

    • Public
    • Network
    • Groups
    • Featured
    • Popular
    • People

Conversation

Notices

  1. Embed this notice
    pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 03:33:04 JST pistolero pistolero

    revolver.gif
    revolverjuggling.gif
    In conversation about 8 months ago from fsebugoutzone.org permalink

    Attachments


    1. https://media.freespeechextremist.com/rvl/full/8ef98ad13a369b6592f50989db45ee60c6fd264c691354c8b09dda08a3bf91b2?name=revolver.gif
    • ✙ dcc :pedomustdie: :phear_slackware: likes this.
    • Embed this notice
      :blank: (i@declin.eu)'s status on Saturday, 28-Feb-2026 03:37:17 JST :blank: :blank:
      in reply to
      @p
      In conversation about 8 months ago permalink

      Attachments


      1. https://declin.eu/media/05/8a/d1/058ad1d46cfed7898a91fde2a5d251592507b327b89ae5b9808cf1151542a7d1.webp
      pistolero likes this.
    • Embed this notice
      roko's basilisk (vii@dsmc.space)'s status on Saturday, 28-Feb-2026 03:37:50 JST roko's basilisk roko's basilisk
      in reply to
      @p I don’t quite know if revolver exists, or not. I’m not trying to be rushy or unfair; my fucking AI lab is a mess and I don’t want anyone who doesn’t know what I’m doing making unsolicited advice for something that is, first and foremost, for me to scratch my own exocortical itch. But I’m also curious where it is because you’re always excited by it.
      In conversation about 8 months ago permalink
      pistolero likes this.
    • Embed this notice
      👁 (mpg@dsmc.space)'s status on Saturday, 28-Feb-2026 03:38:03 JST 👁 👁
      in reply to
      • roko's basilisk
      @vii @p So far the only interactable part of Revolver is an ad-hoc imageserver that has no Content-Range support at best and throws "Celibate salmon" at worst.
      In conversation about 8 months ago permalink
      Johnny Peligro and roko's basilisk like this.
    • Embed this notice
      👁 (mpg@dsmc.space)'s status on Saturday, 28-Feb-2026 03:41:17 JST 👁 👁
      in reply to
      • roko's basilisk
      • 👁
      @vii @p At one point you could at least look at https://media.freespeechextremist.com/api/v1/timelines/public but it's empty now.
      In conversation about 8 months ago permalink

      Attachments


      1. Invalid filename.
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:02:20 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      @vii Think I showed you some of the code when you were out, but I did bash out a shitty JS client that can decode blocks. (CORS prevents it from doing load-balancing so I'll fix that at some point but the proofed concept, I'll do the CORS shit later. It is slow as balls (even when you have all the responses cached, so it's not a network problem; there are some peculiarities of the network setup due to disk space and this introduces latency but the code itself is slow) because I'm not any good at JavaScript. Code is also not obfuscated, but enough of it is "lightly modified copypasta" that it's also not exactly *legible*. But there's a PoC.) You can watch it reassemble the media: https://media.freespeechextremist.com/fucko.html?id=8ef98ad13a369b6592f50989db45ee60c6fd264c691354c8b09dda08a3bf91b2 . (cc @i , this was partially due to you suggesting some more blog post, I figured I'd document that in a place that wasn't "random extemporaneous notes on fedi".) And that's actually, like, if you turn it into a service worker or something, it could theoretically propagate blocks between other servers and act as a lightweight bridge peer but I don't think it's completely workable and it'll be better to use the actual code and use the /rvl/full endpoint. But, hey, it can also reassemble itself: https://media.freespeechextremist.com/rvl/full/c2067b9198017e469888213b35ee1a3336adc27594add8f434b05039a262dbd0?id=c2067b9198017e469888213b35ee1a3336adc27594add8f434b05039a262dbd0 . I fucking hate JavaScript.

      > I’m also curious where it is because you’re always excited by it

      I'm setting down a concrete pad today but I think I'm at "final set of changes to the P2P code that will make media.fse stop being slow" and then it's a matter of fleshing out the AP endpoints (the easy stuff) and the client endpoints and some of the weird stuff designed to cope with structural AP stuff (e.g., domain agreements; I don't know if you were around when I proposed the idea but "owner of domain agrees to relay your posts to AP servers and agrees to be your 'home' by serving your keys/outbox and accepting posts to your inbox from AP servers" was embarrassingly trivial when it came up). Instead of going nuts with queues, I have started going nuts with Bloom filters; we'll see if I've gotta back out of that but I think I have a workable system now.
      In conversation about 8 months ago permalink

      Attachments


      1. No result found on File_thumbnail lookup.
        Revolver JS Client
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:09:30 JST pistolero pistolero
      in reply to
      • roko's basilisk
      • 👁
      @mpg @vii

      > At one point you could at least look at https://media.freespeechextremist.com/api/v1/timelines/public

      That's because it used to be on the same machine as screamshitter.club and no one delivers posts to media.fse.

      Fuck's sake, man.
      timeline.png
      In conversation about 8 months ago permalink

      Attachments


      1. Invalid filename.

      2. https://media.freespeechextremist.com/rvl/full/6e3f5e0a45355e1f6a7872888f65d0b320dab48cbe300ff4dde1694091cc76a9?name=timeline.png
      ✙ dcc :pedomustdie: :phear_slackware: likes this.
    • Embed this notice
      Jolly Rancher (not_br549@jollyville.net)'s status on Saturday, 28-Feb-2026 04:13:53 JST Jolly Rancher Jolly Rancher
      in reply to
      Waiting for one of em to shoot their nuts off..
      In conversation about 8 months ago permalink
      pistolero likes this.
    • Embed this notice
      roko's basilisk (vii@dsmc.space)'s status on Saturday, 28-Feb-2026 04:14:23 JST roko's basilisk roko's basilisk
      in reply to
      @p

      > You can watch it reassemble the media:

      Oh shit you can! Okay, okay this may be stupid but this is the first time I've seen revolver do what it says on the tin and I'm actually really impressed. I only know so much, but I can see what you mean about it being slow, and it using the backend to reassemble.

      > And that's actually, like, if you turn it into a service worker or something, it could theoretically propagate blocks between other servers and act as a lightweight bridge peer but I don't think it's completely workable and it'll be better to use the actual code and use the /rvl/full endpoint.

      Okay, only tangentially related but I have been wondering about a fedi server that acts more like postfix, and has separate cli tools and transport and side-effect management. You saying this got me thinking about it again.

      > I'm setting down a concrete pad today but

      :truehero:

      > I don't know if you were around when I proposed the idea but "owner of domain agrees to relay your posts to AP servers and agrees to be your 'home' by serving your keys/outbox and accepting posts to your inbox from AP servers" was embarrassingly trivial when it came up

      I wasn't but this is exactly the kind of shit I got into activitypub for in the first place. Like, we all kind of accept that this is how we use this field or that field or this inbox or outbox but like... Google's not gonna tell us we're in violation of a spec they don't care about. It's whether we're causing problems for the network and their graphs that seems to be what actually matters.

      > Instead of going nuts with queues, I have started going nuts with Bloom filters

      ... Oh this is great and I need to do some more research before I speak on it but if you have more to share I am a captive audience.
      In conversation about 8 months ago permalink
    • Embed this notice
      👁 (mpg@dsmc.space)'s status on Saturday, 28-Feb-2026 04:17:56 JST 👁 👁
      in reply to
      • roko's basilisk
      • 👁
      @p @vii Also links for service actors, etc. are broken, same with /.well-known/nodeinfo. Maybe intentional if it only serves as an imageserver, but still worth noting.
      In conversation about 8 months ago permalink

      Attachments


      1. https://media.dsmc.space/8c/a8/b1/8ca8b1bffd7053ae2c544a43dedfee4ff80e6f6e377be54cd2e07f45c0697f1b.png?name=Screenshot_20260227_221507.png
      roko's basilisk likes this.
    • Embed this notice
      👁 (mpg@dsmc.space)'s status on Saturday, 28-Feb-2026 04:17:57 JST 👁 👁
      in reply to
      • roko's basilisk
      @p @vii Screamshitter itself is gone and send you to fedilist so I just linked the only relevant replacement. Still, it's been empty for quite a while even when it was still up.
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:27:44 JST pistolero pistolero
      in reply to
      • Jolly Rancher
      @not_br549 It's the same guy!
      ocelotdrugs.gif
      In conversation about 8 months ago permalink
      ✙ dcc :pedomustdie: :phear_slackware: likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:29:34 JST pistolero pistolero
      in reply to
      • roko's basilisk
      • 👁
      @vii

      > Oh shit you can!

      I was constantly describing the block format and hoping someone else would write a client and no one did so I did it when i mentioned it earlier. This is why my usual response to most people (hi, @mpg ) is to blow it off because it's easy to pick up a shovel and I don't need whoever to pick up a shovel for me: I can do the entire goddamn project and the ecosystem myself if I've gotta, and if I do then that demonstrates that fedi is resilient enough that a single person can maintain their entire goddamn stack.

      > I can see what you mean about it being slow, and it using the backend to reassemble.

      It's faster to do it in a real language; JS shits itself over concatenating all the arrays. Maybe I'll drop a C client.

      > I wasn't but this is exactly the kind of shit I got into activitypub for in the first place.

      Welcome to the future. First goddamn AP server where deletes are O(1) for everyone except the guy doing the deletion.

      > It's whether we're causing problems for the network and their graphs that seems to be what actually matters.

      So that's the idea, like, because your posts are a tree and they can propagate on demand, rehoming is like, sign request, owner of domain signs acceptance. And you're not just "nowhere" if they change their mind or you get yourself banned. And you can still communicate with The Banned, either you can send messages through Revolver or they'll arrive on another server. You can send out your own Move activity. There are facets of this that will be a pain in the ass, but I'm cranking on it.

      > ... Oh this is great and I need to do some more research before I speak on it but if you have more to share I am a captive audience.

      I'll bother you over IRC, I gotta swap pants and get in the car, señorita.
      pmexican.jpg
      In conversation about 8 months ago permalink
    • Embed this notice
      :blank: (i@declin.eu)'s status on Saturday, 28-Feb-2026 04:34:24 JST :blank: :blank:
      in reply to
      • roko's basilisk
      • 👁
      @p @mpg @vii to be fair your best description of how the block is self was serialized was "it's deflate and here's an hexdump and it might change", not much of a reason to reimplement that
      In conversation about 8 months ago permalink
      pistolero and roko's basilisk like this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:37:17 JST pistolero pistolero
      in reply to
      • Yomiel
      @yomiel :liquidocelot:
      In conversation about 8 months ago permalink
    • Embed this notice
      Yomiel (yomiel@new.asbestos.cafe)'s status on Saturday, 28-Feb-2026 04:37:18 JST Yomiel Yomiel
      in reply to
      @p
      This is the greatest federation software ever made!
      In conversation about 8 months ago permalink
      pistolero likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:38:09 JST pistolero pistolero
      in reply to
      • roko's basilisk
      • 👁
      @mpg @vii

      > Also links for service actors, etc. are broken

      Domain to advertise is a config option I ain't set; maybe it should just be whatever domain you've put in the Host: header or maybe that lends itself to abuse. Do you want to try to figure out whether that facility can be abused or send money or drugs or do you want to do the network moves or time-travel to stop my crazy ex or do you want to stop the Chinese scraper from fucking the media server or what? Right now, DSMC/graf/Crunchbits are basically pushing the operation forward. I don't know what you're asking. "There appear to be bugs in this software that you haven't released." This is a config thing, not a bug.
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:44:01 JST pistolero pistolero
      in reply to
      @i @mpg @vii Anyway, the idea there, right, like I can have the server serve up that file, have it fill in the values for the constants, etc. Then it can serve a minimal client to browsers. The issue is that the client sucks. But whatever, it *works*.
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:44:03 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @i @mpg @vii

      > your best description of how the block is self was serialized

      Well, here's some shitty JavaScript.

      > and it might change

      Endpoints might change (especially the /rvl/full endpoint is going to be conditional). The block format has, so far, not ever changed; I think I mentioned this every time. The only change to the encoder/decoder so far has been to add streaming, that part is completely stable. (I'm going to make another change but it'll be backwards-compatible: basically jiggle the JSON around so as to create more duplicate blocks.)
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:53:50 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @i @mpg @vii (Enough people know JavaScript that I can exploit Cunninham's Law for the shit I don't wanna write.)
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 04:54:32 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @i @mpg @vii

      > - let s=''; for(let i=0;i<bytes.length;i++) s+=bytes[i].toString(16).padStart(2,'0'); return s;
      > + return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');

      CUNNINGHAM'S LAW IN ACTION: The best way to get the right answer on the Internet is not to ask a question; it's to post the wrong answer.

      Anyway, that function was one of the copypastas.

      > also duplicate lines in mime

      Yeah, if you couldn't tell, it's generated and then pasted.

      I really do have to get in the car.
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      :blank: (i@declin.eu)'s status on Saturday, 28-Feb-2026 04:54:33 JST :blank: :blank:
      in reply to
      • roko's basilisk
      • 👁
      @p @mpg @vii grats on getting that much out at least

      - let s=''; for(let i=0;i<bytes.length;i++) s+=bytes[i].toString(16).padStart(2,'0'); return s;
      + return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');

      should speed it up at least a little, also duplicate lines in mime
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      roko's basilisk (vii@dsmc.space)'s status on Saturday, 28-Feb-2026 05:13:15 JST roko's basilisk roko's basilisk
      in reply to
      • :blank:
      • 👁

      @p @i @mpg

      So, forgive me but I asked a clanker. I'm no more inclined to write JS than you are, save where money is involved where I am clearly a whore, but

      // At the top level const MAX_CONCURRENCY = 8; let running = 0; const queue = []; async function limitedFetchCached(id) { if (running >= MAX_CONCURRENCY) { await new Promise(r => queue.push(r)); } running++; try { return await fetchCached(id); // your existing one } finally { running--; if (queue.length) queue.shift()(); } } // 1. Much cleaner decompression (native stream, minimal copies) async function deflateRawDecode(u8) { const ds = new DecompressionStream('deflate-raw'); const stream = new Response(u8).body.pipeThrough(ds); const reader = stream.getReader(); const chunks = []; let total = 0; while (true) { const {value, done} = await reader.read(); if (done) break; chunks.push(value); total += value.length; } if (chunks.length === 1) return chunks[0]; // common case: zero extra copy const out = new Uint8Array(total); let off = 0; for (const c of chunks) { out.set(c, off); off += c.length; } return out; } // 2. Minimal getBlockContents (zero-copy when possible) async function getBlockContents(fb, meta) { let payload = fb; if (meta.compression === CTDeflate) { payload = await deflateRawDecode(payload); } if (meta.sz > payload.length) { const p = new Uint8Array(meta.sz); // allocate exactly once, rest is zero p.set(payload, 0); return p; } return payload; } // 3. New tree walker — no more intermediate full-node concatenations ever async function streamTreeContents(block, chunksOut) { if (block.length < BlockMetaSz) return; // safety for (let i = 0; i < block.length; i += BlockMetaSz) { const meta = deserializeBlockMeta(block.subarray(i, i + BlockMetaSz)); // subarray = zero-copy view const id = hexFromBytes(meta.hash); const fb = await fetchCached(id); const content = await getBlockContents(fb, meta); if (meta.type === BTParent) { await streamTreeContents(content, chunksOut); // recurse directly on this subtree } else { chunksOut.push(content); // leaf data — just collect } } } // 4. Updated reassemble (returns Blob directly — most efficient for your use case) async function reassemble(topId) { const chunks = []; try { const top = await fetchCached(topId.toLowerCase()); await streamTreeContents(top, chunks); // MIME sniff only needs first few bytes (signatures are tiny) const prefix = chunks.length ? chunks[0].subarray(0, 1024) : new Uint8Array(0); const type = detectMIME(prefix); return new Blob(chunks, { type: type || 'application/octet-stream' }); } catch (err) { // partial still works the same way const e = new Error(err.message); e.partial = new Blob(chunks, { type: 'application/octet-stream' }); throw e; } }
      In conversation about 8 months ago permalink

      Attachments


      pistolero likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 05:13:20 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @i @mpg @vii I don't know how to benchmark JS like this.

      https://media.freespeechextremist.com/rvl/full/f56bad2b98d87ec1c873270e0731ddc2d9dc1fc7498fabe86e8beee8bd66097a?id=f56bad2b98d87ec1c873270e0731ddc2d9dc1fc7498fabe86e8beee8bd66097a
      In conversation about 8 months ago permalink

      Attachments

      1. No result found on File_thumbnail lookup.
        Revolver JS Client
      roko's basilisk likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 05:54:45 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @vii @i @mpg I feel like there should be an easier way to do it as coroutines and just one eats blocks and the other fetches them. Being able to grab from multiple servers should make the fetching easier.
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      roko's basilisk (vii@dsmc.space)'s status on Saturday, 28-Feb-2026 06:02:30 JST roko's basilisk roko's basilisk
      in reply to
      • :blank:
      • 👁
      @p @i @mpg You're probably not wrong. I really don't want to be sketching JS myself right now (I am already sketching python because different lingua franca) and I don't like the what the clanker put out. Theoretically yes, but by what strategy? Do we just race for the first one to return and kill the rest? That seems... potentially expensive.
      In conversation about 8 months ago permalink
      pistolero likes this.
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 06:15:38 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @vii @i @mpg

      > I really don't want to be sketching JS myself right now

      Nobody wants to write JS!

      > Theoretically yes, but by what strategy? Do we just race for the first one to return and kill the rest? That seems... potentially expensive.

      The idea is to have one in-flight on all the servers you've got, and then for each block it doesn't find (for obvious reasons, regular HTTP traffic to hit the endpoint doesn't trigger the slush), rotate the list to ask the next server; the side-effect is that unless the server you get the head block from does some sniffing on block contents (in which case it could know what you're fetching) then none of the other servers knows what you're assembling, so you could enforce fetching the first one (or all the non-leaf blocks) from servers with .onion hostnames and then the rest could. (This isn't perfect, like someone could construct a blob such that there's a block only people fetching one specific thing will fetch.) The problem with a tree is you've gotta pointer-chase down the list but that only really matters for the first few blocks because it gets to be a linear stream in a hurry, so maybe something like use one fetching strategy until you get to leaf blocks and then those can be filled in in parallel using a different strategy. Or something like have the fetcher notice when it's hit the bottom and have it start firing off parallel requests to populate the cache while the local CPU runs around juggling arrays because JavaScript is a language for idiots and it's not good at strings or blobs.

      Anyway, concept of proofed, like, there'll be a reasonable strategy for doing this client-side but I don't know if client-side assembly is worth it instead of just running a local peer.
      In conversation about 8 months ago permalink
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 06:19:28 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @vii @i @mpg

      > I don't know if client-side assembly is worth it instead of just running a local peer.

      Well, phones. Phones are always a fuck.
      In conversation about 8 months ago permalink
    • Embed this notice
      pistolero (p@fsebugoutzone.org)'s status on Saturday, 28-Feb-2026 06:24:09 JST pistolero pistolero
      in reply to
      • :blank:
      • roko's basilisk
      • 👁
      @i @mpg @vii For a JS dingus client with a sparse network, this may be tricky unless you want it to do discovery and bootstrapping.
      In conversation about 8 months ago permalink
      roko's basilisk likes this.
    • Embed this notice
      :blank: (i@declin.eu)'s status on Saturday, 28-Feb-2026 06:24:10 JST :blank: :blank:
      in reply to
      • roko's basilisk
      • 👁
      @p @mpg @vii kademlia itself has the α parameter to specify how many nodes should be raced for requests, both for concurrent resiliency and network gossip
      In conversation about 8 months ago permalink
      pistolero and roko's basilisk like this.

Feeds

  • Activity Streams
  • RSS 2.0
  • Atom
  • Help
  • About
  • FAQ
  • TOS
  • Privacy
  • Source
  • Version
  • Contact

GNU social JP is a social network, courtesy of GNU social JP管理人. It runs on GNU social, version 2.0.2-dev, available under the GNU Affero General Public License.

Creative Commons Attribution 3.0 All GNU social JP content and data are available under the Creative Commons Attribution 3.0 license.