Subscribe: Creaone.fr
http://blog.creaone.fr/feed/atom
Added By: Feedage Forager Feedage Grade B rated
Language:
Tags:
avec  choices  dans  des  django  est  les  mais  models  nous  par  pas  pour  qui  sont  state  sur  une  vous 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: Creaone.fr

Creaone.fr



L’expérience est une lanterne que l’on porte sur le dos et qui n’éclaire jamais que le chemin parcouru. Confucius



Updated: 2015-11-19T10:31:36+00:00

 



Chainer les requêtes Django

2014-03-17T09:14:34+01:00


from datetime import datetime
from django.db.models import Manager
from django.db.models.query import QuerySet
class TodoMixin(object):
def is_done(self):
return self.filter(done=is_true))
#ecrire ici vos nouvelles méthodes
def order_by_user(self):
return self.order_by(user)
class TodoQuerySet(QuerySet, TodoMixin):
pass
class TodoManager(Manager, TodoMixin):
def get_query_set(self):
return TodoQuerySet(self.model, using=self._db)
class Todo(models.Model):
done = models.BooleanField()
objects = TodoManager()

L'implémentation permet de passer de :

Todo.objects.filter(done = True)

à

Todo.objects.is_done()

Très pratique côté template.

 Et il est possible de chainer de la facon suivante :

Todo.objects.is_done().order_by_user()



Terminal léger : Tilda + dvtm

2014-05-23T13:57:53+02:00

Utilisant intialement Yakuake je viens de trouver le duo gagnant Tilda et dtvm. Contrairement à Yukuake les paquets à installer sont léger et ne contraint pas à installer des librairies dépendantes de l'environnement graphique KDE.

Installation

  1. sudo apt-get install tilda dtvm
  2. ALT + F2  puis taper tilda
  3. Dans les préférences de Tilda choisir dvtm au chargement

DVTM

Pour créer une nouvelle fenêtre dvtm, utiliser le raccourci CTRL + G  puis C.  Vous pouvez créer autant de fenêtre que vous désirez. Consulter la man page de dtvm pour découvrir les autres commandes.

Via la souris il est possible de passer d'une fenêtre à l'autre. Si la séparation en fenêtre ne suffit pas CTRL + SHIFT + T permet de créer un nouvel onglet dans Tilda.

Amusez-vous bien.

(image)




Alternative low cost à la Scie plongeante Festool TS55

2014-04-09T23:34:13+02:00

Amateur, passionné de bricolage, vous avez sans doute croisé la scie plongeante Festool TS55. Elle vous semble idéale, seulement voilà, selon le modèle elle coûte entre 410€ et 575 €. Vous avez bien regardé la concurrence Dewalt DWS520KR , Mafell MT55CC ou encore Bosh GKT55GCE, Makita SP6000K, tout ceci est encore bien cher. Après essai d'un modèle FESTO ancêtre Festool j'ai pu terminer ma cuisine encastrée à l'aide d'une scie plongeante Scheppach CS55. Je vous propose mon avis très personnel. Peu rassuré au départ, on peut trouver cette scie plongeante sous divers nom : Scheppach, Kity, Woodstar, Redstone. Évidemment le prix varie selon l’appellation et le magasin. Pour ma part j'ai acquis cette machine chez Weldom pour 139 € nue. De plus, en ce moment pour l'ouverture d'une carte (gratuite), Weldom offre 10% La documentation jointe au produit est ridicule. Tout y est mal expliqué, les illustrations contiennent des erreurs dans la numérotation des pièces. Le produit est réellement vendu nu, Vous ne trouverez aucun accessoire à l'intérieur malgré les photos de l'emballage et les illustrations sur internet. Il existe plusieurs pack d'options nommé "Paquet d'accessoires" : Paquet d'accessoires I : 2 colliers à vis, 1 entretoise, 1 dispositif anti-retour (butée) ( 39 €) Paquet d'accesoires II : 1 dispositif anti-basculement (15 €) (non dispo chez Weldom), idéal pour la coupe d'angle Rail de guidage 1400 mm ( 50 € ) Effectivement pour le produit complet on passe alors à environ 250 €. Je trouve assez dommage de fournir le rail de guidage sans les serres joints, j'ai eu la bonne surprise de découvrir un rail sans accessoires. Il est toujours possible de placer des serre-joints classiques sur le rail, cela fonctionne très bien, mais c'est loin d'être pratique pour le passage du bloc moteur de la scie. Enfin 39 € pour deux serres joints et une entretoise pour prolonger avec un autre rail c'est assez cher. Après achat de cette option et après réflexion il est très facile de se confectionner un kit se rapprochant de Festool pour 25 €. L'entretoise est une simple barre de métal, les serres joints sont remplaçables par des modèles à serrage à une main comme par exemple des Wolfcraft . Si le temps me le permet et si vous êtes intéressés je ferais un autre article sur le sujet. Qualité et réglages Je ne suis pas expert du matériel, mais j'ai noté un léger jeu sur la table de la scie. Une fois posée sur le rail, un débattement est perceptible. Il y a des cales pour corriger le jeu mais cela me semble inefficace. Après déballage faire attention que tous les vis soient correctement serrés. La lame est une version 160 mm à 24 dents au carbure de tungstène. J'aurais préféré une version 48 dents pour une découpe plus précise surtout sur du mélaminé revêtu. Comptez environ 30 € pour une lame 48 dents de marque bosch. La descente de la lame est souple comme pour le modèle Festo que j'ai testé. La nuissance sonore est identique, le casque est obligatoire surtout si l'exposition est prolongée. Le réglage de profondeur est aisée mais si encore une fois le serrage se fait sur une cale plastique peu convaincante. Je n'ai pas encore testé la coupe d'angle (45 ° max). La table de la scie est en aluminium, des encoches laissent supposer que d'autres fonctions de guidage sont possibles. Le rail seulement disponible en 1400 mm est en aluminium. On aurait aimé plusieurs version (800 mm, 2000mm etc) . Sur la partie inférieure des caoutchoucs sont collés. Les caoutchoucs sont mal collés et un peu court dans mon cas. Lors de la première utilisation le joint caoutchouc qui déborde doit être découpé à l'aide de la scie. Ce procédé est identique à tous les rails de guidage. Pour comparaison, les joints fournis par Festool me semblent plus efficaces, car plus adhérents, même après 15 ans. J'ai volontairement présenté les points négatifs du produit, aussi [...]



