10000 forum users celebration - special event

GDPR (EU) ,CCPA (Cal), SHIELD act (New York), PIPEDA (Canada), LGPD (Brazil), PDPA (Hong Kong), IT act (India), etc.

2 Likes

???

1 Like

Security and Privacy - after the user ceases to be part of a service, by law, his traces must be deleted (PII data) or anonymized.

3 Likes

But why anon out of everything? What about deletedxxxxxx?

3 Likes

That’s how the Discourse team decided (which is abbreviated from anonymous)

4 Likes

Oh, I see now! What’s pretty interesting is how they will update all mentions and quotes for deleted users but they don’t do the same for editing usernames.

2 Likes

So it was on the old versions the newer ones do it.

My mentions and quotes didn’t update when I changed my username.

1 Like

If you didn’t notice, quotes don’t change if the quoted text changes either :confused:

1 Like

Why not just delete it, then?

1 Like

Probably not instant so as not to burden the forum unnecessarily and write through databases for a long time.

Can you give an example of where there is still the old way?

Imagine me leaving the forum

How many topics and all the posts would disappear and create confusion because there are holes in the distorted communication.

Data that can be deleted are deleted
and the forum is a public matter anyway…it is understood that what you write here is public

so just anon users are enough.

Somehow you have to name the one who is post something
not just to make it clearer and more readable to people
but also the database must have some ID and generate all that

5 Likes

You just gotta love marbles and music!

And wintergatan
3 Likes

This is my recent mention, I guess this should have updated first.

2 Likes

Or Search results for 'Technical.Legendz' - InfinityFree Forum

I don’t really know - maybe it’s a bug that has been fixed in newer versions

but we are not using beta versions and should wait for the clean version to come.

I tried to rebuild HTML on the forum in a few posts where it happens but without success

maybe even the DOT is the problem in your ex name

if you want I can tell the admin so when he has free time…

2 Likes

Working on it (as a school project)…

1 Like

Let’s say for example someone spreads something and then he deletes himself, if it was like what you said then we did not have proofs to collect and it’d turn into a critical security issue.

1 Like

I got the “you have reached your entry process limit” message on my WP site (After I thought it was broken because it wasn’t loading) a refresh fixed it, but the graph shows I have not hit the limit? What is going on?

1 Like

No, that’s how many times you hit the limit, not the limit itself (I think).

Graph is not a live view and it takes 24 hours to update
and then displays the status for the entire day
and you may have had a brief outburst that resulted in that message
(it can happen sometimes)
but the problem is if it happens to you for days
this means that your website is getting too much traffic or internal traffic.

3 Likes
const idCount = 1e+6;
let workerCount = 40;
const workers = [];
const results = [];
const times = [];
//Prevent distributions that leave workers with a "half job", in which the number of IDs equals the number of workers, not the idCount variable.
if(idCount < workerCount){
    workerCount = Math.min(idCount, 100);
}
for(let i = 0;i < workerCount; ++i){
    const workerFn = () => {
        console.log("Worker started!");
        self.addEventListener("error", e => (console.error(e.message), self.close()));
        class IDs {
            constructor(){
                this.IDs = [];
                this.IDsUnicode = [];
                this.IDLength = 100;
                this.tryLimit = 1000;
                this.charset = "1234567890abcdef";
                this.charsetUnicode = new TextEncoder().encode(this.charset);
            }
            generateID(){
                let id = "";
                let tries = 0;
                let isFound = false;
                while(!isFound){
                    if(tries > 1){
                        console.log("TRIED TWICE");
                    }
                    if(++tries <= this.tryLimit){
                        id = "";
                        for(let i = 0;i < this.IDLength;++i){
                            id += this.charset[Math.floor(Math.random() * this.charset.length)];
                        }
                        if(!this.IDs.includes(id)){
                            isFound = true;
                        }
                    }
                    else{
                        throw new RangeError(`Try limit of ${this.tryLimit} exceeded.`);
                    }
                }
                this.IDs.push(id);
                return id;
            }
            generateIDUnicode(){
                let id = new Uint8Array(0);
                let tries = 0;
                let isFound = false;
                while(!isFound){
                    if(tries > 1){
                        console.log("TRIED TWICE");
                    }
                    if(++tries <= this.tryLimit){
                        id = new Uint8Array(this.IDLength);
                        for(let i = 0;i < this.IDLength;++i){
                            id.set([this.charsetUnicode[Math.floor(Math.random() * this.charsetUnicode.length)]], i);
                        }
                        if(!this.IDsUnicode.includes(id)){
                            isFound = true;
                        }
                    }
                    else{
                        throw new RangeError(`Try limit of ${this.tryLimit} exceeded.`);
                    }
                }
                this.IDsUnicode.push(id);
                return id;
            }
        }
        let iterNumber = 0;
        self.addEventListener("message", e => {
            const { data } = e;
            if(data.messageType === "iter_number"){
                iterNumber = data.data;
            }
            else if(data.messageType === "worker_activity_status"){
                if(data.data === "start"){
                    const idGen = new IDs();
                    console.log("Processing starting...");
                    const start = performance.now();
                    for(let i = 0;i<iterNumber;++i){
	                    idGen.generateIDUnicode();
//                         idGen.generateID();
                    }
                    const end = performance.now();
                    self.postMessage({messageType: "results", data: idGen.IDsUnicode, messageUnicode: true, time: end - start});
                    console.log("Worker done!");
                    self.close();
                }
                else if(data.data === "stop"){
                    self.close();
                }
            }
        });
    };
    const blobURL = URL.createObjectURL(new Blob(["(" + workerFn.toString() + ")()"], { type:
"text/javascript" }));
    const worker = new Worker(blobURL);
    workers.push(worker);
    worker.addEventListener("message", e => {
        const { data } = e;
        if(data.messageType === "results"){
            times.push(data.time);
            if(times.length === workerCount){
                console.log(`Total time taken: ${times.reduce((a, b) => a + b) / times.length} milliseconds!`);
            }
            if(data.messageUnicode){
                data.data.forEach(arr => {
                    results.push(new TextDecoder().decode(arr)); 
                });
            }
            else{
                results.push(data.data);
            }
        }
    });
}
workers.forEach(worker => {
    worker.postMessage({messageType: "iter_number", data: idCount / workerCount});
    worker.postMessage({messageType: "worker_activity_status", data: "start"});
});

image

And that is how you generate 1 million 100 length hex IDs in 17 seconds on a 32 bit chromebook with 4 Gigabytes of RAM and numerous extensions taking up lots of space.

Who’s the JS Queen King now?