Respect des droits d'auteurs et droits voisins — Refus des mesures techniques de protection (MTP)
La vidéo haute définition reposera sur du matériel (lecteurs, écrans et câbles) certifiés de bout en bout, mais ce n'est pas tout : tant la norme HD-DVD que la norme Blu-Ray Disc prévoient la possibilité de révoquer –impossibilité définitive de lire les disque– un lecteur via une liste, mise à jour au fil des sorties de nouvelles oeuvres, inscrite dans les données du disque (lire les spécifications de Advanced Access Content System, en particulier Introduction and Common Cryptographic Elements aux chapitres 1.2, 3.1, 3.2, 4.8, et 4.9). J'accepte l'usure du temps, pas l'usure à la demande. Acheter le matériel "Haute Définition" est donc hors de question.
Le Sporniket, sa vie, son œuvre
À retenir
Outils
Vie pratique
Portfolio
Présidentielles
Culture
- Respect des droits d'auteurs et droits voisins — Refus des Mesures Techniques de Protection (MTP)
- Licence globale : finalement je suis contre...
- Lettre à la SACEM : Réaction par rapport au projet de loi DADVSI
- Reprenons en main la culture !
- Gestion Numérique des droits (DRM) : une question de confiance
- Gestion Numérique des droits (DRM) : une question de confiance (2)
Archives
- Novembre 2006
- Octobre 2006
- Septembre 2006
- Aout 2006
- Juillet 2006
- Juin 2006
- Mai 2006
- Avril 2006
- Mars 2006
- Février 2006
- Janvier 2006
- Décembre 2005
- Novembre 2005
- Octobre 2005
- Septembre 2005
- Aout 2005
- Juillet 2005
- Juin 2005
- Mai 2005
- Avril 2005
- Mars 2005
- Février 2005
- Janvier 2005
- Décembre 2004
- Novembre 2004
- Octobre 2004
Sporniket connection
- Sporniket-Studio.com, mon catalogue de posters
- Sporniket version WAP, des logos et des sonneries à télécharger
- Sanctuaire Tokugawa, cours de japonais en ligne et gratuit
- Mon blog sur In Libro Veritas
Spornikethon
- Mes créations vous plaisent ?
- Vous voulez me soutenir financièrement ?
- Cliquez sur un des boutons ci-dessous selon le montant du dons.
- Merci !
Rouleaux de blogs
Mes liens
- Non à la culture vérouillée en France
- Non à la brevetabilité des logiciels en Europe
- Musique légale et gratuite à télécharger
- Promotion d'artistes proposant de la musique légale et gratuite à télécharger
- Associations pour le Maintien d’une Agriculture Paysanne
- La Bible
- Wikipédia
- Le Trésor de la Langue Française Informatisé
- Web-Referanz, création de sites internet
- Liste prête à l'emploi pour Adblock
- Partitions pour guitare classique
- Forum francophone pour les collectionneurs et créateurs de poupées
Le webring de la 3d francophone
Bombardement Google
(Modèle) Travail de bas niveau sur une table d'une base de données
Objectif
Isoler les traitements de bas niveau sur une table d'un base de données : sélection d'une ou plusieurs lignes avec retour partiel du résultat, insertion/mise à jour d'une ligne, suppression d'une ou plusieurs lignes.
Pour une table, on définit 3 classes
- Filtre
- La classe pour stocker les critères. Les critères permettent de construire la clause WHERE dans une requete de sélection ou de suppression.
- Row
- La classe pour stocker un enregistrement. On pourra notamment implémenter des contraintes, comme des listes de valeurs autorisées par exemple.
- Table
- La classe pour écrire et lire dans la table.
Les modèles et traitement de haut niveau ("couche métier") utiliseront ensuite ce modèle de bas niveau. On bénéficie en plus de la possibilité d'adapter la couche bas niveau à une nouvelle base de données au fonctionnalitée équivalentes sans toucher à la couche métier.
Enfin, on peut aussi utiliser des "espaces de noms" pour les tables, et les colonnes, afin d'éviter les collisions de noms. Cela permet de faire cohabiter plusieurs instance de l'application indépendantes.
Améliorations possibles
Ecrire des fonctions qui se chargent de la construction d'un objet Critère ad hoc pour des cas simple (recherche sur un identifiant, etc...)
Code Source
<?php /* (c)2004 David Sporn This library is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2.1 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /**Class that will be used for constructing a "WHERE" clause. */ class DbXx_Filter { //Filter value var $myYyy ; //etc... function DbXx_Filter() { $this->myYyy = '' ; //whatever default value here } /**Write access to property Yyy. * @param default default value. */ function setYyy($default = '') { $this->myYyy = $default ; } /**Read access to property Yyy. * @return a string */ function getYyy() { return $this->myYyy ; } } /**Class that models a row of the table Xx. */ class DbXx_Row { //Filter value var $myAaa ; //etc... function DbXx_Row($nameSpace = '') { $this->myAaa = '' ; //whatever default value here } /**Write access to property Aaa. * @param default default value. */ function setAaa($default = '') { $this->myAaa = $default ; } /**Read access to property Aaa. * @return a string */ function getAaa() { return $this->myAaa ; } } /**Class that accesses the database. */ class DbXx_Table { var $myTable ; var $myModel ; function DbXx_Table($tableNameSpace = '', $modelNameSpace = '') { $this->myTable = $tableNameSpace.'page' ; //the name of the table $this->myModel = array( 'sid'=>$modelNameSpace.'SID' , 'entry'=>$modelNameSpace.'GID' , 'label'=>$modelNameSpace.'LABEL' , 'data'=>$modelNameSpace.'DATA' , 'type'=>$modelNameSpace.'TYPE' , 'menu'=>$modelNameSpace.'MENU' , 'first_page'=>$modelNameSpace.'FIRST' , 'last_page'=>$modelNameSpace.'LAST' , 'previous_page'=>$modelNameSpace.'PREV' , 'next_page'=>$modelNameSpace.'NEXT' ) ; } /**Select rows from the table according to a filter. * @param filter the filter (might be null) * @param rangeStart (>=0 : skip the $rangeStart first records) * @param rangeLength ($rangeStart >= 0 && $rangeLength > 0 : return only $rangeLength records) * @return an array of DbXx_Row */ function getList($filter = null, $rangeStart = -1, $rangeLength = 0) { //Sanity check if ($rangeStart >= 0 && $rangeLength <= 0) { return array() ; } $list_retour = array() ; //TODO : Build the sql request using the optionnal filter $sql = '' ; if (null == $filter) { //build the sql request with no filter //$sql = 'select * from '.$this->myTable.' order by '.$this->myModel['entry'] ; //sample query build // 'select ' // .$this->myModel['entry'].', ' // .$this->myModel['label'].', ' // .$this->myModel['data'].', ' // .$this->myModel['type'].', ' // .$this->myModel['menu'].', ' // .$this->myModel['first_page'].', ' // .$this->myModel['last_page'].', ' // .$this->myModel['previous_page'].', ' // .$this->myModel['next_page'].' ' // .'from '.$this->myTable } else { //build the sql request with a filter } $db_result = mysql_query($sql) ; $row_counter = 0 ; while ($next_record = mysql_fetch_array($db_result)) { if ($rangeStart >= 0 && $row_counter < $rangeStart) { continue ; //range not reached yet } else if ($rangeStart >= 0 && ($rangeStart + $rangeLength) <= $row_counter) { break ; //range ends } $new_row = new DbXx_Row ; //TODO : copy data from $next_record to $new_row array_push($list_retour, $new_row) ; $row_counter++ ; } return $list_retour ; } /**Insert a row from a DbXx_Row. * @param row the DbXx_Row * @return -1 if the query failed */ function insert($row) { //TODO : build the sql query $sql = '' ; //sample query build // 'insert into '.$this->name.'(' // .$this->model['entry'].', ' // .$this->model['label'].', ' // .$this->model['data'].', ' // .$this->model['type'].', ' // .$this->model['menu'].', ' // .$this->model['first_page'].', ' // .$this->model['last_page'].', ' // .$this->model['previous_page'].', ' // .$this->model['next_page'].') ' // ." values('".addslashes($entry)."', " // ."'".addslashes($label)."', " // ."'".addslashes($data)."', " // ."".(integer)$type.", " // ."'".addslashes($menu)."', " // ."'".addslashes($first)."', " // ."'".addslashes($last)."', " // ."'".addslashes($prev)."', " // ."'".addslashes($next)."') "; mysql_query($sql); return mysql_affected_rows() ; } /**Update a row from a DbXx_Row. * @param row the DbXx_Row * @return -1 if the query failed */ function update($row) { //TODO : build the sql query $sql = '' ; //sample query build // "insert into ".$this->name."(" // .$this->model['entry'].", " // .$this->model['label'].", " // .$this->model['data'].", " // .$this->model['type'].", " // .$this->model['menu'].", " // .$this->model['first_page'].", " // .$this->model['last_page'].", " // .$this->model['previous_page'].", " // .$this->model['next_page'].") " // ." values('".addslashes($entry)."', " // ."'".addslashes($label)."', " // ."'".addslashes($data)."', " // ."".(integer)$type.", " // ."'".addslashes($menu)."', " // ."'".addslashes($first)."', " // ."'".addslashes($last)."', " // ."'".addslashes($prev)."', " // ."'".addslashes($next)."') "; mysql_query($sql); return mysql_affected_rows() ; } /**Delete using DbXx_Row (delete a row) or a DbXx_Filter (delete several rows). * @param filter the DbXx_Row * @return -1 if the query failed */ function delete($filter) { //TODO : Build the sql request using either a filter, either a row $sql = '' ; if (is_a($filter, 'DbXx_Filter')) { //build the sql request with a filter // } else if (is_a($filter, 'DbXx_Row')) { //build the sql request with a row } else { return -1 ; } mysql_query($sql) ; return mysql_affected_rows() ; } } ?>