En vrac

2012-11-07T03:09:59+01:00




Avis livre : Css maintenables avec Sass et Compass

2012-11-02T13:50:17+01:00

(image) Dérouler du code CSS pour ne pas dire pisser du CSS, ajouter quelques propriétés ici et là, surcharger une feuille de style, tout le monde sait faire ou presque. Si vous travaillez à plusieurs, reprenez le travail d'une précédente agence, ou travaillez seul sur un ancien projet vous êtes confronté au problème de maintenance des CSS : c'est inévitable. Vous suivez les normes du W3C, vous vous référez aux bonnes pratiques et pourtant rien ne semble plus pénible que d'intervenir sur votre feuille de style, pas de panique, c'est NORMAL. Vous avez besoin de méthodes métiers, d'organisation, d'un process solide.

Je pense que le livre CSS Maintenables de Kaelig Deloumeau répond à ce besoin. Dans la critique suivante je vais tenter de donner mon avis sur cet ouvrage.

Ce livre ne s'adresse pas à tout le monde, il est destiné principalement aux intégrateurs / développeurs à cinq pattes avec quelques bleus. Mieux vaut avoir été confronté aux css de 300ko pour comprendre toute l'importance du livre. Ce livre est bien dans l'air du temps puisque sans vraiment le dire on vous explique comment industrialiser vos développements et procédures de travail.

Le titre est un peu trompeur, on ne traite pas uniquement de Sass & Compass on parle également de méthode daisy, oocss, 960 grids et plus généralement de bonnes pratiques métiers. C'est donc plutôt CSS maintenables "procédures et outils"

Le livre est simple à lire mais je reste avec l'idée qu'il y a beaucoup de répétitions > Exemple : Du code est présenté puis 10 pages plus loin replacé puis expliqué. Les points les plus intéressants sont les études de cas. Les exemples et les contre-exemples sont formidables. Autre reproche le concept de "framework" est assez mal expliqué, toutes les solutions présentées sont dans le même sac "framework" et il est évident que l'auteur a une grande préférence pour Sass & Compass. A la lecture il n'est pas aisé de comprendre l'intérêt/ différence de Sass et de Compass.

Enfin, même si j'ai grandement apprécié l'ouvrage, il manque un approfondissement de Sass & Compass comme le titre le suggère, mais l'auteur à prévu une documentation en ligne.




Comparatif web performance des candidats 2012 - les images

2012-03-28T12:49:39+02:00

Bien que tous les candidats souhaitent s'adresser au plus grand nombre de citoyens, voyons voir si leur site web le leur permet vraiment. Ici je propose de vous focaliser sur la partie "images". Si vous voulez comprendre brièvement les différentes étapes de la web performance l'article "prélude" est pour vous. Le protocole Tous les résultats sont issus de l'extraction des images de la page d'accueil des candidats 2012, le 10 mars 2012. Les images retenues sont au formats PNG, GIF et JPG. L'outil d'extraction utilisé est l'extension Image Picker 1.0 pour Firefox. Le logiciel d'optimisation utilisé est ImageOptim pour MacOs. Tous les optimisations effectuées sont automatiques. Les données brutes Candidats Nombre d'image Avant optimisation Après optimisation Gain en Ko Ratio poids/images Arthaud 21 1074 ko 637 ko 437 ko 30 ko Bayrou 69 2706 ko 2233 ko 473 ko 34 ko Cheminade 19 391 ko 382 ko 9 ko 20 ko Dupont 19 467 ko 427 ko 40 ko 22 ko Eva Joly 29 1129 ko 994 ko 135 ko 34 ko Hollande 41 3834 ko 288 ko 3548 ko 7 ko Lepage 31 563 ko 430 ko 133 ko 14 ko Le Pen 39 1437 ko 1322 ko 115 ko 34 ko Melenchon 55 804 ko 666 ko 138 ko 12 ko Poutou 62 849 ko 720 ko 129 ko 12 ko Sarkozy 37 901 ko 846 ko 55 ko 23 ko Villepin 46 4323 ko 3336 ko 987 ko 73 ko Au vue des statistiques 2011 il apparait que le poids total moyen des images pour un site est de 600ko pour 75 éléments. Ce qui nous donne un ratio 8ko / image. Je ne connais pas l'écart type mais cela donne déjà une idée pour faire vos propres comparaisons. Analyse Avant Optimisation automatique Pour être raccord avec le monde politique, carton rouge pour le candidat François Hollande, l'optimisation est tout simplement ahurissante. En regardant de plus près on s'aperçoit que deux images .png de 18 px x 53px sont à l'origine de 3.6 Mo. Je ne sais pas quel logiciel est utilisé pour générer ceci. Il est fort probable que les serveurs du candidat soient dimensionnés pour envoyer une grande quantité d'informations, mais imaginez un seul instant une connexion depuis un modem 56ko. En plus, c'est du gachis. Pour information après optimisation on passe de 3.6 Mo à 1.4 ko . Parmis les ogres, nous retrouvons le site de François Baryrou avec 2.7mo, Arthaud avec 1mo, Le Pen avec 1.4mo, Eva Joly avec 1.1mo et enfin Villepin avec 4.3 mo de données images. Pour revenir aux statistiques globale de 600ko au mieux c'est deux fois plus que la moyenne mondiale au pire sept fois plus. Après optimisation automatique Les gains Enorme surprise, un des pires devient le meilleur. Le site de François Hollande réalise un énorme gain avec 3.5 mo économisés. Hormis Cheminade tous les candidats peuvent profiter largement de cette optimisation qui prend 10 minutes. Le top 4 des meilleurs gains et donc des mauvais élèves: Hollande, Villepin, Bayrou, Arthaud Les ratios après optimisations Pour Hollande, le ratio tombe à 7ko par image. C'est le seul candidat capable d'accrocher la moyenne mondiale. Ensuite dans les bons résultats, on retrouve Melenchon, Poutou et Lepage. Mais que nous indique le ratio ? Au vue des résultats on s'aperçoit que malgré les optimisations jpg, png "simples" certains ratios indiquent que des efforts supplémentaires peuvent être faits, notamment sur le choix de résolution/qualité des jpg. Villepin apparait ici avec le plus mauvais ratio : 73ko par image. Les "bons" candidats La réponse est malheureusement aucun, tous peuvent faire plus d'efforts sur la réduction du poids de leurs images. La taille des images a un inpact important mais le nombre d'images aussi. Pour le bien être de tous les utilisateurs il semble raisonnable de limiter le nombre d'images à une soixantaine. Si malgré cela vous devez afficher un nombre important d'images au format jpeg vous pouvez utiliser la version "progressif" voir fourni[...]



