Scottish flag and the Union Jack

Scotland: the Road to Independence

  1. Scotland: the State, the Nation, Home Rule, and Devolution
  2. The Act of Union of 1707
  3. Scottish Home Rule
  4. The rise of the Scottish National Party (SNP)
  5. The Scottish Parliament
  6. Scotland: the Road to Independence

Scottish Independence Referendum, 2014

In August 2009 the SNP announced a Referendum Bill would be included in its package of bills to be debated before Parliament in 2009–10, to hold a referendum on the issues of Scottish independence in November 2010.

The bill did not pass due to the SNP’s status as a minority administration, and due to the initial opposition to the Bill from all other major parties in the Scottish Parliament.

Following the Scottish Parliament general election, in 2011 the SNP had a majority in parliament and again brought forward an Independence Referendum Bill.

The Scottish Government also suggested that full fiscal autonomy for Scotland (known as “devo-max”) could be an alternative option in the vote.

The negotiation of the Edinburgh Agreement (2012) resulted in the UK government legislating to provide the Scottish Parliament with the power to hold the referendum.

The “devo-max” option was not included, however, as the Edinburgh Agreement stipulated that the referendum had to be a clear binary choice between independence or the existing devolution arrangements.

The Scottish Independence Referendum (Franchise) Act 2013 was passed by the Scottish Parliament and campaigning commenced. Two days before the referendum was held, with polls very close, the leaders of the three main UK political parties made “The Vow”, a public pledge to devolve “extensive new powers” to the Scottish Parliament if independence was rejected. They also agreed to a devolution timetable proposed by Gordon Brown.

After heavy campaigning by both sides, voting took place on 18 September 2014. Independence was rejected by a margin of 45% in favour to 55% against.

Lire la suite

Installation de Nextcloud: votre propre service de cloud chez vous photo 1

Nextcloud: solutions pour les erreurs occ pour PHP, le mode maintenance et la base de données

Dans Nextcloud, la page Paramètres > Administration > Vue d’ensemble vous permet d’avoir un bon aperçu des tâches de maintenance à effectuer sur votre installation Nextcloud.

This version of Nextcloud is not compatible with > PHP 7.4

C’est une erreur – et non un avertissement – qui bloque toutes les commandes suivantes dans le terminal. Elle apparaît lorsqu’une version de PHP plus récente est installée sur votre serveur.

Chez moi, par exemple, j’ai PHP 7.4 pour les sites en production et pour Nextcloud mais aussi PHP 8 pour les plateformes de développement.

Voici le message d’erreur:

This version of Nextcloud is not compatible with > PHP 7.4.

You are currently running 8.0.0

Ce message apparaît parce que Nextcloud lance un rapide php -v pour déterminer la version de PHP installée. Cela ne reconnaît par contre que la version la plus récente installée.

Voici ce que donne la commande :

PHP 8.0.0 (cli) (built: Nov 27 2020 12:26:22) ( NTS )
 Copyright (c) The PHP Group
 Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
     with Zend OPcache v8.0.0, Copyright (c), by Zend TechnologiesCode language: CSS (css)

La solution consiste à modifier manuellement la version retournée par php -v, à l’aide de la commande update-alternatives :

update-alternatives --set php /usr/bin/php7.4Code language: JavaScript (javascript)

Si on relance php -v, voici le résultat:

PHP 7.4.13 (cli) (built: Nov 28 2020 06:24:59) ( NTS )
 Copyright (c) The PHP Group
 Zend Engine v3.4.0, Copyright (c) Zend Technologies
     with Zend OPcache v7.4.13, Copyright (c), by Zend TechnologiesCode language: CSS (css)

Avec cela, vous êtes parés pour les commandes occ de Nextcloud.

Nextcloud reste bloqué en mode maintenance

Cela peut arriver lors d’une mise à jour, pour diverses raisons.

Solution 1: avec la commande occ

cd /home/www/nextcloud 
sudo -u www-data php ./occ maintenance:mode --off 

Solution 2: éditer le fichier config.php

1. Editez le fichier config.php:

nano /home/www/nextcloud/config/config.php

2. trouvez:

'maintenance' => true,Code language: PHP (php)

3. remplacez par:

'maintenance' => false,Code language: PHP (php)

Enregistrez le fichier, l’assistant de mise à jour est alors capable de reprendre là où il s’était arrêté, automatiquement.

Lire la suite

Jethro Tull - Aqualung photo

Local : importer une base de données depuis le shell

