Archivio autore: 61ll35

CICADA 3301

Sapete la storia di Cicada 3301?

..No??

Ecco la pagina wiki e un bellissimo articolo.

Juhan mi ha proposto di scrivere un articolo a riguardo, ma purtroppo il tempo è poco  già adesso devo scappare…:(

Così invece di dilungarmi a raccontarvi la storia, (1. avete i link da cui attingere 2. che noia ripetere cose già dette da altri!! ) ho pensato di proporvi una sfida.

Tranquilli, non è un granchè, ci riuscirete molto facilmente.

Non mi resta che augurarvi buona fortuna, ammonirvi di usare con discrezione ciò che scoprite, e tra le righe, quello di sentirvi molto presto 😉 ….

okp1

out

Ricevere notifiche su Whatsapp quando finisce uno script:il download di un video su youtube

Sono sempre stato un downloader compulsivo e ora ho scritto uno script che mi avvisa su whatsapp quando un download -o uno script- finisce.

Può essere l’installazione di un programma molto pesante, il download di una iso con wget, o (questa non l’ho ancora fatta) avvisare della temperatura della stanza (se abbinato con un cronjob e un sensore).

Se non avete paura della mia soluzione molto incasinata, ecco come faccio.

Installiamo subito un programma che tramite riga di comando ci consente di scaricare dei video da internet


sudo apt-get install youtube-dl

Poi creiamo una cartella “video” che conterrà i file scaricati

mkdir /home/$USER/video

Per prima cosa dobbiamo  installare da github una libreria che ci consenta l’accesso da programma ai server whatsapp.

Si chiama YOWSUP-CLI,  per installarla e configurarla questo l’url

Io ho seguito il tutorial qui presente

Mi raccomando, vi conviene registrarvi con un numero di telefono dove NON avete Whatsapp.

Se avete genitori o nonni, prendete in prestito il loro telefono, ma non usate il vostro numero con cui siete registrati su whatsapp.

Si può programmare in python, ma non conosco bene questo linguaggio, e promette di inviare anche foto (cosa che non sono riuscito a fare, appunto per il motivo di cui sopra)

Quando trovo su Youtube un video che mi piace e voglio scaricare apro un file di testo “list” e ci copio dentro l’URL.

In effetti questo è un file che contiene degli url separati da un a capo.

Ho scritto poi un programma in C  “youload.c” che legge da questo file “list” e genera in output un file “list.sh” e poi lo esegue.

Non chiedetemi perchè ho dovuto ricorrere a questo stratagemma: sono passati diversi mesi e non me lo ricordo più 😉

Sono ricorso all’aiuto di StackOverflow per leggere dal file “list” e memorizzare nella variabile  “line” ogni riga di quel file, dove riga è sinonimo di URL di un video, come intuite.

Successivamente poi nel programma apro il file “list.sh” che è uno script, e da programma C ci scrivo  i comandi che sono necessari affinchè questo script generato automaticamente scarichi ciò che voglio e mi notifichi dell’eventuale successo.

Alla fine del programma eseguo materialmente lo script generato tramite il comando


system("./list.sh");

Affinchè questo programma funzioni dovete sostituire IL_MIO_NUMERO_DI_WHATSAPP e IL_MIO_USERNAME con il vostro numero telefonico e l’username con cui siete loggati al pc.

 


//questo programma si chiama youload.c

#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
void strip(char *s) {
char *p2 = s;
while(*s != '\0') {
if(*s != '\t' && *s != '\n') {
*p2++ = *s++;
} else {
++s;
}
}
*p2 = '\0';
}
int main(void)
{
char buf[80];
FILE *fp;
char *line = NULL;
size_t len = 0;
ssize_t read;
FILE *sh;
sh = fopen("list.sh","w");
fp = fopen("list", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1) {
fprintf(sh,"youtube-dl ");
fprintf(sh,"%s", line);
strip(line);
fprintf(sh,"page=$( wget \"%s",line); // "\b" perchè %s,line aggiunge un ritorno a capo che non mi serve
fprintf(sh,"%c\" -O youtube)\n",0x08);

fprintf(sh,"echo -n \"Finito il download di %c\"\" >> whatsapp\n",0x5c); //hex value per "\"

fprintf(sh,"awk -vRS=\"</title>\" \'/<title>/{gsub(/.*<title>|%cn+/,\"\");print;exit}\' youtube >>whatsapp\n",0x5c);

fprintf(sh,"echo \"%c\" alle ore \" >>whatsapp\n",0x5c);

fprintf(sh,"echo $(date +\"%T\") >>whatsapp\n");

fprintf (sh,"echo \" del \" >>whatsapp\n");

fprintf(sh,"date +\"\%cd/\%cm/\%cy\">>whatsapp\n",0x25,0x25,0x25); //0x25=hex value di %
fprintf(sh,"a=$(cat whatsapp | tr -d \"");
fprintf(sh,"%cn\"",0x5c);
fprintf(sh,")\n");

fprintf(sh,"yowsup-cli --send 39IL_MIO_NUMERO_DI_WHATSAPP \"$a\" --config /home/IL_MIO_USERNAME/yowsup-master/src/yowsup-cli.config\n");
fprintf(sh,"rm whatsapp\n");
fprintf(sh,"rm youtube\n");
}
fprintf(sh,"yowsup-cli --send 39IL_MIO_NUMERO_DI_WHATSAPP \"Per oggi abbiamo finito!!\" --config /home/IL_MIO_USERNAME/yowsup-master/src/yowsup-cli.config\n");
fclose(sh);
fclose(fp);
if (line)
free(line);
system("cd /home/IL_MIO_USERNAME/video");
system("./list.sh");
exit(EXIT_SUCCESS);

}

Creo anche un altro file “whatsapp” che mi aiuta nella costruzione della stringa finale. Per l’utilità leggere più in basso

Non avete capito niente, lo so e anch’io adesso non ricordo l’iter che mi ha portato a questo procedimento, ma se apriamo lo script che viene generato da questo programma “list.sh”, capiamo subito un po’ di più.


//questo file script "list.sh" è stato generato automaticamente da youload.c

youtube-dl https://www.youtube.com/watch?v=URL_DEL_VIDEO
page=$( wget "https://www.youtube.com/watch?v=URL_DEL_VIDEO" -O youtube)
echo -n "Finito il download di \"" >> whatsapp
awk -vRS="</title>" '/<title>/{gsub(/.*<title>|\n+/,"");print;exit}' youtube >>whatsapp
echo "\" alle ore " >>whatsapp
echo $(date +"%T") >>whatsapp
echo " del " >>whatsapp
date +"%d/%m/%y">>whatsapp
a=$(cat whatsapp | tr -d "\n")
yowsup-cli --send 39IL_MIO_NUMERO_DI_WHATSAPP  "$a" --config /home/MIO_USERNAME/yowsup-master/src/yowsup-cli.config

la riga


page=$( wget "https://www.youtube.com/watch?v=URL_DEL_VIDEO" -O youtube)

awk -vRS="</title>" '/<title>/{gsub(/.*<title>|\n+/,"");print;exit}' youtube >>whatsapp

mi serve per risalire al titolo del video su Youtube. Grazie StackOverflow!

vedete la riga


yowsup-cli --send 39IL_MIO_NUMERO_DI_WHATSAPP  "$a" --config /home/MIO_USERNAME/yowsup-master/src/yowsup-cli.config

usiamo il nome del programma senza “./” per eseguirlo. Ciò significa che è diventato un programma di “sistema”, perchè abbiamo copiato tutto il contenuto di yowsup-master/src in /usr/bin.

 

ESEMPIO

ecco il contenuto di “list”

list

ecco il contenuto di “list.sh”

sh

Ed ecco uno screenshot di whatsapp sul telefono

okpwz

NON BIASIMATEMI PER I TITOLI DEI VIDEO: dovevo controllare semplicemente se funzionava, e ho scelto i filmati più brevi.

Che cosa vi sembra?

Commentate numerosi, perchè so di non essere stato chiaro -ho scritto in fretta- !

Grazie dell’attenzione

61LL35

Due immagini identiche non proprio uguali….

Salve cari amici di Ok,panico!

Sono sempre stato affascinato dal mondo della crittografia e in special modo degli algoritmi informatici e oggi vorrei presentarvi un modo per celare del testo dentro ad un’immagine .bmp .

Questa tecnica, che è diversa dalla crittografia in quanto questa cifra un messaggio rendendolo incomprensibile a tutti quelli che non hanno la chiave, si chiama “steganografia” e si limita a nascondere un messaggio alla vista, senza necessariamente crittografarlo.

L’ideale sarebbe perciò un mix di queste due tecniche!!!

Ho cominciato ad appassionarmi a queste tematiche leggendo l’ ottimo libro di Simon Singh “Codici e segreti” , edito da Rizzoli.

Qui viene narrato (….vado a memoria…) che un greco scrisse un messaggio sulla testa rasata di un suo schiavo, aspettò che gli crescessero i capelli e  gli ordino di recarsi  nella città del suo amico destinatario. Qui, le guardie preposte lo perquisirono, ma non trovarono niente. L’amico riuscì invece a leggere il messaggio semplicemente tagliando i capelli dello schiavo.

….Un po’ come l’inchiostro simpatico…

Veniamo al dunque.

L’immagine che useremo DEVE essere in formato .BMP, come la seguente (……. che è in formato jpg perchè WordPress non mi fa fare l’upload di immagini BMP…:( …mannaggia!!).

gilles_villeneuve_ferrari312t4_1979

Ecco l’immagine originale che ho usato in bmp (pesa 2 MB !!)

http://www.juhanpassaatwitter61ll35.altervista.org/uploads/imgupload/@61ll35_img_d5894b9de010cd1895143deb2c3dc17c

Questa invece è l’immagine che contiene un messaggio segreto

http://www.juhanpassaatwitter61ll35.altervista.org/uploads/imgupload/@61ll35_img_66be3d74f107c68ecb53c15a1de87deb

Non avete a portata di mano un file di questo formato, ma migliaia di foto jpg?

Installate ImageMagick, poi date un


convert miaimmagine.jpg miaimmagine.bmp

 

Ho scritto due diversi programmi in C, uno che si occupa di “steganografare il messaggio”, l’altro di rivelarlo.

Questi due programmi accettano come parametri due nomi di file immagine bmp: uno è il file originale, l’altro è quello da noi “steganografato” 🙂

Ecco il sorgente del primo programma che io ho chiamato “steganografa.c”


#include<stdio.h>
#include<string.h>

int main(int argc, char *argv[])
{
    FILE *in;
    FILE *out;
    in=fopen(argv[1],"r");
    out=fopen(argv[2],"w");
    int memo;
    char str[200];//="AAACIAO";
    printf("Inserisci il testo da steganografare...\n");
    scanf("%20000[0-9a-zA-Z!-@{-}]s",str);//,max,stdin);
    //char ch=' ';
    //printf("space=%d\n",ch);
    int len=strlen(str);
    printf("LEN:%d\n",len);
    int a[7],asd=0,i=0,aiuto=0,cont;
    printf("________\n");
    int avanti;
    for (avanti=0;avanti<18;avanti++)
    {
        memo=getc(in);
        putc(memo,out);
    }
    int width1, width2, width3, width4;
    int height1,  height2, height3, height4;
    width1=getc(in);putc(width1,out);
    width2=getc(in);putc(width2,out);
    width3=getc(in);putc(width3,out);
    width4=getc(in);putc(width4,out);
    height1=getc(in);putc(height1,out);
    height2=getc(in);putc(height2,out);
    height3=getc(in);putc(height3,out);
    height4=getc(in);putc(height4,out);
    int aq;
    for (aq=0;aq<28;aq++)
    {
       memo=getc(in);
       putc(memo,out);
    }
    int larghezza=width1+width2*256;
    int altezza =height1+height2*256;
    int quanto=(4-((3*larghezza)%4));
    printf("quanto:%d\n",quanto);
    int contatore;
    for (asd=0;asd<len;asd++)
    {
       int letteraascii=str[asd];
       a[0]=0;
       a[1]=0;
       a[2]=0;
       a[3]=0;
       a[4]=0;
       a[5]=0;
       a[6]=0;
       a[7]=0;
       i=0;
       int pixel,pixel1,fg;
       while(letteraascii>0)
       {
           a[i]=letteraascii%2;
           i++;
           letteraascii=letteraascii/2;
       }

       ///ricrdarsi:invertire array
      /*/////////////////////////
      MODIFICO DI 2 SE BIT 1, MODIFICO DI 1 SE BIT 0
      *//////////////////////////

      for (fg=7;fg>=0;fg--)
      {
          contatore++;
          pixel=getc(in);
          if (a[fg]==1)
          {
              if (pixel<254)
                  pixel1=pixel+2;
          else
              pixel1=pixel-2;
          }
          else //if a[fg]==0
          {
              if (pixel<255)
                  pixel1=pixel+1;
              else
                  pixel1=pixel-1;
          }

          putc(pixel1,out); //
          if (contatore%larghezza==0)
          {
              switch(quanto)
              {
                  case 1:
                      getc(in);putc(0,out);break;
                  case 2:
                      getc(in);putc(0,out);
                      getc(in);putc(0,out);break;
                  case 3:
                      getc(in);putc(0,out);
                      getc(in);putc(0,out);
                      getc(in);putc(0,out);break;
                  case 4:
                      break;
              }
          }
      }
      //contatore++;
}//chiude for LETTERASCII
int pixels;
while(!feof(in))
    {
        pixels=getc(in);
        putc(pixels,out);
        if (contatore%larghezza==0)
        {
            switch(quanto)
            {
                case 1:
                    getc(in);putc(0,out);break;
                case 2:
                    getc(in);putc(0,out);
                    getc(in);putc(0,out);break;
                case 3:
                    getc(in);putc(0,out);
                    getc(in);putc(0,out);
                    getc(in);putc(0,out);break;
                case 4:
                    break;
            }
        }
    }
printf("\n");
int az;

printf("\n");
fclose(in);
fclose(out);

}

Cosa fa questo programma??

Accetta dell’input dall’utente, che è il messaggio che andiamo a iniettare nell’immagine.

Ogni lettera del testo viene convertita nel suo equivalente in ASCII ( la “A” diventa 65), poi questo numero viene convertito in un numero binario (65 è uguale a 01000001).

Ci viene in aiuto un array di 8 elementi dove sono memorizzati i bit di questo numero (65 in questo caso, cioè la lettera “A”, a maiuscolo).

A questo punto siamo pronti per steganografare il testo.

Come?

Beh, abbiamo aperto da programma un’immagine BMP che usiamo come maschera: questa è un file che viene interpretato da programmi di default come pinta come un’immagine,ma da C questo file è una sequenza apparentemente senza senso di byte.

Infatti, i primi byte del file dicono al sistema operativo che quel file è un immagine, poi specificano le dimensioni (altezza e larghezza in pixel dell’immagine) e ulteriori altre amenità che non ci interessano.

La parte interessante arriva dopo una cinquantina di byte dall’inizio del file, dove sono specificate le terne dei colori RGB che compongono il pixel ( il Rosso è rappresentato dai numeri 255,0,0 il viola 255,0,255 ecc ecc)

L’occhio umano non riesce a distinguere due rossi che sono identificati come 255,0,0 e 254,0,0:

Ed è proprio questo principio che sfruttiamo: andiamo a modificare i colori in funzione del messaggio!!

Aumentiamo o diminuiamo di 2 unità una componente cromatica del pixel se l’iesimo bit del byte numeroascii-lettera è 1, di 1 unità se il bit  è zero.

Per esempio se il pixel originale era 136,255,0 e il messaggio da nascondere era 011, il pixel diventa 137,253,2.

Compiliamo


gcc steganografa.c -o steganografa

Eseguiamo con


./steganografa file_bmp_ORIGINALE.bmp file_bmp_STEGANOGRAFATO.bmp

Ci viene chiesto di inserire un  messaggio, non la bibbia intera!

Ecco il sorgente del programma che si occupa di decodificare l’immagine, che io ho chiamato “decodesteg.c”


#include<stdio.h>
#include<string.h>

int main(int argc, char *argv[])
{
    FILE *originale;
    FILE *contraffatto;

    originale=fopen(argv[1],"r");
    contraffatto=fopen(argv[2],"r");

    int memo,pixeloriginale,pixelcontraffatto;
    int asd=0,i=0;
    int avanti;
    for (avanti=0;avanti<34;avanti++)
    {
        getc(originale);
        getc(contraffatto);
    }
    int contatore;
    int a[8];
    a[0]=0;a[1]=0;a[2]=0;a[3]=0;
    a[4]=0;a[5]=0;a[6]=0;a[7]=0;
    i=0;
    int pixel,pixel1,fg;
    int diff,cont=0,asciinum=0;
    while (!feof(contraffatto))
    {
        contatore++;
        pixeloriginale=getc(originale);
        pixelcontraffatto=getc(contraffatto);
        if (pixeloriginale>pixelcontraffatto)
            diff=pixeloriginale-pixelcontraffatto;
        else
            diff=pixelcontraffatto-pixeloriginale;
        if (diff==2)
            {a[cont]=1;cont++;}
        if (diff==1)
            {a[cont]=0;cont++;}

        if (cont==8)
        {
            asciinum=128*a[0]+64*a[1]+32*a[2]+
                16*a[3]+8*a[4]+4*a[5]+2*a[6]+a[7];
            printf("%c",asciinum);
            cont=0;asciinum=0;
            a[0]=0;a[1]=0;a[2]=0;a[3]=0;
            a[4]=0;a[5]=0;a[6]=0;a[7]=0;
        }
        /*if (contatore%larghezza==0)
        {
             switch(quanto)
             {
                 case 1:
                     getc(originale);
                     getc(contraffatto);break;
                 case 2:
                     getc(originale);
                     getc(contraffatto);getc(originale);
                     getc(contraffatto);break;
                 case 3:
                     getc(originale);getc(contraffatto);
                     getc(originale);getc(contraffatto);
                     getc(originale);getc(contraffatto);
                     break;
                 case 4:
                     break;
             }//switch
        }//if
        */
    }//chiude while
    fclose(originale);
    fclose(contraffatto);
    printf("\n");
}//chiude main

Compiliamolo


gcc decodesteg.c -o decodesteg

Eseguiamolo


./decodesteg file_immagine_STEGANOGRAFATO.bmp file_immagine_ORIGINALE.bmp

Questo programma compara uno a uno le componenti cromatiche RGB di ogni  pixel di due immagini, la “contraffatta” e “l’originale”, che ad occhio sembrano identiche, ma che in realtà non lo sono.

Se trova una differenza assoluta di 2 unità lo interpreta come “1”, se la differenza è di 1 unità allora il bit è zero.

L’intero byte numerico viene ricostruito tramite la formula


asciinum=128*a[0]+64*a[1]+32*a[2]+16*a[3]+8*a[4]+4*a[5]+2*a[6]+a[7];

e visualizzato con


printf("%c",asciinum);

Spero di essere stato chiaro in questo post, anche se, come avete capito…. l’apparenza inganna…:)

A presto!

Un cinguettio alternativo

Ciao a tutti cari amici di Ok, panico,

Sono 61ll35, questo è il mio secondo post.

Il primo post l’avevo dedicato alla creazione di una specie di google offline, dove utilizzavo in locale, sul mio pc, il linguaggio di programmazione PHP, affiancato al database MySql.

Tutto ciò era offline.

Vi spiego il motivo di questo post: Grazie agli stessi linguaggi di programmazione sopra citati ho realizzato un piccolo clone di twitter.

L’ho prima testato abbondantemente su localhost, poi l’ho trasferito online, su altervista, un sito di hosting gratuito.

Ora vorrei il vostro aiuto per testare questo piccolo social network…

Non vi aspettate granchè,in fatto di estetica,velocità, facilitò d’uso: comunque è un primo passo… e perdonate gli errori di gioventù.. Tenete inoltre presente che la velocità non dipende in gran parte da me: l’archiviazione su altervista è ottima, il servizio eccellente, ma la banda non sarà mai pari a quella di siti in cui si paga per avere questi servizi…

okp

Lo trovate al sito http://www.juhanpassaatwitter61ll35.altervista.org

Registratevi,loggatevi e iniziate a twittare!!

Quando vi registrerete, vi sarà detto di attivare il vostro account tramite mail: ignorate questo messaggio per il momento,in quanto, sul mio account di prova, le mail arrivavano con forte ritardo.

Se volete mandarmi un messaggio, inserite nel tweet “@61ll35”, proprio come su twitter!

Vi aspetto numerosi!

Ciao

Una specie di Google Offline

Cari amici di Ok, panico,

Sono nuovo del blog,ma lo seguo da abbastanza tempo.

Sono diventato amico con il caro Juhan,che seguo su Twitter.

Sono un ragazzo di vent’anni,ed uso come nickname “61LL35”, “gilles” in lingua leet.

Il motivo per cui con molta soddisfazione mi ritrovo a scrivere su questo blog è dovuto ad una discussione che ho avuto con Juhan,che dopo aver installato ubuntu 14.04 è passato a Chrome, abbandonando -almeno per il momento- Firefox.

Io gli ho detto che anch’io,sebbene entusiasta di tutto ciò che è Linux e open source o FOSS, ho abbandonato Firefox, in favore di Chrome.

Gli ho confidato che la causa scatenante di questa mia scelta è stato un piccola “imperfezione” di Firefox che ho riscontrato con uno script PHP che ho scritto la scorsa estate.

Che cosa fa questo script?

E’ una specie di rudimentale motore di ricerca che “cerca” dei file PDF che ho dentro una cartella.

Screenshot from 2014-05-07 19:41:24

Premetto una cosa… Non ho fatto scuole del settore,ma ho solamente tanta passione per l’informatica e la programmazione.

Inoltre sono partito completamente da zero, seguendo i video di NIKTORTHENAT su youtube. ( https://www.youtube.com/user/NiktorTheNat )

Tutto ciò è scritto in HTML,il linguaggio di markup di internet, in PHP, un linguaggio di scripting lato server con una sintassi abbastanza simile al C (linguaggio che ancora conosco poco, ma che amo) e con MySql.

L’HTML ci viene in aiuto per visualizzare del testo nelle pagine web, ed è caratterizzato da dei tag per la formattazione del testo. Volete vederli? aprite una qualsiasi pagina web e pigiate control+u in chrome oppure “visualizza sorgente”.

IL PHP invece è un linguaggio per rendere “dinamiche” le pagine web, specie se si appoggia a dei database, Mysql in questo caso.

Una nota: se aprite gedit, ci scrivete del codice html,salvate il file con estensione .html e lo aprite, allora vedrete senza problemi il risultato sul vostro browser preferito. Completamente differente è il discorso per PHP, che è un linguaggio che viene interpretato sui server,il metodo descritto per l’HTML non funziona. Come possiamo allora farlo funzionare sul nostro PC offline ???….

Dobbiamo allora installare dei pacchetti, di diversi mega 😉

Per settare tutto il nostro ambiente di lavoro, seguite la guida che trovate all’indirizzo http://www.morrolinux.it/come-creare-un-web-server-apache-mysql-php/.

Questo è un passaggio obbligato, se non lo fate non potete andare oltre.

Pronti?

Iniziamo.

Apriamo gedit, incolliamoci il codice qui sotto, salviamo il tutto con un nome qualsiasi, avendo cura di assegnargli l’estensione “.php”.

Per esempio se vogliamo salvare questo file con il nome “google” dovremo digitare “google.php”. Importantissimo, dobbiamo salvarlo nella cartella /var/www, che è stata creata al momento dell’installazione di Apache.


<?php
echo "<html><head><title>TITOLO</title>";
echo "<script type=\"text/javascript\"> function Invia(){var destinazione=pdfquery.php;location.href=destinazione;}</script>";
echo "</head><style type=\"text/css\">body {background-color:white;}</style><body>";
echo "<small><div align=\"right\" style=\"background:yellow\">Questo script cerca PDF nella cartella /var/www/pdf</div></small>";

echo "<small><div align=\"right\" style=\"background:yellow\">Powered by NOME NICKNAME COGNOME -2013</div></small>";
echo "<br><br>";

echo "<center><small>POWERED by NOME COGNOME-2013</small></center><br><br><br>";
echo"<center><strong><img src=\"google.jpg\"</strong> width=\"400\" height=\"283\"></center>";
echo <strong>"<form</strong> name=\"myform\" onsubmit=\"Invia();return false;\" <strong>method=\"post\" action=\"pdfquery.php\">"</strong>;
//IMPORTANTISSIMO: invece di premere il pulsante invia con lo script javascript basta scrivere sull'input type e premere INVIO!!!
echo "<center><strong><input type=\"text\" name=\"q\"></strong></center><br>";
echo "<center>cerca i primi<input type=\"text\" name=\"howmany\" size=\"3\" value=\"300\">risultati</center><br>";
echo " <center><<strong>input type=\"submit\</strong>" name=\"submit\" value=\"Cerca\"</center>";
echo "<strong></form></strong>";
echo "</body></html>";
?>

dovrete rendere eseguibili TUTTI gli script che avete in /var/www, altrimenti per questioni di permessi che non ho ben capito, non vedrete niente. Perciò,date da teminale


sudo chmod -R 777 /var/www

Ora se aprite il browser e nella barra di indirizzi digitate


127.0.0.1/google.php

vi dovrebbe apparire questo

Screenshot from 2014-05-07 19:41:24

Dimenticavo, non vedrete l’immagine del logo di Google, a meno che non abbiate un immagine JPG chiamata google.jpg in /var/www.google

google

Che cosa fa il codice sopra?

Si occupa di visualizzare tutto ciò che vedete sulla pagina web, in più tramite PHP, ci prepariamo a raccogliere la query dell’utente, cioè la parola che l’utente vuole cercare.

Questo codice “posta” la parola che viene digitata sulla casella di ricerca ad un’altra pagina,sempre in php, che si occupa di eseguire materialmente la ricerca e di visualizzare i risultati. Potete vedere come funziona il meccanismo ossevando il codice più sopra.

La chiave del funzionamento è nel tag <form> che “posta” ciò che viene scritto nella casella di ricerca ( <input type=”text” name=”q” …> verso un altra pagina, pdfquery.php in questo caso.

Essenzialmente, google.php dice a pdfquery.php “Ehi, tu che sei più brava di me a fare le ricerche, perchè non mi aiuti a cercare tutto i pdf che hanno nel loro nome la parola che io stessa ti invio, ti posto?”

invio è in grassetto, in inglese si dice “submit” e il pulsante con scritto sopra “cerca” aziona questo meccanismo di passaggio di informazioni, di variabili, tra una pagina e un altra.

Facciamo finta che la parola cercata sia “robot”

Questa sarebbe la pagina che ci ritroveremo davanti.

Screenshot from 2014-05-07 19:41:38

 

Da dove attinge i risultati della ricerca questa pagina? Da un database, mysql.

apriamo il nostro terminale e digitiamo


mysql -u root -p

e digitiamo la password del database che abbiamo protetto in fase di installazione.

Creiamo un database con il comando


create database google;

use google;

Il punto e virgola finale è importantissimo!! (waiting for a semicolon direbbe @imadevloper)

andiamo a creare una tabella dentro a questo database!


create table pdf (nome varchar(200), id int not null auto_increment, primary key(id));

e diamo invio.

Attenzione! per un motivo non identificato,Wordpress non mi fa mettere un underscore “_” tra le parole “primary” e “key”. quello che dovete digitare è “primary_key”

Adesso apriamo nautilus in /var/www e creiamo una cartella di nome “pdf”.

Dentro “pdf” mettiamo tutti i nostri cari pdf, se siete come me mettete pure pdf in lingua thailandese di meccanica quantistica e robotica che non leggerete mai.

ora apriamo un altro terminale e diamo


cd /var/www/pdf

ls >nome-a-piacere

aprite pure con gedit nome-a-piacere, contiene una lista di tutti i nomi dei pdf che avete nella cartella.

muovete o copiate questo file nella cartella /var/lib/mysql/google


sudo cp nome-a-piacere /var/lib/mysql/google/

Ora torniamo al terminale con mysql e diamo


load data infile "nome-a-piacere" into table pdf;

per confermare l’avvenuto inserimento digitate


select * from pdf;

se vedrete comparire i nomi dei vostri file, beh siamo a cavallo!!

andiamo a creare la famosa pagina “pdfquery.php”, facendo la stessa identica cosa che abbiamo fatto con “google.php”.

Stavolta incolliamo il codice seguente.


<?php
$query=$_POST['q'];
$howmany=$_POST['howmany'];
echo "<html><body><head><title>HAI CERCATO:$query
</title><style type=\"text/css\">
img {margin-left:100px}
td.dimensioni {background-color:red;}
td.immagine {background-color:green;}
td.nomepdf {background-color:pink;}
td.contatore {background-color:yellow;}
</style></head>";

echo "<div align=\"right\" style=\"background-color:#D8BFD8\">
<small>hai cercato <input type=\"text\" value=\"$query\"></small></div><center>";
echo "<div align=\"right\"><small>hai selezionato $howmany risultati</small></div>
<img src=\"google.jpg\" width=\"400\" height=\"283\"></center>";
echo"<center>by <big><b><u>nome cognome</b></u></big></center><br><br>";
//echo "<script type=\"text/javascript\">alert(\"ciao\");</script>";
$username="root";
$password="LAPASSWORDDIROOT";
$host= "localhost";
$database= "google";
//echo"prova";
mysql_connect($host,$username,$password) or die("<br>PROBLEMA<br>") ;

mysql_select_db($database) or die ("impossibile selezionare il database");
$qu="%$query%";
//echo"ciao";
$ricerca="select nome from pdf where nome like \"$qu\" order by rand() limit 0,$howmany";
$risultati=mysql_query($ricerca);
$num=mysql_numrows($risultati);
mysql_close($con);
$i=0;
if ($num==0)
{
echo "<center>NON ci sono risultati per <b><u>$query</b></u></center>";
}
$contatore=1;
echo "<table border=\"1\">";
while ($i<$num)
{
$nome=mysql_result($risultati,$i,"nome");

echo "<tr><td class=contatore>$contatore</td>";
$dimensione= ceil(filesize("pdf/$nome")/1024);
if ($dimensione>1000)
{
$dimensione=round($dimensione/1024,2) . MB; //serve per togliere inutili cifre dopo la virgola!!
}
else
{
$dimensione=$dimensione . KB;
}
$meno=substr($nome, 0, strrpos($nome, '.')); //toglie l'estensione .pdf dal file
$immagine = "thumbpdf/$meno.jpg";
$dimensioni = getimagesize($immagine);
$quanto=4;
$larghezza = $dimensioni[0]/$quanto;
$altezza = $dimensioni[1]/$quanto;
echo"<td class=immagine><a href=\"pdf/$nome\"><img src=\"thumbpdf/$meno.jpg\" width=\"$larghezza\" height=\"$altezza\" border=\"1\"></a></td>";//c
echo "<td class=nomepdf><a href=\"pdf/$nome\">$nome</a></td>";
echo "<td class=dimensioni>[$dimensione]</td>";
echo"</tr>";
$i++;
$contatore++;
}
echo "</table></body></html>";
?>

prima di salvare questo file con il nome di “pdfquery.php” rintracciate la seguente riga


$password="LAPASSWORDDIROOT";

inserendo al posto di LAPASSWORDDIROOT la vostra password, non quella del vostro account, bensì QUELLA DI MYSQL!!

Che poi, tra l’altro, nel mio caso coincidono 😉 😉 😉 ;(

Questo codice si connette al database, esegue una query, e tramite un ciclo WHILE visualizza uno per uno i risultati.

QUESTA E’ LA POTENZA DI PHP: genera automaticamente, interattivamente del codice HTML per noi, a seconda dei risultati che gli passa mysql. A noi basta premere il link per essere rimandati al pdf, che possiamo leggere nel nostro browser preferito, in questo caso chrome.

Con chrome, se clicchi sul link del pdf te lo apre, mentre con firefox ti propone di salvarlo….

Un abbellimento…

volete l’anteprima del pdf?

Create una cartella in /var/www e chiamatela thumbpdf

Installate ImageMagick con il comando


sudo apt-get intall imagemagick

ora creiamo materialmente l’anteprima


cd /var/www

convert pdf/nome_di_un_vostro_file_pdf.pdf[0] thumbpdf/nome_di_un_vostro_file_pdf.jpg

xdg-open nome_di_un_vostro_file_pdf.jpg

Se avete tanti pdf, dovete realizzare uno script che faccia il lavoro sporco per voi…

Per gli script chiedete aiuto a chi ne sa di più (@_juhan) (WARNING: se il file pdf contiene parole con degli spazi….)

Ogni volta che fate una ricerca, i risultati vengono visualizzati RANDOM grazie a “order by rand()” in


$ricerca="select nome from pdf where nome like \"$qu\" order by rand() limit 0,$howmany";

“pdfquery.php” non l’ho scritto linearmente: ho prima scritto lo scheletro, poi l’ho abbellito, inserendo i risultati in una tabella, visualizzando le dimensioni dei file, le anteprime e la visualizzazione random dei risultati. Ciò torna utile se avete tanti pdf su un unico tema, e vi stufate che compaia sempre lo stesso risultato per primo.

Screenshot from 2014-05-07 19:41:50

Concludo il mio primo post su okp, sperando di non avervi annoiato.

Commentate numerosi,date un feedback, domande,miglioramenti al codice…

Grazie per l’attenzione,

a presto