Comparatif web performance des candidats 2012 - Prélude

2012-03-28T14:35:21+02:00

Prenant une place de plus en plus importante, nouveau critère inpactant le référencement, la web performance est aujourd'hui un sujet brûlant. Passer les étapes désormais élémentaires à savoir "être présent sur internet" et "avoir un site agréable et joli", on cherche désormais un site rapide. Quantifiables et donc monétisables, les sites d'e-commerce sont aujourd'hui capables d'estimer assez précisément le coût de chaque millisecondes perdues. Assez rare pour le souligner, l'amélioration significative de la performance peut être en partie gérée par des processus automatique simple, c'est à dire apporter beaucoup avec très peu d'efforts contrairement à d'autres disciplines comme l'accessibilité, la sécurité ... Le gain est immédiat, c'est aisément percevable par la cible, le retour sur investissement est facilement calculable, ce qui explique l'engouement grandissant pour cette discipline. La web performance c'est quoi ? La web performance se découpe en plusieurs volets, classiquement on les nomme ainsi :La génération de la page : BACKEND La diffusion des données: NETWORK Le rendu du document : FRONTEND Générer la page La génération de la page concerne le serveur, on parle de "BACKEND". Dans les schémas modernes cela fait très souvent appel à un ensemble de langages et de technologies différentes : routage url , appel à la base de données, passage à un moteur de template etc.. C'est le métier du serveur et cela ne nous intéresse pas pour deux raisons : 1. Si nous ne faisons pas partie de l'équipe de développement, nous n'y avons jamais accès 2. Cela ne représente rien face à la performance coté client.   Recevoir les données Bien que la partie NETWORK soit intéressante, c'est une étape considérée la plupart du temps par les grands comptes. Assez récemment et en pleine expansion pour accélérer le chargement on utilise de plus en plus la méthode des CDN. Voyez cela comme des autoroutes de l'information.Quelques vérités générales pour comprendre la partie NETWORK: Moins vous utilisez le réseau et plus le chargement de votre site est rapide Moins il y a de noeud séparants le client du serveur plus le chargement est rapide Quand le chemin est déjà connu, on a toujours un peu d'avance Quand on parallélise le chargement, les données sont reçues plus rapidement. Au lieu de télécharger élément par élément on télécharge quatre par quatre.    .Afficher la page Une fois la page générée par le serveur, transmise sur le réseau et récupérée sur le poste client, il ne reste plus qu'à l'afficher. C'est une étape complexe pour votre navigateur et stressante pour votre processeur, sachez-le. Plus la page contiendra d'images,  plus votre code sera mal écrit, plus la génération prendra du temps.Les experts parlent souvent de la loi des 20% / 80%.  Sachez que 80 % des gains peuvent être obtenus côté client, donc penchons nous sur cette partie. En effet comme vous pourrez le constater dans les prochains articles, quelques lignes de code dans un fichier de configuration et une optimisation automatique des images permet de gagner déjà beaucoupAfin d'éviter les railleries : Oui on commence à s'intéresser aux performances côté client lorsque les performances côté serveur ne posent pas de problème. De mon point de vue, je dirais que passer une seconde à générer la page devient non négligeable (modulo le type de serveur et la particularité du site). On ne demande pas les mêmes performances à un blog et un service web permettant d'effectuer des traitements d'images.  Les français et leur équipement numérique Contrairement au parc informatique d'une entreprise, le web est un joli bourbier où on ne contrôle ni la diffusion, ni le rendu. C'est d'autant plus vrai aujourd'hui. Au niveau de l'équipement on a historiquement le 56k, l'ad[...]



Stratégie de sauvegarde - Partie 2

2012-01-31T10:53:24+01:00

Rembobinons. Dans la première partie, nous avons conclu que le plan le plus sûr de stockage de données ressemble à peu près à ceci:disque sur la machine locale : original ou copie master ; disque de stockage en réseau : copie commune ou partagée ; le stockage hors ligne, qui signifie de nos jours stockage à distance dans le nuage (le « Cloud » en anglais) ou sauvegarde en ligne. Extrait du Magazine Full Circle 54 p18 - Allan J. Smithie (version FR) Il ne s'agit pas simplement de succomber au « tout dans les nuages » à la mode. Une vraie sauvegarde hors site utilise le centre de données de quelqu'un d'autre, qui est lui-même sauvegardé. Cela offre la tranquillité d'esprit maximale, car vous saurez que vos précieuses et éphémères données ne peuvent pas être perdues, même si votre version originale part en fumée ou dans des inondations ou se fait exterminer par un « écran bleu de la mort ». Nous connaissons tous les problèmes avec la solution de sauvegarde traditionnelle : soit ce n'est pas fait régulièrement, soit quelqu'un envoie la mauvaise génération de bandes vers le coffre hors site. Ou votre DVD de données reste pendant six mois sur le dessus de l'armoire alors que vous auriez dû l'apporter chez grand-maman. Le « Cloud » est peut être la mode  de l'année pour l'instant, mais cela ne signifie pas que vous devez ignorer, disons, la multitude de nuages disponibles. La sauvegarde dans le nuage est devenue une industrie en soi. Votre seule réelle difficulté est de choisir quel nuage et quel fournisseur répondent à vos besoins. Tout le monde semble offrir du stockage dans le nuage, ce qui n'est pas la même chose qu'un service de sauvegarde dans le nuage. Peut-être que nous devrions commencer par examiner une check-list pour vous aider à prendre la décision. Le coût C'est par là que je commence toujours. Y a-t-il des frais initiaux ? Quelle est la redevance mensuelle ou annuelle ?  Quel volume de stockage puis-je obtenir pour mon argent ? Quel niveau de service - c'est la performance et le temps de disponibilité - est-ce que je paie ? Quel écart de prix y a-t-il entre ce service et les bandes de stockage ? La sauvegarde dans le nuage est un marché encombré et immature pour l'instant, avec des pourvoyeurs qui réclament notre attention. Pour le chef de famille moyen, il existe des offres de lancement avec des forfaits de base à un coût nul, mais c'est un leurre car le but est de nous en vendre plus ultérieurement. J'aime l'espace de stockage gratuit. On dirait que tous le fournissent, donc nous devons affiner nos critères. Les logiciels Tous les services d'expérience offrent un client logiciel dédié pour gérer les processus de transfert de fichiers. Tous prétendent être multi-plateformes, du moment où ça signifie Windows et Mac. Beaucoup ont maintenant un client Linux disponible. J'aime l'idée des transferts par un navigateur, appelé aussi « ne PAS avoir à utiliser un programme propriétaire pour accéder au service ». C'est là qu'Ubuntu One marque des points, même s'il s'agit de stockage de base dans le nuage plutôt que d'une      véritable sauvegarde dans le nuage pour l'instant. La facilité d'utilisation Nous voulons aussi la facilité d'utilisation, ce qui signifie : une configuration et une installation simples et terminées en quelques étapes après le téléchargement du logiciel ; une sauvegarde en ligne qui peut fonctionner en tâche de fond pendant  que nous poursuivons notre activité normale, sans monopoliser toute notre bande passante ; un réglage pour la vitesse d'upload (ou téléversement) est essentiel ; une définition aisée des fichiers inclus et exclus pour chaque jeu de    sauvegarde, jusqu'au plus bas niveau de granularité comme le nom ou le type de fichier, en utilisant des caractères joker ; un planificateur qui [...]