Local possède une version d’Adminer dans les options de chaque site qui est très utile puisqu’elle permet d’accéder rapidement à la base de données, ou d’importer une petite base de données.

Par contre, s’il s’agit d’importer une base qui fait plus de 80 Mo, mieux vaut se tourner vers un outil un peu plus robuste: le shell.

Accéder au shell depuis Local

Et cela tombe bien : Local possède son propre shell, accessible sur simple clic-droit sur le nom du site sur lequel vous souhaitez ouvrir une fenêtre de terminal:

local open site shell new 1280x787

Voici la marche à suivre : Démarrez votre site > sélectionnez le nom du site > clic-droit > Open Site Shell

Importer une base de données dans un site Local

Lorsque j’ai besoin de répliquer un site rapidement, je copie la base données dans le répertoire app du site Local en question.

Pour mon site de test (skyminds-2020 ), le chemin sur ma machine est /Users/matt/Local Sites/skyminds2020/app . C’est dans ce dossier que je place le fichier SQL à importer.

Ensuite, dans le shell Local, il suffit de faire un simple import SQL dans la base qui, par défaut, s’appelle local (et ce, pour tous vos sites Local, bien qu’elles soient toutes indépendantes).

L’utilisateur est root et le mot de passe root également, ce qui est plutôt pratique.

Le shell est par défaut sous app/public donc on remonte d’un cran dans l’arborescence pour pointer vers notre fichier (qui se trouve dans /app ).

Voilà ce que cela nous donne:

mysql -u root -proot local < ../db.sql

Résultat:

mysql: [Warning] Using a password on the command line interface can be insecure.
bash-3.2$Code language: HTTP (http)

L’importation de la base de données SQL ne prend que quelques secondes, alors que cela se plante allégrement lorsque l’on utilise Adminer.

A utiliser sans modération, cela ne vaut vraiment pas le coup de s’embêter avec une interface graphique (ou à placer le fichier dans le répertoire d’adminer comme il l’indique sur la page d’importation).

WordPress: retirer l'option de supprimer les plugins dans l'interface d'administration photo

WordPress: retirer l’option de supprimer les extensions dans l’interface d’administration

C’est assez rare comme demande mais je me suis exécuté : comment faire pour retirer le lien qui permet de supprimer les extensions désactivées dans l’interface d’administration, même si l’on est administrateur ?

Et bien c’est assez simple, il suffit de filtrer le tableau des liens. Voici deux exemples simples pour mettre cela en place.

Retirer le lien de suppression pour toutes les extensions

Voici le code qui vous permet de retirer le lien “Supprimer” qui se trouve en dessous de chaque extension sur la page Extensions:

<?php
/*
Plugin Name: Disable Plugin Deletion
Plugin URI: https://www.skyminds.net/wordpress-retirer-option-supprimer-extensions/
Description: Disable all plugins' deletion links on the plugins page.
Version: 1.0
Author: Matt Biscay
Author URI: https://mattbiscay.com
*/
add_filter( 'plugin_action_links', 'sky_disable_plugin_deletion', 10, 4 );
function sky_disable_plugin_deletion( $actions, $plugin_file, $plugin_data, $context ) {
  // Remove delete link for all installed plugins         
  unset( $actions['delete'] );     
  return $actions;
} Code language: HTML, XML (xml)

Retirer le lien de suppression pour des extensions spécifiques

Voici le code qui vous permet de retirer le lien “Supprimer” qui se trouve en dessous des extensions dont vous spécifiez le chemin (dossier et nom du fichier de l’extension à charger) sur la page Extensions:

<?php
 /*
 Plugin Name: Disable Plugin Deletion
 Plugin URI: https://www.skyminds.net/wordpress-retirer-option-supprimer-extensions/
 Description: Disable all plugins' deletion links on the plugins page.
 Version: 1.0
 Author: Matt Biscay
 Author URI: https://mattbiscay.com
 */
 add_filter( 'plugin_action_links', 'sky_disable_plugin_deletion_selected', 10, 4 );
 function sky_disable_plugin_deletion_selected( $actions, $plugin_file, $plugin_data, $context ) {
   // Remove delete link for specific plugins
   if ( array_key_exists( 'delete', $actions ) && in_array( $plugin_file,
   [
     'akismet/akismet.php',
     'redirection/redirection.php',
   ]
   ) ) {
     unset( $actions['delete'] );
   }
   return $actions;
 }Code language: HTML, XML (xml)

