Pensieri sparsi sulla realizzazione del programma. ---------- Un file ---------- Un file è una sequenza di byte che è contenuto in una directory creato in un certo istante. possiede un nome caratteristico che lo distingue da tutti gli altri. Molti file hanno anche una estensione che ne indica il tipo. Per facilitare la ricerca ogni file può essere aggiunto ad una categoria di file come per esempio `Foto`, `File di Backup`, `Documenti di Erica`. Spesso poi si voglio inserire anche dei commenti personali o degli appunti che riguardano il file. Tutti amano le statistiche e i punteggi o per lo meno io non ne posso fare a meno quindici sarà anche un bel campo ratings con un voto da 0 a 5 stelle ad indicare la qualità di mp3 o di un film. Le proprietà principali di una file sono quindi: 1- Nome completo del file compresa estensione: foto della vacanza - 01.jpg 2- Directory di Appartenenza: /foto vacanza 3- Data di Creazione: 2003-08-26 22:53 4- Spazio occupato dal file in byte: 15478784 5- Categoria di appartenenza: Foto 6- Commento personale: `Io ed Erica insieme ...` 7- Voto da 0 a 5: 5 La struttura della tabella dei file risulterà quindi simile a questa: CREATE TABLE `file` ( `file_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `file_name` VARCHAR( 255 ) NOT NULL , `directory_id` INT UNSIGNED NOT NULL , `file_date` DATE NOT NULL , `file_time` TIME NOT NULL , `file_size` INT UNSIGNED DEFAULT '0' NOT NULL , `category_id` INT UNSIGNED DEFAULT '0' NOT NULL , `file_comment` LONGTEXT , `file_rating` INT UNSIGNED DEFAULT '0' NOT NULL , PRIMARY KEY ( `file_id` ) , FOREIGN KEY ( `directory_id` ) REFERENCES directory, FOREIGN KEY ( `category_id` ) REFERENCES category, INDEX ( `file_name` , `directory_id` , `file_date` , `file_time` , `file_size` , `category_id` ), FULLTEXT ( `file_comment` ) ) COMMENT = 'Tabella contenente tutti i file del database'; ---------- Una Directory ---------- Tutti i file di un media sono contenuti in directory. Una directory è un elemento astratto che può contenere da 0 a N elementi che possono essere dei file oppure altre directory. Ogni directory ha quindi dei figli ma ha anche un genitore che la contiene. Discorso a parte lo fa la directory root o radice. La directory radice di ogni media non ha un genitore. Ogni directory è rappresentata da un nome composto da numeri e lettere. Le proprietà di una directory sono quindi: 1- Nome della directory: foto vacanza 2- Nome della directory genitore: root 3- Nome del media di appartenenza: Floppy disk numero 01 la struttura della tabella delle directory risulta quindi: CREATE TABLE `directory` ( `directory_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `directory_name` VARCHAR( 255 ) NOT NULL , `parent_id` INT UNSIGNED DEFAULT '0' NOT NULL , `media_id` INT UNSIGNED NOT NULL , `category_id` INT UNSIGNED DEFAULT '0' NOT NULL , `directory_rating` INT UNSIGNED DEFAULT '0' NOT NULL , PRIMARY KEY ( `directory_id` ) , FOREIGN KEY ( `media_id` ) REFERENCES media , FOREIGN KEY ( `category_id` ) REFERENCES category, INDEX ( `directory_name` , `media_id` ) , FULLTEXT ( `directory_name` ) ) COMMENT = 'Tabella contenente tutte le directory di tutti i media'; --------- Un Media ---------- Un Media non è altro che un dispositivo che contiene file e directory al suo interno. Può essere un cd, un dvd, un floppy o anche un intero hard disk. Ogni media è rappresentato da una etichetta che lo contraddistingua dagli altri. Spesso se si tratta di cd o floppy si tende a prestarli ad amici o parenti per un certo periodo di tempo quindi ogni media avrà un flag che indicherà se questo è in prestito, la data e a chi è stato prestato. Per evitare inutili query sul database ogni volta che si seleziona un media è utile avere anche il numero di file e dimensione totale dello stesso sempre a portata di mano. Ogni media può poi avere un commento personale piú o meno lungo che riguarda il suo contenuto. le proprietà di un media sono quindi: 1- Nome dell' etichetta del media: Floppy disk numero 01 2- Numero di file in totale: 15 3- Dimensione totale in byte: 1410025 4- Flag che indica se è in prestito: Si 5- Nome della persona a cui è stato prestato: Erica 6- Data in cui è stato prestato: 2003-08-29 7- Numero di volte che è stato imprestato: 2 8- Commento personale: `foto delle vacanze ...` 9- Categoria di Appartenenza: Foto 10- Icona che rappresenta il tipo di media. (viene ereditata dalla tabella devicelist): dvd-rw.png La struttura della tabella media risulta simile a questa: CREATE TABLE `media` ( `media_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `media_label` VARCHAR( 255 ) NOT NULL , `media_totfile` INT UNSIGNED NOT NULL , `media_size` INT UNSIGNED NOT NULL , `media_date` DATE NOT NULL , `media_lend` TINYINT DEFAULT '0' NOT NULL , `media_lend_date` DATE NOT NULL , `media_lend_name` VARCHAR( 255 ) NOT NULL , `media_lend_count` INT UNSIGNED NOT NULL , `media_comment` LONGTEXT , `category_id` INT UNSIGNED DEFAULT '0' NOT NULL , `media_rating` INT UNSIGNED DEFAULT '0' NOT NULL , `mediatype_id` INT UNSIGNED NOT NULL , PRIMARY KEY ( `media_id` ) , FOREIGN KEY ( `category_id` ) REFERENCES category, FOREIGN KEY ( `mediatype_id` ) REFERENCES mediatype , INDEX ( `media_label` ) , FULLTEXT ( `media_comment` ) ) COMMENT = 'Tabella contenente tutti media dell\'archivio'; ---------- Le Categorie ----------- Ogni file, Directory e media può essere aggiunto ad una data categoria per facilitarne la ricerca e per suddividere i file in ulteriori sotto categorie. Una categoria è composta semplicemente da un nome che la identifica. Le proprietà di una categoria sono quindi: 1- Nome Categoria: Foto La struttura della tabella sarà quindi: CREATE TABLE `category` ( `category_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `category_name` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `category_id` ) , INDEX ( `category_name` ) , FULLTEXT ( `category_name` ) ) COMMENT = 'Tabella contenente tutte le categorie'; --------- Tipi di File ---------- La maggior parte dei file all'interno di un media è provvista di un estensione. Questa estensione viene usata per indicare il tipo del file. Se si associano una o piú estensioni ad una categoria phpMyCdArchive è in grado di associare automaticamente il file alla categoria risparmiando all' utente molto tempo. Le proprietà di un tipo di file sono quindi: 1- Suffisso del file: mpc:mpp:mp+ 2- Descrizione del suffisso: MusePack Audio 3- Categoria di Appartenenza Musica 4- Nome dell'imagine rappresentativa: musepack.png La struttura della tabella filetype sarà quindi: CREATE TABLE `filetype` ( `filetype_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `filetype_suffix` VARCHAR( 255 ) NOT NULL , `filetype_name` VARCHAR( 255 ) NOT NULL , `category_id` INT UNSIGNED NOT NULL , `filetype_image` VARCHAR( 255 ) NOT NULL, PRIMARY KEY ( `filetype_id` ) , INDEX ( `category_id` ) ) COMMENT = 'Tabella contenente tutti tipi di file.'; ---------- Analisi Media ---------- L' operazione di analisi del contenuto di un media è forse la parte del programma che piú risente del sistema operativo su cui il programma gira. Si deve quindi creare un livello che separi il programma dal sistema sottostante. Ogni sistema avrà quindi un modulo che il programma userà per collezionare informazioni. Ogni sistema ha pero il modo rendere accessibile all' utente un dispositivo. Nei sistemi Unix-like un dispositivo deve essere prima montato in una directory /cdrom, mentre nei sistemi a-la Windows questo non è necessario. Altro problema è la rappresentazione delle directory che i vari sistemi operativi possono avere. E' ovvio poi che questi moduli dovranno avere un' interfaccia comune: L' interfaccia di un modulo sarà simile a questa: boolean need_mount(); ritorna TRUE se i dispositivi necessitano un operazione di mount prima di essere letti altrimenti ritorna FLASE. boolean mount(); Esegue l' operazione di mount per il dispositivo selezionato. Se l' operazione va a buon termine ritorna TRUE altrimenti ritorna FALSE. boolean umount(); Esegue l' operazione di unmount sul dispositivo selezionato. Se l' operazione va a buon termine ritorna TRUE altrimenti ritorna FALSE. boolean eject(); Alcuni sistemi come unix permettono di espellere dispositivi removibili come cdrom. Ritorna TRUE se l'ìoperazione va a buon termine. Se il sitema o il dispositivo non lo supporta ritorna comunque TRUE. boolean init_media($nome_dir, $nome_dispositivo); Inizializza il modulo. Questo metodo viene chiamato prima di tutti gli altri e può essere usato per controlli e inizializazioni del modulo in caso di errore ritorna FALSE. $nome_dir è il nome del dispositivo nel sistema operativo: /cdrom D: $nome_dispositivo è il nome con cui il sistema identifica il dispositivo questo parametro è usato solo da alcuni sistemi unix. /dev/hdb boolean uninit_media(); Viene chiamata per effettuare le ultime operazioni. Qui è possibile liberare la memoria e rimettere a posto tutto quello che si è usato durante il processo. void read_media(); Quando questa funzione viene chiamata il modulo deve leggere tutte le informazioni possibili dal media. Come leggere la lista dei file e directory. void set_new_media_callback($func); Indica al modulo quale funzione deve chiamare per inserire un nuovo media. I paramteri in ingresso sono l' etichetta, la dimensione e il numero totale di file del media. La funzione ritorna come valore l'id del media nel db. $func($media_label, $media_size, $media_totfile); void set_new_dir_callback($func); Indica al modulo quale funzione deve chiamare per inserire una nuova directory nel database. I parametri da passare sono il nome della directory e l'id della directory genitore. La funzione ritorna l'id della directory nel db. $dir_id = $func($dir_name, $parent_id); void set_new_file_callback($func); Indica al modulo quale funzione deve invocare per inserire un nuovo file nel database. I parametri da passare sono il nome, la dimesione in byte, la data di creazione, l' ora di creazione e l'id della directory genitore. ---------- Lista Dispositivi ---------- Per non dover inserire ogni volta tutti idati riguardanti i dispositivi che leggono i media è comodo inserire la lista in una tabella contenete tutte le proprietà. Ogni dispositivo ha un nome rappresentativo che lo distingue e poi il nome che il dispositivo ha nel sistema operativo. Può essere utile associare anche un icona che rappresenta il tipo di media che verrà tenuta in memoria in un' altra tabella. Le proprietà di un dispositivo sono quindi: 1- Nome del dispositivo: Masterizatore 2- Nome del dispositivo hardware nel sistema: /dev/scd0 3- Cartella di mount (usata solo da unix): /cdwriter 4- Tipo di Media: CD La struttura della tabella devicelist sarà quindi: CREATE TABLE `devicelist` ( `device_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `device_name` VARCHAR( 255 ) NOT NULL , `device_dev` VARCHAR( 255 ) NOT NULL , `device_mount` VARCHAR( 255 ) NOT NULL , `mediatype_id` INT UNSIGNED NOT NULL , PRIMARY KEY ( `device_id` ) , FOREIGN KEY ( `mediatype_id` ) REFERENCES mediatype , INDEX ( `mediatype_id` ) ) COMMENT = 'Tabella contenente tutti i dispositivi'; ---------- Tipi di Media ---------- Questa tabella contiene solo un elenco di tipi Media e le rispettive icone usate per rappresentarli. Non ci serve altro che un Nome da dare al tipologia di dispositivo e il nome del file contenete l' immagine da usare. le proprietà della tabella saranno quindi: 1- Nome del tipo di media: DVD-RW 2- Nome del file immagine: dvd-rw.png la struttura della tabella meditype sara quindi: CREATE TABLE `mediatype` ( `mediatype_id` INT UNSIGNED NOT NULL AUTO_INCREMENT , `mediatype_name` VARCHAR( 255 ) NOT NULL , `mediatype_image` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `mediatype_id` ) , INDEX ( `mediatype_name` ) ) COMMENT = 'Tabella contenente tutti i dipi di media'; ---------- Internazionalizazione ---------- Un buon programma deve avere anche un buon supporto per l'internazionalizazione che permetta di essere tradotto in piú lingue rendendolo accessibile al piú alto numero di persone. Tutti i file con i messaggi saranno contenuti nella cartella i18n ognuno di questi file si chiamerà Language..php dove codice nazione sarà sostituito da un codice di 2 lettere rappresentante la nazione, ad esempio it, en, rf, de ecc. ecc. Smarty supporta un ottimo metodo per internazionalizare una pagina tramite il plugin localize che si usa nel modo seguente: {localize word="Ciao come Stai"} Tutti i messaggi saranno quindi inseriti in un array di nome $langstrings in questo modo: $langstrings['Parola o messaggio da localizare'] = 'yag\'haich unc gnegne one gaimasu'; ---------- Inserimenti nel database ------------ L' inserimento di un intero cdrom può essere un' operazione lunga e un errore si hardware che software può portare a inconsistenze nel database. Per questo l'intero inserimento di un cd è visto come una transizione unica. Questa incomincia prima dell' analisi e finisce quando tutti gli inserimenti sono finiti e viene data quindi la commit. Questo processo essendo legato alla gestione del database non deve interessare i moduli che collezionano informazioni dai media. $db->inizio_transizione(); $mod->read_media(); qui il modulo legge tutte le informazioni e chiama i vari metodi per gli inserimenti $db->fine_transizione(); ---------- Codice Xhtml, Css, ---------- Per rendere uniforme la visualizazione delle pagine generate dal programma in modo da permettere ad ogni utente di usare il proprio browser preferito è necessario scrivere del codice che sia conforme a degli standard. Questi standard sono XHTML 1.1 per il contenuto delle pagine mentre la grafica e l'impaginazione verra usato CSS 2.0. Questi standard sono molto restrittivi in alcuni casi ma permettono di scrivere del codice molto ordinato e pulito. Discorso a parte lo fanno le tabelle. E' pratica comune infatti usare le tabelle per creare il layout della pagina, questo pero è un errore. Le tabelle non sono state ideate per questo scopo mentre il CSS è stato creato appositamente per questo ed è infinitamente piu potente. Percio tutto il codice sara css-tableless. ---------- Informazioni Aggiuntive ----------- Potrebbe esseree interessante aggiungere nei commenti delle informazioni aggiuntive come i tag di un file musicale mp3 o mpc oppure il bitrate usato per comprimere un determinato filmato avi. Tutto questo ovviamente in automatico con l'ausilio di qualche filtro o libreria. getID3() è una libreria molto utile che supporta un gran numero di formati. qualcosa tipo: Title: Titolo Canzone Artist: Nome Artista Album: Titolo Album Track: Numero traccia Year: Anno Genre: Genere Comment: Commento Sarebbe bello poter rendere questo integrabile con la tabella dei tipi di file e poter scegliere per ogni file se abilitare la generazione del commento in automatico. Altra cosa ineressante è poter personalizare il commento con dei tag che poi bengono sostituiti dal programma. Il massimo poi sarebbe creare una tabella contenete una riga del commento generato per riga. es di personalizazione con tag: Titolo: $title Encoder version: $encoder_version .---. Commento normale inserito dal'utente che diventa poi una tabella cosi: +-----------------+------------------+ | Titolo | $titolo | +-----------------+------------------+ | Encoder Version | $encoder_version | +-----------------+------------------+ | | | | +------------------------------------+ ----------- Etichette e Copertine ------------ Spesso quando si aggiungono cdrom originali oppure dvd puo essere interesante anche aggiungere un'imagine scannerizata della copertina del media. per fare questo pero si deve cambiare la struttura della tabella e inserire un blob che possa contenere l'intera immagine dentro di se. a questo puntop puo essere interessante aggiungere il blob anche per le immagini dei media evitand cosi di dover costringere l'utente a spostare dei file all'interno di cartelle. Tutto sarebbe gestibile da un comodo pannello di aministrazione e anche l'operazione di backup del database si porterebbe dientro le varie imagini. ------------ Shortcut a delle ricerche --------------- Sarebbe veramente utile permettere di inserire delle shortcut a delle ricerche come ad esempio la ricerca per tutti gli mp3 che avra etichetta. "Tutti i miei mp3." -------------- Nelle statistiche --------------------- NElle staticstiche sarebbe bello avere una piccola classifica come Top 10 piu richiesti mese, anno. chi ha piu prestiti. chi impiega piu tempo.