Femme d'Ubuntu

2012-01-06T00:20:50+01:00

Cet été, l'équipe d'Ubuntu Women a élu, comme chaque année, ses chefs de projets. Parmi ceux-ci, il y a deux nouvelles venues, Cheri Francis et Jessica Ledbetter, ainsi qu'une responsable en place, Elizabeth Krumbach. Nous avons posé à ces dirigeantes des questions concernant leur travail jusqu'à ce jour et les objectifs actuels du projet d'UbuntuWomen. Extrait du Magazine Full Circle 53 p43 - Elizabeth Krumbach Cheri Francis Ubuntu-Women fut l'une des premières salles IRC en rapport avec Ubuntu où moi, nouvelle utilisatrice, j'ai osé entrer. Depuis ce jour, les gens qui la fréquentent me soutiennent un max et sont tout simplement des gens bien. J'essaie de trouver comment « rendre » service au projet en échange et j'espère que, en tant qu'une des responsables, je pourrai le faire. Je travaille dans ma LoCo (Communauté locale) à encourager la  articipation et à rendre le groupe accueillant envers les nouveaux utilisateurs et les personnes qui s'y impliquent. Je crois vraiment en l'aspect communautaire d'Ubuntu et je l'ai vu se manifester en de nombreuses occasions depuis que j'en fais partie. Les objectifs de Cheri pour Ubuntu Women Un projet Journées carrières : tenir une série de sessions « un jour dans la vie de … » où l'on parlera d'emplois divers dans le domaine des technologies de l'information et de ce que font certains de nos membres dans la « vraie vie ». Publicité : augmenter la visibilité du projet, aider des gens qui participent à d'autres projets à se rendre compte que de petits changements peuvent créer un accueil plus chaleureux pour tout le monde (y compris les femmes). LoCo Outreach [Ndt : augmenter le rayonnement des LoCo] : agrandir notre liste des « meilleures pratiques » et servir de ressource pour des LoCo qui voudraient accueillir tout le monde et les encourager à se sentir à l'aise. Elizabeth Krumbach Depuis 2006, je suis membre actif du projet Ubuntu Women où je participe dans tous les secteurs du projet, y compris : la création du canal IRC et l'entretien de la liste des membres y ayant accès, l'administration sur Launchpad, l'administration du site Web, l'administration du wiki et je suis responsable des comptes rendus mensuels de l'équipe. Je me suis impliquée dans la mise sur pied de la série Ubuntu  women dans le magazine Full Circle, j'ai eu l'occasion d'être présente aux Ubuntu Developers Summits (Lucid, Maverick, Oneiric) en rapport avec le projet et j'assisterai au prochain UDS concernant la sortie de la nouvelle version LTS l'année prochaine. Les objectifs d'Elizabeth pour UbuntuWomen Notre site Web est la première chose ayant un rapport avec l'équipe que les gens voient et le thème en est très dépassé. Nous allons continuer notre travail de mise en place du nouveau thème, afin de pouvoir le publier avant la fin de l'année. Le programme des mentors que nous avons actuellement est très décontracté - des gens deviennent membres de l'équipe et desmembres de l'équipe leur présentent des gens et des ressources au sein du projet Ubuntu. J'aimerais vraiment que l'on arrive à formaliser le processus afin de pouvoir recueillir davantage de retours pour apprendre comment améliorer notre programme.. Jessica Ledbetter Actuellement, je suis développeur et concepteur Web qui crée des applications en Java, Python et Ruby. En plus du développement à temps plein pour une entreprise, je suis aussi développeur sur Peer 2 Peer University (http://p2pu.org/). J'utilise Linux depuis des années et Ubuntu depuis pas mal de cycles. Le projet Ubuntu Women fut l'un des premiers canaux IRC sur freenode dont je suis devenue membre. C'était un environnement parfait pour en apprendre davantage sur le projet Ubuntu en entier et aussi pour trouver des façons de s'y impliquer. À cette époque, tout le monde était très accuei[...]



Stratégie de sauvegarde

2012-01-05T12:14:45+01:00