Dans ce dernier snippet, pensez à modifier le nom du répertoire et celui du plugin de manière à ce qu’ils coïncident avec les plugins qui ne doivent pas être supprimés.

A l’origine, c’était pour un de mes clients pour éviter que ses collaborateurs ne suppriment des plugins par inadvertance.

Je m’en sers également sous LocalWP pour éviter de supprimer un plugin en cours de développement – on ne sait jamais !

Installation de Nextcloud: votre propre service de cloud chez vous photo 1

Installation de Nextcloud: votre propre service de cloud chez vous

Cela fait quelques temps que j’utilise une instance Nextcloud sur le serveur. Cela vous permet de créer votre propre service de cloud: vous gérez vous-mêmes vos données (images, documents, fichiers…) sans passer par un service tiers.

Vous gardez donc entièrement la main sur vos données : plus besoin de Google Drive ou Dropbox (ou autre), c’est vous qui gérez. Nextcloud possède même ses applications mobiles pour pouvoir accéder à vos données à tout moment, sur tous supports.

Ce tutoriel est réalisé sous Ubuntu Server mais il est facilement transposable à votre système d’exploitation sous Linux.

Installation de Nextcloud

Voici les paquets PHP nécessaires pour installer Nextcloud:

  • PHP (7.2, 7.3 or 7.4)
  • PHP module ctype
  • PHP module curl
  • PHP module dom
  • PHP module GD
  • PHP module hash (only on FreeBSD)
  • PHP module iconv
  • PHP module JSON
  • PHP module libxml (Linux package libxml2 must be >=2.7.0)
  • PHP module mbstring
  • PHP module openssl
  • PHP module posix
  • PHP module session
  • PHP module SimpleXML
  • PHP module XMLReader
  • PHP module XMLWriter
  • PHP module zip
  • PHP module zlib

Nextcloud est maintenant capable de tourner sous PHP 7.4 donc vous pouvez installer les paquets PHP qui lui sont nécessaires:

apt install php7.4 php7.4-cli php7.4-gd php7.4-imap php7.4-mysql php7.4-soap php7.4-apcu php7.4-common php7.4-gmp  php7.4-intl php7.4-opcache php7.4-xml php7.4-apcu-bc php7.4-curl php7.4-igbinary php7.4-json php7.4-readline  php7.4-zip php7.4-bcmath php7.4-fpm php7.4-imagick php7.4-mbstring php7.4-redisCode language: CSS (css)

On télécharge Nextcloud, depuis la page Téléchargement ou via la ligne de commande:

wget https://download.nextcloud.com/server/releases/nextcloud-22.0.0.zipCode language: JavaScript (javascript)

On décompresse l’archive:

unzip nextcloud-22.0.0.zipCode language: CSS (css)

Et on déplace ensuite le répertoire dans un dossier public lisible par le serveur de fichiers:

mv nextcloud /var/www/html/Code language: JavaScript (javascript)

et on lui donne ensuite les bonnes permissions:

chown -R www-data:www-data /var/www/html/nextcloudCode language: JavaScript (javascript)

Lire la suite

Jethro Tull - Aqualung photo

Local : résoudre l’erreur “missing zlib extensions”

A la suite d’une mise à jour de Local, j’ai eu la surprise d’obtenir le message d’erreur suivant au moment d’installer un plugin manuellement, par upload du fichier zip:

Unpacking the packageAbort class-pclzip.php : 
Missing zlib extensionsCode language: CSS (css)

Toutes les machines docker fonctionnent sous PHP 7.4.1 et cela ne s’était jamais produit auparavant. Local est installé sur ma machine MacOS.

Si cela vous arrive, voici comment régler le problème en quelques minutes.

Marche à suivre pour Local (MacOS)

Ce sont les Lightning Services qu’il faut mettre à jour: comme ils ne peuvent être mis à jour via l’auto-updater, nous allons devoir les supprimer et les réinstaller pour notre version de PHP.

1. Quittez Local si le programme est en cours d’utilisation.

2. Dans le terminal, lancez la commande suivante:

rm ~/Library/Application\ Support/Local/lightning-services/php-7.4* -rf Code language: JavaScript (javascript)

Notez que l’on cible ici les versions 7.4.x de PHP.

3. Relancez Local.

4. Ajoutez un nouveau site lambda (j’ai appelé le mien testing mais il pourra être supprimé dès la fin de cette procédure) sous Local qui utilise PHP 7.4. Cela lancera le téléchargement et l’installation des Lightning Services, avec la mise à jour zlib.

