Also sprach Alessandro

Configurare un webserver locale su macOS

Su macOS è possibile hostare i propri siti web in locale sfruttando la directory ~/Sites come alternativa a /Library/WebServer/Documents.

Abilitazione della configurazione per-utente

Per farlo è sufficiente creare un file /etc/apache2/other/00-enable_userdir.conf contenente:

LoadModule userdir_module libexec/apache2/mod_userdir.so
Include /private/etc/apache2/extra/httpd-userdir.conf

Questo abiliterà il file /private/etc/apache2/extra/httpd-userdir.conf; dal file sarà dunque necessario decommentare la riga Include /private/etc/apache2/users/*.conf:

$ sed -i '.bak' 's%#\(Include /private/etc/apache2/users/*.conf\)%\1%' /etc/apache2/extra/httpd-userdir.conf

Procedere quindi con la generazione della configurazione per-utente:

<Directory "/Users/<username>/Sites/">
	AddLanguage en .en 
	AddLanguage it .it
	Options Indexes MultiViews FollowSymLinks ExecCGI 
	AllowOverride All 
	Require host localhost
</Directory>

Controllare la configurazione di Apache

$ apachectl configtest

Configurazione dei permessi

$ chmod +a “_www allow execute” ~

Avviare Apache

$ sudo apachectl start

PHP

Per eseguire codice PHP tramite Apache, è sufficiente creare un file /etc/apache2/other/00-php.conf contenente:

LoadModule php_module <path-installazione-lib-php>/lib/httpd/modules/libphp.so "Nome"

<FilesMatch \.php$>
	SetHandler application/x-httpd-php
	DirectoryIndex index.php index.html
</FilesMatch>

In alternativa Homebrew preconfigura Apache come segue:

<IfModule php7_module>
	AddType application/x-httpd-php .php
	AddType application/x-httpd-php-source .phps

	<IfModule dir_module>
		DirectoryIndex index.html index.php
	</IfModule>
</IfModule>

Come si può notare è presente il campo Nome: da macOS Monterey, è necessario firmare moduli esterni. Per farlo, seguirà una guida apposita.

Lanciare dunque: $ apachectl restart

Utilizzo

Ora è possibile lanciare i propri siti nella propria cartella utente. Per visualizzarli è sufficiente usare come URL: localhost/~<username>/<nome-sito>

Fonte

Firmare librerie su macOS

Da macOS Monterey è diventato necessario firmare anche eventuali moduli Apache che si intendono usare, come libphp.so.

Dopo aver provato più guide, mi sono imbattuto in due guide1 2 che mi hanno aiutato a risolvere.

Riassumo dunque in questo post i passaggi necessari per poter firmare i propri moduli in autonomia.

Creazione di una Authority (CA)

Una Certificate Authority è un ente terzo di fiducia abilitato ad emettere un certificato digitale. Con questa procedura andremo a creare un’authority locale: di fatto ci auto-autenticheremo.

Ecco i N passi da seguire per configurare la CA:

  1. Aprire Accesso Portachiavi.app (Keychain access.app);
  2. Recarsi in Accesso Portachiavi -> Assistente Certificato -> Crea un’autorità di certificazione. Menù di creazione della CA
  3. In Crea la tua Certificate Authority:

    a. Inserisci il nome della CA;

    b. Seleziona come Tipo identità: CA principale autofirmannte;

    c. Certificato utente: Firma codice;

    d. Spuntare Lascia che sia io a sovrascrivere i default;

    e. Spuntare Rendi CA di default;

    f. Inserire l’indirizzo e-mail;

    g. Proseguire (se compare un errore, ignoratelo).

    Crea la tua CA

  4. Accettate i default per Informazioni del certificato e clicca continua (ignorare possibili avvisi);
  5. Inserire i campi richiesti circa le informazioni del certificatore;
  6. Accettare i default per Informazioni coppia di chiavi per questa CA e cliccare continua; Informazione coppia di chiavi
  7. Accettare i default per Specifica dati coppia di chiavi degli utenti della CA e cliccare continua;
  8. Accettare i default per Estensione utilizzo chiave per questa CA e cliccare continua; Estensione CA
  9. Accettare i default per Estensione utilizzo chiave per utentidi questa CA e cliccare continua; Estensione CA
  10. Nella maschera Estensione utilizzo chiave esteso per questa CA selezionare Includi estensione utilizzo chiave esteso, dunque selezionare Firma codice e continuare;
  11. Nella maschera Estensione utilizzo chiave esteso per utenti di questa CA accettare i valori di default e continuare;
  12. In Estensione limiti di base per questa CA, accettare dunque i valori predefiniti e procedere;
  13. Accettare i valori predefiniti anche per le successive 3 maschere (Estensione limiti di base per gli utenti di questa CA, Estensione nome soggetto alternativo per questa CA e Nome soggetto alternativo per gli utenti di questa CA);
  14. Selezionare il portachiavi login e selezionare la spunta; Portachiave login
  15. Premere dunque (finalmente) su “Crea”.

E così abbiamo creato l’autorità che genererà il certificato: dunque non è finita.

Creazizone di un certificato

  1. Aprire Accesso Portachiavi.app;
  2. Recarsi in Accesso Portachiavi -> Assistente Certificato -> Crea un certificato.

    Menù di creazione della CA

  3. Nella maschera appena comparsa specificare:

    a. Il nome del certificato;

    b. Tipo identità: Leaf;

    c. Tipo certificato: Firma codice;

  4. Selezionare CA or issuer dalla lista e premere Crea, premendo dunque Fatto.

Firma

Supponiamo di dover firmare libmodulo.so e che il certificato si chiami Alessandro.

Il comando da lanciare sarà dunque:

$ codesign --sign 'Alessandro' --force --keychain ~/Library/Keychains/login.keychain-db libmodulo.so

Backup articolo

Le note con cui ho redatto l’articolo si possono trovare seguendo questo link.

Referenze

Inviare un file attraverso seriale

Avevo necessità di inviare un file attraverso seriale, ed ho scoperto serio. Avevo già provato ad inviare un file con metodi alternativi:

  1. sz: non sono però mai riuscito ad impiegarlo, nonostante picocom lo impieghi di default per l’invio dei file;

  2. Convertire un file in base64, copiarlo e incollarlo.

Sono quindi incappato in questo script Python che lato end-device ha un solo requisito: echo deve avere il supporto a questi due flag: -e e -n.

Modifiche necessarie

Quello linkato è già un fork del progetto principale, con un branch dedicato al porting da Python 2 a Python3 (branch: python3). Sarà plausibilmente necessario modificare l’hashbang da #!/usr/bin/env python a #!/usr/bin/env python3.

Installazione

L’installazione richiede unicamente il clone del repository (o banalmente scaricarsi il file serio.py): $ git clone -b python3 https://github.com/mattmart3/serio

Richiederà inoltre di installare come dipendenza pyserial: consiglio dunque l’uso di un virtualenv apposito se non si vuole sporcare il sistema:

$ cd serio; python3 -m virtualenv serio_env && . ./serio_env/bin/activate
$ pip3 install pyserial

Utilizzo

./serio.py -s <file-da-inviare> -d <percorso-di-destinazione>

Importante: il percorso di destinazione deve includere il nome del file stesso.

Installare Qt 5.12 e Qt 5.9 con il Qt online installer

Stamattina ho rimosso l’ambiente 5.12.4. “Poco male, avvio Maintenance tool e lo reinstallo”: sorpresa! Lo hanno rimosso.

Le strade sono dunque due:

  1. Usare l’offline installer, dove al termine dell’installazione mi sono però ritrovato con un Maintenance Tool non aggiornato e privo di repository Qt (addio aggiornamenti);
  2. Ingannare il Qt Online Installer.

Non essendo riuscito ad ottenere ciò che volevo col metodo 1, ho provato ad ingannare il secondo.

Usare l’offline installer

Banalmente, scaricare l’installer opportuno per il proprio SO da qui per la 5.12.4 o da qui per la 5.9.9.

Ingannare il Qt Online Installer

I punti esplicitati nella guida sono:

  1. Installare un proxy HTTP che intercetti le richieste/risposte e ne permetta la modifica; a. Predisporre l’ambiente a catturare unicamente la regex che ci interessa.
  2. Configurare Qt Installer (dal pulsante impostazioni del tool stesso) affinché venga usato il proxy;
  3. Lanciarlo
  4. Attendere la GET e catturarne la risposta. La risposta è un JSON: modificarlo aggiungendoci, per ogni versione di Qt che vogliamo aggiungere, 2 entry: toolchain e documentazione.

Procedere all’installazione da GUI di Qt.

Guida pratica (qualora andasse offline)

Installazione del proxy

Installare e lanciare il proxy:

$ apt install mitmproxy && mitmweb

Si aprirà una pagina sul browser web. Andare nelle impostazioni del browser e configurare come HTTP e HTTPS proxy: 127.0.0.1:8080

Impostare dunque come regex: iapi\.qt\.io\/api\/v2\/repositories.+

Premere dunque nella pagina web di mitmproxy il pulsante blu “mitmproxy” -> Install certificates. Questo aprirà una pagina con alcune instruzioni da seguire per installare i certificati, che riassumo in:

  1. scaricare un file .pem;
  2. spostarlo in /usr/local/share/ca-certificates/;
  3. $ sudo update-ca-certificates.

Installazione

Avviare il Qt online installer e configurarlo (da pulsante in basso a sx) affinché usi come proxy 127.0.0.1:8080 (potrebbe essere necessario impostarlo anche per server FTP). Inserire le credenziali e proseguire.

A questo punto dovrebbe bloccarsi a “Fetching […]”. Andare sull’interfaccia del proxy: vi sarà una entry in arancione in sospeso. Cliccandoci sopra si aprirà la sezione “Flow” in alto nell’applicativo: premere su Resume.

Ora sarà arrivata la risposta da parte del server: nel riquadro a destra cliccare sulla scheda (tab) Response. Premere “Edit flow” (icona matita), copiare il JSON in un editor (o un beautifier) e aggiungere

{
    "action": "add",
    "categories": ["Latest releases", "Archive"],
    "name": "Qt linux-x86 Desktop Qt5.9.9 online repository",
    "releasedate": "2019-12-10T11:00:00.000Z",
    "url": "https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_599/"
}, {
    "action": "add",
    "categories": ["Latest releases", "Archive"],
    "name": "Qt Linux-x86 Qt5.9.9 src online repository",
    "releasedate": "2019-12-10T11:00:00.000Z",
    "url": "https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_599_src_doc_examples/"
}, {
    "action": "add",
    "categories": ["Latest releases", "Archive"],
    "name": "Qt Linux-x86 Desktop Qt5.12.12 online repository",
    "releasedate": "2021-11-24T11:00:00.000Z",
    "url": "https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_51212/"
}, {
    "action": "add",
    "categories": ["Latest releases", "Archive"],
    "name": "Qt Linux-x86 Qt5.12.12 src online repository",
    "releasedate": "2021-11-24T11:00:00.000Z",
    "url": "https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt5_51212_src_doc_examples/"
}

Inserire quindi il nuovo JSON come Response e proseguire premendo Resume. Una volta giunti alla schermata “Welcome” dell’installer, disattivare il proxy e continuare l’installazione normalmente dal Qt installer.

Conclusione

Maledetti.

From the future

This article comes from the future

Posuere cubilia Curae; Ut et est. Donec semper nulla in ipsum. Integer elit. In pharetra lorem vel ante.

Sed sed justo. Curabitur consectetuer arcu. Etiam placerat est eget odio. Nulla facilisi. Nulla facilisi. Mauris non neque. Suspendisse et diam. Sed vestibulum malesuada ipsum. Cras id magna. Nunc pharetra velit vitae eros. Vivamus ac risus. Mauris ac pede laoreet felis pharetra ultricies. Proin et neque. Aliquam dignissim placerat felis. Mauris porta ante sagittis purus.

Pellentesque quis leo eget ante tempor cursus. Pellentesque sagittis, diam ut dictum accumsan, magna est viverra erat, vitae imperdiet neque mauris aliquam nisl. Suspendisse blandit quam quis felis. Praesent turpis.

Hello world

This is my first article

Fermentum quis, feugiat imperdiet, imperdiet id, sapien. Phasellus auctor nunc. Vivamus eget augue quis neque vestibulum placerat. Duis placerat. Maecenas accumsan rutrum lacus. Vestibulum lacinia semper nibh. Aenean diam odio, scelerisque at, ullamcorper nec, tincidunt dapibus, quam. Duis vel ante nec tortor porta mollis. Praesent orci. Cras dignissim vulputate metus.

Phasellus eu quam. Quisque interdum cursus purus. In orci. Maecenas vehicula. Sed et mauris. Praesent feugiat viverra lacus. Suspendisse pulvinar lacus ut nunc. Quisque nisi. Suspendisse id risus nec nisi ultrices ornare. Donec eget tellus. Nullam molestie placerat felis. Aenean facilisis. Nunc erat. Integer in tellus. Mauris volutpat, neque vel ornare porttitor.