Il n'y a rien de pire pour un mordu d'informatique que l'idée d'une perte de données, surtout si ce « geek » est un accumulateur de trucs depuis une ou deux décennies. Nous sommes tous en train d'opter pour le numérique : musique, albums photographiques, correspondance, tout est si commode, tout, si éphémère. Ce n'est pas bon pour l'état d'esprit de quiconque de savoir que les disques durs tombent en panne : la gravité, la surtension, les maliciels et la bêtise humaine font tous bien des ravages. Ce dont on a besoin, c'est un filet de sécurité ; une stratégie de sauvegarde. Oh, regardez ! il se trouve que j'en ai une… Extrait du Magazine Full Circle 53 p17 - Allan J. Smithie Ce qu'il faut sauvegarder Ne paniquez pas pour les logiciels. La perte d'un programme n'est qu'un désagrément, puisqu'ils peuvent être remplacés facilement, surtout les logiciels Open Source ; c'est beaucoup plus facile que de devoir chercher au fond d'un tiroir la clé (licence ou activation) des programmes propriétaires. Le vrai drame, c'est la perte de données. Les données peuvent être inestimables et, littéralement, irremplaçables. Alors, quels fichiers faut-il sauvegarder ? Les photos, documents, feuilles de calcul, calendriers, courriels (boîtes de courrier ou messages individuels). Et la musique aussi si, comme moi, vous avez une vieille médiathèque rippée d'une bande magnétique. C'est d'une importance capitale de savoir où tout se trouve. Il faut absolument faire un inventaire détaillé de votre système - y compris les clés USB et les disques durs externes - en commençant par une recherche basée sur les types de fichier (les extensions). Ne supposez pas que vous ou votre chéri(e) sauvegardez des trucs dans des dossiers spécifiques. Lancez cette recherche et notez où tout se trouve. Faites le ménage et remettez tout en ordre. Rationalisez. Supprimez les doublons. Décidez de ce qui est vital et actuel. Videz la corbeille. Vous n'allez pas vouloir les fichiers dans le cache système, les fichiers temporaires, les fichiers swap ou les fichiers page, car il n'est guère possible d'en extraire quelque chose d'utile et, de toute façon, ils se remplissent de saloperies. S'il y a quelque chose dans le cache que vous voulez garder, copiez-le vers un emplacement plus sûr. Vous aurez besoin de connaître les types de fichiers (décrits la plupart du temps par l'extension du fichier, comme .odt, .pdf, .mpeg, .mp3, .mp4) afin de pouvoir mieux préciser les inclusions et exclusions lorsque vous ferez des sauvegardes. Les bases de données (.dbf, .db) peuvent avoir des conditions supplémentaires de sauvegarde pour pouvoir traiter des fichiers verrouillés ou ouverts, des archives et des index. Pensez à votre inscription vitale au club, à une liste de mailing, au catalogue de vos vidéos ; les sauvegardes peuvent être mises hors d'usage si vous faites la sauvegarde pendant qu'ils sont verrouillés (en train d'être modifiés). Mieux vaut les fermer, avec les applications qui se servent des données, pendant que vous faites une sauvegarde. Où sont les fichiers/données à sauvegarder ? Le disque dur local (interne) est l'emplacement numéro un, suivi des disques externes, des disques réseau (serveur), NAS (« Network Attached Storage » - un lieu de stockage lié au réseau), SAN (« Storage Area Network » - un réseau dédié au stockage et des ordinateurs connectés en réseau poste-à-poste. Les clés USB « flash » sont un endroit excellent où garder les plus récentes copies « sneaker-net » des documents [Ndt : Les « sneakers » sont similaires aux baskets et un sneaker-net - qui sonne comme ethernet - est un « réseau » à pied !], suivies de près par les disques durs externes USB ou Firewire. J'ai déjà des copies « temporaires » ou semi-b[...]



Django - Dénormalisation d'un queryset

2011-11-24T14:04:01+01:00

Dans quelques rares cas, l'ORM de Django ne suffit plus. Lorsque votre requête est spécifique il existe plusieurs solutions que j'expose dans cet article illustré par le tri de liste.

Je reprends ici l'exemple de la dénormalisation. Dans le cas présent nous souhaitons récupérer une liste de critères triée par numéro (1, 2, 3). Si la vie était bien faite, un simple order_by sur l'attribut "numero" suffirait. Oui à condition que ce dernier soit un "integer" dans la base de données. Malheureusement l'attribut est un "CharField" / " Champ texte" et il est strictement interdit de corriger le type de champs (on stocke également des éléments de la formes IMA-2).

Deux étapes importantes :

  1. Convertir l'attribut "CharField" en attribut "Integer" sur demande
  2. Créer la méthode de tri

Convertir l'attribut en entier

Le numéro est stocké dans l'attribut "num" de notre modèle, nous souhaiterons le transformer en entier si c'est possible.

    def get_num_in_integer(self):
        try:
             return int(self.num)
        except ValueError:
            return self.num

Trier / dénormaliser

criteria = sorted(criteria, key=lambda a: a.get_num_in_integer())

Petite ligne magique permettant de trier une liste de critère en fonction de son numéro, converti en entier à la volée

Prudence

Très bien, mais garder bien à l'esprit que la dénormalisation est à effectuer en cas de force majeure et surtout à la fin de vos vues, juste avant de passer le bébé au template.

Un queryset est une liste mais une liste n'est pas un queryset : Une fois passé dans la moulinette du "sorted" aucune méthode de queryset n'est disponible ! ce n'est plus un queryset mais une liste.. c'est compris ?

Utiliser une méthode de queryset sur une liste

Le titre est exagéré, il est préférable de dire "créer une méthode de liste".

Comment faire ?

IRC python-fr (flupke je crois) me répond  Il faut sous classer mon ami 
class MyList(list):
    __slots__ = () #optimisation ah oui ?

    def count(self):
        return len(self)
criteria = MyList(criteria)

Et voila côté template je peux ainsi utiliser aveuglement "criteria.count" comme si je manipulais un queryset.




Django - QuerySetManager - Bonnes pratiques

2011-11-23T12:12:14+01:00