5. Lancez maintenant votre site Local, qui tourne sous PHP 7.4 : vous n’avez maintenant plus de problèmes pour installer plugins et thèmes manuellement, avec des fichiers zip.

Et voilà, vous pouvez de nouveau installer des thèmes et plugins manuellement. Cela devrait être corrigé dans une nouvelle version de Local – surtout que PHP 8 vient de sortir il y a quelques semaines.

Vanilla JS : créer des éléments aux couleurs aléatoires photo

Vanilla JS : créer des éléments aux couleurs aléatoires

On a souvent besoin de distinguer des éléments rapidement et c’est très simple de le faire visuellement, avec des couleurs, pour bien différencier les blocs.

Voici une solution simple et élégante pour créer des éléments aux couleurs aléatoires, en utilisant du javascript natif, que l’on appelle Vanilla JS.

Cela devrait vous permettre d’obtenir ceci – des blocs dont la couleur est générée aléatoirement et qui change à chaque rafraichissement de la page.

J’inclus ici un bouton qui permet de rafraîchir aléatoirement les couleurs de notre bloc:

  • Color 1
  • Color 2
  • Color 3
  • Color 4
  • Color 5
  • Color 6

Lire la suite

Réalisation de votre projet web photo

Réalisons votre projet WordPress ou WooCommerce

Nos compétences au service de vos besoins

Stratégie

Nous étudions le parcours de votre site et vos besoins pour vous fournir une solution à long-terme, qui correspond à votre vision.

Développement

Vous souhaitez ajouter de nouvelles fonctionnalités à votre site ou boutique? Nous pouvons coder la solution!

Performance

Votre site doit être rapide et optimisé sur tous supports afin de convertir vos visiteurs. Nous auditons votre site et proposons la solution adaptée.

Hébergement

Vos projets ont besoin d’un hébergement de qualité, c’est la fondation de votre site web et elle doit être solide car c’est sur elle que tout repose.

Maintenance

Votre site a besoin d’une maintenance régulière afin de toujours utiliser la dernière mouture du code et rester sécurisé face aux menaces.

Assistance

Vous avez besoin d’aide ponctuelle? Pas de problème, nous sommes à votre écoute pour vous dépanner rapidement et sereinement.

Lire la suite

CSS: superposer du texte lisible sur une image de fond photo

CSS: superposer du texte lisible sur une image de fond

Il est souvent utile de pouvoir placer du texte sur une image de fond, de manière à ce que l’on puisse lire le texte facilement et distinguer l’image. C’est ce que j’utilise sur le blog pour les images d’illustration des articles.

Nous allons donc superposer du texte lisible sur une image de fond en utilisant uniquement du code HTML et CSS, ce qui nous donne ceci:

Voici une planche à voile

Une image de planche à voile se trouve derrière ce texte.

Vous souhaitez accomplir la même chose? Voici comment faire.

Lire la suite

Analysis of The Handmaid's Tale by Margaret Atwood photo

The Handmaid’s Tale: incipit analysis

We slept in what had once been the gymnasium. The floor was of varnished wood, with stripes and circles painted on it, for the games that were formerly played there; the hoops for the basketball nets were still in place, though the nets were gone. A balcony ran around the room, for the spectators, and I thought I could smell, faintly like an afterimage, the pungent scent of sweat, shot through with the sweet taint of chewing gum and perfume from the watching girls, felt-skirted as I knew from pictures, later in miniskirts, then pants, then in one earring, spiky green-streaked hair. Dances would have been held there; the music lingered, a palimpsest of unheard sound, style upon style, an undercurrent of drums, a forlorn wail, garlands made of tissue-paper flowers, cardboard devils, a revolving ball of mirrors, powdering the dancers with a snow of light.

There was old sex in the room and loneliness, and expectation, of something without a shape or name. I remember that yearning, for something that was always about to happen and was never the same as the hands that were on us there and then, in the small of the back, or out back, in the parking lot, or in the television room with the sound turned down and only the pictures flickering over lifting flesh.

We yearned for the future. How did we learn it, that talent for insatiability? It was in the air; and it was still in the air, an afterthought, as we tried to sleep, in the army cots that had been set up in rows, with spaces between so we could not talk. We had flannelette sheets, like children’s, and army-issue blankets, old ones that still said U.S. We folded our clothes neatly and laid them on the stools at the ends of the beds. The lights were turned down but not out. Aunt Sara and Aunt Elizabeth patrolled; they had electric cattle prods slung on thongs from their leather belts.

