<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.rixort.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Paul</id>
	<title>Rixort Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.rixort.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Paul"/>
	<link rel="alternate" type="text/html" href="https://wiki.rixort.com/wiki/Special:Contributions/Paul"/>
	<updated>2026-06-04T15:24:12Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1472</id>
		<title>Affiliate schemes</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1472"/>
		<updated>2026-05-06T08:13:47Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://www.deployhq.com/r/1nq46h DeployHQ] - I get &#039;credits&#039;, which can be exchanged for a variety of items.&lt;br /&gt;
* [https://refer.moo.com/s/lg65tm MOO] - I get a pre-paid card, you get a discount on your order.&lt;br /&gt;
* [https://share.octopus.energy/somber-ivory-9 Octopus Energy] - We both get £50 if you switch energy supplier.&lt;br /&gt;
* [http://fre.ag/4v3bdjvc FreeAgent] - We both get 10% off our subscription.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Computer_Games&amp;diff=1471</id>
		<title>Computer Games</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Computer_Games&amp;diff=1471"/>
		<updated>2026-05-05T15:26:37Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.shikadi.net/ shikadai.net] - collection of wikis covering classic MS-DOS games.&lt;br /&gt;
&lt;br /&gt;
[[Category:Computer Games]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1470</id>
		<title>Affiliate schemes</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1470"/>
		<updated>2026-05-05T14:35:24Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://www.deployhq.com/r/1nq46h DeployHQ] - I get &#039;credits&#039;, which can be exchanged for a variety of items.&lt;br /&gt;
* [https://refer.moo.com/s/lg65tm MOO] - I get a pre-paid card, you get a discount on your order.&lt;br /&gt;
* [https://share.octopus.energy/somber-ivory-9 Octopus Energy] - We both get £50 if you switch energy supplier.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Experience&amp;diff=1469</id>
		<title>Experience</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Experience&amp;diff=1469"/>
		<updated>2026-03-31T11:32:48Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In [[Baldur&#039;s Gate]], all members of your party gain experience for completing quests and killing monsters, which is sometimes referred to as experience points or XP. In most cases, experience is awarded to the party as a whole and divided equally. For example, if the party earns 100 XP and has five members, each member will receive 20 XP. Sometimes the resolution of character-specific quests will result in experience for that character only. Due to characters joining and leaving the party at different times and at different levels, it is highly unlikely that everyone in the party will have the same experience. Likewise, because different classes gain levels at different values of experience, it is possible to have a spread of levels in the party.&lt;br /&gt;
&lt;br /&gt;
Unlike Dungeons and Dragons, once experience has been gained it cannot be lost or used (e.g. in spells), except in one or two rare circumstances.&lt;br /&gt;
&lt;br /&gt;
In BG1, experience is always handed out to the party as a whole. In BG2, experience is awarded to the party as a whole in most cases, but completing some quests results in each character gaining experience individually, though usually all by the same amount.&lt;br /&gt;
&lt;br /&gt;
== Starting experience ==&lt;br /&gt;
&lt;br /&gt;
A new character in BG1 starts with zero experience.&lt;br /&gt;
&lt;br /&gt;
A new character in SoD starts with 64,000 XP. If you import a character from BG1, they will start with the same XP as they ended the previous game, with a minimum of 64,000 XP.&lt;br /&gt;
&lt;br /&gt;
A new character in BG2 starts with 89,000 XP. If you import a character from BG1 or SoD, they will start with the same XP as they ended the previous game, with a minimum of 89,000 XP.&lt;br /&gt;
&lt;br /&gt;
== Experience points cap ==&lt;br /&gt;
&lt;br /&gt;
All games have caps on how much experience you can earn, although you are unlikely to hit these limits in either game unless you make a point of completing most of the optional quests.&lt;br /&gt;
&lt;br /&gt;
* BG1: 161,000&lt;br /&gt;
* SoD: 500,000&lt;br /&gt;
* BG2: 8,000,000&lt;br /&gt;
&lt;br /&gt;
It is possible to exceed the cap in BG1, but it will not have any effect in that game (e.g. if you earn 200,000 XP, you will be treated as having 161,000 in terms of levels etc.). However, the extra XP is still saved and will appear if you import a character into SoD or BG2.&lt;br /&gt;
&lt;br /&gt;
Generally, both games offer a reasonable challenge if you play at the standard levels. You can import a character with lots of experience into either game at the beginning, or use a software modification to remove the cap, but these may affect the balance of gameplay and even break certain parts of the game. Bear in mind that if you reach the cap in either game you will have a seriously powerful party which will have no trouble dispatching the majority of foes. For example, hitting the cap with a fighter in BG2 means you will be at level 40, potentially with the ability to raise your number of attacks per round to 10 up to 13 times a day. As a sorcerer, you will be able to cast 4-5 level 9 spells each day, which effectively allows you to stop time and cast two level 8 spells 4-5 times without your opponents being able to respond.&lt;br /&gt;
&lt;br /&gt;
== Summoned creatures ==&lt;br /&gt;
&lt;br /&gt;
You do not receive experience for killing summoned creatures, as this would allow you to rack up XP by constantly summoning and killing creatures. Frustratingly, this also applies to creatures summoned by enemies in some cases, so you may receive less experience than you would expect for finishing off a mage and their band of summoned monsters.&lt;br /&gt;
&lt;br /&gt;
== Mind flayer drain ==&lt;br /&gt;
&lt;br /&gt;
You do not receive experience if you kill a character using the mind flayer intelligence drain whilst shape changed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Ansible&amp;diff=1468</id>
		<title>Ansible</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Ansible&amp;diff=1468"/>
		<updated>2026-03-20T09:05:08Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Requirements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Requirements on hosts:&lt;br /&gt;
&lt;br /&gt;
* SSH&lt;br /&gt;
* Python 3.10 or later&lt;br /&gt;
&lt;br /&gt;
Control machine requires Python 3.10 or later.&lt;br /&gt;
&lt;br /&gt;
Ansible is push-based, i.e. updates occur only when a playbook is run. However, pull-based support is available via &amp;lt;code&amp;gt;ansible-pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
No abstraction is available, so playbooks are OS and distribution specific (e.g. use &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; for Debian).&lt;br /&gt;
&lt;br /&gt;
Ansible runs each task in parallel across every host, and does not move on to the next task until all hosts have completed.&lt;br /&gt;
&lt;br /&gt;
== Configuration file ==&lt;br /&gt;
&lt;br /&gt;
Ansible will look for an &amp;lt;code&amp;gt;ansible.cfg&amp;lt;/code&amp;gt; file in the following locations:&lt;br /&gt;
&lt;br /&gt;
# Location specified by &amp;lt;code&amp;gt;ANSIBLE_CONFIG&amp;lt;/code&amp;gt; configuration.&lt;br /&gt;
# &amp;lt;code&amp;gt;./ansible.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;~/.ansible.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/etc/ansible/ansible.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Placing the file in the current directory alongside playbooks is the easiest solution, and keeps everything together.&lt;br /&gt;
&lt;br /&gt;
Sample configuration file:&lt;br /&gt;
&lt;br /&gt;
 [defaults]&lt;br /&gt;
 hostfile = hosts&lt;br /&gt;
 remote_user = vagrant&lt;br /&gt;
 private_key_file = ~/.vagrant.d/insecure_private_key&lt;br /&gt;
 host_key_checking = False&lt;br /&gt;
&lt;br /&gt;
== SSH options ==&lt;br /&gt;
&lt;br /&gt;
Accelerated mode makes an initial SSH connection and then sends further commands via port 5099. To use this:&lt;br /&gt;
&lt;br /&gt;
* Install &amp;lt;code&amp;gt;python-keyczar&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add &amp;lt;code&amp;gt;accelerate: true&amp;lt;/code&amp;gt; at the top level of the playbook&lt;br /&gt;
&lt;br /&gt;
There are some problems using accelerated mode with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, which requires additional configuration.&lt;br /&gt;
&lt;br /&gt;
Port 5099 must of course be allowed through the firewall.&lt;br /&gt;
&lt;br /&gt;
== Command module ==&lt;br /&gt;
&lt;br /&gt;
Arbitrary commands can be executed using the command module:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -m command -a uptime&lt;br /&gt;
&lt;br /&gt;
Passing &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; runs the command as root, using sudo.&lt;br /&gt;
&lt;br /&gt;
Update packages:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -s -m apt -a &amp;quot;update_cache=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Install package:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -s -m apt -a &amp;quot;name=apache2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Restarting service:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -s -m service -a &amp;quot;name=apache2 state=restarted&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Playbooks ==&lt;br /&gt;
&lt;br /&gt;
Playbooks are YAML files which contain tasks to be run on a group of hosts. Each playbook must contain:&lt;br /&gt;
&lt;br /&gt;
* A list of hosts.&lt;br /&gt;
* A list of tasks to be run on the hosts.&lt;br /&gt;
&lt;br /&gt;
Command: &amp;lt;code&amp;gt;ansible-playbook playbook.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; option in a playbook means that every task should be run via &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. This is particularly useful on Ubuntu servers, and also on servers where root SSH login has been disabled.&lt;br /&gt;
&lt;br /&gt;
All tasks in a playbook can be listed by running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ansible-playbook --list-tasks playbook.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handlers ==&lt;br /&gt;
&lt;br /&gt;
Handlers are similar to tasks, but they only run if notified. An example handler might be:&lt;br /&gt;
&lt;br /&gt;
 handlers:&lt;br /&gt;
     - name: restart apache&lt;br /&gt;
       service:&lt;br /&gt;
         name: apache2&lt;br /&gt;
         state: restarted&lt;br /&gt;
&lt;br /&gt;
This will run if a task includes:&lt;br /&gt;
&lt;br /&gt;
 notify: restart apache&lt;br /&gt;
&lt;br /&gt;
Handlers run after all tasks, and only run once regardless of how many times they are notified. Handlers are run in the order they are defined, not the order they are notified.&lt;br /&gt;
&lt;br /&gt;
== File conventions ==&lt;br /&gt;
&lt;br /&gt;
* Support files (e.g. configuration) in: &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt;&lt;br /&gt;
* Template files in: &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Roles ==&lt;br /&gt;
&lt;br /&gt;
Roles are split into three categories:&lt;br /&gt;
&lt;br /&gt;
* Core: Created by the Ansible team.&lt;br /&gt;
* Certified: Created by certified RedHat / IBM partners.&lt;br /&gt;
* Community: Created by anyone.&lt;br /&gt;
&lt;br /&gt;
Each Ansible role has a name, e.g. &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;. Files associated with this role go into &amp;lt;code&amp;gt;roles/web&amp;lt;/code&amp;gt;, including:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;tasks/main.yml&amp;lt;/code&amp;gt; - tasks&lt;br /&gt;
* &amp;lt;code&amp;gt;files/&amp;lt;/code&amp;gt; - files, as per usual Ansible layout&lt;br /&gt;
* &amp;lt;code&amp;gt;templates/&amp;lt;/code&amp;gt; - Jinja2 templates&lt;br /&gt;
* &amp;lt;code&amp;gt;handlers/main.yml&amp;lt;/code&amp;gt; - handlers&lt;br /&gt;
* &amp;lt;code&amp;gt;defaults/main.yml&amp;lt;/code&amp;gt; - default variables than can be overridden.&lt;br /&gt;
&lt;br /&gt;
The file structure can be automatically created using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ansible-galaxy init base&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above command will create a file structure for a role called &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; in the current directory.&lt;br /&gt;
&lt;br /&gt;
A playbook may contain multiple roles, and variables for each role can be overridden on a per-play basis.&lt;br /&gt;
&lt;br /&gt;
Tasks can be run before or after roles are applied.&lt;br /&gt;
&lt;br /&gt;
When using a &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; directive within a role, Ansible will look for the file in the &amp;lt;code&amp;gt;templates/&amp;lt;/code&amp;gt; subdirectory, unlike in top-level playbooks where you need to specify the full path (i.e. &amp;lt;code&amp;gt;templates/file.j2&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Base server ===&lt;br /&gt;
&lt;br /&gt;
Packages that should be installed on a basic server:&lt;br /&gt;
&lt;br /&gt;
* OpenSSH&lt;br /&gt;
* UFW - firewall rules&lt;br /&gt;
* SSHGuard - automatically block dictionary attacks etc. Is this still the best option? fail2ban?&lt;br /&gt;
* vnstat - monitor total amount of network traffic&lt;br /&gt;
* Postfix - for outgoing email (e.g. notifications)&lt;br /&gt;
* Monit - basic monitoring, might want to swap out for something more sophisticated. At a bare minimum we need to monitor the disk space and any services.&lt;br /&gt;
* NTP - for time synchronisation (no longer required as Ubuntu ships with timesyncd, part of systemd)&lt;br /&gt;
* &amp;lt;code&amp;gt;unattended-upgrades&amp;lt;/code&amp;gt;&lt;br /&gt;
* Backup scripts&lt;br /&gt;
* certbot / dehydrated&lt;br /&gt;
&lt;br /&gt;
==== General ====&lt;br /&gt;
&lt;br /&gt;
* Set hostname and mailname before installing packages&lt;br /&gt;
&lt;br /&gt;
Disabling MOTD updates for privacy reasons:&lt;br /&gt;
&lt;br /&gt;
In file:&lt;br /&gt;
&lt;br /&gt;
 /etc/default/motd-news&lt;br /&gt;
&lt;br /&gt;
set:&lt;br /&gt;
&lt;br /&gt;
 ENABLED=0&lt;br /&gt;
&lt;br /&gt;
==== certbot ====&lt;br /&gt;
&lt;br /&gt;
* How do we get around the bootstrapping problem when obtaining a certificate for the first time? DNS challenge?&lt;br /&gt;
* Is a recent version of dehydrated available in the Ubuntu repositories, or a PPA?&lt;br /&gt;
* May also need certificates for email and other services&lt;br /&gt;
* Do we need a cron job to reload services after certificates have been renewed?&lt;br /&gt;
* Should DNS challenge and dehydrated be in a separate Mythic Beasts role?&lt;br /&gt;
&lt;br /&gt;
==== Automatic blocking ====&lt;br /&gt;
&lt;br /&gt;
* Need to block based on: SSH, web, SMTP&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
&lt;br /&gt;
Configuration options:&lt;br /&gt;
&lt;br /&gt;
* Strong cipher suites&lt;br /&gt;
* Always attempt TLS on outgoing connections&lt;br /&gt;
&lt;br /&gt;
==== UFW ====&lt;br /&gt;
&lt;br /&gt;
* Deny all incoming apart from ping (default?) and SSH&lt;br /&gt;
* Allow all outgoing&lt;br /&gt;
* Log all blocked connections&lt;br /&gt;
&lt;br /&gt;
==== Monit ====&lt;br /&gt;
&lt;br /&gt;
* Specify email address for reports&lt;br /&gt;
* Create template for monit configuration file so we can pass in multiple services and variables such as disk space&lt;br /&gt;
&lt;br /&gt;
==== unattended-upgrades ====&lt;br /&gt;
&lt;br /&gt;
* Configure to apply all updates, not just security ones&lt;br /&gt;
* Specify email address for reports&lt;br /&gt;
&lt;br /&gt;
=== Web server ===&lt;br /&gt;
&lt;br /&gt;
* Nginx&lt;br /&gt;
* PHP FPM&lt;br /&gt;
&lt;br /&gt;
=== Database server ===&lt;br /&gt;
&lt;br /&gt;
* MariaDB - usually &amp;lt;code&amp;gt;mariadb-server&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mariadb-client&amp;lt;/code&amp;gt;&lt;br /&gt;
* MySQL-python - &amp;lt;code&amp;gt;python3-mysqldb&amp;lt;/code&amp;gt;&lt;br /&gt;
* Set root password to a random value?&lt;br /&gt;
* MySQL backups&lt;br /&gt;
&lt;br /&gt;
=== Role dependencies ===&lt;br /&gt;
&lt;br /&gt;
Roles can depend on other roles. Dependencies are specified in &amp;lt;code&amp;gt;meta/main.yml&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dependencies:&lt;br /&gt;
  - role: base&lt;br /&gt;
    vars:&lt;br /&gt;
      install_packages:&lt;br /&gt;
        - nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example roles ===&lt;br /&gt;
&lt;br /&gt;
* https://git.coop/webarch/fail2ban&lt;br /&gt;
* https://git.coop/webarch/exim&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
The official testing framework for Ansible roles is [https://molecule.readthedocs.io/ Molecule].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.ansible.com/infrastructure-testing-with-molecule Infrastructure testing with Molecule] - Talk from Ansiblefest 2017.&lt;br /&gt;
* [https://zapier.com/engineering/ansible-molecule/ How We Test Our Ansible Roles with Molecule]&lt;br /&gt;
* [https://www.jeffgeerling.com/blog/2018/testing-your-ansible-roles-molecule Testing your Ansible roles with Molecule]&lt;br /&gt;
* [https://www.ansiblefordevops.com/ Ansible for DevOps]&lt;br /&gt;
* [https://jpmens.net/2019/12/11/on-building-an-ansible-training-environment-on-freebsd/ On building an Ansible training environment on FreeBSD]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Ansible&amp;diff=1467</id>
		<title>Ansible</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Ansible&amp;diff=1467"/>
		<updated>2026-03-20T09:02:53Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Requirements on hosts:&lt;br /&gt;
&lt;br /&gt;
* SSH&lt;br /&gt;
* Python 2.5 or later&lt;br /&gt;
&lt;br /&gt;
Control machine requires Python 2.6 or later.&lt;br /&gt;
&lt;br /&gt;
Ansible is push-based, i.e. updates occur only when a playbook is run. However, pull-based support is available via &amp;lt;code&amp;gt;ansible-pull&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
No abstraction is available, so playbooks are OS and distribution specific (e.g. use &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; for Debian).&lt;br /&gt;
&lt;br /&gt;
Ansible runs each task in parallel across every host, and does not move on to the next task until all hosts have completed.&lt;br /&gt;
&lt;br /&gt;
== Configuration file ==&lt;br /&gt;
&lt;br /&gt;
Ansible will look for an &amp;lt;code&amp;gt;ansible.cfg&amp;lt;/code&amp;gt; file in the following locations:&lt;br /&gt;
&lt;br /&gt;
# Location specified by &amp;lt;code&amp;gt;ANSIBLE_CONFIG&amp;lt;/code&amp;gt; configuration.&lt;br /&gt;
# &amp;lt;code&amp;gt;./ansible.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;~/.ansible.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;/etc/ansible/ansible.cfg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Placing the file in the current directory alongside playbooks is the easiest solution, and keeps everything together.&lt;br /&gt;
&lt;br /&gt;
Sample configuration file:&lt;br /&gt;
&lt;br /&gt;
 [defaults]&lt;br /&gt;
 hostfile = hosts&lt;br /&gt;
 remote_user = vagrant&lt;br /&gt;
 private_key_file = ~/.vagrant.d/insecure_private_key&lt;br /&gt;
 host_key_checking = False&lt;br /&gt;
&lt;br /&gt;
== SSH options ==&lt;br /&gt;
&lt;br /&gt;
Accelerated mode makes an initial SSH connection and then sends further commands via port 5099. To use this:&lt;br /&gt;
&lt;br /&gt;
* Install &amp;lt;code&amp;gt;python-keyczar&amp;lt;/code&amp;gt;&lt;br /&gt;
* Add &amp;lt;code&amp;gt;accelerate: true&amp;lt;/code&amp;gt; at the top level of the playbook&lt;br /&gt;
&lt;br /&gt;
There are some problems using accelerated mode with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, which requires additional configuration.&lt;br /&gt;
&lt;br /&gt;
Port 5099 must of course be allowed through the firewall.&lt;br /&gt;
&lt;br /&gt;
== Command module ==&lt;br /&gt;
&lt;br /&gt;
Arbitrary commands can be executed using the command module:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -m command -a uptime&lt;br /&gt;
&lt;br /&gt;
Passing &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; runs the command as root, using sudo.&lt;br /&gt;
&lt;br /&gt;
Update packages:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -s -m apt -a &amp;quot;update_cache=yes&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Install package:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -s -m apt -a &amp;quot;name=apache2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Restarting service:&lt;br /&gt;
&lt;br /&gt;
 ansible hostname -s -m service -a &amp;quot;name=apache2 state=restarted&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Playbooks ==&lt;br /&gt;
&lt;br /&gt;
Playbooks are YAML files which contain tasks to be run on a group of hosts. Each playbook must contain:&lt;br /&gt;
&lt;br /&gt;
* A list of hosts.&lt;br /&gt;
* A list of tasks to be run on the hosts.&lt;br /&gt;
&lt;br /&gt;
Command: &amp;lt;code&amp;gt;ansible-playbook playbook.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; option in a playbook means that every task should be run via &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;. This is particularly useful on Ubuntu servers, and also on servers where root SSH login has been disabled.&lt;br /&gt;
&lt;br /&gt;
All tasks in a playbook can be listed by running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ansible-playbook --list-tasks playbook.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handlers ==&lt;br /&gt;
&lt;br /&gt;
Handlers are similar to tasks, but they only run if notified. An example handler might be:&lt;br /&gt;
&lt;br /&gt;
 handlers:&lt;br /&gt;
     - name: restart apache&lt;br /&gt;
       service:&lt;br /&gt;
         name: apache2&lt;br /&gt;
         state: restarted&lt;br /&gt;
&lt;br /&gt;
This will run if a task includes:&lt;br /&gt;
&lt;br /&gt;
 notify: restart apache&lt;br /&gt;
&lt;br /&gt;
Handlers run after all tasks, and only run once regardless of how many times they are notified. Handlers are run in the order they are defined, not the order they are notified.&lt;br /&gt;
&lt;br /&gt;
== File conventions ==&lt;br /&gt;
&lt;br /&gt;
* Support files (e.g. configuration) in: &amp;lt;code&amp;gt;files&amp;lt;/code&amp;gt;&lt;br /&gt;
* Template files in: &amp;lt;code&amp;gt;templates&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Roles ==&lt;br /&gt;
&lt;br /&gt;
Roles are split into three categories:&lt;br /&gt;
&lt;br /&gt;
* Core: Created by the Ansible team.&lt;br /&gt;
* Certified: Created by certified RedHat / IBM partners.&lt;br /&gt;
* Community: Created by anyone.&lt;br /&gt;
&lt;br /&gt;
Each Ansible role has a name, e.g. &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;. Files associated with this role go into &amp;lt;code&amp;gt;roles/web&amp;lt;/code&amp;gt;, including:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;tasks/main.yml&amp;lt;/code&amp;gt; - tasks&lt;br /&gt;
* &amp;lt;code&amp;gt;files/&amp;lt;/code&amp;gt; - files, as per usual Ansible layout&lt;br /&gt;
* &amp;lt;code&amp;gt;templates/&amp;lt;/code&amp;gt; - Jinja2 templates&lt;br /&gt;
* &amp;lt;code&amp;gt;handlers/main.yml&amp;lt;/code&amp;gt; - handlers&lt;br /&gt;
* &amp;lt;code&amp;gt;defaults/main.yml&amp;lt;/code&amp;gt; - default variables than can be overridden.&lt;br /&gt;
&lt;br /&gt;
The file structure can be automatically created using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ansible-galaxy init base&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above command will create a file structure for a role called &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; in the current directory.&lt;br /&gt;
&lt;br /&gt;
A playbook may contain multiple roles, and variables for each role can be overridden on a per-play basis.&lt;br /&gt;
&lt;br /&gt;
Tasks can be run before or after roles are applied.&lt;br /&gt;
&lt;br /&gt;
When using a &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; directive within a role, Ansible will look for the file in the &amp;lt;code&amp;gt;templates/&amp;lt;/code&amp;gt; subdirectory, unlike in top-level playbooks where you need to specify the full path (i.e. &amp;lt;code&amp;gt;templates/file.j2&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Base server ===&lt;br /&gt;
&lt;br /&gt;
Packages that should be installed on a basic server:&lt;br /&gt;
&lt;br /&gt;
* OpenSSH&lt;br /&gt;
* UFW - firewall rules&lt;br /&gt;
* SSHGuard - automatically block dictionary attacks etc. Is this still the best option? fail2ban?&lt;br /&gt;
* vnstat - monitor total amount of network traffic&lt;br /&gt;
* Postfix - for outgoing email (e.g. notifications)&lt;br /&gt;
* Monit - basic monitoring, might want to swap out for something more sophisticated. At a bare minimum we need to monitor the disk space and any services.&lt;br /&gt;
* NTP - for time synchronisation (no longer required as Ubuntu ships with timesyncd, part of systemd)&lt;br /&gt;
* &amp;lt;code&amp;gt;unattended-upgrades&amp;lt;/code&amp;gt;&lt;br /&gt;
* Backup scripts&lt;br /&gt;
* certbot / dehydrated&lt;br /&gt;
&lt;br /&gt;
==== General ====&lt;br /&gt;
&lt;br /&gt;
* Set hostname and mailname before installing packages&lt;br /&gt;
&lt;br /&gt;
Disabling MOTD updates for privacy reasons:&lt;br /&gt;
&lt;br /&gt;
In file:&lt;br /&gt;
&lt;br /&gt;
 /etc/default/motd-news&lt;br /&gt;
&lt;br /&gt;
set:&lt;br /&gt;
&lt;br /&gt;
 ENABLED=0&lt;br /&gt;
&lt;br /&gt;
==== certbot ====&lt;br /&gt;
&lt;br /&gt;
* How do we get around the bootstrapping problem when obtaining a certificate for the first time? DNS challenge?&lt;br /&gt;
* Is a recent version of dehydrated available in the Ubuntu repositories, or a PPA?&lt;br /&gt;
* May also need certificates for email and other services&lt;br /&gt;
* Do we need a cron job to reload services after certificates have been renewed?&lt;br /&gt;
* Should DNS challenge and dehydrated be in a separate Mythic Beasts role?&lt;br /&gt;
&lt;br /&gt;
==== Automatic blocking ====&lt;br /&gt;
&lt;br /&gt;
* Need to block based on: SSH, web, SMTP&lt;br /&gt;
&lt;br /&gt;
==== Postfix ====&lt;br /&gt;
&lt;br /&gt;
Configuration options:&lt;br /&gt;
&lt;br /&gt;
* Strong cipher suites&lt;br /&gt;
* Always attempt TLS on outgoing connections&lt;br /&gt;
&lt;br /&gt;
==== UFW ====&lt;br /&gt;
&lt;br /&gt;
* Deny all incoming apart from ping (default?) and SSH&lt;br /&gt;
* Allow all outgoing&lt;br /&gt;
* Log all blocked connections&lt;br /&gt;
&lt;br /&gt;
==== Monit ====&lt;br /&gt;
&lt;br /&gt;
* Specify email address for reports&lt;br /&gt;
* Create template for monit configuration file so we can pass in multiple services and variables such as disk space&lt;br /&gt;
&lt;br /&gt;
==== unattended-upgrades ====&lt;br /&gt;
&lt;br /&gt;
* Configure to apply all updates, not just security ones&lt;br /&gt;
* Specify email address for reports&lt;br /&gt;
&lt;br /&gt;
=== Web server ===&lt;br /&gt;
&lt;br /&gt;
* Nginx&lt;br /&gt;
* PHP FPM&lt;br /&gt;
&lt;br /&gt;
=== Database server ===&lt;br /&gt;
&lt;br /&gt;
* MariaDB - usually &amp;lt;code&amp;gt;mariadb-server&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mariadb-client&amp;lt;/code&amp;gt;&lt;br /&gt;
* MySQL-python - &amp;lt;code&amp;gt;python3-mysqldb&amp;lt;/code&amp;gt;&lt;br /&gt;
* Set root password to a random value?&lt;br /&gt;
* MySQL backups&lt;br /&gt;
&lt;br /&gt;
=== Role dependencies ===&lt;br /&gt;
&lt;br /&gt;
Roles can depend on other roles. Dependencies are specified in &amp;lt;code&amp;gt;meta/main.yml&amp;lt;/code&amp;gt;, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dependencies:&lt;br /&gt;
  - role: base&lt;br /&gt;
    vars:&lt;br /&gt;
      install_packages:&lt;br /&gt;
        - nginx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example roles ===&lt;br /&gt;
&lt;br /&gt;
* https://git.coop/webarch/fail2ban&lt;br /&gt;
* https://git.coop/webarch/exim&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
The official testing framework for Ansible roles is [https://molecule.readthedocs.io/ Molecule].&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.ansible.com/infrastructure-testing-with-molecule Infrastructure testing with Molecule] - Talk from Ansiblefest 2017.&lt;br /&gt;
* [https://zapier.com/engineering/ansible-molecule/ How We Test Our Ansible Roles with Molecule]&lt;br /&gt;
* [https://www.jeffgeerling.com/blog/2018/testing-your-ansible-roles-molecule Testing your Ansible roles with Molecule]&lt;br /&gt;
* [https://www.ansiblefordevops.com/ Ansible for DevOps]&lt;br /&gt;
* [https://jpmens.net/2019/12/11/on-building-an-ansible-training-environment-on-freebsd/ On building an Ansible training environment on FreeBSD]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Minsc&amp;diff=1466</id>
		<title>Minsc</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Minsc&amp;diff=1466"/>
		<updated>2025-11-22T10:40:07Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Baldur&amp;#039;s Gate 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Minsc is a Lawful Good Ranger who can be recruited in all three games. With a stength of 18/93 and a reasonable constitution, he makes a good frontline melee fighter. Although he will refuse to be in the same party as Edwin, he gets along with other party members and has some amusing dialogue options.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
Minsc can be found in Nashkel, where is he looking for a band of adventurers to help him rescue [[Dynaheir]]. Once recruited, you must rescue Dynaheir within a certain time limit, otherwise Minsc will leave the party. It is possible to recruit Minsc after rescuing Dynaheir, but if you talk to Minsc after recruiting Dynaheir and refuse to recruit him, Dynaheir will leave.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
Minsc and Dynaheir can be recruited as part of the initial search through the city.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Minsc can be found near your cell at the beginning of the game. Dynaheir does not appear in BG2 so there is no requirement to recruit her in order to keep Minsc in your party.&lt;br /&gt;
&lt;br /&gt;
Minsc does not have a side quest in BG2, but there is one quest which he will insist you start once you have been made aware of it. However, there is no time limit on completing the quest.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1465</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1465"/>
		<updated>2025-08-29T17:43:29Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
* Containers can continue running when Podman is stopped&lt;br /&gt;
* Upgrading Podman doesn&#039;t stop all containers (unlike upgrading Docker)&lt;br /&gt;
&lt;br /&gt;
== Naming changes ==&lt;br /&gt;
&lt;br /&gt;
* Podman refers to layers as blobs&lt;br /&gt;
&lt;br /&gt;
== Traps for the unwary ==&lt;br /&gt;
&lt;br /&gt;
* Installing the podman package on Ubuntu doesn&#039;t include compose - you have to install podman-compose as well&lt;br /&gt;
* Short image names are not supported by default - you have to convert them (e.g. mariadb:10.11 becomes docker.io/mariadb:10.11)&lt;br /&gt;
* Rootless by default means you cannot forward ports from the container to a privileged port (below 1024) on the host (you can run software within the container on privileged ports)&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application. A container engine will usually support multiple container runtimes.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1464</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1464"/>
		<updated>2025-08-29T17:34:35Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
* Containers can continue running when Podman is stopped&lt;br /&gt;
* Upgrading Podman doesn&#039;t stop all containers (unlike upgrading Docker)&lt;br /&gt;
&lt;br /&gt;
== Naming changes ==&lt;br /&gt;
&lt;br /&gt;
* Podman refers to layers as blobs&lt;br /&gt;
&lt;br /&gt;
== Traps for the unwary ==&lt;br /&gt;
&lt;br /&gt;
* Installing the podman package on Ubuntu doesn&#039;t include compose - you have to install podman-compose as well&lt;br /&gt;
* Short image names are not supported by default - you have to convert them (e.g. mariadb:10.11 becomes docker.io/mariadb:10.11)&lt;br /&gt;
* Rootless by default means you cannot forward ports from the container to a privileged port (below 1024) on the host (you can run software within the container on privileged ports)&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application. A container engine will usually support multiple container runtimes.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1463</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1463"/>
		<updated>2025-08-28T15:31:09Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Traps for the unwary */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
* Containers can continue running when Podman is stopped&lt;br /&gt;
* Upgrading Podman doesn&#039;t stop all containers (unlike upgrading Docker)&lt;br /&gt;
&lt;br /&gt;
== Traps for the unwary ==&lt;br /&gt;
&lt;br /&gt;
* Installing the podman package on Ubuntu doesn&#039;t include compose - you have to install podman-compose as well&lt;br /&gt;
* Short image names are not supported by default - you have to convert them (e.g. mariadb:10.11 becomes docker.io/mariadb:10.11)&lt;br /&gt;
* Rootless by default means you cannot forward ports from the container to a privileged port (below 1024) on the host (you can run software within the container on privileged ports)&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application. A container engine will usually support multiple container runtimes.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1462</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1462"/>
		<updated>2025-08-28T15:15:50Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
* Containers can continue running when Podman is stopped&lt;br /&gt;
* Upgrading Podman doesn&#039;t stop all containers (unlike upgrading Docker)&lt;br /&gt;
&lt;br /&gt;
== Traps for the unwary ==&lt;br /&gt;
&lt;br /&gt;
* Installing the podman package on Ubuntu doesn&#039;t include compose - you have to install podman-compose as well&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application. A container engine will usually support multiple container runtimes.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1461</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1461"/>
		<updated>2025-08-28T15:04:01Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
* Containers can continue running when Podman is stopped&lt;br /&gt;
* Upgrading Podman doesn&#039;t stop all containers (unlike upgrading Docker)&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application. A container engine will usually support multiple container runtimes.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1460</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1460"/>
		<updated>2025-08-28T14:43:59Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Container runtimes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application. A container engine will usually support multiple container runtimes.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1459</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1459"/>
		<updated>2025-08-28T14:42:10Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;br /&gt;
&lt;br /&gt;
== Container engines ==&lt;br /&gt;
&lt;br /&gt;
A container engine configures applications to run on nodes. These are what you will typically interact with during development.&lt;br /&gt;
&lt;br /&gt;
Engines include:&lt;br /&gt;
&lt;br /&gt;
* Docker&lt;br /&gt;
* Podman&lt;br /&gt;
&lt;br /&gt;
== Container runtimes ==&lt;br /&gt;
&lt;br /&gt;
A container runtime is the interface between the kernel and the containerised application.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1458</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1458"/>
		<updated>2025-08-16T10:44:58Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Podman is an alternative to Docker for running containers on Linux. It is similar to Docker in many respects, but differs in some key areas:&lt;br /&gt;
&lt;br /&gt;
* Doesn&#039;t require root privileges by default&lt;br /&gt;
&lt;br /&gt;
== Container orchestrators ==&lt;br /&gt;
&lt;br /&gt;
A container orchestrator performs orchestration, i.e. the management of containers across nodes (which may be across different machines). For example, if you have two web nodes (with a load balancer) and a database node, your orchestrator will ensure that all the nodes are configured and can talk to each other as needed.&lt;br /&gt;
&lt;br /&gt;
Orchestrators include:&lt;br /&gt;
&lt;br /&gt;
* Kubernetes&lt;br /&gt;
* Apache Mesos&lt;br /&gt;
* Docker Swarm&lt;br /&gt;
&lt;br /&gt;
Orchestrators are generally not compatible with each other(?)&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Podman&amp;diff=1457</id>
		<title>Podman</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Podman&amp;diff=1457"/>
		<updated>2025-08-16T10:31:26Z</updated>

		<summary type="html">&lt;p&gt;Paul: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1456</id>
		<title>Geek Walks</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1456"/>
		<updated>2025-06-12T12:36:21Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Trips during poor weather */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.geekwalks.co.uk Geek Walks] is a monthly social event run by [[User:Paul|Paul]].&lt;br /&gt;
&lt;br /&gt;
Basic idea: Get the train to somewhere nice, go for a walk followed by pub lunch.&lt;br /&gt;
&lt;br /&gt;
Future idea: Geek Run? Some people run whilst the others walk. May be better as a separate event.&lt;br /&gt;
&lt;br /&gt;
== Trips during poor weather ==&lt;br /&gt;
&lt;br /&gt;
* Eureka! - Right next to Halifax station&lt;br /&gt;
* Imperial War Museum North - Has its own Metrolink stop&lt;br /&gt;
* York - National Railway Museum&lt;br /&gt;
* Birkenhead - http://www.u-boatstory.co.uk/&lt;br /&gt;
* National Media Museum - Bradford&lt;br /&gt;
* [http://www.enginemuseum.org/ Anson Engine Museum] - near Poynton station, pub recommendation is Bull&#039;s Head&lt;br /&gt;
* [https://www.nmes.org Northern Mill Engine Society] - Bolton&lt;br /&gt;
* [https://www.avroheritagemuseum.co.uk/ Avro Heritage Museum]&lt;br /&gt;
* Lancaster - Castle and Police Museum&lt;br /&gt;
* Sheffield - [https://www.visitmagna.co.uk/ Magna Science]&lt;br /&gt;
* Macclesfield - Silk Museum and Bollington Brewery Tap Room&lt;br /&gt;
* St Helens - [https://en.wikipedia.org/wiki/World_of_Glass,_St_Helens World of Glass]&lt;br /&gt;
* [https://www.hackgreen.co.uk/ Hack Green Secret Nuclear Bunker] - 3 miles from Nantwich, 1tph, every other one direct, otherwise change at Crewe&lt;br /&gt;
&lt;br /&gt;
== Potential walks ==&lt;br /&gt;
&lt;br /&gt;
* [https://thetolkientrail.com/ The Tolkien Trail] - Clitheroe&lt;br /&gt;
* Marple - [https://www.marple.website/community-projects/mellor-cross-appeal.html Marple Cross], lunch at [http://devonshirearmsmellor.co.uk/ Devonshire Arms] or [https://www.thenorfolkarms.co.uk/ The Norfolk Arms]&lt;br /&gt;
* Anderton - [https://canalrivertrust.org.uk/places-to-visit/anderton-boat-lift-visitor-centre Anderton Boat Life], 2 miles from Northwich station, 1tph&lt;br /&gt;
* Halifax - [https://www.telegraph.co.uk/travel/destinations/europe/united-kingdom/articles/halifax-yorkshire-what-to-see-and-do/ The &#039;Shoreditch of the North&#039;]&lt;br /&gt;
* Buxton and stations en-route&lt;br /&gt;
* Healey Dell - Near Rochdale&lt;br /&gt;
* Lancaster - 57m on the train, places to walk, plus castle&lt;br /&gt;
* Hathersage - train station is in the centre, 56m&lt;br /&gt;
* New Mills - 26m on the train&lt;br /&gt;
* Blackpool - walk along the promenade, beaches etc.&lt;br /&gt;
* Southport - British Lawnmower Museum might be amusing&lt;br /&gt;
* Clitheroe - Sculpture trail&lt;br /&gt;
* Appley Bridge -&lt;br /&gt;
* Lea Green&lt;br /&gt;
* Delamere Forest - 1h09m on the train, 1tph&lt;br /&gt;
* Ramsbottom - Metrolink followed by steam train (expensive, could go on the bus instead)&lt;br /&gt;
* Barton Swing Aqueduct&lt;br /&gt;
* Preston - route taken for after Northern Gathering, The Continental seems to be the pub&lt;br /&gt;
* Hebden Bridge - 30-40m train, 3tph&lt;br /&gt;
* Entwistle - Wayoh reservoir - http://www.thestrawburyduck.co.uk/&lt;br /&gt;
* Edale&lt;br /&gt;
* Castleton (not Rochdale)&lt;br /&gt;
* Bamford Reservoir&lt;br /&gt;
* Heaton Park - not sure where is good for lunch - Woodthorpe Hotel?&lt;br /&gt;
* [https://canalrivertrust.org.uk/places-to-visit/standedge-tunnel-and-visitor-centre Standedge Tunnel and Visitor Centre]&lt;br /&gt;
* 535 to Wilton Arms outside of Bolton&lt;br /&gt;
* [https://www.manchestereveningnews.co.uk/whats-on/food-drink-news/country-walks-near-greater-manchester-26845338 Country walks near Greater Manchester]&lt;br /&gt;
&lt;br /&gt;
== Longer excursions ==&lt;br /&gt;
&lt;br /&gt;
* Llandudno&lt;br /&gt;
* Canal boat trip&lt;br /&gt;
* York (doable in a day but could also be a weekend trip)&lt;br /&gt;
* Bletchley Park and National Computing Museum&lt;br /&gt;
* Cambridge&lt;br /&gt;
* Oxford&lt;br /&gt;
&lt;br /&gt;
=== Overseas ===&lt;br /&gt;
&lt;br /&gt;
* Wrocław (Poland)&lt;br /&gt;
&lt;br /&gt;
== Ruled out ==&lt;br /&gt;
&lt;br /&gt;
* Widnes - never again! We were told by a helpful local that the pub we had intended to go into for lunch was not suitable for visitors...&lt;br /&gt;
* Skipton - too far&lt;br /&gt;
* Pendle - Colne (railway station) - too far (2h+)&lt;br /&gt;
* Lytham St Annes - bit too far (1h30m, 1 change)&lt;br /&gt;
* Ribchester - Langho station, 1h2m, 1tph - bit too far from the station&lt;br /&gt;
&lt;br /&gt;
[[Category:Socials]]&lt;br /&gt;
[[Category:Events]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Modern_PHP&amp;diff=1455</id>
		<title>Modern PHP</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Modern_PHP&amp;diff=1455"/>
		<updated>2025-05-18T10:46:35Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Composer ==&lt;br /&gt;
&lt;br /&gt;
You should commit &amp;lt;code&amp;gt;composer.json&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;composer.lock&amp;lt;/code&amp;gt; into version control.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;composer install&amp;lt;/code&amp;gt; will install the exact versions specified in &amp;lt;code&amp;gt;composer.lock&amp;lt;/code&amp;gt;. This ensures that all developers working on the same project are using the same versions. &amp;lt;code&amp;gt;composer update&amp;lt;/code&amp;gt; will update all installed packages to their latest versions and update the &amp;lt;code&amp;gt;composer.lock&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;composer init&amp;lt;/code&amp;gt; will start a new project.&lt;br /&gt;
&lt;br /&gt;
You can require a given version of PHP with:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;require&amp;quot;: {&lt;br /&gt;
   &amp;quot;php&amp;quot;: &amp;quot;7.1.*&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
You can restrict Composer to a maximum version of PHP with:&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;config&amp;quot;: {&lt;br /&gt;
   &amp;quot;platform&amp;quot;: {&lt;br /&gt;
     &amp;quot;php&amp;quot;: &amp;quot;5.6.35&amp;quot;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This can be useful if you are running Composer on a different platform to the one you deploy on (ideally development/local should match production but in real life this is often not the case).&lt;br /&gt;
&lt;br /&gt;
== Project directory structure ==&lt;br /&gt;
&lt;br /&gt;
In the root directory:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; - PHP source code (classes).&lt;br /&gt;
* &amp;lt;code&amp;gt;tests&amp;lt;/code&amp;gt; - PHPUnit tests.&lt;br /&gt;
* &amp;lt;code&amp;gt;composer.json&amp;lt;/code&amp;gt; - Composer dependencies and configuration.&lt;br /&gt;
* &amp;lt;code&amp;gt;phpunit.xml&amp;lt;/code&amp;gt; - PHPUnit configuration.&lt;br /&gt;
* &amp;lt;code&amp;gt;.travis.yml&amp;lt;/code&amp;gt; - Continuous integration configuration.&lt;br /&gt;
* &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; - Public files such as CSS, JavaScript etc.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
The standard tool for testing PHP is PHPUnit. It can be installed with the following command:&lt;br /&gt;
&lt;br /&gt;
 composer require --dev phpunit/phpunit&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;--dev&amp;lt;/code&amp;gt; flag ensures that PHPUnit is installed as a development dependency, because you don&#039;t want to run it in production (doing so would be a bad idea from a security perspective).&lt;br /&gt;
&lt;br /&gt;
== Strict typing ==&lt;br /&gt;
&lt;br /&gt;
By default, PHP attempts to cast/coerce the data passed to a function into the type required. For example, if a function expects a string and you pass an integer, PHP will cast the integer to a string (e.g. 10 becomes &#039;10&#039;). Most of the time this doesn&#039;t present any problems, and it can make life easier to begin with when developing web applications (e.g. the contents of &amp;lt;code&amp;gt;$_GET&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$_POST&amp;lt;/code&amp;gt; are usually strings, so it saves you have to explicitly cast these to other types).&lt;br /&gt;
&lt;br /&gt;
However, occasionally this automatic casting can cause subtle bugs. To prevent this, you can enable strict typing by including the following line at the top of every PHP file:&lt;br /&gt;
&lt;br /&gt;
 declare(strict_types=1);&lt;br /&gt;
&lt;br /&gt;
Unfortunately this line has to be added to every file in order to have full effect. Strict typing cannot be enabled by configuration options in &amp;lt;code&amp;gt;php.ini&amp;lt;/code&amp;gt;, and it is not the same as &amp;lt;code&amp;gt;E_STRICT&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Generators ==&lt;br /&gt;
&lt;br /&gt;
Generators are similar to iterators that calculate their values on demand, thus potentially using fewer resources. They can be created using the &amp;lt;code&amp;gt;yield&amp;lt;/code&amp;gt; keyword, e.g.:&lt;br /&gt;
&lt;br /&gt;
 function my_generator()&lt;br /&gt;
 {&lt;br /&gt;
   yield 1;&lt;br /&gt;
   yield 2;&lt;br /&gt;
   yield 3;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Generators are forward-only iterators, i.e. you can only request the next value, not the previous, next but one etc. They are useful for iterating sequential data sets such as reading a file line by line (in order).&lt;br /&gt;
&lt;br /&gt;
== Traits ==&lt;br /&gt;
&lt;br /&gt;
Traits are a mix of classes and interfaces. If a class uses a trait, it receives all the methods of that trait (including implementations, unlike with interfaces where the implementation must be provided by each class).&lt;br /&gt;
&lt;br /&gt;
== Autoloading ==&lt;br /&gt;
&lt;br /&gt;
The original mechanism for autoloading was the magic function &amp;lt;code&amp;gt;__autoload()&amp;lt;/code&amp;gt;. This is no longer recommended and is deprecated in PHP 7.x.&lt;br /&gt;
&lt;br /&gt;
The successor to &amp;lt;code&amp;gt;__autoload()&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;spl_autoload_register()&amp;lt;/code&amp;gt;. This in turn has been replaced by PSR-0, then PSR-4. Composer will generate a PSR-4 autoloader for you, though you will still need to map the directories to namespaces (e.g. &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;MyApp\\&amp;lt;/code&amp;gt;). You may need to use &amp;lt;code&amp;gt;spl_autoload_register()&amp;lt;/code&amp;gt; as an intermediate step to transition to PSR-4.&lt;br /&gt;
&lt;br /&gt;
== Built-in web server ==&lt;br /&gt;
&lt;br /&gt;
PHP comes with a built-in web server which is useful for development purposes, although it should never be used in production.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Configuration directives:&#039;&#039;&#039; &amp;lt;code&amp;gt;-c config/php.ini&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Useful dependencies ==&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/nikic/FastRoute FastRoute] - seems to be the most popular routing library by far&lt;br /&gt;
* &amp;lt;code&amp;gt;aura/router&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;league/route&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;aura/filter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;respect/validation&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;symfony/validator&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;mbstring&amp;lt;/code&amp;gt; extension, provides &amp;lt;code&amp;gt;mb_&amp;lt;/code&amp;gt; functions such as &amp;lt;code&amp;gt;mb_strlen&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;filp/whoops&amp;lt;/code&amp;gt; - pretty printing of exceptions and errors&lt;br /&gt;
* &amp;lt;code&amp;gt;monolog/monolog&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;php-di/php-di&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* [https://kevinsmith.io/modern-php-without-a-framework Modern PHP Without a Framework]&lt;br /&gt;
* [https://kevinsmith.io/didnt-you-just-build-your-own-framework Didn&#039;t you just build your own framework?]&lt;br /&gt;
* [https://phpdelusions.net/pdo (The only proper) PDO tutorial]&lt;br /&gt;
* [https://php.hospital/ php.hospital]&lt;br /&gt;
&lt;br /&gt;
[[Category:PHP]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Running_voluntary_organisations&amp;diff=1454</id>
		<title>Running voluntary organisations</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Running_voluntary_organisations&amp;diff=1454"/>
		<updated>2025-04-08T08:59:03Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Notes ==&lt;br /&gt;
&lt;br /&gt;
* A lot of this applies to other organisations, e.g. at work&lt;br /&gt;
* Build teams not people&lt;br /&gt;
* People respond better to a direct personalised approach.&lt;br /&gt;
* Direct personalised email &amp;gt; mail merge &amp;gt; unpersonalised blanket email.&lt;br /&gt;
* Ban Any Other Business on agendas - or at least only allow things that have come up in the last 48 hours (or don&#039;t allow AoB to extend beyond the scheduled end time)&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Running_voluntary_organisations&amp;diff=1453</id>
		<title>Running voluntary organisations</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Running_voluntary_organisations&amp;diff=1453"/>
		<updated>2025-04-08T08:55:04Z</updated>

		<summary type="html">&lt;p&gt;Paul: Created page with &amp;quot;== Notes ==  * A lot of this applies to other organisations, e.g. at work * Build teams not people * People respond better to a direct personalised approach. * Direct personalised email &amp;gt; mail merge &amp;gt; unpersonalised blanket email.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Notes ==&lt;br /&gt;
&lt;br /&gt;
* A lot of this applies to other organisations, e.g. at work&lt;br /&gt;
* Build teams not people&lt;br /&gt;
* People respond better to a direct personalised approach.&lt;br /&gt;
* Direct personalised email &amp;gt; mail merge &amp;gt; unpersonalised blanket email.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Minsc&amp;diff=1452</id>
		<title>Minsc</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Minsc&amp;diff=1452"/>
		<updated>2024-12-28T16:44:35Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Minsc is a Lawful Good Ranger who can be recruited in all three games. With a stength of 18/93 and a reasonable constitution, he makes a good frontline melee fighter. Although he will refuse to be in the same party as Edwin, he gets along with other party members and has some amusing dialogue options.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
Minsc can be found in Nashkel, where is he looking for a band of adventurers to help him rescue [[Dynaheir]]. Once recruited, you must rescue Dynaheir within a certain time limit, otherwise Minsc will leave the party. It is possible to recruit Minsc after rescuing Dynaheir, but if you talk to Minsc after recruiting Dynaheir and refuse to recruit him, Dynaheir will leave.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
Minsc and Dynaheir can be recruited as part of the initial search through the city.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Minsc can found near your cell at the beginning of the game. Dynaheir does not appear in BG2 so there is no requirement to recruit her in order to keep Minsc in your party.&lt;br /&gt;
&lt;br /&gt;
Minsc does not have a side quest in BG2, but there is one quest which he will insist you start once you have been made aware of it. However, there is no time limit on completing the quest.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Neera&amp;diff=1451</id>
		<title>Neera</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Neera&amp;diff=1451"/>
		<updated>2024-12-28T16:39:53Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Neera is a Chaotic Neutral Wild Mage who can be recruited in all three games. She&#039;s a powerful spellcaster, but the random effects of her magic may be too much for some players.&lt;br /&gt;
&lt;br /&gt;
In all games Neera will come into conflict with Edwin Odesseiron, and you cannot keep both characters in your party simultaneously for long.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
Neera can be found in Beregost early in the game. If you recruit her, after a while she will open up a side quest.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
Neera is recruitable part way through the game.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
You will meet Neera early in the game if you visit the Bridge District. However, she will teleport away before you have chance to speak to her. She will appear again when you move between locations and ask you to meet her at a location which she will mark on your map. You can only recruit her if you go to this location and accept her side quest.&lt;br /&gt;
&lt;br /&gt;
== Romance ==&lt;br /&gt;
&lt;br /&gt;
If your character is male, he can enter into a romance with Neera. Romance options are available in all three games and are largely independent - you can romance Neera in BG2 even if she wasn&#039;t in your party in BG1.&lt;br /&gt;
&lt;br /&gt;
Without giving too much away, the guide to successfully romancing Neera is to flirt outrageously with her and generally act confident, as she will draw strength from this. Oh, and don&#039;t say anything bad about wild mages! Do not expect much romance in BG1 though, you can easily exhaust all the dialogue options by the end of chapter 2.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Imoen&amp;diff=1450</id>
		<title>Imoen</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Imoen&amp;diff=1450"/>
		<updated>2024-12-28T15:18:50Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Imoen is a Thief who can be recruited in BG1, and a dual-classed Mage/Thief who can be recruited in BG2. Due to her childhood friendship she is totally loyal to the main character, and will not pick a fight (though she may trade words) with other companions.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
Imoen will approach you automatically at the start of chapter 1 and offer to join you. Given that you need a thief and she is also quite good with a shortbow, you should accept her invitation without question.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
For plot reasons that will become apparent early in the game, you will not be able to recruit Imoen in Siege of Dragonspear.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Imoen will approach you automatically at the start of chapter 1 and offer to join you. As in BG1, you&#039;ll need a thief and Imoen can now cast spells as she has dual-classed to a mage (she retains her thief skills from the start of the game). You&#039;d be a fool to turn her down at this point, even if you intend to replace her later.&lt;br /&gt;
&lt;br /&gt;
Due to the requirement for a thief and at least one magic user, you&#039;ll probably want to keep Imoen in the party for the whole game. She gets on with other companions, doesn&#039;t have any sidequests to distract you whilst she is a member of the party, doesn&#039;t cause any romance problems and is the easiest companion to manage. She becomes a powerful mage towards the end of the game, though in SoA you will need to increase her intelligence by one point in order for her to learn 9th level spells (taking a potion and then learning the spells are sufficient, as the intelligence requirement only applies to the learning process).&lt;br /&gt;
&lt;br /&gt;
== Romance ==&lt;br /&gt;
&lt;br /&gt;
By default, there are no options to romance Imoen in any of the games. However, the [http://www.imoen.blindmonkey.org/ Imoen Romance Modification] does allow your character, of either gender, to enter into a romance in Baldur&#039;s Gate 2. Even if you don&#039;t want to follow up on the romance options, the modification gives you some additional dialogue.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Romances&amp;diff=1449</id>
		<title>Romances</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Romances&amp;diff=1449"/>
		<updated>2024-12-28T15:18:30Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In all three [[Baldur&#039;s Gate]] games, it is possible for your character to enter into a romance with one of your companions, subject to meeting the relevant gender and race criteria (most romanceable companions are heterosexual, and most have restrictions on which races they will romance).&lt;br /&gt;
&lt;br /&gt;
Whilst initially you can start romances with multiple companions, eventually you will forced to decide between them, though you can usually retain the rejected companion in your party with no penalties.&lt;br /&gt;
&lt;br /&gt;
Some romance dialogues will only occur under certain conditions, for example when resting outside or entering a tavern. If it&#039;s been a long time since the last dialogue, try resting outside. Romances are usually on hold when you&#039;re in a dungeon, so don&#039;t expect any dialogues until you emerge. Also, romance timers are generally based on real time, not game time, so travelling long distances or resting will not usually accelerate the process. In Siege of Dragonspear, every &#039;love talk&#039; (as individual romance dialogues are called) only occurs at certain points in the game, so there is no way to accelerate the process.&lt;br /&gt;
&lt;br /&gt;
It&#039;s also possible to &#039;break off&#039; a romance if you choose the &#039;wrong&#039; dialogue option. Usually this is obvious - don&#039;t say you don&#039;t have time to talk when the other character initiates dialogue and generally say nice things about them - but in one or two cases it&#039;s possible to end a romance despite saying what you might think is the &#039;right&#039; thing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mods:&#039;&#039;&#039; Installing modifications expands the number of available romances, for example you have the option to romance [[Imoen]]. There are mods which allow you to pursue multiple romances to their conclusion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
The only romanceable companions in BG1 are the ones added by the Enhanced Edition, i.e. [[Rasaad]], [[Neera]] and [[Dorn]]. The romances are fairly short - it&#039;s possible to finish Neera&#039;s before the end of chapter 3 for example - so don&#039;t be surprised if you get as far as a quick kiss and then hear nothing else for the rest of the game.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
Although the shortest game, there are still a number of romances available. Romanceable companions are Safana (m), [[Viconia]] (m), Dorn (m/f), Neera (m), Corwin (m/f), Voghiln (f), Glint (m) and Rasaad (f).&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
The second game allows longer and more in-depth romances which can lead to rewarding endings.&lt;br /&gt;
&lt;br /&gt;
Although Shadow&#039;s of Arm and Throne of Bhaal are linked, they are treated as separate games for the purposes of romances. As a result, it&#039;s possible to reach the end point of a romance in SoA well before the end of the game, and there will be no further interactions until ToB. However, when you proceed to ToB the romance will continue where it left off and there will be additional dialogue options and, if you choose the right options, a final resolution to the romance.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Romances&amp;diff=1448</id>
		<title>Romances</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Romances&amp;diff=1448"/>
		<updated>2024-12-28T15:18:02Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In all three [[Baldur&#039;s Gate]] games, it is possible for your character to enter into a romance with one of your companions, subject to meeting the relevant gender and race criteria (most romanceable companions are heterosexual, and most have restrictions on which races they will romance).&lt;br /&gt;
&lt;br /&gt;
Whilst initially you can start romances with multiple companions, eventually you will forced to decide between them, though you can usually retain the rejected companion in your party with no penalties. There are also mods available which allow you to continue multiple romances simultaneously.&lt;br /&gt;
&lt;br /&gt;
Some romance dialogues will only occur under certain conditions, for example when resting outside or entering a tavern. If it&#039;s been a long time since the last dialogue, try resting outside. Romances are usually on hold when you&#039;re in a dungeon, so don&#039;t expect any dialogues until you emerge. Also, romance timers are generally based on real time, not game time, so travelling long distances or resting will not usually accelerate the process. In Siege of Dragonspear, every &#039;love talk&#039; (as individual romance dialogues are called) only occurs at certain points in the game, so there is no way to accelerate the process.&lt;br /&gt;
&lt;br /&gt;
It&#039;s also possible to &#039;break off&#039; a romance if you choose the &#039;wrong&#039; dialogue option. Usually this is obvious - don&#039;t say you don&#039;t have time to talk when the other character initiates dialogue and generally say nice things about them - but in one or two cases it&#039;s possible to end a romance despite saying what you might think is the &#039;right&#039; thing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mods:&#039;&#039;&#039; Installing modifications expands the number of available romances, for example you have the option to romance [[Imoen]]. There are mods which allow you to pursue multiple romances to their conclusion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
The only romanceable companions in BG1 are the ones added by the Enhanced Edition, i.e. [[Rasaad]], [[Neera]] and [[Dorn]]. The romances are fairly short - it&#039;s possible to finish Neera&#039;s before the end of chapter 3 for example - so don&#039;t be surprised if you get as far as a quick kiss and then hear nothing else for the rest of the game.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
Although the shortest game, there are still a number of romances available. Romanceable companions are Safana (m), [[Viconia]] (m), Dorn (m/f), Neera (m), Corwin (m/f), Voghiln (f), Glint (m) and Rasaad (f).&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
The second game allows longer and more in-depth romances which can lead to rewarding endings.&lt;br /&gt;
&lt;br /&gt;
Although Shadow&#039;s of Arm and Throne of Bhaal are linked, they are treated as separate games for the purposes of romances. As a result, it&#039;s possible to reach the end point of a romance in SoA well before the end of the game, and there will be no further interactions until ToB. However, when you proceed to ToB the romance will continue where it left off and there will be additional dialogue options and, if you choose the right options, a final resolution to the romance.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Anomen&amp;diff=1447</id>
		<title>Anomen</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Anomen&amp;diff=1447"/>
		<updated>2024-12-28T15:17:19Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anomen is a Lawful Neutral Fighter/Cleric (dual-class) who can be recruited in BG2.&lt;br /&gt;
&lt;br /&gt;
Due to his initial class being a fighter, Anomen can place up to five proficiency points in most weapon styles, which gives him substantial bonuses to hit and damage. He is also a powerful cleric, and as such can be used either as a front-line melee fighter or a defensive healer. Eventually he reaches a level where Turn Undead will destroy pretty much any undead enemy you come across. As a result, he&#039;s an ideal candidate for a good or neutral party, and I have used him in nearly every playthrough.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Anomen can be recruited at the Copper Coronet from chapter 2 onwards. He will initiate dialogue when you walk past him and will offer to join if you say you are courageous and a force for righteousness.&lt;br /&gt;
&lt;br /&gt;
Anomen has a very short side-quest which begins soon after you recruit him and decides whether he later becomes a knight or not. Whichever way the quest is resolved, Anomen&#039;s alignment and statistics will change. Without giving too much away, it&#039;s better for the party if he becomes a knight.&lt;br /&gt;
&lt;br /&gt;
Whilst he can be somewhat annoying and arrogant, Anomen does not have any major conflicts with other good or neutral companions, and can even get along with Viconia. He will object and possibly leave the party altogether if your reputation falls too low or you take an evil course of action when presented with several choices.&lt;br /&gt;
&lt;br /&gt;
=== Romance ===&lt;br /&gt;
&lt;br /&gt;
If your character is female and human, elven, half-elven or hafling, she can enter into a [[Romances|romance]] with Anomen.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Anomen&amp;diff=1446</id>
		<title>Anomen</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Anomen&amp;diff=1446"/>
		<updated>2024-12-28T15:16:31Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Baldur&amp;#039;s Gate 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anomen is a Lawful Neutral Fighter/Cleric (dual-class) who can be recruited in BG2.&lt;br /&gt;
&lt;br /&gt;
Due to his initial class being a fighter, Anomen can place up to five proficiency points in most weapon styles, which gives him substantial bonuses to hit and damage. He is also a powerful cleric, and as such can be used either as a front-line melee fighter or a defensive healer. As a result, he&#039;s an ideal candidate for a good or neutral party, and I have used him in nearly every playthrough.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Anomen can be recruited at the Copper Coronet from chapter 2 onwards. He will initiate dialogue when you walk past him and will offer to join if you say you are courageous and a force for righteousness.&lt;br /&gt;
&lt;br /&gt;
Anomen has a very short side-quest which begins soon after you recruit him and decides whether he later becomes a knight or not. Whichever way the quest is resolved, Anomen&#039;s alignment and statistics will change. Without giving too much away, it&#039;s better for the party if he becomes a knight.&lt;br /&gt;
&lt;br /&gt;
Whilst he can be somewhat annoying and arrogant, Anomen does not have any major conflicts with other good or neutral companions, and can even get along with Viconia. He will object and possibly leave the party altogether if your reputation falls too low or you take an evil course of action when presented with several choices.&lt;br /&gt;
&lt;br /&gt;
=== Romance ===&lt;br /&gt;
&lt;br /&gt;
If your character is female and human, elven, half-elven or hafling, she can enter into a [[Romances|romance]] with Anomen.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Anomen&amp;diff=1445</id>
		<title>Anomen</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Anomen&amp;diff=1445"/>
		<updated>2024-12-28T15:16:08Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Anomen is a Lawful Neutral Fighter/Cleric (dual-class) who can be recruited in BG2.&lt;br /&gt;
&lt;br /&gt;
Due to his initial class being a fighter, Anomen can place up to five proficiency points in most weapon styles, which gives him substantial bonuses to hit and damage. He is also a powerful cleric, and as such can be used either as a front-line melee fighter or a defensive healer. As a result, he&#039;s an ideal candidate for a good or neutral party, and I have used him in nearly every playthrough.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Anomen can be recruited at the Copper Coronet from chapter 2 onwards. He will initiate dialogue when you walk past him and will offer to join if you say you are courageous and a force for righteousness.&lt;br /&gt;
&lt;br /&gt;
Anomen has a very short side-quest which begins soon after you recruit him and decides whether he later becomes a knight or not. Whichever way the quest is resolved, Anomen&#039;s alignment and statistics will change. Without giving too much away, it&#039;s better for the party if he becomes a knight.&lt;br /&gt;
&lt;br /&gt;
Whilst he can be somewhat annoying and arrogant, Anomen does not have any major conflicts with other good or neutral companions, and can even get along with Viconia. He will object and possibly leave the party altogether if your reputation falls too low or you take an evil course of action when presented with several choices.&lt;br /&gt;
Romance&lt;br /&gt;
&lt;br /&gt;
If your character is female and human, elven, half-elven or hafling, she can enter into a [[Romances|romance]] with Anomen.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Aerie&amp;diff=1444</id>
		<title>Aerie</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Aerie&amp;diff=1444"/>
		<updated>2024-12-28T15:15:50Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Aerie is a Lawful Good Cleric/Mage (technically an illegal class combination for an Elf) who can be recruited in BG2. With the ability to cast the majority of spells available within the game, she makes a good addition to a party which would otherwise be low on healing and offensive magic.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 1 ==&lt;br /&gt;
&lt;br /&gt;
Aerie does not appear in BG1.&lt;br /&gt;
&lt;br /&gt;
== Siege of Dragonspear ==&lt;br /&gt;
&lt;br /&gt;
Aerie does not appear in SoD.&lt;br /&gt;
&lt;br /&gt;
== Baldur&#039;s Gate 2 ==&lt;br /&gt;
&lt;br /&gt;
Aerie can be found in the circus at the beginning of chapter 2. She will offer to join your party and has no side quests of her own, though recruiting her will potentially lead to a quest from another NPC. She gets on with most good and neutral companions, although sometimes they may tire a little of her complaints (especially Jaheira). Do not keep her in a party with evil companions, as they are likely to say something which upsets her and then you will have to choose between them.&lt;br /&gt;
&lt;br /&gt;
=== Romance ===&lt;br /&gt;
&lt;br /&gt;
If your character is male and elven, half-elven, human or gnome, he can enter into a romance with Aerie. The romance dialogues start soon after you recruit her, and move on quite quickly (unlike Jaheira&#039;s romance, which is slow and drawn out).&lt;br /&gt;
&lt;br /&gt;
The key to romancing Aerie is to listen carefully to what she says, and sympathise over the loss of her wings. Do not push things too quickly or flirt as she wants to take things at an almost glacial pace, particularly in comparison with other companions. Basically you have to act as her protector more than her lover until quite late on in the game.&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Category:Baldur%27s_Gate_II&amp;diff=1443</id>
		<title>Category:Baldur&#039;s Gate II</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Category:Baldur%27s_Gate_II&amp;diff=1443"/>
		<updated>2024-12-28T15:15:28Z</updated>

		<summary type="html">&lt;p&gt;Paul: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Sheena,_a_Half_Dragon_Tale&amp;diff=1442</id>
		<title>Sheena, a Half Dragon Tale</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Sheena,_a_Half_Dragon_Tale&amp;diff=1442"/>
		<updated>2024-12-28T15:15:19Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sheena is an optional NPC added by a modification to Baldur&#039;s Gate II (SoA and ToB).&lt;br /&gt;
&lt;br /&gt;
== Stats ==&lt;br /&gt;
&lt;br /&gt;
Human form:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Strength:&#039;&#039;&#039; 16&lt;br /&gt;
* &#039;&#039;&#039;Dexterity:&#039;&#039;&#039; 12&lt;br /&gt;
* &#039;&#039;&#039;Constitution:&#039;&#039;&#039; 16&lt;br /&gt;
* &#039;&#039;&#039;Intelligence:&#039;&#039;&#039; 15&lt;br /&gt;
* &#039;&#039;&#039;Wisdom:&#039;&#039;&#039; 10&lt;br /&gt;
* &#039;&#039;&#039;Charisma:&#039;&#039;&#039; 15&lt;br /&gt;
&lt;br /&gt;
Dragon form:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Strength:&#039;&#039;&#039; 20&lt;br /&gt;
* &#039;&#039;&#039;Dexterity:&#039;&#039;&#039; 12&lt;br /&gt;
* &#039;&#039;&#039;Constitution:&#039;&#039;&#039; 18&lt;br /&gt;
* &#039;&#039;&#039;Intelligence:&#039;&#039;&#039; 15&lt;br /&gt;
* &#039;&#039;&#039;Wisdom:&#039;&#039;&#039; 10&lt;br /&gt;
* &#039;&#039;&#039;Charisma:&#039;&#039;&#039; 15&lt;br /&gt;
&lt;br /&gt;
== Recruitment ==&lt;br /&gt;
&lt;br /&gt;
Sheena can be recruited by opening the left cell above Firkraag&#039;s lair. The only way to open this cell is by killing Firkraag and collecting the key left on his body, which makes it difficult for low-level parties to recruit Sheena.&lt;br /&gt;
&lt;br /&gt;
Although a half-dragon, she is implemented as a Fighter/Mage, and therefore can wear any armour (but cannot cast spells unless it is Elven Chain Mail). The only exception is that if you forge armour from the scales of Firkraag, she will remove it immediately after being equipped and will return it to the PC&#039;s inventory (she does not object to the armour being forged, nor it being worn by other companions).&lt;br /&gt;
&lt;br /&gt;
== Strategy ==&lt;br /&gt;
&lt;br /&gt;
Sheena doesn&#039;t have particularly good stats, but she is fine as a second-line fighter (helped by the reach of two-handed weapons). Her dragon form adds 4 to strength, though there are plenty of strength-boosting items in SoA so this isn&#039;t a huge advantage, and it can only be used in certain locations.&lt;br /&gt;
&lt;br /&gt;
Sheena comes equipped with a two-handed sword with +3 to hit, which also does fire damage. This can be particularly useful when taking on trolls.&lt;br /&gt;
&lt;br /&gt;
== Romance ==&lt;br /&gt;
&lt;br /&gt;
Sheena can enter into a romance if the PC is male (any race) and of good or neutral alignment. Once the romance is complete, you can initiate &#039;flirt talks&#039; by having your PC start a dialogue with Sheena.&lt;br /&gt;
&lt;br /&gt;
== Interactions ==&lt;br /&gt;
&lt;br /&gt;
Sheena will interact with other NPCs in your party:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Keldorn:&#039;&#039;&#039; Angry words about humans attacking dragons, and dragons being evil (bit unfair, given how Keldorn respects a good dragon met in the Underdark).&lt;br /&gt;
&lt;br /&gt;
[[Category:Baldur&#039;s Gate II]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1441</id>
		<title>Geek Walks</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1441"/>
		<updated>2024-12-27T17:02:50Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Trips during poor weather */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.geekwalks.co.uk Geek Walks] is a monthly social event run by [[User:Paul|Paul]].&lt;br /&gt;
&lt;br /&gt;
Basic idea: Get the train to somewhere nice, go for a walk followed by pub lunch.&lt;br /&gt;
&lt;br /&gt;
Future idea: Geek Run? Some people run whilst the others walk. May be better as a separate event.&lt;br /&gt;
&lt;br /&gt;
== Trips during poor weather ==&lt;br /&gt;
&lt;br /&gt;
* Eureka! - Right next to Halifax station&lt;br /&gt;
* Imperial War Museum North - Has its own Metrolink stop&lt;br /&gt;
* York - National Railway Museum&lt;br /&gt;
* Birkenhead - http://www.u-boatstory.co.uk/&lt;br /&gt;
* National Media Museum - Bradford&lt;br /&gt;
* [http://www.enginemuseum.org/ Anson Engine Museum] - near Poynton station, pub recommendation is Bull&#039;s Head&lt;br /&gt;
* [https://www.nmes.org Northern Mill Engine Society] - Bolton&lt;br /&gt;
* [https://www.avroheritagemuseum.co.uk/ Avro Heritage Museum]&lt;br /&gt;
* Lancaster - Castle and Police Museum&lt;br /&gt;
* Sheffield - [https://www.visitmagna.co.uk/ Magna Science]&lt;br /&gt;
* Macclesfield - Silk Museum and Bollington Brewery Tap Room&lt;br /&gt;
* St Helens - [https://en.wikipedia.org/wiki/World_of_Glass,_St_Helens World of Glass]&lt;br /&gt;
&lt;br /&gt;
== Potential walks ==&lt;br /&gt;
&lt;br /&gt;
* [https://thetolkientrail.com/ The Tolkien Trail] - Clitheroe&lt;br /&gt;
* Marple - [https://www.marple.website/community-projects/mellor-cross-appeal.html Marple Cross], lunch at [http://devonshirearmsmellor.co.uk/ Devonshire Arms] or [https://www.thenorfolkarms.co.uk/ The Norfolk Arms]&lt;br /&gt;
* Anderton - [https://canalrivertrust.org.uk/places-to-visit/anderton-boat-lift-visitor-centre Anderton Boat Life], 2 miles from Northwich station, 1tph&lt;br /&gt;
* Halifax - [https://www.telegraph.co.uk/travel/destinations/europe/united-kingdom/articles/halifax-yorkshire-what-to-see-and-do/ The &#039;Shoreditch of the North&#039;]&lt;br /&gt;
* Buxton and stations en-route&lt;br /&gt;
* Healey Dell - Near Rochdale&lt;br /&gt;
* Lancaster - 57m on the train, places to walk, plus castle&lt;br /&gt;
* Hathersage - train station is in the centre, 56m&lt;br /&gt;
* New Mills - 26m on the train&lt;br /&gt;
* Blackpool - walk along the promenade, beaches etc.&lt;br /&gt;
* Southport - British Lawnmower Museum might be amusing&lt;br /&gt;
* Clitheroe - Sculpture trail&lt;br /&gt;
* Appley Bridge -&lt;br /&gt;
* Lea Green&lt;br /&gt;
* Delamere Forest - 1h09m on the train, 1tph&lt;br /&gt;
* Ramsbottom - Metrolink followed by steam train (expensive, could go on the bus instead)&lt;br /&gt;
* Barton Swing Aqueduct&lt;br /&gt;
* Preston - route taken for after Northern Gathering, The Continental seems to be the pub&lt;br /&gt;
* Hebden Bridge - 30-40m train, 3tph&lt;br /&gt;
* Entwistle - Wayoh reservoir - http://www.thestrawburyduck.co.uk/&lt;br /&gt;
* Edale&lt;br /&gt;
* Castleton (not Rochdale)&lt;br /&gt;
* Bamford Reservoir&lt;br /&gt;
* Heaton Park - not sure where is good for lunch - Woodthorpe Hotel?&lt;br /&gt;
* [https://canalrivertrust.org.uk/places-to-visit/standedge-tunnel-and-visitor-centre Standedge Tunnel and Visitor Centre]&lt;br /&gt;
* 535 to Wilton Arms outside of Bolton&lt;br /&gt;
* [https://www.manchestereveningnews.co.uk/whats-on/food-drink-news/country-walks-near-greater-manchester-26845338 Country walks near Greater Manchester]&lt;br /&gt;
&lt;br /&gt;
== Longer excursions ==&lt;br /&gt;
&lt;br /&gt;
* Llandudno&lt;br /&gt;
* Canal boat trip&lt;br /&gt;
* York (doable in a day but could also be a weekend trip)&lt;br /&gt;
* Bletchley Park and National Computing Museum&lt;br /&gt;
* Cambridge&lt;br /&gt;
* Oxford&lt;br /&gt;
&lt;br /&gt;
=== Overseas ===&lt;br /&gt;
&lt;br /&gt;
* Wrocław (Poland)&lt;br /&gt;
&lt;br /&gt;
== Ruled out ==&lt;br /&gt;
&lt;br /&gt;
* Widnes - never again! We were told by a helpful local that the pub we had intended to go into for lunch was not suitable for visitors...&lt;br /&gt;
* Skipton - too far&lt;br /&gt;
* Pendle - Colne (railway station) - too far (2h+)&lt;br /&gt;
* Lytham St Annes - bit too far (1h30m, 1 change)&lt;br /&gt;
* Ribchester - Langho station, 1h2m, 1tph - bit too far from the station&lt;br /&gt;
&lt;br /&gt;
[[Category:Socials]]&lt;br /&gt;
[[Category:Events]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Baldur%27s_Gate_II&amp;diff=1440</id>
		<title>Baldur&#039;s Gate II</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Baldur%27s_Gate_II&amp;diff=1440"/>
		<updated>2024-12-24T12:47:48Z</updated>

		<summary type="html">&lt;p&gt;Paul: Created blank page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Baldur%27s_Gate&amp;diff=1439</id>
		<title>Baldur&#039;s Gate</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Baldur%27s_Gate&amp;diff=1439"/>
		<updated>2024-12-24T12:47:41Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Baldur&#039;s Gate is a series of three computer games produced by Beamdog:&lt;br /&gt;
&lt;br /&gt;
* [[Baldur&#039;s Gate 1]] (BG1), with the Tales of the Sword Coast expansion.&lt;br /&gt;
* Siege of Dragonspear (SoD).&lt;br /&gt;
* [[Baldur&#039;s Gate II]] (BG2), with the Throne of Bhaal expansion.&lt;br /&gt;
&lt;br /&gt;
The Enhanced Editions of the games come with their relevant expansion packs. You should always play the Enhanced Editions if possible, as they fix a number of bugs which could cause major issues in the original games - including ones which would prevent you from completing quests. They also have native clients for Linux and macOS.&lt;br /&gt;
&lt;br /&gt;
[[Category:Computer Games]]&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Baldur%27s_Gate&amp;diff=1438</id>
		<title>Baldur&#039;s Gate</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Baldur%27s_Gate&amp;diff=1438"/>
		<updated>2024-11-27T13:07:32Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Baldur&#039;s Gate is a series of three computer games produced by Beamdog:&lt;br /&gt;
&lt;br /&gt;
* [[Baldur&#039;s Gate 1]] (BG1), with the Tales of the Sword Coast expansion.&lt;br /&gt;
* Siege of Dragonspear (SoD).&lt;br /&gt;
* Baldur&#039;s Gate II (BG2), with the Throne of Bhaal expansion.&lt;br /&gt;
&lt;br /&gt;
The Enhanced Editions of the games come with their relevant expansion packs. You should always play the Enhanced Editions if possible, as they fix a number of bugs which could cause major issues in the original games - including ones which would prevent you from completing quests. They also have native clients for Linux and macOS.&lt;br /&gt;
&lt;br /&gt;
[[Category:Computer Games]]&lt;br /&gt;
[[Category:Baldur&#039;s Gate]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1437</id>
		<title>Geek Walks</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1437"/>
		<updated>2024-11-08T16:01:27Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Trips during poor weather */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.geekwalks.co.uk Geek Walks] is a monthly social event run by [[User:Paul|Paul]].&lt;br /&gt;
&lt;br /&gt;
Basic idea: Get the train to somewhere nice, go for a walk followed by pub lunch.&lt;br /&gt;
&lt;br /&gt;
Future idea: Geek Run? Some people run whilst the others walk. May be better as a separate event.&lt;br /&gt;
&lt;br /&gt;
== Trips during poor weather ==&lt;br /&gt;
&lt;br /&gt;
* Eureka! - Right next to Halifax station&lt;br /&gt;
* Imperial War Museum North - Has its own Metrolink stop&lt;br /&gt;
* York - National Railway Museum&lt;br /&gt;
* Birkenhead - http://www.u-boatstory.co.uk/&lt;br /&gt;
* National Media Museum - Bradford&lt;br /&gt;
* [http://www.enginemuseum.org/ Anson Engine Museum] - near Poynton station, pub recommendation is Bull&#039;s Head&lt;br /&gt;
* [https://www.nmes.org Northern Mill Engine Society] - Bolton&lt;br /&gt;
* [https://www.avroheritagemuseum.co.uk/ Avro Heritage Museum]&lt;br /&gt;
* Lancaster - Castle and Police Museum&lt;br /&gt;
* Sheffield - [https://www.visitmagna.co.uk/ Magna Science]&lt;br /&gt;
* Macclesfield - Silk Museum and Bollington Brewery Tap Room&lt;br /&gt;
&lt;br /&gt;
== Potential walks ==&lt;br /&gt;
&lt;br /&gt;
* [https://thetolkientrail.com/ The Tolkien Trail] - Clitheroe&lt;br /&gt;
* Marple - [https://www.marple.website/community-projects/mellor-cross-appeal.html Marple Cross], lunch at [http://devonshirearmsmellor.co.uk/ Devonshire Arms] or [https://www.thenorfolkarms.co.uk/ The Norfolk Arms]&lt;br /&gt;
* Anderton - [https://canalrivertrust.org.uk/places-to-visit/anderton-boat-lift-visitor-centre Anderton Boat Life], 2 miles from Northwich station, 1tph&lt;br /&gt;
* Halifax - [https://www.telegraph.co.uk/travel/destinations/europe/united-kingdom/articles/halifax-yorkshire-what-to-see-and-do/ The &#039;Shoreditch of the North&#039;]&lt;br /&gt;
* Buxton and stations en-route&lt;br /&gt;
* Healey Dell - Near Rochdale&lt;br /&gt;
* Lancaster - 57m on the train, places to walk, plus castle&lt;br /&gt;
* Hathersage - train station is in the centre, 56m&lt;br /&gt;
* New Mills - 26m on the train&lt;br /&gt;
* Blackpool - walk along the promenade, beaches etc.&lt;br /&gt;
* Southport - British Lawnmower Museum might be amusing&lt;br /&gt;
* Clitheroe - Sculpture trail&lt;br /&gt;
* Appley Bridge -&lt;br /&gt;
* Lea Green&lt;br /&gt;
* Delamere Forest - 1h09m on the train, 1tph&lt;br /&gt;
* Ramsbottom - Metrolink followed by steam train (expensive, could go on the bus instead)&lt;br /&gt;
* Barton Swing Aqueduct&lt;br /&gt;
* Preston - route taken for after Northern Gathering, The Continental seems to be the pub&lt;br /&gt;
* Hebden Bridge - 30-40m train, 3tph&lt;br /&gt;
* Entwistle - Wayoh reservoir - http://www.thestrawburyduck.co.uk/&lt;br /&gt;
* Edale&lt;br /&gt;
* Castleton (not Rochdale)&lt;br /&gt;
* Bamford Reservoir&lt;br /&gt;
* Heaton Park - not sure where is good for lunch - Woodthorpe Hotel?&lt;br /&gt;
* [https://canalrivertrust.org.uk/places-to-visit/standedge-tunnel-and-visitor-centre Standedge Tunnel and Visitor Centre]&lt;br /&gt;
* 535 to Wilton Arms outside of Bolton&lt;br /&gt;
* [https://www.manchestereveningnews.co.uk/whats-on/food-drink-news/country-walks-near-greater-manchester-26845338 Country walks near Greater Manchester]&lt;br /&gt;
&lt;br /&gt;
== Longer excursions ==&lt;br /&gt;
&lt;br /&gt;
* Llandudno&lt;br /&gt;
* Canal boat trip&lt;br /&gt;
* York (doable in a day but could also be a weekend trip)&lt;br /&gt;
* Bletchley Park and National Computing Museum&lt;br /&gt;
* Cambridge&lt;br /&gt;
* Oxford&lt;br /&gt;
&lt;br /&gt;
=== Overseas ===&lt;br /&gt;
&lt;br /&gt;
* Wrocław (Poland)&lt;br /&gt;
&lt;br /&gt;
== Ruled out ==&lt;br /&gt;
&lt;br /&gt;
* Widnes - never again! We were told by a helpful local that the pub we had intended to go into for lunch was not suitable for visitors...&lt;br /&gt;
* Skipton - too far&lt;br /&gt;
* Pendle - Colne (railway station) - too far (2h+)&lt;br /&gt;
* Lytham St Annes - bit too far (1h30m, 1 change)&lt;br /&gt;
* Ribchester - Langho station, 1h2m, 1tph - bit too far from the station&lt;br /&gt;
&lt;br /&gt;
[[Category:Socials]]&lt;br /&gt;
[[Category:Events]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1436</id>
		<title>Geek Walks</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Geek_Walks&amp;diff=1436"/>
		<updated>2024-10-11T11:54:04Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Potential walks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://www.geekwalks.co.uk Geek Walks] is a monthly social event run by [[User:Paul|Paul]].&lt;br /&gt;
&lt;br /&gt;
Basic idea: Get the train to somewhere nice, go for a walk followed by pub lunch.&lt;br /&gt;
&lt;br /&gt;
Future idea: Geek Run? Some people run whilst the others walk. May be better as a separate event.&lt;br /&gt;
&lt;br /&gt;
== Trips during poor weather ==&lt;br /&gt;
&lt;br /&gt;
* Eureka! - Right next to Halifax station&lt;br /&gt;
* Imperial War Museum North - Has its own Metrolink stop&lt;br /&gt;
* York - National Railway Museum&lt;br /&gt;
* Birkenhead - http://www.u-boatstory.co.uk/&lt;br /&gt;
* National Media Museum - Bradford&lt;br /&gt;
* [http://www.enginemuseum.org/ Anson Engine Museum] - near Poynton station, pub recommendation is Bull&#039;s Head&lt;br /&gt;
* [https://www.nmes.org Northern Mill Engine Society] - Bolton&lt;br /&gt;
* [https://www.avroheritagemuseum.co.uk/ Avro Heritage Museum]&lt;br /&gt;
* Lancaster - Castle and Police Museum&lt;br /&gt;
* Sheffield - [https://www.visitmagna.co.uk/ Magna Science]&lt;br /&gt;
&lt;br /&gt;
== Potential walks ==&lt;br /&gt;
&lt;br /&gt;
* [https://thetolkientrail.com/ The Tolkien Trail] - Clitheroe&lt;br /&gt;
* Marple - [https://www.marple.website/community-projects/mellor-cross-appeal.html Marple Cross], lunch at [http://devonshirearmsmellor.co.uk/ Devonshire Arms] or [https://www.thenorfolkarms.co.uk/ The Norfolk Arms]&lt;br /&gt;
* Anderton - [https://canalrivertrust.org.uk/places-to-visit/anderton-boat-lift-visitor-centre Anderton Boat Life], 2 miles from Northwich station, 1tph&lt;br /&gt;
* Halifax - [https://www.telegraph.co.uk/travel/destinations/europe/united-kingdom/articles/halifax-yorkshire-what-to-see-and-do/ The &#039;Shoreditch of the North&#039;]&lt;br /&gt;
* Buxton and stations en-route&lt;br /&gt;
* Healey Dell - Near Rochdale&lt;br /&gt;
* Lancaster - 57m on the train, places to walk, plus castle&lt;br /&gt;
* Hathersage - train station is in the centre, 56m&lt;br /&gt;
* New Mills - 26m on the train&lt;br /&gt;
* Blackpool - walk along the promenade, beaches etc.&lt;br /&gt;
* Southport - British Lawnmower Museum might be amusing&lt;br /&gt;
* Clitheroe - Sculpture trail&lt;br /&gt;
* Appley Bridge -&lt;br /&gt;
* Lea Green&lt;br /&gt;
* Delamere Forest - 1h09m on the train, 1tph&lt;br /&gt;
* Ramsbottom - Metrolink followed by steam train (expensive, could go on the bus instead)&lt;br /&gt;
* Barton Swing Aqueduct&lt;br /&gt;
* Preston - route taken for after Northern Gathering, The Continental seems to be the pub&lt;br /&gt;
* Hebden Bridge - 30-40m train, 3tph&lt;br /&gt;
* Entwistle - Wayoh reservoir - http://www.thestrawburyduck.co.uk/&lt;br /&gt;
* Edale&lt;br /&gt;
* Castleton (not Rochdale)&lt;br /&gt;
* Bamford Reservoir&lt;br /&gt;
* Heaton Park - not sure where is good for lunch - Woodthorpe Hotel?&lt;br /&gt;
* [https://canalrivertrust.org.uk/places-to-visit/standedge-tunnel-and-visitor-centre Standedge Tunnel and Visitor Centre]&lt;br /&gt;
* 535 to Wilton Arms outside of Bolton&lt;br /&gt;
* [https://www.manchestereveningnews.co.uk/whats-on/food-drink-news/country-walks-near-greater-manchester-26845338 Country walks near Greater Manchester]&lt;br /&gt;
&lt;br /&gt;
== Longer excursions ==&lt;br /&gt;
&lt;br /&gt;
* Llandudno&lt;br /&gt;
* Canal boat trip&lt;br /&gt;
* York (doable in a day but could also be a weekend trip)&lt;br /&gt;
* Bletchley Park and National Computing Museum&lt;br /&gt;
* Cambridge&lt;br /&gt;
* Oxford&lt;br /&gt;
&lt;br /&gt;
=== Overseas ===&lt;br /&gt;
&lt;br /&gt;
* Wrocław (Poland)&lt;br /&gt;
&lt;br /&gt;
== Ruled out ==&lt;br /&gt;
&lt;br /&gt;
* Widnes - never again! We were told by a helpful local that the pub we had intended to go into for lunch was not suitable for visitors...&lt;br /&gt;
* Skipton - too far&lt;br /&gt;
* Pendle - Colne (railway station) - too far (2h+)&lt;br /&gt;
* Lytham St Annes - bit too far (1h30m, 1 change)&lt;br /&gt;
* Ribchester - Langho station, 1h2m, 1tph - bit too far from the station&lt;br /&gt;
&lt;br /&gt;
[[Category:Socials]]&lt;br /&gt;
[[Category:Events]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Backups&amp;diff=1435</id>
		<title>Backups</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Backups&amp;diff=1435"/>
		<updated>2024-09-24T10:07:25Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Writing new software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Topics for consideration ==&lt;br /&gt;
&lt;br /&gt;
* How can I start backups automatically when I login? Don&#039;t want to do this until a network connection is available, and possibly my keyring has been unlocked.&lt;br /&gt;
* How can I start a backup run periodically? Is this necessary given that I usually login at least once every 24 hours?&lt;br /&gt;
* How can I put an icon in the system menu that shows backup status/process? Similar to Nextcloud would be useful with a tick for complete, circular arrows for in process, and a cross for failed.&lt;br /&gt;
&lt;br /&gt;
== Existing software ==&lt;br /&gt;
&lt;br /&gt;
* tar&lt;br /&gt;
* Obnam&lt;br /&gt;
* restic&lt;br /&gt;
* Borg&lt;br /&gt;
* rdiff-backup&lt;br /&gt;
* deja-dup&lt;br /&gt;
* rclone (for backing up from/to cloud services such as Google Docs)&lt;br /&gt;
&lt;br /&gt;
== Writing new software ==&lt;br /&gt;
&lt;br /&gt;
Powerful Command-Line Applications in Go - may be useful&lt;br /&gt;
&lt;br /&gt;
MVP:&lt;br /&gt;
&lt;br /&gt;
* Include file (one per line)&lt;br /&gt;
* Exclude file (one per line)&lt;br /&gt;
* Copy files from X to Y&lt;br /&gt;
* Database (SQLite? DuckDB?) to hold metadata (map hashes to file paths)&lt;br /&gt;
* File size and SHA-3 for deduplication&lt;br /&gt;
&lt;br /&gt;
Thoughts:&lt;br /&gt;
&lt;br /&gt;
* Can the hash checking of files be done in parallel?&lt;br /&gt;
* Should we compare file size first, and only calculate hashes if the sizes are the same?&lt;br /&gt;
* What metadata should we store about each file?&lt;br /&gt;
* How to restore files?&lt;br /&gt;
* How to prune files?&lt;br /&gt;
* Deduplication at the file level - could also do this with chunks of files at a later date?&lt;br /&gt;
* Can we compress the files? Can this be done in parallel?&lt;br /&gt;
* What is the fastest collision-resistant algorithm for file comparison?&lt;br /&gt;
* How do we stop two backup processes running simultaneously?&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
&lt;br /&gt;
* Assumption is that you trust the backup target&lt;br /&gt;
* If you want encryption at rest, use LUKS etc. to encrypt the underlying device&lt;br /&gt;
* If you want encryption in transit, use SSH or TLS&lt;br /&gt;
&lt;br /&gt;
== GitHub ==&lt;br /&gt;
&lt;br /&gt;
* [https://jpmens.net/2019/04/03/backup-all-my-gists/ I backup (clone) all my gists]&lt;br /&gt;
* [https://jpmens.net/2019/04/04/i-clone-all-repositories-i-ve-starred/ I clone all GitHub repositories I&#039;ve starred]&lt;br /&gt;
* [https://jpmens.net/2019/04/15/i-mirror-my-github-repositories-to-gitea/ I mirror my Github repositories to Gitea]&lt;br /&gt;
* [https://github.com/PyGithub/PyGithub PyGithub]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Backups&amp;diff=1434</id>
		<title>Backups</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Backups&amp;diff=1434"/>
		<updated>2024-09-24T08:41:27Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Writing new software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Topics for consideration ==&lt;br /&gt;
&lt;br /&gt;
* How can I start backups automatically when I login? Don&#039;t want to do this until a network connection is available, and possibly my keyring has been unlocked.&lt;br /&gt;
* How can I start a backup run periodically? Is this necessary given that I usually login at least once every 24 hours?&lt;br /&gt;
* How can I put an icon in the system menu that shows backup status/process? Similar to Nextcloud would be useful with a tick for complete, circular arrows for in process, and a cross for failed.&lt;br /&gt;
&lt;br /&gt;
== Existing software ==&lt;br /&gt;
&lt;br /&gt;
* tar&lt;br /&gt;
* Obnam&lt;br /&gt;
* restic&lt;br /&gt;
* Borg&lt;br /&gt;
* rdiff-backup&lt;br /&gt;
* deja-dup&lt;br /&gt;
* rclone (for backing up from/to cloud services such as Google Docs)&lt;br /&gt;
&lt;br /&gt;
== Writing new software ==&lt;br /&gt;
&lt;br /&gt;
Powerful Command-Line Applications in Go - may be useful&lt;br /&gt;
&lt;br /&gt;
MVP:&lt;br /&gt;
&lt;br /&gt;
* Include file (one per line)&lt;br /&gt;
* Exclude file (one per line)&lt;br /&gt;
* Copy files from X to Y&lt;br /&gt;
* Database (SQLite? DuckDB?) to hold metadata (map hashes to file paths)&lt;br /&gt;
* SHA-512 for deduplication&lt;br /&gt;
&lt;br /&gt;
Thoughts:&lt;br /&gt;
&lt;br /&gt;
* Can the hash checking of files be done in parallel?&lt;br /&gt;
* Should we compare file size first, and only calculate hashes if the sizes are the same?&lt;br /&gt;
* What metadata should we store about each file?&lt;br /&gt;
* How to restore files?&lt;br /&gt;
* How to prune files?&lt;br /&gt;
* Deduplication at the file level - could also do this with chunks of files at a later date?&lt;br /&gt;
* Can we compress the files? Can this be done in parallel?&lt;br /&gt;
* What is the fastest collision-resistant algorithm for file comparison?&lt;br /&gt;
* How do we stop two backup processes running simultaneously?&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
&lt;br /&gt;
* Assumption is that you trust the backup target&lt;br /&gt;
* If you want encryption at rest, use LUKS etc. to encrypt the underlying device&lt;br /&gt;
* If you want encryption in transit, use SSH or TLS&lt;br /&gt;
&lt;br /&gt;
== GitHub ==&lt;br /&gt;
&lt;br /&gt;
* [https://jpmens.net/2019/04/03/backup-all-my-gists/ I backup (clone) all my gists]&lt;br /&gt;
* [https://jpmens.net/2019/04/04/i-clone-all-repositories-i-ve-starred/ I clone all GitHub repositories I&#039;ve starred]&lt;br /&gt;
* [https://jpmens.net/2019/04/15/i-mirror-my-github-repositories-to-gitea/ I mirror my Github repositories to Gitea]&lt;br /&gt;
* [https://github.com/PyGithub/PyGithub PyGithub]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Backups&amp;diff=1433</id>
		<title>Backups</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Backups&amp;diff=1433"/>
		<updated>2024-09-09T09:47:52Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Writing new software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Topics for consideration ==&lt;br /&gt;
&lt;br /&gt;
* How can I start backups automatically when I login? Don&#039;t want to do this until a network connection is available, and possibly my keyring has been unlocked.&lt;br /&gt;
* How can I start a backup run periodically? Is this necessary given that I usually login at least once every 24 hours?&lt;br /&gt;
* How can I put an icon in the system menu that shows backup status/process? Similar to Nextcloud would be useful with a tick for complete, circular arrows for in process, and a cross for failed.&lt;br /&gt;
&lt;br /&gt;
== Existing software ==&lt;br /&gt;
&lt;br /&gt;
* tar&lt;br /&gt;
* Obnam&lt;br /&gt;
* restic&lt;br /&gt;
* Borg&lt;br /&gt;
* rdiff-backup&lt;br /&gt;
* deja-dup&lt;br /&gt;
* rclone (for backing up from/to cloud services such as Google Docs)&lt;br /&gt;
&lt;br /&gt;
== Writing new software ==&lt;br /&gt;
&lt;br /&gt;
Powerful Command-Line Applications in Go - may be useful&lt;br /&gt;
&lt;br /&gt;
MVP:&lt;br /&gt;
&lt;br /&gt;
* Include file (one per line)&lt;br /&gt;
* Exclude file (one per line)&lt;br /&gt;
* Copy files from X to Y&lt;br /&gt;
* Database (SQLite? DuckDB?) to hold metadata (map hashes to file paths)&lt;br /&gt;
* SHA-512 for deduplication&lt;br /&gt;
&lt;br /&gt;
Thoughts:&lt;br /&gt;
&lt;br /&gt;
* Can the hash checking of files be done in parallel?&lt;br /&gt;
* Should we compare file size first, and only calculate hashes if the sizes are the same?&lt;br /&gt;
* What metadata should we store about each file?&lt;br /&gt;
* How to restore files?&lt;br /&gt;
* How to prune files?&lt;br /&gt;
* Deduplication at the file level - could also do this with chunks of files at a later date?&lt;br /&gt;
* Can we compress the files? Can this be done in parallel?&lt;br /&gt;
* What is the fastest collision-resistant algorithm for file comparison?&lt;br /&gt;
* How do we stop two backup processes running simultaneously?&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
&lt;br /&gt;
* If you want encryption at rest, use LUKS etc. to encrypt the underlying device&lt;br /&gt;
* If you want encryption in transit, use SSH or TLS&lt;br /&gt;
&lt;br /&gt;
== GitHub ==&lt;br /&gt;
&lt;br /&gt;
* [https://jpmens.net/2019/04/03/backup-all-my-gists/ I backup (clone) all my gists]&lt;br /&gt;
* [https://jpmens.net/2019/04/04/i-clone-all-repositories-i-ve-starred/ I clone all GitHub repositories I&#039;ve starred]&lt;br /&gt;
* [https://jpmens.net/2019/04/15/i-mirror-my-github-repositories-to-gitea/ I mirror my Github repositories to Gitea]&lt;br /&gt;
* [https://github.com/PyGithub/PyGithub PyGithub]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Backups&amp;diff=1432</id>
		<title>Backups</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Backups&amp;diff=1432"/>
		<updated>2024-09-09T09:47:08Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Writing new software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Topics for consideration ==&lt;br /&gt;
&lt;br /&gt;
* How can I start backups automatically when I login? Don&#039;t want to do this until a network connection is available, and possibly my keyring has been unlocked.&lt;br /&gt;
* How can I start a backup run periodically? Is this necessary given that I usually login at least once every 24 hours?&lt;br /&gt;
* How can I put an icon in the system menu that shows backup status/process? Similar to Nextcloud would be useful with a tick for complete, circular arrows for in process, and a cross for failed.&lt;br /&gt;
&lt;br /&gt;
== Existing software ==&lt;br /&gt;
&lt;br /&gt;
* tar&lt;br /&gt;
* Obnam&lt;br /&gt;
* restic&lt;br /&gt;
* Borg&lt;br /&gt;
* rdiff-backup&lt;br /&gt;
* deja-dup&lt;br /&gt;
* rclone (for backing up from/to cloud services such as Google Docs)&lt;br /&gt;
&lt;br /&gt;
== Writing new software ==&lt;br /&gt;
&lt;br /&gt;
Powerful Command-Line Applications in Go - may be useful&lt;br /&gt;
&lt;br /&gt;
MVP:&lt;br /&gt;
&lt;br /&gt;
* Include file (one per line)&lt;br /&gt;
* Exclude file (one per line)&lt;br /&gt;
* Copy files from X to Y&lt;br /&gt;
* Database (SQLite? DuckDB?) to hold metadata (map hashes to file paths)&lt;br /&gt;
* SHA-512 for deduplication&lt;br /&gt;
&lt;br /&gt;
Thoughts:&lt;br /&gt;
&lt;br /&gt;
* Can the hash checking of files be done in parallel?&lt;br /&gt;
* Should we compare file size first, and only calculate hashes if the sizes are the same?&lt;br /&gt;
* What metadata should we store about each file?&lt;br /&gt;
* How to restore files?&lt;br /&gt;
* How to prune files?&lt;br /&gt;
* Deduplication at the file level - could also do this with chunks of files at a later date?&lt;br /&gt;
* Can we compress the files? Can this be done in parallel?&lt;br /&gt;
* What is the fastest collision-resistant algorithm for file comparison?&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
&lt;br /&gt;
* If you want encryption at rest, use LUKS etc. to encrypt the underlying device&lt;br /&gt;
* If you want encryption in transit, use SSH or TLS&lt;br /&gt;
&lt;br /&gt;
== GitHub ==&lt;br /&gt;
&lt;br /&gt;
* [https://jpmens.net/2019/04/03/backup-all-my-gists/ I backup (clone) all my gists]&lt;br /&gt;
* [https://jpmens.net/2019/04/04/i-clone-all-repositories-i-ve-starred/ I clone all GitHub repositories I&#039;ve starred]&lt;br /&gt;
* [https://jpmens.net/2019/04/15/i-mirror-my-github-repositories-to-gitea/ I mirror my Github repositories to Gitea]&lt;br /&gt;
* [https://github.com/PyGithub/PyGithub PyGithub]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Backups&amp;diff=1431</id>
		<title>Backups</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Backups&amp;diff=1431"/>
		<updated>2024-08-07T10:02:39Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Writing new software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Topics for consideration ==&lt;br /&gt;
&lt;br /&gt;
* How can I start backups automatically when I login? Don&#039;t want to do this until a network connection is available, and possibly my keyring has been unlocked.&lt;br /&gt;
* How can I start a backup run periodically? Is this necessary given that I usually login at least once every 24 hours?&lt;br /&gt;
* How can I put an icon in the system menu that shows backup status/process? Similar to Nextcloud would be useful with a tick for complete, circular arrows for in process, and a cross for failed.&lt;br /&gt;
&lt;br /&gt;
== Existing software ==&lt;br /&gt;
&lt;br /&gt;
* tar&lt;br /&gt;
* Obnam&lt;br /&gt;
* restic&lt;br /&gt;
* Borg&lt;br /&gt;
* rdiff-backup&lt;br /&gt;
* deja-dup&lt;br /&gt;
* rclone (for backing up from/to cloud services such as Google Docs)&lt;br /&gt;
&lt;br /&gt;
== Writing new software ==&lt;br /&gt;
&lt;br /&gt;
Powerful Command-Line Applications in Go - may be useful&lt;br /&gt;
&lt;br /&gt;
MVP:&lt;br /&gt;
&lt;br /&gt;
* Include file (one per line)&lt;br /&gt;
* Exclude file (one per line)&lt;br /&gt;
* Copy files from X to Y&lt;br /&gt;
* Database (SQLite? DuckDB?) to hold metadata (map hashes to file paths)&lt;br /&gt;
* SHA-512 for deduplication&lt;br /&gt;
&lt;br /&gt;
Thoughts:&lt;br /&gt;
&lt;br /&gt;
* Can the hash checking of files be done in parallel?&lt;br /&gt;
* What metadata should we store about each file?&lt;br /&gt;
* How to restore files?&lt;br /&gt;
* How to prune files?&lt;br /&gt;
* Deduplication at the file level - could also do this with chunks of files at a later date?&lt;br /&gt;
* Can we compress the files? Can this be done in parallel?&lt;br /&gt;
* What is the fastest collision-resistant algorithm for file comparison?&lt;br /&gt;
&lt;br /&gt;
Security:&lt;br /&gt;
&lt;br /&gt;
* If you want encryption at rest, use LUKS etc. to encrypt the underlying device&lt;br /&gt;
* If you want encryption in transit, use SSH or TLS&lt;br /&gt;
&lt;br /&gt;
== GitHub ==&lt;br /&gt;
&lt;br /&gt;
* [https://jpmens.net/2019/04/03/backup-all-my-gists/ I backup (clone) all my gists]&lt;br /&gt;
* [https://jpmens.net/2019/04/04/i-clone-all-repositories-i-ve-starred/ I clone all GitHub repositories I&#039;ve starred]&lt;br /&gt;
* [https://jpmens.net/2019/04/15/i-mirror-my-github-repositories-to-gitea/ I mirror my Github repositories to Gitea]&lt;br /&gt;
* [https://github.com/PyGithub/PyGithub PyGithub]&lt;br /&gt;
&lt;br /&gt;
[[Category:Software]]&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1430</id>
		<title>Affiliate schemes</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1430"/>
		<updated>2024-06-17T13:33:32Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://www.deployhq.com/r/1nq46h DeployHQ] - I get &#039;credits&#039;, which can be exchanged for a variety of items.&lt;br /&gt;
* [https://refer.moo.com/s/lg65tm MOO] - I get a pre-paid card, you get a discount on your order.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1429</id>
		<title>Affiliate schemes</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Affiliate_schemes&amp;diff=1429"/>
		<updated>2024-06-17T13:33:02Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://www.deployhq.com/r/1nq46h DeployHQ] - I get &#039;credits&#039;, which can be exchanged for a variety of items.&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Testing_PHP&amp;diff=1428</id>
		<title>Testing PHP</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Testing_PHP&amp;diff=1428"/>
		<updated>2023-12-18T10:40:57Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* PHPUnit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PHPUnit ==&lt;br /&gt;
&lt;br /&gt;
* Any function with the prefix &#039;test&#039; is considered a test (e.g. testSubtraction)&lt;br /&gt;
* A test function can contain multiple assertions&lt;br /&gt;
* setUp function is run before each test function&lt;br /&gt;
* tearDown function is run after each test function&lt;br /&gt;
* setUpBeforeClass function is run before each class of tests (e.g. establishing a database connection)&lt;br /&gt;
* tearDownAfterClass function is run after each class of tests&lt;br /&gt;
&lt;br /&gt;
== Psalm ==&lt;br /&gt;
&lt;br /&gt;
== PHPStan ==&lt;br /&gt;
&lt;br /&gt;
== PHPCS ==&lt;br /&gt;
&lt;br /&gt;
== PHPCBF ==&lt;br /&gt;
&lt;br /&gt;
== PHPLint ==&lt;br /&gt;
&lt;br /&gt;
== Codeception ==&lt;br /&gt;
&lt;br /&gt;
* Can have different &#039;suites&#039; of tests&lt;br /&gt;
&lt;br /&gt;
== Test Driven Development ==&lt;br /&gt;
&lt;br /&gt;
== Behaviour Driver Development ==&lt;br /&gt;
&lt;br /&gt;
[[Category:PHP]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Testing_PHP&amp;diff=1427</id>
		<title>Testing PHP</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Testing_PHP&amp;diff=1427"/>
		<updated>2023-12-18T10:36:12Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* PHPUnit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PHPUnit ==&lt;br /&gt;
&lt;br /&gt;
* Any function with the prefix &#039;test&#039; is considered a test (e.g. testSubtraction)&lt;br /&gt;
* A test function can contain multiple assertions&lt;br /&gt;
* setUp function is run before each test function&lt;br /&gt;
* tearDown function is run after each test function&lt;br /&gt;
* setUpBeforeClass function is run before each class of tests&lt;br /&gt;
* tearDownAfterClass function is run after each class of tests&lt;br /&gt;
&lt;br /&gt;
== Psalm ==&lt;br /&gt;
&lt;br /&gt;
== PHPStan ==&lt;br /&gt;
&lt;br /&gt;
== PHPCS ==&lt;br /&gt;
&lt;br /&gt;
== PHPCBF ==&lt;br /&gt;
&lt;br /&gt;
== PHPLint ==&lt;br /&gt;
&lt;br /&gt;
== Codeception ==&lt;br /&gt;
&lt;br /&gt;
* Can have different &#039;suites&#039; of tests&lt;br /&gt;
&lt;br /&gt;
== Test Driven Development ==&lt;br /&gt;
&lt;br /&gt;
== Behaviour Driver Development ==&lt;br /&gt;
&lt;br /&gt;
[[Category:PHP]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Testing_PHP&amp;diff=1426</id>
		<title>Testing PHP</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Testing_PHP&amp;diff=1426"/>
		<updated>2023-12-18T10:35:39Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* PHPUnit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== PHPUnit ==&lt;br /&gt;
&lt;br /&gt;
* Any function with the prefix &#039;test&#039; is considered a test (e.g. testSubtraction)&lt;br /&gt;
* A test function can contain multiple assertions&lt;br /&gt;
* setUp function is run before each test function&lt;br /&gt;
* tearDown function is run after each test function&lt;br /&gt;
&lt;br /&gt;
== Psalm ==&lt;br /&gt;
&lt;br /&gt;
== PHPStan ==&lt;br /&gt;
&lt;br /&gt;
== PHPCS ==&lt;br /&gt;
&lt;br /&gt;
== PHPCBF ==&lt;br /&gt;
&lt;br /&gt;
== PHPLint ==&lt;br /&gt;
&lt;br /&gt;
== Codeception ==&lt;br /&gt;
&lt;br /&gt;
* Can have different &#039;suites&#039; of tests&lt;br /&gt;
&lt;br /&gt;
== Test Driven Development ==&lt;br /&gt;
&lt;br /&gt;
== Behaviour Driver Development ==&lt;br /&gt;
&lt;br /&gt;
[[Category:PHP]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Privacy_focussed_messenger&amp;diff=1425</id>
		<title>Privacy focussed messenger</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Privacy_focussed_messenger&amp;diff=1425"/>
		<updated>2023-10-25T10:03:38Z</updated>

		<summary type="html">&lt;p&gt;Paul: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Guiding principles ==&lt;br /&gt;
&lt;br /&gt;
* Everyone is blocked by default&lt;br /&gt;
* Can only message contacts where there is mutual agreement (i.e. both have added each other)&lt;br /&gt;
* Text only&lt;br /&gt;
* Transit over open protocols&lt;br /&gt;
* Mandatory encryption of communication stream&lt;br /&gt;
* Mandatory encryption of data (E2EE)&lt;br /&gt;
* No read receipts&lt;br /&gt;
* No way to know if someone has added/removed you from their contacts&lt;br /&gt;
* Messaging someone who hasn&#039;t added you to contacts = message silently deleted&lt;br /&gt;
&lt;br /&gt;
== Thoughts ==&lt;br /&gt;
&lt;br /&gt;
* How to avoid a centralised server&lt;br /&gt;
* Important to prevent abuse of the service&lt;br /&gt;
* Only allow connections if both people make a request (don&#039;t show incoming requests)&lt;br /&gt;
* What transport mechanism should be used?&lt;br /&gt;
* How can users send messages over a p2p protocol? Don&#039;t want a centralised server.&lt;br /&gt;
* End to end encryption mandatory - client certificates? Public keys?&lt;br /&gt;
* How to migrate / sync messages to another phone or device?&lt;br /&gt;
* How to backup messages?&lt;br /&gt;
* What if a user has multiple devices and wants to check messages on all of them?&lt;br /&gt;
* How would group chats work?&lt;br /&gt;
* How to deliver a message when a user is offline?&lt;br /&gt;
* Could Tor be used for message delivery?&lt;br /&gt;
* How to ensure each user has a unique ID? Use their email address?&lt;br /&gt;
* What prevents a user from using someone else&#039;s ID?&lt;br /&gt;
* If a user is removed as a contact, do not tell the other party and simply drop their messages.&lt;br /&gt;
* No read receipts, might offer delivery receipts. This can leak information so need to be careful.&lt;br /&gt;
* Double Ratchet Algorithm&lt;br /&gt;
* Perfect Forward Secrecy?&lt;br /&gt;
* How can we stop messages from being decrypted in future when computational power makes it feasible to brute force?&lt;br /&gt;
&lt;br /&gt;
== Reasoning ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Text only:&#039;&#039;&#039; Simple to implement, compresses well, less scope for abuse (e.g. can&#039;t send images)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Privacy_focussed_messenger&amp;diff=1424</id>
		<title>Privacy focussed messenger</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Privacy_focussed_messenger&amp;diff=1424"/>
		<updated>2023-10-01T11:06:02Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Thoughts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Guiding principles ==&lt;br /&gt;
&lt;br /&gt;
* Everyone is blocked by default&lt;br /&gt;
* Can only message contacts where there is mutual agreement (i.e. both have added each other)&lt;br /&gt;
* Text only&lt;br /&gt;
* Transit over open protocols&lt;br /&gt;
* Mandatory encryption of communication stream&lt;br /&gt;
* Mandatory encryption of data (E2EE)&lt;br /&gt;
* No read receipts&lt;br /&gt;
* No way to know if someone has added/removed you from their contacts&lt;br /&gt;
* Messaging someone who hasn&#039;t added you to contacts = message silently deleted&lt;br /&gt;
&lt;br /&gt;
== Thoughts ==&lt;br /&gt;
&lt;br /&gt;
* How to avoid a centralised server&lt;br /&gt;
* Important to prevent abuse of the service&lt;br /&gt;
* Only allow connections if both people make a request (don&#039;t show incoming requests)&lt;br /&gt;
* What transport mechanism should be used?&lt;br /&gt;
* How can users send messages over a p2p protocol? Don&#039;t want a centralised server.&lt;br /&gt;
* End to end encryption mandatory - client certificates? Public keys?&lt;br /&gt;
* How to migrate / sync messages to another phone or device?&lt;br /&gt;
* How to backup messages?&lt;br /&gt;
* What if a user has multiple devices and wants to check messages on all of them?&lt;br /&gt;
* How would group chats work?&lt;br /&gt;
* How to deliver a message when a user is offline?&lt;br /&gt;
* Could Tor be used for message delivery?&lt;br /&gt;
* How to ensure each user has a unique ID? Use their email address?&lt;br /&gt;
* What prevents a user from using someone else&#039;s ID?&lt;br /&gt;
* If a user is removed as a contact, do not tell the other party and simply drop their messages.&lt;br /&gt;
* No read receipts, might offer delivery receipts. This can leak information so need to be careful.&lt;br /&gt;
* Double Ratchet Algorithm&lt;br /&gt;
* Perfect Forward Secrecy?&lt;br /&gt;
* How can we stop messages from being decrypted in future when computational power makes it feasible to brute force?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
	<entry>
		<id>https://wiki.rixort.com/index.php?title=Privacy_focussed_messenger&amp;diff=1423</id>
		<title>Privacy focussed messenger</title>
		<link rel="alternate" type="text/html" href="https://wiki.rixort.com/index.php?title=Privacy_focussed_messenger&amp;diff=1423"/>
		<updated>2023-10-01T11:05:49Z</updated>

		<summary type="html">&lt;p&gt;Paul: /* Thoughts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Guiding principles ==&lt;br /&gt;
&lt;br /&gt;
* Everyone is blocked by default&lt;br /&gt;
* Can only message contacts where there is mutual agreement (i.e. both have added each other)&lt;br /&gt;
* Text only&lt;br /&gt;
* Transit over open protocols&lt;br /&gt;
* Mandatory encryption of communication stream&lt;br /&gt;
* Mandatory encryption of data (E2EE)&lt;br /&gt;
* No read receipts&lt;br /&gt;
* No way to know if someone has added/removed you from their contacts&lt;br /&gt;
* Messaging someone who hasn&#039;t added you to contacts = message silently deleted&lt;br /&gt;
&lt;br /&gt;
== Thoughts ==&lt;br /&gt;
&lt;br /&gt;
* How to avoid a centralised server&lt;br /&gt;
* How to deliver messages when the recipient isn&#039;t online&lt;br /&gt;
* Important to prevent abuse of the service&lt;br /&gt;
* Only allow connections if both people make a request (don&#039;t show incoming requests)&lt;br /&gt;
* What transport mechanism should be used?&lt;br /&gt;
* How can users send messages over a p2p protocol? Don&#039;t want a centralised server.&lt;br /&gt;
* End to end encryption mandatory - client certificates? Public keys?&lt;br /&gt;
* How to migrate / sync messages to another phone or device?&lt;br /&gt;
* How to backup messages?&lt;br /&gt;
* What if a user has multiple devices and wants to check messages on all of them?&lt;br /&gt;
* How would group chats work?&lt;br /&gt;
* How to deliver a message when a user is offline?&lt;br /&gt;
* Could Tor be used for message delivery?&lt;br /&gt;
* How to ensure each user has a unique ID? Use their email address?&lt;br /&gt;
* What prevents a user from using someone else&#039;s ID?&lt;br /&gt;
* If a user is removed as a contact, do not tell the other party and simply drop their messages.&lt;br /&gt;
* No read receipts, might offer delivery receipts. This can leak information so need to be careful.&lt;br /&gt;
* Double Ratchet Algorithm&lt;br /&gt;
* Perfect Forward Secrecy?&lt;br /&gt;
* How can we stop messages from being decrypted in future when computational power makes it feasible to brute force?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Open Source Software]]&lt;/div&gt;</summary>
		<author><name>Paul</name></author>
	</entry>
</feed>