J'ai déjà parlé de l'intérêt des querySetManager et de leur mise en place dans un projet Django. Désormais avec un peu de recul et l'intervention d'Olivier Meunier (l'homme aux milles pseudonymes), il semble plus pertinent d'externaliser la création du manager et du queryset. C'est à dire, pour l'exemple ci-dessous, définir tout ce joyeux code en dehors de la classe "Project".

Voici les 3 étapes importantes pour pouvoir utiliser un Querysetmanager

  • Création de la classe
  • Création du manager
  • Création du queryset + définition des méthodes

La classe appelle le manager qui appelle le queryset ce qui nous donne Classe > Manager > Queryset

Création de la classe

from django.db.models.query import QuerySet
from django.db.models import Model, Manager

class Project(Model, ...):
    name = CharField(max_length = 100)
    description = TextField(blank = True, null = True)
    url = URLField(verify_exists = settings.SERVER_WEB_ACCESS)
    ...
    objects = ProjectManager() # Appel du manager

Création du Manager

class ProjectManager(Manager):
    def get_query_set(self):
        return ProjectQuerySet(self.model) # Appel du queryset

Création du Queryset

class ProjectQuerySet(QuerySet):
    def get_coworkers(self):
        coworkers = []
        for project in self:
           for coworker in project.get_coworkers():
               coworkers.append(coworker.id)
        return User.objects.filter(pk__in = coworkers)
    def get_toto(self):
        return ...

En pratique

On peut désormais utiliser les méthodes get_coworkers() et get_toto() sur un queryset Project.

Project.objects.filter(name__contains=".net").get_coworkers() --> Récupère l'ensemble des collaborateurs des projets dont le nom contient ".net"




Avis VPC Boost, une bonne expérience client

2011-10-06T23:05:00+02:00

Très souvent, dans un élan de rage, soif de justice, on empoigne le clavier pour dénoncer la boutique en ligne qui nous contriste avec ses délais prolixes et son S.A.V chimérique. Bref une fois n'est pas coutume. Je vais dire du bien d'une boutique, oui je vous assure. Cette expérience est mienne, si vous rencontrez des problèmes avec cette boutique, je suis peiné d'avance mais je ne peux vous aider.

Pour faire simple et rapide, j'ai acheté un réfrigérateur, un matelas,un four pyrolyse, et une brosse à dent électrique, tous de grandes marques à prix imbattables. Croyez-moi j'ai regardé toutes les enseignes sérieuses ainsi que les pure players (LaRedoute, Amazon, RueDuCommerce, Conforama)... Je suis bien tombé, il faut le croire à la bonne période, 20 % sur le matelas et frais de port gratuits, sur des produits déjà au plus bas prix constaté, avec petit bonus livraison à domicile et à l'étage ! Ne connaissant pas la boutique VPC boost j'ai téléphoné pour avoir un premier contact, surtaxé certes, mais aucune attente. On m'a même rappelé sur mon portable et mon fixe pour me fournir des informations complémentaires. Avec les mails, j'avoue qu'ils sont moins rapides. L'envoi de trois produits sur quatre a été très rapide et soigné ~ 3-4 jours. Surprise, pour la notification d'envoi des produits j'ai reçu un mail, un sms et un appel de mémoire.. En quelques mots je recommande donc vivement cette boutique.




Django : Trier vos utilisateurs par ordre alphabétique

2011-09-16T09:05:33+02:00

Il existe probablement d'autres solutions. Dans cet article je vous donne les clés pour réussir à trier correctement les utilisateurs par nom et prénom. L'exercice est assez simple lorsque l'utilisateur a renseigné correctement son identité, c'est à dire "Nom et Prénom". Cela devient plus chaotique, quand un seul des champs est renseigné. Liste factice LEGRAND Simon - simon@mail.com THOMAS Robert - robert@mail.com PETIT Catherine - catherine@mail.com BONNET Georges - georges@mail.com THOMAS Alfred - alfred@mail.com Alfred et Robert ne se connaissent pas Solution de fortune User.objects.filter(...).order_by('last_name', 'first_name') Soyons honnête cette requête suffit dans la majorité des cas. Mais que fait elle ? Elle trie par ordre alphabétique par nom puis prénom. Donc appliquée sur la liste ci-dessus cela nous donne : BONNET Georges - georges@mail.com LEGRAND Simon - simon@mail.com PETIT Catherine - catherine@mail.com THOMAS Alfred - alfred@mail.com THOMAS Robert - robert@mail.com Maintenant imaginons le pire. Mr LEGRAND Simon et Mme Catherine ne renseignent plus leur nom de famille. On obtient ainsi : Simon - simon@mail.com Catherine - catherine@mail.com BONNET Georges - georges@mail.com THOMAS Alfred - alfred@mail.com THOMAS Robert - robert@mail.com Oui mais moi je veux voir Simon et Catherine à leur place c'est à dire en se basant sur le "S" de Simon et le "C" de Catherine. Trois solutions pour trier la liste Trois solutions, un seule retenue. Il n'y a pas de meilleure, tout dépend de votre besoin. Utiliser Raw Sql pour fusionner la colonne "last_name" et "first_name" et effectuer un tri sur cette fusion Créer un nouveau champs dans la DB, celui ci étant la fusion de "last_name" et de "first_name" Dénormaliser la requête et utiliser une méthode métier Première solution : Performance moyenne et obligation d'écrire en SQL. Requête simple si cela provient directement du models "User", beaucoup plus compliqué si c'est une liste d'utilisateur extraite d'un projet. (project.get_users) .. avec potentiellement une multitude de filtres. Deuxième solution : Performance haute, obligation de créer un nouvel attribut dans User Profile, surcharger la méthode save(). Si votre base est en place, vous devez générer cette colonne. Oblige également à passer par get_profile(). Le plus pratique serait de directement modifier la table "User". Troisième solution: Performance moyenne, vous devez ajouter une méthode au models User (User redéfini par Meta Class) et écrire la dénormalisation. J'ai choisi la troisième solution, l'historique du projet facilitait le choix. En effet User était déjà redéfini par MetaClass donc finalement une méthode, une dénormalisation et c'était dans la poche. La méthode métier sur User Nommez-la comme vous voulez. def get_full_name_inverse(self): return (("%s %s") % (self.last_name.capitalize(), self.first_name.capitalize())).strip() Cette méthode fusionne le nom et le prénom. Elle supprime les espace en début et fin indésirable. Très important pour le tri ! Cette méthode ajoute une belle majuscule au nom et au prénom. L'intérêt est uniquement visuel La dénormalisation users = User.objects.filter(...) users = sorted(users, key=lambda a: a.get_full_name_inverse()) Et voici la version qui permet de gérer les caractères accentués. Merci pour Fabrice pour l'astuce. import locale users = User.objects.filter(...) locale.setlocale(locale.LC_ALL, "fr_FR.UTF-8") users = sorted(users, cmp=locale.strcoll, key=lambda a: a.get_full_nam[...]



Template Tag pour Django extended choices

2012-03-21T11:58:06+01:00

Voici un simple tag à copier coller dans votre projet afin d'utiliser très simplement "extended choices" côté template. Cet article est un complément de Django Extented Choices.

Edit : 15/10/2011 Il existe une méthode directement intégrée à Django : https://docs.djangoproject.com/en/dev/ref/models/instances/#extra-instance-methods. (Merci Dom). Cette méthode suffira dans la majorité des cas, sinon voir exemple ci-dessous.

Simple tag

from pdn import constants
@register.simple_tag
def get_constant(constant, value, constant_type="CHOICES_DICT"):
    try:
        return getattr(getattr(constants, constant), constant_type)[int(value)]
    except AttributeError:
        return "NC"

Exemple de constates:

VISIBILITIES = Choices(
    ('PRIVATE', 0, _(u'Privé')),
    ('SHARED', 5, _(u'Partagé')),
    ('PUBLIC', 10, _(u'Public')),
)

Côté template

Ici company.visibility vaut 0

  • {% get_constant "VISIBILITIES" company.visibility %} -> Privé
  • {% get_constant "VISIBILITIES" company.visibility "CHOICES_DICT" %} -> Privé
  • {% get_constant "VISIBILITIES" company.visibility "CHOICES_VARNAMEDICT" %} PRIVATE

PS: Merci à Haypo et Sp4rKy pour la simplification d'écriture




Annuler un git push

2011-09-08T22:18:00+02:00

Astuce rapide :

  1. Obtenir le numéro de version des commits grâce à la commande git log -2
  2. Créer une patch entre la dernière version du dépot et la version -1 : git diff > 01.patch.
  3. Appliquer le patch inversé : patch -p1 -R < 01.patch
  4. "Comiter" puis envoyer de nouveau vers le dépôt central : git ci -a -m "Annulation dernier push" puis git push

Note : Il me semble qu'avec git diff > 01.patch, il n'est pas utile d'utiliser la commande -R lors de l'application du patch




Linutop 4 : Le micro-ordinateur écolo

2011-08-25T00:14:00+02:00

Linutop, rare spécialiste européen des ordinateurs à faible consommation d'énergie, nous propose aujourd'hui sa dernière machine le LINUTOP 4. Sur la même trajectoire que les précédentes versions testées, le linutop se veut compact, léger, économe et à l'épreuve du temps (pas de pièce mobile). Basé sur un système d'exploitation et une batterie de logiciels libres, le linutop est capable de répondre à divers besoins bureautiques. Prix 380 € TTC Linutop 4  + 55 € extension de garantie 3 ans. (Coût sans frais de port)Pc green, la cible ? Quatre versions ont défilées, la cible du linutop est toujours la même à savoir les bibliothèques, écoles, universités, musées, administrations, hôtels, hôpitaux, cybercafés voir même le particulier avec des besoins strictement bureautique. Sa faible consommation est un atout certain. Si une bibliothèque souhaite 20 ordinateurs branchés sans interruption à une prise électrique, cela revient à 2600€ par an contre 320€ pour le linutop 4.. y a pas photo ! si l'ordinateur est uniquement voué au surf web, il est plus que conseillé d'opter pour un linutop. Malgré "son caractère verrouillé", le linutop peut également convenir pour une utilisation serveur maison. Si vous connaissez déjà Linux Ubuntu et que vous aimez jouer l'admistrateur système ce sera un jeu d'enfant. Linutop 4 en quelques pictos En bref voici grâce à quelques pictogrammes les spécificités du Linutop 4. Vous verrez ainsi ce qu'il fait et ce qu'il ne fait pas en un clin d'oeil. 0 db (sauf ajout disque dur interne Sata) Température réduite Encombrement record. 86 fois plus petit qu'un Pc de bureau Linutop4 14W soit 17€ par anPc normal 100W soit 130 € par an Système d'exploitation gratuit, open source basé sur Linux Ubuntu Lucid Lynx 10.4 Pas d'antivirus nécessaire Idéal pour la navigation Internet et l'envoi d'email. Suite logicielle bureautique incluse : OpenOffice 3.2 Communiquer avec Pidgin sur les réseaux Jabber, Msn, Aim, Irc ... . Enregistrer votre voix (micro non inclu), écouter votre musique préférée N'est pas inclus avec le linutop Attention aucun périphérique n'est inclu avec le linutop, j'entend par là, pas de clavier/souris, pas d'écran, pas de micro, pas d'enceinte, pas de lecteur/graveur, pas de disque dur. Pour le branchement d'un disque dur (SSD par exemple en branchement SATA) un câble est disponible en option pour 30€ , oui  moi aussi je trouve ça un poil cher. Contrairement aux versions précédentes vous pouvez trouvez très facilement ce genre de branchement.Fiche technique Poids : < 1kg Processeur : Intel ATOM N270 1.6 GHz -> consommation 2.5Watts Mémoire : 1024 Mo DDR2  extensible à 2048 Mo Stockage : 2go Flash dont 772 Mo disponible 5 ports Usb2 1 Port RJ45 GigaLan Vidéo : 2 Sorties VGA et DVI - GMA950 Résolution : 1920 x 1440 max Accélération graphique 3D. (Branché en DVI <-> HDMI 1920 x 1200 chez moi, aucune configuration n'a été nécessaire)  Audio : 1 entrée micro et 2 sorties audio Jack standard 3mm 1 Port Com t RS232C , branchement avec une station météo par exemple ? Branchement interne 2 Sata / 1 Baie 2,5'', 1 PCIe 12V – 3,3A AC adapter 110-240V~ 50/60Hz Rapport détaillé Hardinfo Points positifs Démarche courageuse Consommation énergétique limitée Meilleure réactivité du système d'exploitation, en utilisation bureautique, au regard des précédentes versions Taille très réduite du produit Linutop Kiosk : Permet très facilement de transformer le pc en borne d'accès internet sécurisé, ou en borne d'affichage, sympa pour les agenc[...]



Django extended choices

2011-09-11T22:50:16+02:00

Django extended choices permet de gérer avec simplicité et efficacité les constantes au sein d'une application Django. Cet article fait suite à la publication de J-Mad. Installation git clone https://github.com/twidi/django-extended-choices/tree/master Comment ça marche ? Avant l'utilisation du plugin STATE_ONLINE = 1 STATE_DRAFT = 2 STATE_OFFLINE = 3 STATE_CHOICES = ( (STATE_ONLINE, 'Online'), (STATE_DRAFT, 'Draft'), (STATE_OFFLINE, 'Offline'), ) STATE_DICT = dict(STATE_CHOICES) class ContentModel(models.Model): title = models.CharField(max_length=255) content = models.TextField() state = models.PositiveSmallIntegerField(choices=STATE_CHOICES, default=STATE_DRAFT) related_to = models.ManyToManyField('self', through="ContentToContent", symmetrical=False, blank=True, null=True) def __unicode__(self): return u'Content "%s" (state=%s)' % (self.title, STATE_DICT[self.state]) def get_related_content(self): return self.related_to.select_related().filter(state=STATE_ONLINE) Après l'utilisation du plugin from extended_choices import Choices from django.utils.translation import ugettext_lazy as _ STATES = Choices( ('ONLINE', 1, _(u'Online')), ('DRAFT', 2, _(u'Draft')), ('OFFLINE', 3, _(u'Offline')), ) class ContentModel(models.Model): title = models.CharField(max_length=255) content = models.TextField() state = models.PositiveSmallIntegerField(choices=STATES.CHOICES, default=STATES.DRAFT) related_to = models.ManyToManyField('self', through="ContentToContent", symmetrical=False, blank=True, null=True) def __unicode__(self): return u'Content "%s" (state=%s)' % (self.title, STATES.CHOICES_DICT[self.state]) def get_related_content(self): return self.related_to.select_related().filter(state=STATES.ONLINE) Plus clair non ? Récapitulatif Vous souhaitez obtenir une liste de tuples, utile pour remplir vos DjangoForm : STATES.CHOICES Vous souhaitez obtenir la valeur d'une constante : STATES.ONLINE --> 1 Vous souhaitez obtenir le "label" STATES.CHOICES_DICT[1] --> 'Online' ou 'En ligne' selon la langue Vous souhaitez obtenir le nom de la constante (voir le patch qui suit) STATES.CHOICES_VARNAMEDICT[1] --> 'ONLINE' Vous souhaitez utiliser une syntaxe "tableau" pour éviter que Aptana vous engueule (voir également patch qui suit - Merci Mickaël Hoareau) STATES['ONLINE'] Version patchée # -*- coding: utf-8 -*- class Choices(dict): def __init__(self, *choices, **kwargs): name = kwargs.get('name', 'CHOICES') self.add_choices(name, *choices) def add_choices(self, name, *choices): CHOICES = [] CHOICES_DICT = {} CHOICES_RDICT = {} CHOICES_VARNAMEDICT = {} for choice in choices: const, value, string = choice if not hasattr(self, const): setattr(self, const, value) else: value = getattr(self, const) CHOICES.append((value, string)) CHOICES_DICT[value] = string CHOICES_RDICT[string] = value CHOICES_VARNAMEDICT[value] = const setattr(self, name, tuple(CHOICES)) setattr(self, '%s_DICT' % name, CHOICES_DICT) setattr(self, '%s_RDICT' % name, CHOICES_RDICT) setattr(self, '%s_RDICT' % name, CHOICES_RDICT) setattr(self, '%s_VARNAMEDICT' % name, CHOICES_VARNAMEDICT) def __getitem__(self, key): if not hasattr(self, key):[...]



Récursivité au sein d'un template django

2011-07-11T09:36:00+02:00

Pas de nouveauté fracassante, juste l'exemple d'une syntaxe simple et dépouillée présentant la récursivité du côté des templates. L'exemple présente l'affichage d'une liste de commentaires en cascade. Cf Screenshot. (Valide Django 1.2)

Template parent

Il suffit simplement de déporter l'affichage des commentaires du côté d'un fichier à inclure. Ici on appelle le fichier _comments.html.

Dans comments_list.html

{% include "checklists/workshops/_comments.html" %}

Template enfant

Toute la magie se trouve dans le template à inclure. Ici on appelle continuellement _comments tant qu'il y a des enfants (childrens).

Dans _comments.html

{% if comments %}

{% for comment in comments %}	
	{{ comment.creator.get_full_name }}	
	{{ comment.description }}

	{% with "_comments.html" as filename %}
		{% with comment.get_childrens as comments %}
			{% include filename %}
		{% endwith %}
	{% endwith %}

{% endfor %}

{% endif %}

Liste de commentaires + html + css

(image)




Turpial, client twitter rapide et complet pour Ubuntu

2011-07-08T10:05:00+02:00

Bien que complet, je me suis vite lassé de Gwibber et notamment de son extrème lenteur. Le client twitter (écrit en python) que je vous propose aujourd'hui gère uniquement Twitter et Identica. Rapide, efficace parfaitement intégré à Gnome, c'est LE client desktop qu'il faut installer.

Attention, les manipulations indiquées dans l'article et les liens mentionnés peuvent compromettre la stabilité de votre système, je décline toutes responsabilités. Les paquets présentés ci-dessous ne sont pas officiels !

Installation

Dans un terminal taper ceci :

  • sudo add-apt-repository ppa:effie-jayx/turpial
  • sudo apt-get update
  • sudo apt-get install turpial

Utiliser turpial

  • ALT + F2
  • Taper tout simplement : turpial

Les points positifs

Dans le désordre

  • Notification sonore et visuelle
  • Se lance rapidement, l'accès aux préférences, tweets se fait rapidement. Léger :consommation mémoire approche ~ 50 Mo.
  • Changement des préférences twitter directement depuis turpial (Nom, Localisation, Url, Biographie)
  • Utilisation Systray -> se masque dans la barre supérieure
  • Possibilité de suivre une nouvelle personne
  • Recherche globale intégrée
  • "Raccourcisseur d'url" intégré et configurable
  • Uploader d'image intégré et configurable
  • Affichage multicolonnes
  • Visualisation lu / non lu

Les points négatifs

  • Limité à 3 colonnes

(image)