Il CMS? FDT! |
| Il CMS? Fai Da Te! |
Taaanto tempo fa, in una galassia lontana lontana, cominciai a scrivermi
il mio sito internet. Dato che sono un inguaribile control-freak, decisi
che il miglior modo per fare le cose e' di scrivere il tutto direttamente
in HTML puro con un bell'editor di testo. Niente cazzate. Il che va benissimo finche' si tratta di gestire un sito relativamente piccolo. Ma dopo un po' diventa un casino perche' se vuoi cambiare una virgola dell'impostazione del sito (tipo, lo stile del titolo), lo devi cambiare su tutte le pagine, il che e' lento, noioso e porta a commettere un sacco di errori. Vabbe', e' per questo che gli esseri umani hanno inventato i 'CMS' (Content Manglement System), che altro non sono che degli editor di testo specializzati per gestire il 'contenuto' in modo tale che l'autore possa concentrarsi sullo scrivere la roba e meno sull'organizzazione della cosa. Solo che... non sono riuscito veramente a trovarne uno che facesse quello che volevo io.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| E che voglio io? |
Percui un bel giorno mi sono seduto alla scrivania ed ho
buttato giu' un elenco di cosa dovrebbe fare il mio cms ideale.
Ok, una lista non troppo pretenziosa, giusto? Purtroppo tutti i CMS che ho visto non la contemplano. Quasi tutti i CMS che mi sono trovato a considerare sono 'tarati' per un tipico 'blog', cioe' una impostazione a 'post' consequenziali, suddivisi magari in categorie ed in date, ma sempre consequenziali. Il che va benissimo se vuoi un blog, ma va malissimo per me. Quello che effettivamente volevo io, era un sistema per poter avere dei 'blocchi' di testo standard da poter 'incorporare' o 'includere' in un 'template' in modo rapido, ed un paio di funzioni per 'elencare' il contenuto di alcune directory in modo formattato. Insomma una versione di 'Server Side Include ++'. Il risultato e' stato che mi sono messo li' ed ho scritto il mio CMS FDT (Fai Da Te).
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Enter the Dragon |
Ho cominciato con il pensare "come posso rendere il mio CMS il piu' possibile
invulnerabile ad attacchi di tipo SQL-Injection o root-kit?", ed ho rapidamente
deciso che il sistema migliore e' di avere la parte "passiva" (quella che legge
i dati e presenta la roba sul browser) separata dalla parte "attiva", cioe'
quella che consente all'autore/editore di aggiungere e gestire i contenuti. In questo modo, non c'e' modo per un eventuale 'cracker' di impastarmi il database perche' non c'e' nessuna "insert" o "update" nel codice da sfruttare. Tutte le funzioni di 'modifica' dei dati possono essere messe su un server differente e fare le modifiche off-line o protette da autenticazione. Il sistema sara' quindi composto da 3 parti:
Devo ammettere che ho tentennato un bel po' prima di decidermi ad aggiungere l'ultimo pezzo, semplicemente perche' i "commenti" non mi hanno mai interessato molto, ma alla fine ho ceduto e l'ho aggiunta. Per rendere le cose piu' semplici ho deciso che le 3 parti usano lo stesso file di configurazione, in modo che si configura una volta per tutte. Ho anche pensato se usare o meno un database, in effetti una versione 0.1 era priva di database ed usava semplici files di testo come base dati, ma alla fine ho deciso che la gestione risultava molto piu' rapida e semplice usando un database di backend. Dopo un po' di masturbazioni mentali ho deciso di usare la seguente struttura per il database:
Come si puo' vedere, io aborrisco la "notazione polacca" ed evito di chiamare le mie tabelle "tbl_xxx", perche' LO SO CHE SONO FOXXUTE TABELLE!. La struttura delle varie tabelle e' la seguente:
authors/includes/templates
Le tabelle authors, includes e templates hanno tutte la stessa struttura, per semplicita' di gestione ho deciso di tenerle in tabelle separate.
pages
Questa e' la tabella che contiene le vere e proprie 'pagine', come si nota, il template (tpl) e' definito nella singola pagina, questo mi consente di avere ogni pagina con un template suo. La lingua (lang) mi consente di avere lo stesso documento in lingua diversa. La chiave primaria della tabella (doc+id+lang) mi consente di dividere le pagine per 'documento' e 'lingua'. Notare anche che quella che io ho chiamato 'sezione' o 'directory' precedentemente e' riportata nella tabella come 'doc'. Perche' "doc"? Boh! E' uscita cosi'...
comments
Questa e' l'unica tabella ad avere una chiave primaria auto-incrementante, dato che io penso che siano una cattiva idea.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| All togheter now |
Come dovrebbe funzionare l'accrocchio? Mettiamo che l'URL sia del tipo http://.../questo/e/quello/pagina.html Lo script che processa il tutto si legge quale lingua il browser dell'utente preferisce facendo la scansione della variabile HTTP_ACCEPT_LANGUAGE che e' passata dal browser nella richiesta, quindi si legge quale documento il browser vuole e separa il PATH dal nome del documento vero e proprio (nel nostro esempio il path sarebbe questo/e/quello mentre il documento e' pagina.html). Il passo successivo e' cercare una pagina identificata da doc='questo/e/quello' e id='pagina.html' e con la lingua giusta. Se la pagine esiste nella lingua giusta, si legge il corrispondente record e si procede con l'elaborazione, se non esiste, si pesca la pagina con la lingua di default (se esiste) se non esiste manco quella occorre restituire un 'documento non trovato' o similare. Una volta trovato il record (o quello di 'non trovato'), si legge il contenuto della pagina (campo 'content') ed il template (tpl), quindi si carica il template indicato e si procede ad analizzare il template. L'unione del template e del contenuto produce la pagina vera e propria. La pagina (ed il template) possono contenere degli "include" (o 'autori') che vengono letti al volo ed inseriti. Il risultato viene rimandato al browser per la visualizzazione. E' importante notare in questa struttura che e' la pagina che indica quale template usare, ma e' il template che deve 'includere' il contenuto della pagina in qualche modo. Se il template non richiama il contenuto della pagina la pagina non viene mai visualizzata.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Cosa e' un Template |
Il template e' una pagina html, che stabilisce come i vari 'pezzi' della
pagina vengono visualizzati e dove. Il template puo' stabilire che un
certo 'header' viene visualizzato in una certa posizione, che vi sono due
(o piu') colonne e che il 'contenuto' vero e proprio viene visualizzato
in una certa posizione o meno. Cambiare il template significa cambiare
l'aspetto grafico e la composizione della pagina. Un template 'di esempio' potrebbe essere semplicemente qualche cosa del tipo:
<html> <head> <title><!--title--></title> </head> <body> <!--text--> </body> </html>Notare i 'segnaposti' come <!--title--> e <!--text--> , questi sono usati per dire al CMS dove mettere cosa, nel primo caso, il 'tag' viene sostituito con il titolo (preso dal campo 'title' della tabella) del documento, nel secondo caso, il contenuto del documento (preso dal campo 'content') viene inserito. Come si puo' capire, questo sistema lascia molto campo libero nel come fare le cose. Sopratutto quando si aggiunge la possibilita' di includere altri pezzi di documento. Un template piu' complesso potrebbe essere il seguente:
<html> <head> <title><!--title--></title> </head> <body> <!--include=top--> <table width=100%> <tr> <td> <!--include=leftcolumn--> </td> <td> <!--text--> </td> </tr> </table> <!--include=bottom--> </body> </html>Questo template definisce un header, un footer e due colonne, la colonna di sinistra e' presa da un include mentre la colonna di destra e' il contenuto vero e proprio della pagina.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Il codice della parte 'passiva' |
Ho deciso di scrivere il tutto in Perl. Perche' perl? Prima di tutto perche'
il 99.9% dei vari cms che ho visto in giro sono in php, e questo significa
che il 99.9% degli scassamarroni che potrebbero pensare di venire a
rompere i marroni conoscono il PHP, quindi usare qualche cosa di diverso
e' un altro modo semplice di ridurre i problemi. Il codice comincia con il leggere il file di configurazione e connettersi al database dopo di che procede a fare il parsing dei parametri passati e vede quale e' il documento da visualizzare, cerca il documento e carica in memoria il documento o un genrico 'notfound'. Quindi procede a caricare il template (o un template di default) ed al termine legge il template una linea alla volta. Se la linea non contiene nessun 'tag' speciale, viene visualizzata cosi' come e', se contiene un tag, il tag viene elaborato. Il tag '<--text-->' fa si' che il contenuto del documento venga elaborato nello stesso modo. Il documento risultante e' ritornato al browser. Di seguito le parti 'salienti' del codice con qualche commento. NOTA il codice e' stato scritto piu' per leggibilita' che per efficienza. Ricerca del linguaggio preferito dal browser (in ordine di importanza), se non si trova una corrispondenza, viene usato il linguaggio di default (definito nel file di configurazione).
# get the "preferred" languages from the browser, I'll check later if the
# language can be used or not.
my @lang;
my $x;
my $y=0;
foreach $x(split(/,/,$ENV{'HTTP_ACCEPT_LANGUAGE'})) {
$x=~s/(..).*/\1/;
$lang[$y++]=$x;
}
# if I got no languages, use the default one
if($y==0) {
$lang[0]=$deflang;
}
Prende l'url del documento e lo divide in 'path' e nome del documento
# get the 'section' from the document name (if any)
if( $doc =~ /\// ) {
$section=$doc;
$section=~s/^(.*)\/[^\/]+$/\1/;
$section=~s/^\///;
$section=~s/\/$//;
$doc=~s/.*\/([^\/]+)$/\1/;
# if no doc, get the default one
if( $doc =~ // ) {
$doc=$defdoc;
}
# if no section, get the default one
if ( $section =~ /^$doc$/ ) {
$section=$defsection;
}
} else {
# if there is no '/' in the URL, it can be a section or it can
# be a document in the root... try to locate a section with the
# same name.
if(thereisasection($doc)>0) {
$section=$doc;
$doc=$defdoc;
} else {
$section=$defsection;
}
}
Processa il documento, che puo' essere un template o un documento.
# process the document, that can be a template, a content or whatever
sub processdoc()
{
my $c=shift();
my @lines = split( /\n/, $c);
my $line;
my $group;
my $print;
my $prev;
my $next;
my $striphtml=0;
# process one line at a time
foreach $line (@lines) {
# replace some variables into the line
$print=1;
$line=~s/<!--title-->/$title/;
$line=~s/<!--data-->/$pdt/;
$line=~s/<!--DATE-->/$date/;
$line=~s/<!--DOC-->/\//;
# check if the line is an assignment and load the value
if($line=~/<!--[^=-]+-->/) {
my $var=$line;
$var=~s/^.*<!--([^=-]+)-->.*$/\1/;
if($FORM{"$var"}) {
$line=~s/<!--$var-->/$FORM{"$var"}/g;
}
}
# check if the line has special meanings
# pointer to a previous document
if( $line =~ /<!--prev-->/ ) {
$prev=&getprevious();
$line =~ s/<!--prev-->/$next/;
}
# pointer to a next document
if( $line =~ /<!--next-->/ ) {
$next=&getnext();
$line =~ s/<!--next-->/$next/;
}
# include an 'include'
if( $line =~ /<!--include=/ ) {
my $inc=$line;
$inc=~s/<!--include=(.*)-->.*$/\1/;
$inc=&include($inc);
&processdoc($inc);
$print=0;
}
# author's data
if( $line =~ /<!--author-->/ ) {
print &author($author);
$print=0;
}
# here goes the document/content
if( $line =~ /<!--text-->/ ) {
&processdoc($dc);
$print=0;
}
# show comments on this document
if( $line =~ /<!--comments-->/ ) {
&showcomments();
$print=0;
}
# process a list of pages
if($line=~/<!--process=/) {
$group=$line;
$group=~s/<!--process=(.*)-->.*/\1/;
&process($group);
$print=0;
}
# show a list of comments 'blog style'
if($line=~/<!--journal=/) {
$group=$line;
$group=~s/<!--journal=(.*)-->.*/\1/;
&journal($group);
$print=0;
}
# list a series of pages
if($line=~/<!--list=/) {
$group=$line;
$group=~s/<!--list=(.*)-->.*/\1/;
&list($group);
$print=0;
}
# turn on or off html-tag stripping, useful for the '<pre>'
# block
if($line=~/<!--HTML-->/) {
if($striphtml==1) {
$striphtml=0;
} else {
$striphtml=1;
}
$print=0;
}
# no special meanings? print the line!
if($print) {
# should I strip html-tags?
if($striphtml==1) {
$line=~s/</& lt;/g;
$line=~s/>/& gt;/g;
}
print "$line\n";
}
}
}
Da notare in questa sezione: all'inizio, la linea viene processata per sostituire certi tag con dei valori precalcolati (la data di sistema, la data di pubblicazione...), quindi ogni linea viene processata una alla volta ed eventuali tag sono rimpiazzati con altre cose. In particolare i tag <--prev--> e <--next--> sono sostituiti con due hyperlink che puntano rispettivamente al documento successivo e precedente, perche' questo funzioni il nome del documento deve essere del tipo 'nomeNNN' dove 'NNN' e' un numero progressivo. Legge un blocco di testo dalla tabella "authors", dato che gli "includes" sono identici, si puo' desumere come sia l'equivalente funzione "include".
# load a bit of text from the authors' table
sub author()
{
my $q="select content from $auth where id='".$author."' and ";
$q.="lang='".$slang."'";
my $sth=$dbh->prepare($q);
$sth->execute;
my $r=$sth->fetchrow_hashref();
my $dc=$r->{'content'};
$sth->finish();
return $dc;
}
Produce una lista dai titoli delle pagine, utile per creare elenchi di link cliccabili. Una funzione similare e' la 'process()' che fa la stessa cosa ma applicando una diversa formattazione.
# generate a list of pages from the db
sub list()
{
my $group=shift();
my $q="select title,doc,id from $pages where doc='".$group."' and ";
$q.="lang='".$slang."' and id!='index' and pub=1 order by id,pdt";
my $sth=$dbh->prepare($q);
$sth->execute;
while( my $r=$sth->fetchrow_hashref()) {
print "<a href='/".$group."/".$r->{'id'}."'>";
print $r->{'title'};
print "</a><br>\n";
}
$sth->finish();
}
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Il codice della parte 'attiva' |
Il codice della parte attiva e' sempre scritto in perl. Sempre scritto piu' per
esaltare la leggibilita' che altro. Non ci sono particolari salienti, dato che
non devo elaborare niente ma solo presentare a video i dati ed eventualmente
accettare qualche input (via textarea) per inserire il contenuto. Il codice e' un po' troppo lungo per commentarlo, e comunque non contiene niente di eclatante.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Commenti |
Dopo un po' ho deciso di aggiungere anche la gestione dei commenti, per fare
cio' ho deciso di tenere l'aggiunta dei commenti separata dal codice passivo
ed attivo, quindi ho scritto uno script ad-hoc solo per aggiungere il
commento alla tabella. Il commento e' identificato da un id autoincrementante
ed e' "agganciato" al documento dal suo ID che e' l'id del documento (doc+id)
con tutte le '/' rimosse dal nome. Per costruire l'ID del documento la mia form di inserimento legge l'ID della pagina (fornito dal CMS stesso sotto forma del tag '<!--doc-->'), la form di inserimento deve quindi contenere un campo 'hidden' del tipo:
<input type='hidden' name='id' value='<!--doc-->'> L'unica cosa che ho fatto per prevenire lo spam e' stata passare il contenuto a SpamAssassin. Ho anche notato un certo 'trend' nella robaccia che arrivava, quindi un piccolo cambiamento nel codice mi ha consentino di rimuovere il 100% dello spam via commenti senza problemi. Almeno fino ad ora... ultime parole famose eh? Perche' il tutto funzioni correttamente, il sistema si aspetta anche di avere 3 pagine di 'risposta', una 'good' per i commenti corretti, e due 'bad' (bad e bad2) per i commenti sbagliati/troppo lunghi.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Basta co' ste' caxxate! |
Ok, download, installazione e testing. Scaricate il codice ed altra roba da qui. Per usare il codice vi serve PERL (doh!), con i seguenti moduli aggiuntivi: CGI, Mail::SpamAssassin, Date::Format, Date::Parse e Config::General. No, non c'e' nessun 'install' che faccia il lavoro per voi, dovrete andare di CPAN ed installare i moduli richiesti se non li avete. Vi serve MySQL, ovviamente, insieme al codice del CMS c'e' un file .sql per riempire il database con dei dati di prova. Il database di esempio contiene due templates e due pagine, la pagina 'notfound' di default ed una 'home page'. Create un database, importate i dati, assegnate un'utente con diritti di lettura e scrittura e buon divertimento. Mettere doc.pl, doc.conf, s1.pl e c2.pl nella vostra cgi-bin, assicuratevi che siano eseguibili. Modificate doc.conf in modo che punti al database giusto con lo username e la password giusta. Come test, richiamate semplicemente dalla linea di comando ./doc.pl, dovreste vedere una caterva di roba a video (la pagina di default), se vedete invece degli errori leggeteli e cercate di risolvere il problema (vi manca qualche pezzo di perl, il path di perl e' sbagliato nello script, l'utente che avete impostato nella configurazione non e' in grado di leggere il database). Se volete usare SpamAssassin per verificare i commenti ricordatevi di creare la directory .spamassassin per l'utente che esegue il web server e di creare un file di configurazione user_prefs per controllare cosa viene bloccato e cosa no. Suggerisco di tenere MISSING_HB_SEP, MISSING_HEADERS e MISSING_SUBJECT a zero, in quanto i commenti non hanno headers ne' soggetto... Se tutto funziona, provate a richiamare lo script via browser digitando http://ilvostrositoqui/cgi-bin/doc.pl, dovreste vedere la vostra pagina. Se volete fare le cose di fino, potete usare mod_rewrite e mod_proxy per ottenere una riscrittura 'trasparente' dell'url. Una cosa cosi':
RewriteCond %{REQUEST_URI} /.*\.html$
RewriteCond %{REQUEST_URI} !/img.*$
RewriteCond %{REQUEST_URI} !/images.*$
RewriteRule ^/(.*)\.html$ /$1 [R]
RewriteCond %{REQUEST_URI} !/cgi-bin.*$
RewriteCond %{REQUEST_URI} !/icons.*$
RewriteCond %{REQUEST_URI} !/img.*$
RewriteCond %{REQUEST_URI} !/image.*$
RewriteCond %{REQUEST_URI} !.*\.zip$
RewriteCond %{REQUEST_URI} !.*\.gz$
RewriteCond %{REQUEST_URI} !.*\.bz2$
RewriteCond %{REQUEST_URI} !.*\.img$
RewriteCond %{REQUEST_URI} !.*\.rss$
RewriteRule ^/(.*)$ /cgi-bin/doc.pl?doc=$1 [P,NE,L]
Esegue la riscrittura trasparente degli URL, in modo che un url come http:///ilvostrosito/ viene automaticamente riscritto come http://ilvostrosito/cgi-bin/doc.pl e richiama il CMS in automatico. Vi consiglio di proteggere con password la parte 'attiva' del cms, usando una semplice regoletta come la seguente in .htaccess o nel file di configuazione di Apache: <FilesMatch "c.\.pl"> AuthType Basic AuthName "CMS Interface" AuthUserFile /dove/volete/htpasswd Require valid-user </FilesMatch> Create il file htpasswd (ovviamente) ed in questo modo la parte attiva sara' protetta da occhi e mani indiscrete.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bugs e problemi noti |
Il sistema non funziona se il database e' vuoto (!), come minimo ci devono
essere una pagina di 'notfound', un template di default ed una pagina di
default. Se si fanno cazzate (tipo mettere un tag 'text' nel documento), si possono creare dei cicli infiniti, il che puo' mandare in palla il sistema. Questo e' un bug noto, che ho pensato inizialmente a come risolvere ma alla fine ho lasciato li'. L'editor e' estremamente limitato, in effetti e' cosi' limitato da essere quasi inutile come editor. Questo perche' io non voglio un editor. Di solito cio' che faccio e' scrivere le pagine con un vero editor (tipo VIM), aggiungendo i tag che voglio, vedo come salta fuori la pagina aprendola direttamente con un browser, faccio tutte le correzioni del caso e quando sono soddisfatto faccio un bel copy & paste direttamente nel database.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Addendum e correzioni |
Il problema del doppio tag <--text--> e' risolto, adesso solo il primo
tag e' gestito, i successivi sono semplicemente ignorati. Un bug nella gestione delle lingue e' stato corretto, precedentemente solo la prima lingua richiesta dal browser era gestita, adesso anche le successive. Quindi se una delle lingue per cui esiste un documento e' nell'elenco richiesto dal browser quella lingua sara' selezionata. Per evitare problemi con i tag HTML nell'editing, ho aggiunto una funzione 'download' che consente di visualizzare il contenuto della pagina in formato plain-text, in questo modo eventuali tag non sono alterati. Ho aggiunto un tag <!--whatsupdoc=sezione--> che consente di avere gli ultimi due documenti pubblicati nella sezione indicata, questo mi consente di avere gli "ultimi aggiornamenti" in primo piano senza diventare matto a cercarli.
|
|
Comments Max length of comments: 1000 chars. |
22 commenti Daniele Levi dice il 15/07/2008 19:47: Bello, e mi pare anche efficace in relazione all'obbiettivo. Proverò a spippolare un pò e vedere (così per sport) di usarlo su sistemi Microzzozz... Ciao DL Sabrina dice il 22/07/2008 17:59: Ah ecco perché funziona, lo hai fatto tu! si, be'... dopo aver corretto vari bugs... Per la cronaca io ci sono cascata e prima di leggere qui sono andata su google a cercare "cms fdt". non sei la sola Claudio dice il 27/07/2008 08:54: Mi associo a Sabrina ... pure io ci sono cascato Cristiano dice il 27/07/2008 19:02: Leggendoti spesso e avendo una certa esperienza con il web, seppur limitata essendo ancora studente all'Università ad Alessandria, mi è sembrato molto ironico che tu utilizzassi qualcosa di "famosissimo" (leggi attacchi lamer) e poi FdT mi ispirava qualcosa del tipo "Fattelo da Te", ma a quanto pare ho sbagliato di poco! Grazie per le tue storie, sono sempre molto seguite! E grazie anche per il sorgente, non conosco Perl ma sono sempre ansioso di conoscere nuovi linguaggi! A lunedì ;-) Simone dice il 29/07/2008 01:24: beh, le cose fatte in proprio sono le migliori a volte :) una domanda: con che licenza hai rilasciato i sorgenti del tuo cms fdt? quella di uccidere... perchè se avessi voglia di modificarlo per me potrebbe bastare citarti come "ispirazione", ma se poi qualcun'altro prendesse da me i sorgenti (non mi sembrerebbe giusto nei tuoi confronti non rilasciare le modifiche)? quajo', fai un po' come ti pare, io i sorgenti li distribuisco agratisse, basta che nessuno venga da me a lamentarsi Luca dice il 02/08/2008 08:07: Eccomi, cercato CMS FdT su google, due volte.... Nik dice il 04/08/2008 09:29: ecco cosa $fallo è il FdT!!!! mavainc... si dice ca$$o, non $fallo snizzo dice il 08/08/2008 14:08: ti seguo da quando avevo 14 anni! sei fortissimo, una vera filosofia di vita! comunque io sono uno a cui piace farsi le cose da solo... cioè, so che sono uno sciocco a reinventare la ruota ogni volta però mi viene spontaneo. tipo quando uso ajax nei miei siti web uso delle librerie scritte tutte da me. anche io ho fatto un cms 2.0 orientato alla community e rilasciato sotto la TRT CuIo license (cioè fanne che ghez vuoi) posso mandarti un link? tanto poi mi smonti in 1 sec xD └┴┬┐ dice il 18/08/2008 16:43: Io pensavo fosse un CMS fatto a membro di labrador, e che la 'f' FdT stesse quindi per 'figlio'. Meglio così, almeno se ti da problemi non devi chiamare nessuno per aggiustarlo. argaar dice il 26/08/2008 14:04: ho scaricato e installato il tuo cms... stamattina sapendo già di nn avere un ca$$o da fare mi sono detto..."ora rifaccio tutto il mio cms (phpnuke drasticamente sventrato per tenere solo 3 cose)" e invece, dopo aver cercato invano di scaricare cercando su google sto cmsfdt, leggo questa pagina..faccio tutto quello che dici...e...funziona! (e me l'aspettavo) ma...sopratutto è stupendo...peso=0 velocità enorme e soprautto pure l'interfaccia per l'insert delle pagine, già mi andava cmq bene di fare le pagine a mano usando phpmyadmin, ma così è ancora più semplice...sei un grosso!!!!! grassie. BabboMatteo dice il 27/08/2008 12:10: Io lo faccio oggi... e NON ci sono cascato, NON ho cercato cmsfdt su google (pero' potresti indicizzarlo... :P) veramente, se io cerco 'cms fdt' su google, la mia pagina e' il terzo o il quarto risultato... e NON ho dubbi che funzionera'... Grande D.! grazie argaar dice il 28/08/2008 09:53: se cerchi cmsfdt tutto attaccato è il primo record... comunque a funzionare funziona, ho un dubbio però, siccome sul mio hosting di m***a è installato ogni modulo perl esistente TRANNE i 4 da te citati (Config::General, Date::Parser, Date::Format, Mail::SpamAssassin) c'è la remota possibilità di far funzionare il tuo programma in qualche altra maniera? Config::General e' usato per leggere il file di configurazione, se non c'e', l'alternativa e' copiare i parametri nel codice (in tutti i .pl) e quindi ignorare il file di configurazione. Date:: dovrebbe esserci sempre, che cappero di installazione di Perl e' se non hai Date:: ?? Comunque viene usato per la gestione della data (date2str et simila), per SpamAssassin e' usato solo dal modulo di aggiunta dei commenti, rimuovilo e non serve piu'. argaar dice il 28/08/2008 12:58: cit. <i>che cappero di installazione di Perl e' se non hai Date:: ??</i> è quello che mi chiedo anche io, la risposta del servizio di hosting dice che non possono metterlo per non minare la stabilità del sistema con pacchetti di terze parti, e dopo mio appunto sul fatto che il pacchetto NON E' di terze parti hanno detto che "valuteranno la possibilità di includerlo di default sui server"...come a dire...si si sta buono forse lo metto intanto ti attacchi, va beh vedrò...in caso trovo cosa farci col sito e prendo un server vps così ci metto quello che dico io skorpion dice il 04/09/2008 16:28: ehm... veramente FdT sta per forumdeitroll. sono sicurissimo che puoi inventarti qualche cosa di meglio
Comunque dopo aver letto gli scarabocchi che stanno nei sorgenti dei vari cms per i miei progetti web uso una struttura di questo genere. In questo modo ho le fx principali "centralizzate" odio il copia-incolla cmq davide, hai litigato con php da bambino, o sei follemente innamorato di perl? no, ci sto litigando tutti i giorni con il PHP e con tutti gli ex-vbscriptisti-aspisti che si sono riciclati in 'guru' del PHP. Cosi' ti ritrovi con una merdacchiosa applicazione che assorbe il 210% del processore facendo 1000 query per visualizzare una jpeg. Lichene dice il 08/09/2008 14:37: skorpion dice il 04/09/2008 16:28: > ehm... veramente FdT sta per forumdeitroll. Ho pensato anch'io immediatamente ad un CMS fatto dal sarru, ma dato che quel bamba non rilascia manco i suoi post più trolleschi con licenze libere o peggio senza licenze, poi in perl... :/ Avvelenato (TM) dice il 08/09/2008 15:41: OMG!!! wtf? VomS dice il 25/09/2008 01:25: Sei un'animale informatico...,leggo da anni le tue storie,ti stimo molto e un pò ti invidio :P,ho detto ciò che dovevo dirti ed anche se a te non interessa l'ho detto comunque. A presto! P.S. Sei un grande! Antonio Pennino dice il 06/10/2008 13:43: Non ho capito molto... forse perche' non conosco il perl e nemmeno l' html. Vorrei capire una cosa: e' possibile usare il tuo strumento con una minima conoscenza di html? Grazie. cosi' a naso risponderei di no Cymon dice il 19/10/2008 01:30: Sono commosso per l'uso di perl, visto che esserne un fan mi porta ad essere emarginato in questo mondo di gente che si da al piaccapì che è tanto di moda bello e simpa. Solo due appunti: 1) Non era il caso di usare HTML::Template che fa diverse delle cose che hai implementato? Quando l'ho visto avevo gia' finito 2) Praticamente la struttura "a directory" la vedi solo da un punto di vista delle chiamate al server, corretto? In verità, ad aprire le budella dei dati non la si ritrova visto che è tutto nei campi doc del database... Mmmmmh, mi spiace, ma non mi piace moltissimo... A che scopo strutturare il database in un modo 'gerarchico' quando ottieni lo stesso risultato dal punto di vista operativo? BJB dice il 17/11/2008 19:55: ...all'inizio credevo che FdT volesse dire: Figlio di Tr..a :-) BJB dice il 18/11/2008 01:07: no, a parte le cazzate, peccato che in html non si possono usare gli "include" o cose del genere.... semplificherebbe la modifica di un menu in un sito chiaramente non troppo grande... E' per quello che esistono i SSI (server side include). giulio dice il 28/11/2008 14:27: Interessante ... anch'io ho realizzato un gecko che mi consente di visualizzare delle pagine complesse , mettendo delle variabili Perl nel codice html. La differenza nella ricerca consiste nell'usare eval e di non avere limiti nella possibilità di creare. huh? Al momento nonostante molti attacchi non ho mai avuto problemi di hacker. Anche perchè non uso DB !!! Chi è curioso può vedere il timido "risultato" qui : www.perquelliche.it. La presenza o assenza di un db non ha niente a che fare con l'hackabilita' o meno di un sito
Molto interessante la parte degli articoli ... appena posso vedo di implementarla anche sul mio sito ma ... il tempo è tiranno...
PS: anch'io sono stato tenteto di andare su google a vedere !!! Add a comment (max 1000 chars)
|
| Author |
Davide Bianchi,
works as Unix/Linux administrator for a "network security" company of Haarlem. Contacts: mail: davide AT onlyforfun.net , ICQ: 268751033, Jabber: davideyeahsure AT gmail.com Skype: davideyahsure |
| Contribuire | Volete contribuire? Leggete come! |
| Copyright | This site is made by me with blood, sweat and gunpowder, if you want to republish or redistribute any part of it, please drop me (or the author of the article if is not me) a mail. |
This site isn't optimized for vision with any specific browser, nor
it requires special fonts or resolution.
You're free to see it as you wish.
Last Update: 04/12/2008