I abused the IPv6 address space by making every IP a pixel on a canvas and a color.
Run ping -c 1 2a01:4f8:1c1e:85cd:XXXX:YYYY:RRGG:BBAA to draw a pixel on the canvas. View the canvas here:
https://canvas.zipdox.net
I abused the IPv6 address space by making every IP a pixel on a canvas and a color.
Run ping -c 1 2a01:4f8:1c1e:85cd:XXXX:YYYY:RRGG:BBAA to draw a pixel on the canvas. View the canvas here:
https://canvas.zipdox.net
IP farm
>zipdox.net
I ain't clicking that shit
>he isn't under vpns hosted in kuwait and afghanistan
Sounds like a (You) problem.
i don't get it
Are you familiar with IPv6?
okay i dont get it either
do you own 2a01:4f8:1c1e:85cd:*? do all those ip belong to the same machine? how does this work
It's a /64 subnet, so yeah, he "owns" all of those IPs. Pretty standard even for cheap vHosts to give you such a large subnet.
The designers of IPv6 were morons who thought every machine on a LAN should have a unique public IP. So the common practice is to assign entire subnets to customers instead of a single IP.
kek
and here i thought its worst feature was the hard to remember addresses
I envy midwits
It's true though. Everyone uses IPv4 NAT as implicit firewall. With IPv6 you suddenly need a real firewall and network configuration gets harder.
OP wants you to dox yourself by giving him your you his IP
ESL
You are severely mentally ill.
SIR
What could he do with it?
ipv6 addresses are unique. It is unique as your finger print and it doesn't change even if you reset your router. You're fricked if you gave him your ipv6.
You got a good laugh out of me
I hope he's trolling and not actually this fricking moronic.
sounds like a problem to take up with your isp
>t. hasnt had an ipv4 change in over a year
you're fricking moronic holy shit
ping: connect: Network is unreachable
thanks ipv6, you really made the internet more connected!
>Be a cuckold without IPv6
>this is OP's network's fault and not your own and your substandard ISP / peering network
what's the point of alpha if you don't store it and force it to 255
now draw her playing bad apple
doing
>6 seconds per 3000px wide line
>5550 lines
this is gonna take 10 hours to dump
Are you the moron drawing the massive image with the Chinese characters?
i'm not moronic
zooming kills the website
cool idea albeit
>Noa
>naked
Oh my god.
>albeit
It is illegal to use this word the way that you did, and at the end of a sentence no less. Please take AT LEAST 100 more hours of ESL classes before posting here again. Thank you in advance for your compliance.
I do it on purpose to trigger people like you thoughever
Eventhoughbeit
this aint it, you could of said something different
Where is the Noa? Can't find it.
you have to make her yourself
I guess she got overwritten early on.
Do you just send the entire canvas for redraws?
wow that's fricking moronic
No, look at the URL, it's /tile/X/Y.
No, what's moronic is that the data is purged from the browser just by going slightly out of the window bounds.
Deltas are already being sent through the websocket.
>that would require constant communication between clients and server
it's called a websocket
>it would be somewhat easy to DDOS the server with calculations going for every single client
rate limit it and send only whatever is in the screen
anon have you ever fricking programmed in your life
Not webdev, I am just making shit up from what I know about qt and gtk.
You don't know what you're talking about. Quiet.
I don't want to get doxxed. I refuse to access your website. Yes I'm from India.
what am i doing wrong?
windows and/or not having an ipv6 address yourself
is it possible to add an ipv6 here?
Yes, if you want your internet connection to stop working.
living in wrong country
https://www.majorgeeks.com/content/page/how_to_enable_or_disable_ipv6_in_windows.html
https://test-ipv6.com/
https://tunnelbroker.net can fix that for you
Alex is a gay name.
Neat
You should monitor it while it's up. You just know that some fricker will try to put pizza on it.
my router died or crashed from flooding with icmp packets
can you make it so it remembers the camera coordinates between refresh, the site is badly lagging it's a pain
I never wrote a movable canvas before so I didn't really know how to approach it. I'll write the coord storage down.
Also performance is atrocious because you're forcing draw commands on every pixel set, batch them so they're all drawn only on requestAnimationFrame, your socket message handler shouldn't trigger draws you triple fricking moron
I know, I'm trying to think of a better way to do it.
>each tile a separate offscreen canvas 2d drawing onto a bigger canvas 2d
holy mother of moronation
also allow zoom out to less than 1x. hard to navigate that bigBlack person space.
i hope someone will write some stable diffusion bot to randomly inpaint parts of the picture, or multiple bots fighting each, and we'll be able to watch it transform live all the time.
how long do you plan on keeping this running?
>allow zoom out to less than 1x. hard to navigate that bigBlack person space.
try
then realize how big a mistake it is to want this when there's not proper optimization
OP I am BEGGING please ban the homosexual thats constantly spamming that huge image of a e-girl with a penis
nobody this autistic deserves to get their way
how does this qualify as spamming? I'm just protecting what I drew from vandalism, you have 95% of black space to fill, why are you b***hing.
Implemented position saving. Clear your browser cache and it should work.
how did people even get entire pictures on it
Enjoy:
from os import system
from sys import argv
#The file should be a raw RGB888 file.
file=open(argv[5], "rb")
frame=file.read()
width=int(argv[3])
height=int(argv[4])
x=int(argv[1])
y=int(argv[2])
for i in range(height):
for j in range(width):
print("ping -c 1 2a01:4f8:1c1e:85cd:"+hex(j+x)[2:].zfill(4)+":"+hex(i+y)[2:].zfill(4)+":"+hex(frame[3*(i*width+j)])[2:].zfill(2)+hex(frame[3*(i*width+j)+1])[2:].zfill(2)+":"+hex(frame[3*(i*width+j)+2])[2:].zfill(2)+"ff")
Frick
from os import system
from sys import argv
#The file should be a raw RGB888 file.
file=open(argv[5], "rb")
frame=file.read()
width=int(argv[3])
height=int(argv[4])
x=int(argv[1])
y=int(argv[2])
for i in range(height):
for j in range(width):
system("ping -c 1 2a01:4f8:1c1e:85cd:"+hex(j+x)[2:].zfill(4)+":"+hex(i+y)[2:].zfill(4)+":"+hex(frame[3*(i*width+j)])[2:].zfill(2)+hex(frame[3*(i*width+j)+1])[2:].zfill(2)+":"+hex(frame[3*(i*width+j)+2])[2:].zfill(2)+"ff")
Use this to convert your pictures:
ffmpeg -i input.png -f rawvideo -pix_fmt rgb24 output.raw
>system("ping...")
ngmi
Yeah, Popen is faster, I know.
Died while I was using script to draw scott tibbs
I don't code, so I was trying to get GPT to do a C/C++ version with parallelism.
no success
Frick it, just managed to
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream> // for std::ostringstream
#include <iomanip>
using namespace std;
void pingCell(int x, int y, int width, int height, const unsigned char* frame) {
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
ostringstream command;
// Construct the ping command for each cell
command << "ping -c 1 2a01:4f8:1c1e:85cd:"
<< hex << uppercase << setw(4) << setfill('0') << (j + x) << ":"
<< hex << uppercase << setw(4) << setfill('0') << (i + y)
<< ":" << setw(2) << setfill('0') << static_cast<int>(frame[3 * (i * width + j)])
<< setw(2) << setfill('0') << static_cast<int>(frame[3 * (i * width + j) + 1]) << ":"
<< setw(2) << setfill('0') << static_cast<int>(frame[3 * (i * width + j) + 2]) << "ff";
// Execute the ping command
system(command.str().c_str());
}
}
}
int main(int argc, char* argv[]) {
if (argc < 6) {
cerr << "Usage: " << argv[0] << " x y width height filename" << endl;
return 1;
}
int x = atoi(argv[1]);
int y = atoi(argv[2]);
int width = atoi(argv[3]);
int height = atoi(argv[4]);
const char* filename = argv[5];
FILE* file = fopen(filename, "rb");
if (!file) {
cerr << "Error opening file: " << filename << endl;
return 1;
}
unsigned char* frame = new unsigned char[3 * width * height];
fread(frame, sizeof(unsigned char), 3 * width * height, file);
fclose(file);
pingCell(x, y, width, height, frame);
delete[] frame;
return 0;
}
I know this can be done better (like using multiple workers to ping faster). But again, I don't code.
Is that the best you can do? I bet you can get ChudGPT to shit out C code for sending raw packets.
You guys are writing in C/C++ only to call the ping command rather than sending an ICMP packet directly. Step up your game.
idk how to make a ICMP packet sender with retransmission, OP.
https://datatracker.ietf.org/doc/html/rfc792
I love RFC. Ignore that this one is for IPV4 not IPv6.
OK bothered with a second search.
https://datatracker.ietf.org/doc/html/rfc4443
Trivial header.
Just proompt
As I expected, GPT 3.5 isn't good enough to do a ICMP packet sender, I'm giving up.
Just use Claude.
Is it free? I'll check it
>Claude is available in a bunch of african poor countries
>But isn't in Brazil
Is available in Israel as well too, if it matters
>with retransmission
Pointless, I've noticed that even when my packets get a response, they still don't appear on the canvas. So I've given up on that approach.
I've been doing this and grabbing the canvas to skip existing pixels.
But when the site shits the bed it takes forever to get the canvas. It's faster to just crap everything out again.
wtf she has a bepis
hypothetically, considering there are 256x256 tiles of 256x256 pixels, and the storage is 24bpp (maybe even 32bpp?) what would happen if someone (not me :^) ) drew one pixel in the middle of every tile
The canvas is stored as one massive 12.9GB file mmap'd into memory. Not much would happen really.
>12.9GB file mmap'd into memory
Does it mean that we are currently killing your SSD?
Looks like it's gone back to being unbearable. I have a hard time getting Lorie on the canvas.
Sorry for printing Kali over Lorie yesterday. I tried putting her next to Lorie without calculating the dimensions (I'm lazy) and messed up.
No problem, dude, I overwrote incestanon's message at some point so I'm guilty too. Also, are you using my shitty Python script or the C++ thing that someone else posted?
The C++ script, that was me who sent.
I'm outside home now, but I'll send you my new one when I arrive home (Doesn't change much in code, but parallelism makes it way faster)
Here
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream> // for std::ostringstream
#include <iomanip>
#include <thread>
#include <vector>
using namespace std;
void pingCell(int x, int y, int width, int height, const unsigned char* frame, int xi) {
for (int i = xi; i < height; ++i) {
for (int j = 0; j < width; ++j) {
// Create a new ostringstream for each ping command
ostringstream command;
// Construct the ping command for each cell
command << "ping -q -c 1 2a01:4f8:1c1e:85cd:"
<< hex << uppercase << setw(4) << setfill('0') << (j + x) << ":"
<< hex << uppercase << setw(4) << setfill('0') << (i + y)
<< ":" << setw(2) << setfill('0') << static_cast<int>(frame[3 * (i * width + j)])
<< setw(2) << setfill('0') << static_cast<int>(frame[3 * (i * width + j) + 1]) << ":"
<< setw(2) << setfill('0') << static_cast<int>(frame[3 * (i * width + j) + 2]) << "ff";
// Execute the ping command in a separate thread
thread pingThread([commandStr = command.str()]() {
system(commandStr.c_str());
});
pingThread.detach(); // Detach the thread to run independently
}
}
}
int main(int argc, char* argv[]) {
if (argc < 6) {
cerr << "Usage: " << argv[0] << " x y width height filename xoff" << endl;
return 1;
}
1/2
int x = atoi(argv[1]);
int y = atoi(argv[2]);
int width = atoi(argv[3]);
int height = atoi(argv[4]);
const char* filename = argv[5];
int xi;
if (!argv[6]){
xi = 0;
} else {
xi = atoi(argv[6]);
}
FILE* file = fopen(filename, "rb");
if (!file) {
cerr << "Error opening file: " << filename << endl;
return 1;
}
unsigned char* frame = new unsigned char[3 * width * height];
fread(frame, sizeof(unsigned char), 3 * width * height, file);
fclose(file);
pingCell(x, y, width, height, frame, xi);
delete[] frame;
return 0;
}
Isn't better than
tho
yours may be better, mine doesnt retransmit, which means that it is at the mercy of packet lose, I believe that calling the ping command is good for this, but much slower. I will try to refactor to include some kind of retransmit.
>13gb
why do you need so much for a raw image?
The canvas is 65536x65536
do the math, moron
is that ebussi
anon really wasn't joking around when he said he would paint dicky
That's just by some jap artist.
cool site
what does the network traffic look like?
What is that qr code?
please optimize the renderer, it's absolute dogshit the likes i've never seen before, it's like sisyphus in code shape
my ISP doesn't support ipv6 and probably never will
Why are there so many footgays here suddenly?
>suddenly
its dead
I disable system ICMPv6 responses and made it respond in my code, to improve echo response accuracy.
great so now I have to ignore timeouts and assume shit has properly been received, nice idea
could have spent that time writing a non-garbo renderer instead, homosexual
Found a problem. It's not sending the replies from the right address.
dont bother sending replies please; who cares, fire and forget
What is Chito doing with cancerfrogs?
I can't get my script to work
I don't know how you get yours to send the images so quickly, are you flooding it?
I'm giving up and going to bed
keep trying anon. I want to know what you have to show us
reminds me of https://www.youtube.com/watch?v=JcJSW7Rprio
How exactly do you record the ping packets? A naive way might be just using pcap and parsing the output stream or something.
if u snoop around they have it on gitlab
'''
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
from scapy.all import *
def send_packet(target_ip):
packet = IPv6(dst=target_ip)/ICMPv6EchoRequest()
send(packet)
def process_image(image_path, max_threads=1000):
img = Image.open(image_path)
img = img.convert('RGBA')
width, height = img.size
with ThreadPoolExecutor(max_workers=max_threads) as executor:
for x in range(width):
for y in range(height):
r, g, b, a = img.getpixel((x, y))
target_ip = f"2a01:4f8:1c1e:85cd:{x+0:04X}:{y+0:04X}:{r:02X}{g:02X}:{b:02X}{a:02X}"
executor.submit(send_packet, target_ip)
process_image("frickyou.png")
'''
from PIL import Image
from concurrent.futures import ThreadPoolExecutor
from scapy.all import *
def send_packet(target_ip):
packet = IPv6(dst=target_ip)/ICMPv6EchoRequest()
send(packet)
def process_image(image_path, max_threads=1000):
img = Image.open(image_path)
img = img.convert('RGBA')
width, height = img.size
with ThreadPoolExecutor(max_workers=max_threads) as executor:
for x in range(width):
for y in range(height):
r, g, b, a = img.getpixel((x, y))
target_ip = f"2a01:4f8:1c1e:85cd:{x+0:04X}:{y+0:04X}:{r:02X}{g:02X}:{b:02X}{a:02X}"
executor.submit(send_packet, target_ip)
process_image("frickyou.png")
forgot how the codeblock worked here
based /misc/ schizo covering up that disgusting cartoon
>python
I thought this was IQfy not scratch mit edu
Given sending icmp packets is privileged by default, shelling out with python is basically perfectly normal.
Very cool. Fun idea.
How is the futae-girl homosexual script so fast? It's so fricking quick
not quick enough
that's a boy
I'm not hentroon enjoyer, therefore Idc.
>i'm not one of them
>uses terms exclusive to them instead of the normal term "boy"
yeah right, 41% yourself, closet homosexual
Where tf futae-girl is exclusive.
Futae-girl, boy, glowie, whatever, doesn't change the fact that this homosexual script is fast
>the only intact and largest image is an naked boy
confirmed that every ipv6 homosexual is a boy molesting fruit
The kalis are also intact tho.
This shows that every ipv6 homosexual is also a sar
my script is just typescript, it's just fast because I'm running it from a VPS on the same continent as the OP's server, same code on my home machine is 6 times slower, even though I technically have a better fiber bandwidth (though router's my ISP's, and is quite shit)
Could probably get much faster speeds buying a VPS in the same datacenter as OP, they seem to be using hetzner, in germany
I think location is more important than the actual code.
Unless you're a moron spawning system commands.
makes sense. I'm far away from op (Brazil, hue hue hue, thurd world) so it takes a while until I finish the images
>websocket closed
>404
>502
when will it stop
When I figure out how to calculate an ICMPv6 checksum.
What's your opinion in the progress of the canvas, OP?
Yeah idk what the frick is with the checksum shit
I'm trying to use raw sockets to send data and the checksum calculation is not explained in nearly enough detail. I'm like 1 off somehow in the checksum calculation, but it moves up/down slightly when I modify the data.
I was just using a 16 bit accumulator somewhere I should have been using a 32 bit accumulator
site's dead now though 🙁
packet loss visualizer
Is it just my impression or the top is inscreasing?
Both the Kali and the other image have started at y=0 as well I remember, now there's a big gap between both images and the border
That's it anons, I'm going to sleep now, sars.
I wanted to say that I had fun, even with this shit socket disconnecting everytime. Thanks very much everyone who participated in OP's IP farm.
>that 3d homosexual that looks like he's disintegrating into dust
top kek
something tells me these black boxes aren't actually someone, and are most likely the server dying.
#include <opencv2/opencv.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ip/icmp.hpp>
#include <iostream>
#include <vector>
#include <iomanip>
#include <sstream>
#include <cstring>
using namespace cv;
using namespace boost::asio;
using namespace std;
string formatIPv6Address(const string& base, int x, int y, int r, int g, int b) {
stringstream ss;
ss << hex << base << ":"
<< setw(4) << setfill('0') << x << ":"
<< setw(4) << setfill('0') << y << ":"
<< setw(2) << setfill('0') << r
<< setw(2) << setfill('0') << g << ":"
<< setw(2) << setfill('0') << b << "ff";
return ss.str();
}
struct icmpv6_header {
uint8_t type;
uint8_t code;
uint16_t checksum;
uint16_t identifier;
uint16_t sequence_number;
};
void send_icmp_echo_request(io_context& io_context, const string& target_address) {
static ip::icmp::socket socket(io_context, ip::icmp::v6());
try {
if (!socket.is_open()) {
socket.open(ip::icmp::v6());
}
socket.set_option(ip::unicast::hops(128));
ip::icmp::resolver resolver(io_context);
ip::icmp::endpoint destination = *resolver.resolve(ip::icmp::v6(), target_address, "").begin();
icmpv6_header echo_req{};
echo_req.type = 128; // Echo Request
echo_req.code = 0;
echo_req.checksum = 0;
echo_req.identifier = htons(12345);
echo_req.sequence_number = htons(1);
char send_buf[sizeof(echo_req)];
std::memcpy(send_buf, &echo_req, sizeof(echo_req));
socket.send_to(buffer(send_buf, sizeof(send_buf)), destination);
}
catch (const std::exception& e) {
cerr << "Error sending ICMPv6 echo request: " << e.what() << endl;
socket.close();
throw;
}
}
int main(int argc, char** argv) {
if (argc != 5) {
cout << "Usage: ./image_packet_sender <image_path> <ipv6_base> <offset_x> <offset_y>" << endl;
return 1;
}
string imagePath = argv[1];
string ipv6Base = argv[2];
int offsetX = stoi(argv[3]);
int offsetY = stoi(argv[4]);
// Load the image
cout << "Attempting to load image from: " << imagePath << endl;
Mat image = imread(imagePath, IMREAD_COLOR);
if (image.empty()) {
cout << "Could not open or find the image" << endl;
return -1;
}
printf("Image size: %d x %dn", image.cols, image.rows);
io_context io_context;
// Iterate over each pixel
for (int y = 0; y < image.rows; y++) {
for (int x = 0; x < image.cols; x++) {
Vec3b color = image.at<Vec3b>(Point(x, y));
int red = (int)color[2];
int green = (int)color[1];
int blue = (int)color[0];
string formattedAddress = formatIPv6Address(ipv6Base, x + offsetX, y + offsetY, red, green, blue);
cout << "Sending to address: " << formattedAddress << endl;
send_icmp_echo_request(io_context, formattedAddress);
}
}
cout << "Done." << endl;
return 0;
}
Very fast, but maybe too fast. lots of dropped packets but I am halfway around the world.
So we can send dicky unnoticed now?
what a slow piece of shit site
Frick (You)! Also, why (You) need my IP ???
>broken for mobilegays
Reeeee fix your shit OP
I hope anon manages to frick his sister one day.
sorry, I have IPv6 disabled for my network, I only work with static ipv4 non cgnat.
anime DoS
>troony DoS
Way to ruin it.
OP Plz ipban the trap homosexuals
OP please keep them I love the delicious wieners
i love girl dicks too
drawing a literal satan at 6666,6666
dick = boy
you like boys
Zip can you apply compression when loading not downloaded chunks and zoomed out a lot?
no, im not talking about the e-girl
self snitched lol
if you wanna zoom out to see if anons put something off screen, paste it in the console.
document.onwheel = function(evt){ const zM = 1 + -evt.deltaY / 1000; let nS = scale * zM; const cX = evt.clientX / scale + x; const cY = evt.clientY / scale + y; const nCX = evt.clientX / nS + x; const nCY = evt.clientY / nS + y; x += cX - nCX; y += cY - nCY; normalizeCoords(); scale = nS; setZoomLabel(); updateTiles(); redrawTiles(); updateCoords();}
>IQfy of the 00s and early 10s: goatse and CP
>IQfy of the 20s: trump and troony porn
Is the packet loss bad today or something? Same code as yesterday but eveything I try to draw just looks like a bunch of black specks
packet loss just dropped to 0 when you posted that, lel
but yeah, it was unbearable just a few moments ago
Someone erase that not-valid "person" already.
why don't you guys draw your shit somewhere else, we have a 64k*64k canvas ffs
what's so funny about defacing other's images, or are you really that envious people like things at all that you have to just deface with noise that's as sparse and nuanced as your personality, you have really nothing to show?
go back
It's the survival of the mighty.
who's the pornstar behind trump?
Just for your information, said pornstar has a dick. I think it's Taftaj.
noise chads wwa
https://pastebin.com/k1bExqt2
>bad apple at 0.5 fps
Is this the power of python? Or is it the server's or website's fault?
It's both
Looks like the power of autism.
ffs op just replace setInterval with requestAnimationFrame, it's not that hard holy shit.
OP compute mipmaps of the image so you can zoom out without requesting the full image
Also this anon is right. It's the only way to zoom out and see the whole thing without requiring gigabytes of bandwidth.
thankfully, variables aren't in closures so I can just do
requestAnimationFrame(function aa(){
for(tileName in drawQueue){
const tile = storedTiles[tileName];
if(!tile) continue;
const queuedTile = drawQueue[tileName];
for(let drawCommand of queuedTile){
const xPixel = drawCommand[1];
const yPixel = drawCommand[3];
tile.data.data.set(drawCommand.slice(4), (yPixel * 256 + xPixel) * 4);
}
const tileX = queuedTile[0][0];
const tileY = queuedTile[0][2];
tile.ctx.putImageData(tile.data, 0, 0);
drawTile(tileX, tileY);
}
drawQueue = {};
requestAnimationFrame(aa);
});
in the console and it refreshes decently
Thanks very much, anon. I'll need those
dumping more dicky, bottom right of nahida
Okay so making my own ICMP responses was too difficult. Instead I made the socket more reliable by reading in a while loop in the callback until it returns -1. Also set up requestAnimationFrame.
>ICMP
>difficult
Calculating the checksum is a PITA. I tried several times but it's always off by a bit. Granted it was like 5AM and I was exhausted. If the need arises I might try again.
>but it's always off by a bit
Maybe you just need to add a bit, lul.
Pretty neat stuff, OP.
>Also set up requestAnimationFrame.
Good, now you can go on to using abort so my browser/ram/bandwidth doesn't get raped when i'm trying to scroll to my region because you still haven't implemented persistent for the screen position between refreshes, which is the most likely reason we're stuck in the top left corner of this canvas
https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort
I can help, I posted code that works correctly with raw sockets
. You probably need to use a 32 bit accumulator and do a final pass to roll the top bits back into the lower 16. Ones complement sum works differently than a normal sum, if you're only off by a bit that's probably what's happening, or at least was the issue in my case.
>you can scroll and zoom
oh
You didn't know? Holy fricking moron.
Also can you guys stop warring in the top left corner and start moving outward?
No scrollbar, no indication that it's possible.
How do I zoom lower than 1x?
Currently not possible (disable it cause it makes your browser shit itself). I'll try to make moving use requestAnimationFrame in a bit.
>stop warring in the top left corner and start moving outward?
no we can't, read
scrolling consumes a ton of bandwidth, even for black tiles and the requests aren't aborted when the tiles go offscreen so the later tiles take even longer to load, fix your shit
Even if you go outward, one little refresh and you have to make your way there again.
2/10
Also it's not possible to see where you are intuitively. Holy shit if the full thing is really 64x64k big.
we can't zoom out. so we can't move away from top-left at comfortable speed and knowing where we're going.
Are the noisy tiles a bug?
no its morons who are spamming it intentionally and also the result of packet loss
the packet loss and missing line are what make it so cool though
it has sovl
I just confirmed the homosexual drawing the genshin e-girl kid with the wiener is in fact French (very unsurprising).
The wiener was a disappointment. Nationalities of the other e-girl posters?
Also the canvas is black now.
>Also the canvas is black now.
Nevermind, saved position in a black area.
>Nationalities of the other e-girl posters?
all me
>dox people
very unsurprising from zipDOX
rude thing to do when i bumped your thread multiple times when it was about to die, and drew a large provocative image to bait activity
That's true, I spent at least an hour censoring that.
I found that Kali is beautiful elsewhere instead of censoring a e-girlpenis
please ban france
nahida won
i won
>nooooooo i have inferior technology and can't compete with baguette superiority, it's unfair!
Nice. Xiao is best girl (male).
Dumb frog at 9000,12000.
been messing with it since last night
it's kinda shit that spamming hard enough causes packets to drop, since it incentivizes spamming until it's unusable
you can of course send more like the other guy, and 'win' but that ends up making it worse
so people end up in territory wars and crash the site
one anon last night was sending his image over and over non stop, you could tell anyone putting pixels in that space was instantly wiped away and the server was unusable, but when he stopped everything was fine
also what's the issue? cpu? getting 1gb/s of pings? complete mystery?
>also what's the issue? cpu?
meme code that's compiled without optimizations doing meme casts and not understanding that if you have 256 pixel wide tiles and 256 tiles then separating the two bytes is the same as directly using the short word as a global coordinate
I can't imagine that's a bottleneck.
Well the bottleneck is most obviously the random access on an mmapped file.
And that it would become worse if he implemented mipmaps on top of that as each pixel set could pull 10 different pages into memory instead of one.
I don't know what he's working on atm, but abortable fetch requests look more feasible currently, I believe mipmaps would bring their lot of trouble.
>get rid of alpha
yeah this, nobody uses this, you have to deal with spammer spamming random noise so you have to fetch the tile state all the time anyway, if you want color mixing just compute it client side
>Well the bottleneck is most obviously the random access on an mmapped file.
Is it? The whole thing should fit into your server's RAM. RAM bandwidth is fast.
It's 12GB, 16 with mipmap, those aren't exactly cheap... well, actually I think oracle can give you a 24gb ram arm server for free.
But I think OP most likely has the cheapest hetzner option, with 4 gigs
My desktop machine has 32GB and I feel like ti's too little. If it's only 3-4GB you get awful worst cases, sure. Maybe he should just have made the canvas smaller.
Even if it's fully in RAM you basically pay a cache miss on every access. You need some swizzling to avoid this penalty. E.g. if cache line size is 64 bytes and 3 bytes per pixel, you can store 21 pixels in a single cache line. Ideally, cache lines would correspond to some square sub region of the image, but 21 isn't a perfect square so you can do 3x7 (wastes 1 byte per 21 pixels) or 5x4 (wastes 4 bytes per 20 pixels) size tiles. Multiple writes/reads would be more likely to hit the same cache line. Really, you don't want to waste bytes so you need some packing that divides 512 bits better, e.g. RGB565, then you can have perfectly dividing 4x8 tiles, or RGB332 which gets you 8x8 tiles.
Cache refilling is pretty fast compared to pushing packets through the network stack and parsing them. Tiling the image may help, because people likely do localized accesses when writing to images, but even then they tend to write scanline by scanline so the penalty isn't that bad.
Idk how well multithreaded OP's server is, but it shouldn't spend much time waiting on the network, should just be epolling for most of it. I was looking at how GMainLoop works and it might not be great, seems like they're taking locks in some places which isn't great if you want to do multithreaded dispatch (removing alpha makes this easier since you don't need to read and blend, can just blindly write and you don't really care about the image view being coherent if you don't blend). His server might need some tweaking of how much buffering the kernel is doing, but I'm not familiar with that stuff. io_uring or using an eBPF might be faster, but it might not matter if OP is saturating his download/upload.
>DMA from ethernet MAC to RAM
>waking up the CPU
>walking the MAC buffer
>handling the cache misses and transfering the packet data to the CPU's cache
>picking out packets
>parsing the packet headers
>dispatching them to the network subsystems
>waking up the user process waiting for the raw buffer
>copying it to userspace (more cache misses)
>parsing the packet again
There's probably a lot going on.
>Idk how well multithreaded OP's server is
Not. Except for NGINX, the entire thing runs in a single event loop. I wrote this in like 2 days.
enable gz compression in nginx for the love of god
Using double for alpha compositing is overkill when you're going back to 8 bit, should use float or just get rid of alpha imo
The image is not stored line by line, which you'd know if you read the rest of code. It's stored tile by tile, so facilitate sending to the clients.
From testing on my end, you're not terribly incentivized to spam it as hard as you can, although I can hit my max upload of 40Mbit, doing so results in most of the packets being dropped somewhere between me and the server, throttling to ~7Mbit has much better delivery rates.
when there is spam, doing even one pixel at a time, they show up as noise since most of them were dropped somewhere
if it's dying enough, there are long blank segments
I think my ISP is disconnecting me for sending too much ICMP traffic lol. Some automated system probably thinks I'm part of a botnet in a DDoS.
Didn't they used to use ping floods to DDoS servers? I recall /b/ trying this a bunch of times.
Before mipmaps, he should send downsampled images compressed with jpg while scrolling.
>bad apple is already running in the corner
basde
>no keyboard controls
This is probably why I didn't get that you can scroll and zoom.
>someone trying to censor the genshin dick
Thanks, I don't want to turn gay.
thanks for telling me :^)
>anons shit optimized censor
>chads lightning fast dicky dick(feminine)
give up bro, boy dicky won
the dicky fricker has geographic advantage, plus is handling retransmission. My C code is much faster but like 30 percent of my packets even make it because it's too fast.
cope
>geographic advantage
kek, it'd only take a few cents to rent out a vps for a few hours in the same datacenter as OP's vps
>handling retransmission
maybe using c wasn't that smart a choice, huh
In my testing, pinging without waiting for a reply was consistently slower than waiting for replies, even taking into account retransmission and high transmission rates.
Causing congestion is more harmful than raw throughput.
The loss isn't caused by the inherent "unreliable" nature of the protocol, but because you're congesting your network path.
>The loss isn't caused by the inherent "unreliable" nature of the protocol, but because you're congesting your network path.
Same thing. Routers and switches can't possibly buffer all traffic until it's been relayed.
Remove alpha, change bit depth to 16 bit, you save half the bandwidth and memory.
alpha isn't stored, it's only used for compositing so it's only 33% savings
The image isn't stored in RAM, it's mapped to disk. It doesn't even consume 200MB of RAM.
Do you know how mmap actually works?
>It doesn't even consume 200MB of RAM.
lol do you have vm.swappiness set to 90 or something
mmap'd memory doesn't show as occupied in htop for whatever moronic reason. probably same moronic conclusion as the troony who claimed she had halved llama.cpp's memory usage a year ago. of course whatever is being used at any given time is in ram. and if you have a lot of traffic all over the place and your system isn't moronic as frick it will keep that in memory as long as there is enough memory.
>mmap'd memory doesn't show as occupied in htop for whatever moronic reason.
doesn't it show as cache (yellow bars)?
mmap'd memory is the same as memory in the kernel's page cache, or whatever it's called. The whole point of mmap is that pages can be added ore removed from RAM as needed. Writing to mmap'd memory is much like doing a write(), except that the latter requires kernel entry and a memcpy.
adding a noa at 7455 7995
4K noa complete
const obs = new MutationObserver(c => {
if (coords.textContent.includes('|'))
return;
const [x, y ] = coords.textContent.split(',').map(e => +e);
coords.textContent = `${x}, ${y} | (${x>>8}, ${y>>8})`
})
obs.observe(coords)
paste this in console if you want tile coordinates next to your pixel coordinate
To optimally draw pixels you probably need to figure out the maximum rate at which you can send pings without packet drops.
Also, does the ping utility even send a minimum ping packet size? Since the ping payload isn't used, it would be better to reduce the packet size.
my code in
does not include a payload and the packet sizes are something like 30 to 50 percent less large.
That's true. I thought about that, but I was phoneposting at college at the moment.
Probably. I just don't know how to do it. (The code was mostly done through ChatGPT.) The furthest I can manage to think is setting a std::this_thread::sleep_for(std::chrono::nanoseconds(time))
and I'm not sure if it's the most efficient way.
Thanks (even tho it's just chatgpt code), the ping command is good for retransmitting, but I was trying to send the packets through the code itself because of the speed, like you did.
>Pixel coordinates (hexadecimal)
FRICK. No wonder I've been shitting pixel vomit onto the canvas.
How can we export the whole canvas to jpg?
idk how you would download the whole canvas. but here is
ffmpeg -f rawvideo -pixel_format rgba -video_size (width)x(height) -i input.raw output.png
Waiting for that Noa pic to complete.
Very nice.
This is definitely the coolest thing I saw this year on IQfy. Thanks OP.
Do you mind sharing the code for the backend?
https://gitlab.com/zipdox/ipv6-canvas
cool shit you're the same guy maintaining the librecord
though i still think it is an useless effort just because the whole discord is a shitshow
https://gitlab.com/zipdox/ipv6-canvas/
make so you can refetch/refresh a tile by double clicking, enough of having desyncs and having to refresh the whole page or scroll around and reload fricking everything
when I remove the censor off his penis, I like to pretend i'm licking it off, kinda hot
0,0 bad apple mogging 99,99 bad apple
putting some dicky archive at 1142 7282
we gaan
it may not be C but it does send actual homemade icmp packets
already done here
More fun to do it yourself
can we not do porn? is that possible?
come on
music i'm listening to atm
you can see it at 0,8960, it's a webm audio file ripped from yt-dlp
apparently cloudflare doesn't like this...
frick, it's two periods, not three
kinda works but the server is shitting itself
This is a cool idea, encoding instructions or data into IPv6 isn't a novel idea (segmemt routing v6 compressed/micro header) but this specifically I have not seen. This has given me an idea, thank you OP.
Even though this will permanently contain dicky or CP (or both), it is a nice and creative project.
Congrats OP for not being a homosexual today.
Site seems to be struggling, OP. Is one of the e-girlBlack folk spamming too much?
>guy hammering server
>522
>523
>blank canvas
>dropped packets
>pixels not sticking
dicky bros at 500,0, post the pic you're trying to draw, I'll help you
What's the global adoption rate of IPv6 again? I mean for v6 only, no tunneling or dual IPs
>v6 only
Will never happen.
They exist, but are very few and far between.
A lot of mobile carriers have switched to v6-only without anyone noticing.
How do you set up tunneling? I wanted to see how fast I could spam but unfortunately I don't have a v6 public address
I had to open this up on my server because it was threatening to crash my desktop with 99% memory usage fully zoomed out on a 21:9 display
yeah I'm either crashing my modem or my ISP is disconnecting me lol
I might have to implement threading soon.
Sorry for the spam, OP. Trying my best to purge the e-girlBlack folk and shotaBlack folk from the site.
kys
Go back to your honeypot containment altchan, Black person
dilate, homosexual
>go on IQfy for the first time yesterday
>see drawings
>get erect at drawings
>get upset about it
>"YOU PEOPLE ARE BAD AND YOU SHOULD FEEL BAD"
lol
you're the dangerous one here if you see children here
are you moronic? or just a pedophile in denial
either way have a nice day homosexual
>are you moronic
I'm not the one being upset about drawings, thougheverbeit.
looks like he struck a nerve
implement mipmaps first Black person cattle
Ask gpt4 to do it for you.
In my opinion you should send compressed, downsampled images for faster scrolling.
Pro tip for whoever's doing the "have a nice day YOU DIRTY PEDOPHILE" text. Don't place your pixels sequentially, it makes it easy for the pedoBlack person's bot to nuke your work. Place them randomly instead.
>le bad drawings
>le pedo
>le troony
God I hate nu-4cucks.
it's funny how the image of a real naked man doesn't seem to phase them but the drawing is somehow going too far
>the image of a real naked man doesn't seem to phase them but the drawing is somehow going too far
must be a coincidence...
>b-but there is image of real naked man!!
>why do you only complain about the image of a sexualized child??
holy mother of gays
OP, do you intend to get a better server after? We need to shitping more at your canvas, but the server is always acking
Yeah I want to implement threading, so more than 2 threads would be nice.
have you even profiled your code to know if it'd help
OP here,
Experiment is beyond over. You guys failed hard.
Posting this on HN instead.
>Didn't tripgayged
The experiment is going as intended. We made OP proud.
OP will be posting this here again tomorrow.
OP's system can be trivially optimized: just partition the canvas into several huge stripes, and assign each stripe to a separate server. This can be done by simple routing. The web server requires slightly more advanced load balancing, but since the tiles will align with the stripes, it can be done by URL. Or just make the JS request from separate user-visible servers depending on the stripe a tile is located in.
load balancing isn't an optimization
No, but balancing the load onto multiple servers when it was only a single one before is.
>using more resources is optimization
lol
If shit gets faster, it's an optimization. Optimizations can trade one resource for another, like you can trade speed for memory use or the other way around. Stop being a dumb gay.
You're a fricking moron.
Load balancing is about solving the problem of scaling, it has little to do with performance, it just generally achieves it as a side product, but it's not a goal. Things don't get faster by virtue of using load balancing.
>If shit gets faster, it's an optimization.
No, you fricking moron.
Optimization has to do with program design.
Would your program be faster if load-balanced on two machines that are half the specs of the current one? I doubt. Do you call upgrading your pc, "optimizing your programs"?
Spoke like a true webdev.
moron take.
moron
clear on draw is a welcome addition but now you can't tell if a tile is black because it hasn't loaded or if it has loaded and just was never used
refresh the page until it appaers
OP hosted it on Haiti, so it's always falling down
I finally got through but the actual canvas seems to be loading poorly compared to yesterday
And it is. OP made some changes to render it better (which I wouldn't say helped much), and the site got more traffic (more pings) compared to yesterday
>OP hosted it on Haiti, so it's always falling down
Probably got stolen by our fellow lovable people of colour.
I imagine that compressing the data in transit between the client and server would help a lot.
Browsers have built-in transparent compression support via Accept-Encoding and Content-Encoding, and you can enable it both on your own web server as well as at CloudFlare, so bot. Might be worth looking into.
With gzip, for instance, a blank all-black-pixels tile is going to get bumped from 196608 bytes all the way down to 225. And a tile with a bit more going on is still going to see big savings. Currently, tile 0/0 is going to be something like 39499 bytes, which is still ~20% of the uncompressed size.
The readme does suggest compression at the web server level, so maybe you do have it and it's just not enabled between CloudFlare and the client? Check to make sure that it's a compression algorithm that CloudFlare supports too, it doesn't seem like they like deflate.
What are you using to serve the image?
Probably FCGI or something, right?
I needed to link zlib to make compression work with FCGI.
Shit was blazing fast (compared to PHP), but just a hobby project three years ago.
Me idiot did all the HTML stuff client-side, instead of serving data from a database and using JS to do all the front-end crap.
>Try out my improvised pinger
>Site 502s
I'm shutting it down for the night.
ETA for the site's return?
>blocklist
total e-girlBlack folk death
AHAHAHA
Should probably just use iptables, no?
>blocklist on icmp
ahahahaha
aaaaaaaand ruined.
so you intend to ban people for breaking rules you never gave?
that's gay
What blocklist? I don't see that anywhere
OP said he's shutting the whole thing down for the night. I don't understand what all the whining is about.
latest commit on repo implemented a "blocklist" which filters incoming icmp packets, which is moronic because it's based on the source field which can be falsified if you don't care about properly waiting for a response, which will in turn encourage "infringing user" (what did they infringe on exactly, no one knows) to just spam with fake source ips, and possibly exacerbate any problem they could have caused in the first place.
That's also an additional server load that's easily bypassed.