InstantFpc
Per chi non lo conoscesse, InstantFpc è uno strumento che permette di “lanciare” dei sorgenti pascal come fossero degli script, solo che – prima del loro lancio – provvede a compilarli in modo trasparente.
Ovviamente è uno strumento che lavora su tutte le piattaforme target di fpc, come Linux, Mac e Windows.
Questa funzionalità nasce nel mondo Unix ed il meccanismo è piuttosto semplice: se un file di testo ha impostato il permesso di esecuzione, allora viene cercata la presenza – nella prima linea – di un commento particolare chiamato shebang che, se esiste, viene inteso come il percorso dell’interprete da utilizzare per eseguire lo script stesso.
Il Free Pascal,lo sappiamo, non è interpretato ma compilato. Tuttavia InstantFpc sfrutta il meccanismo dello shebang che, abbinato ad una cartella cache per la compilazione, permette di eseguire un file .pas come fosse uno script.
Lo shebang deve essere presente, come già detto, nella prima riga dello script e nel nostro caso è il seguente:
#!/usr/bin/instantfpc
Come introduzione penso sia sufficiente, per maggiori informazioni rimando alla documentazione ufficiale che trovate nel link: https://wiki.freepascal.org/InstantFPC.
InstantFpc e Cgi Apache
La tecnologia CGI nell’ambito della programmazione web oramai la conosciamo, è diffusa da veramente molti anni.
Non è sicuramente la tecnica più performante ma certamente ha alcuni vantaggi:
- è semplice da usare
- ogni CGI è già isolato in memoria per design
Fare CGI con InstantFpc/fpc ci porta a fare qualche considerazione:
- possibilità di riutilizzo del codice che si è già sviluppato
- possibilità di usare tutte le funzionalità di fpc e dei suoi sorgenti
- generazione di binari eseguibili nativi
- un CGI FreePascal è sicuramente più lento in partenza di un modulo di Apache (anche perché la prima volta deve essere compilato), tuttavia, una volta in memoria, credo che abbia dalla sua sia la velocità di esecuzione che il basso uso di risorse
- spesso leggo nei forum che una certa applicazione web (ora mi riferisco a linguaggi tipo PHP, Python e simili) è diventata troppo lenta e si cerca qualcosa per compilarla; in molti casi si cerca un transpiler che traduca il tutto in C/C++ per poi compilarlo… Spesso è un lavoro arduo e non sempre si ha successo. Con InstantFpc abbiamo già la versione compilata: possiamo scegliere se fare il deploy dei sorgenti o dei binari (e non c’è bisogno di transpiler o altri artifici).
Installazione e configurazione di InstantFpc per Apache
Credo che se state leggendo questo articolo, fpc ed InstantFpc siano già installati.
Basta verificare la presenza di IstantFpc con il seguente comando:
$ instantfpc -v
ifpc 1.3
Come root, creiamo ora la cartella di cache per poter far lavorare con Apache:
# mkdir /var/apacheinstantfpc
# chmod 777 /var/apacheinstantfpc
# ls -lh /var
…
drwxrwxrwx 2 root root 4,0K 7 nov 16.21 apacheinstantfpc
…
Nota:
I permessi 777 per la cartella di cache sono solamente per prova, una volta che tutto funziona andrebbero ristretti.
Configurazione di Apache
Prepariamo quindi la configurazione per Apache.
La configurazione descritta sotto è realizzata su Linux Devuan: è sicuramente identica per tutta la famiglia di Debian, Ubuntu e derivate e comunque sia simile per le altre distribuzioni GNU/Linux.
Per chi usa Windows e/o installazioni tipo LAMP/WAMP, bisogna cercare la cartella “/etc/apache2/sites-available”.
Seguendo i consigli che si possono trovare nel link precedente, ho creato un file di configurazione che ho chiamato “001-cgi-instantfpc.conf” nella cartella /etc/apache2/sites-available.
Segue il contenuto:
ScriptAlias /mod4/ /var/www/mod4/ <Directory "/var/www/mod4"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all SetEnv INSTANTFPCCACHE /var/apacheinstantfpc # You can put fpc options into /etc/fpc.cfg or here: #SetEnv INSTANTFPCOPTIONS -Fu/path/to/somevar/ppufiles # If this is root directory, you might have to set: #Require all granted </Directory>
Quello che ci interessa sapere è che gli URL che contengono “/mod4/” (che è un prefisso di fantasia e modificabile a piacere) saranno abilitati all’esecuzione di CGI contenuti nella cartella “/var/www/mod4” (anche questa modificabile a piacere).
Notare anche la definizione della cartella di cache per InstantFpc.
Verifichiamo il file:
Verifichiamo il file: # ls -l /etc/apache2/sites-available/ … -rw-r--r-- 1 root root 432 6 nov 18.54 001-cgi-instantfpc.conf …
Ora che tra i siti “disponibili” (sites-available) abbiamo creato la nostra configurazione, non resta che metterla tra gli “abilitati” (sites-enabled).
Per fare questo bisogna eseguire da shell il seguente comando:
# ln -s /etc/apache2/sites-available/001-cgi-instantfpc.conf /etc/apache2/sites-enabled/001-cgi-instantfpc.conf
Verifichiamo che tutto sia impostato correttamente con il comando:
# ls -l /etc/apache2/sites-enabled
che dovrebbe mostrare un output simile al seguente:
… lrwxrwxrwx 1 root root 52 6 nov 17.01 001-cgi-instantfpc.conf -> /etc/apache2/sites-available/001-cgi-instantfpc.conf …
Creiamo la sottocartella mod4 in /var/www ed aggiustiamo I permessi
# cd /var/www # mkdir mod4 # chmod 755 mod4 # ls -lh totale 16K drwxr-xr-x 2 root root 4,0K 2 nov 18.21 html drwxr-xr-x 2 root root 4,0K 7 nov 16.24 mod4
Non ci resta che abilitare i cgi:
# a2enmod cgi
Riavviate ora Apache e, se non ci sono errori, nel riavvio possiamo andare avanti.
Test CustomCgiApplication
Prepariamo quindi il CGI.
Spostiamoci ora nella cartella mod4:
# cd /var/www/mod4
Creiamo il file showenv.pas e salviamolo con il seguente contenuto (notare che la keyword program è opzionale con InstantFpc):
#!/usr/bin/instantfpc {$mode objfpc}{$H+} uses SysUtils; var i: Integer; begin writeln('Content-type: text/html'); writeln; writeln('<HTML><BODY>'); for i:=0 to Paramcount do writeln('Param ',i,' ',ParamStr(i),'<br>'); for i:=1 to GetEnvironmentVariableCount do writeln('Env ',GetEnvironmentString(i),'<br>'); writeln('</BODY></HTML>'); end.
Impostiamo i permessi e verifichiamo il tutto:
# chmod 755 showenv.pas # ls -lh … -rwxr-xr-x 1 root root 364 6 nov 17.18 showenv.pas ...
A questo punto possiamo testare il nostro CGI aprendo un browser ed inserendo nella barra degli indirizzi:
http://127.0.0.1/mod4/showenv.pas
Dovremmo vedere il risultato dello script.
Buono sviluppo a tutti.