Migrating from Confluence doesnโt have to be painful.
Our Product Owner, Stefana Nazare, shared a live demo showing how to migrate spaces, attachments, and macros to XWiki while keeping structure and permissions intact.
CREATE TABLE IF NOT EXISTS users ( id INTEGER NOT NULL PRIMARY KEY CHECK (id = 1), username TEXT NOT NULL UNIQUE CHECK (trim(lower(username)) = username AND username <> '' AND length(username) <= 50));
import Database from "better-sqlite3";const db = new Database("microblog.sqlite3");db.pragma("journal_mode = WAL");db.pragma("foreign_keys = ON");export default db;
CREATE TABLE IF NOT EXISTS actors ( id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER REFERENCES users (id), uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), handle TEXT NOT NULL UNIQUE CHECK (handle <> ''), name TEXT, inbox_url TEXT NOT NULL UNIQUE CHECK (inbox_url LIKE 'https://%' OR inbox_url LIKE 'http://%'), shared_inbox_url TEXT CHECK (shared_inbox_url LIKE 'https://%' OR shared_inbox_url LIKE 'http://%'), url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
CREATE TABLE IF NOT EXISTS keys ( user_id INTEGER NOT NULL REFERENCES users (id), type TEXT NOT NULL CHECK (type IN ('RSASSA-PKCS1-v1_5', 'Ed25519')), private_key TEXT NOT NULL CHECK (private_key <> ''), public_key TEXT NOT NULL CHECK (public_key <> ''), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''), PRIMARY KEY (user_id, type));
import { Endpoints, Person, createFederation, exportJwk, generateCryptoKeyPair, importJwk,} from "@fedify/fedify";import type { Actor, Key, User } from "./schema.ts";
CREATE TABLE IF NOT EXISTS posts ( id INTEGER NOT NULL PRIMARY KEY, uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), actor_id INTEGER NOT NULL REFERENCES actors (id), content TEXT NOT NULL, url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
import { Accept, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
๊ทธ๋ฆฌ๊ณ GET /users/{username}/following ์์ฒญ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
app.get("/users/:username/following", async (c) => { const following = db .prepare<unknown[], Actor>( ` SELECT following.* FROM follows JOIN actors AS followers ON follows.follower_id = followers.id JOIN actors AS following ON follows.following_id = following.id JOIN users ON users.id = followers.user_id WHERE users.username = ? ORDER BY follows.created DESC `, ) .all(c.req.param("username")); return c.html( <Layout> <FollowingList following={following} /> </Layout>, );});
import { Accept, Create, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
Ich bin auf der Suche nach einem #Video#Tutorial, fรผr absolute #Anfรคnger im #hรคkeln, am besten ein #amiguri. Konkret: wie geht der รbergang zwischen den Runden, wenn man mit einem Fadenring angefangen hat, wie macht man einen Farbwechsel innerhalb einer Runde und wie vernรคht man die einzelnen Kรถrperteile?
Ich bin auf der Suche nach einem #Video#Tutorial, fรผr absolute #Anfรคnger im #hรคkeln, am besten ein #amiguri. Konkret: wie geht der รbergang zwischen den Runden, wenn man mit einem Fadenring angefangen hat, wie macht man einen Farbwechsel innerhalb einer Runde und wie vernรคht man die einzelnen Kรถrperteile?
<p>Tired of the Linux/Docker “monoculture” for WordPress? This article guides you step-by-step through the secure installation of WordPress on FreeBSD using BastilleBSD. Discover how jail separation, performance, and the versatility of ZFS offer a more robust and easily manageable environment, far from common vulnerabilities often linked to poorly maintained plugins. Get ready to make your site more secure and reliable.</p>
Many people host WordPress on Linux, often using Docker. While this is a valid approach, there are excellent alternatives – sometimes even better ones – for getting your WordPress site online in a secure, reliable, and updatable manner. The goal is to make the web a safer place and avoid the computing monoculture that increasingly pushes toward uniformity of solutions and setups – an attitude that I believe is harmful even when the solutions are open source.
For this type of setup, therefore, I’ll describe how to accomplish everything using FreeBSD. The jail separation, performance, and ZFS versatility – all reasons that support this choice. This guide will serve as a foundation – everything will work at the end, but it won’t cover all possible combinations or configurations.
We’ll be using BastilleBSD, which supports both ZFS and UFS. While FreeBSD’s base system has everything needed to create and run jails, BastilleBSD is incredibly useful for managing them. Since it’s written in shell script and has no database dependencies, management and backups are straightforward. Furthermore, moving jails becomes extremely simple – either by using the bastille command directly or by copying the files (or datasets, if you’re using ZFS).
BastilleBSD also supports templates, but for this tutorial, we’ll perform the operations manually to understand each step.
First, install Bastille:
pkg install bastille
Next, run the setup process:
bastille setup
Now, bootstrap the desired FreeBSD release:
bastille bootstrap 14.3-RELEASE update
With that, BastilleBSD is ready to go.
Creating the Jails
Now, let’s create the jail that will contain Apache, PHP, and WordPress:
Note: This command will only create and assign an IPv4 loopback address. For IPv6, the simplest solution is to assign an address for the jail directly to the host’s interface. To do this, note an available IPv6 address and assign it to the jail. For example, if the host’s network interface is vtnet0:
bastille edit apache
Add the following lines to the configuration file:
Now, if using ZFS, let’s create a dedicated dataset for WordPress and mount it in the jail. The reason is simple: decoupling the Apache jail from the WordPress directory will allow for updates, rollbacks, etc. of the Apache jail without touching the WordPress files. I assure you that, in the long run, this approach will save many headaches.
service mysql-server enableservice mysql-server start
Now, access the MySQL command line to set up the WordPress database:
mysql
Execute the following SQL commands (you should use more secure user, password, etc.):
CREATE USER wp@10.0.0.254 IDENTIFIED BY 'password';CREATE DATABASE wordpress;GRANT ALL PRIVILEGES ON wordpress.* TO wp@10.0.0.254;FLUSH PRIVILEGES;
Exit the MariaDB jail console to return to the host.
Configuring the Apache & PHP Jail
Now, let’s configure the apache jail. First, access its console:
bastille console apache
Inside the jail, install PHP and all the necessary extensions. We won’t install WordPress from the FreeBSD package – while it’s updated and maintained, I prefer to manage dependencies manually. It will be easier to manage updates in the long term, such as changing PHP versions, etc. At the time of writing this article, for example, the WordPress package depends on PHP 8.3 while I prefer to use 8.4.
It’s good practice to copy the production PHP template to the final, modifiable php.ini file, which can be customized with the required options and limits:
Now, create an Apache virtual host configuration file at /usr/local/etc/apache24/Includes/wordpress.conf – be sure to modify the “example.com” with your own real domain name:
The server will now respond on port 80 with the specified hostname, but this is absolutely not optimal or recommended. It’s therefore appropriate to generate a certificate to enable HTTPS.
For a simple solution, I recommend installing certbot with the Apache plugin to manage everything through Apache:
pkg install py311-certbot py311-certbot-apache
In order to automatically renew the certificates, add this line to /etc/periodic.conf:
You can now proceed to connect to the specified URL and begin with the WordPress guided installation, remembering the authentication and database details (the host, in this example, is 10.0.0.253 – not localhost, since we installed it in a dedicated jail).
Congratulations, your site is installed and operational. Ready to receive content for publishing. It’s exposed on IPv4 and IPv6, with HTTPS (and automatic certificate renewal, managed directly by FreeBSD) and separated from the database.
Generally, I prefer to add an additional jail with a reverse proxy. This way it will be possible to install different software in different jails, ensuring that the reverse proxy “routes” requests correctly. I’ll explain this procedure in a future article.
While this is my inaugural FreeBSD post for the BSD Cafe Journal, I’ve actually written extensively on the topic for my own blog, https://it-notes.dragas.net
ALT text detailsMacBook Pro, white ceramic mug,and black smartphone on table
Bandera Palestina en Crochet Este tutorial nace como un acto de memoria y solidaridad con el pueblo palestino. Desde mi espacio de creaciรณn textil, quise aportar una forma simbรณlica yย de resistencia: tejiendo la bandera de Palestina. A travรฉs de este video aprenderรกs a hacer una bandera tejida a crochet usando la tรฉcnica de intarsia en punto bajo (pb). Es una tรฉcnica accesible para quienes ya saben lo bรกs https://laloica.noblogs.org/bandera-palestina-en-crochet/ #Autogestion#Tutorial
CREATE TABLE IF NOT EXISTS users ( id INTEGER NOT NULL PRIMARY KEY CHECK (id = 1), username TEXT NOT NULL UNIQUE CHECK (trim(lower(username)) = username AND username <> '' AND length(username) <= 50));
import Database from "better-sqlite3";const db = new Database("microblog.sqlite3");db.pragma("journal_mode = WAL");db.pragma("foreign_keys = ON");export default db;
CREATE TABLE IF NOT EXISTS actors ( id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER REFERENCES users (id), uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), handle TEXT NOT NULL UNIQUE CHECK (handle <> ''), name TEXT, inbox_url TEXT NOT NULL UNIQUE CHECK (inbox_url LIKE 'https://%' OR inbox_url LIKE 'http://%'), shared_inbox_url TEXT CHECK (shared_inbox_url LIKE 'https://%' OR shared_inbox_url LIKE 'http://%'), url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
CREATE TABLE IF NOT EXISTS keys ( user_id INTEGER NOT NULL REFERENCES users (id), type TEXT NOT NULL CHECK (type IN ('RSASSA-PKCS1-v1_5', 'Ed25519')), private_key TEXT NOT NULL CHECK (private_key <> ''), public_key TEXT NOT NULL CHECK (public_key <> ''), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''), PRIMARY KEY (user_id, type));
import { Endpoints, Person, createFederation, exportJwk, generateCryptoKeyPair, importJwk,} from "@fedify/fedify";import type { Actor, Key, User } from "./schema.ts";
CREATE TABLE IF NOT EXISTS posts ( id INTEGER NOT NULL PRIMARY KEY, uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), actor_id INTEGER NOT NULL REFERENCES actors (id), content TEXT NOT NULL, url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
import { Accept, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
๊ทธ๋ฆฌ๊ณ GET /users/{username}/following ์์ฒญ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
app.get("/users/:username/following", async (c) => { const following = db .prepare<unknown[], Actor>( ` SELECT following.* FROM follows JOIN actors AS followers ON follows.follower_id = followers.id JOIN actors AS following ON follows.following_id = following.id JOIN users ON users.id = followers.user_id WHERE users.username = ? ORDER BY follows.created DESC `, ) .all(c.req.param("username")); return c.html( <Layout> <FollowingList following={following} /> </Layout>, );});
import { Accept, Create, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
CREATE TABLE IF NOT EXISTS users ( id INTEGER NOT NULL PRIMARY KEY CHECK (id = 1), username TEXT NOT NULL UNIQUE CHECK (trim(lower(username)) = username AND username <> '' AND length(username) <= 50));
import Database from "better-sqlite3";const db = new Database("microblog.sqlite3");db.pragma("journal_mode = WAL");db.pragma("foreign_keys = ON");export default db;
CREATE TABLE IF NOT EXISTS actors ( id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER REFERENCES users (id), uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), handle TEXT NOT NULL UNIQUE CHECK (handle <> ''), name TEXT, inbox_url TEXT NOT NULL UNIQUE CHECK (inbox_url LIKE 'https://%' OR inbox_url LIKE 'http://%'), shared_inbox_url TEXT CHECK (shared_inbox_url LIKE 'https://%' OR shared_inbox_url LIKE 'http://%'), url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
CREATE TABLE IF NOT EXISTS keys ( user_id INTEGER NOT NULL REFERENCES users (id), type TEXT NOT NULL CHECK (type IN ('RSASSA-PKCS1-v1_5', 'Ed25519')), private_key TEXT NOT NULL CHECK (private_key <> ''), public_key TEXT NOT NULL CHECK (public_key <> ''), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''), PRIMARY KEY (user_id, type));
import { Endpoints, Person, createFederation, exportJwk, generateCryptoKeyPair, importJwk,} from "@fedify/fedify";import type { Actor, Key, User } from "./schema.ts";
CREATE TABLE IF NOT EXISTS posts ( id INTEGER NOT NULL PRIMARY KEY, uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), actor_id INTEGER NOT NULL REFERENCES actors (id), content TEXT NOT NULL, url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
import { Accept, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
๊ทธ๋ฆฌ๊ณ GET /users/{username}/following ์์ฒญ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
app.get("/users/:username/following", async (c) => { const following = db .prepare<unknown[], Actor>( ` SELECT following.* FROM follows JOIN actors AS followers ON follows.follower_id = followers.id JOIN actors AS following ON follows.following_id = following.id JOIN users ON users.id = followers.user_id WHERE users.username = ? ORDER BY follows.created DESC `, ) .all(c.req.param("username")); return c.html( <Layout> <FollowingList following={following} /> </Layout>, );});
import { Accept, Create, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
CREATE TABLE IF NOT EXISTS users ( id INTEGER NOT NULL PRIMARY KEY CHECK (id = 1), username TEXT NOT NULL UNIQUE CHECK (trim(lower(username)) = username AND username <> '' AND length(username) <= 50));
import Database from "better-sqlite3";const db = new Database("microblog.sqlite3");db.pragma("journal_mode = WAL");db.pragma("foreign_keys = ON");export default db;
CREATE TABLE IF NOT EXISTS actors ( id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER REFERENCES users (id), uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), handle TEXT NOT NULL UNIQUE CHECK (handle <> ''), name TEXT, inbox_url TEXT NOT NULL UNIQUE CHECK (inbox_url LIKE 'https://%' OR inbox_url LIKE 'http://%'), shared_inbox_url TEXT CHECK (shared_inbox_url LIKE 'https://%' OR shared_inbox_url LIKE 'http://%'), url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
CREATE TABLE IF NOT EXISTS keys ( user_id INTEGER NOT NULL REFERENCES users (id), type TEXT NOT NULL CHECK (type IN ('RSASSA-PKCS1-v1_5', 'Ed25519')), private_key TEXT NOT NULL CHECK (private_key <> ''), public_key TEXT NOT NULL CHECK (public_key <> ''), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''), PRIMARY KEY (user_id, type));
import { Endpoints, Person, createFederation, exportJwk, generateCryptoKeyPair, importJwk,} from "@fedify/fedify";import type { Actor, Key, User } from "./schema.ts";
CREATE TABLE IF NOT EXISTS posts ( id INTEGER NOT NULL PRIMARY KEY, uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), actor_id INTEGER NOT NULL REFERENCES actors (id), content TEXT NOT NULL, url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
import { Accept, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
๊ทธ๋ฆฌ๊ณ GET /users/{username}/following ์์ฒญ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
app.get("/users/:username/following", async (c) => { const following = db .prepare<unknown[], Actor>( ` SELECT following.* FROM follows JOIN actors AS followers ON follows.follower_id = followers.id JOIN actors AS following ON follows.following_id = following.id JOIN users ON users.id = followers.user_id WHERE users.username = ? ORDER BY follows.created DESC `, ) .all(c.req.param("username")); return c.html( <Layout> <FollowingList following={following} /> </Layout>, );});
import { Accept, Create, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
CREATE TABLE IF NOT EXISTS users ( id INTEGER NOT NULL PRIMARY KEY CHECK (id = 1), username TEXT NOT NULL UNIQUE CHECK (trim(lower(username)) = username AND username <> '' AND length(username) <= 50));
import Database from "better-sqlite3";const db = new Database("microblog.sqlite3");db.pragma("journal_mode = WAL");db.pragma("foreign_keys = ON");export default db;
CREATE TABLE IF NOT EXISTS actors ( id INTEGER NOT NULL PRIMARY KEY, user_id INTEGER REFERENCES users (id), uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), handle TEXT NOT NULL UNIQUE CHECK (handle <> ''), name TEXT, inbox_url TEXT NOT NULL UNIQUE CHECK (inbox_url LIKE 'https://%' OR inbox_url LIKE 'http://%'), shared_inbox_url TEXT CHECK (shared_inbox_url LIKE 'https://%' OR shared_inbox_url LIKE 'http://%'), url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
CREATE TABLE IF NOT EXISTS keys ( user_id INTEGER NOT NULL REFERENCES users (id), type TEXT NOT NULL CHECK (type IN ('RSASSA-PKCS1-v1_5', 'Ed25519')), private_key TEXT NOT NULL CHECK (private_key <> ''), public_key TEXT NOT NULL CHECK (public_key <> ''), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''), PRIMARY KEY (user_id, type));
import { Endpoints, Person, createFederation, exportJwk, generateCryptoKeyPair, importJwk,} from "@fedify/fedify";import type { Actor, Key, User } from "./schema.ts";
CREATE TABLE IF NOT EXISTS posts ( id INTEGER NOT NULL PRIMARY KEY, uri TEXT NOT NULL UNIQUE CHECK (uri <> ''), actor_id INTEGER NOT NULL REFERENCES actors (id), content TEXT NOT NULL, url TEXT CHECK (url LIKE 'https://%' OR url LIKE 'http://%'), created TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP) CHECK (created <> ''));
import { Accept, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
๊ทธ๋ฆฌ๊ณ GET /users/{username}/following ์์ฒญ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
app.get("/users/:username/following", async (c) => { const following = db .prepare<unknown[], Actor>( ` SELECT following.* FROM follows JOIN actors AS followers ON follows.follower_id = followers.id JOIN actors AS following ON follows.following_id = following.id JOIN users ON users.id = followers.user_id WHERE users.username = ? ORDER BY follows.created DESC `, ) .all(c.req.param("username")); return c.html( <Layout> <FollowingList following={following} /> </Layout>, );});
import { Accept, Create, Endpoints, Follow, Note, PUBLIC_COLLECTION, Person, Undo, createFederation, exportJwk, generateCryptoKeyPair, getActorHandle, importJwk, isActor, type Actor as APActor, type Recipient,} from "@fedify/fedify";
As a bit of a diversion, I somehow ended up working through the #golang#tutorial this weekend.
I don't remotely consider myself much of a programmer. Possibly, a bit of a code janitor. I was just looking for a bit of an introduction to an unfamiliar language.
I have to say, #Go has some really clear, clean, and helpful #Documentation for a beginner wanting to get started with the language. I'm impressed.
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
If you're interested in building your own #ActivityPub server but don't know where to start, I recommend checking out #Fedify's #tutorialCreating your own federated microblog. It provides a comprehensive, step-by-step guide that walks you through building a fully functional federated application. Perfect for developers who want to dive into the #fediverse!
Nachdem ich nun eine PeerTube-Instanz gefunden habe, dachte ich mir, ich nehme doch mal schnell ein kurzes Video auf fรผr die neuen User, die sich das erste Mal bei einer bestehenden Friendica-Instanz registrieren und dann vor einer leeren Timeline stehen...
Das Video gibt es bei clip.place, einer PeerTube-Instanz und darf gerne geteilt werden.
Nachdem ich nun eine PeerTube-Instanz gefunden habe, dachte ich mir, ich nehme doch mal schnell ein kurzes Video auf fรผr die neuen User, die sich das erste Mal bei einer bestehenden Friendica-Instanz registrieren und dann vor einer leeren Timeline stehen...
Das Video gibt es bei clip.place, einer PeerTube-Instanz und darf gerne geteilt werden.
The text field on the springboard anticipates what you want to do. To do this, you must enter a future time, e.g: Friday morning or tomorrow morning, optionally with a time.
The system will suggest โAdd to calendarโ and you can complete the entry in the calendar by tapping on it.
Ich habe mich entschieden, ein kleines Tutorial รผber CLI-Befehle unter Linux zu erstellen. CLI steht fรผr Command Line Interface, was auf Deutsch als Befehlszeilenschnittstelle bezeichnet wird. Es handelt sich um eine textbasierte Benutzeroberflรคche, die es Benutzern ermรถglicht, mit einem Computer oder einem Betriebssystem zu interagieren, indem sie Befehle in Form von Text eingeben. In Linux kann das sogenannte Terminal zur Eingabe von CLI-Befehlen verwendet werden.
Bitte teilt das mit eurer #followerpower, damit mehr Menschen darauf aufmerksam werden. Dieses Tutorial richtet sich an Anfรคnger, die das Terminal unter Linux nicht als furchterregendes Monster betrachten, sondern effizient damit arbeiten mรถchten.
DANKESCHรN
Der Link fรผhrt direkt zum Thread mit dem Tutorial und kann bei Bedarf gespeichert werden.
Just published a guide on setting up Snac on an Ubuntu VM using NGINX Proxy Manager. Snac is an incredibly lightweight #ActivityPub server. A true nom nom among fediverse platforms.
If you're curious about minimal fediverse instances, check it out:
Just published a guide on setting up Snac on an Ubuntu VM using NGINX Proxy Manager. Snac is an incredibly lightweight #ActivityPub server. A true nom nom among fediverse platforms.
If you're curious about minimal fediverse instances, check it out:
Just published a guide on setting up Snac on an Ubuntu VM using NGINX Proxy Manager. Snac is an incredibly lightweight #ActivityPub server. A true nom nom among fediverse platforms.
If you're curious about minimal fediverse instances, check it out:
Just published a guide on setting up Snac on an Ubuntu VM using NGINX Proxy Manager. Snac is an incredibly lightweight #ActivityPub server. A true nom nom among fediverse platforms.
If you're curious about minimal fediverse instances, check it out:
The tutorial is live :) A follow-up to my bard animation. Since so many people asked how I created the watercolor effect in Blender, I put together a tutorial breaking down all the techniques. Let me know what you think :) #b3d#tutorial#watercolor
The tutorial is live :) A follow-up to my bard animation. Since so many people asked how I created the watercolor effect in Blender, I put together a tutorial breaking down all the techniques. Let me know what you think :) #b3d#tutorial#watercolor
The new Twitter-Wannabe BlueSky has an interesting approach to verifying accounts. Rather than you sending in your passport, or paying a 3rd party, or bribing an employee - you can self-verify for free!
This opens up verification to small organisations, individuals, and anyone who wants to prove who they are. Brilliant!
Verification means that your @username will change to @Your.Website.com - this means that everyone can see your BlueSky account is owned by that specific website.
Here are some organisations and people at risk of impersonation who have already done this:
This is the only technical bit of the process. You need the ability to upload a file to your website. I don't know whether you use FTP, a control panel, or email things to the person who manages your site.
You need to save the atproto-did file in a folder called /.well-known/
If that folder doesn't exist, create it. The folder name must be typed exactly like that, with the dot at the start.
You can check it has worked by visiting YourWebsite.com/.well-known/atproto-did
Five years ago I started working on a tutorial, Game Programming Basics in Lua and Love2D...
I'm relieved to announce that I have now finished Part I (the Lua-only part) :yell:
It's aimed at beginners, and assumes no previous programming experience.
I started writing it based on the experience of an artist friend who took it upon themselves to learn programming as well, in the hopes that it could serve as a guide for people doing something similar, or anyone looking for an approachable path into game development.
I was asked to promote @FediverseSymbol in my work. So I had a naked friend do a short tutorial on how to paint the symbol itself. I hope it doesn't get lost in the federated timeline.
ALT text details"Like any responsible artist, I stay out of politics.
So today I'll be teaching you how to draw the newly proposed fediverse logo!"
It's three asterisks: โ
Child is afraid to go to sleep. Father says: "Artists aren't real, they can't eat you, cub.
A linux supremacist reviews a recent distro: "I thought it was the last good linux... but if you scroll down... THE GAY FLAG! It's over bros..."
A rabbit is hacking you. Just as you're reading this. It's in your server. Right now.
Glowboy stands tall: "I am a free speech absolutist. Please, post anything on my instance!"
Smoker calls X fascist.
A bro accuse a little duckling of being an APPLE HATER and a LIAR. The duckling continues: "I also don't walk around with all my lifesavings in a pocket."
A kid with a star of david on its chest says: "dad?" Dad replies: "It's not your fault."
Two green boys converse. One says: "We should kill big tech." The other replies: "Like.. the CEO's? Levi, that's going to be really hard..."
Underground person with a gopher says: "I don't even use html."
A person is offering a boost to a girl in a short skirt and kneesocks.
"Mental Outlaw is a fed." said a person to another one, who's wearing a parody of an openbsd t-shirt that says "OPEN BASED" They reply: "But the merch is nice." The first finishes: "No it is not."
VOTE ANARCHY
Well what do you think, asks a person wearing cat ears.
SUPPORT TRANS RIGHTS.
SAVE DEMOCRACY!
โ Basic Introduction โ Why Legal Data Science (esp. if you're a lawyer!) โ Comprehensive List of #OpenAccess resources for beginners โ Focus on #RStats
Some time ago, I was asked to share notes and details of how I archived my old CDROM media and I did reply in the thread, but never really posted the guide I wrote otherwise.
So here is the crappiest guide to dumping CD/DVD images on Linux/Unix-likes, in case it happens to be of use to anyone.
I'm writing a new #Fedify#tutorial. If a tutorial on creating an #ActivityPub server needs to deal with persistent data, where should they be stored? I want the tutorial to focus as much as possible on implementing the business logic and as little as possible on other things.
Catalyst Nanomaterials Lab has published another video tutorial that will show you how to fit multiple peaks in your data using #LabPlot. Go check it out!
Now that I've created the `fedify init` command, I've been thinking about how to modify #Fedify's #tutorial. If I make Fedify's tutorial use `fedify init`, it could omit the project setup part at the beginning. However, the chance to get some understanding of how things work like in the current tutorial would be lost. ๐ค
#HowToThing#Epilogue#LongRead: After 66 days of addressing 30 wildly varied use cases and building ~20 new example projects of varying complexity to illustrate how #ThingUmbrella libraries can be used & combined, I'm taking a break to concentrate on other important thi.ngs...
With this overall selection I tried shining a light on common architectural patterns, but also some underexposed, yet interesting niche topics. Since there were many different techniques involved, it's natural not everything resonated with everyone. That's fine! Though, my hope always is that readers take an interest in a wide range of topics, and so many of these new examples were purposefully multi-faceted and hopefully provided insights for at least some parts, plus (in)directly communicated a core essence of the larger project:
Only individual packages (or small clusters) are designed & optimized for a set of particular use cases. At large, though, thi.ng explicitly does NOT offer any such guidance or even opinion. All I can offer are possibilities, nudges and cross-references, how these constructs & techniques can be (and have been) useful and/or the theory underpinning them. For some topics, thi.ng libs provide multiple approaches to achieve certain goals. This again is by design (not lack of it!) and stems from hard-learned experience, showing that many (esp. larger) projects highly benefit from more nuanced (sometimes conflicting approaches) compared to popular defacto "catch-all" framework solutions. To avid users (incl. myself) this approach has become a somewhat unique offering and advantage, yet in itself seems to be the hardest and most confusing aspect of the entire project to communicate to newcomers.
So seeing this list of new projects together, to me really is a celebration (and confirmation/testament) of the overall #BottomUpDesign#ThingUmbrella approach (which I've been building on since ~2006): From the wide spectrum/flexibility of use cases, the expressiveness, concision, the data-first approach, the undogmatic mix of complementary paradigms, the separation of concerns, no hidden magic state, only minimal build tooling requirements (a bundler is optional, but recommended for tree shaking, no more) โ these are all aspects I think are key to building better (incl. more maintainable & reason-able) software. IMO they are worth embracing & exposing more people to and this is what I've partially attempted to do with this series of posts...
ICYMI here's a summary of the 10 most recent posts (full list in the https://thi.ng/umbrella readme). Many of those examples have more comments than code...
I just published my 1h22min video "Tutorial: an Illustration from A to Z with Krita" It's a real full lenght course suited to beginners, but also advanced digital painters. It starts from scratch with default brushes, pref' and breakdown all the process:
Tutorial rรกpido para bloquear #threads y todas las instancias que han estado usando como prueba (de momento) (En modo navegador de pc) vas a https://codeberg.org//alexis/block-meta-from-fedi/src/branch/main/.data/domains.txt le das a descargar, renombras el .txt como csv vas a preferencias > importar y exportar >ย ย importar > Pinchas en lista de seguidos y selecciona Lista de dominios bloqueados, carga el csv y listo!
1/15 #Tutorial#thread on how I made a #worms style procedural level generator, with visual examples and names of image processing algorithms being used for each step.
While I am using #unity, the level generator code is standalone #csharp and I hope to write this in a way that is useful for any language. My focus is going to be on the actual steps being taken, and less on the programming.
Includes #Librewolf profile pre-setup + desktop shortcut + icon + starting script starts #i2prouter upon browser open & stops i2prouter on browser close