[-] ICastFist@programming.dev 2 points 2 hours ago

I suppose more places would do that whatsapp thing if they didn't have to pay meta for the privilege. At my work, we have a little bot that sends a telegram message whenever you clock in/out. The first option was whatsapp, but having to pay for that meant that was a no-go

[-] ICastFist@programming.dev 1 points 4 hours ago

A stick that doesn't break on that bam is indeed great

[-] ICastFist@programming.dev 1 points 4 hours ago

For user input, it's always ? in my code :)

[-] ICastFist@programming.dev 1 points 4 hours ago

Ok, that's already what I'm doing, so I should be ok against sql injection. Usernames don't accept special characters, only [a-Z][0-9], and email is dealt with filter function. I had to sanitize user display names with htmlspecialchars in order to avoid html/javascript injection

[-] ICastFist@programming.dev 26 points 5 hours ago* (last edited 5 hours ago)

tldw; The video looks at it as a system

The (dating) system is failing because men are withdrawing from participation because dating became a "low return, high risk" effort. Unlike women, men are less likely to actually talk about this kind of "social problem" (often because it's still seen as an "individual problem") and simply give up to go for something else (work, hobbies). Without enough participants, the system destabilizes. An aggravating factor is how men are scrutinized nonstop while women are shielded from almost every criticism

Also, the entire "engagement economy" that's causing a significant divide among men and women (also creating ever more unrealistic expectations) keeps making fuckloads of money out of that.

No idea why the woman is almost whispering in the video tho

PS: Lots of angry men in the YT comments, but there was this interesting take that seems to hit right: "Loneliness will only matter when it affects women"

[-] ICastFist@programming.dev 1 points 6 hours ago

Sadists*, those are the ones that like to cause pain. Masochists like to be on the receiving end of punishment :)

[-] ICastFist@programming.dev 3 points 6 hours ago

World of Warcraft. After it, a lot of player retention mechanics became super obvious in other games for me, especially because a lot of said games were copying "the king of MMOs"

Dwarf Fortress is my main go-to example of procgen done right. Whenever there's discussions of "game X sucks and is lifeless because it's mostly procgenned", I look back at DF. Lazy procgen is the problem.

I know at some point I saw a game with absurdly high damage and health numbers, I can't remember which one it was, whether a mobile thing around 2014 or a korean mmo, but that was the point where I very easily understood "big number better" is total bullshit

Elder Scrolls Morrowind was the first game I've played that gave almost complete freedom to the player, with lots of things carrying consequence, especially in relation to NPCs. That shopkeeper you killed? Still dead. This essential NPC that is a literal demigod? Yeah, you can kill him, have fun in this broken timeline you just created where you can no longer advance the main quest.

[-] ICastFist@programming.dev 1 points 7 hours ago

Check out migrations.

Only way to implement those is with a library, right? I did find this tutorial here (Building a PHP Database Migration System from Scratch: A Complete Developer’s Guide), so I might check and try it out sometime in the future

Be careful with tricks.

I am. Every time I have to deal with hashes here (all the time), I die a little bit inside

you have a database field containing a list of comma separated IDs

No, the column is just saving plain text, like Category: "video, blog, news" - from where I do the rest of the string juggling, there's no second table involved in this.

Wishing you lots of fun with your project!

Thank you! 😄

[-] ICastFist@programming.dev 1 points 7 hours ago

From my understanding, using the PDO->prepare function, which is what I do with every SQL, is enough to sanitize all inputs. Can it still allow sql injection?

[-] ICastFist@programming.dev 6 points 7 hours ago

So I went and looked: aardvark means "earth pig" or "ground pig" in afrikaner

Also, this is Arthur's reaction

25

This is a follow up to my previous post here - https://programming.dev/post/46041021 - For those that want a tldr: I'm making a php site for myself writing nearly everything by hand. The only external library I'm using is Parsedown.