No guns though, even they could not be trusted with guns. Guns were for the guards, specially picked from the Angels. The guards weren’t allowed inside the building except when called, and we weren’t allowed out, except for our walks, twice daily, two by two around the football field, which was enclosed now by a chain-link fence topped with barbed wire. The Angels stood outside it with their backs to us. They were objects of fear to us, but of something else as well. If only they would look. If only we could talk to them. Something could be exchanged, we thought, some deal made, some tradeoff, we still had our bodies. That was our fantasy.

We learned to whisper almost without sound. In the semidarkness we could stretch out our arms, when the Aunts weren’t looking, and touch each other’s hands across space. We learned to lip-read, our heads flat on the beds, turned sideways, watching each other’s mouths. In this way we exchanged names, from bed to bed:

Alma. Janine. Dolores. Moira. June.

The Handmaid’s Tale, chapter 1.

Setting and Time: a universe of temporal and spatial signs

Contextualisation: space

Semantic fields are understood universally. The gymnasium is a call to universal memory, to the experience of every reader, it’s a cultural sign.

It is reassuring but there are many syntactic breaks: “once”, “formerly”, “though” that show an insistence on the way recognizable signs are manipulated so that they gradually become revised, unrecognizable, and subverted signs.

Sport places (which used to be places of fun, pleasure and bodily activity) are now turned into dormitories (1: “We slept in what had once been the gymnasium.”) or prison yards (31: “the football field which was enclosed now (…) barbed wire.”)

Lire la suite

Serveur dédié : configurer Webmin en TLS avec un certificat SSL photo 1

Solution pour Webmin qui ne veut pas démarrer sous systemd

Je suis tombé sur une drôle d’erreur ce matin sur un VPS de mes clients : après mise à jour du système et redémarrage du serveur, webmin est injoignable et son service ne veut plus démarrer.

Les messages d’erreurs

On commence par lancer un curl distant depuis un autre serveur, histoire de voir si c’est bien injoignable de manière globale, et non propre à notre machine:

curl -I https://example.com:10000/

Résultat:
curl: (7) Failed to connect to example.com port 10000: Connection refusedCode language: JavaScript (javascript)

Pas de doute, cela touche tout le monde. On vérifie donc l’état du service:

systemctl status webmin.serviceCode language: CSS (css)

Résultat:

webmin.service - LSB: web-based administration interface for Unix systems
   Loaded: loaded (/etc/init.d/webmin; generated)
   Active: failed (Result: exit-code) since Sat 2020-09-12 17:35:13 CST; 20s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1803 ExecStart=/etc/init.d/webmin start (code=exited, status=25)

Sep 12 17:35:13 systemd[1]: Starting LSB: web-based administration interface for Unix systems...
Sep 12 17:35:13 systemd[1]: webmin.service: Control process exited, code=exited status=25
Sep 12 17:35:13 systemd[1]: webmin.service: Failed with result 'exit-code'.
Sep 12 17:35:13 systemd[1]: Failed to start LSB: web-based administration interface for Unix systems.Code language: JavaScript (javascript)

Ce n’est pas très loquace! journalctl est plus détaillé:

journalctl -xe

Résultat :

-- All system services necessary queued for starting at boot have been
-- started. Note that this does not mean that the machine is now idle as services
-- might still be busy with completing start-up.
--
-- Kernel start-up required 1709722 microseconds.
--
-- Initial RAM disk start-up required INITRD_USEC microseconds.
--
-- Userspace start-up required 152146335 microseconds.
Sep 12 17:35:13 systemd[1]: Starting LSB: web-based administration interface for Unix systems...
-- Subject: Unit webmin.service has begun start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- Unit webmin.service has begun starting up.
Sep 12 17:35:13 systemd[1]: webmin.service: Control process exited, code=exited status=25
Sep 12 17:35:13 systemd[1]: webmin.service: Failed with result 'exit-code'.
Sep 12 17:35:13 systemd[1]: Failed to start LSB: web-based administration interface for Unix systems.
-- Subject: Unit webmin.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
--
-- Unit webmin.service has failed.
--
-- The result is RESULT.Code language: JavaScript (javascript)

Mais nous n’obtenons toujours aucune information exploitable. Redémarrer le service avec service ne permet pas de le redémarrer.

La solution

Le seul moyen de redémarrer le service webmin sur ce VPS a été de la manière suivante:

/etc/init.d/webmin stop
systemctl start webmin

Et là, plus de problème, webmin démarre comme il faut.