After a good time working on my site, I'm happy to announce that I've officially shared it with my friends^[I won't share it here as the site is tied to a different online persona of mine]! The site isn't really "ready" yet, but it's very usable and readable, so that's good!

As for code quality? Well... It's kinda awful. Instead of this:

class User {
  $login = new String();
  $email = new String();
  ...
}

I'm using named arrays (hashes)^[Kinda funny how associative arrays have soe many different names in other languages: hash, dictionary, map] everywhere:

class User {
  $columns = array( 'login' => '',
  'email' => '',
  ...
}

"But WHY???", you might be asking. Well, to facilitate the creation of the database from zero! Here's an example of my trick:

abstract class Common {
 /**
  a bunch of different, generic select and update functions
*/
}
class Users extends Common{
$cols = array('uid'=> 'primary key auto_increment',
    'vc1_login'=> 'unique not null',
    'vc1_display_name'=> '',
    'vc2_password'=> 'not null',
    'dat_created_at'=> 'not null',
    'bol_enabled'=> 'default 1',
    ...
}

With this, the $key part of the hash doubles as the column name and their default/new values are always the details needed for the creation of their respective columns. I also treat the ::class as part of the table name. With a few functions, I can easily recreate the database from zero, something which I've tested a few times now and can confirm that it works great! Also, with key pairs, making generic SQL functions becomes very easy with foreach() loops of the $cols hash. Example:

abstract class Common {
public function selectColumns($columns, $table = '', $where='1', $orderby = '') {
        $conn = connectDb(); //static function outside class
        if ($table == '') {$table = $this::class;}
        $coll = '';
        foreach ($columns as $cols) {
            $coll .= $cols.', ';
        }
        $coll = substr($coll,0,-2);
        $stmt = $conn->prepare("SELECT ".$coll." FROM `T_".$table."` WHERE ".$where." ".$orderby.";");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC); 
//Fetch_Assoc is used so I'm forced to always use the $key in the returned array
    }

// This function will attempt to update all non-empty pairs of a given object
public function updateColsUid(){
        $conn = conectaBanco();
        $sql = "UPDATE `T_".$this::class."` SET ";
        $keys = array('uid' => $this->cols['uid']);
        foreach ($this->cols as $key => $value) {
            if (($value != '') and ($key != 'uid')) {
                $sql .= " `". $key. "` = :" . $key . " ,";
                $keys[$key] = $value;
            }
        }
        $sql = substr($sql,0,-1);
        $sql .= " WHERE `uid` = :uid;";
        $stmt = $conn->prepare($sql);
        $stmt->execute($keys);
        return $stmt->rowCount();
    }

The biggest problem with this is that if I ever remove, add or rename any of these $keys, it'll be a fucking chore to update code that references it. I'll look into using proper variables for each column in the future, especially as a database creation is something you usually only do once. On the plus side, this is the most portable php site I've ever did (1 out of 1, but whatever)

Anyway, current functionality includes creating an account, modifying some aspects^[I want to note that there was a bunch of validation that I initially didn't think of doing, but luckily had a couple of "Wait, what if..." moments. One of those was to properly escape a user's username and display name, otherwise, when echo'ing it, <b>Bob</b> would show as Bob. While the fields probably wouldn't be enough to fit anything malicious (fitting something malicious inside a varchar100 would be a real feat, ngl), it's better to close this potential hole.] of it (profile description, display name (which is html escaped, so no funny business here), signature), logging in, letting the admin make new posts, letting anyone logged in comment on existing posts, comment moderation.

I also keep track of every page visitors are going to, saving these to the database (user agent, IP, page visited) - this will be the table that will fill up faster than any other, but might also allow me to catch eventual bots that ignore robots.txt - supposing I can figure them out.

Initially, I was planning on having each post select from a list of existing categories (category N -> N posts), but after some thought, decided against that and came up with a working alternative. Posts now have a single column where categories are manually written in, separated by commas. I later retrieve them with select distinct, explode() the string into an array and finally remove duplicates with array_unique(), making it easy for visitors, and for me, to get all the unique and valid categories.

One thing I'm doing that I'm not sure whether it's good, neutral or bad design/architecture, is using the same site that has the form to also validate/insert data, as in: instead of having newpost.php and validate_and_insert_post.php files doing separate jobs, my newpost.php is the page has the form and also receives the form in order to validate and insert into the database.

The whole thing's currently sitting at 220kb, unzipped, counting the leftover files that I'm no longer using. The fact that I can deploy this literally anywhere with a working php 8+ server without typing any terminal commands makes me very happy.

[-] ICastFist@programming.dev 9 points 1 day ago

I'll go out a limb and guess that, since this is apparently lawyer related, the jeenius is used to defending high net worth criminals, and may be one such

83
58
How to ask for a raise (programming.dev)
21
"A good word" (programming.dev)
212
"A good word" (programming.dev)
26

cross-posted from: https://programming.dev/post/47341163

Remember Win Elvis-n-Space? Or Lemmings Paintball? Or even Odyssey Legend of Nemesis?

Found this little gem of a site recently. Unfortunately, it hasn't been updated in a while (last blog post is from Sep 2025)

73

Remember Win Elvis-n-Space? Or Lemmings Paintball? Or even Odyssey Legend of Nemesis?

Found this little gem of a site recently. Unfortunately, it hasn't been updated in a while (last blog post is from Sep 2025)

56

Don't invite the math nerds here, they'll count the actual time since

309
Call center's final boss (programming.dev)
84

Greeks and Romans would frequently curse anyone they didn't like, writing it as a curse on a lead sheet, roll it up and pierce it with a nail and put in a specific place, depending on the curse.

Given the amount of such tablets found, they probably cursed someone every other week.

For extra photos - https://www.romanbaths.co.uk/roman-curse-tablets

6

cross-posted from: https://programming.dev/post/46122408

I was looking for youtube alternatives and came across this site. Looks like a good place to post shitpost videos and all other sorts of crazy stuff.

For every video link, the upper image is the video preview, the lower half is the uploader's profile pic

12
submitted 4 weeks ago by ICastFist@programming.dev to c/196

I was looking for youtube alternatives and came across this site. Looks like a good place to post shitpost videos and all other sorts of crazy stuff.

For every video link, the upper image is the video preview, the lower half is the uploader's profile pic

view more: next ›

ICastFist

joined 2 years ago