Django class based views - Index
Escrit per Aaloy a 12 de May , 2012 a les 8:15 p.m.
L'altra dia un amic em va dir que li resultava complicat anar navegant pel conjunt d'articles de les Class Based Views de Django, així que el que he pensat és fer una mena d'índex amb aquest apunt i posar-ho a la portada.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
El lector de Bernhard Schlink
Escrit per Aaloy a 12 de May , 2012 a les 8:08 p.m.
L'altra dia vaig acabar de llegir "El Lector" de Bernhard Schlink, en l'edició que ha fet l'editorial Empúries i la traducció de Carme Gala.
És un d'aquests llibres que comana la meva parella i que per una raó o l'altra acaba a les meves mans. Sols ser perquè m'he quedat sense lectura o me fa ganes veure què tal.
El llibre són 170 planes de lletra menuda, o millor dit, normal. És un llibre on el personatge ens descriu la seva història, fent bots al present i al passant i reflexionant damunt el que li passa.
M'ha agradat molt la història, tot i ser dura. El temps de la narració està molt ben aconseguit, et pots capficar ràpidament amb la història, però així com van avançant les planes s'esvaeix la impressió inicial de que seria una novel·la negra. Més aviat, així com avança la lectura et vas endinsant dins el món de les paraules de l'autor, dins les descripcions, sense esperar res més que la següent línia, sense sorpreses sobtades, però amb una gran bellesa narrativa.
En definitiva, m'ha agradat força i el recomano.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Parc Bit, FAQ
Escrit per Aaloy a 29 de April , 2012 a les 10:14 a.m.
Fa gairebé 4 anys que tenim l'empresa APSL al Parc Bit, primer en règim d'incubació a l'Edificit Naorte i actualment som al l'edifici NTIC en una oficina compartida amb una altra empresa.
Sovint venen altres empreses i emprenedors que ens demanen si és bo estar al Parc Bit per a una empresa que comença, si es fan relacions comercials, si fa fon fer feina, aquest apunt intentarà contestar a tot això des de l'experiència d'aquests anys.
La situació
El Parc Bit és al cul del món, tant per les coses bones com per les dolentes. Quan hi arribes, per la carretera que duu a la UIB i vols anar als edificis d'oficines el primer que has de fer és deixar el cotxe al parking i travessar un petit torrent. Els jardins estan molt ben arreglats i la primavera i la tardor, i a l'hivern quan el torrent duu aigua és una meravella.
Com veis ens trobam en que és un lloc fantàstic per anar a fer feina però que està molt mal comunicat i obliga a la gent a accedir-hi en cotxe si o sí. Els parkings comencen a estar plens i això és un problema a l'hora de que et venguin a veure clients, ja que la passejada que poden arribar a fer per anar a una oficina qualsevol pot ser de 15 minuts.
Resumint, una vegada has arribat i has pogut aparcar la passejada fins al lloc de feina a mi em resulta relaxant, i també la sortida, ja que te permet comentar la jugada amb els companys. Però si teniu previst que a la vostra empresa us visitin clients, el Parc no és el lloc més adient, a no ser que vinguin i s'entornin en Taxi.
En aquest aspecte nosaltres començam a tenir queixes dels clients que venen a veure'ns de tant en tant i que tenen força dificultats per aparcar.
El cost
No ens enganem, el Parc és car, com ho eren (o potser encara ho són els Polígons de les nostres Illes). El m² d'oficina està als voltants dels 10 o 11 € i a això li haureu de sumar el cost de la comunitat de l'edifici i també la part proporcional del manteniment de les instal·lacions del Parc. Es poden trobar oficines per molt menys preu dins Ciutat o als pobles. Tot depèn del volum de la vostra empresa i de les vostres necessitats. El problema del Parc és que et cobren normalment per m² i hi ha poques oficines petites, així que et pots trobar en que estàs a una oficina de 80 m² pagant entre 800 i 1200 €/mes sense comptar neteja i subministraments.
Com en el nostre cas hi ha l'opció d'agafar una oficina gran i compartir-la entre dues empreses, però això sovint no és fàcil.
També s'ha de valorar que quan has de créixer la disponibilitat d'espai que tens és limitada. Vull dir, quan obris el ventall de cerca a Ciutat, als pobles i barriades, les possibilitats de trobar un espai de les dimensions que cerques són molt majors que les que tens al Parc.
Les comunicacions de dades
Quan hom pensa en un Parc Tecnològic pensa en que les comunicacions han d'estar omnipresents: fibra òptica per tot, satel·ltis, datacenters, ... Deixau de somiar! Aconseguir una línia telefònica ADSL a nosaltres ens va costar 3 mesos i no som un cas aïllat. La velocitat màxima de l'ADSL és de 10 Mbits/s quan hi ha sort i ONO no té massa interès en posar fibra a tots els edificis. Ara mateix nosaltres tenim una connexió de 4Mb/1Mb rellogada a la gent d'SMI ja que ens interessava molt tenir bona velocitat de pujada, i és el millor que hem aconseguit (a un cost raonable, clar).
Les instal·lacions del Parc
El parc posa a disposició de les empreses diverses sales de conferències, ben equipades llevat de les connexions a Internet. El personal del Parc és molt atent i fan molt bona feina i t'ajuden en el que necessites. És del tipus de gent que m'agrada, que intenta donar-te solucions enlloc de problemes.
Hem fet servir les instal·lacions del Parc al Creant Bits i anat allà a cursos i conferències i n'estam força contents.
El Parc també té zones comunitàries on poder menjar, amb microones per encalentir la carmanyola. Estan netes i ben cuidades. Molt bé també.
Serveis de tercers
No en cerqueu massa que no en trobareu. Una oficina bancària, 3 ó 4 caixers automàtics, 3 bars/restaurants i una gestoria. Poca cosa més. Els bars tanquen a les 18 h, així que heu de tenir previst que si un client ve tard o la reunió s'allarga, no anireu a fer un cafè al capvespre.
Donat que no hi ha gaire competència els preus estan com a qualsevol altra banda, llevat que tens menys on triar.
Trobar material d'oficina o una tenda dins el Parc directament descartat.
De tant en tant hi ha intents de posar-hi negocis, supòs que atrets pel que se suposa que és una gran quantitat de gent que hi ha al Parc, però la majoria van tancant.
Xarxa social
Una de les coses que "et venen" quan es xerra del Parc Bit és la possibilitat d'establir col·laboracions socials entre empreses del Parc. Quan he parlat amb altra gent he vist que aquesta impressió no és sols meva, sinó que la gent amb la qui he parlat també em demanava si aquest aspecte hi és.
Me dóna la sensació que la impressió que és té des de fora és que les empreses del Parc estan desitjoses de col·laborar entre sí, que tenen les portes obertes als emprenedors i que la vida social i les relacions empresarials són el pa nostre de cada dia. Res més lluny de la realitat.
El Parc s'assembla molt a qualsevol altre polígon en aquest aspecte. Les empreses estan per feina i llevat de a l'hora del cafè i del dinar allò és una zona desèrtica. A l'hora del cafè o del dinar tampoc espereu que es us atraqui ningú a presentar-se i a demanar-vos si voleu col·laborar amb un o altre projecte.
El que sí és cert és que si fa temps que estàs fent feina en el sector de la informàtica o el turisme, hi ha moltes possibilitats que trobis molts coneguts i saludats quan entres o surts de l'oficina o potser fent un cafè.
Per la resta no us imagineu el lloc com una starup de pel·lícula on la gent pot anar a berernar quan vol o estira les cames. Les empreses que tenen el volum més gran de gent són empreses de tall tradicional i personal de l'Administració pública, amb horaris d'entrada i de sortida.
Ambient de feina
Pots tenir la mala sort que et toqui vora un edifici en construcció i llavors tindràs renou, però si no és així el Parc és un lloc silenciós, net, on es poden sentir els ocells i no es sent el remor de cotxes passant, ambulàncies i pitades de cotxes. Personalment és aquesta, junt amb la passejada matinal i les zones enjardinades, una de les coses més aprecio del Parc.
La incubadora d'empreses
El Parc té una incubadora d'empreses que, una vegada aprovat el projecte, et subvenciona part del cost de l'oficina, i recentment han posat en marxa un espai de treball compartit per gent que sols necessita una taula.
És un servei que a nosaltres ens va anar molt bé i que ajuda a vèncer la por a muntar una empresa innovadora. El servei d'Incubació quan nosaltres hi érem era molt proactiu organitzant cursos i fent seguiment de les empreses
Convé muntar una empresa al Parc Bit?
No puc respondre a aquesta pregunta. Heu de valorar el que us estic contant, veure el tipus d'empresa que voleu iniciar i després valorar-ho per vosaltres mateixos.
El Parc té coses bones i coses dolentes i és cada un que les ha de valorar.
En aquest article he intentant contar-vos el que jo veig basant-me amb la meva experiència personal.
Us he de dir que ara per ara estic, en general, força content, però si el tema del parking es segueix complicant (ara mateix hi ha 3 edificacions a mig fer força grans) o ens veiem amb la necessitat d'ampliar l'empresa, llavors no quedarà més remei que considerar també altres alternatives i valorar-les com us estic dient que hauríeu de fer si estau considerant el Parc per a muntar el vostre proper negoci.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: General APSL
¿Qué te importa lo que piensen los demás?
Escrit per Aaloy a 22 de April , 2012 a les 11:21 a.m.
Avui estic com un toro: m'han clavat dues banderilles clavades per mor d'una ciàtica que fa que no pugui asseure'm a l'ordinador més de mitja hora sense que el dolor em faci aixecar de la cadira.
Llegir és més senzill, ja que em permet anar variant la postura, o llegir de dret, així que he aprofitat per acabar de llegir el segon llibre que vaig dur de Barcelona.
Aquest segon volum, molt més curt que el primer, es centra un poc en la vida personal de Feynman i sobretot en la investigació que va fer de l'accident del Challenger. És una lectura interessant per veure com es mouen els fils de la política i com és per dintre un projecte tan complex com el del transbordador, com es feia feina amb ordinadors obsolets per no tenir que passar novament per costossíssimes proves de validació. Molt interessant.
M'ha agradat molt un paràgref: "Para que una tecnología tenga éxtio, es preciso que la realidad tenga precedencia sobre las relaciones públicas, pues a la Naturaleza no se la puede engañar."
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Codi per fer-se la foto
Escrit per Aaloy a 21 de April , 2012 a les 7:32 p.m.
L'altra dia vaig llegir una notícia que s'havia donat una subvenció a una empresa per a desenvolupar un programa que es posaria a disposició pública (no vaig aclarir si com a codi obert o no). Això se suposa que és una manera que tenen les administracions d'afavorir un sector donant-li part de la feina feta.
En principi no hi veig res dolent amb això. Com a partidari i defensor del codi lliure veig amb bons ulls que les administracions alliberin programari per a posar-ho a disposició de la societat, pel problema que li veig és que com moltes altres vegades les intencions no van acompanyades d'una visió i comprensió de què és el programari lliure i de com evoluciona.
En aquest cas, com en tants d'altres que promou l'administració, la tecnologia elegida pel concurs va ser Java-J2EE. Tecnologia que encara que estigui molt estesa en l'empresa pública, ja no ho està tant en petites i mitjanes empreses.
Una implementació de referència feta per a posar-la a disposició de les PIMES feta amb Java (o .Net) és una mala idea. Costa molt desplegar la tecnologia i fer-se amb el codi.
Per a que el programa alliberat pugui evolucionar i es faci servir, com hauria de ser l'objectiu principal, hem de preveure que el nivell d'entrada del programador ha de ser el més suau possible. És a dir, no s'ha de fer el programari pensant sols amb el client final, sinó pensar que el client serà el programador i per tant cal fer-li la feina fàcil.
Crec que és un dels motius del perquè els projectes Python (Rails o PHP) creixen de manera molt més ràpida que els projectes Java, per una par el llenguatge en sí fa que siguin molt més bons de programar, però a més la incorporació de nous programadors és molt més senzilla, ja que són llenguatges molt més bons de seguir si els comparam amb Java.
Les grans empreses, les que ja fan feina amb Java i tenen pressupost multimilionaris en programació el més probable és que si necessiten el programa que fa l'administració ja se'l facin o ja el tinguin fet. Les PIMES sols l'utilitzaran si hi ha programadors que li donin suport i en puguin fer el manteniment, i si aquest manteniment està a l'abast del seu pressupost. Fer-ho amb Java/.Net per la conveniència de l'administració no és més que un malbaratament de recursos, ja que el cost del suport que pugui donar un programador local en Java serà molt més gran i necessitarà molt més temps. Potser tan gran que no sortirà a compte a la PIME utilitzar la tecnologia.
Fer el mateix amb un llenguatge com a Python té l'avantatge de que la lectura del codi és tan clara que es pot portar a un altra llenguatge fàcilment, i que le modificacions i el nivell d'entrada per al programador local són més senzilles. La PIME és més probable que ho pugui pagar, és més senzill que tot o part del programa es pugui incorporar a altres aplicacions i fer-lo evolucionar.
Les bones intencions no basten, no és cosa de fer l'anunci i fer-se la foto, sinó que és important que la feina tingui continuïtat.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Codi lliure
¿Está usted de broma sr. Feynman?
Escrit per Aaloy a 18 de April , 2012 a les 7:40 p.m.
La setmana passada vaig estar de mini-vacances amb la família per Barcelona. Passejar i desconnectar un poc. Crec que qui s'ho va passar millor va ser el meu fill petit: això del buffet lliure l'apassiona, fins i tot es va fer amic de la cambrera, que va veure un menut espavilat anant amunt i avall, fent-se les torrades, abocant-se el sucs, ... Ho volia fer tot ell! No vull pensar en el que passarà si algun dia anam a un hotel del tipus tot inclòs :D
Una de les visites que vàrem fer va ser al Cosmocaixa. L'antic museu de la ciència. Feia molts anys que no hi havia anat i volia que els nins poguessin tocar els experiments. Recordava la part física més gran, encara que potser és que jo també era més petit.
De sortida pas obligat per la tenda i una ullada a la llibreria. Em vaig tenir que contenir, un munt de llibres de temàtica científica a l'abast. Em va saber greu tenir que triar, n'hagués arreplegat un bon munt, així que vaig anar cap a dos llibres que feia temps que volia comprar "¿Está usted de broma sr. Feynman?" i la continuacíó "¿Qué te importa lo que piensen los demás?", ambdós d'Alianza Editorial.
Ahir vaig acabar el primer, que dóna títol a aquest apunt. Són 406 planes d'anècdotes, alguna conferència i sobretot vivències de un dels físics més brillants del segle XX.
Encara que ja coneixia alguna de les històries del llibre puc dir que l'he devorat. Algunes vegades la naració és un tant dispersa, però també ho és el personatge. Un científic ple de curiositat per la vida i pel que l'envolta. Un amant de la vida, del pensament, de la ciència amb vocació real per l'ensenyança i per deixar el mon millor que l'ha trobat.
Si el tengués que definir en poques paraules ho faria amb "motivador". És meravellós veure la integritat personal de Feynman, com manté les seves idees i conviccions, vivint la vida i exposant les contradiccions de la societat que li va tocar viure. Contradiccions que podeu estar ben segurs són encara presents en la nostra societat.
Un llibre recomanable, que m'ha fet ganes de tornar a enganxar amb la Física, que demostra que efectivament es poden fer les coses d'una altra manera i ensurtir-te'n.
Avui mateix començaré l'altra!
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
vim tips
Escrit per Aaloy a 09 de April , 2012 a les 11:01 a.m.
He actualitzat la configuració que faig servir per a fer feina amb Vim per programar amb Python i Django a partir de l'article de sontek, llevant coses que no faig servir o que m'agrada més tenir en una consola: py.test, git, etc. i afegint algunes definicions que m'han anat molt bé a llarg dels anys. Ho podeu trobar a http://code.google.com/p/trespams-vim/
La millora més important és la descoberta de Pathogen, que ens permet gestionar millor els plugins i del plugin gundu que ens permet veure els canvis a un fitxer, com si fos un control de versions local.
Manteng cla configuració de backup i com que tinc força memòria als ordinadors que faig servir tenc llevat també el swapfile.
Aquest punt em servirà com a recordatori de combinacions de tecles útils a més de les habituals de vim.
- Tecla leader. Surt per tot a vim. Mapejada a coma (,)
- Tancar la finestra quickfix
,cc - Anar a una finestra:
ctrl+jklh - Veure els registres:
,r - Copiar a un registre texte seleccinat: "
y - Aferrar des d'un registre
"<registre>p" - Mostrar la finestra de canvis: `g
- Canvia el directori de treball:
,. - Executa el validador PEP8
,8 - Veure els marcadors:
:marks - Estableix un marcador m
- Ves a una marca
'<lletra>(o accent greu + marca per anar al lloc exacte on s'establí. - Obrir un buffer: :e
- Tancar un buffer:
:bqo bé:bw
Vim és tot un món, hi ha combinacions i plugins a voler. Personalment crec que el truc éstà en anar aprenent a poc a poc, perimer amb el més bàsic i després amb totes aquestes virgueries fins anar configurant un entorn on ens hi trobem còmodes.
Posant la nostra configuració a un sistema de control de versions, disposar de la nostra configuració local és trivial.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django Vim IDE
Emprenedors
Escrit per Aaloy a 19 de March , 2012 a les 9:20 p.m.
Aquests darrers dies he tingut moltes reunions, la majoria emprenedors que volien demanar un pressupost per al seu projecte. I és aquest fet el que motiva aquest article, ja que amb totes aquestes reunions i amb altres que he tingut abans, hi ha força punts en comú i convé reflexionar-hi
Sóc un emprenedor
Enhorabona! Jo també. Per mi un emprenedor és un projecte d'empresari. És a dir, algú que té una idea de negoci i que ha de demostrar-ne la seva viabilitat i aconseguir posar-lo en marxa.
El que he vist és que hi ha gent que fa servir aquest concepte com a sinònim de "no tenc pressupost" o "no et puc pagar per la teva feina". Amb això ja començam malament. Primer perquè per poder menjar i mantenir el meu propi projecte, jo necessit cobrar la feina, que això de la informàtica potser t'omple espiritualment, però no t'omple la panxa.
Més enllà de l'anècdota, crec que tota aquesta publicitat de converteix-te en emprenedor més enllà de la visió romàntica també hauria de tractar aspectes pràctics. Que en les n-mil conferències i trobades es tracten molt per damunt els problemes reals. Emprendre també té un component de viabilitat econòmica, el pla de negoci que s'ha d'avaluar, s'han de saber d'on sortiran els recursos. Suposar que algú ens farà la feina gratis és, ja d'entrada, menysprear la feina que farà l'altra.
Vull dir, si la teva idea és molt bona, però no hi vols arriscar doblers, demanar a algú que faci feina per tu, i que hi posi la seva feina (que vol dir doblers indirectament) a canvi de un futurible, o d'un "ja cobraràs quan el negoci funcioni" per mi ja directament descarta el projecte. Si tu ja arrisques doblers, jo puc veure que t'ho la prens seriosament, i llavors puc contemplar fer feina per manco de la tarifa habitual o a posar-hi hores de manera gratuïta a canvi d'una participació a l'empresa. Però com dic, el risc ha d'estar equilibrat, i el programador o l'empresa de programació no pot assumir el risc del negoci.
Emprendre un negoci en el món de la informàtica amb unes mínimes garanties d'èxit no es pot fer sense pressupost. Segons el projecte serà més gran o més petit, però si no ets directament que fa el producte i el comercialitza, hauràs de pagar algú per a que et desenvolupi el producte. Però no tan sols això, has de pagar les despeses de l'empresa, de hostejar els servidors, del lloguer, telèfon, ...
Si la idea és molt bona, llavors hem de pensar que segurament algú en aquell precís moment potser també la té. I per tant, treure el projecte o no és una qüestió de qui serà el primer, o de qui pot suportar millor les pèrdues.
Personalment crec que la gent que va muntar Amazon per exemple, també eren emprenedors, però la seva idea de negoci i de ser els primers era tan clara que els primers anys gastaren gran quantitat de diners per tal de garantir que ningú altra podria seguir el seu ritme.
Així doncs, emprendre en un negoci online, sense tenir un mínim pla de negoci i uns recursos per a subsistir i aguantar una temporada és poc menys que suïcida. La setmana passada, i em va saber molt greu, em vaig trobar fent un mini-pla-de-negoci en 5 minuts per tal de demostrar a aquella persona, que venia tota il·lusionada que la seva idea sense un bon finançament no era viable. Tenir que ser tu que facis tocar de peus a terra la gent que te ve amb una idea no és gens divertit.
Senyors que organitzau conferències de recolzament a emprenedors, per favor, no aneu dient que tot és un camí de roses. Parlar de rondes de finançament, de grans números us fa quedar molt bé, però la crua realitat és una altra. Al nostre país és molt complicat trobar inversors, és molt complicat muntar un negoci online, tot són entrebancs: des de les passarel·les de pagament del segle passat, a la legislació que et ferma de peus i mans i no et deixa competir amb legislacions molt més orientades a negoci com l'anglosaxona.
El projecte el farà un freelance.
Tens una idea, la idea es bona i hi ha un poc de finançament. Però com que ets un emprenedor la feina te la fa un freelance. Eps! Cap problema, conec freelance força bons. El problema, és que això és sinònim de dir que "m'ho fa un paio i surt a un preu molt baix".
S'està pensant a molt curt plaç. No vull dir que no es tengui que mirar el preu, sinó que si el teu negoci dependrà del desenvolupament que et faci algú extern s'ha de pensar també amb la continuïtat del projecte. Els freelance bons són cars i van cercats. Si no és així és que quelcom falla. A un sector on no hi ha pràcticament atur, que algú faci feina per molt menys del preu de mercat a mi personalment em feia sospitar quan era a "l'altra costat".
Quan un empren i una bona part del seu negoci estarà basat en una aplicació web s'ha d'assegurar en el que pugui la continuïtat del desenvolupament. S'ha de preveure que hi haurà canvis, errors, adaptacions que algú haurà de fer. I en desenvolupament hem de pensar que agafar codi d'algú altra és molt més costos que si has de mantenir codi que ja coneixes o que està fet d'acord amb uns estàndards definits.
Potser pel teu negoci un freelances serà el que necessites, però al manco ho has de tenir clar i avaluar-ne els riscs. Contractar algú com a freelance sols pel fet que surt més barat és estar assumint un risc molt gran que pot posar en perill el negoci.
Com m'ajudarà Django?
Ja ho tenim clar, tenim pressupost i tenim clar el perquè hem triat aquella empresa o aquell desenvolupador freelance. La tecnologia amb el que un desenvoluparà l'aplicació web de la seva startup també té importància. Hem de tenir en compte dues coses: la facilitat per fer modificacions i l'escalabilitat.
Pensem que quan posam en marxa el nostre negoci poques vegades el que hem pensat funciona a la primera. Hem de fer adaptacions tant al model de negoci com a la tecnologia. I això ho dic també per pròpia experiència. La manera de fer les coses que teníem fa 4 anys no és la mateixa que tenim ara. Ens hem tingut que anar adaptant a les necessitats dels nostres clients per a poder donar-los servei. En alguns casos amb inversions internes de mesos i és un procés que no s'acaba mai (o que no s'hauria d'acabar mai).
Per això és molt important que la tecnologia que facem servir ens permeti desenvolupar ràpid, però sobretot que ens deixi fer modificacions i posar-les en producció tant o més ràpid que fent el desenvolupament des de zero.
Per què hem triat i recomanam Django? Doncs per això mateix. Django separa el que és la base de dades, del model de dades, regles de negoci i capa de presentació. Això vol dir que podem minimitzar l'impacte dels canvis, limitant-los a la capa necessària de l'aplicació. Ens permet escalar amb gent i separar rols de desenvolupament, la qual cosa ens permet desenvolupar i mantenir aplicacions grans amb un equip reduït de gent i mantenir els costs continguts.
L'estructura de desplegament de Django ens permet escalar l'aplicació afegint més servidors. Utilitats com Celery ens permeten distribuir tasques entre servidors, uWSGI, ngnix, redis, memcached, ... Hi ha tot un ecosistema de petites aplicacions altament especialitzades que treballen de manera harmoniosa i que ens permetran anar afegint més servidors i més potencia a la nostra aplicació així com aquesta ho necessiti, escalant per alt però també per baix.
Quan un desenvolupa amb Django de fet està desenvolupant amb Python (més HTML, més CSS, més Javascript) i si ha una cosa que caracteritza Python és la seva legibilitat i facilitat de manteniment.
Amb una estructura adequada per a dur els projectes, tenir que fer modificacions a un projecte passa de ser un malson a convertir-se en una tasca més. Acabam interioritzant dins l'empresa (la del client) que evolucionar és normal, que no hi ha problema, que no és un trasbals. Que es poden fer canvis, veure com funciona i si no ho fan desfer-los, ...
És la tecnologia elegida, junt a l'equip que la fa servir, el que ens permet estar tranquils quan hem de fer un canvi. Hi ha tecnologies que cada pas a producció és un esdeveniment que s'ha de planificar amb molta antelació, on sols es poden provar canvis cada cert temps perquè fer el desplegament és molt car, que no escalen cap avall el cost de mantenir un entorn de proves és prohibitiu.
Python i Django eliminen molts maldecaps i ens permeten estar tranquils. Però no us vull enganar, fer les coses pensant en el futur sempre té el seus cost. S'han de fer plans, s'han de pensar les coses per a que siguin testejables i mantenibles, no és un codificar com a un boig i ja veurem què sortirà, o codificar pensant que ja ho mantindrà un altra.
Emprendre amb seny
Així doncs si la vostra nova startup té un component informàtic important, sia web o no, pensau que hi ha un munt de coses a tenir en compte a més de la idea. Que la tecnologia compta, que l'equip que tens al darrera compta i que encara que no es digui massa a les conferències fer números i tirar de fulla de càlcul és molt important.
Per la meva banda potser em seguirà tocant de tant en tant desil·lusionar algú, però crec que ja he s'ha pres la molèstia de venir a fer una xerrada o demanar un pressupost, el mínim que puc fer és avisar-lo si veig alguna cosa que no encaixa.
No sé si fer d'advocat del diable, però el cert és que crec que si el projecte ha d'anar endavant un punt fonamental de la relació client-proveïdor ha de ser l'honestedat, i això fa que si veig alguna cosa que pot posar en risc el projecte o que el projecte no és viable, convé posar-ho damunt la taula tan aviat com es coneix. Pens que tract a la gent com m'agrada que em tractin a mi.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django APSL
La propera avisau!
Escrit per Aaloy a 11 de March , 2012 a les 5:39 p.m.
Avui prop de les dues de la matinada segons els registres twittaires en @pacoros i en @joanballester protagonitzaren una d'aquestes discussions que tant ens agraden als informàtics, donant forma a un quasi-flame twittaire. És una llàstima que seguir una conversació sigui tan mal de fer a Twitter si no ho fas directament quan se produeix. Amb la darrera novetat de la web he pogut fer-me una idea de com va anar la cosa, però al·lots, si per mala sort atribueixo una frase a un que no toca ja m'ho direu. Com que he trobat que la conversa era prou interessant, em permeto la llibertat d'extreure'n un grapat de frases, les agrup per conceptes i miraré de fer-ne alguna aportació constructiva, o destructiva, ja veurem, després de tot és un flame, no?
Programador que controla vs programador que en sap.
@juanballester diu: @pacoros Solo diferencio "buen programador" de "programador
que controla bien X lenguaje", creo que hay diferencia. No sé dónde lo siento xD
@pacoros diu: @joanballester Cualquiera que conozca bien un lenguaje, con el
suficiente tiempo y ganas puede programar buen código. Repito "y ganas".
Aquí estic més d'acord amb Juan que amb Paco. Els conceptes bàsics de programació són gairebé universals i es pot ser un bon o mal programador independent del llenguatge. Conèixer un llenguatge no és garantia de programar bon codi, fins i tot per moltes ganes que un hi posi. Hi ha una qüestió estadística pel mig, que en siu que hi ha una gran diferència entre un bon programador i un programador típic, [de l'ordre d'un factor 10[(http://blogs.construx.com/blogs/stevemcc/archive/2008/03/27/productivity-variations-among-software-developers-and-teams-the-origin-of-quot-10x-quot.aspx), i sovint ens podem trobar que hi ha programadors que tenen un factor de productivitat negatiu, sí heu llegit bé, són aquells que fan anar de bòlid a la resta. És a dir, a més del coneixement de les regles del llenguatge de programació triat, s'han de cercar unes certes aptituds individuals. Lo del "tiempo suficiente" no serveix, ja que un dels requisits que fan bo un programador és que sigui capaç d'entregar una feina en temps i forma.
Bon programdor segons l'entorn
@joanballester Está claro. Sólo te digo que lo de "buen programador"
depende de muchos factores y depende de dónde programe.
@pacoros lo siento, es que no termino de comprender qué tiene que ver
"dónde programe" con lo bueno que sea... o es que no te pillo :D
@joanballester Se puede valorar que sea rápido, que tena tasa de errores baja,
que sepa hacer algoritmos... Que sepa muchos LP sólo es un +
@joanballester Pues que el concepto "buen programador" no es universal. ¿O sí?
Yo te digo que depende de para quién programe o dónde lo haga
@joanballester Si en un proyecto todos trabajan igual menos uno que programa
"mejor" al final los demás no lo entienden y es peor
M'agrada la darrer frase de Paco perquè és totalment certa, però a la vegada paradoxal. Donat que si passa llavors estam davant d'algú que pot programar bé i no ser un bon programador. Quan un està en un equip ha d'adaptar-se a com està escrit el codi, a la manera de programar de l'equip. L'efecte que parla Paco és el de programador "prima donna", o aquell que té necessitat de mostrar que sap fer les coses de manera que ningú pot entendre. Quan parlam d'equips de feina aquests tipus de gent representen una productivitat negativa, ja que fan perdre molt de temps a la resta. Productivitat negativa per mi significa ser mal programador. Això vol dir que algú ha de programar "pitjor" per adaptar-se a l'equip? Bé, tampoc és això. S'ha d'adaptar a l'entorn o també pot mirar d'adaptar l'entorn. Vull dir, si algú programa millor o té més capacitat que la mitjana doncs té una oportunitat fantàstica de mirar d'ajudar a la resta. Un bon programador per mi també és algú que pot fer evolucionar un equip.
Com es pot veure el tema dona per molt. Potser perquè el tema del que és bo és i serà sempre una variable relativa. No hi ha absoluts. Al final programar tampoc és sols el codi, programam per les persones i no per les màquines, això ho hem de tenir clar, i quan programam ens relacionam amb l'entorn.
Supòs que per això molts consells que trobareu a l'hora de triar un bon programador es refereixen tant a la seva capacitat tècnica com amb l'encaix amb la resta de l'equip. La gent tècnica tenim tendència a tenir menys habilitats socials i a tenir un grau de frikisme major i això també s'ha de tenir en compte a l'hora de formar un equip.
Jo tenc una idea molt clara del que és per mi un bon programador, però com que està basada en factor qualitatius a més de quantitatius és força mal de fer expressar-la. Però potser si l'hagués de resumir diria que per mi és aquella persona que essent tècnicament bona li agrada formar part dels nostre grup i amb la que el grup s'hi sent bé amb ella. Quan això passa s'acaba creant un entorn òptim per al desenvolupament i com se sol dir, el tot és major que la suma de les parts.
I la propera vegada em despertau! :D
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Se buscan buenos programadores
Escrit per Aaloy a 04 de March , 2012 a les 4:36 p.m.
Hi ha una frase que diu que "a Internet ningú saps que ets un ca". El mateix es pot dir actualment del llenguatge de programació que mou una plana o aplicació web, mentre la plana faci el que ha de fer, a l'usuari que l'està utilitzant no l'interessa el més mínim amb què està feta.
Que avui en dia les planes acabin en php, asp, .do, no deixa de ser anecdòtic. Els bastiments de programació més moderns fins i tot amaguen amb què està feta la web a simple vista, a l'usuari no li cal la informació i potser estàs donant massa informació a algun visitant no desitjat.
Aquest apunt ve arrel d'un post a bonillaware, titulat se buscan buenos programadores. El post és força intressant i l'oferta de feina crec que també, però allà faig una petita reflexió: no entenc com una companyia que va de cools pot fer un error tan de base com cercar bons programadors en un llenguatge concret. Bé, ho entenc si el que cerques no són bons programadors, sinó gent experimentada amb una tecnologia en concret.
Vuit anys d'experiència no et converteixen en un bon programador en res. Si no has après el que s'havia d'aprendre els dos primers anys, afegir anys d'experiència sols pot fer que segueixis repetint sempre els mateixos errors.
Però bé, fent aquesta reflexió va hi bota algú que es sent profundament al·ludit. Potser no m'he explicat bé, però la idea és que si t'agrada la programació has de ser capaç de veure les mancances tant de Java com de qualsevol altra llenguatge de programació. Mancances i punt forts és clar. I si t'agrada molt programar i tens un mínim d'inquietud pel que fas, arribes a la conclusió que Java no és ni d'un bon tros el millor llenguatge per fer programació web.
Al comentari diu "de lo que se trata es de abstraer la realidad y modelarla en un lenguaje que las máquinas sean capaz de procesar".
Cert, això queda molt bé, però per la mateixa raó que descartam fer-ho amb binari, l'eina que triam per fer una tasca concreta té molta importància. No es tracta d'això de fet, es tracta de fer la feina de manera que sigui divertit fer-la, però també que sigui rendible, és a dir, que no ha de tenir un cost per damunt del retorn de la inversió i a més s'ha de poder mantenir i depurar amb facilitat.
En Bonilla no s'atura al fons de la qüestió, que és el perquè l'empresa que fa l'oferta ho fa en termes que contradiu la seva pròpia imatge, sinó que entra en la "guerra" del llenguatge "Yo prefiero divertirme haciendo cosas, no con el lenguaje con el que las hago".
Si hem d'anar per aquí jo vull triar les dues coses. Vull divertir-me amb els projectes, però a més vull divertir-me fent servir les eines que m'agraden. Per això faig feina amb Python, Django i Linux i no amb altres eines, perquè amb això amb diverteixo fent els projectes. Segurament podria guanyar molt més com a programador o cap de projecte Java (de fet guanyava més que ara), però no em divertiria tant.
Personalment em motiva molt que els temps entre la idea i la posada en producció s'acurcin, no tenir que fer sobrearquitectures, poder encaixar i triar les millors peces. Tenir eines potents de desenvolupament i depuració.
Java no és un mal llenguatge, o no ho era, ara ja l'han complicat massa. Per a la web la cosa encara està pitjor, es pot fer de tot, és veritat, però no amb la facilitat i eficiència d'altres llenguatges. Si anau pels apunts antics del blog hi veureu posts dedicats a Hibernate i Spring, escrits quan la gent ens mirava com a "rarets" quan dèiem que Struts no era "la manera" de fer les coses i que hi havia tecnologies millors.
En l'època que vaig estar a càrrec dels projectes webs de TUI España, record que fins i tot ens vàrem fer la típica "encerrona" amb gent de Thales per tal d'esbrinar si el que deiem era cert o no. Això de fer servir Ant pels desplegaments, control de versions, Tomcat enlloc de JBoss, Linux per als servidors, amb Apache al davant, Hibernate per a la part de persistència, Spring com a MVC i IoC i JSP-EL a la capa de presentació, era massa per gent acostumada a fer feina amb Oracle Forms i on el concepte de codi compartit que es tenia era una carpeta compartida Windows amb una fulla de càlcul.
Amb el vist-i-plau de Thales que no va tenir més remei que reconèixer que ells estaven començant a fer servir el mateix (quan nosaltres ja dúiem un grapat de projectes entregats) vam anar desenvolupant webs per TUIE.
La cosa, però és que cada cop el negoci requeria d'un temps de resposta més curt. El negoci turístic, com tants d'altres, necessita les coses, per ahir, i tot i que el nivell de desenvolupament Java-J2EE era prou bo, començarem a mirar cap a altres tipus d'eines que ens permetessin donar un temps de resposta millor. Rails començava a apuntar maneres i tot l'equip va anar a fer un curs a la CAEB, que per cert impartia Guillem Cantallops.
També era l'època de l'alliberament de Django. També apuntant molt bones maneres i fet amb Python. Vam avaluar les dues possibilitats, PHP ho descartàrem gairebé des del principi, massa emperons. Havíem fet el curset de Rails i els exemples i vam fer els primers prototips amb Django.
Juan (a.k.a @morenosan), com jo mateix, ja teníem experiència fent feina amb Python i sabíem de les possibilitats d'aquest llenguatge. Històricament les projectes Python van evolucionant molt bé, ja que el llenguatge és molt llegible i facilita la incorporació de nous programadors als projectes. Podíem haver tirat cap a Ruby i Rails, però ens sentíem més còmodes amb Python i Django així que tiràrem cap allà. El nombre de projectes webs que poguérem treure és multiplicà i el temps de posada en producció era senzillament ridícul.
Alguns projectes els reférem des de zero per a reduir-ne el manteniment. A més de poder-los fer en una fracció del temps i de codi, resultà que a més el rendiment era molt millor. La sobrearquitectura de Java estava fent molt de mal.
Va ser una època molt bona, però hi havia maror per ca'n TUI. Consultors de recursos humans que deien als desenvolupadors que "la mejor opción es irse" es van sumar a tot el que significa un procés de fusió amb HotelBeds.
A HotelBeds hi vaig trobar gent molt bona, però després d'estar-hi gairebé mig any em vaig trobar com al principi amb TUI, sols que aquesta vegada l'immobilisme era encara major. Condemnats a no fer res nou, a fer feina amb tecnologia obsoleta i/o propietària em vaig plantejar un canvi radical d'aires. APSL va sorgir de l'aposta per la tecnologia, per divertir-se programant i fent projectes.
Què el llenguatge de programació no importa? Sí que importa, importa si t'agrada el que fas i la programació no és una manera de passar hores davant un teclat com qui veu créixer l'herba. Importa si ets una consultora interessada en facturar el més possible, en aquest cas millor triar Java, .Net o posar TIBCO per orquestrar serveis que encara no tens. Importa si et dediques a la programació Copperfield, "entrego el programa y desaparezco", en aquest cas segurament el PHP t'anirà d'allò més be.
Però si t'agrada la programació la teva maledicció serà que no et conformaràs mai. Sempre cercaràs maneres de fer millor les coses, llenguatges que provar per si són millors que el que fas servir ara. Noves llibreries, nous editors, noves eines. Seràs un inconformista, un tocacollons si m'apures, però recorda que l'evolució tècnica (potser tota l'evolució) prové precisament de gent que no es conforma amb el que hi ha.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django Java
Django class based views (VII) - Epíleg
Escrit per Aaloy a 24 de February , 2012 a les 12:02 a.m.
El món de les class based views dóna per molt, la possibilitat de sobreescriure funcions, canviar paràmetres i anar combinant mixins fins a obtenir el que necessitam ens permet reutilitzar molt de codi i de manera elegant.
En aquest darrer post de la sèrie veurem algunes de les situacions més habituals en les que ens podem trobar i la facilitat amb que es resolen.
El formulari per defecte no és el que vull
Sovint quan editam un objecte mitjançant un formulari ens trobam que hi ha camps que no volem que s'editin. A l'exemple que hem fet servir fins ara imaginem que no volem que una vegada s'ha crear l'slug es pugui modificar.
Per fer això el que hem de fer és crear un formulari nou. Com que es
bo tenir les coses organitzades ho farem dins el fitxer forms.py
class SampleEditForm(forms.ModelForm):
class Meta:
model = Sample
exclude = ('slug',)
i llavors a la classe que implementa l'edició li direm que agafi aquest formulari per a editar l'objecte
from forms import SampleEditForm
class SampleUpdateView(UpdateView):
model = Sample
success_url = reverse_lazy('tutorial_list_sample')
form_class=SampleEditForm
Volem poder filtrar/ordenar els resultats
El ListView és un component idial per a fer cerques i filtres. Amb una fulla d'estils i un poc de javascript podem fer gairebé de tot. Per a no complicar-ho massa suposem que el que volem és establir dos filtres: un per quantitats positives i un de negatives, a més de l'opció per defecte que serà la de mostar-ho tot.
Afegirem els links dels filtres:
<a href="{% url tutorial_list_sample %}">All</a>|
<a href="{% url tutorial_list_sample %}?filter=positive">Positive</a>|
<a href="{% url tutorial_list_sample %}?filter=negative">Negative</a>
i ara a la classe el que farem serà sobrescriure el mètode
get_queryset de manera que tengui en compte si estam filtrant o no i
que apliqui el que correspon
class SampleListView(ListView):
model = Sample
paginate_by = 5
def get_queryset(self):
queryset = super(SampleListView, self).get_queryset()
filter = self.request.GET.get('filter')
if filter == 'positive':
queryset = queryset.filter(ammount__gt=0)
elif filter== 'negative':
queryset = queryset.filter(ammount__lt=0)
return queryset
Com es pot veure als exemples al final es tracta de'anar cercant el que s'ha de sobreescriure o extendre per a adaptar-lo a les nostres necessitats.
No vull acabar la sèrie sense referir-me a tota la part de Class Based
Views orientades a mostrar informació que ha d'estar relacionada amb
dates. Aquestes classes es troben a django.views.generic.dates i amb
el que hem vist de ben segur que no tindreu cap dificultat per a
fer-les servir.
Esper que us hagi agradat la sèrie i que us sigui profitosa. L'objectiu ha estat introduïr aquesta manera de fer les coses i organitzar el codi, que per projectes amb un bon grapat de models i manteniments, resulta amb menys codi, més ordenat i sobretot més mantenible i reaprofitable.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django class based views (VI) - Lists
Escrit per Aaloy a 23 de February , 2012 a les 8:44 p.m.
En aquesta sisena entrega (que hi ha algú per aquí ho ja us heu dormit tots?) veurem com podem mostrar llistes d'objectes que sovint podem trobar amb els CRUD.
Per a mostrar llistats (paginats o no) Django ens proporciona la
classe ListView que es pot trobar a dango.views.generic.list.
Aquesta classe és hereva de MultipleObjectTemplateResponseMixin i de
BaseListView.
BaseListView és el que la la feina, ja que és fill de
MultipleObjectMixin i de View implementant-ne el mètode get.
Com les vistes orientades als CRUD també en aquest cas tenim una plantilla per defecte, formada pel nom del model i el sufixe '_list'.
El que més ens interessa són doncs els mètodes i atributs de
MultipleObjectMixin. Primer de tot, però anem a fer-ho fàcil,
mostrarem la llista dels objectes que hem creat al post anterior:
A l'url:
url(r'^tutorial/sample/list/$', SampleListView.as_view(),
name='tutorial_list_sample'),
i al views.py podem fer
from django.views.generic.list import ListView
class SampleListView(ListView):
model = Sample
i ara haurem de definir la plantilla que tindrà com a nom
sample_list.html, primer, però és convenient conèixer quines
variables es passen al context, a saber:
- paginator
- page_obj
- is_paginated
- object_list
Els valors poden canviar en funció de si tenim paginació o no, però
les variables que tenim són aquestes. El que ens interessa per ara és
object_list que conté la llista d'objectes del model. De manera que
podem fer una plantilla del tipus:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>test</title>
</head>
<body>
<h1>Sample Detail List</h1>
<table border="1">
{% for sample in object_list %}
<tr>
<td><a href="{% url tutorial_update_sample sample.slug %}">
{{sample.slug}}</a><td/>
<td>{{sample.name}}<td/>
<td>{{sample.ammount}}<td/>
<td>{{sample.comments}}<td/>
<td>
<a href="{% url tutorial_delete_sample sample.slug %}">Delete</a>|
<a href="{% url tutorial_create_sample %}">Create</a>
</td>
</tr>
{% endfor %}
</tr>
</table>
</body>
</html>
Fixau-vos que no estic fent herència, l'html és molt simple etc. L'important aquí és veure com podem recórrer la llista d'objectes per montar les files d'una taula, i com amb el que ja sabem del CRUD podem enllaçar amb els manteniments.
Ara a l'hora de crear, editar o esborrar un registre podem elegir entre mostrar el registre o anar al llistat, afegint
success_url = reverse_lazy('tutorial_list_sample')
a les vistes que ens interessa ja ho tindriem.
Paginació
Com podem tenir molts resultats és comú que les llistes es mostrin
paginades. Per fer això el que hem d'afegir l'atribut paginate_by
que ens determinarà el nombre màxim d'elements que es mostraran per
plana.
class SampleListView(ListView):
model = Sample
paginate_by = 2
Si fem això i no modificam la plantilla, sols veurem dos registres, el que ens falta ara és afegir els controls de plana anterior i plana següent. Hi ham moltes maneres de fer la paginació i a la web en trobareu un bon munt, però per senzillesa aquest
{% if is_paginated %}
{% if page_obj.has_previous %}
<a href="{% url tutorial_list_sample %}?page={{ page_obj.previous_page_number }}">
Previous</a>
{% endif %}
<!-- current page -->
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
<!-- end current page -->
{% if page_obj.has_next %}
<a href="{% url tutorial_list_sample %}?page={{ page_obj.next_page_number }}">
Next</a>
{% endif %}
{% endif %}
Recordau que hem dit que al context es passava page_object? Doncs
fixau-vos com es fa servir per saber les propietats de la plana on
estam, el nombre de planes total, si la plana té una plana anterior o
una plana següent i el nombre corresponent a aquesta plana.
També fem us del is_paginated de manera que no mostrem el selector
de plana anterior i següent si sols hi ha una plana.
I ja ho tenim!
Al proper post, que tancarà la sèrie, veurem com podem limitar la informació que mostram als formularis d'edició
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django class based views (V) - CRUD
Escrit per Aaloy a 22 de February , 2012 a les 9:38 p.m.
Creant un CRUD
En aquesta cinquena part veurem com podem crear tot el relacionat amb un manteniment, el famós CRUD (Create, Retreive, Update, Delete).
La part de Retreive ja l'hem vista a l'article anterior, però hi tornarem per a que ens quedi un exemple complet.
Partirem del següent model:
class Sample(models.Model):
"""this is just a sample model"""
slug = models.SlugField(max_length=50, unique=True)
name = models.CharField(max_length=100)
ammount = models.IntegerField()
comments = models.TextField(blank=True, null=True)
class Meta:
verbose_name = 'Sample'
verbose_name_plural = 'Sample'
def __unicode__(self):
return self.name
Django a més de DetailView ens proporciona les següents vistes ja
construïdes per fer aquest tipus de tasques:
* `CreateView` que gestiona la creació
* `UpdateView` que gestiona l'actualització
* `DeleteView` gestiona l'esborrat
Comencem!
Creació
Definim primer la url
url(r'^tutorial/sample/create/$', SampleCreateView.as_view(),
name='tutorial_create_sample'),
Hem anomenat a la nostra classe SampleCreateView així que la
definirem al views.py
from django.views.generic.edit import CreateView
from main.models import Sample
class SampleCreateView(CreateView):
model = Sample
Amb això Django ja ens crearà internament un formulari i l'intentarà
presentar a una plantilla que es construeix amb el nom del model i el
sufixe _form, és a dir, en el nostre cas sample_form.html passant
com a variable de context el formulari creat form
Si volem fer via amb :
<form action="."
method="post" accept-charset="utf-8">
{% csrf_token %}
<table>
{{form}}
</table>
<p><input type="submit" value="Save →"></p>
</form>
ja ens anirà bé. Django ja se n'encarrega de validar el formulari
contra el nostre model. És a dir, si posam quelcom que no sigui un
nombre sencer a amount ens generarà un error.
Si creau la plantilla i posau dades vàlides i intentau guardar us donarà un error: "No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model.", poc a poc i ara hi anirem a això.
Mostram l'objecte
Encara que ja ho vàrem veure com es feia al post anterior, per completitud, ho farem també ara:
La url:
url(r'^tutorial/sample/retrieve/(?P<pk>\d+)/$',
SampleView.as_view(),
name='tutorial_view_sample'),
i al views.py
class SampleView(DetailView):
model = Sample
Recordau l'error del que hem parlat abans? Doncs el que farem és modificar el model per definir el `get_absolute_url, també podíem haver definit success_url o sobreescrit get_success_url però això ja ho vàrem veure, així que variarem un poc.
Modificam el nostre model
class Sample(models.Model):
"""this is just a sample model"""
slug = models.SlugField(max_length=50, unique=True)
name = models.CharField(max_length=100)
ammount = models.IntegerField()
comments = models.TextField(blank=True, null=True)
class Meta:
verbose_name = 'Sample'
verbose_name_plural = 'Sample'
def __unicode__(self):
return self.name
@models.permalink
def get_absolute_url(self):
return ('tutorial_view_sample', [self.id, ])
També podíem haver fet el mateix fent servir l'slug, amb la qual cosa
tindríem urls més amigables. Per això hem de canviar tant la url com
el get_absolute_url
class Sample(models.Model):
"""this is just a sample model"""
slug = models.SlugField(max_length=50, unique=True)
name = models.CharField(max_length=100)
ammount = models.IntegerField()
comments = models.TextField(blank=True, null=True)
class Meta:
verbose_name = 'Sample'
verbose_name_plural = 'Sample'
def __unicode__(self):
return self.name
@models.permalink
def get_absolute_url(self):
return ('tutorial_view_sample', [self.slug, ])
i la url:
url(r'^tutorial/sample/retrieve/(?P<slug>[-\w]+)/$',
SampleView.as_view(),
name='tutorial_view_sample'),
Què fa el permalink? doncs, com veis, crea una url per al nostre
objecte a partir del nom que li hem donat a la url que serveix per
visualitzar-ho.
Això ens permet no anar posant les urls a foc, sinó tenir-les definides amb un nom dins tota l'aplicació.
Si ara provau de fer anar el formulari veureu que ja funciona. Podem crear-lo i en guardar mostrar el resulta. Ja tenim dues de les quatre lletres, anem a veure les que falten.
Actualització
L'actualització és també molt senzilla. Farem servir UpdateView
però a diferència de la creació a la url li hem de passar bé la
clau primària de l'objecte o bé l'slug (sempres suposant que aquest
sigui únic).
la url:
url(r'^tutorial/sample/update/(?P<slug>[-\w]+)/$',
SampleUpdateView.as_view(),
name='tutorial_update_sample'),
pràcticament semblant a la de visualització, i ara a la part de la vista bastarà fer:
from django.views.generic.edit import UpdateView
class SampleUpdateView(UpdateView):
model = Sample
Ara sols ens falta lligar la url per poder anar a l'edició de
l'objecte, ho podem fer directament des de la barra de navegació,
però millor posar-ho també a la plana web, per exemple amb un link a
la plantilla de visualització per a que ens dugui a l'edició de
l'objecete. Ja que hi sóm posarem també el link de creació. Molt
resumidament, el nostre sample_detail.html quedaria de la forma:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>test</title>
</head>
<body>
<h1>Sample Detail</h1>
{{sample.slug}}<br/>
{{sample.name}}<br/>
{{sample.ammount}}<br/>
{{sample.comments}}<br/>
<a href="{% url tutorial_update_sample sample.slug %}">Update</a>|
<a href="{% url tutorial_create_sample %}">Create</a>
</body>
</html>
Eliminació
Ja hem arribat a la darrera lletra de l'acrònim. Per a esborrar un
objecte Django ens proporciona la vista DeleteView. Abans d'esborrar
es convenient demanar confirmació i a la implementació de Django es
té això en compte.
La url serà de la forma:
url(r'^tutorial/sample/delete/(?P<slug>[-\w]+)/$',
SampleDeleteView.as_view(),
name='tutorial_delete_sample'),
i a la view.py
from django.views.generic.edit import DeleteView
class SampleDeleteView(DeleteView):
model = Sample
si volem que tot funcioni per defecte, hem de crear una plantilla construida amb el nom del model i el sufixe "_confirm_delete".
En aquesta plantilla hem de demanar la confirmitat per esborrar el registre, enviant-ho a la mateixa URL d'esborrat però fent un POST. És a dir la url amb GET presenta la confirmació i amb POST fa l'acció.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>test</title>
</head>
<body>
<h1>Sample Delete</h1>
{{sample.slug}}<br/>
{{sample.name}}<br/>
{{sample.ammount}}<br/>
{{sample.comments}}<br/>
<p>Are you sure?</p>
<form action="."
method="post" accept-charset="utf-8">
{% csrf_token %}
<p><input type="submit" value="Delete →"></p>
</form>
<p><a href="<a href="{% url tutorial_view_sample sample.slug %}">Return</a>
</body>
</html>
A l'actualització o a la creació no feia falta dir-li a Django on volíem anar, per defecte anava a la visualització de l'objecte. Ara l'estam esborrant, així que no hi ha objecte. Així que obligatòriament li hem de donar la url a la que ha d'anar en cas que l'objecte s'hagi eliminat. Ho podem enviar a una plana amb el llistat de tots els registres, però com que encara no hem vist com es fa, ara per ara l'enviarem al formulari de creació.
class SampleDeleteView(DeleteView):
model = Sample
success_url = reverse_lazy('tutorial_create_sample')
I ja tenim el CRUD complet. Ens falta poder visualitzar un llistat paginat d'objectes i fer algunes accions bàsiques amb formularis. Ho veurem al proper apunt.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django class based views (IV)
Escrit per Aaloy a 21 de February , 2012 a les 11:31 p.m.
Començam a lligar les class views amb els models de dades, que això es posa cada cop més interessant.
Fins ara hem vist un ús de les class views molt genèric, és a dir, amb el que sabem podem mostrar planes webs i gestionar el treball amb formularis.
Es comú en la majoria d'aplicacions web modernes que les dades venguin d'algún lloc, d'una base de dades per exemple. Així que la gent de Django han creat tota una sèrie de mixin i vistes específices per a simplificar-ne el treball.
Mostrar un objecte
Suposem que volem mostrar les dades que tenim d'un usuari. Com sabeu
el model User de Django conté les dades dels usuaris i es troba a
django.contrib.auth.models.
Voldríem que en especificar-ne la clau primària a la url poder mostrar les dades de l'usuari corresponent.
És a dir, es tracta de mostrar informació que es correspon a urls d'aquest tipus
'^prefix/(?P<pk>\d+)/$'
o també
'^prefix/(?P<slug>[-w]+)/$'
Django ens proporciona la classe DetailView per fer precisament
això. És a dir, per estalviar-nos la major part de la feina de cercar
l'objecte que es correspon amb la clau primària o l'slug i passar-ho a
la plantilla per a la seva presentació. Per si us ho demanaveu
DetailView es troba a django.views.generic.detail.
Anem a veure un poc DetailView per dintre:
Aquesta classe hereta de SingelObjectTemplateResponseMixin i de
BaseDetailView. La primera a la seva vegada és fila de una vella
coneguda TemplateResponseMixin i en sobrescriu el mètode
get_template_names per tal d'establir un nom de plantilla per
defecte, que en el cas dels models és de la forma app/nom_detail.html,
és a dir, per al nostre exemple, si no posam cap nom de plantilla
agafarà per defecte auth/user_detail.html.
Per la seva banda BaseDetailView és filla de SingleObjectMixin i de
View i implementa el mètode get i li passa al contexte de la
plantilla la variable object amb el contingut de l'objecte que es
correspon a la clau primària.
Com que object pot resultar un tant confús, Django també passa el
mateix contingut a una variable amb el nom de l'objecte si el model té
el nom posat al verbose_name o bé farà servir el que li indiquem a
l'atribut context_object_name de la Classe.
SingleObjectMixin és la classe encarregada de fer el gruix de la
feina, i com no, també implementa el mètode get_context_data per a
poder passar més informació a la plantilla.
Així doncs, mostrar un objecte pot ser tan senzill com això:
al urls.py afegim:
url(r'^user/(?P<pk>\d+)/$', UserView.as_view(),
name='main_user'),
i no oblidem importar UserView, que crearem dins views.py i que pot
ser tan simple com:
class UserView(DetailView):
model = User
Com que User té assignat un verbose_name='User' Django passa a la plantilla
tant la variable object com la variable user i per tant en
condicions normals podríem fer servir tant un nom com l'altra.
En el nostre cas, i si com jo teniu dins el context processors la línia 'django.contrib.auth.context_processors.auth' us trobareu que la variable "no funciona". Això és perquè encara que se li passi, el context processor crea també una variable anomenada 'user' amb les dades de l'usuari autenticat (si existeix), i com s'assigna just abans de generar la plantilla, el contingut que prevaleix és el del context processor.
Una cosa que em va sorprendre del SignleObjectMixin és que a més del
mètode get_object implementa també get_queryset. De fet
get_objectcrida a get_queryset i li aplica un filtre per clau
primaria (pk) o bé per slug.
Què vol dir això, doncs que tenim un nivell extra de flexibilitat a
l'hora de determinar si un objecte és presentable per pantalla o no.
Basta sobreescriure el mètode get_queryset i independentment que la
clau primària (o l'slug) existeixi en la base de dades, podem fer que
l'objecte no es mostri. Per exemple, suposem que en el nostre exemple
anterior no volem mostrar l'usuari admin.
Podem fer
class UserView(DetailView):
model = User
def get_queryset(self):
query = super(UserView, self).get_queryset()
return query.exclude(username='admin')
de manera que UserView ens mostrarà la informació de qualsevol usuari llevat de l'usuari admin, en aquest cas mostrarà un error 404.
SingleObjectMixin com hem dit, pot tornar-nos un objecte a partir de
la seva clau primària o bé a partir de l'slug. Normalment en farem
servir un o altre. L'ordre de prioritat és primer el pk i si aquest
està buid, es mirar l'slug.
Al proper post farem una ullada a les facilitats que ens donen les generic class views per a gestionar els manteniments i veurem com es pot fer un cicle CRUD.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django class based views (III)
Escrit per Aaloy a 20 de February , 2012 a les 9:09 p.m.
En aquest apunt veurem com fer servir les generic class views per a fer feina amb formularis.
Seguirem la documentació de Django que tracta dels formularis. Allà ens fa referència a un formulari de contacte creat com:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField()
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
i la vista associada
def contact(request):
if request.method == 'POST': # If the form has been submitted...
form = ContactForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data
# ...
return HttpResponseRedirect('/thanks/') # Redirect after POST
else:
form = ContactForm() # An unbound form
return render_to_response('contact.html', {
'form': form,
})
El que farem ara és fer el mateix però fent servir les generic class views.
El primer que hem de veure és què hem de fer servir. Necessitam gestionar un formulari, la seva validació i tornar la redirecció cap a una nova plana web en cas que tot vagi bé.
Si feim una ullada a la jerarquia de classes del mòdul edit podem
veure que la classes que compleix tot el que volem es diu FormView.
FormView està composada pel mixin TemplateResponseMixin que ja
coneixem i BaseFormView que a la seva vegada està format per dos
mixins més FormMixin i ProcessFormView.
FormMixin ens proporciona els mètodes per a gestionar el form i
ProcessFormView que descendeix de View ens proporciona les respostes
a les cridades get, post i put.
L'equivalent fent servir les generic class views ens queda:
class ContactView(FormView):
form_class=ContactForm
success_url = reverse_lazy('main_thanks')
template_name = 'main/index.html'
def form_valid(self, form):
# process data
print form.cleaned_data
return super(ContactView, self).form_valid(form)
és a dir, hem de dir li a la classe quin formulari farem servir, això
ho feim a form_class o bé amb la rescriptura del mètode
get_form_class que ens ha proporcionat el mixin FormMixin o fin i
tot instanciant el formulari directament si fem la rescriptura de
get_form
Els mètodes form_valid i form_invalid ens permeten definir què em
de fer amb el formulari. Normalment ens bastarà sobreescriure el
mètode form_valid per a adaptar-lo a les nostres necessitats.
I qui crida al mètode is_valid del formulari? Doncs el post que
prové de ProcessFormView. Recordem que un mixin té accés a tot
l'objecte que el fa servir, i per tant també té accés als mètodes
el mixin FormMixin.
Suposem ara que volem que el nostre formulari agafi uns certs valors
inicials, això ho podem fer amb l'atribut initial definit a
FormMixin o bé a partir de la reescriptura del mètode
get_initial, segons la nostra aplicació ens convindrà un mètode o
un altre.
class ContactView(FormView):
form_class=ContactForm
success_url = reverse_lazy('main_thanks')
template_name = 'main/index.html'
initial = {'subject': u'This is a test form'}
def form_valid(self, form):
# process data
print form.cleaned_data
return super(ContactView, self).form_valid(form)
Si a més hem de passar dades addicionals a la plantilla Django,
FormMixin ens proporciona un altre vell conegut, el mètode
get_context_data que fa el mateix que feia al TemplateView. Això
sí, ara hem de tenir cura de cridar al mètode pare, ja que als kwargs
hi ha la definició del formulari. Per a evitar-nos conèixer què fa i
que no fa, millor cridar al mètode pare i a partir d'aquí afegir-hi
les variables que necessitem:
class ContactView(FormView):
form_class=ContactForm
success_url = reverse_lazy('main_thanks')
template_name = 'main/index.html'
initial = {'subject': u'This is a test form'}
def form_valid(self, form):
# process data
print form.cleaned_data
return super(ContactView, self).form_valid(form)
def get_context_data(self, **kwargs):
context = super(ContactView, self).get_context_data(**kwargs)
context['msg'] = u'Hello World'
return context
I no hem de perdre de vista que estam fent feina amb classes. Podem anar afegint els mètodes que necessitem a la classe, de manera que cada funció ens quedi manejable.
I ja per acabar un petit avís, he fet servir reverse_lazy per a
obtenir el valor de la url, però aquesta funció no hi és a Django
1.3. Per utilitzar el nom de la url enlloc de la url en sí, en Django
1.3 o bé hem de sobreescriure get_success_url o bé utilitzar
l'snippet que apareix a Django
Snippets i que resol això d'una manera
molt elegant:
from django.utils.functional import lazy
from django.core.urlresolvers import reverse
reverse_lazy = lambda name=None, *args : lazy(reverse, str)(name, args=args)
Això encara dóna per més, fins al proper article!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django class based views (II)
Escrit per Aaloy a 20 de February , 2012 a les 12:16 a.m.
En aquesta segona part veurem alguns dels usos més interessants de les class based views per a presentar informació i estalviar-nos feina.
TemplateView
Com ja vàrem veure a la primera part el TemplateView ens estalvia molta feina respecte a la manera tradicional de fer les coses, sols pel fet de passar ja el RequestContext ja recomanaria passar-nos al nou món de les Class Based Views, però encara hi ha més!
TemplateView incorpora dos mètodes més get_context_data i get.
Amb el get el que fa es cridar al mètode render_to_response que
ens proporciona el mixin TemplateResponseMixin i passant-li com a
arguments el diccionari que ens ha de tornar el mètode
get_context_data.
Per defecte get_context_data ens retorna un diccionari amb els
paràmetres que venen de la url, així si la nostra url és
url(r'^test3/(?P<id>\d+)/$', Test3View.as_view(),
name="test3-class-view"),
llavors get_context_data conté el diccionari {'id': 3} i a la
plantilla es passarà una variable anomenada params amb aquest
diccionari.
Suposem però que no és això exactament el que volem. Volem que passi
a la plantilla una variable anomenanda msg amb una salutació per als
lectors del blog.
El que farem serà sobreescriure get_context_data per a que passi la
informació que nosaltres volem a la plantilla.
class Test3View(TemplateView):
template_name = 'main/index.html'
def get_context_data(self, **kwargs):
context = super(Test3View, self).get_context_data(**kwargs)
context['id'] = self.kwargs.get('id')
context['msg'] = u'Hello blog!'
return context
Estrictament parlant no faria falta cridar al mètode pare de
get_context_data i de fet estam passant també la variable params
però fer-ho no fa mal i ens proporciona un cert grau de protecció
davant possibles problemes si un dia decidim que Test3View ja no
heretarà de TemplateView sinó d'una altra classe on ja s'hi posi
altra informació al contexte.
Al context_data i podem posar tota la informació que necessitem,
fixem-nos que és el mateix que feiem amb les funcions que acabaven
cridant al render_to_template sols que ara tot està més estructurat.
Suposem que volem que els missatge no estigui prefixat sinó que es generi a partir del resultat d'una funció. Abans hauríem creat la funció en algun lloc, a un mòdul apart, abans del mètode que renderitza la plantilla, ... Ara ho podem encapsular dins la mateixa classe
class Test3View(TemplateView):
template_name = 'main/index.html'
def get_message(self):
return u'Hello blog'
def get_context_data(self, **kwargs):
context = super(Test3View, self).get_context_data(**kwargs)
context = dict()
context['id'] = self.kwargs.get('id')
context['msg'] = self.get_message()
return context
I encara tenim més flexibilitat, gràcies al mixin
TemplateResponseMixin podem definir quina plantilla s'utilitzarà
segons ens convingui
Suposem que el paràmetre id ens serveix per a definir el nom de la plantilla, de manera que si existeix una plantilla que hi casi la presentarà i si no es quedarà amb la plantilla per defecte. Podríem fer
class Test3View(TemplateView):
template_name = 'main/index.html'
def get_message(self):
return u'Hello blog'
def get_template_names(self):
plantilla = 'main/index%s.html' % self.kwargs.get('id')
return [plantilla, ] + super(Test3View, self).get_template_names()
def get_context_data(self, **kwargs):
context = super(Test3View, self).get_context_data(**kwargs)
context['id'] = self.kwargs.get('id')
context['msg'] = self.get_message()
return context
Com veis la potència i la flexibilitat del que es pot fer amb les class based views no té res a veure amb el que es podia fer abans. Ara tenim molta més flexibilitat, més encapsulació i menys codi a escriure.
Al propert post parlarem de formularis...
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django class based views (I)
Escrit per Aaloy a 19 de February , 2012 a les 8:26 p.m.
Class based views
Amb Django 1.3 s'introdueixen les "Class based views", una funcionalitat que ens permet modelar les nostres vistes com a classes i que a més intenta solucionar el no tenir que escriure sempre el mateix tipus de codi quan mostram una plana web o fem un manteniment lligat a un model de dades.
Les class based views ens permeten un nivell més alt de reutilització del nostre codi i a més ens permeten de mantenir-ne la cohesió. Fins ara o bé teníem que anar creant les funcions dins la mateixa vista, dins la mateixa funció o tirar de mòduls independents.
Amb les class based views pode anar creant funcions per a la nostra vista, de manera que després sigui més bo de fer reaprofitar-les extenent la classe.
En poques paraules, les class based views requereixen un temps d'adaptació i alguns diuen que aprendre un nou DSL (Domain Specific Language). Potser sí, però s'ho paga.
Abans de començar
Encara que podem utilitzar les nostres pròpies class based views, Django ens dóna ja fetes les més freqüents i un conjunt de classes que podem fer servir en cas que cap ens encaixi.
És en aquestes classes on hi ha gran part de la potència de les class based views. Per a fer-les servir hem d'entendre el concepte de Mixin, ja que això són aquestes classes: Python mixins.
Què és un mixin?
Un mixin no és res més que una classe que no està concebuda per tenir entitat per sí mateixa, sinó per extendra la funcionalitat d'altres classes fent servir l'herència múltiple de Python.
Un mixin, per tant, afegeix funcionalitat a les classes. Podem crear Mixins com si de mòduls Python es tractàs i aplicar-los a les nostres classes per dotar-les de més funcionalitat.
Hem d'entendre també com funciona l'herència múltiple en Python, de manera resumida: s'executarà el primer mètode que es trobi anant d'esquerra cap a dreta en la definició de les classes. És a dir, si tenim:
class Test(OneMixin, AnotherMixin):
pass
a l'hora d'executar un mètode, Python primer cercarà a OneMixin i si no ho troba anirà a AnotherMixin. Així doncs, al tanto que l'ordre en que posam les classes és important.
A diferència dels mòduls els mixins tenen accés a la instància
self de la clases, i per tant poden fer servir informació associada
a l'objecte i altres mètodes.
La classe View
Aquesta classe és el bessó de tot el muntatge, i si cap de les funcionalitats que ens proporciona Django ens serveix gairebé segur que començarem a crear la nostra pròpia extenent aquesta classe.
Anem a fer un exemple molt senzill, suposem que volem mostrar una
plana web, que anomenarem index.html i que posaré dins la carpeta
main. Com que començam amb això de les generic class views, anam
llegit i ens n'adonam que la classe View el que fa és capturar els
noms dels mètodes http i executar-ne una funció associada amb el
matix nom.
Ja està, ens deim, el que hem de fer es crear una classe que hereti de
View i escriure'n un mètode que respongui a la creidada GET i que ens
renderitzi la plana. Dit i fet, cream l'aplicació main i la
registram al settins.py i anam per feina:
Al mòdul views.py
from django.shortcuts import render_to_response
from django.views.generic.base import View
from django.template import RequestContext
class TestView(View):
def get(self, request, *args, **kwargs):
return render_to_response('main/index.html', {},
context_instance=RequestContext(self.request) )
i a urls.py de l'aplicació main
from django.conf.urls.defaults import *
from views import TestView
urlpatterns = patterns('',
url(r'^test2/$', TestView.as_view(), name="test-class-view"),
)
Executam i efectivament això funciona. Ens mostra la plana. Però la cosa no ens acaba de convèncer, no?, ja que si fem una ullada a la manera anterior de fer les coses, això ben bé es podria fer com:
from django.shortcuts import render_to_response
from django.template import RequestContext
def test(request):
return render_to_response('main/index.html', {},
context_instance=RequestContext(request) )
hem escrit fins i tot més, on està el guany, doncs? La resposta està en la reusabilitat.
Aquest patró de mostrar planes web senzilles es repeteix molt en les
aplicacions web, de manera que la gent de Django ja ha creat una
classe que hereta de Views i que fa precissament això i d'una manera
més genèrica, la classe TemplateView
Aquesta classe hereta de TemplateResponseMixin i de View.
TemplateResponseMixin és un mixin que té dos mètodes:
render_to_response i get_templates_names i dos atributs:
template_name i response_class. El que ens interessa ara és que
TemplateResponseMixin ens permet afegir a la nostra classe la
renderització de la plantilla que passem dins template_name o bé
que tornem a partir de la sobreescriptura de get_templates_names
Si fem servir TemplateView el nostre codi queda com:
from django.views.generic.base import TemplateView
class IndexView(TemplateView):
template_name = 'main/index.html'
i a urls.py
from django.conf.urls.defaults import *
from views import IndexView
urlpatterns = patterns('',
url(r'^$', IndexView.as_view(), name='main_index'),
)
Fins i tot podríem prescindir del codi de view.py i podríem fer:
from django.conf.urls.defaults import *
from django.views.generic.base import TemplateView
urlpatterns = patterns('',
url(r'^$', TemplateView.as_view(template_name='main/index.html'),
name='main_index'),
)
Com podeu veure l'estalvi en línies de codi comença a ser notable.
L'important, a més de veure com es pot extendre la funcionalitat de
Views és que vegem què senzill és separar la funcionalitat lligada
al GET de la funcionalitat lligada al POST, al PUT, o a qualsevol
cridada HTTP. Sols hem de crear una funció amb aquest nom i Django la
cridarà sempre que la nostra classe hereti de View.
Suposem doncs que el que volem ara és mostrar una plana diferent si algú ens intenta fer un POST contra la nostra plana. Django té un mecanisme per protegir-nos d'això és el CSRF o Cross Site Request Forgery protection, ara el que voldriem es desactivar aquest mecanisme per la nostra classe i mostrar una plana diferent d'avís.
Amb el mètode classis hauríem de fer un
if request.method=='POST':
#fes alguna cosa
else:
#fes una altra cosa
amb les Class Based Views la cosa queda molt més elegant:
class TestView(View):
def get(self, request, *args, **kwargs):
return render_to_response('main/index.html', {},
context_instance=RequestContext(self.request) )
def post(self, request, *args, **kwargs):
return render_to_response('no_post_allowed.html')
Això tal com està no funcionaria, ja que tenim pel mig la protecció de Django.
Per saltar-nos aquesta protecció li hem de dir a la vista que no la
volem i per fer-ho hem de sobreescriure el mètode dispatch que se
n'encarrega de la fontaneria de verificar quin mètode http
ens ve i la funció que hem de cridar.
from django.views.generic.base import View
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
class TestView(View):
def get(self, request, *args, **kwargs):
return render_to_response('main/index.html', {},
context_instance=RequestContext(self.request) )
def post(self, request, *args, **kwargs):
return render_to_response('no_post_allowed.html')
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super(TestView, self).dispatch(*args, **kwargs)
Hem vist fins ara com fer servir la classe View i la classe
TemplateView, hi tornarem en els propers apunts, estau atents.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Django
Dajaxaproject, segona part
Escrit per Aaloy a 12 de February , 2012 a les 2:26 p.m.
Abans d'escriure aquest apunt de m'he adonat que era el post amb l'identificador 500. Un nombre rodó i que potser mereixeria algun tipus de celebració, però tanmateix no és l'apunt que fa 500, ja que en les proves del codi del blog, segurament vaig afegir i esborrar apunts que han fet anar cap endavant el comptador, realment encara falten prop d'una trentena d'apunts per a arribar al que fa 500, així que deixaré el cava a la gelera.
Hi va haver una proposta de celebrar-ho fent un regal, però pareix que la meva proposta de regalar una capsa d'un Nexus (tot i que comptava amb un possible patrocionador) no ha arribat a cuallar :-P
Així doncs el que faré és reprende l'apunt sobre el dajaxproject, i em centraré en l'altra component, anomenat Dajax.
Dajax
Ja vàrem veure com dajaxice ens deixava fer cridades AJAX cap a la nostra aplicació Django i organitzar-les. Dajax va més enllà in ens permet interactuar amb la interfície d'usuari des de codi Python. Fet servir amb mesura i seny ens pot ajudar també a fer molt més legible el nostre codi i a organtizar millor les accions derivades d'una cridada AJAX dins el mateix codi que les gestiona. No us penseu però que es tracta de quelcom com Pyjamas sinó que són més bé un conjunt de primitives que ens permetran agilitar la feina.
Per començar a jugar-hi necessitareu haver llegit el meu apunt
anterior (o la documentació del projecte) ja que Dajax fa servir la
seva llibreria germana dajaxice i també tenir instal·lat algun dels
frameworks javascript suportats, en el meu cas faré servir jQuery.
Recepta
A la part de servidor
-
Instal·lau django-dajax i posau
dajaxcom a aplicació alsettings.py. -
Posau
from dajax.core.Dajax import Dajaxa l'arxiu ajax.py de la vostra aplicació, junt ambfrom dajaxice.decorators import dajaxice_registerque ja havíem vist abans per a registrar la petició. -
A la funció AJAX instanciarem la classe,
dajax=Dajax() -
Farem el que tinguem que fer dins la funció AJAX i després anirem executant els mètodes de
dajaxque ens interessin per a interaccionar amb la part HTML de l'aplicació. -
Finalment retornarem el json amb
return dajax.json()
A la part de client
Hem de afegir l'arxiu javascript que correspongui segons la llibreria
que volguem fer servir. En el nostre cas jquery.dajax.core.js que es
troba a django-dajax/scr/. En el meu cas la cosa queda com:
{% dajaxice_js_import %}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="{{STATIC_URL}}/jquery.dajax.core.js"></script>
En executar-se l'event que ens interessi (un clic normalment) cridarem
la función AJAX que hem registrat de manera semblant a com ho feiem a
l'exemple de Dajaxice, però ara a la funció li passarem com a
paràmetre Dajax.process i un diccionari java de valors opcional, si
la funció té paràmetres.
Important Un ús molt habitual de Dajax es dona en combinació amb els formularis Django, en aquest cas el paràmetre de les dades del formulari. Per a que Django les pugui interpretar bé com a provinents d'un formulari hem de serialitzar-les, si fem servir jQuery això necessita d'una llibreria addicional anomenada serializeobject.
Què es pot fer?
Les funcions que ens proporciona Dajax ens permeten tant manipular l'arbre DOM de la plana web com cridar a funcions javascript ja que tinguem fetes.
*alert(message) Com el seu nou indica hi haureu endivinat,
mostra una alterta javascript amb el missatge que li indiquem.
-
assign(selector, attribute, valor)Donat un selector (id, classe, tipus, ...) i un atribut li asigna el valor el valor que li passam al paràmetre a tots els elements que casin amb el selector. Seria l'equivalent a fer amb jQuery per exemple$('.test').attr('title', 'hola')però enlloc de aplicar-ho sols al primer element com fa jQuery ho aplicaria a tots els elements que tinguin assignada la classetest. -
add_css_class(selector,value). Assigna tots els elements que casin amb el selector la classe css especificada a paràmetrevalue.valuepot ser una cadena o bé una llista de cadenes, en cas de ser una llista s'assignaran totes les classes de la llista. -
remove_css_class(selector,value). Funció complementaria de l'anterior, és a dir, enlloc de posar lleva. -
append(selector,attribute,value)
afegeix a tots els elements que casin amb el seletor l'atribut donat amb el valor indicat avalue`. -
prepend(selector,attribute,value)Afegeix a l'inici a tots els elements que casin amb el selector l'atribut especificat amb el valor que li passam com a paràmetre. -
clear(selector,attribute). Netja l'atribut especificat de tots els elements que casin amb el selector. -
redirect(url,delay=0). Redirecciona la plana cap la nova url després del temps especificat en el paràmetredelay. -
script(code). Executa el codi javascript especificat en el navegador. Per exemple, podem executar l'alert de l'exemple anterior. Hem d'anar un poc alerta amb aquesta funció i evitar fer-ne un mal ús posant-hi tot el codi. Si hem de fer crides, millor posar-les dins el seu corresponent arxiu javascript i fer tan solsscript(la_funcio()). -
remove(selector). Elimina tots els elements que casen amb el selector especificat. -
add_data(data,callback_function). Executa la funció que li especificam en el segon paràmetre amb les dades que hem posat al primer paràmetre. Com el cas d'scriptalerta amb abusar-ne.
Algunes recomanacions
Django té un sistema de plantilles molt potent, es poden fer servir
junt amb assign i remove per a posar els continguts que ens
interessin. Vull dir que no fa falta que una plantilla estigui lligada
a un view sinó que es pot fer servir directament. Mirau-ne
l'API.
Podem generar contingut HTML (o js) directament o fer servir una
plantilla a un fitxer i utilitzar el render_to_string.
Tampoc estam limitats a fer servir el sistema de plantilles de Django per a generar l'HTML segons el que es tengui que tornar potser un sistema com Mako us va millor. Personalment sóc partidari de no mesclar massa.
Errors típics
Sovint et pots passar una bona estona demanant-te perquè no funciona la teva cridada AJAX, així que anem a fer una llista de recomanacions:
-
Reinicia la consola de desenvolupament. A vegades la nova función no es registra bé i no es torna a generar el codi javascript. Si això passa, el símptoma és que tens un error dient que no es troba la funció.
-
Hi ha un error que diu que no es troba Dajax al javascript. Típic de quan t'has oblidat de incloure la llibreria específica pel frameworks que fas servir.
-
Es fa la cridad però no s'executa res. Doncs que t'has deixat el retorn a la funció AJAX. Recorda que normalment hi haurà un
return dajax.json()o si no les cridades no s'efectuaran. -
Django no és capaç d'interpretar el que li enviam al formulari. Ens hem deixat la llibreria
serializeobject -
Teníem events lligats a un element i ara no responen. Típic de quan hem generat nou contingut. Els events s'han de tornar a lligar amb els nous continguts encara que tenguéssin el mateix identificador. Potser fer servir .live() o .delegate() de jQuery ajudaria, però ara per ara jo el que he fet és tornar-los a lligar posant els elements a una funció d'inicialització i tornar-la a cridar amb
script.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Dajaxproject, primera part
Escrit per Aaloy a 30 de January , 2012 a les 11:38 p.m.
Una de les preguntes més recurrents en les llistes de Django, junt amb la de quin editor fer servir és la de com fer cridades AJAX i quina llibreria utilitzar.
Django és agnòstic en el que fa a les llibreries javascript, tot i això la part de l'admin fa servir jQuery, però oficialment no hi ha cap llibreria especialment recomanada, Django és pot utilitzar amb qualsevol llibreria i dependrà del projecte que en triem una o altra.
El problema de que no es faci cap recomanació de com integrar cridades AJAX amb Django ens dóna molta llibertat, però també te l'emperò de que no hi ha cap guia de bones pràctiques sobre com fer-ho, des d'on posar la llibreria, quin nom li hem de donar, si la posam al views.py o no.
El la comunitat de codi obert quan hi ha un buid així i una necessitat ben aviat sorgeixen projectes que intenten donar una resposta. Un d'aquests projectes és el que us present en aquest article el dajaxproject.
Djaxaproject són de fet dues llibreries, dajaxice i dajax, la primera podríem dir que respon a la necessitat que us comentava de fer més senzilla la comunicació asíncrona entre les aplicacions Django y el codi javascript, la segona, dajax està molt més orientada cap a la capa de presentació i sobretot està lligada a un bastiment de javascript en concret, encara que tenim certa llibertat a l'hora de triar-lo.
En aquest apunt veurem primer Dajaxice i en un següent apunt faré també cinc cèntims de dajax.
Instal·lació
Suposaré com tantes vegades que teniu un virtualenv creat i Django
instal·lat. També hem de partir d'un projecte base.
El primer que hem de fer és instal·lar la llibreria, per això bastarà fer un
pip install django-dajaxice
La documentació explica força bé el procés, així que resumeixo:
- Posar
dajaxicedins la secció INSTALLED_APPS desettings.py - Assegurar-nos que tenim eggs.Loader descomentat als TEMPLATE_LOADERS
- Assegurar-nos que
django.core.context_processors.requestés dins el TEMPLATE_CONTEXT_PROCESSORS, si no ho heu fet ja, el meu consell és que copieu tot el TEMPLATE_CONTEXT_PROCESSORS que hi ha a la documentació, ja que a poc que l'aplicació cresqui segur que necessitareu afegir-ne algun. - Afegim als settings.py el prefixe que farem servir per distingir les urls de
dajaxice de les de urls normals de la nostra aplicació, per exemple la
documentació ens diu posar
DAJAXICE_MEDIA_PREFIX="dajaxice".
Amb això ja hem fet par de la fontaneria, ara ve la part més interessant i la màgia d'aquesta aplicació.
Organitzant l'AJAX
Dajaxice el farà és utilitzar el prefixe que hem configurat per tractar certes urls com a cridades AJAX. Djaxice el que ens permet és registrar automàticament les funcions que es publicaran com a cridades AJAX utilitzant un mecanisme semblant al que fa dervir Django per a l'admin.
D'aquesta manera, una vegada modificat l'arxiu urls.py podem anar
creant les funcions a publicar dins un arxiu ajax.py i registrar les
funcions. Així l'arxiu urls.py ens ha de quedar com:
#!/usr/bin/python
from django.conf.urls.defaults import patterns, include, url
from dajaxice.core import dajaxice_autodiscover
from django.contrib import admin
from django.conf import settings
admin.autodiscover()
dajaxice_autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
(r'^%s/' % settings.DAJAXICE_MEDIA_PREFIX,
include('dajaxice.urls')),
)
Utilitzant AJAX a les nostres plantilles
Dajaxice es capaç de posar dins la nostra plantilla el codi que necessitam per fer les cridades AJAX i publicar les funcions que farem servir a partir del codi Python (ja ho veurem un poc més endavant). Per fer-ho fa servir una llibreria que s'ha de carregar.
Així a la part de càrrega de llibreries de la nostra plantilla haurem
d'afegir: dajaxice_templatetags. Si encara no heu carregat cap
llibreria doncs quedaria com {% load dajaxice_templatetags %}.
Una vegada carregada la llibreria posarem el tag que genera el codi
javascript {% dajaxice_js_import %}. Ho podeu posar a la capçalera o
al peu de la plana. Personalment, com que ho sol fer servir junt amb
jQuery, ho pos al peu, abans de l'utilització de les llibreries, per tal de millorar la velocitat de càrrega de les planes.
Aquest codi es gener dinàmicament mentre estam desenvolupant. Us avís que de tant en tant es queda carregat en memòria i certs canvis requereixen reiniciar el servidor de desenvolupament. Si veis que heu publicat una funció i no surt, reiniciau el servidor.
En producció la llibreria té una opció per generar directament l'arxiu javascript i poder tractar-lo com un fitxer estàtic més.
L'estructura d'una plantilla bàsica amb djaxice seria doncs
{% load dajaxice_templatetags %}
<html>
<head>
<title>My base template</title>
<!-- també al peu depen de l'aplicació -->
{% dajaxice_js_import %}
</head>
...
</html>
Creant la nostra primera cridada AJAX
Com us comentava més amunt, una de la gràcia de dajaxice és que ens
permet organitzar les nostres cridades AJAX. Així el que farem serà
crear un arxiu ajax.py dins la nostra aplicació, de manera que podem
agrupar cridades per aplicació.
Suposem que hem creat una aplicació anomenada main, la posam al
settings.py del projecte i cream l'arxiu ajax.py
Crear una funció i publicar-la per a que la servim via AJAX és tan senzill com això:
#!/usr/bin/python
# -*- coding: utf-8 -*-
from django.utils import simplejson
from dajaxice.decorators import dajaxice_register
@dajaxice_register
def hello_world(request):
return simplejson.dumps(
{'message':'Hello World'})
És a dir, importam simplejson per a fer la transformació cap a json,
que és el que volem servir (o xml, o html, tant fa), cream una funció
com ho feim al views.py de Django i la decoram amb
dajaxice_register. Això junt el autodiscover que hem posat a
urls.py fa que ara la nostra aplicació pugui respondre a cridades
AJAX.
Cridant des de l'html
Per cridar a la nostra funció es pot fer directament amb l'event onclick directament a l'HTML,però a mi particularment em fa molta grima tenir aquesta mescladissa, així que prefereixo tirar de jQuery encara que per fer la crida AJAX no el faci servir. Recordem que l'important no és el mètode amb que es fa la crida, sinó l'organització i facilitat de mantenimient (i depuració) que ens dóna la llibreria.
Així, en el meu cas quedaria:
<script src="https://ajax.googleapis.com/
ajax/libs/jquery/1.7.1/jquery.min.js">
</script>
<script type="text/javascript">
$(function(){
$('#testme').click(function(event){
event.preventDefault();
Dajaxice.main.hello_world(test_callback);
});
function test_callback(data){
if (data==Dajaxice.EXCEPTION){
alert('Opps, alguna cosa dolenta ha passat');
} else {
alert(data);
}
}
});
</script>
on #testme fa referència a un enllaç al qual hem assignat l'event.
L'interesant d'això és que tenim a la nostra disposició una funció javascript que mapeja la que tenim al codi Python i a la qual podem cridar amb uns paràmetres. El primer d'ells és la funció de tornada (el callback) que utilitzarem per gestionar la resposta i l'altra és un paràmtre codificat com json que passarà com a paràmetre cap a la funció.
Hem de dir que dajaxice sempre fa un POST contra la url, gestionant els problemes de CSRF.
Si posam DAJAXICE_DEBUG=True al settings.py o millor dit, ve així
per defecte, a la consola de desenvolupament de Django podem veure
tant la cridada que fem com la resposta i els errors que hi pugui
haver.
La funció de tornada es defineix amb un paràmetre que contindrà el valor de retorn de la nostra cridada AJAX. Si és un json podrem accedir als valors directament, però com he comentat abans, no estam limitats a tornar json, podem tornar una cadena de text, xml, html, ... el que necessitem i poguem tractar amb javascript.
És interessant veure com es tracten els errors o les excepcions. Si hi ha problems al nostre codi Python i es llança una excepció, dajaxice la capturarà i llavors data contindrà el valor Dajaxice.EXCEPTION, amb la qual cosa sabem que quelcom ha anat malament.
He de fer servir sempre Dajaxice?
Depèn, algunes vegades serà més convenient fer una cridada directa amb jQuery, per exemple quan volem tenir més control del que passa quan s'inicia la cridada, o volem poder-la cancel·lar.
El cert, però, és que dajaxice ens permet organitzar millor el codi i gestionar d'una manera sistemàtica les nostres cridades AJAX. Com sempre no hi ha cap veritat absoluta, potser servirà en el 80% dels casos i això ja significa una gran ajuda.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Un creuer fora de sèrie
Escrit per Aaloy a 29 de January , 2012 a les 6:06 p.m.
Avui he acabat de llegir "Un creuer fora de sèrie" de Sílvia Soler, de l'editorial Columna.
És una petita història del viatge en un creuer de Maria i Oriol i la seva extensa família (de l'estil de Modern Family) i de les conseqüències més immediates que se'n deriven.
Relacions de parella, adolescents i la vida mateixa amb les seves complexitats retratada de manera molt divertida i refrescant per la Sílvia Soler, en un llibret de 155 planes que et deixa en acabar amb ganes de saber-ne més d'aquesta família, com si d'un culebrot es tractàs.
M'ho he passat molt bé llegint el llibre. de tant en tant els fills em demanàvem perquè reia, així que ja us podeu imaginar que és un llibre entretingut. Potser les rialles eren per veure'm reflectit en algunes situacions, vet a saber, però la cosa és que és un bon llibre per passar una estona tranquil, gaudir de la lectura i desembafar dels conflictes quotidians submergint-se en els conflictes un tant estrambòtics d'altres.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Solar d'Ian McEwan
Escrit per Aaloy a 23 de January , 2012 a les 7:16 p.m.
En el temps que corren amb aquest títol hom podria pensar que es tracta d'un llibre que tracta de la crisi del bloquet i de la construcció. Res més lluny de la realitat.
A la contraportada diu que és un novel·la irònica, inquietant, "segurament la novel·la més divertida d'Ian McEwan". Bé, si aquesta és divertida no em vull imaginar com seran les altres.
M'ha costat molt acabar e llibre, res a dir de l'estil i la narració. Tant l'autor com el traductor crec que han fet una bona feina, però la història no m'ha enganxat gens ni mica. Certament té grans dosis de mala llet quan retracta els organismes oficials i projectes que es creen sols perquè el polític de torn vol sortir a la foto. I la figura de Beard, un premi Nobel al qui li encanten les dones i figurar. Però tot i aquesta dosi d'ironia, és tot un tant inconnex, les històries es queden a mig desenvolupar.
En definitiva, un llibre per llegir quan a un no li ve el son, que és el que va aconseguir que ahir l'acabàs, però que no respon a les expectatives que m'havia creat amb la publicitat que en feia el Círculo de lectores.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Fakedata i Faketpv
Escrit per Aaloy a 20 de January , 2012 a les 6:07 p.m.
Fa temps que estic fent feina a hores mortes amb un projecte que m'ajudi (que ens ajudi) en el nostre desenvolupament d'aplicacions, en una de les tasques més ingrates: tenir que testejar l'aplicació i afegir dades de prova.
Un dels projectes amb que estic jugant és SST un envolcall per Selenium que fa molt senzill fer scripts per testejar webs des del navegador i de manera desatesa. He fet les proves inicials i la veritat és que promet molt el projecte.
En aquests moments tenim moltes de les nostres aplicacions monitoritzades fent servir Twill i connectades a Nagios, de manera que podem saber quan l'aplicació cau o no dóna la resposta esperada i que ens avisi mitjançant una alarma de Nagios. SST no està cridat a substituir Twill de moment, però si que ajudarà molt a evitar repeticions de tasques ja que és força més àgil que Selenium, i al meu punt de vista més entenedor.
L'altra línia de treball va dirigida a la tasca de generar dades de prova per les aplicacions. Supòs que també us heu vist amb la necessitat de testejar una aplicació en condicions semblants al que ens podem trobar a la realitat, i això vol dir omplir la base de dades amb cents o mils d'usuaris, d'adreces, ...
Vaig estar cercant eines que em deixessin fer això però no vaig trobar res que m'agradàs totalment, així que vaig optar per l'opció del mig, és a dir, tenir un bon conjunt de funcions que pugui cridar quan vulgui, que pugui créixer sense massa problemes i que pugui utilitzar per fer els programets per omplir de dades les meves aplicacions. Així va néixer Fakedata.
Fakedata és un conjunt més o manco organitzat de funcions per generar dades aleatòries però amb criteri per a les aplicacions, orientat sobretot a Espanya. Hi ha funcions per a generar noms de persona, per a generar CIF, NIF, nombres de telèfon, codis postals, targes de crèdit, ... El gruix de rutines les he anat trobant d'Internet o a altres llibreries i les he pogut adaptar, algunes les he creat des de zero. Em sembla bona idea tenir-ho tot organitzat, agrupat i a un únic punt, de manera que es pugui fer servir ràpidament.
Amb la mateixa idea de testejar aplicacions he afegit un mòdul nou al projecte anomenat Faketpv, amb la idea d'emular les principals passarel·les de pagament espanyoles. De moment ja tinc CECA i SERMEPA.
La idea és que quan estam en mode desenvolupament tenir que connectar a les passrel·les de pagament, encara que sigui al seu entorn de test, et fa perdre un temps preciós i sovint dificulta la depuració. Faketpv està pensat per ajudar al desenvolupament: mostra els paràmetres que reb el TPV i torna a generar la signatura per a que es pugui comparar amb la que generaria el TPV si li passàsim aquests paràmetres. A més retorna la resposta com si la venda s'hagués produït realment, sense tenir que posar cap tarja i fent-ho tot en local.
Com que funciona com a un servei es pot fer servir des de qualsevol aplicació, talment seguint la documentació de cada passarel·la però substituint el seu entorn de test per l'aplicació local.
El projecte està a Bitbucket i està obert a contribucions. A veure si entre tots en feim un de bo.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Codi lliure Python Django
The Lean Startup
Escrit per Aaloy a 06 de January , 2012 a les 12:19 p.m.
Aquestes festes nadalenques he aprofitat per llegir un poc. M'havien recomanat el llibre "The lean Startup", així que el vaig comprar per Amazon i encara que vaig començar a llegir-lo abans de festes vaig aprofitar la tranquilitat d'aquests dies per fer-li una bona llegida.
El llibre està força bé, però com que ja havia llegit el de "Lean development" doncs he trobat que molts conceptes són comuns i les històries bàsiques que fan referència a l'experiència de Toyota repetides. Però per la gent que tingueu curiositat per aquest concepte el Lean i no el vulgueu aplicar directament a la programació, doncs és un llibre força interessant.
Tanmateix el focus de llibre, tot i que farcit d'exemples per fer lo entenidor, gira entorn a un grapat de conceptes bàsics:
- Fugir de tot el que no sigui necessari per al negoci.
- Esbrinar el més aviat possible si el que feim és el que el client vol, llançant el mínim producte viable.
- Aplicar el mètode científic a les millores i experiments que fem. És a dir, mesurar el que serveix per a millorar el negoci i no el que serveix per a millorar els nostres egos.
- Arrel de tot això, no tenir por en canviar de direcció, de pivotar, si els resultats que tenim a partir dels nostres experiments així ho indiquen.
- Anar a cercar l'arrel del problema enlloc de cercar culpables.
Si ens hi fixam tot és com a molt lògic. Posar-ho sobre paper i llegir-ho, però ens obliga a reflexionar-hi. Quantes vegades estam desenvolupant un producte i afegint més i més característiques sense saber si tindrà o no èxit? En una empresa a la que vaig fer feina, teníem un producte llest per surtir, però els responsables de producte no volien sortir sense una característica molt determinada, el "así no salimos" es convertí en una frase mítica. Potser si haguessin llegit aquest llibre (o un de semblant) el producte hagués sortit dos anys abans i s'hagués guanyat un temps preciós a l'hora de saber si el que es volia fer era viable o no.
Personalment la metodologia Lean m'agrada molt. Estic molt acostumat a pensar d'aquesta manera, i això, us aviso, duu molts de problemes quan penses així a empreses on fer "les coses com sempre s'han fet" es converteix en l'objectiu fonamental. Una altra anècdota, fen una petita auditoria de processos em vaig trobar amb una gent que feien quatre còpies d'un document i les arxivava totes. Quan vaig demanar el perquè, la resposta fou la que us deia. Realment sols es necessitava l'original i la còpia, va costar però eliminar les tres còpies restants, amb la quantitat de documents que es movien segurament va salvar més d'un arbre.
Des del punt de vista del qui monta una empresa, és a dir, de la meva pròpia empresa, procuram sempre aplicar aquests principis. Ja us dic, la persona a la que consider la meva mentora en temes empresarials en José González té aquests mateixos principis a l'hora de gestionar i organitzar una empresa. Si fos japonès segurament ara estaria fent conferències per mig món, aquí tenim/teniu el luxe de tenir-lo com a professor associat a la UIB. Si teniu l'ocasió i podeu agafar la seva assignatura com a lliure configuració i conèixer crec que no en quedareu decebuts.
Me n'he anat per les bardisses. Seguint amb el llibre, encara que la filosofia està molt bé, te queda un regustet un poc amarg. És en el punt on posa exemples d'empreses que aconsegueixen la seva ronda de finançament, del com poden créixer o muntar un negoci online. Després quan ho compares amb les pròpies dificultats per dur endavant un projecte et quedes pensant si aquestes coses sols poden passar en països llunyars, on hi ha empreses que paguen a consultors per fer conferències per tant de millorar l'eficiència del seu negoci, on hi ha finançament de "bussines angels", on les administracions no suposen que tots som un xoriços, ... bé no segueixo que m'agafa la depressió.
En conclusió, un llibre entretingut, amb conceptes molt interessants i tal volta un poc passat de pàgines. Trèieu la part on parla de finançament i perfectament es pot aplicar a una empresa d'aquí.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica Llibres i revistes APSL
Resum del 2011
Escrit per Aaloy a 24 de December , 2011 a les 5:53 p.m.
Ara que ja estam a punt d'acabar el 2011 faré el que toca fer per aquestes dates no és més que fer un resum de l'any que acaba i fer un poc d'avançament del que esper en el 2012.
Com bé sabeu, darrerament per mi parlar d'informàtica i feina és parlar d'APSL, el projecte que iniciàrem fa uns anys amb un grapat de socis, parlar de Python, de Django i de GNU-Linux.
APSL
El febrer de 2012 ja farà tres any de la posada en marxa del projecte APSL, que per qui no ho sap és l'acrònim d'Advanced Programming Solutions SL. El nom el pensarem a un dinar entre en Bernat, en Xus i jo mateix, a partir d'un domini de quatre lletres que vaig poder comprar gairebé de casualitat. Primer va ser el domini i després va ser el nom. Ara no record ben bé qui va proposar la versió final, però record clarament que en parlàvem amb Xus.
Sigui com sigui enguany ha suposat passar dels 2 membre amb que iniciàrem el 2010 a passar a quatre i tenir que canviar d'oficina, passant de la incubadora del Parc Bit a un despatx compartit a l'edifici NTIC del mateix parc.
De fet, gairebé es podria dir que hem acabat l'any amb 5 persones, ja que Xus s'ha incorporat como a freelance també al projecte.
El 2011 ha estat un any dur i divertit a la vegada. Hem tingut prou feina per mantenir-nos ocupats amb el que més ens agrada. Hem fet feina amb projectes grans, que implicaven a tot l'equip durant mesos. Però no tot han estat alegries, com per tot la crisi s'ha fet notar i els plaços de pagament s'han allargat algunes vegades fins a límits que particularment m'han fet passar més pena de l'habitual, i qui me coneix ja sap que sóc passador de pena de mena.
En la part de projectes estic molt satisfet de la feina que hem fet amb la gent d'e-comerce de Fiesta, l'encaix ha estat molt bo, i en aquests moment tenim la web que desitjava el client i a més corrent damunt Django com a CMS. Passaren de un gestor de continguts genèric de PHP a un gestor de continguts fet a mida de les seves necessitats. El canvi no va ser gens traumàtic i ens ha permès no tenir que dir "això no es pot fer" o "això durà molt de temps". Ens ho passam molt bé amb aquest projecte, tant pel client/amic com perquè tenim una gran llibertat per fer optimitzacions. La darrera ha estat l'actualització de Varnish a la darrera versió, amb plugins especials adaptats a les necessitats de Fiesta.
Encara que més petitó, també ens ho passàrem molt bé amb la web de Sa Talaia del mateix Fiesta, aquí perquè va suposar poder retirar una web feta en flash que hi havia i desenvolupar-la amb Django i jQuery. Unes fotografies magnífiques de l'hotel fan que sigui una web que crec que s'ho paga visitar, i ja no dic rec d'anar a l'hotel (llàstima que no m'hagi tocat la loteria).
També estic molt content de la col·laboració assolida amb Xavi i el seu equip en el desenvolupament de la plataforma Txerpa. Content pel que significa particpar en projectes emprenedors i pel muntatge tècnic que hi ha al darrera. La web de Txerpa ja pot donar una idea del que hi ha al darrera, però la part més important és la que no es veu, i que permet donar d'alta i gestionar els usuaris de l'aplicatiu i la seva interacció amb el sistema.
El projecte que s'inicià l'any passat de Globalbooking pareix que poc a poc es va consolidant. En Rafa, l'emprenedor que hi ha al capdavant del projecte és un caramull d'idees i periòdicament anam fent canvis a la web. També s'ha convertit en un amic i company de batalletes. Tant amb ell com amb l'equip de Jesús de Valadis fa molt bon fer feina. Una vegada més ens sentim molt lliures de proposar millores i optimitzacions cercant el millor pel seu negoci. Sé que insisteixo amb això de que proposis millores i que la gent se les escolti, però si heu fet feina per grans empreses sabreu que sovint això no és així. Per mi estar a APSL està significant a més d'un repte personal, una gran satisfacció en veure que pots aportar solucions.
A finals d'estiu llançarem propietarios online, una aplicació web destinada a la gestió de comunitats de propietaris, que decidírem fer al vaixell de tornada d'Eivissa. Obrirem un període de proves i dins el 2012 es començarà amb l'explotació comercial del producte amb col·laboració amb una altra empresa. És un projecte propi que esperam que sigui útil a molta gent i que ens ha permès fer feina provant noves idees a l'hora de programar.
El final del trimestre ha estat mogudet. Projectes que potser s'aniran concretant dins el 2012, molt d'ells lligats a emprenedors, tant en el sentit d'aquell qui creu en el projecte i es llança a l'aventura com projectes novedosos que volen posar en marxa empreses ja consolidades. M'encanten aquests tipus de projectes, sempre suposen un repte, hi ha molta cosa nova, molta implicació tecnològica. Són projectes en els que t'impliques molt personalment, en algun d'ells si l'economia m'ho permetés fins i tot seria capaç d'invertir-hi, però per ara ens hem de conformar en fer-lo el millor possible per a que puguin arribar bé a port.
Dels darrers projectes destacar un de molt divertit Regala unas vacaciones, va ser un mini-deathmarch que em va deixar fora pont, però on m'ho vaig passar molt bé, tant pel bon rollo amb el client com per la web en si mateixa. El projecte va suposar posar a prova una nova manera de generar pdfs que no havíem provat fins a les hores. Ideal per quan hi ha poc text i molt component gràfic. Miraré de parlar-ne en aquest blog.
El 2012 es presenta també mogudet, projectes en marxa que han de finalitzar dins el primer trimestre, projectes propis com el de Propietariosonline que volem dur endavant, i un projecte nou que es va perfilant a poc a poc gràcies a l'ajuda i els comentaris de gent com Sebas o Jordi. Volem posar en marxa un servei d'instal·lació i configuració d'equips per a l'explotació d'aplicacions web fet a mida de les necessitats de programadors, dissenyadors i clients. És a dir, enlloc d'anar a serveis de hosting tipus macdonals, anar al restaurant a la carta, configurant un servidor a la mida de l'aplicació, amb configuracions diferents depenent de l'aplicació o aplicacions que hagi de dur el servidor: configuracions per Django, per Rubi, per Drupal o Wordpress, ... Pens que pot ser un servei molt útil, però el temps dirà si té la resposta que esper.
No puc acabar el capítol APSL sense fer referència a la quantitat d'amics que ens van donant suport i que s'interessen pel que feim. Menció especial per la gent de l'Ibit que ens ha convidat als seus saraus, als quals sempre hi anam amb la màxima il·lusió. A amics com Pau, Benjamí, Ricardo, Marcos, Joan, Sebas, Jordi, Pep, Xus, Eugeni, Paco, Eduard, Suki, Bruno, Xisco, ... (me deix gent, segur) que de tant en tant s'han passat per l'oficina a fer un cafè i a compartir amb nosaltres penes i alegries. He comanat cafè per un grapat de mesos, ja sabeu que ca nostra és ca vostra. Moltes gràcies pel vostre suport amics!.
El 2012 ja veurem com anirà, com us dic, molts projectes a concretar, però després ja veurem. El que sí m'agradaria és poder consolidar bé el projecte APSL i d'una manera o d'altra poder anar aglutinant al voltant del projecte al tipus de gent que m'agrada: gent apassionada per la seva feina i pel codi lliure i la informàtica i amb unes ganes d'aprendre coses noves que no s'acaba mai.
Python i Django
Encara que mantenim aplicacions amb la versió 1.2 de Django ja desenvolupam les noves aplicacions amb la versió 1.3, fent us de les "generic class views" tant com podem, i de utilitats com crispy forms. Que Twitter alliberàs el seu bastiment css i utilitats com crispy han fet que desenvolupar aplicacions de backoffice sigui molt més senzill que abans.
Hem incorporat un bon grapat de llibreries i utilitats a la nostra borsa de programació durant el 2011. Una de les més interessants és Redis, una base de dades NoSQL que poc a poc va reemplaçant a Memcached en els nostres projectes i que ha resultat un complement ideal pel sistema de coes Celery.
Sentry ha resultat un complement ideal per a la monitorització de les web i la gestió dels error no controlats (que sempre n'hi ha). El django-constance ens ha anat fantàstic per a mantenir webs on es tenia que canviar la configuració molt ràpidament sense reiniciar, django-compressor ens ha permès arribar al plus de velocitat de descàrrega que necessitàvem en algunes aplicacions empaquetant css i javascript.
Al primer trimestre del 2012 ja es preveu que surti la versió 1.4 de Django. Hi ha força novetats però la majoria són correcció de bugs. La que més ens afectarà en positiu serà la possibilitat d'interncionalitzar els noms de les urls. Fins ara ho fèiem amb una utilitat apart. Encara que el soport per a la internacionalització de Django sempre ha estat molt bo, trob que li faltava aquesta part dins el nucli del bastiment per passar de ser bo a excel·lent.
Hi ha eines que s'han consolidat com a imprescindibles aquest 2011: south per a la migració d'estructures de dades, pip per a la insal·lació dels paquets associats a una aplicació, virtualenv i virtualenvwrapper per aïllar aplicacions dins el seu propi entorn i fabric, que hem configurat per a que el desplegament i actualitzacions sigui cosa de segons.
Al 2012 esperam molt més de Python i Django. Hem començat a desenvolupar webs per a dispositius mòbils i un dels propers projects ha d'estar adaptat a tablets. Això a més del repte del projecte ha suposat tenir que adquirir una tablet per hom, però sincerament crec que sols en necessitàvem l'excusa :D
Adéu al PPC
Feia estona que volia "jubilar" el PowerPC G5. És un ordenador que no m'ha donat el rendiment que m'esperava, la relació qualitat preu trob que ha estat força dolenta si la comparam amb un portàtil de la mateixa època. El rendiment de l'equip amb dos processadors i 3 Gb de RAM sempre ha estat molt per davall del rendiment d'un portàtil Dual Core amb 2 Gb de RAM.
Fa quinze dies el G5 va decidir que no es posava en marxa. No tenc ni idea del que li passa, però sospit que pot ser la fon d'alimentació, i això he llegit que pel cap baix eren 300 - 400 eur. Sumat a les ganes que li tenia varen motivar la renovació d'equip de casa, i com que la mitja de compra d'equips és d'un cada 6 anys, doncs ja he aprofitat per fer el canvi complet i posar-me dues pantalles planes de 24" que fan goig. Una oferta molt bona de Dell en té la culpa. L'ordinador és un T1600, potent, però que no m'està deixant molt satisfet pel renou que fa, es nota molt que està encès i el disc dur també és molt renouer.
Un amic al que li agraden molt els Range Rovers em va dir que la solució per a que un cotxe d'aquests no faci renou és posar-li uns altaveus més potents a l'equip de música. Potser m'hauré d'acostumar a fer el mateix amb l'ordinador i acostumar-me a fer feina amb els cascs de música posats, però la veritat és que m'esperava més per la qualitat d'equips a la que me tenia acostumat Dell.
I la joguina nova es diu Asus Transformer
Seguin la rocomanació de Sebas el meu tablet va ser un Asus transformer. La relació qualitat-preu és bona i per ara n'estic content. M'agradava molt també el Xoom, però això significava haver de comprar un portàtil addicional per als meus desplaçaments fora de l'Illa. El Latitude 2100 que tinc encara va bé, però amb 4 hores de durada de la bateria fa que tengui que anar carregat amb el transformador si vull llegir el correu sense passar pena.
L'Asus té una càmera pitjor que el Xoom i no té flash, però la incorporació del teclat i una durada d'unes 16 hores em van fer decidir-me. Soluciona tres problemes: tenir una tablet per a poder provar les apliciacions web, poder disposar d'un equivalent a una portàtil per escriure sense problemes i tenir una bateria amb una durada prou gran per no haver de passar pena.
Bones festes
I això és tot per ara, si no ens tornam a llegir al 2011 esper que passeu unes bones festes i un bon començament d'any. Gràcies per ser per aquí i passar l'estona amb mi. Esper que ens anirem retrobant tant per la xarxa com en persona. Volia dir en la vida real, però estic pensant que la xarxa és real i també ho són els amics que hi fas, si va bé ja ens coneixerem cara a cara i si no pot ser això no ha de servir d'excusa per minusvalorar la gent que coneixes mitjançant la web.
Acab, en serio,
BONES FESTES!!!!!
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django APSL
Reflexions
Escrit per Aaloy a 20 de November , 2011 a les 2:13 a.m.
Reflexionant
Aprofitant que avui és una jornada de reflexió me pareix que aprofitaré per repassar un poc l'anecdotaria personal d'aquestes darreres setmanes, a veure si en puc treure també algunes conclusions.
No sé el que vull
Donc així ens va venir una persona a veure'ns i d'entrada em va amollar aquesta frase. Bé, res a dir, això és bastant típic quan es comença un projecte. El client no sap massa bé què vol, i la meva feina sovint consisteix en anar fer preguntes, clarificant el que el client vol. Al final, després d'hores de conversa vaig definint el que podria ser el projecte: gran, molt gran. El client resulta que nos sap què vol, però sap que ho vol tot!
Paralant parlant ens diu que ja té un altre pressupost. Diu que ens ho enviarà per a que li poguem pressupostar el mateix. Fantàstic, al manco hi ha un punt de partida. Al dia següent em pos a repassar les notes i començar a fer el pressupost. Quan m'arriba l'e-mail del client jo ja duc com a 8 fulles del pressupost, explicant què tindrà el programa d'acord amb les especificacions del client.
El pressupost que reb em deixa de pedra. Es tracta de dues fulles ròniques que sols inclouen un llista de manteniments, sense entrar en cap tipus de detall. Ja me fa mala espina que en la maraca d'aigua de la fulla hi ha un disquet (are you from the past?), doncs pareix que sí. Però el que em sobta més és el preu que hi han posat, com a deu vegades menys que el que a mi m'està sortint. Li faig una ullada, no s'incluen caps de les característiques que fan més complexa l'aplicació, pareix un conjunt de planes estàtiques amb un editor html al darrera.
Faig una ullada a la web de l'empresa i veig la feina que han fet. En aquests casos sempre pens que potser sóc jo qui m'he errat. També confirm amb el client que el que vol és realment el que m'ha demanat i no simples planes estàtiques o picades a un cms.
La web de l'empresa és per sucar-hi pa. Webs de fa un any o dos que estan fetes fent servir cgis. La plana 404 de les aplicacions apunta al proveïdor del hosting, que obviament es un d'aquests superpoblats, que aprofiten el darrer cicle de CPU per posar-hi usuaris. Anam a veure una de les webs i li coment a Juan lo del cgi i les petades. Ell a més me comenta que ha canviat un paràmetre de la url i li ha sorti un dump de base de dades. Aquesta gent no ha sentit mai parlar d'injecció de codi ni llegit Exploits of a Mom. Som bona gent i el seus clients no es mereixen tanta incompetència, així que ho deixam anar.
Ara ja tenim un problema important, que és el factor psicològic de la fixació de preu. Aquesta gent ha fet un pressupost sense tenir la mínima idea d'on s'estava ficant i del que realment volia el client i ha donat un preu fruit de la seva inexperiència. Ara quan el client vegi el que jo li presentaré es pensarà que li estic prenent el pèl encara que és just al contrari.
Primera conclusió: els clients en general estan molt verds a l'hora de demanar un programa. Quan un demana una casa s'informa del constructor, demana el que ha fet, en quin tipus de projectes ha participat, demana a les amistats i s'assegura que les cases que ha fet no han caigut. En el desenvolupament sols pareix que es fixa amb el color de la façana. Com a informàtics ens fa falta fer molta feina de pedagogia, d'ensenyar als nostres clients a comparar, a saber que hi ha feines més i menys complexes, a poder destriar amb qui se la juga.
El meu cap diu que té un conegut que ...
Aquesta també és una altra història en línia amb l'anterior. Faig un pressupost força ajustat, el projecte m'interessa, pot ser divertit. El client vol donar el pas cap el negocio online. Vol canviar la seva web actual potenciant-la i afegint-li venda on-line. Es preveuen cents de milers de planes servides al dia i la web hauria de funcionar 24x7 pràcticament.
Tot està tancat, els tècnics del clients entenen el que farem hi saben que ho podem fer bé. Han vist el tipus de feina que fem i s'ha generat aquella confiança que t'anima a col·laborar i a entendre el projecte com si fos teu. Però al darrer moment reb una telefonada: el meu cap ha decidit que ho farà algú que ell coneix. Deman per la tecnologia: punt net, amb asp, internet information server, Windows 2003 i Microsoft Sql 2008. Ni en els meus pitjors malsons recomanaria una tecnologia així pel projecte del client. A més jo li havia oferit un servidor dedicat, és el mínim per anar tranquils amb el tipus de dades que es tractaran i el tràfic previst.
Faig una ullada al mercat nacional de servidors. El fiera del Information Server els hi ha dit que molt millor un servidor nacional per millorar el posicionament. Obviament no ha tingut en compte que això és un factor de tercer ordre, i que si primer la plana no va prou ràpida i té prou ample de banda, ja no hi ha res a fer. De totes maneres faig una ullada al mercat nacional, a veure què hi ha amb aquestes configuracions. Vaig a parar a Arsys, que per 605 eur/mes t'ofereix una plataforma així pel`tot just 605 eur/mes amb llicència sql server express edition, si vols la "bona" són 350 €/mes.
Jo els estava oferint si també un servidor dedicat, amb el doble de prestacions que Arsys i també gestionat per nosaltres per 200 €/mes. Em diuen que la gent que els fa la web els hi han dit que el hosting serà de 60 eur/mes. Per aquest preu i a Espanya em temo que serà un hosting compartit, potser del proveïdor, amb el més nou de la versió patapalo-edition de Microsoft.
És una llàstima, la gent amb la que he tractat em cau molt bé i són els primers que no entenen la decisió. Sospit que pot ser un projecte molt problemàtic i que els acabarà costant sang i llàgrimes. Tant de bo no els costi l'empresa.
Segona conclusió Senyors directius, convindria que de tant en tant i en questions tècniques es fes cas als tècnics, que amb les coses de menjar no es juga.
Tercera conclusió Com el el cas anterior hi ha molt de risc de que el projecte fracassi i el client surti escaldat. Part de la responsabilitat és del client, que hauria de saber què compra, però també hi ha una gran responsabilitat del proveïdor, que està enganant al client.
Pero mira que som frikis
Aquesta setmana també m'han demanat un pressupost per a una connexió amb un servei web. Llegint la documentació veig que el WSDL (argh!) sols està certificat que funcioni (que és el mateix que dir que sols funcionarà) amb Java i .Net. Això se diu fer coses estàndard, sí senyor. És un servei complex i delicat, així que abans de pressupostar res convé fer un petit prototip. Li aplic suds, el client SOAP que feim servir habitualment per Python, i les sospites es confirmen, no és capaç de consumir el WSDL i transformar-lo amb Python. Odio els WSDL la S se suposa que és de Simple, no? Han conseguit fer un protocol infumable i que gairebé sols ho pot consumir la mateixa llibreria que l'ha creat.
Però bé, l'interessant de tenir una capça d'eines farcida és que hi ha alternatives. Feim un poc de brainstroming amb Juan. La primera opció és modificar el WSDL per a que el mapejador s'ho mengi, o bé anar donant ajudes a la llibreria. És una opció que no m'agrada, ja que si hi ha problemes el proveïdor del servei se'n rentarà les mans, fins i tot si la culpa és seva.
Una possibilitat seria fer el projecte an Java, però això significaria un cost molt més alt per al client, i sobretot una manca de flexibilitat a l'hora de fer modificacions, ja que el servei sols és una petita part del projecte. Python i Django ens permeten tenir un temps de resposta molt bo davant canvis i això és fonamental pel tipus d'aplicacions que fem.
L'altra possibilitat és fer un servei Java/J2EE que faci de proxy cap a l'aplicació Python. Amb un protocol de comunicació compartit com xml, json, yalm o un binari com el de Google la cosa pot funcionar. En Juan suggereix fer una ullada a jython, que ell li va fer una ullada i pintava molt bé. Li fem una ullada, el projecte està mantingut i és compatible amb Python 2.5, que ja ens va prou bé.
Fem el primer prototip. Cridam a la libria Java des de jython i fem la cridada al servei. Funciona a la primera. I això provant des de la consola de línia de comandaments de jython. Ja tenim part del problema arreglat, però encara no ens satisfà del tot. En nexe d'unió ha de ser net i jython, com aplicació Java que és necessita un temps considerable per iniciar-se.
Però vet aquí que Celery, el sisteme de coes de Python del qual ja us n'he parlat, resulta que soporta Jython. Podem crear el mapeig de la llibreria amb jython i fer que les peticions sian bé síncorones o asíncrones, però que s'executin com a una tasca Celery. Com que la petició es farà dins un worker i aquest està sempre aixecat, no tindrem problemes de temps d'inici una vegada pugi l'aplicació. Es monta el prototip amb Celery, Redis, Python i Jython, en Juan ho està disfrutant i jo també.
Ara puc fer el pressupost tranquil. Sé que el que podria representar el risc més gran ja no representa el problema, hem descober el boogeyman del projecte (l'home del sac) i l'hem exposat a la llum.
No sé si el projecte es farà, però tenc la conciència tranquila de que aquesta és la manera de fer les coses. A l'hora de fer un pressupost per a un client no es tracta sols de pegar una pedrada i a veure si hi ha sort, sinó en estudiar el projecte i veure'n els riscs que hi pugui haver. Per això sovint sóc un perepunyetes demanant informació abans de fer un pressupost. Sé perfectament que en aquesta fase tot pressupost té un marge d'error gran i que hi haurà variacions en el projecte, però crec que no és professional tirar-se a la piscina a l'hora de presentar un pressupost si hi ha un punt crític que no es té clar com es farà. Preferesc invertir uns dies de feina més (amb risc que el pressupost no surti i perdre la feina) que exposar-nos a nosaltres, al projecte i sobretot al client als maldecapts d'un projecte la viabilitat tècnica del qual no s'ha pensat a l'hora de fer el pressupost.
Ho deix aquí, que aìxò s'ha fet molt llarg. Em deixo parlar de coses igualment divertides, com la telefonia IP que estam posant a l'oficina amb Asterisk i el bé que se sent amb els mòbils Android, o la potència de Bacula per configurar les còpies de seguretat. Potser un altre dia ...
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django Java Gestió de projectes Codi lliure Linux APSL
De xerrada a l'IBIT
Escrit per Aaloy a 03 de November , 2011 a les 8:27 p.m.
Avui he participat a les jornades de programari lliure que organitza l'IBIT en qualitat de ponent per presentar el cas d'èxit d'APSL com a empresa que utilitza el programari lliure i que a més desenvolupa programes amb programari lliure per als seus clients.
Com sempre és un plaer participar en els actes de l'IBIT i més si mestre Benjamí fa de mestre de cerimònies. La gent de l'IBIT fa una gran feina de divulgació i el tracte personal amb la gent que coneixem d'allà per mor d'haver participat en altres jornades és fantàstic. Des d'aquí moltes gràcies per haver pensat amb mi per aquest tema. A més una de les coses que més em motiven és poder parlar de programari lliure, de com ho vegi, de les coses que es poden fer, ... El problema és que agaf embalada i m'han d'aturar XD
Després de la meva xerrada en Xavi Gil ha parlat de Txerpa, un concepte de negoci desenvolupat al voltant del programa lliure OpenERP en el qual hem pogut paticipar com a col·laboradors tecnològics. Per mi Txerpa representa un exemple molt clar de les possibilitats que dóna a l'empresa el codi lliure a l'hora de montar un negoci. Per una part s'ha pogut montar perquè existia el producte, i per altra ha generat negoci a una empresa com APSL que ha fet la part tècnica. Però a més, i gràcies al programari lliure, els tècnics de Txerpa s'han pogut fer càrrec del codi i anar-ho modificant pel seu compte, quedant APSL com a suport de segon nivell. Amb programari tancat Txerpa hagués tingut el producte, però no el vertader control que té ara.
Es parlà després de Vtiger, un CRM fet amb PHP i que una empresa mallorquina ha pogut personalitzar per adaptar-lo a les seves necesitats i als seus clients.
Va tancar la xerrada de PIMES una xerrada damunt com una empresa que es dedica a la distribució elèctrica a Sóller ha adaptat OpenERP i l'ha utilitzat com a bastiment de desenvolupament i ha creat centenars de mòduls adaptant-los a unes necessitats tant específiques com són les d'una companyia elèctrica.
Personalment estic molt content de veure com el programari lliure avança dins el teixit empresarial mallorquí, gràcies al suport de organismes com l'IBIT, d'agrupacions com BULMA i de tanta gent que pensam que hi ha una altra manera d'entendre el programari.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Codi lliure APSL
Generar arxius xls amb Python III
Escrit per Aaloy a 29 de October , 2011 a les 11:28 a.m.
En aquesta tercera entrega veurem com podem fer que des de la nostra aplicació Django es puguin generar i servir els arxius que hem generat amb la llibreria xlwt.
La mecànica és la mateixa que la que hi ha als tutorials de Django
que mostren com servir un arxiu csv o un pdf, així que per a que
serveixi d'alguna cosa més us mostraré como ho feim utilitzant les
generic class views incorporades a Django 1.3.
El que volem fer és poder mostrar els resultats per pantalla i després poder afegir un link que ens retorni les dades que tenim en pantalla en forma d'arixu descarregable.
ListView
Per el nostre propòsit farem servir la classe ListView que es troba
a django.views.generic
La utilització més típica d'aquesta classes implica sobreescriure el
mètode get_query_set de tal manera que ens retorni les dades que
mostrarem a la plantilla, i, com no, indicar-li el nom de la plantilla
a la qual s'han de mostrar els resultats.
El codi seria quelcom semblant a això per la part de views.py
class TestView(ListView):
"""Classe de proves per l'article"""
template_name='tests/user_list.html'
def get_queryset(self):
"""Listam tots els usuaris que no són superusuaris"""
return User.objects.filter(is_superuser=False)
a l'arxiu urls.py crearem la url que apunti a la nostra classe,
afegint
url(r'^test/$', TestView.as_view(), name='trespams-test'),
i important TestView des del mòdul views.py
la plantilla
{% extends "base.html" %}
{% block main %}
<table>
<a href="{% url trespams-test %}?exporta=1">Exporta</a>
{% for user in object_list %}
<tr>
<td>{{user.username}}</td><td>{{user.email}}</td>
</tr>
{% endfor %}
</table>
{% endblock %}
A la plantilla com podeu veure hi ha un object_list que no hem
definit enlloc. Això ho fa la pròpia classe, que passa tot el que ve
del get_querset al contexte de la plantilla dins una variable
anomenada object_list. Podem canviar aquest nom si no ens agrada.
<a href="{% url trespams-test %}?exporta=1">Exporta</a>
Hem definit un enllaç que apunta a la mateixa url i per tant a la matea vista, però afefint-hi un paràmetre que ens indicará que el que volem no és tornar a generar la plana sinó exportar el fitxer.
Si creau una aplicació de proves i provau el codi veureu que encara no fa res, tranquils, ara hi anam...
Canviam la renderització
El gran avantatges de les class views és que estan construïdes de
manera molt modular, de manera que podem sobreescriure tot allò que
convingui per a modificar-ne el comportament.
En el nostre cas volem que es renderitzi un contingut o un altre
segons tinguem o no un paràmetre concret a la url, i per axiò el que
farem serà sobreescriure el mètode render_to_response
class TestView(ListView):
template_name='tests/user_list.html'
def get_queryset(self):
return User.objects.filter(is_superuser=False)
def render_to_response(self, context, **response_kwargs):
if self.request.GET.get('exporta'):
return self.render_to_fitxer(context, **response_kwargs)
else:
return super(TestView, self).render_to_response(context,
**response_kwargs)
El que deim és, si hi ha el paràmetre exporta al GET llavors fas un
render_to_fitxer (que encara no hem definit), en cas contrari, fas
el que es suposava que havies de fer.
Definim el render_to_fitxer
Ja sols ens queda definir el render_to_fitxer per fer que enlloc de
l'HTML obtinguem un arxiu
class TestView(ListView):
template_name='tests/user_list.html'
def get_queryset(self):
return User.objects.filter(is_superuser=False)
def render_to_fitxer(self, context, **kwargs):
"Sortida cap a un fitxer xls"
import xlwt
from django import http
response = http.HttpResponse(
content_type='application/vnd.ms-excel; charset=utf-8',
**kwargs)
response['Content-Disposition'] = 'attachment; filename=usuaris.xls'
usuaris = self.get_queryset()
wb = xlwt.Workbook()
ws = wb.add_sheet('usuaris')
fila = 0
for usuari in usuaris:
ws.write(fila, 0, usuari.username)
ws.write(fila, 1, usuari.email)
fila += 1
wb.save(response)
return response
def render_to_response(self, context, **response_kwargs):
if self.request.GET.get('exporta'):
return self.render_to_fitxer(context, **response_kwargs)
else:
return super(TestView, self).render_to_response(context,
**response_kwargs)
Els imports que hi ha al mètode render_to_fitxer poden estar a la
capçalera del mòdul perfectament, els he posat aquí per mostrar
explícitament els mòduls que es necessiten dins el mètode.
De la resta de codi, fixau-vos com podem modificar les capçaleres de
resposta per indicar que el que volem és generar un arxiu el
content_type del qual és de tipus excel i que ho tornarem en format
utf-8.
A més al Content-Disposition hem indicat que el contingut es
servirà com a un adjunt i amb un nom específic.
Per a la generació de les dades hem reaprofitat get_querset,
tanmateix el que volem és el mateix que hi ha en pantalla. Es pot
arribar a optimitzar per posar el contingut dins una caché i evitar
que es torni a repetir la consulta, però això és una optimitzaició
prematura.
Finalment, cal notar que no es genera un arxiu temporal, sinó que la
resposta, que tenim dins la variable response és comporta ella
mateixa com si fos un fitxer. És la màgia del duck typing.
I això és tot! Fins la propera!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Generar arxius xls amb Python II
Escrit per Aaloy a 20 de October , 2011 a les 9:27 p.m.
A l'article anterior havíem fet un petit "hello world" en format xls, ara toca fer alguna cosa més de profit, així que veurem com podem generar un full de càlcul a partir de dades.
En altres temps, quan donava formació ofimàtica, un dels exercicis que feia fer als alumnes quan tocava el tema de les fulles de càlcul era el de fer una taula de multiplicar, serveix per perdre la por a la cosa aquesta dels nombres i mostra els conceptes fonamentals, ara podem fer el mateix. Per no fer-ho molt complicat anem per la taula del dos
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import xlwt
fmt = xlwt.easyxf
h1 = fmt('font: name Arial, height 200, bold on;')
wbk = xlwt.Workbook()
full = wbk.add_sheet('Taula del 2')
full.write(0, 0, "Taula del 2", h1)
for x in range(1, 11):
full.write(x, 0, 2)
full.write(x, 1, "x")
full.write(x, 2, x)
full.write(x, 3, "=")
full.write(x, 4, xlwt.Formula('A%s*C%s' % (x+1, x+1)))
wbk.save('taula.xls')
Podem veure com hem creat fàcilment una fórmula per a fer la multiplicació. També podem veure com per posar les fórmules hem de tenir en compte que s'ha de fer en la notació de files i columnes pròpia de les fulles de càlcul, és a dir, les columnes s'anomenen a partir de la lletra A. Això xoca un tant amb tot el maneig de la llibreria que utilitza una notació de coordenades o la l'origen està en la cel·la superior esquerra.
Per tractar amb això la llibreria proporciona un mòdul anomenat Utils que ens proporciona les eines per fer les transformacions entre la notació de fulla de càlcul i la notació de coordenades de la llibreria.
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import xlwt
fmt = xlwt.easyxf
h1 = fmt('font: name Arial, height 200, bold on;')
wbk = xlwt.Workbook()
full = wbk.add_sheet('Taula del 2')
full.write(0, 0, "Taula del 2", h1)
for x in range(1, 11):
full.write(x, 0, 2)
full.write(x, 1, "x")
full.write(x, 2, x)
full.write(x, 3, "=")
num = xlwt.Utils.rowcol_to_cell(x, 0)
taula = xlwt.Utils.rowcol_to_cell(x, 2)
formula = xlwt.Formula("%s*%s" % (num, taula))
full.write(x, 4, formula)
wbk.save('taula.xls')
Formats
Quan tractam amb informació és important a més de presentar-la, fer-ho en un format entenidor. Els fulls de càlcul ho fan prou bé a això, i des de fa molt temps tenen la capacitat de presentar-nos les dates en formats legibles i no en el seu format intern, i les quantitats numèrics ben formatejades, per exemple.
Amb la llibreria xlwt podem utilitzar els formats de cel·la de la
fulla de càlcul, podeu consultar-los anant a les propietats d'una
cel·la o bé fer una ullada a l'exmemple num_formats.py que ve amb
la llibreria.
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import xlwt
import decimal
fmt = xlwt.easyxf
wbk = xlwt.Workbook()
full = wbk.add_sheet('Caixa')
moneda = fmt('font: name Times' ,
num_format_str=u'#,#0.#0 "€";[Red]-#,#0.#0 "€";')
full.write(0, 0, decimal.Decimal("11133"), moneda)
full.write(0, 1, -3939.93, moneda)
wbk.save('nombre.xls')
A l'exemple podem veure com xlwt tracta perfectament tant el format numèric sencer (o float) com el Decimal.
De la mateixa manera podem fer feina amb diferents formats de dates o formats de temps.
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import xlwt
import datetime
fmt = xlwt.easyxf
wbk = xlwt.Workbook()
full = wbk.add_sheet('Avui')
data = fmt(num_format_str=u'D MMM YYYY')
full.write(0, 0, datetime.date.today(), data)
wbk.save('dates.xls')
Ho deix aquí per avui, a la propera entrega veurem com passar tot això la web i fer que Django ens doni un petit informe creat amb xlwt amb les dades del model.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Generar arxius xls amb Python I
Escrit per Aaloy a 17 de October , 2011 a les 9:25 p.m.
Una de les coses que volia que l'aplicació de gestió de comunitat de propietaris que fem és la de tenir algun tipus de via per a poder exportar la informació introduïda. D'aquesta manera el client no està captiu i les seves dades són realment seves, però a més també volia que aquesta informació es presentàs de manera que també pogués ser útil.
El format csv està prou bé, però és massa simple a l'hora de presentar les dades. Necessitava quelcom del format del qual fora prou potent per poder aplicar estils i format bàsic, i al mateix temps que no implicàs una despesa addicional per al client.
Cercant, cercant vaig arribar a la llibreria xlwt. Aquesta llibreria permet crear fitxers en format xls (Excel) d'una manera prou senzilla i ràpida com per a ser just el que necessitàvem. El format es pot llegir tant mitjançant aplicacions privatives, que de d'aquí no recomanaré, o des d'aplicacions lliures com l'OpenOffice o LibreOffice.
Per a qui vulgui saber-ho tot podeu fer una ullada al codi font, però si us conformau amb un poquet menys, podeu llegir-vos el tutorial. Si voleu anar per feina podeu seguir llegint i us ne faré cinc cèntims de la llibreria.
Hello world
El primer que hem de fer és instal·lar la llibreria. Així que si no heu instal·lat pip ja tardau i després no deixeu de fer el mateix amb el virtualenv i el virtualenvwrapper, ja que sempre, sempre, farem feina des d'un entorn virtual.
Així doncs:
mkvirtualenv fc
workon fc
pip install xlwt
El que farem serà crear un full de càlcul amb les paraules "Hello world" a la primera cel·la (A1)
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import xlwt
wbk = xlwt.Workbook()
full = wbk.add_sheet('full 1')
full.write(0,0,'Hello world')
wbk.save('hello.xls')
Ja està! Hem importat la llibreria, creat el llibre, afegit un full que hem anomenat "full 1" i segidament escreit a aquest full la frase mítica.
Podem afegir tans fulls com volguem sense problemes, però ens hem de fixar bé que la cel·la A1 correspon a les coordenades zero, zero del full de càlcul.
Un poc de format
Podem aplicar estils a una cel·la fent servir dos mètodes: podem utilitzar la classe XFStyle que ens permet crear l'estil dessitjat pas a pas, o bé aplicar un format molt més legible pels humans i molt més proper al que seria un full d'estil css: easyxf
En aquest article faré servir aquest darrer mètode, ja que està prou ben documentat i com us dic, és molt més legible. Així, el que faré serà fer que el nostre "Hello world" es present un poc més vistós.
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import xlwt
fmt = xlwt.easyxf
h1 = fmt('font: name Arial, height 400, bold on;')
wbk = xlwt.Workbook()
full = wbk.add_sheet('full 1')
full.row(0).height = 800
full.write(0,0,'Hello world', h1)
wbk.save('hello2.xls')
He creat un estil anomenat h1 amb font Arial i negreta. L'alçada l'he posada com a 400, és a dir 20px. Com a base preneu que un tamany de font 200 equival a una alçada de 10px.
Com que volem que la fila tengui més alçada que la font, hem
establert la propietat height de la fila a 800.
Això és tot per avui, al proper article (demàs segurament) ja un full complet, amb format numèric i alguna fórmula.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Propietariosonline, la visió tècnica
Escrit per Aaloy a 08 de October , 2011 a les 11:01 a.m.
Aquesta setmana és obligat parlar del llançament de propietariosonline.com, una aplicació web per a la gestió de comunitats de propietaris que hem llançat des d'APSL. Junt amb la web de trobacasa forma el gruix dels projectes propis. Actualment estam en fase beta, és a dir, mirant de netejar tots els possibles errors que puguin haver passat els nostres testeigs inicials i sobre tot, copsant les opinions dels beta-testers, per tal d'anar incorporant els suggeriments de millora que ens facin. Personalment una de les coses que més em motiven a l'hora de fer un programa és que aquest sigui útil, i per això res millor que fer-lo en col·laboració amb els usuaris potencials del programa.
Com que supòs que no llegiu això per a que us parli de la gestió de les comunitats de propietaris, aniré entrant en matèria.
L'aplicació està desenvolupada amb Django en la seva versió 1.3. És la primera aplicació grossa en la que feim un ús intensiu de les generic class views. Com molts sabreu abans de la versió 1.3 la manera de passar del la petició (el request) cap a la sortida html era mitjançant una funció que es posava a l'arxiu views.py. Amb la versió 1.3 això també es pot fer, però hi ha la possibilitat de que aquestes funcions siguin classes.
Per una aplicació com propietariosonline això ha significat poder fer herència de classes i reutilitzar moltíssima funcionalitat. Ahir llegia un apunt on un usuari de Django es queixava que la quantitat de codi escrit utilitzant les classes era major que sols utilitzant les funcions. En casos puntuals potser veritat, però quan es pot fer ús de l'herència, la reutilització de codi i sobretot l'estructuració que tens compensa de sobres tenir que aprendre una nova manera de fer les coses.
Com es tracta d'un projecte propi, hem aprofitat per fer experiments i provar noves utilitats i llibreries. Ja se sap, els experiments a casa i amb gasosa, així que res millor que un projecte com aquest. Es prou gran com que l'experiència sigui extrapolable a altres projectes i no hi ha la pressió externa que representa un client que està pagant per hores.
Una de les llibreries que hem utilitzat és django-tables2 que ha significat passar de crear les taules de dades amb html a utilitzar codi Python per a enllaçar estructura i visualització. A l'aplicació es fan servir molts llistats tabulats i aquesta utilitat ens ha permès reutilitzar estructures de taula, definir formats de columnes i sobretot estalviar-nos una gran quantitat de codi HTML. De retruc les modificacions també són més senzilles, ja que per exemple modificar com apareixen les quantitat numèriques és tant senzill com modificar un tipus de columna que hem definit amb Python. Per exemple, per posar un check hem definit una columna com:
class BooleanColumn(Column):
def render(self, value):
valor = "on" if value else "off"
return mark_safe('<img src="%s/img/check-%s.png" />' \
% (settings.STATIC_URL, valor))
D'aquesta manera quan a un llistat es necessiti un camp booleà utilitzarem aquest tipus de columna. Si pel que sigui volem canviar com es presenta doncs no hem d'anar taula a taula a fer els canvis, sinó que podem anar directament al tipus de columna.
Una altra de les utilitat que hem fet servir es diu Sentry una utilitat que utilitza la gent de Quora per a monitoritzar els errors 500 i logs d'error. Fins ara aquests tipus d'errors els controlàvem amb els missatges d'e-mail que ens envia la pròpia aplicació de Django. El problema amb això és que no escala bé. L'altra dia de pagès ens trobàrem amb un problema on això es veu perfectament:
Un dels nostres clients està connectat amb una web amb molt tràfic que li envia peticions. Aquesta web va sofrir un atac i va començar a enviar peticions mal formades a tort i dret, i un dels afectats va ser el nostre client. Una de les màximes de Python és que les excepcions no ha de passar desapercebudes, així que personalment program de manera que si una cosa no ha de petar i peta, doncs me'n vull assabentar. Això va fer que rebéssim milers de missatges en poques hores. L'aplicació no es va veure afectada, però la bústia d'avisos feia goig! Al mateix temps un altra client va tenir una petada a l'aplicació, que també va enviar el corresponent e-mail. En condicions normals haguéssim vist l'error i l'haguéssim pogut solucionar en pocs minuts, però l'avís es va perdre entre els milers de missatges anteriors i no ens n'adonàrem fins passats un dia o dos. És veritat que es pot configurar el sistema de correu per a que distribueixi els missatges per client i per aplicació, però en condicions normals això no es tan còmode com tenir-ho tot centralitzat a un punt.
Aquí és on Sentry ens soluciona la vida. Hem configurat una aplicació amb Sentry que centralitza tots els missatges d'error. D'aquesta manera a la consola sols apareix el missatges i el nombre de vegades que s'ha produït l'error. Així encara que es produeixi una situació com la que explicava és molt més difícil que l'error passi desapercebut, ja que cada error idèntic s'agrupa dins Sentry. A més el format de visualització dels errors és fantàstic, molt semblant a com Django presenta els errors en mode depuració, la qual cosa fa que identificar el problema sigui encara més fàcil.
Propietariosonline va servir com a excusa i experiment, però a hores d'ara ja tenim el client de Sentry instal·lat al 90% de les aplicacions i la consola de Sentry com a una eina fonamental de monitorització, sols comparable en utilitat a Nagios en la monitorització de sistemes.
La resta d'utilitats que hem fet sevir ja són vells coneguts: django-nose per als tests unitaris, django-redis-cache, south, sorl-htumbnail, django-debug-toolbar, django-extensions, ipdb, robots etc. no s'han convertit en part fonamental de les nostres aplicacions.
Hores d'ara duim un mes just de dedicació al projecte. Fet i fet podem dir que hem dedicat dues persones a temps complet durant un mes. De fet és un poc menys, ja que hem fet manteniment d'altres projectes, però si sumam la feina de maquetació de la web principal i la feina de sistemes, doncs els resultat és si fa no fa aquest: 2 mesos-home de dedicació (encara que diferents perfils).
Posem-hi xifres! He utilitzat el programa cloc per comptar les línies de codi. He llevat la totalitat de codi javascript i css (i less), ja que fonamentalment hem utilitat llibreries jQuery i el bootstrap de twitter, el resultat és:
285 text files.
282 unique files.
1348 files ignored.
http://cloc.sourceforge.net v 1.53 T=1.0 s (248.0 files/s, 19589.0 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code scale 3rd gen. equiv
-------------------------------------------------------------------------------
Python 147 1593 872 11995 x 4.20 = 50379.00
HTML 90 298 32 4088 x 1.90 = 7767.20
XML 11 7 0 704 x 1.90 = 1337.60
-------------------------------------------------------------------------------
SUM: 248 1898 904 16787 x 3.54 = 59483.80
-------------------------------------------------------------------------------
És interesant veure que aquesta eina (encara que agafat amb pinces) ens dóna també l'equivalent en línies de codi si haguéssim fet servir un llenguatge de programació menys potent que Python. Donat que el nombre de línies de codi que pot escriure un programador és constant, llavors això vol dir que el mateix programa d'haver-ho fet en un altra llenguatge ens hagués duit 4 vegades més de temps. Per pensar-hi!
A la part de sistemes hem aprofitat també per potenciar el Fabric per a tota la gestió i desplegament de l'aplicació, que corre amb uWSGI i ngnix. Això ens permet pujar modificacions a diari, mantenint el cicle d'entorns de desenvolupament, preproducció i producció.
Encara hi ha coses que es poden millorar (de fet sempre n'hi haurà). Quan l'economia ens ho permeti volem incorporar un servidor per a la integració contínua, però a poc a poc esperam anar arribant-hi. M'agrada pensar que hem aconseguit un procés de millora contínua, on a cada projecte aconseguim tenir les coses millor que al projecte anterior i anar incorporant el que hem après també a les aplicacions que ja hi ha en producció.
Si tot això tindrà viabilitat econòmica i ens permetrà sobreviure com a empresa el temps ho dirà. Però el que sempre he tingut el convenciment que conformar-se i no aspirar a millorar sols duu a l'empobriment espiritual i és tan perillós o més que el risc que corres intentant millorar.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python APSL Django
Petit resum d'estiu
Escrit per Aaloy a 21 de September , 2011 a les 8:15 p.m.
Fa un grapat de setmanes que no escric res a aquest blog, tenc moltes coses pendents, però entre unes coses i altres el temps va passant i fins avui no he trobat una estona per a tornar-hi.
Han estat unes setmanes molt estranyes: problemes personals, alguns bons, com les noces de la germana i altres no tan bons, molta feina i com no, el començament de l'escola dels menuts i la festa de la Vermada que ja és aquí.
En el terreny de la feina tenc dues bones notícies: hem posat ja en producció un projecte que em fa una especial il·lusió txerpa i una web presencial fiscontrol.
txerpa és un projecte que hem desenvolupat per a una coneguda gestoria/assessoria de l'illa. Integra una web, un backoffice per a la gestió d'empreses via OpenERP i la integració amb el mateix OpenERP de manera que es poden crear molt fàcilment instàncies personalitzades per a poder dur una comptabilitat i gestió.
El projecte des del punt de vista tècnic ha estat molt engrescador. És un projecte amb un llarg recorregut en el qual esperam poder-hi afegint millores i nova funcionalitat. L'interessant, però, és veure que des d'aquestes illes nostres iniciatives com aquestes poden tirar endavant. Django i Python han permès que la integració dels diferents serveis que integren la plataforma es pogués fer d'una manera ràpida, mantenible i escalable.
Fiscontrol és un altre projecte que ha vist la llum aquesta setmana de manera oficial. En aquest cas és una web presencial, però ens ha fet il·lusió ja que és un projecte on el feeling amb el client ha estat molt bo i on les incorporacions del client han estat sempre per millorar el resultat final (ja sabeu que això no sempre passa). És de les poques webs on s'han demanat n idiomes i s'han posat continguts en aquests idiomes. En fi, que tot i que el projecte no té un component tècnic novetós, sí que ens hem divertit molt fent-la i veient els resultats.
Ja és la nostra tercera web d'assessoria, pareix que ens estam començant a especialitzar :)
Esper que en les properes setmanes hi haurà més novetats (com sempre en forma de projectes Django), ja que tenim un grapat de webs pendents de sortir.
Com sabeu els que us dedicau a la informàtica en el sector turístic, els mesos de temporada alta turística són mesos de temporada baixa en informàtica. He aprofitat aquest mig gas per engrescar a la gent d'APSL (o emmarronar-los, vet a saber) en un projecte propi. Permeteu-me de moment que us mantengui a l'espera de més notícis. L'interessant és que el projecte l'hem fet ja amb les noves generic class views de Django, incorporades a la versió 1.3.
En aquest projecte hem pogut veure la meravella de les class views, com tot el codi ens queda molt més compacte, com es pot aprofitar l'herència de vistes per escriure molt menys codi (sí, encara menys!).
De les class views en vull escriure un bon apunt un dia d'aquests. La documentació de Django que hi ha i els posts que he trobat sols fan referència al TemplateView, però la potència dels views de Forms, d'edició i borrat no s'han de menystenir. Així que es cosa de trobar-ne el temps per escriure l'apunt/tutorial i fer el codi d'exemple.
Per cert, que aquest blog ja corre damunt un altre servidor. Abans ho feia a un servidor dual core amb 2 Gb de RAM, però fa unes setmanes hem començat a migrar-ho tot a un servidor molt més potent, un i7 quadcore amb 12 Gb de RAM. Pingdom diu que la renderització ha passat de 4 segons a 1.5 segons. No he canviat el codi, sols és l'efecte d'un servidor que va més sobrat i d'una optimització de l'arquitectura: hem passat del WSGI de CherryPy que hi havia a l'inici al WSGI de uWSGI, de tenir la caché a memcached a tenir-la a Redis.
En Bernat ha fet molta feina deixant un entorn molt optimitzat per a les aplicacions Django. Tant que estam pensant en oferir un hosting gestionat per la gent que desenvolupi aplicacions Django i necessiti un entorn ben afinat. Temps al temps. El que tinc clar és que no vull que facem un projecte tipus Gondor, sinó quelcom on el valor afegit sigui la disponibilitat d'un tècnic de primer nivell com Bernat per a poder deixar ben fina l'aplicació.
Res, això és tot, i que no és poc.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Primeres setmanes amb el Kindle DX
Escrit per Aaloy a 21 de August , 2011 a les 10:41 a.m.
Ja fa un bon grapat de setmanes que vaig comprar el Kindle DX d'Amazon. Vaig elegir el model gran, més pesat i no tan actualitzat com el model petit, ja que la meva intenció era fer servir el lector per llegir documents en PDF.
En aquest temps he pogut comparar amb amics la diferència entre llegir un Pdf a un lector petit o al DX i he de dir que estic content de la compra feta. Amb el DX no s'ha de fer cap tipus de conversió, les planes es llegeixen bé i no hi ha scroll vertical.
Això, però té un cost. El DX sols té connexió 3G i no WIFI, amb la qual cosa està limitat en la navegació que es pot fer. No pots anar més enllà de la Wikipèdia, ja que en intentar anar a altres planes et sortirà l'avís que la navegació està restringida.
L'altra emperò és que els llibres en Pdf no són navegables amb el cursor, això vol dir que no tens a l'abast el diccionari integrat, que va força bé quan llegeixes documentació, el diccionari no et dóna la traducció del terme, sinó la seva definició, amb la qual cosa tens moltes més possibilitats de recordar el terme per a la propera vegada.
He provat de comprar a Amazon i és veritat que és molt còmode, la compra és fa gairebé impulsiva. També hi ha un emperò, que en aquests moments els llibres tècnics tenen un preu a vegades superior als llibres en paper. Sols els salva que al manco els pots comprar sense problemes, cosa que no es pot dir de les llibreries que hi ha a les nostres contrades.
He comprat també a O'Reilly, aprofitant la seva política de promocions per Twitter. Tenen un format compatible amb Amazon i que no té DRM. El vaig provar comprant "Redis Cookbook" i funciona perfectament amb el diccionari integrat i tot.
L'altra cosa que he anat provant és la conversió d'algún pdf a format ebook amb Calibre, queda un format legible però en molts de casos el resultat no compensa l'esforç, encara és més còmode llegir-ho en el format pdf original.
En resum, el DX va molt bé pel que jo volia i les meves necessitats, però s'ha de tenir en compte que Amazon no l'ha actualitzat tan sovint com ha fet amb els dispositius petits, però per llegir documents en format A4 com els pdf va fantàstic, però si sols heu de llegir novel·les segurament el format normal de lector us resultarà més còmode i menys pesat (tant en pes com econòmicament).
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: General Llibres i revistes
Redis vs Memcached [en]
Escrit per Aaloy a 05 de August , 2011 a les 6:17 p.m.
With some help of our friend "Google Translate" :)
As we all know that if you want a web application goes faster there is a secret cache as much as you can. Avoid to generate the page each time and search for the content in the database.
To archieve this the today standard is Memcached. Memcached allows us to scale our application a simple way. We can think it as a big hash table, written in C, very fast and with libraries to access to it in almost any language. But thre is e a new competitor in this kind of applications: Redis, and I've already talked about it in the Celery post.
Memcached is an application aimed at dealing with cache, Redis is a noSQL general purpose key-value database in a similar way as Memcached, but with possibilities that go far beyond a cache. Let's see a few differences:
-
We can not see the keys we have in Memcached. With Redis can do a search for keys, or see all the command KEYS *
-
Redis has persitence.
-
Memcached is limited to memory you allocate, Redis can also swapt to disk and just put the keys in memory.
-
In Memcached we have no true replication. Redis replication is real and configurable with a simple line.
-
Redis is quite configurable, we can define the page size of cache, store to disk, have a password protected database...
-
With Redis we can define as many databases as you want. We can clean all the keys in a database without affecting the others.
So the next step is to ask if we could use Redis instead of Memcached for our web applications. Redis plus Django could partially solve one of the biggest problems we have: cache invalidation. As we can have an independent database for each application or for each purpose, we can FLUSHDB the database our application to invalidate the whole cache, or just delete the keys with a single Redis command.
But in Science hypotheses have to be confirmed. So what I did was to build a little sandbox application to see how if Redis was as good as it seems.
The Sandbox
The machines availables to us for the experiment follows:
-
Dell Laptop Core 2 at 2:16 GH and 2 GB of RAM with Ubuntu 11:04 This is the Web application server and has the address 192.168.1.35
-
Virtual Server Ubuntu 10.04 with 512 MB of RAM on Virtualbox running on the laptop at 192.168.1.38. This server is 32 bit and will host Redis as Memcached.
-
Apple PPC 64 Dual Core with 3 GB of RAM, it will launch the tests.
The application is the one I created for creantbits. That is, to run it has to read BD for the last events and presents them in the page.
We will use two of Gunicorn workers to start the application, and we'll test the performance from the PPC with Apache Benchmark
ab -n 1000 -c 5 http://192.168.1.35:8000/
For each test case two consecutive tests are thrown and we discarded the first.
To test the Redis cache we have installed the application django-redis-cache
The test
First we have to determine the starting point. So what we did is to clear our application's cache and see how many requests we get.
no-cache: 120 req / s Mean: 41.4 ms
We set up cache site for Django configured as locmem. Locmem is not recommended in production environments as it can't share the cache, but as before, we used to set the starting point:
locmem: 1380 req / s Mean: 3.6 ms
We configure the the cache as memcached
memcached: 626 req / s Mean: 8.0 ms
Cache Redis configured with persistence to disk
Redis: 623 req / s Mean: 8.0 ms
Cache Redis without persistence. Is the nearest Memcached equivalent.
Redis: 632 req / s Mean: 7.8 ms
We install the hiredis package
Redis: 650 req / s Mean: 7.7 ms
Conclusions
I think the results speak for themselves. If we use persistence Redis is comparable in speed to Memcached, and for the same price we have a NoSQL database at our disposal.
If we don't need persistence Redis shows a 4% improvement over Memcached. This percentage is not significative, but at least we can see that Redis is in the same leage as Memcached.
For me Redis it too good to not use it!
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python Django
Redis vs Memcached
Escrit per Aaloy a 04 de August , 2011 a les 6:57 p.m.
Com tots sabem si un vol que una aplicació web vagi ràpida hi ha un secret: posar en caché tot el que puguem. Evitar tenir que fer càlculs i anar a la base de dades a cercar la informació.
Per fer això l'estàndard avui en dia és Memcached. Memcached ens permet escalar la nostra aplicació d'una manera molt senzilla. És una gran taula hash, del tipus clau valor, escrita en C, molt ràpida i amb llibreries d'accés en pràcticament qualsevol llenguatge.
Però en els darrers temps ha sortit un nou competidor dins les bases de dades de tipus hash, aquest competidor reb el nom de Redis, i ja us n'he parlat quan tractàvem el tema de Celery.
Així com Memcached és una aplicació orientada a tractar amb caché, Redis és una base de dades noSQL de propòsit general, amb format clau-valor com Memcached, però amb unes possibilitats que van molt més enllà de un simple magatzem de memòria. Anem a veure un parell de diferències:
-
No podem veure les claus que tenim dins Memcached. Amb redis podem fer una cerca per claus, o veure-les totes amb la comanda KEYS *
-
Podem configurar Redis per a que sigui persistent.
-
Memcached està limitat a la memòria que li assignem, Redis pot utilitzar també el disc i sols posarà en memòria les claus.
-
Memcached no té una vertadera replicació, encara que podem fer que hi hagi molts servidors Memcached. Redis té replicació real i configurable amb una simple línia.
-
Redis és força configurable, podem definir el tamany de pàgina de caché, quant guardarem a disc, si volem tenir la base de dades protegida, ...
-
Amb Redis podem definir tantes bases de dades com vulguem. Podem netejar totes les claus d'una base de dades sense afectar a les altres.
Amb tot això és lògic demanar-se si enlloc de Memcached no podríem fer servir Redis per a les nostres aplicacions web. Si ho ajuntam amb Django tenim resolt un dels problemes més grans, que és la invalidació de cachés. Separant cada una de les nostres aplicacions dins una base de dades, podem fer un FLUSHDB a la base de dades de la nostra aplicació per invalidar la caché, amb la seguretat que no afectarà a la resta.
Però a la ciència les hipòtesis s'han de confirmar. Així que el que he fet ha estat muntar un petit entorn de proves per veure com se comporta una aplicació senzilla.
L'entorn de proves
El maquinar de que disposam per l'experiment és el següent:
-
Laptop Dell Core 2 a 2.16 GH i 2 Gb de RAM amb Ubuntu 11.04 Aquest servidor té l'aplicació web, i té l'adreça 192.168.1.35
-
Servidor virtual Ubuntu 10.04 amb 512 Mb de RAM damunt Virtualbox, executant-se damunt el servidor anterior amb l'adreça 192.168.1.38. Aquest servidor és de 32 bits i tindrà tant Redis com Memcached.
-
Apple PPC 64 Dual Core amb 3 Gb de RAM, ens servirà com a màquina per a llançar els tests.
L'aplicació és la que vaig fer servir pel creantbits (http://creantbits.com). És a dir, fa un accés a BD per obtenir els darrers esdeveniment i presenta la plana.
Utilitzarem dos workers de Gunicorn per iniciar l'aplicació, i la testejarem des de el PPC amb l'Apache Benchmark
ab -n 1000 -c 5 http://192.168.1.35:8000/
Per a cada test es llancen dos tests ab consecutius i es descarta el primer. Es repeteix 2 pics i es fa la mitja, arodonint cap avall en nombre de peticions per segon.
Per la caché de redis es fa servir l'aplicació django-redis-cache instal·lada
des de PyPi.
Inici dels tests
Per començar hem de determinar el punt de partida. Així que el que farem serà desactivar la caché de la nostra aplicació i veure quantes peticions aconseguim.
no-cache : 120 req/s Mean: 41,4 ms
Activam la caché per site de Django i posam la caché a locmem. Locmem fa que la caché no pugui ser compartida entre processos i no és un opció recomanada per entorns de producció, però com abans, ens serveix per fixar el punt de partida:
locmem : 1380 req/s Mean: 3,6 ms
Posam la caché a memcached
memcached : 626 req/s Mean: 8,0 ms
Posam la caché a Redis configurada amb persistència a disc
Redis : 623 req/s Mean: 8.0 ms
Configuram Redis sense persistència. És l'equivalent a Memcached.
Redis : 632 req/s Mean: 7,8 ms
Utilitzam Redis amb el client hiredis
Redis : 650 req/s Mean: 7,7 ms
Conclusions
Crec que els resultats parlen per sí mateixos. Si volem persistència Redis és comparable en velocitat a Memcached, i a més pel mateix preu tenim una base de dades NoSQL en el nostre entorn i a la nostra disposició.
Si no volem persistència Redis supera per molt poc a Memcached i si aplicam totes les optimitzacions per tenir un entorn el més semblant possible a Memcached arribam a un 4% de millora. Aquest tant per cent no és significatiu, però si més no ens serveix per veure que Redis està al mateix nivell de rendiment que Memcached i ve amb tot el paquet d'opcions afegit.
Massa bo per no fer-ho servir!
Traducciones/Translations by apertium
8 comentaris, 0 trackbacks (URL) , Tags: Python Django
De la web al model
Escrit per Aaloy a 29 de July , 2011 a les 6:04 p.m.
L'scrapping
Ahir ja vàrem veure quin era el model de dades i el bé que va sorl per a manipular imatges, així com la utilització de la llibreria requests ens quedava veure una altra part important: com agafar el contingut de la web, parsejar-lo i obtenir-ne la informació que necessitam.
Per fer això hi ha diverses utilitats, algunes molt especialitzades com scrappy, i amb més solera és BeautifulSoup. Aquesta llibreria té la qualitat de ser molt permisiva amb l'HTML i hi ha poques planes que no pugui tractar d'una manera o altra.
La plana de Meneame té las notícies de portada dins un div anomenat
news-summari, així que el primer que farem serà carregar la plana
dins una instància de BeautifulSoup i cercar aquestes notícies.
page = requests.get('http://www.meneame.net')
if page.status_code != 200:
print "Ups! pareix que hi ha un petit problema"
return page.status_code
soup = BeautifulSoup(page.content)
noticies = soup.findAll('div', 'news-summary')amb això BS ens haurà donat tots els divs que tenen la classes 'news-summary' amb la qual cosa ja és sols cosa d'aplicar un tractament semblant per a obtenir la informació de cada notícia
for noticia in noticies:
titular = noticia.find('h1').text
texto = noticia.find('p').text
img = noticia.find('img', 'thumbnail')
if img:
src = img['src']
match_obj = compile_obj.search(src)
id = match_obj.group('id')
try:
NoticiasPortada.objects.get(identificador=id)
except NoticiasPortada.DoesNotExist:
print u"Tractant la noticia: %s" % id
noticia = NoticiasPortada(
identificador = id,
texto = texto,
titular = titular,
thumbnail = download_image(src,
'thumb-%s.jpg' % id)
)
noticia.save()El mètode find ens permet a accedir al primer tag que compleix la
condició i text ens en dona el contingut. Si com a segon paràmetre
hi possam una classe ens retornarà el primer element d'aquell tipus
que tengui la classe que li hem donat.
El problema ve quan volem identificar d'alguna manera les notícies. Volem guardar sols les que tenen una imatge. Podem veure que Meneame genera el thumbnail de la notícia amb l'identificador de la mateixa, així que podem fer us d'una expressió regular:
rawstr = r"""(?P<id>\d+).jpg$""" compile_obj = re.compile(rawstr)
així
src = img['src']
match_obj = compile_obj.search(src)
id = match_obj.group('id')ens donarà l'identificar de la notícia a partir de la informació de la url de la imatge. Hi ha una utilitat fantàstica per a la depuració i testeig d'expressions regulars anomenada Kodos, no us la podeu perdre.
El toc final
En una aplicació com aquesta la CPU està molt de temps sense fer res,
esperant que li arribi la informació. És un bon candidat per a que
l'aplicació faci ús dels Threads o del multiprocés. Una de le
maneres més senzilles de fer-ho és fent servir la llibreria Queue,
d'aquesta manera sols hem de definir quants Threads farem servir en el
processament i que aquests consumeixin el contingut (cada notícia) de
la cua.
Així el codi final quedaría si fa no fa:
import re
import cStringIO
import requests
from Queue import Queue
from threading import Thread
from BeautifulSoup import BeautifulSoup
from django.core.management.base import BaseCommand
from django.core.files.uploadedfile import SimpleUploadedFile
from t1.models import NoticiasPortada
rawstr = r"""(?P<id>\d+).jpg$"""
compile_obj = re.compile(rawstr)
class Command(BaseCommand):
"""Divertimento. Permet posar les notícies amb foto
de meneame dins una BD.
"""
def handle(self, *args, **options):
page = requests.get('http://www.meneame.net')
if page.status_code != 200:
print "Ups! Pareix que tenim un problema"
return page.status_code
#cream les coes
self.q = Queue()
for i in range(5):
t = Thread(target = self._importar_portada)
t.daemon = True
t.start()
soup = BeautifulSoup(page.content)
noticies = soup.findAll('div', 'news-summary')
for noticia in noticies:
self.q.put(noticia)
self.q.join()
def download_image(self, img_url, filename):
r = requests.get(img_url)
if r.status_code == 200:
return SimpleUploadedFile(content=r.content,
name=filename,
content_type=r.headers.get('content-type'))
else:
return None
def _importar_portada(self):
while True:
noticia = self.q.get()
titular = noticia.find('h1').text
texto = noticia.find('p').text
img = noticia.find('img', 'thumbnail')
if img:
src = img['src']
match_obj = compile_obj.search(src)
id = match_obj.group('id')
try:
NoticiasPortada.objects.get(identificador=id)
except NoticiasPortada.DoesNotExist:
print u"Processant la notícia: %s" % id
noticia = NoticiasPortada(
identificador = id,
texto = texto,
titular = titular,
thumbnail = self.download_image(src,
'thumb-%s.jpg' % id)
)
noticia.save()
self.q.task_done()I això és tot, com sempre amb Python l'explicació sol ser molt més llarga que el codi a executar, fins i tot amb els fils.
Esperant que us hagi agradat el divertimento.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Imatges de la web al model Django
Escrit per Aaloy a 28 de July , 2011 a les 5:42 p.m.
L'altra dia estava fent una aplicació web part de la qual consisteix en aprofitar els continguts de la web anterior, continguts als que no tenim accés directe.
La part de text va ser senzilla, però obtenir una imatge de la web i associar-la a un model Django va resultar una mica més interessant del que suposava. Tant que vaig pensar que potser convenia posar-ho en forma d'apunt.
Per posar-ho en context vaig començar a fer una aplicació Django, la qual tenia que obtenir la imatge i guardar-la, però ja que hi era, vaig voler fer quelcom més educatiu, així que l'aplicació es va anant transformant amb codi per a descarregar-se les fotografies associades a la plana principal de meneame. Si provau el codi mirau de canviar la url que ja que amablement Ricardo em va dir que no hi havia problema en fer algunes proves, tampoc és cosa que anem putejant la web.
Així doncs, aquest apunt serà un poc mescladissa d'utilitats, d' screen scrapping, de thread, processos i altres herbes. Miraré d'anar a poc a poc, però ja us aviso que hi ha de tot i molt!
Definim el model
El més habitual quan hom tracta amb imatges és tenir-ne que fer algun tipus de conversió, si més no per presentar-les a l'administrador de Django. És tan habitual que quan he de fer servir un camp ImageField de Django ja ho converteixo directament a un camp ImageField d'una llibreria que va ideal per a la manipulació d'imagtes sorl.thumbnail.
Així doncs, el nostre model serà molt senzill, tindrà un identificador per poder distingir les notícies, el titular, el texte de la notícia i com no la imatge.
M'ha queda talment així:
!/usr/bin/env python
# -*- coding: UTF-8 -*-
from django.db import models
from sorl.thumbnail import ImageField
from sorl.thumbnail import get_thumbnail
class NoticiasPortada(models.Model):
"""Base de datos de noticias"""
def get_upload_path(instance, filename):
return "fotos/%s" % filename
identificador = models.IntegerField()
titular = models.CharField(max_length=200)
texto = models.TextField()
thumbnail = ImageField(upload_to=get_upload_path,
blank=True, null=True)
def img(self):
if self.thumbnail:
try:
im = get_thumbnail(self.thumbnail,
'50x50', crop='center', quality=80)
return '<img src="%s">' % im.url
except IOError:
return "error"
else:
return "%s" % self.identificador
img.allow_tags = True
img.short_description = 'img'
def __unicode__(self):
return self.titularCom es pot veure Sorl incorpora una sèrie d'utilitats per a la conversió d'imatges que ens van molt bé. Així podem definir el mètode img dins el model per tal de poder-ne fer referència a l'administrador de d'Django.
Fixem-nos també com li podem passar un mètode per tal de poder calcular a quin lloc es deixarà la imatge. Aquest mètode ha de tenir la signatura nomfuncio(instància, nom) on instància és la instància de l'objecte al qual s'associarà la imatge i el nom és el nom de la imatge en sí. Això és molt útil per poder deixar les imatges a diferents carpetes segons convingui.
A l'admin.py podem fer
from django.contrib import admin
from models import NoticiasPortada
class NoticiasPortadaAdmin(admin.ModelAdmin):
list_display = ('img', 'identificador', 'titular')
search_fields = ('titular', 'texto')
admin.site.register(NoticiasPortada, NoticiasPortadaAdmin)Sorl té opcions per a que al formulari se'ns presenti també la imatge, però per ara ho deixarem així.
La càrrega de les imatges
La càrrega de les imatges la podríem haver fet de moltes maners, però com que ja vaig posar un article de com fer comandes de Django, doncs ho aprofitaré. Crearem una comanda anomenada importar que es podrà cridar com
python manage.py importar
Per això s'ha de crear un paquet Python dins l'aplicació amb l'estructura
app
models.py
management
__init__.py
commands
__init__.py
importar.pySi feis servir django-extensions recordau que hi ha una comanda anomenada create_command que crea directament aquesta estructura.
Per a importar les imatges utilitzarem la classe InMemoryUpladedFile
que es troba a django.core.files.uploadedfile. Podem passar una
instància d'aquesta classe al nostre model dins l'atribut thumbnail i
Django se n'encarregarà de la resta. La complexitat addicional està
en que ens hem de davallar la imatge de la web.
def download_photo(self, img_url, filename, field_name):
img = cStringIO.StringIO()
image_on_web = urllib.urlopen(img_url)
while True:
buf = image_on_web.read(65536)
if len(buf) == 0:
break
img.write(buf)
image_on_web.close()
return InMemoryUploadedFile(file=img,
field_name= field_name, name=filename,
content_type="image/jpeg", size=img.tell(), charset=None)Per davallar-nos la imatge farem servir la llibreria urllib.
Passant-li una url es capaç de llegir-la i donar-nos el contingut. Com
que la memòria de moment no és un requeriment, el que farem serà
deixar el contingut dins un buffer que es comporta a tots els efectes
com un fitxer. Feis una ullada al duck typing per saber com és això possible.
InMemoryUploadedFile espera un fitxer (d'aquí el truc de fer servir StringIO), el nom del fitxer, el content_type, el tamany i el charset, així com el nom del camp.
De fet, però ho podem fer una mica més senzill, ja que no necessitam
el nom del camp. Django té una altra classe que fa el cid més
senzill, és el SimpleUploadedFile de manera que el codi queda un
poc més net:
def download_photo_simple(self, img_url, filename):
img = cStringIO.StringIO()
image_on_web = urllib.urlopen(img_url)
while True:
buf = image_on_web.read(65536)
if len(buf) == 0:
break
img.write(buf)
image_on_web.close()
return SimpleUploadedFile(content=img.getvalue(),
name=filename,
content_type="image/jpeg")Però encara així és molta línea per a tan poca cosa. Em feia ganes provar una llibreria que promet simplificar el procés d'accés als recursos web. La llibreria requests. Teniu en compte que el codi amb urllib encara es complicaria més en una aplicació real, ja que convé controlar les excepcions que hi pot haver. El tema està força ben explicat a l'apunt urllib2 - The Missing Manual, així que no m'estendré més.
L'avantatge de requests és que ens permet abstreure'ns d'aquests
excepcions i tractar únicament amb codis d'estat web. Així el que
ens interessarà és obtenir la imatge si el codi és 200 (tot bé) o
retornar un None si hi ha problemes. Així el codi es simplifica
encara més.
def download_more_simple(self, img_url, filename):
r = requests.get(img_url)
if r.status_code == 200:
return SimpleUploadedFile(content=r.content,
name=filename,
content_type=r.headers.get('content-type'))
else:
return NoneAmb això, crear una instància de NoticiasPortada pot quedar com
noticia = NoticiasPortada(
identificador = id,
texto = texto,
titular = titular,
thumbnail = self.download_more_simple(src, 'thumb-%s.jpg' % id)
)
noticia.save()on id és l'identificador de la notícia i src representa la url de la imatge.
Com ho treim a això? Doncs és una bona pregunta. A la segona part de l'article us ho explico. Fins demà!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Creantbits un 15 de juliol
Escrit per Aaloy a 16 de July , 2011 a les 11 a.m.
Ahir divendres 15 hi hagué una nova edició del creantbits. Aquesta vegada enlloc de que la inscripció es fes en un comentari al blog, ho ferem amb una aplicació creada ad-hoc i que serví per experimentar amb un hosting de Python. El hosting va caure un pic en el procés d'inscripció (després de tot encara està en beta), però la gent d'Eldarion va respondre i en poques hores estava una altra vegada operatiu.
L'aplicació en si crec que ha respost bastant bé, tot i estar feta en quatre potades. Ha permés a la gent que s'havia inscrit prest i després no ha pogut venir, fer-ho saber ràpidament i comunicar-ho al següent de la llista d'espera. Tot d'una que tengui una estona més miraré de documentar l'aplicació (que el codi ja hi està) i posar-ho a bitbucket per tal que si hi ha més gent que s'animi entre tots poguem fer un bon programa de gestió d'events.
De l'event en sí poca cosa a dir, la sala plena d'amics, gent que ja coneixia personalment i gent que he pogut desvirtualitzar per primera vegada. Però la part important és amics, això fa que parlar en públic sigui molt menys estressant i també molt més divertit. Va venir molta gent que fa coses interessants en programari lliure, Python o no, però que té pànic escènic. Encara que ja sabeu no tenc cap problema en parlar de Python hores i hores, també m'agradaria que el Creantbits fos un punt de trobada on els amics s'expliquen tecnologies interessants. Pensau que no xerrau davant un auditori estrany, sinó a un grupet de gent, d'iguals, i allò que per vosaltres pot ser el dia a dia potser sigui una revelació per altra gent. Així que animau-vos, que llevar-se la por escènica és important i res millor que fer-ho entre gent de confiança.
La valoració de les xerrades no seré jo qui les faci, esper que us resultessin interessants. Era la primera xerrada de @morenosan, l'home passava pena per si els nirvis el traïen, però ja vàreu veure que se'n va desfer prou bé. En Juan té moltes coses a dir en el món de la programació i noves tecnologies i esper que ara que ja sap que no passa res, s'animi a preparar-nos altres matèries.
En Bernat també tenia els seus dubtes, al matí va començar a dir que igual si no hi havia temps la conferència de Varnish no era tan important, que a lo millor no calia, ... Però no em vaig deixar convèncer i crec sincerament que va ser una de les exposicions més interessants que hem fet al creantbits.
Ja veis, el que costa més d'un event d'aquest és que la gent perdi la por, però és important fer-ho, perquè personalment estic convençut que en aquesta Illa nostra hi ha molta gent que fa coses molt interessants i que no les valora prou. Contava l'anècdota d'un conegut empresari madrileny que es dedica a fer webs per hotels, anava dient a tort i dret que havien fet un cms que admetia llenguatges no llatins, i això ho deia al 2011, nosaltres mateixos ja havíem fet webs en xinès al 2006, i ja no us cont Juan que estigué 5 anys al Japó. És, però un bon exemple de que potser no li donam la importància que es mereix a fer aquestes coses.
I una altra anècdota de l'event. Ens vàrem deixar els curetes per remenar el sucre. Però potser la millor anècdota de totes va der la de @SebaSj , que ens va dir que no podia venir perquè la filla estava en camí. Hem estat molt contents de saber que n'Helena ha fet gairebé tres kilos i que han passat bona nit. L'enhorabona!
El proper creantbis no sé quan serà. Depèn de la feina i de les ganes de la gent, però al manco ja sabem que n'Antònia està disposta a parlar-nos de Python i càlcul numèric, que potser en Xesc també s'animarà a fer alguna coseta i que en Pau quan aprovi la pràctica, té moltes ganes de parlar de Haskell.
Una abraçada a tots el que vinguéreu i disculpes al que quedàreu fora. L'aforament de la sala és el que és i per ara no tenim un lloc millor. La sala gran de l'auditòrium estareu d'acord amb mi que imposaria massa a l'hora de parlar. La por escènica és molt menor quan tens la gent propera i els oients estan agafant gominolas!
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django APSL
Presuposts petits
Escrit per Aaloy a 06 de July , 2011 a les 8:16 p.m.
Avui m'ha telefonat un client d'un projecte relativament petit que tenim des de fa temps. Volia un pressupost d'una modificació que ha de fer de la web, molt poca feina però encara així vol un pressupost, supòs que més d'un s'haurà trobat en la mateixa situació.
El problema de fer un pressupost per una feina petita és que el cost de fer el pressupost pot superar amb escreix la feina en sí, però a més com que no hi ha pràcticament marge d'error el pressupost si està ben fet implica que t'has d'haver mirat ben bé totes les implicacions i considerar tota la feina que hi pot haver. És a dir, no es sols modificar una funcionalitat, és verificar que funciona, passar-la a pre, validar-la amb l'usuari i passar-la a producció.
Per aquests casos sóc partidari de la borsa d'hores. Tot és més fluid, no és necessari pressupost, i a més crec que és més just, ja que no has de carregar al client la feina de fer el pressupost.
El tema està en on traçar la ratlla, és a dir, quan convé fer un pressupost i quan tirar de borsa d'hores. Quan el client et demana un pressupost normalment és per saber si el cost li compensarà.
El compte és prou senzill, si contam que en durà una mitja d'una hora fer el pressupost (entre parlar amb el client, confirmar que és el que vol, fer la redacció i mirar-ho) i que el treball "petit" típic duu entre 3 i 5 hores, estam parlant que convé tirar de pressupost a partir de feines que pareix que et duran un dia o més. En cas contrari trob que el més just per tothom és tirar de borsa d'hores o "anar a jornal", però fixant un límits, m'explicaré:
En projectes petits a l'hora o dues de fer-hi feina ja veus ben bé l'abast del projecte i el que et durà. Llavors si la feina veus que s'allarga se li ha de dir al client, de manera que sols arrisca aquesta hora o dues i pot decidir amb coneixement.
D'altra manera crec que és menys just, ja que força a endevinar en tasques tan petites on l'estimació es fa pràcticament impossible i podem tenir desviacions de més del 100%.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica General
Redis
Escrit per Aaloy a 26 de June , 2011 a les 10:55 a.m.
Ja fa un grapat de mesos estic fent cosetes amb Redis, una base de dades de les anomenades noSQL, molt semblant en funcionament a Memcached.
Val a dir que a Redis hi vaig arribar a partir de Celery, la utilitat per crear i gestionar tasques per Python i Django. Vaig trobar la combinació Celery més Redis molt bona quan no necessites tota la potència, ni tota la complexitat que et dóna RabbitMQ.
La idea, una vegada hagi finalitzat les proves, és anar substituint Memcached per Redis com a sistema de caché per les aplicacións Django. També hi ha un projecte per fer que les sessions també puguin estar damunt Redis, així que crec que també li tocarà. A més, d'aquesta manera ja tenim una base de dades addicional per fer-la servir quan sigui necessari. Redis ofereix una cosa que Memcached no té, la persistència de la informació.
En el cas de la caché, Redis pot ajudar a solucionar un dels problemes més importants que hi ha quan un fa aplicacions grans, la invalidació de les cachés. Amb memcached la invalidació sovint és un tot o res, és complexa fer que s'eliminini sols una part de la informació si no saps ben bé quines són les claus exactes que s'han fet.
Redis té una velocitat de resposta i suport a la concurrència tan bona o millor que memcached, però a més ens permet fer consultes sobre claus que comencin per algún prefix, o per claus concretes, podem saber quin tems d'expiració té cada clau, veure les claus que hi tenim al sistema, etc.
Això ens dóna tota una nova via per dissenyar el sistema de cachés, on tant l'usuari com el propi sistema poden decidir invalidar la caché en funció de les necessitats de l'aplicació.
Podem eliminar completament el contingut de la base de dades amb una simple comanda, FLUSHDB. Posau-ho per exemple a l'abast de l'administrador de l'aplicació web. Quan fa un canvi important i no vol esperar podem posar-hi aquest link per a que llanci aquesta comanda contra Redis.
Si ho feim servir dins Django podem veure com aquest va generant les claus, així podem decidir millor què invalidam. És a dir, tenim tot el que teníem amb Memcached i un món nou de possibilitats.
A més l'API per Python és molt bona, tant que amb l'iPython i l'API no hi ha pràcticament necessitat d'anar a la pròpia consola de Reids (el redis-cli), per acabar-ho de rematar s'ha millorat molt el parseig de la resposta amb hiredis-py.
En resum, estic gratament sorprès amb aquesta eina i us animo a fer-li una ullada.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Un creant bits d'estiu
Escrit per Aaloy a 17 de June , 2011 a les 8:09 p.m.
Fa just una estoneta he fet l'anunci per Twitter de que ens han confirmat des del Parc Bit que podem disposar de la sala de formacio pel #creantbits el dia 15 de juliol a les 16:00.
Aprofitant que és estiu i fa molta calor, i la gent tampoc està per xerrades molt llargues, hem pensat que estaria bé fer xerrades curtes i d'un bon grapat de temes.
La primera per anar fent boca serà de Python. Una introducció als nousvinguts en aquest llenguatge que serveixi per perdre-li la por. En una horeta es pot veure bastant bé el llenguatge i tenir un idea suficient per poder seguir la resta de xerrades, o al manco per adonar-se de la potència que s'amaga darrera el llenguatges.
Després en @morenosan ens parlarà mitja horeta de South i de les seves possibilitats quan fas desenvolupaments amb Django. South ens permet fer modificacions a la nostra estructura de base de dades, de manera que passar de desenvolupament a preproducció i després a producció sigui poc traumàtic, de fet per a que sigui gairebé automàtic. Per la gent que no ha fet servir mai una eina com aquesta segur que serà una revel·lació.
Mirarem que @bercab perdi la por escènica i ens faci una introducció a Varnish. Un sistema de caché del més potent que hi ha i que ben duit ens permet aguantar una quantitat ingent de visites. Estam parlant de 15.000 o més peticions per segon en servidors de gama baixa. Com tot sistema té avantatges i inconvenients. No es tractarà de dir com muntar Varnish, sinó de que la gent que ho vulgui montar per les seves webs tengui sàpiga amb què juga.
Com heu pogut veure en alguns apunts m'agrada molt Celery, així que m'haureu d'aguantar un poc presentant-vos aquesta llibreria. Parlaré de quan i com es pot fer servir, de diferents configuracions que es poden emprar i d'escalabilitat.
Estam mirant de tancar una altra ponència, això de parlar en públic, encara que sigui entre amics pareix que imposa bastant. Ja veurem, si no un poc de trobada social que tampoc no està malament.
No es tracta de fer un curs o una classe magistral, es tracta de perdre la por a la tecnologia, de veure llibreries i programes que potser us sonaran i potser no, però sobretot es tracta de conèixer-nos i trobar-nos de tant en tant.
I ja sabeu que si algú està interessat en preparar-se un tema, doncs a aquesta mateixa trobada o per la propera. Quan més rotació hi pugui haver en les presentacions millor, que si no sempre parlam els mateixos, i no em queix, el que és complicat és aturar-me una vegada he començat a xerrar. :-P
En aquesta ocasió i aprofitant l'entorn de Gondor, he creat una petita aplicació per les inscripcions, està en beta i serà la primera prova baix foc real que es fa.
Inscripcions: http://creantbits.com
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django
Avaluant Gondor
Escrit per Aaloy a 15 de June , 2011 a les 9:08 p.m.
Estic a la segona tongada de beta-testers de Gondor un hosting per Django montat al núvol desenvolupat per la gent d'Eldarion.
L'aplicació vol simplificar la manera de desplegar les aplicacions Django a força de forçar una determinada configuració. És a dir, es simplifica el desplegament, però sempre que juguem amb les cartes que ens donen, que he de dir que no són dolentes.
La posada en marxa és senzilla, el programa que fa la interacció amb Gondor (una vegada t'has donat d'alta a la web) és un paquet que està al PyPi, així que és sols cosa de pip install gondor i gairebé ja pots començar a fer-hi feina.
Per provar he fet servir un codi que ja tenia mig fet i que ara s'ha convertit en la web d'inscripcions de creantbits. La conversió d'una aplicació tal com la desplegam a APSL habitualment a una aplicació capaç de ser desplegada amb Gondor és prou senzilla, i està ben explicada a la documentació. Si més no però, convé fer uns petits avisos per si algú també s'hi troba:
-
El teu projecte ha de ser gestionat per Git o Mercurial. Tant fa si no hi ha un repositori remot, però s'ha de tenir en compte que el desplegament es fa damunt una versió commitada del codi.
-
S'ha de crear una carpeta anomenada
requirementson hi hagi un arxiu anomenatrequirements.txtamb els requeriments de l'aplicació amb un fortat llegible perpip. No s'hi valen paquets que s'hagin de compilar llevat de lxml i PIL, la connexió a BD, Postgres per més senyes ja ens la donen ells. -
S'ha de crear una carpeta
deployamb la connexió WSGI. S'ha d'anar alerta amb els paths. En el meu cas no m'agrada tenir dependències del nom del projecte a les aplicacions ni a les urls, així que he modificat el WSGI (per cert, sabeu que es llegeix com a Whisky?). -
Alerta amb els STATIC_URL i MEDIA_URL Gondor he comprovat que dóna menys problemes si es fan servir les convencios d'static files, així que una adaptació que s'ha de fer a les aplicacions és substituir a les plantilles els MEDIA_URL per STATIC_URL (i configura el settings) i posar el contingut estàtic lligat a una aplicació per a que funcioni el
collectstatic.
Amb això i amb un parell (dues o tres) de proves la primera versió de l'aplicació ja funcionava, els que em seguiu per Twitter ja ho haureu notat, ja que he estat donat la murga amb això els darrers dies.
Gondor desplega l'aplicació creant un tar.gz del master del nostre repositori (el tip en terminologia Mercurial) i l'envia al seus servidors. Allà es desplega, es creea un virtualenv, s'instal·len les dependències i es crea la BD o es migra si és una actualització.
Això fa que el procés d'actualització, fins i tot per una modificació a una plantilla sigui un tant lent, ja que les velocitats de pujada de les ADSL són de vergonya. Estic mal acostumat als servidors dedicats que tenim, bé directament o amb fabric les actualitzacions ens duen segons. Està clar que la gent de Gondor ha tingut que arribar a un compromís entre velocitat de desplegament i estabilitat de l'entorn. Els vaig fer arribar aquesta "queixa" i em contestaren que estan treballant en un mètode diferencial per fer les actualitzacions, la qual cosa pareix que pot millorar molt el conjunt.
Encara no tenen a l'abast Celery, el sistema de cues, que és força important ja que no es té accés al cron del servidor i sovint són necessàries tasques periòdiques, com per exemple per netejar les sessions caducades.
Llevat d'això, la plataforma per ara és molt estable, quan hi ha errors les missatges se t'envien a la pròpia consola i quan fas l'actualització surt una plana 503 ben informativa.
Quan feia les proves vaig enviar uns quants missatges per aclarir conceptes o suggerir millores i em contestaren ràpidament, ja mitjançant e-mail o pel Twitter d'Eldarion.
Encar no sé el cost de la plataforma, ni les funcionalitats que tindrà en el futur. Però les impressions inicials són bones. Per molts dels projectes que feim Gondor no és una alternativa, però per projectes tipus la web del creantbits i semblants va prou bé.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Una setmana interessant
Escrit per Aaloy a 05 de June , 2011 a les 10:23 a.m.
Aquesta ha estat una setmana interessant de viure amb molts aspectes. És en setmanes com aquesta en que es justifica la decisió de fer-se autònom i muntar empresa pròpia. Tot i els riscs, els nirvis i l'estres, aquests tipus de coses difícilment passen si fas feina per un altre.
La primera notícia positiva va arribar dilluns, un client amb el que estam negociant refer-li la web ens amplia el projecte. Per mi és positiu surti el projecte o no, ja que implica que si es fa es podrà fer una feina molt més acurada i amb més possibilitats d'integració. Quan vàrem presentar el primer pressupost quedava coixa la part que ara ens han demanat ampliar, ja que quedava fora de l'àmbit del pressupost. Pareix que el client s'ho ha repensat i ho facem nosaltres o no, el projecte serà molt més complet i per tant amb moltes més possibilitats d'èxit en el que fa a retorn de la inversió.
El dimecres al matí em crida Ricardo que era pel Parc Bit amb Martin Varsavsky i si no em feia res acompanyar-los a fer una volta pel Parc. D'aquí en Varsavsky en va fer un apunt amb vídeo i fotografies. Se'm fa estrany veure'm a un vídeo, però la veritat és que em va agradar conèixer personalment a Varsavsky i poder conversar amb Ricardo, que ja feia estona que no parlàvem.
El dimecres mateix deixàrem pràcticament llesta per a producció una nova característica per Globalbooking, en Rafa, qui està al davant del projecte sempre té moltes iniciatives, i és molt divertit poder-les fer realitat.
El dijous reunió amb la gent de Fiesta, anam per feina i són reunions productives, però també ens ho passam molt bé fent feina plegats. Amb reunions així te n'adones del temps que has perdut en altres reunions o mai s'aclaria res, amb gent que entrava i sortia, sovint enlloc d'una reunió pareixia l'squetch dels Marx. És el meu ideal de reunió: bona connexió amb el client, que ja s'ha convertit en amic, decisions preses i a més fas unes bones rialles.
El dijous mateix m'arriba la nova jugueta un Kindle DX. Al final he caigut! M'he esperat a poder-me permetre l'ebook gran, el sistema operatiu que duu pareix que és un poc més antic que els models petits, però jo el vull per poder llegir còmodament pdf en format A4 fense tenir-ne que fer cap conversió. Va fantàstic per això, poses el pdf i a llegir. Encara no he comanat cap llibre, encara en tenc un grapat en paper pendents de llegir, però sí que hi he posat la documentació tècnica que tenc en pdf i fa molt bon llegir.
El divendres capvespre toca sessió de teambuilding, o millor dit d'oficina building. Després de dinar ens posam els quatre a muntar les estanteries d'Ikea que havíem comprat el divendres anterior. En @morenosan diu que "la empresa que monta muebles unida permanece unida". Els mobles queden muntats en poques hores, i per fi podem posar la planteta que tenim a un lloc elevat. La cafetera canvia de lloc, ara és fins i tot més còmode fer-se un cafè.
Per acabar la setmana en Benjamí em convida a la ràdio per parlar de l'empresa i del que feim amb programari lliure. Ja hi ha el podcast penjat a la web, al manco fins que el nou Govern no decideixi tancar-la (què ja heu signat contra el tancament?). A l'estudi ha una munió de gent i en alguns moments és un poc caòtic, però va ser força divertit. Una manera diferent de passar el dissabte capvespre. Però no acabà la cosa aquí, en tornar de la ràdio partim cap a Alaró, que hi ha ball de bot em diu la dona i cap allà anam. De ball de bot encara en sé molt poquet, amb els boleros em defens però les jotes i mateixes encara em superen. Amb les jotes tenc un problema afegit: al la tercera o quarta volta acab ben marejat.
A veure com acabarà la setmana!
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Informàtica APSL
Eleccions 2011
Escrit per Aaloy a 26 de May , 2011 a les 9:19 p.m.
El dimumenge em va tocar estar de president a una Mesa electoral de Binissalem. En altres eleccions havia estat d'apoderat en alguna taula, però eren poques hores. Estar de president implica estar en dança des de les 8 del matí fins que s'acaba el recompte i s'han entregat les actes.
Molts ho consideren una putada, però particularment, i encara que el dilluns no servia per res, ja que vàrem acabar prop de la una i mitja del vespre i sense sopar, vaig poder veure de primera ma el desenvolupament complet del procés electoral. És una experiència que trob enriquidora, tot i que l'organització de la intendència va deixar molt a dessitjar.
La Mesa estava situada a un pati cobert de l'escola. Al mateix recinte hi havia dues meses més, amb la qual cosa sovint era complicat sentir-se els propis pensaments. Ja a partir de les dues del migdia feia molta calor, i no hi havia gens d'aigua per beure. Afortunadament un dels apoderats, no sé si del PP o del PSOE (la gent de la Mesa se suposa que no ens podem moure gaire), va dur una botella d'aigua de litre i mig i en va repartir.
Si em toca una altra vegada ja us dic jo que hi haurà un parell de coses que no faltaran: una gelera amb aigua i sucs, menjar, una grapadora i un fulls quadriculats.
La jornada es va desenvolupar amb molt normalitat. Binissalem és un poble on hi ha molta participació, i la nostra mesa em sembla que tenia un dels cens més grans, més de 700 persones a les locals. Va estar arribant gent des de que s'obrí la votació fins que es tancà. Sols hi va haver una pausa d'uns 15 minuts als voltants de les dues, però llevat d'això va ser un degoteig continuo de gent.
Enguany es permetia als electors depositar ells mateixos la papereta dins l'urna, crec que això és una bona cosa, fa més partícep la gent del procés, però també és una feina extra per la gent de la Mesa. S'ha d'assegurar molt bé que sols es posa una papereta (sí, hi ha gent que ho intenta de tant en tant), i a més que es posi la papereta en la seva urna corresponent. Això és menys crític, de fet em vaig despistar un moment, ja al final de la jornada, i encara em posaren una papereta de les eleccions locals dins una urna del Parlamente, però això és bo d'arreglar: al començament del recompte es posà la papereta dins l'urna correcta, barrejarem els vots i tot arreglat!
El procés de recompte és la part més crítica, s'ha de procurar que tot quadri, i això vol dir que els vots s'han de cantar bé, i a més que s'han de comptar bé. Al vocal que duia el recompte li vaig dir que ho fes seguin el mètode dels quadrets, ja sabeu, es fa un quadrat i es tatxa en comptar cinc, d'aquesta manera tot resulta molt més senzill. Encara hi ha gent que posa una ratlla per cada vot i això fa que després tenir que comptar els vots es convertesqui en una pesadilla. Això, i el tenir molt clar el punt de partida, que hauría de ser la quantitat de votants que hi ha comptabilitzats. Si tothom està d'acord amb el nombre de votants tot és molt més senzill, ja que si s'espera quan ja s'ha fet el recompte un es pot trobar amb discrepàncies quan ja hi ha nirvis per poder donar resultats.
No hi va haver problemes. Tot va quadrar a la primera, i tenc que agrarïr la gran col·laboració que hi va haver per part dels apoderats de tots els partits: PSM, PSOE i PP que hi havia presents al recompte. Tothom anava per feina i així és molt bo de fer que tot vagi rodat. Tot i això eren prop de la una i mitja quan vaig arribar a casa, fi fa no fa, en tot el dia havia pogut seure uns minses 15 minuts.
Vaig poder veure com la gent sap perfectament que vota. A Binissalem teníem molt clar que no volíen el PSOE, ni la candidatura local ni a la resta. Hi va haver molts missatges en contra de la candidatura local que es traduïren en vots nuls i també va passar quelcom semblant en les eleccions autonòmiques. Crec sincerament que aquestes eleccions les ha perdudes el PSOE, potser no per mèrits propis, és veritat. La crisi no ha ajudat gens, però convindreu amb mi que els seus col·legues a Madrid ho han posat molt fàcil al PP. Potser ara es queixin donant les culpes a uns o als altres, que les eleccions s'han fet en clau estatal i no en clau autonòmica. És veritat, la gent ha castigat al PSOE i s'ha mantingut fidel tant al PP com al PSM que repeteixen o superen resultats passats.
El que no pot fer el PSOE és queixar-se de que a les eleccions el desgast del govern els ha perjudicat,ja que quan els afavoreix bé que callen. Curiosament a les locals el PSOE es presentava com a "de les illes Balears", però a les autonòmices ho feia amb tota la càrrega "obrero española", per mi, i supòs que per molts votants això vol dir identificant-se amb la politica duita pel Govern central. Política, que, per cert, mai no han rebutjat, no record cap vegada que el PSIB s'hagi desmarcat de la disciplina de vot per defensar els interessos de les illes. Tampoc ho record del PP, és veritat, però ara no són ells qui es lamenten de la derrota.
El que em preocupa és aquesta desfeta, que com dic és per mèrits propis d'uns i altres. Si el PP hagués gestionat la crisi les tornes s'haguéssin girat, n'estic gairebé segur. El preocupant és la "carrera d'armament" en que s'ha embarcat la classe política majoritària. No hi ha seny, es fan promeses popupulistes quan es sap perfectament que no es podran cumplir, o que va contra tota lògica econòmica. Polítiques com la del txec nadó, o els famosos 400 € del PSOE, o les subvencions milionàries promeses pel PP. No té sentit, hem arribat a un punt en que s'han de fer aquests coses perquè l'altra també les fa. En temes d'urbanisme s'ha de mirar a un altra banda perquè sinó els votants se n'aniràn cap a qui els prometi que hi haurà màniga ampla. Supòs que molts se n'andonaran que tot això no ens duu més que a malbaratar recursos, territori i a cremar el personal.
El dia de reflexió d'abans d'unes eleccions hauria de anar dirigit no als electors sinó als polítics i fer-se molt abans de presentar les campanyes. Hi ha una crisi de la que costarà sortir, la postura fàcil és la demagogia, distreure el personal amb eleccions de centre que no es podran fer o obrir el tema lingüístic en el que sempre hi ha hagut un gran consens, amb promeses de xecs que després s'han de retirar, amb subvencions que després s'han de tornar a força d'augmentar l'IVA i reduir sous. Inversions per sortir a la foto que s'han de subvencionar NO pagant als proveïdors o pangant-los tard i malament.
Sé que no hi ha respostes fàcils a problemes complexos, però el que el ciutadans hauríem de demanar és seny als nostres poĺítics i sentit d'estat. Però per a que això passi, la pròpia classe política ha de canviar, ha d'abandonar la carrera d'armament que no ens duu a cap banda (o que ens ha duit allà on som) i posar-se a fer feina per reconduir la situació, sense fer electoralisme, sense malbaratar recursos, sense estirar més el braç que la màniga.
Els votants en tenim també la culpa i si seguim així no podem per més que esperar que la propera crisi que segur que vindrà serà més dura que aquesta.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: General
Així com voleu que sortiguem de la crisi
Escrit per Aaloy a 19 de May , 2011 a les 9:03 p.m.
En altres apunts ja he posat damunt la taula l'estat de les passarel·les de pagament que tenim per aquestes contrades, amb una estètica i funcionalita dels anys 80 i amb una documentació que no s'ha actualitzat des del temps del Windows NT.
Avui un possible client ens ha demanat poder cobrar al client per plaços a partir de la seva tarja. Clar això significa quedar-se la tarja del client o bé que sigui el propi sistema de pagament que guardi la tarja i que després s'hi pugui poder tornar a accedir de manera segura. Després de tot el client ha vist com hi ha agències online que ho fan, o com Amazon es queda la teva tarja de manera que no l'has de tornar a picar, tot molt lluny de les funestes pantalles de la majoria de TPVs.
En aquests moments a APSL en trobam integrant un TPV virtual italià. La documentació està en anglès i està actualitzada, però el millor de tot és que per tenir un compte de test i tenir accés a la documentació no hem de ser clients del banc. El banc italià dóna totes les facilitats del món per a que montis una passarel·la de comerç electrònic amb ell.
Per què ho dic a això? Doncs perquè se m'ha acudit demanar a Sermepa a veure si això que demanava es pot fer, i en tot cas quins sistemes tenen a part de la típica pantalla. A TUI m'havia pogut integrar amb el seu web service, no sense moltes dificultats i un munté de proves donat que la documentació fa 4 ó 5 anys encara era molt pitjor que l'actual. Així que ingenu de mi he pensat que tal volta la cosa hauria millorat i potser hi havia un web service més potent que pogués donar la solució que cercava el meu client, o al manco quelcom adaptable.
El primer intent ha estat contactar amb el servei de suport de sermepa, soportevirtual en diuen ells. És una gent que es caracteritza per donar-te les respostes el més críptic possible, no sigui cosa que et facilitin la vida i després facis servir el sistema per fer negocis, sols faltaria! Doncs això, els exposo el problema, i la seva contesta és que com que no havia posat un nombre de comerç vàlid i per raons de seguretat (mande???!) no me poden contestar, literalment
Para poder responder su consulta es preciso que nos envie el código de comercio (FUC) y el código de terminal. Entretanto y por motivos de seguridad no nos es posible responder su consulta
Seguretat, quina seguretat, no estic demanant ni tan sols un compte de proves, sols una informació del que tenen o no tenen. Segon intent, m'identific com algú que ha fet amb ells vàries integracions, i els envio el nombre de comerç de la darrera integració fet, però dient-los que el que tenc és un dubte, i que si no són ells la via adequada, per favor em diguin qui. Doncs no, la mateixa resposta.
Bé, els de soport no es guanyarant el premi a l'atenció al client, no, però tal volta el departament comercial ... Vaig a la plana de Sermpea a veure si puc trobar alguna cosa, i finalment he donat amb una adreça comercial. Els hi expos el problema, que estic cercant una solució de pagament online per un client, i que a veure què tenen. La resposta:
Cualquier consulta relacionada con la aceptación de tarjetas como medio de pago deberá ser dirigida a la entidad financiera con la que el establecimiento haya contratado el servicio.
Que potser no m'heu entès, que no he contractat cap servei! Que el que vull és saber si teniu res que em convengui per contractar-ho. Els torn a enviar un e-mail dient tot això, en bon castellà i amb bones paraules. La resposta:
las condiciones de la forma de operar se fijan en el contrato que firma el comercio con la entidad financiera, por lo que como le hemos indicado debe ser el comercio el que hable con la oficina de la entidad financiera con la que tenga contratado o desee contratar el servicio.
Aquí ja m'ha semblat que o bé no saben llegir, o be se n'enfoten de tu, tan difícil és donar informació?
Ja no he pogut més:
Gracias por la respuesta, pero como comprenderán no me sirve de nada. No entiendo el porqué tenemos tantas dificultades, actualmente nos estamos integrando con una pasarela de pago italiana y para tener una cuenta de desarrollador sólo hace falta pedirla. Paypal lo mismo, sin embargo quiero operar con una entidad local y todo son problemas. No lo puedo entender. Sólo estoy pidiendo información o que me pasen con algún responsable técnico que conozca la plataforma, pero veo que es misión imposible. Luego nos quejaremos que las cosas van como van...
Amb aquesta actitud ja me direu com sortirem de la crisi. Encara que vulguis invertir en tecnologia i t'arrisquis posar un negoci a la xarxa te trobes amb aquetes fetes. Ara ja me direu com li explic al client que el que vol fer es podria fer si fos a un país distint d'aquest.
Indignat! No podeu imaginar l'identificat que em sent en aquests moments amb els moviments de protesta del 15M. Els bancs fal el que volen, però és també perquè els polítics els ho permeten.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Geany, editor per a programació
Escrit per Aaloy a 25 de April , 2011 a les 12:23 p.m.
Aquestes festes he estat mirant-me l'editor Geany per veure com responia a les meves necessitats de tenir un editor per a programació fonamentalment Python i Django que fos a la vegada potent i que tingués baixos consums de memòria.
En un editor per a programació crec que és important seguir el principi de Pareto o regla del 80-20, és a dir, vull un editor que amb el 20% de comun de recursos tengui el 80% de les funcionalitats d'un IDE com Eclipse+Pydev o PyCharm per exemple.
Avui en dia el meu editor de capçalera és Vim/Gvim totalment personalitzat amb la configuració que podeu trobar a trespams-vim, crec que és una bona configuració, però tot i la potència de Vim tanmateix no faig servir ni un 20% de les possibilitats que m'ofereix l'editor. El que sí que crec que és important és dominar-lo, ja que de tant en tant convé editar via ssh i saber fer anar vim amb condicions és un avantatge.
La cosa doncs és que vaig decidir donar una altra ullada a Geany, ja que vaig veure a la web que havien llançat una nova versió, la 0.2 més moderna que la que tenia ja instal·lada a Ubuntu. Una cosa que a mi en va molt bé és el ressaltat de plantilles per Django (cosa que Gvim té), així que per a ser justs, el primer que vaig fer va ser mirar si Geany també ho tenia: requereix una mica de configuració, però sí, us explic:
Cercant per Google vaig arribar a la plana de drevans, on explica com podem activar el ressaltat, és prou senzill, basta fer
cp /usr/share/geany/filetypes.html ~/.config/geany/filedefs/
editar l'arxiu que acabam de copiar i cercar la secció lexer_properties i afegir
lexer.html.django=1
Amb això ja tenim colorejat per la sintaxi de plantilles Django. Una cosa ja feta.
Superat el primer obstacle ja sols és cosa de veure quin conjunt de característiques té Geany comparat amb altres editors o IDEs i quines no té, i el grau d'importància relativa que tenen per mi. Deix de banda coses que podem donar per pressuposades a un editor modern: ressaltat de sintaxi per múltiples llenguatges (fonamental ressaltat de javascript dins html) i edició de múltiples documents.
-
Gestió de projectes. És una característica que classificaria com a important. Estalvia molt de temps que l'entorn et situi directament al directori i mantengui la llista dels darrers arxius que es van obrir al projecte.
-
Treball amb UTF-8 i format Unix. La nostra configuració de feina per defecte és UTF-8, quatre espais per tabular i salts de línia en format Unix. Si ja no té això no me mir l'editor, així que és una característica obligatòria.
-
Autocompletat. Realment no necessit que tengui un autocompletat de llibreries (al cap i a la fi Python no és Java) però si ho té millor, i sobretot el que va molt bé és tenir un autocompletat basat en que un ja ha escrit en el document, ja que evita molts errors tipogràfics.
-
Reasaltat de sintaxi per HTML i Javascript dins el mateix document El ressaltat de sintaxi va molt bé a l'hora de programar, pots detectar errors sols pel colorejat de l'editor, per això és important que a l'hora d'editar HTML on cada cop és més comú que hi pugui haver javascript, el ressaltat sigui prou inteligent per detectar que estic a la part javascript del codi i adapti també el ressaltat.
-
Integració amb un comprovador de sintaxi per Python com pylint o pyflakes i pep8. Es pot fer la comprovació per línia de comandaments, però és interessant no tenir que sortir de l'entorn. És doncs una característica interessant però no fonamental.
-
Parseig de símblos Va molt bé que un editor per a programació sigui capaç de parsejar el codi font i et mostri les classes i funcions que tens definides dins el document, estalvia molta feina a l'hora de navegar pel codi o trobar el que t'interessa. No és una característica fonamental, però pot ajudar a decidir.
-
Maneig de bookmarks Cada cop faig servir més aquesta característica a Vim ja que em permet navegar ràpdament entre distintes seccions del codi. No és fonamental però també molt convenient.
-
Cerca potent De les millors que he vist són les d'Eclipse i Netbeans que et permeten cercar per tot el projecte.
-
Baix consum de recursos. Per mi és important poder fer servir l'editor en qualsevol dels equips que tinc. Fer feina sempre amb el mateix editor fa que a poc a poc un s'ho vaig fent seu i n'aprofiti millor les funcionalitats. Si triam un editor gràfic hem de tenir en compte que a més convindrà dominar un poc les quatre coses d'un editor en moda consola com Vim. Si l'entorn consumeix molts recursos ens podem trobar que no hi hagi prou memòria per engegar altres aplicacions que necessitam, sobretot en equips més vells. Vaig deixar de fer servir Eclipse i després Netbeans per aquest motiu. Per fer modificacions xorres necessitava esperar gairebé un minut per posar tot l'entorn en marxa. Netbeans a més ha deixat de suportar Python, així que ho he descartat tot i les darrers millores.
-
Integració amb control de versions Interessant però com en el cas del comprovador de sintaxi o precompilador és quelcom que sovint és més ràpid fer per línia de comandaments.
La resta de característiques que pot tenir un IDE poden estar molt bé i potser un les fa servir un cop o dos al llarg d'un projecte, però per mi i amb el tipus de projectes que feim, crec que no compensen el tenir que carregar amb un entorn feixuc.
Geany compleix amb gairebé totes les funcionalitats que he exposat aquí, fins i tot l'autocompletat va un poc més enllà i es capaç d'autocompletar a partir de les llibreries Python. La integració amb Pyflakes y Pep8 es pot fer i els missatges d'error o avís apareixen a la finestra de missatges. Tot i això he de dir que li faltaria ponder
fer clic damunt un missatge d'error i anar directament a la línia, per això s'ha de configurar un poc, anirem a la secció Munta i a on diu "Error regular expression" posarem (.+):([0-9]+):[0-9]+ això ens servirà tant per pyflakes com per pep8, de fent a la meva configuració actual tinc com a compilador pyflakes "%f" associa a la tecla F8 i associat a F9 pep8 "%f" per saber si es compleixen les convencions de codi.
El que he trobat molt úlil a Geany és que té una secció on pots veure tots els documents que tens oberts classificats en la carpeta on es troben. Quan fas feina amb Django on tots els models són models.py et permet navegar ràpidament pels arxius que tens oberts.
Genay també ve amb un conjunt de plugins per estendre la funcionalitat de l'editor. El més interessant que he trobat és un formatejador d'XML, ja que m'estalvia tenir que fer servir un altre programa i realment no carrega gens l'editor.
Geany té també la possibilitat de definir plantilles de codi, com entorns molt més grans i que és una de les característiques que m'agraden més de Vim. D'entrada el conjunt de plantilles que duu per defecte són molt poques, però és molt bo de fer crear-ne més.
En conclusió, Geany és un editor potent, senzill de fer anar i amb un consum de recursos de màquina realment petits. Me pareix que serà el meu proper editor de capçalera.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Celery, Redis and Django
Escrit per Aaloy a 03 de April , 2011 a les 9:46 p.m.
Disclaimer: This is my first English post is a free translation of the original catalan post
In previous posts have written about Celery and Django Celery, a system to manage queues and tasks in Python and Django.
Celery in its documentation recommends RabbitMQ as message broker, that is, as the application that receives and distributes the tasks that the application sends between the different workers we have configured in our system.
Once the worker has done the task it leaves the result (if we have configured to do it) to the results backend, usually it is the same one as the message broker, that is RabbitMQ acts as a message broker and as a result backend.
The architecture of Celery is very powerful in the sense it allows us to scale up and down and replace the parts we need to configure the application to our needs. So we could have applications that needs some sort of message or task distribution, but they don't need to deal with the complexity nor the system requirements of RabbitMQ. With Celery we can even use a database as a message broker where could save the results, we can replace the serialization routines, the results storage. So, although in the documentations we have a prefered configuration we can change it the needs of our application.
In this post I'll try to present is a configuration that fits in the middle of the complexity of a RabbitMQ solution but enough powerful to fit most application needs.
What's the problem we'll try to solve?
We have an application that we want to run in an small server or in a shared server that needs some sort os distributed tasks or periodic task than we want to manage inside the application itself. We would like:
- Minimum complexity to install and configure the task system.
- We'd like not to have a dedicated broker.
- We'd like to monitor what's happening in our application
- We'd like to manage our system easily.
- We'd like to debug our application and run everything on a local server before run the application using a distributed task configuration.
- We'd like our task broker could have very low memory requirements
We can imagine lots of scenarios in what that requirements would fit, a news aggregation, an e-comerce application that needs to send the invoices, an small document management system that makes some sort of format translation. That is, systems that need a small response time to the user and that could make the heavy task in an asynchronous way, where the reliability of the tasks system is not critical for the application
For that kind of applications Celery with RabbitMQ is overkill, so we're going to diet it a bit
The broker
We want the distribution of tasks to be powerful and flexible, but without the complexity of RabbitMQ. So what will be do is install Redis , a NoSQL a database that works in a similar way memcached does.
Redis is very fast and comsumes few machine resources, allows the persistence of periodic data and the application is generic enough to be used in our applications in addition to task management. A [presentation by Simon Wilson] (http://simonwillison.net/static/2010/redis-tutorial/) summarizes very well the possibilities of this database.
Redis has, however, and important requirement that we must know: in its standard configuration requires that all data has to fit in memory and that periodically synchroniZes the changes to disk. So we must monitor our application to be sure that Redis does not grow without notice consuming all the available memory.
Installing Redis
Readis is present in major Linux distribution, and in Debian based distros is enough to type
sudo apt-get install redis-server
as we're going to use Redis in Celery we must install also the Python API
pip install redis
inside our virtualenv (I suppose everybody is using virtualenv ...)
In a brand new installation in a Ubuntu 10.10 redis consumes 3271B of virtual memory and 1516B of resident memory in a single process.
In a production environment for sure we would like to configure some parameters:
- bind, to link the redis instance to an IP
- loglevel is verbose in the default configuration, in production notice or warning would be enough.
The configuration file for redis is in /etc/redis/redis.conf in the Ubuntu, is extensively documented to allow us to adapt it to our needs.
The results storage
As mentioned Celery also allows us to define where to store our data. Redis is a general purpose database, so in addition to the tasks broker we can use it to save the results of the tasks. As pointed before, we have to monotor Redis if we plan to store lot of data o if we store big results. Redis mantains all the database in memory.
Usually in a task/queue system we want to keep the results a just the time enought to see that everything is going well and then we don't need the results anymore.. That is, the results do not necessarily have to remain in the database, the amount of time we need to keep the results in the database would greatly depend on our application.
Let me explai myself. We use Celery in a B2C application to update the information we have about the hotels. We launch the update information periodicaly to update a the information and each task is able to run another taks. Once the information is received the information is processed. So the results just needs to be in the database the time that a worker needs to process it, after that we can delete it. As the process is quite fast is much simpler to make the results expire in 60 seconds than to write the code to delete it.
If we're need to create a task to send an invoice we do not need to save the invoice in Redis, we just need to update our database to mark the invoice as sent once the worker has finished the pdf generation and the mail is sent.
So if we want to mantain our low memory requirements we have to tune our application to not store a lot of information in the Redis database.
Using Redis as a broker and as a database makes us to reach our objective of reusing the technology, but we can use Redis as a cache backend for Django and to [store sessions]((https://bitbucket.org/dpaccoud/django-redis-sessions/src).
Our settings.py
First at all in our INSTALLED_APPLICATIONS we have to add djcelery and now we have to configure Redis as a broker and database backend.
BROKER_HOST = "192.168.1.33" BROKER_BACKEND="redis" REDIS_PORT=6379 REDIS_HOST = "192.168.1.33" BROKER_USER = "" BROKER_PASSWORD ="" BROKER_VHOST = "0" REDIS_DB = 0 REDIS_CONNECT_RETRY = True CELERY_SEND_EVENTS=True CELERY_RESULT_BACKEND='redis' CELERY_TASK_RESULT_EXPIRES = 10 CELERYBEAT_SCHEDULER="djcelery.schedulers.DatabaseScheduler" import djcelery djcelery.setup_loader()
192.168.1.2 is the virtual image in which I have installed a fresh Ubuntu and that runs Redis, as in this post I'd like to emulate a simple production environment with two servers. As you can see I have no password protection and Redis runs in its default port.
Note that on BROKER_VHOST we have to configure the database Redis will use for the broker system. It can be the same one as the REDIS_DB but we could choose to have the results and the task communication in different databases. CELERYBEAT_SCHEDULER CELERY_TASK_RESULT_EXPIRES is just 10 seconds, time enough for our purposes. CELERYBEAT_SCHEDULER is configured to allow us to create periodic task from our Django application. As this needs new database tables, we would need to run syncdb to create the tables that the scheduler needs.
Development mode
On development on of the first goals is to be sure everything works properly, so we don't need the noise that the broker and storage puts on our development process. Celery has a special configuration
CELERY_ALWAYS_EAGER=True
so our application would not use nor the worker neither the broker and is executed as a common application, just invokes the task in a synchronous way.
Lets start the workers
When you start with Celery it's important to have a global vision about what's happening in our application. I have found that terminator is a good tool to run our console commands, splitting our terminals in order to see what's happening.
So lets open a console in our application environment and run
python manage.py celeryd -E -B --loglevel=INFO -n w1.d820
This will run a worker, configured to run the default number of processors, which depends on the number of CPUs available on our server. We have configured the worker to send monitoring signals (-S) and to run an additional process to deal with the periodic tasks (-B).
It's important to remark that just one worker can have the -B parameter, so perhaps is better to make this fact more visible and run the periodic task process using a dedicated command
python manage.py celerybeat --loglevel=INFO
Running celerybeat as a standalone process it will inform us about its configuration
[2011-04-03 11:16:46,808: WARNING/MainProcess] celerybeat v2.2.5 is starting.
[2011-04-03 11:16:46,863: WARNING/MainProcess] __ - ... __ - _
Configuration ->
. broker -> redis://@192.168.1.33:6379/0
. loader -> djcelery.loaders.DjangoLoader
. scheduler -> djcelery.schedulers.DatabaseSchedulerAs we want to monitor the tasks and have more than just one worker is important to name them. This can be done with the -n parameter. I like to add the worker number and the server name. In the example the name of my laptop.
Run a second worker is as easy as:
python manage.py celeryd -E --loglevel=INFO -n w2.d820 -------------- celery@w2.d820 v2.2.5 ---- **** ----- --- * *** * -- [Configuration] -- * - **** --- . broker: redis://@192.168.1.33:6379/0 - ** ---------- . loader: djcelery.loaders.DjangoLoader - ** ---------- . logfile: [stderr]@WARNING - ** ---------- . concurrency: 2 - ** ---------- . events: ON - *** --- * --- . beat: OFF -- ******* ---- --- ***** ----- [Queues] -------------- . celery: exchange:celery (direct) binding:celery
As we can see we have not add the -B parameter and Celery informs us that the beat process is off.
We can increase or decrease the number of default processes that the worker is going to star with the --concurrency parameter. The final number is a matter to test and see.
python manage.py celeryd -E --concurrency=10 -n w3.d820
Monitoring: what's happening in my application?
If we have added logs on our applications in each worker we can check and see the output, but perhaps we have no logs o our workers could be distributed in different servers. Celery provides us with some monitoring that are nice to know. To use such tools the first step is to start the monitoring service:
python manage.py celerymon
celerymon 2.2.5 is starting.
Configuration ->
. broker -> redis://@192.168.1.33:6379/0
. webserver -> http://localhost:8989
celerymon has started.As we can see Celery has started a server on port 8989. We can connect to that server and see the registered workers and tasks. It's some sort of raw information but it could be enough
[{"heartbeats": [1301824037.784225],"hostname": "w1.d820"},
{"heartbeats": [1301824018.90294], "hostname": "w2.d820"}]As we have configured the DatabaseScheduler we could see the tasks in the Django application itself, but there is another tool on colole mode that give us nearly realtime information, the celeryev
With python manage.py celeryev we will start an console application that will show us what tasks are being processed, we can see the result of each tasks and even revoke a task. If we want more control about the monitoring tools Celery provides an API to get the information, and of course you can look at the source code for celeryev.
It's important to monitor also the Redis server
sudo tail -n 100 -f /var/log/redis/redis-server.log
we'll see what's happening on the Redis side,
==> /var/log/redis/redis-server.log <== [677] 03 Apr 09:56:10 - Accepted 192.168.1.32:38923 [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Accepted 192.168.1.32:38924 [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Accepted 192.168.1.32:38925
Redis provides also a client console, redis-cli that we could use to get more information and make a lot of management task. Some useful commands are:
KEYS *shows us the active keysDBSIZEinforms us about the size of the active database-
INFOgive us a lot of information about our database, it's really useful to check the memory consumption
process_id:677 uptime_in_seconds:5349 uptime_in_days:0 connected_clients:14 connected_slaves:0 blocked_clients:4 used_memory:1551228 used_memory_human:1.48M changes_since_last_save:1111 bgsave_in_progress:0 last_save_time:1301824662 bgrewriteaof_in_progress:0 total_connections_received:509 total_commands_processed:7060 expired_keys:0 hash_max_zipmap_entries:64 hash_max_zipmap_value:512 pubsub_channels:1 pubsub_patterns:0 vm_enabled:0 role:master db0:keys=8,expires=0
-
FLUSHDBcleans all the database removing all the keys MONITORshows us in real time what's happening, what commands are being executed, and the keys and information that is stored in the database.
To summarize
With Django, Celery and Redis we have a simple task distribution, scalable and with very small server requirements.
We can use Redis as a broker, as as data store and in other tasks of our Django application: as another database, as a session database, as a cache server.
If we want to work using tasks to split the work we have to
- Develop our application thinking in tasks and asynchronous processes.
- Install and configure Redis
- Run the workers
- Run celerybeat if we have periodic tasks
- Run the monitor
And of course we have to monitor all the application. Enjoy!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Celery i Redis
Escrit per Aaloy a 03 de April , 2011 a les 12:11 p.m.
En anteriors apunts he parlat ja de Celery i de Django Celery, un sistema per a la gestió de cues i tasques per Python i Django.
Celery a la seva documentació recomana RabbitMQ com a gestor de missatgeria, és a dir, com a aplicació que reb i distribueix les tasques que li envia l'aplicació entre els diferents worker que tenguem al nostre sistema.
Una vegada el worker ha realitzat la tasca deixa el resultat (si així ho hem indicat) al contenidor de resultats, que normalment serà el mateix que el broker de missatgeria, és a dir RabbitMQ.
L'arquitectura de Celery és molt potent en tant que ens permet escalar cap a baix i substituir peces segons necessitem. Així per aplicacions que necessitin d'un sistema de distribució de tasques però no de la complexitat de RabbitMQ podem utilitzar altres sistemes de notificacions, fins i tot fer servir una base de dades. On es guarden els resultats o com es serialitzen els missatges també es pot canviar. En definitiva, encara que hi hagi una configuració recomanada per a entorns que necessitin de molta potència en el sistema de distribució de tasques i coes, podem personalitzar Celery al nostre gust i a les nostres necessitats.
En aquest article el que presentaré és una configuració a mig camí entre el que seria la configuració més complexa de Celery i una configuració simple basada sols en base de dades.
Plantejant el problema
Tenim doncs una aplicació que no és molt gran, però a la que aniria molt bé tenir un sistema de distribució de tasques.
- Volem que la instal·lació i configuració sigui senzilla.
- El que instal·lem si pot ser hauria de poder aprofitar-se per quelcom més que no el sistema de tasques.
- Volem poder monitoritzar el que està passant.
- Volem poder gestionar fàcilment l'entorn
- Hem de poder depurar fàcilment el que està passant i assegurar-nos que l'aplicació funciona sense tenir que muntar tot l'entorn.
- El gestor de tasques ha de consumir pocs recursos i ser bo de controlar.
- El gestor de tasques ha de permetre l'execució de tasques periòdiques.
- Volem poder tenir accés als resultats.
Podem imaginar molts escenaris en que això s'ha de complir, per exemple un agregador de notícies, en un sistema de e-comerce l'enviament de factures, en un petit gestor documental la conversió de formats, ... És a dir, sistemes en els que volem que la resposta cap a l'usuari final sigui el més ràpida possible i que la feina feixuga no necessàriament es tengui que fer de manera síncrona, però on tampoc passa res si el sistema de missatgeria cau i perd alguna tasca, simplement es pot tornar a executar.
Amb aquestes condicions la configuració estàndard de Celery i de Django Celery és massa complexa, així que el que farem és aprimar-la un poc.
El broker
Volem que el sistema de distribució de tasques sigui prou potent i flexible, però sense la complexitat de RabbitMQ. Per això el que farem serà instal·lar Redis una base de dades NoSQL molt semblant al que seria un memcached.
Redis té l'avantatge de que és molt ràpid, ocupa molt pocs recursos de màquina, permet la persistència periòdica de les dades i és una aplicació prou genèrica com per poder ser utilitzada en les nostres aplicacions a més de per fer la gestió de les tasques. Una presentació de Simon Wilson crec que resumeix molt bé les possibilitats d'aquesta base de dades
Redis té un emperò important que hem de conèixer, és una base de dades que en la seva configuració estàndard requereix que totes les dades hi càpiguen en memòria i que aquesta es sincronitzi de manera periòdica al disc. Així doncs hem de procurar monitoritzar la nostra aplicació i l'ús que en fa de Redis per a no consumir més memòria de la que ens vulguem permetre.
La instal·lació de Redis
Redis està com a paquet en les principals distribucions, així que per distribucions basades en Debian bastarà fer:
sudo apt-get install redis-server
i com que també l'utilitzarem des de la nostra aplicació convé instal·lar també el l'API de connexió per Python, amb pip mateix
pip install redis
dins el nostre entorn virtual (perquè està clar que feis servir virtualenv a les vostres aplicacions, no?).
En una instal·lació neta dins una màquina virtual Ubuntu redis està ocupant 3271B de memòria virtual i 1516B de memòria resident a un únic procés.
En producció segurament ens interessarà tocar alguns paràmetres de Redis per fer la configuració més segura:
- bind ens permet lligar redis a una IP concreta.
- loglevel per defecte està a verbose, a producció amb notice o warning serà suficient.
l'arxiu de configuració de redis es troba a /etc/redis/redis.conf i està molt ben documentat per a poder adaptar-lo a les nostres necessitats.
On guardam els resultats?
Com hem dit Celery ens permet definir també on guardar els nostres resultats. Donat que Redis és una base de dades de propòsit general, a més de fer les tasques de missatgeria l'aprofitarem per a que guardi els resultats de les tasques.
Aquí hem de tenir en comptes el que dèiem de Redis, si guardam moltes dades i no pensam en anar fent neteja la memòria de Redis anirà creixent fins a ocupar tot el que tinguem.
Normalment a un sistema de tasques i cues ens interessarà guardar els resultats un temps per veure que tot està anant bé i després ja no els necessitam. Es a dir, els resultats no tenen perquè quedar forçosament dins la base de dades Redis, això ja dependrà de la nostra aplicació.
M'explicaré. Una de les aplicacions on feim servir Celery ens permet actualitzar la informació que tenim d'hotels. Es van llançant les peticions d'actualització i el worker se n'encarrega de baixar-se la informació llançant a la seva vegada una altra tasca i de processar-la una vegada l'ha rebuda. La informació sols necessita estar al magatzem el temps just i necessari per poder monitoritzar que tot va bé i que el worker ha rebut i processat la informació.
En el cas de la generació d'una factura no hem de guardar necessàriament el pdf de la factura dins Redis, basta poder dir que la factura s'ha realitzat correctament o directament suposar que ha anat tot bé i periòdicament tornar a llançar les tasques d'enviament per a tots aquells clients que han sol·licitat la factura i no se'ls ha enviada.
Així doncs utilitzarem també Redis per guardar els resultats i configurarem la nostra aplicació per a que no els guardi per sempre.
Amb això ja hem aconseguit que Redis faci una doble funció, però és que a més podem utilitzar Redis per a guardar les sessions de Django o fer-la servir com a Cache. Així doncs estam aprofitant els recursos que és un dels nostres principals objectius.
La configuració del settings.py
A INSTALLED_APPS hem afegit djcelery i per configurar Redis com a broker i com a magatzem de resultats feim:
BROKER_HOST = "192.168.1.33" BROKER_BACKEND="redis" REDIS_PORT=6379 REDIS_HOST = "192.168.1.33" BROKER_USER = "" BROKER_PASSWORD ="" BROKER_VHOST = "0" REDIS_DB = 0 REDIS_CONNECT_RETRY = True CELERY_SEND_EVENTS=True CELERY_RESULT_BACKEND='redis' CELERY_TASK_RESULT_EXPIRES = 10 CELERYBEAT_SCHEDULER="djcelery.schedulers.DatabaseScheduler" import djcelery djcelery.setup_loader()
El 192.168.1.33 és la màquina virtual on tenc instal·lat Redis, per tal d'emular un entorn de producció amb dues màquines. El port és el port per defecte i no he protegit redis amb usuari i password.
Important, el BROKER_VHOST és per redis el nom de la base de dades que es farà servir. Per defecte Redis fa servir la base de dades zero (0) però res ens impedeix tenir una base de dades diferent per les tasques i una altra pels resultats.
A CELERY_TASK_RESULT_EXPIRES podem veure com hem posat que els resultat expirin als 10 segons, més que suficient per la configuració de l'aplicació.
CELERYBEAT_SCHEDULER ens permet utilitzar la nostra aplicació d'Django per a gestionar les tasques periòdiques. Necessitarem fer un syncdb per a crear les estructures de dades, però a canvi podrem definir períodes i tasques.
Desenvolupant
En desenvolupament ens interessarà tenir molt present que tenim un sistema de coes i tasques, però realment el que més ens interessa és provar que tot funciona
CELERY_ALWAYS_EAGER=True
Aquesta configuració fa que l'aplicació s'executi com si no tingués coneixement del gestor de tasques, la qual cosa ens permetrà crear i depurar la nostra aplicació com sempre hem fet.
Posant en marxa els workers
Per tal de monitoritzar millor el que feim podem utilitzar una aplicació com terminator, una consola que ens permet agrupar consoles i veure d'una ullada el que està passant. A una d'aquestes consoles farem:
python manage.py celeryd -E -B --loglevel=INFO -n w1.d820
Això posa en marxa un worker, configurat amb un nombre de processos per defecte (2 en el meu cas) i li deim que envii els senyals de monitorització (això és el paràmetre S) i que a més engegui un procés addicional per a que gestioni les tasques periòdiques.
Hem de tenir en compte que sols hi pot haver un procés de gestió de tasques periòdiques, així que o bé es llança des d'un sol worker o bé podem fer servir l'aplicació celerybeat
python manage.py celerybeat --loglevel=INFO
Recordau! O una manera o l'altra però no les dues i mai per duplicat a dos workers.
Si l'executam per separat celerybeat ens informa de que està engegat i de las configuració que farà servir:
[2011-04-03 11:16:46,808: WARNING/MainProcess] celerybeat v2.2.5 is starting.
[2011-04-03 11:16:46,863: WARNING/MainProcess] __ - ... __ - _
Configuration ->
. broker -> redis://@192.168.1.33:6379/0
. loader -> djcelery.loaders.DjangoLoader
. scheduler -> djcelery.schedulers.DatabaseSchedulerCom que volem controlar i monitoritzar bé el que passa i potser tenir més d'un worker és convenient posar-los nom, això es fa amb el paràmetre -n, a mi m'agrada donarlos un nom junt amb el nom de la màquina.
Arrancaré un segon worker:
python manage.py celeryd -E --loglevel=INFO -n w2.d820 -------------- celery@w2.d820 v2.2.5 ---- **** ----- --- * *** * -- [Configuration] -- * - **** --- . broker: redis://@192.168.1.33:6379/0 - ** ---------- . loader: djcelery.loaders.DjangoLoader - ** ---------- . logfile: [stderr]@WARNING - ** ---------- . concurrency: 2 - ** ---------- . events: ON - *** --- * --- . beat: OFF -- ******* ---- --- ***** ----- [Queues] -------------- . celery: exchange:celery (direct) binding:celery
Fitxem-nos que en aquest cas ens diu que els events estan activat però que no hi ha el beat (el responsable de les tasques periòdiques actiu per aquest worker).
Podem ampliar o limitar el nombre de processos que arranca cada worker amb el paràmetre --concurrency, la configuració per defecte que depèn del nombre de CPUs disponibles sol anar bé, però sempre dependrà de la nostra aplicació i de les limitacions de recursos que li vulguem donar. Per exemple:
python manage.py celeryd -E --concurrency=10 -n w3.d820
Monitoritzant el que passa
Si a la nostra aplicació hem posat logs a cada worker podem veure el que està passant, però potser no sigui així, o tinguem els workers distribuïts a vàries màquines. Per això Celery ens dóna vàries eines de monitorització.
El primer que hem de fer és engegar el servei de monitorització:
python manage.py celerymon
celerymon 2.2.5 is starting.
Configuration ->
. broker -> redis://@192.168.1.33:6379/0
. webserver -> http://localhost:8989
celerymon has started.Si anam al servidor web que ha engegat Celery, podem veure un resum de les tasques i dels workers. Per exemple, en el nostre cas:
[{"heartbeats": [1301824037.784225],"hostname": "w1.d820"},
{"heartbeats": [1301824018.90294], "hostname": "w2.d820"}]Podem veure que hi ha dos workers actius.
Si hem fet servir el DatabaseScheduler veurem les nostres tasques dins la pròpia base de dades de Django, però a més hi ha una eina de consola d'allò més interessant celeryev
Amb python manage.py celeryev posarem en marxa una consola en la que ens informarà del que està passat, el nombre de tasques que hi ha executant-se i podrem veure informació damunt la tasca o eliminar (revoke) una tasca de la cua.
Si volem saber més coses o fer les nostres pròpies eines de monitorització Celery ens dóna tot una API per fer-ho, així que no estam limitats a les eines de sèrie.
El que ens queda també per monitoritzar és què està passant amb Redis
sudo tail -n 100 -f /var/log/redis/redis-server.log
ens informarà del que està passant i de les connexions que es realitzen.
==> /var/log/redis/redis-server.log <== [677] 03 Apr 09:56:10 - Accepted 192.168.1.32:38923 [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Accepted 192.168.1.32:38924 [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Client closed connection [677] 03 Apr 09:56:10 - Accepted 192.168.1.32:38925
Si volem anar més enllà podem fer servir la consola de Redis, redis-cli
Algunes comandes molt útils:
KEYS *- ens monstra les claus que tenim actives.DBSIZE- ens diu com està el tamany de la nostra base de dades-
INFO- ens dóna tot un conjunt d'informació de com està la nostra bd, és especialment interessant veure i monitoritzar el tamany de la memòria.process_id:677 uptime_in_seconds:5349 uptime_in_days:0 connected_clients:14 connected_slaves:0 blocked_clients:4 used_memory:1551228 used_memory_human:1.48M changes_since_last_save:1111 bgsave_in_progress:0 last_save_time:1301824662 bgrewriteaof_in_progress:0 total_connections_received:509 total_commands_processed:7060 expired_keys:0 hash_max_zipmap_entries:64 hash_max_zipmap_value:512 pubsub_channels:1 pubsub_patterns:0 vm_enabled:0 role:master db0:keys=8,expires=0
-
FLUSHDB- per netejar tota la base de dades activa de Redis. MONITOR- ens mostra què està passant, les claus que es generen, els resultats i les sentències que va executant Redis.
Conclusions
Amb Django, Celery i Redis hem aconseguit tenir un sistema de distribució de tasques simple, escalable i amb molts pocs requisits de màquina.
Redis es pot aprofitar tant pel sistema de cues com per la nostra aplicació, obrint-nos tot un món de possibilitats i mantenint baixa la complexitat de tota l'arquitectura.
Posar en marxa tot el sistema implica:
- Desenvolupar l'aplicació pensant en les tasques
- Configurar Redis
- Executar els workers
- Executar celerybeat per les tasques periòdiques si en tenim
- Executar el monitor
I òbviament anar monitoritzant-ho tot. Que ho disfruteu!
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django
Canvi d'oficina
Escrit per Aaloy a 03 de April , 2011 a les 12:23 a.m.
Aquest divendres passat hem finalitzat la mudança de l'antiga oficina d'APSL, 22 m² de l'Edifici Naorte del Parc Bit que teníem en règim d'incubació cap a la nova oficina, a l'Edifici NTIC, a 100 metres escasos, i ja de prop de 50 m². És una oficina compartida amb Pablo, de Pixelgrafic, no sé si se'n podrà dir co-working però la veritat que si assembla molt.
Encara ens quedaven un grapat de mesos en règim d'incubació al Parc Bit, però amb la incorporació de Juan (aka morenosan) ja ens tocava a poc més de 5 m² per barba i ens impedia rebre als clients i amics que ens venen a veure en condicions. Ara encara ens queda condicionar un poc més el nostre espai, ens falta encara una estanteria o dues i una taula, però temps al temps, el pressupost hi ha d'arribar i per ara era molt més necessari dotar a Juan de bones eines per fer feina, potser encara no tenim les estanteries, però Juan té un i5 amb 6 Gb de RAM i dos monitors de 23 polzades.
Alguns m'heu demanat si farem festa d'inauguració, la veritat és que m'agradaria, però hem de tenir en compte primer el fet que és una oficina compartida i no volem destorbar el nostre company i per l'altra, i potser més important, que les properes setmanes tenim dates d'entrega per a dos projectes i no ens sobra el temps.
Però tot arribarà, potser no farem acte d'inauguració, però alguna cosa farem, hi ha una terrassa molt gran al pis i hem de pensar com aprofitar-la. El que sí he de mirar encara és si encara podrem aprofitar les sales d'actes del Parc Bit, en sortir d'aquestes entregues volem de mirar de fer el primer Creant Bits d'enguany.
El canvi d'oficina també representa un nou repte, passam d'un lloguer molt assequible a un lloguer ja a preus de mercat, amb un contracte mínim d'un any i això significa molta més responsabilitat. La veritat és que estic molt agraït a l'oportunitat que ens ha donat el Parc Bit amb l'incubadora, ens ha donat l'oportunitat de saber si el nostre projecte era viable sense tenir-hi que invertir una gran quantitat inicial. Ara sabem que el projecte és viable, que muntar una empresa dedicada a la programació amb opensource té mercat i que a les nostres contrades també es poden dur a terme projectes importants fent feina amb Python i Django. Poser al final l'època de crisi en que ens trobam ens la jugarà, però no serà perquè la tecnologia o la idea no sigui vàlida.
Estam molt contents de poder fer feina amb Python i Django i al mateix temps encantats del rendiment que ens està donant la tecnologia i l'aprofitament dels servidors que tenim. Poder fer feina d'aquesta manera fa que un s'aixequi al matí i vagi a la feina més content, i sobretot que en surti amb la sensació d'haver fet quelcom de profit.
Així que si anau a l'oficina antiga i no em trobau no oblideu passar per l'NTIC, planta 2, despatx A, al carrer Ada Byron, encara que es digui NTIC l'edifici és ben nou!
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL)
Fer servir un ORM o no
Escrit per Aaloy a 19 de March , 2011 a les 12:49 p.m.
Arrel del darrer post s'ha establert un nou fil relacionat amb la conveniència o no de fer servir un ORM en les nostres aplicacions quan l'sql directe pot ser més eficient. En Jan Carreres, el "responsable" d'aquest article fa una sèrie d'apreciacions que crec que donen per un nou post, més que res per poder mantenir la discusió en baix el seu propi concepte.
Així doncs acomodeu-vos al seient, que començam ...
Però què dimonis és un ORM
ORM són les sigles de Object Relational Mapping, és a dir, s'anomena ORM a aquella llibreria o procés que fa la conversió d'estructures de dades relacionals cap a estructures de dades orientades a objectes. És a dir, passam de fer feina amb taules i files a fer feina amb classes i instàncies d'aquestes classes. Passam de fer feina de camps a fer feina amb propietats dels objectes.
No hi ha una única aproximació als ORM. Christian Bauer i Gavin King al llibre Hibernate in Action, anomenen quatre característiques comuns a tot ORM:
- Una API per executar operacions CRUD (Create, Retrieve, Update, Delete) en els objectes.
- Un llenguatge o una API per especificar les consultes que fan referència a les classes i a les propietats de les classes.
- Utilitats per especificar les metadades del mapeig entre el model relacional i el model d'objectes.
- Una tècnica dins l'ORM per crear transaccions, fer assosicacions
lazyi altres tipus d'optimitzacions.
A partir d'aqui la implementació de cada ORM potser completament diferent. Els autors, citant a Mark Fussel proposen la classificació dels ORMs en quatre tipus.
-
Purament Relacionals. L'ORM es construeix al voltant de la base de dades i es específic per a la nostra aplicació. Té l'avantatge que es pot optimitzar molt, però és difícilment portable entre bases de dades i presenta dificultats de manteniment. És típic d'aplicacions que tenen molta lògica dins la BD en forma de procediments amagatzemats.
-
Mapeig fi. Les entitats són representades com a classes i es mapegen manualment cap a les taules del model relacional. Un exemple d'aquest cas serien les aplicacions Java que fan ús del SQL/JDBC o bé en el cas de Python les que fan servir directament la DB-API de Python.
3. Mapeig mig. L'aplicació es dissenya al voltant del model d'objetes. És a dir, la base de dades és ara un suport per a la persistència dels objectes quan abans era gairebé la peça fonamental de l'aplicació. Aquest tipus d'ORM són especialment interessants quan l'aplicació té un tamany mitjà, amb transaccions complexes i sobretot quan la portabilitat entre bases de dades és un requeriment de l'aplicació.
4. Mapeig complet. S'hi arriba quan l'ORM suporta les característiques més importants i pròpies del model orientat a objectes: composició, herència, polimorfisme, ... i les implementa de manera transparent cap a la base de dades.
Si estam dins el món Java podríem dir que Hibernate està gairebé en el 4 d'aquesta classificació, Ibatis entre el 2 i el 3. En el cas de Python l'ORM de Django estaria començant a entrar en el 4 i SQLAlchemy estaria fregant el nivell d'Hibernate.
Per què fer servir un ORM
Per començar dir que un ORM no és una excusa per no saber SQL. Quan un fa feina amb aplicacions de bases de dades relacionals s'ha de conèixer al manco l'SQL estàndard, tenir molt clars els conceptes de taula, registre, selects, unions, claus primàries, etc. Es dóna per suposat que el tema de la normalització ja ho tenim ben clar.
El que fa un ORM és facilitar-nos la vida. Quan la nostra aplicació ja no es trivial, sinó que fa un ús intensiu de consultes, manipulacions de resultats, insercions, ens trobarem repetint una i una altra vegada el procés de conversió dels nostres objectes cap a sentències SQL. L'ORM fa tota aquesta feina per nosaltres, així que una de les raons més importants per a fer servir un ORM enlloc de sentències SQL a pèl per la nostra aplicació és la productivitat i evitar el DRY al llarg de la nostra aplicació.
Fer servir un ORM implica escriure menys codi nosaltres mateixos i sovint que el codi que hem escrit sigui més bo de llegir. Això es tradueix en una millor mantenibilitat de l'aplicació. Jan diu que si un es dedica a fer apliccions de BD ha de conèixer l'SQL i és veritat, però no té per què tenir a la ment tots els camps que hi ha a la taula. Imaginem-nos un entorn amb molts programadors fent feina a la mateixa aplicació. Aplicació amb moltes taules i amb taules amb molts de registres. Picant SQL a pel és tenim molts números de deixar-nos un camp a l'hora de fer una consulta. L'ORM manté la llista de camps per nosaltres, quan accedim a un objecte el ja se n'encarrega de fer les selects oportunes a la base de dades i obtenir-ne tots els camps.
Encara que hi ha casos en que escriure el codi SQL directament pot significar un guany considerable en el rendiment d'una consulta concreta, el més habitual és que l'ORM que facen servir ja tengui considerat dins la seva estructura les optimitzacions més habituals, de manera que l'sql que es genera pot ser fins i tot més eficient que el que generaríem a mà. Pensar que nosaltres sempre generarem millors sentències SQL és si més no agoserat, i per mi representa una optimització prematura. L'avantatge de productivitat i mantenibilitat que ens dóna l'ORM és el que s'ha de considerar primer. Després sempre hi som a temps d'optimitzar, però els nostres esforços s'han de concentrar en aquelles consultes o accions que torben més temps o que s'executen més sovint. És a dir, l'ORM i l'augment de productivitat que implica ens permet guanyar temps i poder optimitzar allà on interessar realment.
Molt relacionat amb tot això ens trobam la navegabilitat. La navegabilitat que ens permet el model orientat a objectes és d'aquelles coses que xoquen més amb el que ens proporciona el model relacional. Els ORM permeten navegar entre les associacions d'objetes de manera transparent, generant les sentències necessàries i sovint permetent-nos optimitzar aquesta navegabilitat, els select_related de Django n'és un exemple, o les cachés d'Hibernate. Pensem amb el senzill que és posar un objecte dins una plantilla i anar accedint a les seves propietat, anar fins a la propietat que representa una clau forana de la base de dades, fer-ne referència i obtenir-ne les propietats de l'objecte associat. Ara pensem en la quantiatat de codi SQL que ens hem estalviat.
I finalment l'altra gran motiu per fer servir un ORM és el d'independitzar-nos de la base de dades. Podria parèixer que quan un coneix SQL ja pot fer anar qualsevol base de dades, però realment això no és així, cada BD té petites diferències en la implementació de l'SQL que fan que sovint el codi SQL no sigui directament portable entre bases de dades. Un ORM crea una capa d'abstracció entre la nostra aplicació i la base de dades, generant i utilitzant les sentències SQL més adients a cada una.
L'argument que "un tria una BD i l'utilitzes sempre" per la meva experiència passa poc. Una empresa gran pot triar Oracle, però segurament per motius de cost algunes aplicacions les voldrà amb un altra BD. Si comercialitzam una aplicació limintar-nos a una base de dades concreta limita les possibilitats de comercialització. Fent servir un ORM podem desplegar la nostra aplicació contra diferents clients i fins i tot contra diferents versions d'una base de dades.
Resistir la temptació
Quan un comença a programar aplicacions de gestió és difícil resistir la temptació d'optimitzar-ho tot, d'escriure sql a pel optimitzant-ho per la nostra base de dades, és cert, però resistiu!
Si feim sql a pel a poc que l'aplicació creix el procés serà el seguent:
-
Ens adonarem que tenim sql repartits per tot. Així que farem una refactorització i posarem tot l'sql dins un sols arxiu que contindrà totes les funcions.
-
Després ens adonarem que aquest arxiu té molt de codi repetit, feim sempre la conversió de taules a objectes i ho refactoritzarem per a no repetir codi.
-
Després ens adonarem que feim sovint les mateixes consultes i que també es pot refactoritzar.
-
Seguirem i seguirem refactoritzant....
Al final acabarem amb un ORM del tipus 2 que ens haurà duit una feinada en refactoritzacions i que no té encara els avantatges d'un ORM del tipus 3 ó 4.
Costa resistir la temptació, fa peresa estudiar una llibreria d'ORM, però pensem que probablement el camí que seguirem serà aquest i s'ho paga l'esforç inicial.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Java Python Django PostgreSQL
Solapament d'intervals ara amb Django
Escrit per Aaloy a 12 de March , 2011 a les 12:05 p.m.
Segueixo amb la vena friki, ahir damunt el solapament d'intervals de mode genèric i avui veurem la implementació d'aquesta idea a un model Django.
class Oferta(models.Model):
"""Una oferta que va per rang"""
nom = models.CharField(max_length=200)
inici = models.DateField()
fi = models.DateField()
activa = models.BooleanField(default=True)
class Meta:
verbose_name="Oferta"
verbose_name_plural="Ofertes"
def __unicode__(self):
return self.nomEl model com veis és molt senzill, una oferta pot estar activa o no i pertany sempre a un rang de dates. Queda fora de l'exemple la determinació de si admetem solapament de dates per una oferta, que es fareia de manera semblant al la cerca que ara farem.
La idea és que hem d'aconseguir que amb l'ORM de Django nodelar una consulta del tipus not ((x1<y0) or (y1<x0)).
Els filtres per defecte el que fan es un and, per la qual cosa no ens serveixen directament. El que farem és utilitzar una característica de l'ORM anomenada funció Q que ens permete afegir condicons de filtratge múltiples i fer que vaign per OR enlloc de per AND.
from django.db.models import Q
Ara sols queda fer la consulta. Particularment si són consultes que poden ser susceptibles de fer-se servir a varis llocs o que estan molt relacionades amb el model, m'agrada lligar-les al model amb un manager ad-hoc o bé amb un mètode estàtic, que és el que farme ara. Així:
@staticmethod
def ofertes_entre(pInici, pFi):
return Oferta.objects.filter(activa=True). \
exclude(Q(fi__lt=pInici)|Q(inici__gt=pFi)).order_by('-inici')Fitxem-nos que el NOT de la consulta s'aconsegueix amb l'exclude i que feim servir la fució Q per afegir les dues condicions de comparació dins aquest filtre i les lligam per OR (|).
He afegit un grapat de dades d'exemple, i executat la consulta, que queda com
Oferta.ofertes_entre(f1, f2)
Ho he fet des de línia de comandes, de manera que ara puc veure la query que es genera:
>>from django.db import connection >>>connection.queries
'sql': u'SELECT "oferta_oferta"."id", "oferta_oferta"."nom",
"oferta_oferta"."inici", "oferta_oferta"."fi", "oferta_oferta"."activa" FROM
"oferta_oferta" WHERE ("oferta_oferta"."activa" = True AND NOT
(("oferta_oferta"."fi" < 2011-03-20 OR "oferta_oferta"."inici" > 2011-04-20 )))
ORDER BY "oferta_oferta"."inici"
Com m'agrada Django!
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Solapament d'intervals i.e. Interval match
Escrit per Aaloy a 11 de March , 2011 a les 8:32 p.m.
Avui em fa ganes dedicar un parell de línies a tractar un problema força comú que ens trobam amb programació. A saber, la necessitat de saber si dos intervals solapen o no.
El problema es pot presentar en diverses formes, però un cas força típic és el que tenim una taula que conté una data inicial i una data final i ens demanen que a partir d'un rang de dades, trobem tots els registres que tenen dades compreses entre les donades. Un cas molt típic es del de tenir un preu d'oferta que es vàlid per un rang de dades concret.
Anem a concretar el problema. Tenim un producte que presenta ofertes. Pels qui feis feina al sector turístic això us pot sonar als preus d'un hotel, però el problema és prou genèric, com diuen els matemàtics, podem considerar sense pèrdua de generalitat que tenim una sèrie de dies en que tenim ofertes i promocions de productes
dia descompte 1-8 10 € 9-10 20 € 11-25 15 € 25-31 5 €
El nostre client ens demana un rang de dies i volem donar-li quines ofertes hi ha actives per aquests dies
10 -> 20 11 -> 15 12 -> 15
és a dir, li diríem que hi ha dues ofertes dins el rang cercat, una que correspon a l'interval 9-10 i l'altra a l'interval 11-25
El problema es redueix a determinar quins intervals del nostre rang de consulta solapen amb l'interval d'ofertes i mostrar l'oferta corresponent.
El mètode més directe per comprovar si dos intervals es trepitgen és mirar-ne les condicions en que es solapen, suposant que anomenam a l'interval base [x0,x1] i a l'interval de comprovacio [y0, y1] tendríen que es dona solapament en aquests casos
[yyy]
[xxxxxxxxxx] cas 1 x0>=y0 and y1<=x1
[yyy]
[xxxxxxxx] cas 2 y1>=x0 and y0<=x0
[yyyyy]
[xxxxxxxxxx] cas 3 y0<=x1 and y1>x1
[yyyyyyyyyyy]
[xxx] cas 4 x0>=y0 and x1<=y1
[yyyyyyyy]
[xxxxx] cas 5 x0<=y1 and y1<x1
| y0 | y1 | x0 | x1 | cas |
| 10 | 12 | 1 | 8 | - |
| 10 | 12 | 9 | 10 | 3 |
| 10 | 12 | 11 | 25 | 2 |
| 10 | 12 | 25 | 31 | - |Si ajuntam casos semblants el codi que tindrem és
def overlaps(x,y):
x0, x1 = x
y0, y1, preu = y
return (
(x0 <= y0 <= x1) or
(x0 <= y1 <= x1) or
(y0 <= x0 <= y1) or
(y0 <= x1 <= y1)
)Però el més interessant és que ho podem pensar d'una altra manera, pensem en la inversa, demanem-nos quan els intervals no és solapen
[xxxxxxx] [yyyyyyyyyy] [yyyyyyy] [xxxxxxxxx]
és a dir, dos intervals no és solapem si x1<y0 o bé y2<x0, podem cercar dons quan no no es solapen els intervals, i per tant tindrem not (x1<y0) or (y1<x0)
def overlaps2(x, y): x0, x1 = x y0, y1, preu = y return not ((x1<y0) or (y1<x0))
divertit, veritat?
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Python
Estalvi, quin estalvi?
Escrit per Aaloy a 05 de March , 2011 a les 12:58 p.m.
A un twitt en Ricardo es queixava com una startup sols podia tenir un servidor de 100€. Quan he vist la quantitat he estat a punt de contestar-li que sí que se podia, però m'ha estranyat l'afirmació i he anat a veure el seu timeline del twitter. Allà ha quedat bastant més clar. Es referia que per estalviar 100 € a un servidor l'empresa que li feia la consulta estava gastant milers en administració de sistemes, intentant tunejar i posar pegats al servidor actual.
Així doncs no puc estar més d'acord amb Ricardo. Hi ha despeses que no es fan i s'incorre en despeses molt majors. Al final es tracta d'aturar-se un moment i avaluar què s'està fent, tanmateix és una simple resta: mirar què costa el nou servidor, què costarà fer el traspàs de la informació i després llevar-hi el cost del servidor actual i del seu mantenimient.
A més de tot això hi pot haver tota una sèrie de factors a considerar: amb el nou servidor (o amb la nova arquitectura si anam al núvol) segurament guanyarem espai, velocitat, ... els nostres clients notaran l'augment de rendiment. O fins i tot, si el servidor és intern, la gent que hi fa feina diàriment notarà la millora. És gairebé segur que la resposta que tinguem al canvi serà, però s'ha d'avaluar l'impacte per a poder afegir aquests guanys al càlcul de costs i no quedar-nos sols amb la simple resta que parlava.
Avui en dia un dels costs més importants per a una empresa és el cost de la gent, els sous, i per tant, l'estalvi hauria d'anar a fer que el rendiment de les hores-home sigui el més alt possible. Això vol dir que hem d'evitar que tècnics d'alt nivell amb cost-hora elevats perdin el seu temps per mor les eines que tenen al seu abast no són les adequades. Canviar un ordinador a un programador per un de més ràpid (sobretot si fa feina amb llenguatges compilats) vol dir menys temps d'espera, i això vol dir més rendiment. Canviar d'arquitectura o passar a un servidor més gran vol dir poder dedicar recursos que ara es destinten a manteniment a recursos productius.
Però hi ha més coses en la que no s'ho paga estalviar. Les pantalles, per exemple, tenir una pantalla més gran per molta gent significa fer millor la seva feina: gent que fa feina amb fulles de càlcul, dissenyadors, programadors, ... Fins i tot potser que una pantalla no basti i sigui convenient que en tenguin dues. Estam parlant actualment de costs de 200 € per pantalles de 20" i augments de rendiment que s'avaluen entre un 15 i un 20%. Parlem també de ratolins i teclats. La diferència entre un bon equipament i un de dolent és ridícula i la salut de la gent que fa feina tot lo dia amb ells ho agrairà.
Personalment m'estim més feina damunt una post amb quatre cames que prescindir d'una bona cadira, bones pantalles i un teclat i un ratolí ergonòmics. Potser, i sobretot quan comences, el pressupost no està per moltes alegries i s'han de reduir costs, però si és el cas, pensem que és molt millor reduir en decoració de l'oficina, o comprant taules més senzilles (Ikea és el vostre amic) que escatimar en eines productives. La diferència entre una taula de disseny i una post amb cames és de centenars d'euros, la diferència entre un ordinador amb 2 Gb de RAM i un de 4 Gb no arriba a 30.
Sempre hem de tenir present una cosa, el primer és la gent i la seva salut, per tant, quan més ergonomia tinguem a una oficina millor. Després ja és cosa de fer anar la calculadora, i en la majoria de casos posar eines millors implica un increment de la productivitat, ja sigui per l'eina en sí com que la gent fa feina més a gust.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Karma
Escrit per Aaloy a 28 de February , 2011 a les 11:51 p.m.
Aquests dies estic bastant engrescat i enfeinat amb projectes molt relacionats amb Python i Django. Per una banda estam definit i creant el que serà la segona fase del projecte Clickote, una aproximació simpàtica a les reserves d'hotel en la qual estam passant molt de gust fent-hi feina. Per una altra banda estam migrant un aplicació web feta inicialment amb ezPublish, un CMS dels de tota la vida, cap a Django.
Clickote és un projecte en el qual m'està agradant molt fer-hi feina perquè a més del projecte i la tecnologia en sí, ve a demostrar que client i proveïdor de serveis no són antagonistes, sinó que són col·laboradors. Amb l'equip de Clickote ens hi sentim molt bé fent-hi feina. Hem topat amb gent que no tan sols coneix el negoci, sinó que a més és conscient de la part tecnològica i de les implicacions en temps i esforç del que demanen, i sempre hem arribat a solucions beneficioses per al projecte.
La migració d'un lloc web des del CMS ezPublish cap a un CMS fet a mida amb Django és també tot un repte i representa també tot una aposta de futur per part del client. A les primeres etapes del canvi ja hem notat un augment del rendiment en temps de renderització de les planes d'un 30% de l'aplicació Django, motivat fonamentalment pel gran grau de control que es té a Django damunt el que es passa a la plantilla i com es passa. ezPublish no és un sistema MVC i quan hi ha lògica complexa pel mig, es queda molt curt comparat amb les possibilitats que et dóna Django. La creació d'un middleware ad-hoc, tags, l'herència de plantilles, la facilitat per crear serveis Ajax, ... Django com a CMS no es posa en el teu camí, ben al contrari, t'ajuda a crear l'aplicació i a optimitzar-la. Quan fas una migració com aquesta entens ben bé la frase del que el bastiment Django és per a "perfeccionistes amb dates d'entrega". Encara ens hi estarem un grapat de setmanes a la migració, en acabar esper poder posar-ho com a exemple de cas d'èxit, o si més no d'aprendre'n de l'experiència.
El cap de setmana passat vaig estar llegint "Maldito Karma" de David Safier, una lectura divertida amb cert tocs d'humor àcid que és llegeix molt bé, com un vi blanc jove fresquet a una tarda calorosa d'estiu.
No sé si serà cosa de la influència del llibre o no, però això de poder fer feia amb el que m'agrada, amb companys i clients com aquests, segur que em fa venir bon karma.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes Python Django
Creant un web service de proves amb Bottle
Escrit per Aaloy a 06 de February , 2011 a les 11:46 a.m.
Els cap de setmanes mira que intento estar una mica allunyat de la programació, intent llegir, passejar un poc i estar amb la família, però quan arriba el vespre i l'opció és convertir-se ja en un xuclador passiu d'anuncis publicitaris ja no puc més. Amb el temps el meu nivell de tolerància a les pauses publicitàries ha baixat molt. Ja no puc aguantar més de tres minuts, mir el mòbil a veure quines piulades noves hi ha al twitter, llegeixo un poc, ... Però si la pausa ja es fa massa gran ja m'avorreixo, no m'agrada estar avorrit, així que sovint acab davant l'ordinador, a provar idees, ...
Aquest cap de setmana m'ha passat això. Estava provant una web que hem fet que connecta amb un web service i se m'ha passat pel cap emular el servei, creant el meu propi servei web a efectes de test. Si ho pensau bé és una xorrada: es fan les peticions contra el servei real i es guarden les respostes. Després sols hem de substituir el servei real amb el nostre i en funció de les peticions enviar les respostes predefinides que hem capturat.
La primera intenció era fer-ho amb Django, però fet i fet el servei és tan simple que no necessita de tot l'aparell i funcionalitat de Django. Era hora de cercar un micro-framework ·[1]. De micro-frameworks per Python n'hi ha per donar i remanar. En aquest cas vaig optar per provar-ne un que m'agrada força, el bottle, més que res perquè es un sol mòdul, no té dependències externes i està ben documentat. Un hello world és
from bottle import route, run
@route('/:name')
def index(name='World'):
return '<b>Hello %s!</b>' % name
run(host='localhost', port=8080)Com que es tracta d'obtenir i tractar peticions xml [2] vaig utilitzar també la llibreria lxml. Així es tracta de capturar una petició xml que es reb via POST i en funció del contingut d'aquest xml enviar una resposta predefinida com a resposta.
La cosa queda així:
#-*- coding: UTF-8 -*-
from bottle import route, run, request
from lxml import etree
import os
app_root = os.path.abspath(os.path.dirname(__file__))
@route('/', method='POST')
def fake_ws():
body = request.body.read()
root = etree.fromstring(body).getroottree()
rq = root.getroot().tag
if rq == 'op1':
arx = os.path.join(app_root, 'rta/op1.xml')
elif rq == 'op2:
arx = os.path.join(app_root, 'rta/op2.xml')
#etc
#ja es veu com pot anar no?
return open(arx, 'r').read()
run(host='localhost', port=9090, reloader=True)Donant-li nom a l'arxiu i executant-lo tindrem un servei web xorra escoltant al port 9090 i que per testejar va més que bé.
Òbviament convertir això en un vertader servei que en lloc de respostes predefinides faci més feina és sols cosa de programar. Estendre el servei de proves a més opcions o contemplar altres casos, és també igual de senzill.
Està clar que això ho podem fer en gairebé qualsevol llenguatge. Python en aquest cas el que té és que ens dóna unes eines molt potents i simples. No hem de recompilar res, podem anar afegit nous exemples per testejar de manera trivial i el millor de tot, el servidor de test és tant senzill que no introdueix renou addicional a l'hora de provar. Com que les respostes les tenim predefinides podem optar per enviar-ne una o altra segons convengui, modificar-la per tractar casos frontera, o bé tractar-les com a una plantilla, Bottle té també un mini-llenguatge de plantilles, i que la resposta varii segons ens convengui.
[1] Bé, ho podria haver fet amb el servidor web que duu la llibreria estàndard de Python, però què voleu, m'encanten aquestes coses!
[2] També hi ha eines que farien bé la feina a la llibreria de Python, com l'xml.etree però m'agrada lxml.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Obsolescència
Escrit per Aaloy a 05 de February , 2011 a les 9:24 a.m.
Darrerament es parla molt del concepte d'obsolescència programada, que segons quins productes ja estan fabricats pensant que tindran una vida útil determinada i que a partir de cert temps hauran de ser reemplaçats per uns de nous.
En el món de la informàtica això ho vivim fonamentalment amb les impressores d'injecció de tinta (algunes marques tenen fama de crear aquesta obsolescència artificialment i no per desgast dels components), i làssers que obliguen a costosos cicles de manteniment. Però també vivim aquesta obsolescència en el món del ferro i dels sistemes operatius. Tradicionalment quan Microsoft treu una nova versió del seu sistema operatiu, el ferro que fa un parell d'anys era el millor del mercat ara ja no és capaç d'executar el nou sistema i obliga al seu canvi. D'Apple millor ja ni en parlam, el ferro és tan tancat que qualsevol cosa implica passar per caixa.
Afortunadament no fa falta limitar-se, des de sempre els sistemes Linux han tingut una obsessió gairebé malaltissa per aprofitar els recursos del sistema, fent que cada versió fos més òptima que l'anterior, i sobretot tractant d'aprofitar màquines "obsoletes". A poc que un cerqui per la web trobarem una munió de mini-distros pensades per aprofitar aquestes màquines.
En el meu cas m'havia trobat ja en una situació d'obsolescència lligada a la impressora làsser que faig servir. Una HP 4050, una bona impressora, però sense unitat de xarxa i amb connexió de port paral·lel. La impressora està connectada a un ordinador que tindrà més de sis anys que fa de lloc de fina per als meus fills i de servidor d'impressió. El problema és que les necessitats informàtiques de la família van creixent, els nins han de fer treballs que volen imprimir i ja som quatre compartint la impressora. Això vol dir que les possibilitat de tenir-la que fer servir augmenten i això implica tenir que posar en marxa el servidor d'impressió cada vegada, amb el cost en temps d'espera i malbaratament d'energia que això suposa.
La impressora s'havia quedat obsoleta pel tipus d'ús que nosaltres li volíem donar. Ja estava pensant en substituir-la per una impressora de xarxa quan vaig arribar al blog loquemellegodechina, en ell es parlava d'un NAS miniatura amb capacitat de fer de serividor de discs, via USB i de servidor d'impressores, per poc menys de 35$.
Després de llegir-ne un poc més i fer una volta per DealExtreme, vaig comanar una NAS compatible amb Snake OS. Snake es una ROM per aquests dispositius que afegeix soport ssh i un grapat de serveis més al dispositiu (com memòria swap per exemple), però el millor de tot és que és codi lliure.
Així doncs, després de tres setmanes d'espera em va arribar el meu paquet: la NS-K330, un cable de conversió paral·lel USB i un adaptador de corrent. El cost toal no arriba als 40 €.
Primer vaig instal·lar el dispositiu original, ve configurat com a client DHCP així que va ser cosa d'endevinar un poc la IP que se li havia assignat. Una vegada fet això i entrant amb el navegador apareix una interfície web en la que podem tunejar el dispositiu. Vaig configurar un disc usb i la impressora, i vaig provar d'accedir-hi des d'un dels equips. Cap problema, tot va funcionar a la primera.
Ara ja sabia que el dispositiu ja funcionava, així que era hora de provar l'Snake OS. El risc era carregar-me'l però l'experiment s'ho valia. Així que vaig descarregar la nova ROM i vaig actualitzar el dispositiu. Un parell llarg de minuts després el dispositiu tornava a la vida (amb una altra adreça per DHCP) i amb un nou sistema operatiu.
La compartició d'imprsesores d'Snake fa servir JetDirect i es configura de manera trivial als Linux. Cerques una impressora de xarxa i ja te surt la IP del dispositiu amb el port 9000. L'accés per ssh també funciona, així com l'accés per FTP i Samba. El consum en potència del dispositiu NS-K330 és mínim, si ho comparam amb els prop de 300 W del servidor antic, a poc que aguanti amortitzarà de sobres el seu preu.
Però el millor és que m'ha permès lluitar contra l'obsolescència, aprofitant un equip perfectament útil i divertir-me en el procés.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Actualitzant coses
Escrit per Aaloy a 30 de January , 2011 a les 11:23 a.m.
Aquesta setmana he estat força entretingut, m'he estat mirant un grapat de llibreries i utilitats, algunes d'elles noves versions que han anat evolucionant i millorant al llarg del temps. També vaig tenir l'oportunitat d'assistir a la xerrada de Maria Antònia Mas Pichaco damunt la guia PMBOK®, gràcies a l'empenta de Paco que em va recordar que es donava la xerrada. A part de la conferència en sí, també va estar molt bé el cafetó i la xerrada amb Paco, això de contar batalletes i compartir opinions no s'ha de perdre Paco! :)
Xerrada de PMBOK®
Si anam per ordre el primer seria parlar de la xerrada de Maria Antònia. A diferència d'altres assistents que l'havien tinguda com a professora, era la primera vegada que l'escoltava. Em va agradar, la exposició va ser clara i entretinguda. M'hauré de llegir la guia per poder-ne fer una avaluació en profunditat, però pel que vaig entendre es tracta d'un conjunt de recomanacions i millors pràctiques que cobreixen el cicle de la gestió de projectes, però que en cap cas ens marca un camí a seguir o una metodologia. Supòs que la utilitat vindrà quan ja hagis elegit com gestionar un projecte.
En la part anecdòtica me va fer gràcia quan un dels punts de la gestió del projecte consistia en "triar l'equip de gent". Em va recordar a aquelles pel·lícules on l'heroi va cercant l'equip en els llocs més inversemblants, sempre els millors en el que fan, per conformar un equip invencible. Bé, la realitat és que poques vegades tens ocasió de fer això, però quan pots és molt engrescador. El més normal és que l'equip et vengui donat i llavors el que s'ha de fer és tractar d'esbrinar quines mancances i quines aptituds té cada membre de l'equip per arribar a dur a terme el projecte. Seguint amb el símil fílmic, és mes semblant a les pel·lícules on l'entrenador agafa un equip que no coneix i el duu cap a la fita proposada (sempre amb final feliç).
Em va dur molts records una altra frase "un projecte ha de tenir una data de finalització", ja que és una discussió que havia tingut en algunes ocasions amb certa gent. Per mi un projecte comença, es desenvolupa i acaba, tal com també va dir Maria Antònia, tot el que no té dada de finalització entra dins la part d'operacions.
LibreOffice
Al portàtil de casa he substituït ja l'OpenOffice per LibreOffice, la migració va ser molt senzilla i per ara no he detectat cap problema. Pareix més ràpid i no dóna problemes amb el Firefox. No sé si me passa a mi sols, però amb l'OpenOffice i el Firefox en marxa les operacions de tallar i aferrar es feien eternes, ara això no passa. També he trobat millores curioses, com la possibilitat de tenir colors a les pipelles de les fulles de càlcul, opció que ja tenia el Quattro Pro de Borland i que el pas en massa de les empreses cap a Excel va deixar a l'oblit. Com a altra avantatja la millora a la pantalla de càrrega que li dóna un aire un poc més fresc i la millora en la navegació.
VirtualBox 4
He actualitzat el programa VirtualBox a la darrera versió, l'actualització des de la 3.2 és trivial i no s'han perdut màquines virtuals. El temps d'arrencada de l'aplicació i de les màquines virtuals ha millorat molt i també ho ha fet la interfície gràfica d'administració. A més ara té la possibilitat de connectar-se en remot a una màquina virtual mitjançant el protocol RDP, bé en sessió única o en multi sessió. Així dins una Ubuntu 10.10 tenia dues màquines virtuals, una Ubuntu 10.04 i un Windows XP (l'original que va venir amb el portàtil), aquest XP estava connectat via RDP a la màquina virtual Ubuntu i s'hi podi interactuar veient l'arrancada i tot. Des de l'altra ordinador, el PPC, també vaig connectar via remote desktop a la màquina virtual Ubuntu. Divertit i amb moltes possibilitats.
Sorl thumbnail
Sorl es una llibreria per a la gestió d'imatges per Django. És una reescriptura d'una versió anterior pràcticament des de zero. Incorpora totes les possibilitats de la versió anterior però ara de manera molt més transparent i entenidora. Han millorat com es fa caché de les imatges incorporant Redis com a opció de magatzem de claus, opció per distingir el tipus d'orientació de la imatges i un control per determinar si la imatges existeix o no (per exemple en remot quan dóna un 404) i actuar en conseqüència.
A les properes setmanes esper poder parlar de la sortida de Django 1.3 i de Celery. No sé què em fa més patxoca. Per una part Django 1.3 significarà que ja s'avança cap al 1.4, versió que està previst que incorporarà moltes més novetats que la 1.3 que és una versió més de correcció de petits errors i en general petites funcionalitats. Celery, la llibreries de cues per Python i Django també treurà aviat una nova versió. N'estic molt pendent ja que incorpora compressió de missatges, autoescalat, un nou protocol més eficient, ... Per ara m'he llegit la documentació i he de començar a preparar algunes de les nostres aplicacions que fan servir la llibreria migrant a l'actual Release Candidate i veure'n el camí de migració. Ja en xerrarem!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Python Django
Primer apunt del 2011
Escrit per Aaloy a 23 de January , 2011 a les 12:25 p.m.
Primer apunt del 2011
Primer apunt d'aquests any. Se diu aviat quan gairebé ja ha passat un mes del 2011. Aquesta aturada per festes ha suposat també una aturada en els pots d'aquest blog. No vull dir que escriure sigui una rutina més, però sí que requereix de moments de tranquil·litat davant de l'ordinador, de reorganitzar idees, i amb les festes i amb tot el que queda pendent a l'inici d'any per mor de les festes, doncs tot s'acumula i els moments propicis per escriure al blog són molt limitats.
Així que aquest primer apunt implica d'alguna manera tornar a la normalitat després de festes, posar en ordre els projectes i també fer un petit resum de l'any passat, que com a nota històrica doncs tampoc queda tan malament. Als soferts lectors ja us aviso que aquest apunt va de batalles, buabulància, projectes, ... Un sac on s'hi pot trobar de tot, bé si fa no fa com als resums anuals que fan per les teles, però sense els cops i les caigudes.
Com molts sabeu el 2010 va ser l'any en que vaig deixar una feina estable a Tui España (després Hotelbes) per dedicar-me junt amb altre(s) socis a fer feina a temps complet per a la nostra pròpia empresa). Vist amb un any de perspectiva he de dir que no tot són flors i violes, això de tenir un sou fix cada més està força bé, però també es veritat que poder fer feina en projectes amb la tecnologia que t'agrada i de la manera que t'agrada crec que ho compensa de sobres.
També he pogut veure que moltes de les coses que comenta la gent autònoma o les petites empreses és totalment cert. Crec que es creen micro-empreses i autònoms a pesar de l'administració i no gràcies a ella. Tenir que avançar l'IVA de factures que encara no has cobrat (i que potser no cobraràs) és l'exemple més clar, però també ens n'hem trobat més: disposicions vers la comunicació electrònica de l'administració que sols funcionen amb segons quins sistemes operatius, concursos públics que demanen un programa específic d'un proveïdor concret (no fa falta dir quin, veritat?), subvencions que se'n van a empreses que no ho necessiten, plans avanza que impliquen que siguis una gran empresa per presentar-hi i ja pensats per a que les empreses se n'aprofitin i que juguen al gat i al ratolí amb les normes. Pens que tot hauria de ser més fàcil, en Varsavsky a alguns apunts del seu blog quan parla de la crisi i de com està organitzada la creació d'empreses a Espanya dóna bastant al clau.
També potser totes aquests qüestions burocràtiques tenen una raó de ser, que la gent té per hobby defraudar tot el que pot a Hisenda i a l'Estat (els recents i nombrosos casos de corrupció que s'han destapat a les nostres Illes aquest darrer any així pareix que ho demostren), però també crec que molta paperassa que es fa té per objectiu justificar la pròpia burocràcia i la seva ineficiència. Amb la quantitat d'informació que té l'Estat damunt nosaltres no té sentit que cada organisme torni a demanar la mateixa paperassa, i que se suposi que tothom és un potencial defraudador i es legisli en conseqüència, és a dir, no amb la intenció de fer més fàcil la creació d'empreses i la seva gestió, sinó amb la intenció de fer més fàcil la feina d'inspecció i control, passant la càrrega de feina (i sovint de la prova) cap a l'empresa.
Per exemple, una de les normes suposa que per una micro-pyme com nosaltres hem de fer que els 85% de beneficis vagin com a factures dels socis, la conseqüència és que a principis d'any l'empresa es queda pràcticament descapitalitzada i sense marge de maniobra per escometre inversions (ja siguin de renovació de mobiliari o de projectes propis). Entenc que és una mesura per evitar el frau, però que fa molt difícil la vida a les micro-empreses que començam.
Però no tot és negatiu, la veritat és que la Incubadora del Parc Bit és una gran ajuda per gent com nosaltres i el personal d'allà està fent molt bona feina. També a poc a poc vas notant alguns canvis positius: que l'Ibit organitzi un curs de qualitat d'OpenERP va ser una notícia prou bona pels que creim que el programari lliure és una opció de futur pel nostre teixit empresarial. Les empreses ja no els estranya que els diguis que fas feina exclusivament amb programari lliure i que els desenvoluparàs una aplicació web que correrà damunt Linux. Potser és la crisi, potser és un canvi de mentalitat o tot plegat, però al manco es veu que alguna cosa està canviant de manera lenta però inexorable.
Els projectes del 2010 han estat força entretinguts, hem tingut un gran projecte: la migració i renovació de la web del grup Hoteler Fiesta. Tot i que algunes vegades hem tingut que adaptar-nos al que ens deixava fer el CMS "legacy" més que al que nosaltres ens hagués agradat, el treball va ser molt engrescador i va suposar un repte tècnic important.
Hem pogut fer feina amb Python i Django amb molts projectes. Des de webs presencials com la de Clima Insular a projectes b2c com són els projectes de Globalbooking i Clickote. Hem fet feina amb Python i Django, i afinat les configuracions de sistemes per fer que les aplicacions tenguin un rendiment semblant a webs que es gastes varis ordres de magnitud més en el seus desenvolupaments. Personalment m'ho he passat d'allò més bé en veure com una aplicació com Celery i RabbitMQ pot donar un joc tan gran en el desenvolupament web. En poques paraules, m'he divertit, ens hem divertit amb la feina.
El 2011 es presenta també molt interessant. Tenim en cartera projectes per fer webs de venda per alguns hotels que crec que poden quedar molt bé. No ens les donam de gurús i no tenim el marketing d'altres, però mira som així i no hi podem fer res. L'altra dia a un twitt un conegut gurú del marketing hoteler deia que eren els millors perquè el seu cms podia fer feina amb múltiples idiomes, com si l'Unicode l'hagués descobert ell. Fa ja prop de tres anys nosaltres amb Python i Django posàrem la web d'UltramarExpress en producció en xinès i ens va parèixer la cosa més normal del món, crec que no ens sabem vendre bé. També és veritat que potser també tenim més coneixements tècnics per a saber què és l'Unicode, l'UTF-8 i per distingir la traducció de la localització. Em sap greu, però aquests tipus de venda de fum m'indignen!
Em fa moltes ganes seguir fent feina amb l'arquitectura d'Amazon, amb els preus a que s'han posat les micro-instàncies, fer experiments o posar serveis dedicats és molt barat. Un dels primers que crec que posarem serà un servidor dedicat per Git. Estam investigant si hi ha alguna cosa opensource que ens faciliti la tasca d'administració, però el que és segur que tenir un servidor propi per control de versions damunt Amazon per a una empresa té un cost realment ridícul. En la nostra feina diària feim servir fonamentalment el subversion, però Git (o Mercurial) tenen molts avantatges com per a no intentar fer el canvi. Representa però una manera de fer feina que requereix una adaptació i aquesta ha de ser el menys traumàtica possible. Feim servir Trac per a gestionar projectes i hem d'avaluar el suport de Git o pensar en migrar a Redmine que pareix que el té molt més madur. Com dic, també estaria molt bé tenir una eina web potent d'aministració dels repositoris i dels usuaris, més que res com a una opció de futur.
El 2011 també es presenta molt interessant en el món Python. Supòs que les distribucions més populars ja vindram amb el Python 2.7 i això facilitarà la migració cap a la versió 3.x de Python. La setmana passada pareix que se va arreglar l'entrebanc més important que hi havia amb el mòdul wsgi per la versió 3 i això vol dir que els principals frameworks Python podran utilitzar Python 3 i desplegar-se sense problemes. Seria molt agoserat dir que el 2011 serà l'any en que Python 3 serà l'estàndard per al desenvolupament web, però sí que crec que es portara a Python 3 les principals llibreries i que el 2012 (si no s'acaba el món) un ja tindrà pocs dubtes de si programa amb Python 2 o 3, directament ho farà amb el tres.
El 2010 Python ha guanyat molt acceptació dins la comunitat de programadors. L'índex TIOBE i el premi al llenguatge de l'any són una bona mostra i el 2011 crec que anirà pel mateix camí. Cada cop veus més utilitats, aplicacions web i web fetes amb Python i algun framework (normalment Django). Les utilitats de desenvolupament web per Python cada cop són més potents i a la vegada fàcils de fer anar, amb línea amb la filosofia del llenguatge. He passat d'utilitats de testeig com pyUnit a fer feina amb nose, que fa que crear tests unitaris per testejar aplicacions no sigui molt més complexe que escriure els petits scripts que tanmateix ja feia. Nose permet reutilitzar la feina que ja feim i formalitzar les proves que hauríem fet de totes maneres. South per Django és una altra d'aquestes petites joies que ha arribat a la maduresa. L'actualització del model de dades per Django és trivial amb South i cobreix pràcticament el 99% dels casos. A l'autor li han proposat sovint que South formi part del Core de Django però ell diu que encara no està totalment satisfet i que per això vol mantenir-ho com a projecte separat. Pareix que vol arribar a la perfecció absoluta!
A més de per les ganes que me feia poder fer feina a la meva pròpia empresa, una de les raons que me dugueren a deixar Hotelbeds, no ho negaré, va ser que volia poder desenvolupar projectes amb Python i Django com fins aleshores ho havíem fet a TUI España. Crec que és un dels grans problemes de Python, que una vegada que hi fas feina tornar a altres llenguatges és molt difícil. Crec que va ser i és encara una decisió arriscada, però fer feina amb el que te grada sovint ho és.
La versió 1.3 de Django s'espera d'aquí uns mesos. Serà una versió de transició, orientada a corregir bugs i afegir petites millores de funcionalitat que quedaren com a tickets pendents d'integrar a la versió 1.2. Tot i això hi haurà millores com la millora en el maneig de contingut estàtic, que ha passat de ser una aplicació independent a estar integrada en el core.
Fa pocs dies al twitter i a la llista de desevolupament s'anunciava que es passava a Transifex per a les tasques de traducció. Això és una molt bona notícia. Transifex és d'aquests projectes que poc a poc van calant dins els món del desenvolupament per la seva senzillesa i eficàcia. Una altre bon exemple seria també el d'Sphinx per a la documentació d'aplicacions, o fins i tot una aplicació web molt recent, el readthedocs que s'està convertint en una web ideal on deixar la documentació dels nostres projectes online.
Al 2011 també hi haurà la possibilitat d'anar a la Django Conference que enguany es fa a Holanda, un destí relativament proper i econòmicament assequible. Si l'economia m'ho permet me fa moltes ganes anar-hi, serà una bona oportunitat de conèixer gent a la que segueixo per les llistes de Django i/o Twitter i veure com afronten ells la realitat empresarial.
També crec que pot ser un bon any per implantar OpenERP a l'empresa. El curset de l'Ibit ens va servir per adonar-nos realment de tot el seu potencial. Ja ha sortit la versió 6.0 i encara que no està completament localitzada trob que està prou madura per poder-hi començar a fer feina internament i potser d'aquí algunes setmanes/mesos començar a fer alguns projectes per tercers. OperERP està fet en Python i per tant moltes de les eines i tècniques que ja feim servir són aplicables al desenvolupament d'aplicacions de negoci damunt OpenERP.
Realment no sé si el 2011 representarà el final de la crisi, si tots els projectes que hi ha en expectativa es tancaran finalment i tindrem un any bo. Com que me conec sé segur que no deixaré de passar pena: per la feina, per les factures, pel local, pels projectes,... però és el meu tarannà. La diferència és que abans me creava molta ansietat el saber que les coses es podrien fer d'una manera millor i no tenir l'oportunitat de canviar les coses, ara aquesta ansietat no hi és, perquè al manco tenc l'oportunitat d'intentar-ho.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Informàtica Linux Python Django APSL
OpenERP
Escrit per Aaloy a 11 de December , 2010 a les 11:10 a.m.
Fa uns dies vàrem finalitzar la primera part del curs d'OpenERP. Aquesta part estava dedicada a la programació d'aplicacions i després, de fet la propera setmana, seguirà una part més dedicada al món de l'empresa i la gestió.
El curs és una iniciativa de l'Ibit d'aquestes que et tornen a reconciliar amb l'administració. Quan l'administració aposta per programes com OpenERP i la formació de programadors locals en aquestes tecnologies està apostant tant per l'empresa local de programació com per les PIMEs, que podran gaudir d'una programari avançat amb el sol cost de la seva implantació. Un ERP com OpenERP uneix omptabilitat, facturació, gestió de clients, etc amb la capacitat de programació i personalització. El que sigui slliure implica que el que pagaríem amb llicències se'n pot anar a millorar el programa i a adaptar-lo a les nostres necessitats.
Coneixia OpenERP des de fa temps, però els darrers dos anys el seu creixement en funcionalitat i mòduls ha estat espectacular. El programa està escrit en Python, una de les coses que el fan més atractiu, ja que fa que la corba d'aprenentatge sigui molt suau i a més fa que els requeriments de màquina que se necessitin per fer anar el programa siguin minims. La base de dades que utilitza OpenERP és Postgresql, una altra magnífica elecció al meu entendre ja que personalment he pogut comprovar la robustesa d'aquesta base de dades en entorns de negoci i la seva gran versatilitat.
Recordem que estam parlant d'un ERP, un sistema que integra tot el que el negoci pugui necessitar gairebé de sèrie i que permet personalitzar-ho de manera que sigui el programa el que s'adapti al negoci. Així podem verticalitzar l'aplicació creant nous mòduls i aprofitant els existents, o bé podem utilitzar-ho com a bastiment per a crear les nostres pròpies aplicacions. El sistema es prou modular per permetre ser utilitzat com un programa de comptabilitat i gestió potent, com un bastiment de programació per aplicacions de gestió o la combinació d'ambdues caracterísiques. Sols per la comptabilitat i facturació la instal·lació d'OpenERP ja es justifica sola, per una part tindrem un dels millor programes comptables que hi ha i a més a més tendrem control de les nostres dades. Supòs que més d'una ara recordarà algun amic o conegut que s'ha trobat amb problemes amb alguna de les distintes versions de contapluses pagades i amb llicència (canvi disc dur o d'ordinador són bastant habituals), i quan ha anat a consultar què passava li han dit que ha de passar per caixa i contractar un manteniment que li costa més que el que va pagar de llicència. Mentre no té accés al programa, no pot fer factures ni comptabilitzar, passa a ser hostatge de la seva compra. Amb OpenERP això no passa, no depens d'una única empresa que et pugui donar el mantenimient, si ho instal·les a casa les dades són teves i no hi ha limitacions artificials. Si el nostre negoci creix i necessitam més gent a administració o canviam de disc dur l'OpenERP seguirà funcionant.
Que OpenERP estigui escrit en Python i que hagi tingut aquest creixement per mi no és casualitat. Ho he vist en altres projectes Python, que comencen molt tímidament però que aviat gràcies al nivell d'entrada tan suau que té el llenguatge i a la seva legibilitat, va incorporant programadors i característiques fins a convertir-se en un referent dins el sector. Ho hem vist recentment a projectes com Django o Satchmo, i també a llibreries com pyQt, wxPython, sistemes de còpia de seguretat, ... OpenERP és potser un dels millors exemples del que es pot fer amb Python.
La part de programció pura, amb OpenObject i no lligada a la comptabilitat o facturació també es mereix la màxima atenció. És molt bo de fer crear formularis i aplicacions noves. La gent que sovint diu que necessita un Access per Linux li hauria de fer una ullada a com funciona el programa. Pel mateix preu tens el client gtk i el client web, i la feina que duu m'atreviria a dir que és menor que una aplicació Acces ben acabada.
Personalment ho tenc força clar, OpenObject passarà a formar part del meu caixò d'eines informàtique i l'opció preferent quan es tracti de crear una aplicació de gestió d'escriptori o web. A més és molt bo de fer connectar-ho amb Django o altres aplicacions gràcies a la seva filosofia oberta.
Esper que la propera setmana el curs sigui tan interessant como ho va ser el de programació. Crec que ens divertirem molt amb OpenERP i OpenObject.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python PostgreSQL
Celery: mini tutorial
Escrit per Aaloy a 28 de November , 2010 a les 6:55 p.m.
Configuració del servidor rabbitmq
El servidor Rabbitmq és qui rebrà les ordre d'execució de les tasques i les enviarà als workers que han de fer la feina i rebrà el resultats de les operacions de manera que el procés que ha donat l'ordre d'execució de la tasca el pugui fer servir.
És important destacar que a l'hora de donar l'ordre d'execució podem decidir si el resultat s'ha de guardar o bé s'ha de descartar. Si el resultat no és necessari (pensem per exemple en l'enviament d'un e-mail) llavors convé marcar la tasca per a que el resultat es descarti.
sudo aptitude install rabbitmq-server
Els paquets nous següents s'instal·laran:
erlang-os-mon{a} erlang-snmp{a} rabbitmq-server
0 paquets a actualitzar, 3 a instal·lar, 0 a suprimir i 5 a no actualitzar.
Es necessita obtenir 1398kB d'arxius. Després del desempaquetat s'utilitzaran 3187kB.
Esteu segur de voler continuar? [Y/n/?] y
Obté:1 http://es.archive.ubuntu.com/ubuntu/ maverick/main erlang-snmp i386 1:13.b.3-dfsg-2ubuntu3 [581kB]
Obté:2 http://es.archive.ubuntu.com/ubuntu/ maverick/main erlang-os-mon i386 1:13.b.3-dfsg-2ubuntu3 [77,4kB]
Obté:3 http://es.archive.ubuntu.com/ubuntu/ maverick/main rabbitmq-server all 1.8.0-1ubuntu2 [739kB]
S'han obtingut 1398kB en 2s (480kB/s)
S'estan preconfigurant els paquets...
S'està seleccionant el paquet erlang-snmp prèviament no seleccionat.
(S'està llegint la base de dades … hi ha 118931 fitxers i directoris instal·lats actualment.)
S'està desempaquetant erlang-snmp (de …/erlang-snmp_1%3a13.b.3-dfsg-2ubuntu3_i386.deb) …
S'està seleccionant el paquet erlang-os-mon prèviament no seleccionat.
S'està desempaquetant erlang-os-mon (de …/erlang-os-mon_1%3a13.b.3-dfsg-2ubuntu3_i386.deb) …
S'està seleccionant el paquet rabbitmq-server prèviament no seleccionat.
S'està desempaquetant rabbitmq-server (de …/rabbitmq-server_1.8.0-1ubuntu2_all.deb) …
S'estan processant els activadors per a man-db …
S'estan processant els activadors per a ureadahead …
S'està configurant erlang-snmp (1:13.b.3-dfsg-2ubuntu3) …
S'està configurant erlang-os-mon (1:13.b.3-dfsg-2ubuntu3) …
S'està configurant rabbitmq-server (1.8.0-1ubuntu2) …
Adding group `rabbitmq' (GID 123) ...
Fet.
Adding system user `rabbitmq' (UID 115) ...
Adding new user `rabbitmq' (UID 115) with group `rabbitmq' ...
Not creating home directory `/var/lib/rabbitmq'.
Starting rabbitmq-server: SUCCESS
rabbitmq-server.Amb això hem aconsegui instal·lar i posar en marxa el RabbitMq en un sistema Ubuntu 10.10.
Ara ens queda configurar, afegirem un usuari i un vhost per a que accepti els treballs,
a més hem de donar permisos a aquest usuari per a que que pugui enviar treballs
al vhost creat.
Afegim l'usuari:
$ sudo su $ rabbitmqctl add_user django password Creating user "django" ... ...done.
Cream l'vhost
$ rabbitmqctl add_vhost test Creating vhost "test" ... ...done.
Assignam els permisos a l'usuari per a quest vhost
$rabbitmqctl set_permissions -p test django ".*" ".*" ".*" Setting permissions for user "django" in vhost "test" ... ...done.
Ja tenim la part més complexa llesta. El servidor RabbitMQ pot estar en la mateixa màquina o en una totalment distinta de la que llançarà la tasca o de la màquina de l'executarà.
Preparant l'entorn
La gràcia del Celery és que ens permet llançar les tasques i executarles mantinguent la cohesió de la nostra aplicació. És a dir, si estam treballant amb Django Celery ens permet manetenir el codi de cridada i d'execució de la tasca des de la mateixa aplicació o des del mateix projecte.
Per començar convé que instal·lem Celery. Ho farem des de un entorn virtual,
per això convé tenir instal·lats els paquets virtualenv i virtualenvwrapper.
sudo pip install virtualenv virtualenvwrapper
i configurar el virtualenvwrapper.
Crear l'entorn, de nom per exemple celery i instal·larem el paquet celery
mkvirtualenv celery workon celery pip install celery
Que sigui un projecte Django o Python pur té molt poques diferències. En el cas de Django hem d'instal·lar el paquet django-celery i configurar el projecte. Així a les nostres aplicacions afegirem "djcelery"
INSTALLED_APPS += ("djcelery", )I també és important afegir les següents línies al settings.py
import djcelery djcelery.setup_loader()
La resta es comú tant a un projecte Python que a un projecte Django, sols que
les configuracions en el primer cas aniran a un arxiu anomenat celeryconfig.py
i en el cas de django la configuració pot anar dins el settings.py
Per la nostra primera tasca crearem un project Python simple i l'arxiu
de configuració celeryconfig.py contindrà
#-*- coding: UTF-8 -*-
BROKER_HOST = "192.168.1.10"
BROKER_PORT = 5672
BROKER_USER = "django"
BROKER_PASSWORD = "password"
BROKER_VHOST = "test"
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
CELERY_SEND_EVENTS=TrueEl prefixe BROKER fa referència al servidor RabbitMq que acabam d'instal·lar. Celery pot fer servir difernts tipus de Brookers pero RabbitMq és el més recomanat.
Fitxau-vos que el configuram amb els paràmetres amb els quals hem creat el vhost, i amb l'usuari i password creats a RabbitMq.
CELERY_RESULT_BACKEND serveix per a indicar a Celery on s'han de deixar els resultats. Podem tenir distints backends, des de Memcached, a una base de dades o una base de dades NoSQL.
CELERY_IMPORTS indica a l'aplicació que tasks.py conté les tasques que
s'han d'executar. Bé, de fet el que fa és indicar al daemon de celery
quines són les tasques a exeuctar quan es posi en marxa, però també pot
fer-se servir per altres tipus d'inicialitzacions.
CELERY_SEND_EVENTS li diu a Celery que volem monitoritzar els events que es produeixin. Si no posam aquesta ordre i després volem saber què esta passant ho tendrem molt més complicat.
Creant la nostra primera tasca
Per cerar la nostra primea tasca crearem una arxiu anomenat tasks.py
#-*- coding: UTF-8 -*-
from celery.decorators import task
@task(name='tasks.add')
def add(x,y, **kwargs):
logger=add.get_logger(**kwargs)
logger.info('Entrant a la tasca ...')
return x+yFitxem-nos que és codi Python del més normalet, sols que hem afegit un
decorador tasks per marcar la funció com a tasca i posar-li el nom. Aquest
nom és opcional, però convé posar-li ja que així evitam que celery li posi
un nom per defecte que podria fer menys portable la nostra aplicació.
També podem veure como podem enviar informació a logger des de la tasca.
Executant el worker
Ara ja podem anar al nostre projecte, si tot ha anat bé tindrem dos arxius:
tasks.py i celeryconfig.py
Executam: celeryd -l info
[2010-11-28 18:44:20,949: WARNING/MainProcess] celery@D820 v2.1.3 is starting.
[2010-11-28 18:44:20,950: WARNING/MainProcess]
Configuration ->
. broker -> amqp://django@192.168.1.10:5672/test
. queues ->
. celery -> exchange:celery (direct) binding:celery
. concurrency -> 2
. loader -> celery.loaders.default.Loader
. logfile -> [stderr]@INFO
. events -> ON
. beat -> OFF
. tasks ->
. tasks.add
[2010-11-28 18:44:20,960: INFO/PoolWorker-1] child process calling self.run()
[2010-11-28 18:44:20,962: INFO/PoolWorker-2] child process calling self.run()
[2010-11-28 18:44:20,963: WARNING/MainProcess] celery@D820 has started.amb això hem creat el nostre primer worker preparat per a executar la tasca que
li diguem (i que estarà dins tasks.py). Per aquest article hem deixat el
worker dins al consola, però es pot deixar com a dimoni. Consulteu el vostre
administrador de sistemes de capçalera per a una configuració acurada. El paràmetre
que li passa indica que volem que generi log en mode info. Fixem-nos que també
ens informa de les tasques disponibles i del nivell de concurrència que tenim, 2
en el meu cas, que és el nombre de processadors del portàtil.
I executam la tasca
Des d'una altra consola executarem l'interpret de Python
>>>from tasks import add >>>result = add.delay(2,3)
Si ara observam la consola del worker veurem alguna cosa semblant a això:
[2010-11-28 18:46:57,783: INFO/MainProcess] Got task from broker: tasks.add[c379421f-fa6a-4917-b45a-4833a9e30ef3] [2010-11-28 18:46:57,830: INFO/PoolWorker-2] [tasks.add(c379421f-fa6a-4917-b45a-4833a9e30ef3)] Entrant a la tasca ... [2010-11-28 18:46:57,879: INFO/MainProcess] Task tasks.add[c379421f-fa6a-4917-b45a-4833a9e30ef3] succeeded in 0.0486330986023s: 5
El brooker (RambbitMQ) ha enviat l'ordre d'execució de la tasca add que el worker té registrada i aquest es disposa a executar-la.
Des de la consola hem dit a la coa que volíem que la tasca s'executàs en modoe asíncron, d'aquí l'ús de delay.
Si ara volem obtenir el resultat farem
>>> print result.get()
5Com es pot veure l'exemple és molt senzill, potser massa per adonar-nos de la potència de Celery. Pensem que en lloc d'una suma podem fer la generació d'un pdf, l'enviament d'un e-mail, la càrrega en batch d'un xml, etc. etc. L'important és que el procés principal ja no té que realitzar la tasca i pot ser una altra màquina l'encarregada de fer-ho. Pensem en una màquina plena de targes gràfiques dedicades al processament numèric, en un sistema encarregat del data-mining dels logs, les possibilitats són infinites.
També és important notar l'escalabilitat que aconseguim amb Celery. No estam parlant ja d'escalabilitat amb nombre de processadors, sinó que parlam d'escalabilitat amb nombre de màquines. Mentre les nostres tasques puguin ser paralelitzades podrem fer servir Celery per a distribuir la càrrega de feina entre les màquines disponibles.
I això és sols el principi: celery pot substituir al Cron, permet la monitorització,
la creació de tasques molt més complexes que les que ens permet una funció i un
llarg etcètera d'opcions. La documentació és força completa, però llevat de
casos molt especial, el grau de dificultat que trobarem és el que hi ha a aquest post.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Introducció a Celery
Escrit per Aaloy a 13 de November , 2010 a les 12:18 p.m.
Introducció a Celery
Celery es una aplicació que ens permet crear tasques de feina asíncrones gestionades per un gestor de cues que està basada en l'enviament de missatges de manera distribuïda. Es focalitza en operacions en temps real però també suporta la calendarització de tasques.
Les unitats d'execució, anomenades tasques, s'executen de manera concurrent en un o més nodes de treball. Aquestes tasques poden executar-se de manera asíncrona bé de manera síncrona (esperant fins que la tasca està llesta).
El sistema de missatgeria recomanat per celery és RabbitMQ encara que és bastant agnòstic en el tema i pot fer servir com a substitut Redis, MongoDB o una base de dades sql.
Encara que el programa va sorgir lligat a Django, actualment és una llibreria que es pot utilitzar de manera independent. S'han creat dos projectes a partir de l'original, Celery manté l'estructura bàsica de la llibreria i django-celery manté la integració amb Django.
Bé, fins aquí la parrafada d'introducció traduïda amb més o menys fortuna de la documentació de Celery, el que estam dien és que celery ens permet executar tasques de manera distribuïda, on el director d'orquestra (si seguim les recomanacions) és una aplicació anomenada RabbitMQ, escrita en Erlang, per cert, que se n'encarrega de rebre les ordres de les tasques que s'han d'executar i les distribueix entre els distints nodes que estan registrats per a executar dita tasca. Aquest director és el que se n'encarrega de saber com està cada tasca i d'obtenir-ne el resultat quan aquesta finalitza, de manera que el programa que ha encomanat la tasca.
Així dons hem de distingir tres actors en tot això, l'aplicació que comana la tasca, l'aplicació que executa la tasca (el worker) i l'aplicació que se n'encarrega de la comunicació entre qui comana la tasca i qui l'execute. La gràcia de tot això és que podem tenir més d'un worker a distintes màquines o a la mateixa màquina, de tal manera que el gestor se n'encarrega de repartir les tasques en funció de qui està lliure per executar-les.
Pensem un noment amb el que això significa: podem passar de tenir una aplicació que ho fa tot, a un conjunt d'aplicacions que poden estar en distintes màquines que col·laboren entre sí. Resumint: ens permet l'escalabilitat horitzontal.
Per què fer servir Celery?
Abans de Celery la meva experiència havia estat amb Beanstalkd, un sistema semblant, molt simple i ràpid. Ara us contaré una batalleta, estant de cap de projecte per Tui España un dels projectes que duia era el de la creació d'un servei web per a la venda on-line de transfers i excursions. La informació estava (i supòs que encara hi és) a una base de dades Oracle i amb una estructura pensada per a introduir-hi informació, de manera que fer una consulta un poc complexa com "vull totes les excursions que hi ha tal dia que es poden fer des de tal punt" era extremadament lent. La solució que trobàrem va ser desnormalitzar la informació passant-la cap a una base de dades Postgresql, un parell mallorquí de milions de registres que s'actualitzaven diàriament.
La primera versió del programa de càrrega estava fet amb Java, va ser complexe de crear, gairebé 3 mesos de feina, mal de mantenir i executant-ho tot amb fils estava gairebé 2 hores en tenir-ho tot carregat.
La segona versió la férem amb Python, una setmana i mitja, un 10% del codi, més funcionalitat i utilitzarem Beanstalk per a distribuir les tasques, ja que la càrrega en sí es podia particionar molt bé. Això ens permeté aprofitar la potència de servidors que estaven ociosos i aprofitar també els temps morts entre la consulta a Oracle, el parseig de la resposta i la introducció a Postgres. A una de les proves posarem en marxa processos a 4 servidors diferents, amb un total d'uns 20 workers i un temps de càrrega d'uns 3 minuts. Amb 2 servidors el temps era d'uns 5 minuts, una millora molt significativa respecte a l'aplicació Java.
Així doncs una de les utilitat que tenim és la de poder distribuir tasques molt pesades entre moltes màquines. Celery el que té molt millor que Beanstalk és una documentació molt acurada, sistemes de monitorització i gestió i en el cas de fer servir Django, la possibilitat de mantenir les tasques dins el mateix projecte.
El segon ús important de Celery és la web. En aplicacions web el que volem és donar la millor experiència d'usuari possible, i aquesta experiència es degrada si l'usuari ha d'esperar molt. El que ens interessa és donar la resposta a l'usuari de que la seva comanda s'està està executant i deixar el servidor web lliure per poder atendre altres peticions. Imaginem-nos per exemple una aplicació de comerç electrònic on l'usuari demana una factura i aquesta li arriba en pdf. En sistemes de molta càrrega la generació del pdf pot degradar la resposta global de la web, el que és interessant és poder enviar la petició de factura a un sistema extern a la web i que sigui aquest l'encarregat de la generació i l'enviament. Aquest sistema no té perquè estar ni tant sols a la mateixa màquina on hi ha l'aplicació web o poden aprofitar-se hores de poca càrrega per a fer-ne la generació i l'enviament.
Anar cap a la complexitat d'arquitectura que representa afegir un sistema de cues asíncron a la nostra aplicació implica voler anar cap a un aprofitament dels recursos i sobretot entendre com funciona la nostra aplicació, què s'ha de fer de manera immediata i què es pot fer de manera asíncrona, saber quines són les tasques més feixugues que ens afecten i com podem paralelitzar-les i distribuir-les. L'altra solució és posar més màquina amb n-mil cores i passar de tot, però a més de ser una opció econòmicament més cara i tècnicament discutible, és una opció a curt termini, ja que si la nostra aplicació té molt èxit pot arribar un moment on ja ni hi hagi màquines més grans o el cost de les mateixes es mengi tot els nostres beneficis. Podem acabar fent feina pel fabricant de hardware i per pagar-ne les llicències associades.
Convençuts? Esper que sí. Un sistema així no és per totes les aplicacions, la complexitat d'instal·lació i manteniment és més gran que tenir tot el sistema en una màquina i sense distribuir, però si teniu necessitats de fer càlculs intensius de manera puntual o tasques per les quals no voleu fer esperar l'usuari Celery és una molt bona solució. A més pensau amb sistemes com el núvol d'Amazon, puntualment podem aixecar-ne tantes instàncies com calgui i executar-ne workers, o imaginem un Datacenter propi on la majoria de servidors estan ociosos, podem posar workers a les màquiens amb mensy càrrega per a que ajudin en els processos pesats. Se'ns obre un ventall de possibilitat pràcticament il·limitat.
En el proper post, instal·lació de Celery, la creació d'una tasca i un exemple d'integració amb Django, així com problemes que ens podem trobar i com a evitar-los.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Gràcies a tots per venir al creant bits: eines
Escrit per Aaloy a 30 de October , 2010 a les 12:14 a.m.
Actualització: Pujats els documents al dropbox
Una vegada més, i ja van quatre el creantbits ens ha servit per carregar piles, per trobar-nos amb amics que feia temps que no veiem. Cares conegudes d'altres trobades (des d'aquí moltes gràcies per el detall de les galletes) i un quòrum impressionant. Se nota que en Pau té tirada :)
Feia estona que volíem fer una altra trobada d'aquestes. Personalment crec que és molt enriquidora pel que representa d'important per nosaltres veure que hi ha molta més gent que s'interessa pel mateix tipus de coses que nosaltres. Com ja he dit altres vegades això me fa tornar la fe amb la professió.
M'hagués agradat poder fer streaming de vídeo, l'hem intentant, però ens ha fallat la connexió. Ja sé que estam a un Parc tecnològic, però ja sabeu com van aquestes coses. A APSL necessitàrem prop de tres mesos en tenir una ADSL i és sols de les normaletes (i cares), res de connexions de 50 Mb que hi ha pels pobles. A veure si la propera vegada hi ha més sort!
Com a telonero de Pau he presentat un grapat d'eines que trob d'allò més interessants per fer feina amb Django, Python i potser fins i tot per complementar altres llenguatges de programació. En Pau per la seva banda ens ha fet una introducció molt clarificadora del que representa fer feina amb Git. M'ha agradat molt la frase de que Git representa una solució tècnica a un problema social, el de la comunicació. En pau m'ha enviat la presentació i la penjaré junt amb la meva tot d'una que pugui.
Moltes gràcies per l'assistència i el suport. En el nostre ànim està el seguir fent més trobades com aquestes. El suport del Parc Bit (Incubit) cedint-nos la sala val a dir que és una de les coses que fan possible que aquest esdeveniments siguin possibles. Ens queda un any i mig d'incubació encara, així que amenaçam amb tornar-hi :)
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django APSL
Creant Bits: eines
Escrit per Aaloy a 19 de October , 2010 a les 6:55 p.m.
El divendres 29 d'octubre a les 16:00h a la sala de formació del Parc Bit tornam amb una nova edició del Creant Bits.
Aquest cop ens fa ganes xerrar un poc d'eines de programació Python, fent cinc cèntims d'utilitat com virtualenv, fabric, pip, ... És a dir, de totes aquelles eines que no poden faltar a la borsa d'un programador Python i que ens permeten ser encara més productius.
Després en Pau Rullan ens explicarà con fer servir Git en el dia a dia. Git, junt amb Mercurial són una de les millors eines de control de versions distribuït que podem trobar. En Pau s'ha ofert a explicar-nos perquè Git li agrada més i com fer-ho servir per a que la complexitat d'aquesta utilitat jugui al nostre favor.
Com sempre aforament limitat a 25 persones màxim. Us podeu apuntar deixant un comentari.
Traducciones/Translations by apertium
25 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python
Flat is better than nested
Escrit per Aaloy a 11 de October , 2010 a les 8:23 p.m.
L'altra dia i gràcies a Jordi Cabot vaig arribar a un article anomenat Groovy for Business Software. Why not?.
L'article és prou interessant i ve a mostrar els avantatges de fer servir Groovy per al desenvolupament web amb la unió amb Java. Groovy està prou bé si un no pot fer servir Python per les raons que sigui, però encara té moltes reminiscències de Java que fa que el codi sigui mal de llegir i lent d'escriure.
Si anam a la consola de Python i feim un
import this
Trobarem de les primeres la frase "flat is better than nested". La idea de que el més simple és millor, que el codi ha de ser el més pla possible i que els anidament s'han d'evitar.
El codi Groovy per crear un XML és
def writer = new StringWriter();
def builder = new groovy.xml.MarkupBuilder(writer);
builder.carList {
for (make in ["Honda", "BMW", "Cadillac"]) {
car(make: make) {
type("sedan")
year("2010")
used("false")
}
}
}
def xml = writer.toString();És un codi prou simple, però quan vaig fer l'exercici de passar-ho a Python vaig tenir que repetir-ho. No vaig veure la tercera clau i vaig generar un XML que no era el de la sortida.
Veiem el codi Python
from lxml.builder import E
from lxml import etree
xml = E.carList()
for brand in ["Honda", "BMW", "Cadillac"]:
car = E.car(make=brand)
car.append(E.tipo("sedan"))
car.append(E.year("2010"))
car.append(E.used("sedan"))
xml.append(car)
print etree.tostring(xml, pretty_print=True)El nombre de línies que s'han fet servir és anecdòtic, l'important és que algú que segueixi el codi ho té molt més bo de fer per entendre'l. L'anidament ha desaparegut i com s'afegeix cada tag a l'xml es veu a la primera, és ben explicit a qui afegim què.
Quan programam ho hem de fer com si algú més que nosaltres tingués que entendre el codi passat un any, ja que quan el temps passa i encara que siguem nosaltres mateixos els qui hem de mantenir el codi, la filosofia de Python de fer les coses el més simple i explícites possible ens pots estalviar moltes hores de depuració.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python
Vídeos de la Djangocon inspiradors
Escrit per Aaloy a 03 de October , 2010 a les 11:29 a.m.
Aquests darrers dies he estat mirant els vídeos de la darrera Djangocon, com a tota conferència hi ha gent que vol una cosa més tècnica i gent que la troba massa tècnica, però particularment trob que al la quantitat de conferències i lightning talks que hi ha qui no ha trobat el que volia segurament és perquè no ha cercat prou.
Jo he trobat molt interessants dues conferències, Scaling the World's Largest Django Application de la gent de DisqUs i Switching addons.mozilla.org from CakePHP to Django de la gent de Mozilla add-ons. M'interessen molt perquè mostre tant els problemes com la capacitat de Django per escalar per aplicacions molt grans, molt més grans del que estam acostumats per les nostres contrades. En el cas de Mozilla les xifres que donen el rendiment de programació estan en la línia del les meves pròpies recerques: una aplicació Django necessita de l'ordre de 3-5 vegades més línies de codi que per fer-la en PHP un framework com Cake.
Aquests projectes tan grans fan que s'hagin de cercar solucions a problemes comuns d'escalabilitat. L'interessant d'aquests conferències és que et diuen tant els problemes que s'han trobat com les solucions. Pel Twitter he postejat algunes vegades referències al projecte Celery el gestor de cues que s'està convertint en l'estàndard de facto per Python i Django i que fan servir aquests projectes. Però també ens ha permet veure com utilitzen Sentry una eina per la gestió unificada de logs.
Sentry és una aplicació integrable amb Django que ens permet unificar els nostres logs en un únic servidor i integrar les notificacions d'error i incidències al nivell que vulguem i com vulguen. Ho podem posar integrat dins la nostra aplicació o tenir un servidor independent i fer que els n servidors que composen la nostra aplicació enviïn els missatges per http o per una coa Celery. La solució és força elegant i potent, de fet força més potent del que es pot trobar per Java/J2EE i és una solució a un dels problemes més comuns quan es tenen múltiples servidors: la necessitat de tenir logs unificats per saber què està passant i a on està passant.
Encara em queden força conferència a veure, però tampoc vull endur-me'n un empatx, i a més s'ha de tenir temps per avaluar altres projectes més propers. Per exemple, en aquests moments estic avaluant si per les aplicacions que feim és millor disposar d'un blog separat amb WordPress o bé d'un blog, potser visualment menys atractiu, però que s'integri totalment amb les aplicacions Django. Encara no tenc cap conclusió en ferm, però ara per ara la flexibilitat que ens dóna la integració.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Entorns virtuals
Escrit per Aaloy a 12 de September , 2010 a les 12:18 p.m.
Quan un es dedica a la programació seriosa amb Python (ja sigui amb Django o amb qualsevol altre framework) hi ha un parell de coses que s'han de tenir en compte: saber amb quina versió de Python programarem i si aquesta versió estarà suportada per la distribució del servidor de producció és una d'elles, potser la més simple. Una altra un poc més complexa és la de plantejar-nos des del principi com durem el mantenimient de l'aplicació.
Amb els servidors dedicats cada cop a més bon preu, no és genys extrany plantejar-se tenir un servidor dedicat per les nostres aplicacions web en Python per exemple. És també molt habitual que les aplicacions tenguin un cicle de vida molt més llarg que les llibreries que hem utilitzat per a crear-les. Ara podem fer servir la versió 1.2.3 de Django, però d'aquí tres o quatre mesos tindrem la 1.3, amb altres llibreries pot passar una cosa semblant.
Quan tenim una aplicació en producció la màxima sempre ha de ser la de si no està trencat no ho arreglis. Si la nostra aplicació funciona amb Django 1.1 i hem anat aplicant els pegats de seguretat, llavors plantejar-nos migrar a una versió major és quelcom que s'ha de plantejar amb cura i sempre tinguent en compte la relació risc benefici que comportarà l'actualització. Així doncs ens podem plantejar no actualitzar una aplicació, però no per això les seguents aplicacions que desenvolupem tenen que fer-se forçosament amb llibreries antigues.
Com manteneir doncs entorns separats? Si instal·lam les llibreries a nivell de la nostra distribució de Linux preferida l'actualització de llibreries i fins i tot del mateix Python es farà a nivell de tot el sistema. Necessitam quelcom que ens aïlli tot allò que utilitzam a la nostra aplicació. Aquesta eina té un nom: virtualenv creada per l'omnipresent Ian Bicking.
Aquesta utilitat ens crea un entorn separat de Python amb les llibreries que nosaltres hi instal·lem. Si no li deim res utilitzarà també les llibreries del sistema posant-les al PYTHONPATH, però també podem fer que la separació sigui del tot completa fent servir l'opció de '--no-site-packages'. Aquesta opció fa que l'entorn virtual no faci servir cap llibreria del path del sistema i ens permet instal·lar-ho to. És l'opció que a mi m'agrada més, encara que signfifiqui perdre més temps amb la instal·lació, em dona la seguretat de que sé exactament tot allò que necessit per la meva aplicació.
El manual del virtualenv està prou explicat, però tot i això jo no recomanaria fer-lo servir a pèl, sinó amb l'ajud de una altra utilitat anomenada virtualenvwrapper de Dough Hellman.
Aquesta eina ens permet gestionar de manera molt senzilla els nostres entorns virtuals, posar-los en un únic punt del sistema i ens proporciona una gran quantitat de hooks que ens permeten definir que volem fer cada cop que es crei un entorn virtual, o que s'elimini, o que s'activi o desactivi.
Així, per exemple, podem fer que cada cop que activem un entorn virtual s'actualitzi el repositori del control de versions, o que ens situi al punt exacte on tenim el codi. Si sempre feim servir Django als nostre projectes podem fer que cada cop que es crei un entorn virtual se'ns instal·lin també les llibreries que més utilitzam.
Per acabar-ho de rematar la utilitat pip instal·lador avançat de codi Python del que ja he parlat en altres apunts, s'acobla molt bé als entorns virtuals, fins i tot li podem dir que no instal·li res si no estam a un d'aquests entorns.
Si feim servir un entorn virtual i pip podem utilitzar llavors la comanda pip freeze quen es dirà exactament què hi ha a l'entorn virtual: paquets i nombre de versió o revisió quan s'ha instal·lant des de codi font. Així podem crear fàcilment un fitxer de requermients pip i asseguar-nos que quan posem l'aplicació a producció les llibreries que es facin servir siguin exactament les mateixes que hem fet servir a desenvolupament.
Si us plantejau fer servir Python en els vostres desenvolupaments un dels millors consells que us puc donar és que dediqueu unes quantes hores a estudiar virtualenv, virtualenvwrapper i pip, la vostra vida a partir d'aquest moment ja no serà la mateixa.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Quina calor!
Escrit per Aaloy a 28 de August , 2010 a les 12:24 p.m.
Aquestes darreres setmanes han estat d'allò més interessants, caloroses però interessants.
La calor ha vingut fonamentalment d'uns dies que hem passat a Menorca. Ja hi havia anat una vegada de vacances i me va encantar, aquesta vegada no ha estat diferent, encara que hi havia molta més gent que la darrera vegada.
Però no vull donar enveja, així que també toca parlar de programació. Aquests dies hem estat i encara estarem durant unes quantes setmanes més, fent feina amb un projecte que implica fer feina amb un cms anomenat ezPublish.
L'ezPublish és un CMS prou potent, orientat a treure continguts sigui com sigui. Tu escrius el que sigui a la part de l'administrador i l'eZ intentarà renderitzar-ho com pugui. Supòs que si el que importa és el contingut en sí això és fantàstic, però quan es tracta d'afegir-hi regles de negoci per damunt eZPublish és un malson comparat amb frameworks com Django.
Està clar que no podem fer una comparació justa ja que ezPublish no té la flexibilitat d'un framework però crec que l'experiència serveix per reafirmar-me amb l'apreciació de que si el teu negoci no és generar continguts sinó que vols controlar el que passa a la web i per exemple vendre el teu producte, construir l'aplicació directament damunt un CMS és un malson.
Moltes aplicacions necessiten d'un CMS, bàsicament per independitzar la creació de planes del programador que ha fet l'aplicació, però això no vol dir que el CMS tengui que ser l'aplicació. El CMS no ha de ser intrussiu, hauria de limitar-se a una backoffice potent i a ser possible integrable i una API per poder accedir als continguts de la manera que nosaltres vulguem.
El CMS ens permet començar molt ràpid a afegir texts, però com dic, si la nostra web no és estrictament de continguts aviat el CMS es converteix en un problema, ja que te condiciona la manera de fer les coses. Personalment preferesc sol.lucions com Django Page CMS que funcionen a mena de plugin per a les nostres aplicacions. Sóm nosaltres que decidim quin contingut es presenta i com. Potser la interfície no és tan virguera com altres CMS dedicats, però al manco el CMS no es posa en el nostre camí i no ens condiciona.
Un altre CMS per Django que darrerament m'està agradant molt és el projecte Django cms. Si bé és pot considerar ja un CMS en sentit habitual, segueix essent poc intrussiu, podem afegir tant plugins propis del CMS com seguir amb les aplicacions Django que vulguem i l'administrador seguirà funcionant.
Una altra aproximació per Django és lfcms però en aquest cas més que "per Django" hauríem de dir fet amb Django. Aquí ja parlar d'un CMS complet amb el seu propi administrador que és extensible mitjançant plugins fets amb Python. La interfície està molt cuidada i és un CMS a tenir molt en compte si la nostra aplicació és bàsicament de continguts. L'emperò més gran és que necessitam accedir a dues interfícies per fer algunes coses. Per exemple si tenim contingut estructurat i contingut textual, el contingut estructurat l'haurem de gestionar per l'administrador de Django (o fer-ne un nosaltres) i el textual pel backoffice de lfcms. He d'investigar-ho un poc més potser hi ha una manera d'aprofitar tota la fona feina que han fet la gent de lfcm a la interfície.
Un altre CMS prou interessant és un nouvingut anomenat Merengue presenta unes característiques prou interessants com la senzillesa amb que gestiona els temes o la edició col·laborativa (no l'he provada per això), però no té ben lligat el concepte de planes i contingut. No he vist cap vista al backoffice que ens permeti veure clarament la jerarquia de planes. El contingut s'estructura mitjançant una llista plana i perds la referència de l'estructura de la web. Potser s'ha duit a l'extrem la separació dels continguts de la presentació, però al meu entendre tenir una visió esquemàtica dins l'administrador del que hi ha a la web facilita molt la vida a la persona que ha de posar els continguts. Això però, no és un impediment no no s'han de crear moltes planes o el lloc web té una estructura molt fixa, ja que com altres opcions que he presenta aquí, el CMS permet gestionar el contingut directament des de la part de visualització. Merengue apunta maneres i convidrà fer-hi un seguiment de ben a prop.
Però un CMS no és res sense un bon disseny. Crec que l'equip ideal de desenvolupament està format per un dissenyador/maquetador, un parell de programadors i un tècnic de sistemes. En un grup així es maximitza la productivitat, però sempre se pot aspirar a més.
Per això quan tenc una estona estic jugant també amb un micro-framework anomenat bottle amb la idea de facilitar la feina de maquetació amb html pur. És veritat que es podria fer amb Django però la idea és comptar amb una via de visualitzar planes web i trocejar-les amb seccions que no requereixi pràcticament instal·lació i permeti fer maquetes ràpides i tener un prototip funcional que sigui molt bo de modificar. Una vegada el prototip està funcionant passar-ho a plantilles Django és trivial.
Com trivial és gestionar una empresa amb OpenERP. Un complet sistema ERP desenvolupat amb Python i que particularment amb té el cor robat. Ja tenim vàries instàncies funcionant i com que no ha de ser allò que diuen de "en casa del herrero...", una de les primeres gestions que tindrem serà la d'APSL. Si us estau plantejant deixar el Contaplus o semblant o voleu saber en temps real l'estat dels vostres comptes, fer factures i gestionar la cartera de clients, OpenERP és ideal, ja que pots externalitzar tota la part de comptabilitat i fiscal i dur el dia a dia del negoci gràcies a la potent interfície web que té. És un d'aquests projectes que fa anys que segueixo, des de que era TinyERP i el darrer any i mig ha arribat al volum crític que l'ha permès créixer exponencialment en funcionalitat i potència.
El que deia, molta calor, però no sé si és el sol o la quantitat de 'hot software' que he ha al voltant del l'ecosistema Python.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Haanga vs Django vs Tornado
Escrit per Aaloy a 15 de August , 2010 a les 5:42 p.m.
L'altra dia es va alliberar un llenguatge de plantilles inspirant amb Django anomenat Haanga patrocinat per Meneame.net.
Crec que això és una bono notícia, tenc la mala sort que quan he de tocar codi PHP sempre m'he trobat en que la separació de codi i lògica de presentació directament no hi és. Supòs que perquè els llenguatges de plantilles que hi ha són massa feixucs com per a que un programador de PHP se'ls plantegi en el seu dia a dia.
La sintaxi de plantilles de Django és lleugera per al programador/maquetador: és bona d'aprendre i molt poc intrussiva. Així que Haanga al meu entendre és un gran avanç, ja que té la senzillesa de Django i lleva l'excusa de la velicitat que sovint et donen alguns progrmadors de PHP per posar-ho tot junt, ja que compila les plantilles a PHP, amb la qual cosa tenim tots els beneficis i molt pocs emperòs.
Ricardo al seu blog fa una comparació de velocitat però s'ha de dir que no és ben bé justa, ja que no estam comparant el mateix, no en el cas de Django i Haanga al manco, ja que la comparació s'està fent en peticions per segon i contra el framework i no directament contra la part de plantilles. El framework de Django és quelcom més que les plantilles, aquestes són una part important però anecdòtica en termes de codi, ja que és força senzill canviar de motor de plantilles cap a qualsevol altra. El realment important d'un framework com Django és la facilitat que et dona per escalar tant en màquines com en programadors. L'estructuració del codi i el model MVT fa que sigui molt més senzill reaprofitar codi i mantenir codi existent.
Així doncs una comparació més justa seria la de generar les plantilles sense tenir en compte la part del framework. Per a ser justs també hem de modificar un poc el codi, Haanga fa ús de la compilació, però Django pot fer quelcom semblant, és a dir, podem cachejar les plantilles i reutilitzar-les, això, que ja era pràctica habitual en versions anteriors s'ha estandaritzat en la 1.2.
Si volem més velocitat llavors hem de començar a sacrificar funcionalitat, potser haurem d'anar cap a llenguatges de plantilles que facin el mateix que Haanga, és a dir, compilar el codi, en aquest cas a Python. Un bon exemple d'aquesta mena de llenguatges és el llenguatge de plantilles de Tornado o el de Mako. El primer és força interessant, ja que és d'un nivell de senzillesa i extensibilitat comparable Haanga.
He fet uns petits benchmarks considerant el cas més real, que és el de la generació del header.html. Per a fer la comparació justa he cachejat la compilació de plantilles tant en Django com Tornado, i en el cas de Django he utilitzat sols la part de plantilles. Per exemple el test b2_tpl.py queda:
from django.conf import settings
from django.template import Context
from django.template.loader import get_template
import time
settings.configure(TEMPLATE_DIRS=('../templates',), DEBUG=False,
TEMPLATE_DEBUG=False)
class Info(object):
def __init__(self, i, epoch):
self.i = i
self.epoch = epoch
t = get_template('b2_tpl.html')
x = ( Info(i,time.time()) for i in range(1,100))
for i in range(1,100):
print t.render(Context({'objects':x}))En poques paraules: no hem de programar amb Python/Django como ho faríem en PHP. Per cert pos l'exemple perquè consider que és ideal per veure com es pot fer un script fent us de Django però sols agafant les parts de configuració que ens interessin. Podeu trobar més informació a l'apunt de b-list.
La part de benchmarks de Tornado està inspirada en el treball de Rolando Espinoza sols que he llevat la part de Tornado i he utilitzat sols la part de plantilles.
He fet servir la instrucció time per obtenir els temps i n'he fet la mitja de 5 execucions enviant la sortida a un arxiu.
El resultat és que Haanga ens dóna un temps de 0,1798s, Tornado un temps de 0,099s i Django un temps de 0,3438s. En termes relatius Tornado és 1,8 cops més ràpid que Haanga i 3,5 cops més ràpid que les plantilles de Django. A la seva vegada Haanga és 1,9 vegades més ràpid que les plantilles de Django.
Que Tornado sigui més ràpid no vol dir que tenguem que deixar el llenguatge de plantilles de Django. Hi ha més coses a més de la velocitat pura. Un usuari realment no notarà si la plantilla es genera en 3 o en 1 milisegon però sí que ho notarem a l'hora de mantenir l'aplicació el poder haver fet ús dels avantatges de les plantilles de Django. S'ha d'optimitzar on calgui.
En el cas de PHP i Haanga el consell però seria el de tirar-s'hi de cap. La mantenibilitat que dona tenir el codi separat en plantilles compensa de sobres els pocs milisegons de retard que tindríem el primer cop que es generàs la plantilla en PHP i la gent que tengui que mantenir el codi PHP us ho agrairà.
Enhorabonoa a crodas i a la gent de Menéame per a esponsoritzar un projecte així i obrir-lo al món.
PS. Hi havia un projecte del Google Summer of Code que anava en la línea de Haanga però per Django d'Alex Gaynor, però pel que es veu al final Alex es va decidir cap a un projecte relacionat amb bases de dades no relacionals per Django.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Integració del TVP CECA
Escrit per Aaloy a 26 de July , 2010 a les 8:20 p.m.
Després de barallar-m'hi un bon grapat de dies he aconseguit integrar el TPV de CECA en una de les aplicacions que estic desenvolupant per APSL. Com en el cas de la integració amb el BBVA he de dir que la qualitat de la documentació és inversament proporcional al suport que tens dels tècnics, per a que quedi clar: la documentació és pèssima, plena de inconsistències i exemples que no funcionen. El suport dels tècnics de CECA molt bo. Poc temps per a contestat (llevat de si demanes en divendres, clar) i respostes clares i concises. Un deu! Amb la gent del BBVA el mateix, se coneix que els ha tocat bregar amb la documentació.
No acab d'entendre què costa mantenir la documentació actualitzada. Si ja no es fa servir un programa per a generar la firma, llavors es refà la documentació i se'n lleva la referència. Si s'incorpora un tag obligatori nou que s'ha d'enviar, llavors s'actualitzen els exemples.
Per si a algú més li serveix faig cinc cèntims del que m'he trobat i del que funciona a l'hora d'escriure aquest apunt.
Generació de la firma
La firma és diferent per l'enviament i per la resposta. En ambdós casos es fa servir el xifrat sha1
Per l'enviament hem de fer una concatenació formada per:
clau_encriptació
merchantid
adquirerbin
terminalid
num_operacion
importe
tipomoneda
exponente
referencia
SHA1
url_ok
url_nokEl que és cada cosa està a la documentació, aquí el que s'ha de saber és: SHA1 és una cadena de caràcters i és necessari posar-la. La referència apareix a la documetació, però NO s'ha de posar, millor dit, és una cadena buida. El número d'operació és el que identificarà la nostra operació i vendrà també a la confirmació així que convé (i és necessari) que sigui un codi numèric únic. L'import és un nombre on les dues posicions representen els decimals, així 12.23 passa a ser 1223. Damunt la concatenació s'ha de fer l'sha1 i passar-ho tot a una cadena hexadecimal i a minúscules. Per exemple:
m = hashlib.sha1() m.update(s) valor = m.hexdigest().lower()
El calcul de la firma per la signatura de la resposta és diferent: clave_encriptacion merchantid adquirerbin terminalid num_operacion importe tipomoneda exponente referencia
Fixau-vos que no hi ha SHA1 aquí i com a cosa important l'import s'ha de posar tal com ve de la resposta, veureu que ve completat a zeros per l'esquerra. En aquest cas la referència sí que ve i està generada per la pasarel·la de pagament.
Enviament de les dades
<form id="pago_form" action="{{url_ceca}}" method="post" accept-charset="utf-8" enctype="application/x-www-form-urlencoded">
<input id="MerchantID" name="MerchantID" type="hidden" value="{{merchant_id}}"/>
<input id="AcquirerBIN" name="AcquirerBIN" type="hidden" value="{{acquirer_bin}}"/>
<input id="TerminalID" name="TerminalID" type="hidden" value="{{terminal_id}}"/>
<input id="firma" name="Firma" type="hidden" value="{{firma}}"/>
<input id="importe" name="Importe" type="hidden" value="{{importe}}"/>
<input name="TipoMoneda" type="hidden" value="978"/>
<input name="Exponente" type="hidden" value="2"/>
<input id="referencia" name="Referencia" type="hidden" value=""/>
<input name="URL_OK" type="hidden" value="{{url_ok}}"/>
<input name="URL_NOK" type="hidden" value="{{url_nok}}"/>
<input name="Pago_soportado" type="hidden" value="SSL"/>
<input name="Cifrado" type="hidden" value="SHA1"/>
<input name="Idioma" type="hidden" value="1"/>
<input name="Descripcion" type="{{descripcion}}"/>
<input type="submit" value="Comprar" />
</form>Si mirau la documentació veureu que qualsevol parescut amb els exemples és pura coincidència. Tots els camps hi són però no hi ha cap exemple que funcioni amb els camps que hi ha. L'import ha d'estar en el mateix format que la firma, és a dir com a nombre sencer on les dues darreres xifres representen la part decimal.
És important notar que la referència viatja buida i que s'ha de posar el camp Cifrado. L'exemple està agafat d'una plantilla Django i preparat per a funcionar amb Euros com a moneda i en castellà com a idioma.
Rebre la resposta
CECA us enviarà la resposta en un POST a la url que l'indiqueu. Ja he comentat abans el tema de la firma. Convé comprovar sempre que la firma de l'operació calculada amb els paràmetres que ens ha donat CECA coincideix amb el que rebem, d'altra manera implicaria que algú altra està intentant validar l'operació de pagament i marcar-la com a correcta quan no seria així.
Si feis com nosaltres la integració fent servir Django heu de tenir en compte que la protecció CSRF evita que pugui enviar-se un post com el que necessitam, així que hem de marcar la url com a exempta d'aquesta protecció. No fa gaire gràcia, però com a protecció addicional convindrà configurar el firewall per a que sols accepti peticions cap a la url confirmació des de les IPs de CECA.
Com a consideracions importants heu de tenir en compte que CECA passarà l'import completat a zeros per l'esquerra i que heu de guardar la referència i el camp Num_aut, ja que són els dos camps que CECA us demanaria en cas de reclamació. El camp Num_operacion se correspon amb el nombre d'operació que nosaltres hem enviat i ens servirà per a localitzar i processar la venda.
Esper que la informació sigui d'utilitat.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python APSL Django
Comparant Python i PHP: Xor encryption
Escrit per Aaloy a 18 de July , 2010 a les 10:26 a.m.
Quan xerram de Python una de les coses en que es fa més èmfasi és la claretat i expressivitat del llenguatge, que ens permet posar les nostres idees en forma de codi de manera ràpida i a més entenedora.
També és important remarcar que Python sovint necessite moltes menys línies de codi per fer el mateix que altres llenguatges, ja no dic un C, C++ o Java, sinó que un PHP, ja sigui per la pròpia potència de Python o bé per que ja hi ha una llibreria estàndard que té implementada aquella funcionalitat que cercam.
Aquesta setmana estava fent una integració amb la passarel·la de pagament del BBVA i m'he trobat amb un d'aquests casos. Per a la comunicació de les dades BBVA signa l'enviament i ho encripta fent servir l'algoristme d'encriptació xor. A la docuentació hi ha un exemple de vàries planes de codi de com es fa això amb PHP i Java/JSP.
Podeu trobar un exemple de com es fa amb PHP al SicilianGirl o també a l'IES Puig Castellar
La implementació de l'encriptació XOR en PHP, treta d'un snippet de php és:
function XOREncryption($InputString, $KeyPhrase){
$KeyPhraseLength = strlen($KeyPhrase);
// Loop trough input string
for ($i = 0; $i < strlen($InputString); $i++){
// Get key phrase character position
$rPos = $i % $KeyPhraseLength;
// Magic happens here:
$r = ord($InputString[$i]) ^ ord($KeyPhrase[$rPos]);
// Replace characters
$InputString[$i] = chr($r);
}
return $InputString;
}En Python això es faria així:
from itertools import izip, cycle def xor_crypt_string(data, key): return ''.join(chr(ord(x) ^ ord(y)) for (x,y) in izip(data, cycle(key)))
Python és un llenguatge molt potent, i part d'aquesta potència és la possibilitat de fer servir la programació funcional i els iteradors.
Com el seu nom indica cycle va retornant elements d'un iterable de manera cíclica, és a dir que quan arriba al darrer torna a començar.
izip té un nom potser més confús, ja que no té res a veure amb el popular format de compressió, és un iterador que donats dos iterables (dues llistes de caràcters en el nostre cas) ens retorna cada vegada una parella d'elements on el primer element pertany a la primera llista i el segon element a la segona.
Fixau-vos que el cycle ens permet eliminar el codi que manté el comptador al PHP, és a dir $rPos i tot el relacionat amb ell.
Una altra raó més per fer servir Python! :)
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: Python
Cerca i substitució a Vim
Escrit per Aaloy a 17 de July , 2010 a les 11:13 a.m.
Ahir volia substituir una paraula però sols dins un bloc de codi concret. Per les presses no vaig anar a cercar com fer-ho amb Vim (la primera opció que vaig provar no va anar bé), però me va quedar el cuquet de com fer-ho, així que un poc de cerca a Google m'ha duit fins a aquesta recepta.
A Vim podem seleccionar blocs de texts entrant en mode visual (v, V o Ctrl+V per seleccionar en columnes).
Quan tenim el text seleccionat pitjarem : per entrar en mode comandes i en sortirà l'editor amb
:'<,'>
Això ens indica que podem començar a escriure la comanda, entre d'altres la d'edició i substitució. Així doncs bastarà teclejar s/{patró de cerca}/{patró de substitució}, el que feia jo malament era posar un % davant la essa.
Tot i la selecció que hagem fet, aquest tipus de substitució sols funciona per a línies completes, en la majoria de casos ens bastarà, però si volem liminar-nos exactament a la columna que hem seleccionat, hem de limitar més la cerca. Vim ens permet utilitzar %V per restringir la cerca al que volem. Així, la nostra cerca serà:
:%s/\%V{patró de cerca}/{patró de substitució}/gCom a curiositat destacar que la barra de separació de bloc entre cerca i substitució no té perquè ser una barra, pot ser qualsevol caràcter que ens agradi.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Vim IDE
El cicle de desenvolupament
Escrit per Aaloy a 11 de July , 2010 a les 10:51 a.m.
L'altra dia vaig tenir l'ocasió de parlar amb un responsable informàtic d'una empresa gran. Una conversa llarga però entretinguda, afegiria.
El cas és que en un moment de la conversa l'home va venir a dir que abans es pensava molt més a l'hora de programar, que com que el temps de CPU era molt més car, llavors els programadors s'havien de pensar molt el que feien, que els programes tenien menys errors d'entrada.
La veritat és que no tenc dades estadístiques de la quantitat d'errors que hi podria haver, però també és veritat és que pareix que la taxa d'errors per línia de codi és una constant que s'ha mantingut pràcticament constant al llarg del temps. De fet és una de les raons per elegir llenguatges d'alt nivell respecte a llenguatges de baix nivell a l'hora de programar, ja que hem d'escriure menys línies de codi, llavors la quantitat total d'errors introduït també serà menor.
Així doncs, tenir molt repensant els programes a l'hora de picar-los no feia que tinguessin menys errors, sinó que sintàcticament eren correctes. Però la gràcia dels analitzadors de codi actuals, dels compiladors, és que permeten caçar tots aquests errors de manera ràpida.
És a dir, actualment es pot teclejar el codi directament a l'editor, compilar-lo (o no si feis servir un llenguatge interpretat) i provar-lo en un cicle de realimentació ràpid. El que estam fent és aprofitar la tecnologia al nostre favor, deixar que l'ordinador caci els errors de sintaxi i ens avisi dels errors més obvis. En definitiva el que estam fent és aprofitar-nos de que l'hora de CPU té un preu al voltant de zero, superant en molt el cost de l'hora de programador.
Els programes s'han fet més complexos, amb més línies de codi, on cada vegada hi ha més capes i més distribució, i això fa que les tècniques de programació i testeig també hagin evolucionat. Encara tenim que picar el codi, però podem fer-ho directament a l'ordinador, no hem d'esperar per saber si el codi té errors de sintaxi o no, i això ens fa més productius i evita temps d'espera. Això no vol dir que els programador siguin ara més descuidats en el seu codi ara que abans, sinó que senzillament poden dedicar-se més ara a la funcionalitat i no tant a tenir que validar manualment que tota la sintaxi del programa sigui correcta.
Personalment no he tingut que tractar amb mainframes i amb el tipus de programació i feina de la que parlava el meu interlocutor, però tenc clar que en informàtica com en altres coses el temps passat no era millor. Potser ara el veim amb nostàlgia, però la realitat és que ara comptam amb una gran quantitat d'eines i ajudes a la programació que fan que el programador pugui destacar per la seva creativitat i coneixements i no per la seva habilitat mecanogràfica.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Django caché invalidation
Escrit per Aaloy a 04 de July , 2010 a les 4:32 p.m.
Un dels problemes més importants del desenvolupament d'aplicacions web que necessiten suportar una gran quantitat de visités és el de decidir com es farà l'arquitectura de caché i quan i com s'invalida el contingut de la mateixa.
Al respecte he trobat dues presentacions realment excel·lents de la Djangocon:
Les dues són molt bones, però especialment us recoman la segona si voleu passar una estona divertida a més d'aprendre com funciona el tema de les cachés. Jared Kuolt broda una presentació plena d'ocurrències, dobles sentits i acudits freaks al mateix temps que aconsegueix introduir-nos en la problemàtica de les cachés.
La primera presentació té moltíssima informació, Michel Malone de Pownce explica els problemes que s'han trobat a Pownce i com els han anat solucionant a Django.
El problema fonamental de les cachés a Django és el tema de la invalidació. Django oculta bastant el nom de les claus que genera i sense aquestes claus un no pot anar a Memecached per invalidar-les.
La sol·lució passa invariablement per generar les nostres pròpies claus de manera repetible i fer un us dels signals de Django per a realitzar la invalidació de les cachés.
Això vol dir ser conscients de com està construïda la nostra aplicació, saber com es genera cada plana i poder enviar el senyal adeqüat per a que s'invalidi la caché quan es modifica cert contingut.
Per llocs amb una càrrega mitjana, les eines per defecte que ens dóna Django són més que suficients. El problema ens ho trobam quan tenim llocs amb mil·lions de visites o bé, quan tenim un lloc web amb relativament poques visites però on l'usuari no és conscient de la importància que té servir les planes ràpidament i per tant de la importància de les cachés.
És el tipus d'aplicació que necessita que qualsevol tipus de canvi es vegi reflexat de manera immediata a la web. Si el lloc és petit, senzillament es pot invalidar tota la caché, si el lloc comença a tenir moltes visites aquest tipus d'invalidació no és convenient i ens trobam gairebé amb la mateixa necessitat d'invalidació de cachés que poden tenir llocs amb moltes més visites.
Jared diu a la seva presentació que el tema del rendiment d'una aplicació web és soluciona amb ^ca(sh|che)$. Personalment crec que les dues opcions van lligades, ja que encara que no es faci la despesa en hardware, un lloc web que requereixi um molt bon rendiment i a la vegada tengui poca inversió amb ferro, necessitarà d'una gestió molt fina de les cachés i de la seva invalidació.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
L'editor de codi perfecte
Escrit per Aaloy a 26 de June , 2010 a les 10:29 a.m.
Amb la nova versió d'Eclipse Helios vaig donar una nova oportunitat a aquest entorn de desenvolupament. A primer cop d'ull no hi ha cap novetat espectacular, més si un no es dedica a la programació Java. La primera cosa que sobta és que no duu suport nadiu per Python, ni tan sols com a resaltat de sintaxi. D'això ja n'estava acostumant versió rera versió, però donat la gran empenta de Python dels darrers anys, pensava que Eclipse ja ho hauria inclòs entre els llenguatges més populars. Les enquestes de popularitat es fan de manera ben estranya a ca'n Eclipse.
Vaig instal·lar doncs PyDev amb la seva versió de desenvolupament, que és compatible amb Helios. Suport de sintaxi Python, depuració, autocompletat, etc. etc. Tot el que un pot desitjar, fin i tot un tímid suport per Django.
Tot aquest entorn, aquesta integració, té un preu en forma de consum de memòria. Prop de 800 MB, massa pel portàtil amb 2 GB de RAM que faig servir a casa.
El fet, però és que això fa que em plantegi el perquè d'estar provant editors per a programació. Supòs que com en el cas de les eines, sempre estam cercant la bala de plata, l'eina perfecta que ens farà més productius. O potser és perquè ens agrada tafanejar, mirar què hi ha de nou i les noves virgueries que incorpora cada nova versió de l'entorn de desenvolupament.
El fet, però, és que la productivitat no ens la donarà canviar d'eina de desenvolupament, el més segur que el canvi impliqui una pèrdua de productivitat a curt i mig plaç. La vertadera productivitat la tenim quan agafam un editor/entorn potent (posau aquí el que us agradi) i ens dedicam a conèixer-lo en profunditat, a personalitzar-lo i adaptar-lo a les nostres necessitats diàries de feina.
Una cosa tan senzilla com que l'editor ens deixi definir macros i crear plantilles pot augmentar la nostra productivitat en un tant per cent molt major que la nova rentada de cara de l'IDE i les noves icones.
Per tant, i supòs que ja ho sospitàveu, l'editor perfecte no existeix. Potser existeix un editor que s'adapta a una persona i feines concretes i que és el millor per aquesta persona en aquell moment, però tot i això, aquesta perfecció no s'aconsegueix d'entrada, sinó una vegada dominat l'editor en profunditat.
Personalment m'agrada provar nous editors i entorns, no puc evitar aquesta recerca de l'eina perfecta com si es tractàs de la font de l'eterna joventut. Però pel tipus de feina que estic fent ara crec que he trobat el meu editor perfecte: Vim i un bon munt de complements.
Però que sigui "perfecte" per mi, no vol dir que sigui perfecte per un altre. Si un fa feina fonamentalmetn amb javascript i css potser i no toca per res la consola de línea de comandes potser un Eclipse+Aptana li anirà millor, o el Notepad++ si fa feina amb Windows.
El crec que és important és decidir-se i donar una oportunitat a l'editor o entorn que vulguem utilitzar durant un temps, estudiar-lo un poc, fins i tot llegir-ne la documentació. Sols d'aquesta manera l'editor es convertirà en un factor de productivitat més.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica General Linux Python
Migració a postgres des de sqlite
Escrit per Aaloy a 13 de June , 2010 a les 2 p.m.
Pels qui no ho sabíeu aquest blog corria damunt una base de dades sqlite3. La base de dades és prou ràpida per les necessitats d'un blog com aquest, però té un emperò considerable: consumeix molta memòria comparada amb un mysql o postgresql. Quan el blog duia una parell de setmanes amb visites que consultàven molts apunts, sqlite començava a cachejar i el consum de memòria de l'aplicació del blog es disparava fins als 160 Mb, mass si ho comparam amb altres aplicacions tant o més complexes que executant-se amb Postgresql estàven entre 30 i 50 Mb. El consum de Postgres és una altra cosa, però com que es reparteix millor entre les aplicacions el resultat final és un estalvi de memòria.
El procés per passar d'sqlite3 a Postgres ha estat el següent:
-
Feim un dump de les dades cap a json. Això es pot fer des de Django amb la comanda
dumpdata, per exemple:python manage.py dumpdata contenttypes > dumps/contenttypes.json
He fet dumps de sites, auth per la part d'usuaris, contenttypes, i després de tota la resta d'aplicacions que fa servir el blog.
-
Cream la base de dades i l'usuari a Postgresql que farem servir, donant-li permisos de creació de taules.
-
Anam a l'aplicació i canviam la connexió de base de dades de sqlite3 a postgres. Per aixòs basta canviar el DATABASE_ENGINE cap a
postgresql_psycopg2i establir el nom de la base de dades i el password. -
Executam la comanda
syncdb. Això ens crearà les estructures de dades que necessitam i ara ja poden amar restaurant les dades.
En el meu cas hi ha aplicacions que modifiquen el contenttypes quan es fa el sycndb, de tal manera que abans de restaurar he fet un trunc contentypes cascade a la base de dades.
-
Restauram, per exemple:
python manage.py loaddata ./dumps/auth.json
Anam repetint el procés. Començam per contentypes, després per sites, després per auth i després per les nostres aplicacions segons l'ordre de dependències que tenguin.
Això és tot, comprovam que tot és al seu lloc i recarregam l'aplicació.
A més he aprofitat que és diumenge per provar més coses. Això implica que el blog pot veure's una mica afectat, ja que vull provar errors 404, 500, ping cap a google i altres coses que vull provar en real.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Si és dolent t'ho recomano
Escrit per Aaloy a 12 de June , 2010 a les 10:30 a.m.
"Si és dolent t'ho recomano " és el títol d'un llibre d'Steven Johnson que he estat llegint aquests dies.
Al llarg de 262 planes Johnson ens va exposant la seva teoría de com gràcies al que normalment s'anomena com a "cultura de masses" la gent ha anant desenvolupant la seva intel·ligència, de manera que en terme mig, el comú de la gent puntua millor en els tests d'intel·ligència del que ho farien mig segle abans.
Johnson anomena a aquest efecte "la corba del Dormilega" en referència a una película de Woody Allen, The Sleeper. Johnson diu que els videojocs, les trames de les nostres sèries preferides, els realities, ... s'han fet tant complexos de seguir que la gent està desenvolupant els mitjans intel·lectuals per a aconseguir-ho gairebé sense adonar-se.
Les sèries de trames molt simples han deixat pas a sèries com a Lost, 24 o Los Simpsons, amb múltiples trames i referències amagades que el lector ha de descobrir. Els videojocs han passa del comecocos a completes aventures gràfiques on el jugador ha d'anar descobrint i resolent enigmes.
Aquest camí cap a la complexitat fa que els nostres serveix s'estiguin entrenant cada cop més en la resolució de problemes, en com s'estableixen relacions causa efecte o interaccions socials entre els personatges. Els productes de consum que abans estaven destinats a una minoria ara poden ser consumits i entesos per una gran majoria.
És un llibre força interessant, amb múltiples referències a videojocs i series antigues i noves que poden despistar un poc a la generació més jove. Les conclusions al meu parer són molt encertades. L'efecte global de la comunicació de masses, dels videojocs complexos, d'Internet i les noves tecnologies és que fa al conjunt de la societat cada cop més intel·ligent i formada, més capaç de resoldre problemes gràcies a que el cervell està cada cop més entrenat i reb més més estímuls cap a aquesta direcció. Sols el fet de que jo hagi escrit aquest apunt i que hi hagi gent que ho estigui llegint ja és un exemple de com els nous mitjans ens han permès interaccions reservades dècades abans sols a l'elit intel·lectual i/o econòmica.
Lectura recomanable pel tipus de temàtica i la visió que dóna, allunyada dels tòpics habituals.
Fitxa tècnica Si és dolent t'ho recomano Steven Johnson Ed. La Campana ISBN 978-84-96735-25-5
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
The lazy project manager
Escrit per Aaloy a 02 de June , 2010 a les 9:01 p.m.
Avui tenia visita a Evissa per a tractar l'estat d'un projecte que tenim amb una empresa d'allà. Com que mai saps que te trobaràs per la carretera, tenc la mania de partir prest, la qual cosa em sol deixar una hora de mitja d'espera a l'aeroport. Avui més d'una hora i mitja, ja que no hi havia gens de coa a facturació.
Per passar el temps res millor que la lectura, en el meu cas un llibre que vaig rebre ahir: The Lazy project manager de Peter Taylor.
Sols puc dir una cosa d'aquest llibre: totalment recomanable. No és un llibre de metodologia de gestió de projectes, ni de bones pràctiques, ni d'aquells que et diuen el bé que els va sortir aquell macro projecte. És un llibre divertit, fresc, escrit amb un estil desenfadat, irònic i pràctic.
Taylor fa us del seu anecdotari personal per contar situacions que ha viscut com a cap de projecte. Conta coses que li han anat bé i també coses que li han anat malament. Focalitza molt bé el que ha de ser la feina d'un cap de projecte: gestionar l'equip, mantenir la calma davant els problemes i deixar que la gent faci la seva feina.
D'això Taylor en diu ser un Lazy manager, però no us malfieu. Ser un lazy manager duu molta feina. El títol fa referència a una actitud: intentar que les coses es facin amb el mínim esforç, concentrant-se en el que és important per al projecte.
Taylor duu el concepte a l'extrem, al primer capítol ja te diu: eps si vols anar al bessó del llibre ves al capítol de trucs ràpids. Però us aconsello que no ho faceu, us perdríeu una lectura molt divertida.
El llibre té 141 planes de lletra a doble espai amb la qual cosa es llegeix amb un parell d'hortes. Ideal per passar una bona estona a una sala d'espera, i per bona estona em refereixo a la rialla que se us pot marcar a la cara de tant en tant llegint els comentaris que fa Taylor.
Totalment recomanable sobretot per aquells que hagin tingut algun tipus de responsabilitat en la direcció de projectes, siguin informàtics o no.
Fitxa tècnica. The lazy project manager Peter Taylor Ed infiniteideas ISBN 978-1-906821-13-5
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica Llibres i revistes
No tenc ebook, ido!
Escrit per Aaloy a 31 de May , 2010 a les 8:44 p.m.
M'agrada llegir, molt. M'agrada llegir novel·la, sobretot de ciència ficció, però també assaig divulgatiu i com no llibres d'informàtica, que són la meva afició i despesa més gran.
Sovint m'han dit perquè encara no tenc un lector de llibres electrònics. Podria contestar que per una cosa que s'anomena eròtica del paper, de que m'agrada la sensació d'espera que implica comanar un llibre i començar a fer-te la idea de quan arribarà, de si t'agradarà, de si complirà el que esperes.
Podria dir que no m'agrada dependre de que l'aparell es quedi sense bateries quan més interessant és el capítol. Que m'agrada llegir gairebé a qualsevol lloc, que no vull patir si me qued dormit i el llibre me cau de les mans, cosa que no m'ha passat mai, per cert, però sí que m'he quedat dormit amb les ulleres a la mà.
Podria dir que és perquè tenc por de tenir tots els llibres que m'interessen a un dispositiu electrònic i perdre'ls per que algú li pegui per canviar el DRM o vet a saber què.
Però la vertadera raó és molt més senzilla: el ROI no és bo. El lector electrònic que m'agrada, el d'Amazon gran està als voltants dels 500$. Més petit no li trauria prou partit, ja que també el vull aprofitar per llegir pdfs format A4.
Aquests 500$ representen un poc menys que la meva inversió anual amb llibres tècnics, així que per justificar la inversió els llibres m'haurien de sortir millor de preu, cert? Doncs no! Resulta que en general els llibres tècnics en format ebook són molt més cars que els llibres en paper. Així doncs no tant sols hi ha la despesa de l'eBook en sí, que potser seria amortitzable en el temps, sinó que la inversió no s'amortitzarà, sinó que empitjorarà per mor que els llibres que m'agradaria llegir tenen un preu més car en format electrònic que en el seu equivalent en paper de tota la vida.
És doncs una qüestió de prioritats, de saber en què m'estic gastant les euros que tant costen a guanyar avui en dia. En aquests moments el llibre electrònic sols em llevaria uns quants dies d'espera, però potser m'animaria a la compra compulsiva. Els preus per mi passats de voltes dels llibres tècnics fan que per mi i en aquests moments l'ebook no sigui una opció vàlida.
Potser hauré de tornar el carnet de geek, però és que tampoc no sóc d'allò que se'n diu en early adopter tecnològic. M'agraden els gatgets com al qui més, però no vull que aquests definesquin el que sóc.
Traducciones/Translations by apertium
8 comentaris, 0 trackbacks (URL) , Tags: Informàtica Conyes marineres
Darrera setmana de juny
Escrit per Aaloy a 30 de May , 2010 a les 9:36 a.m.
Aquesta setmana he tocat molt poca cosa de Python i Django, el projecte que ens consumeix gran part del temps és una feina gairebé de rellotgeria però no és un projecte Python. Tot i això he fet servir Django per al prototipat d'algunes part de l'aplicació. És molt més senzill i ràpid muntar un prototip i fer-hi feina que tractar amb l'aplicació real, per molt que tenguem varis entorns de proves.
Estic revisant també els vídeos de la Djangocon Europe 2010. He vist el de Django a l'empresa, el dedicat a la testabilitat i el de GUnicorn. Aquest darrer m'ha agradat especialment ja que tenim plans per anar incorporant GUnicorn com a mètode de referència de desplegament d'aplicacions Django.
En aquests moments estam fent servir CherryPy i la veritat és que funciona molt bé. Encara que la màxima és "si funciona no ho canviïs" GUnicorn és un sistema WSGI molt més orientat a la feina que CherryPy, amb possibilitat de gestionar connexions síncrones i asíncrones. Els benchmarks que hi posen Gunicorn un poc pitjor que altres sistemses WSGI, però per notar-ne la diferència hem de gestionar un lloc web amb moooltes visites. En aquests casos el que ens puguin dir els benchmarks serveix de poc, ja que sempre s'ha d'ajustar la tecnologia al nostre cas concret.
El que té bo GUnicorn a més de l'orientació a la feina és que fa molt senzill desplegar una aplicació Django amb WSGI, fins i tot provant-la en local, està molt ben documentat i amb manteniment actiu.
Parlant d'una altra tema, dir que entenc perfectament a Ricardo quan diu que Amazon l'avorreix! El sistema de contingència que ha desenvolupat Bernat funciona molt bé. Això sí, no hi ha por que els administradors de sistemes es quedin fora feina. Es necessita un bon administrador per fer que tot rutlli, el que sí que hi ha és la tranquilitat de saber que no hi ha problemes de hardware. El valor afeget d'un tècnic d'IT és a més d'entendre com funciona Amazon AWS, crear els scripts necessaris per a automatitzar-ho tot, crear les alarmes, els tests, etc. Amazon no llevarà feina als administradors de sistemes, sols canvia el tipus i la qualitat de feina.
L'altra dia vaig posar la primera alfa-alfa del motor de reserves per hotels a l'entorn de test. Encara està molt verd per a poder-ho alliberar com a codi font, i no he tingut temps per polir alguns errors que té la prova. Per ara és un "naked dessign" on es mostren els contractes, la cerca de disponibilitat i permet modificar algunes coses. Falta documentar, no el codi, que hi està força, però sí fer una documentació amb Sphinx que faciliti entendre tot el que comporta. Si algú vol fer una ullada a l'aplicació que m'ho digui i li facilitaré l'accés.
Seguim intentant trobar un finançament mínim per donar major impuls al projecte, però encara no hem aconseguit res, així que la cosa per ara va tira a tira.
L'altra dia a una trobada es parlava de la necessitat que tenia la gent de WP de comptar amb un motor de reserves semblant al que estam desenvolupant. Crec que no és tan imporant que estigui dins WP com que es pugui fer una integració neta mitjançant cridades Rest, XML o XML-RPC.
No tenc clar quin pot ser el model de negoci d'una aplicació així: cobrar pr suport, per tenir una versió estable, per hostejar el servei?. El que sí tenc clar és que ha de ser de codi obert.
Però no tot ha de ser informàtica, he començat a llegir "Si és dolent t'ho recomano" de Steven Johnson, mentres esper que m'arribin d'Amazon UK dos llibres de gestió de projectes. Per ara Johnson m'està agradant força, té un punt de vista molt fresc respecte a com ens influeixen els canvis com els videjocs, els realities, etc. La seva teoria és que aquests canvis no ens fan més estúpids sinó tot el contrari. Quan l'acabi en faré una ressenya més extensa.
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes Python Django
Tres mesos d'APSL
Escrit per Aaloy a 16 de May , 2010 a les 10 p.m.
Avui precisament es complexien tres mesos des de que vaig deixar la meva antiga feina de cap de projecte web per TUI España (després a Hotelbes) per dedicar-me a un nou projecte: APSL.
És un bon moment doncs per reflexionar damunt el que suposa llançar-se a l'aventura en moments de crisi, sobre la constatació que les microempreses com nosaltres, tot i ser la gran majoria del teixit empresarial, ho tenen molt complicat pere accedir a ajudes i subvencions, però sobretot fer palesa la pau mental que et dóna fer el que t'agrada.
Potser el més detacable és la incorporació a l'empresa de Bernat Cabezas. Això vol dir que en pocs mesos hem duplicat el personal. També val a dir que això gairebé ha omplert el minidespatx. Dins l'aspecte de feina no ens podem queixar, van sortint projectes, amb comptagotes, però van sortint, i des del començament la nostra filosofia ha estat la de créixer quan ens ho poguem permetre, així que no estiram més el braç que la màniga.
Fer feina única i exclusivament amb Linux i programari lliure és molt productiu. No tenir que anar a reunions inútils i interminables ho és fins i tot més. Podem plantejar-nos solucions que a les nostres feines anteriors no seríen possibles: hem creat una solució damunt Amazon EC2 com a plà de contingència, fet screen scrapping amb Python i estam desenvolupant un petit motor de reserves de codi lliure amb Python per a hotels. I això fent el cafetet amb tranquilitat!.
Però no tot és color de rosa, la vida d'una microempresa és difícil. El primer de tot perquè has de començar des de zero. El que hagis pogut fer com a assalariat no compta. En parlàvem l'altra dia amb Juan de /IT que fa anys es trobàren amb la mateixa situació. Som les mateixes persones i amb les mateixes capacitats que quan estàvem assalariats, però hem de començar a crear portfolio i a demostrar el que sabem fer. No serveix el dir que en el nostre currículum hi ha la majoria d'aplicacions web internes i externes de TUI España, el que compta més és el que hem fet com a empresa independent.
El tema de les subvencions públiques també és una d'aquelles coses que t'indignem quan ets una microempresa. Darrerament hem intentat optar a un Plan Avanza per tal de poder accelerar el desenvolupament del motor web. La sorpresa va ser majúscula quan ens assabentaren que la inversió mínima per optar a una subvenció era de 200.000 €. Quantitat que com podreu veure queda molt lluny del que és una inversió raonable per a una organització com la nostra. Segons ens van explicar qui opta per aquestes subvencions, donat que són un 35% del pressupost, tenen tendència a inflar el pressupost i acaba essent un joc del gat i la rata entre que dóna la subvenció i que l'està sol·licitant. No puc entendre aquest joc, sols beneficia a qui té capacitat per poder inflar despeses i no a qui té capacitat per fer la feina.
Passa el mateix amb algunes organitzacions empresarials. Algunes estan organitzada a manera de capta subvencions i conformen un club exclusiu, on les quotes de participació serveixen per mantenir fora del club a les empreses més modestes.
Fa un poc de ràbia, però la veritat és que tant fa. Crec en que la feina ben feta al final donarà el seu fruit, i crec amb el creixement basat en l'esforç, en guanyar-nos els clients superant les seves espectatives. De la mateixa manera que entenc APSL com a un lloc on la gent tècnica s'hi pugui trobar bé, on a més de guanyar-se la vida s'ho passi bé fent feina. A un curs que vaig fer de l'EOI el director del curs em deia que això era una utopia, bé, potser sí, però m'agrada creure en que put trobar unicorn. I want a ponny diu la gent de Django.
Crec que els programadors, els tècnics i el frikis en general donam el millor de nosaltres mateixos quan ens deixen fer allò que sabem fer millor. Potser el temps demostrarà que jo estava equivocat, però al manco intentar fer que aquesta utopia sigui possible, i tant el client com el tècnic tenguin allò que volen i allò que necessiten és una aspiració que crec que s'ho paga com a projecte.
A l'aspecte personal, dir-vos que el meu nivell d'stress ha disminuït notablement. Sóc un passador de pena, no hi puc fer res, però al manco ara tenc la sensació de que hi puc fer alguna cosa. Que els problemes que sorgeixen al dia a dia no s'enquisten i els podem donar una solució. El que m'estressa més no és que hi hagi mota feina o problemes, això és la salsa de la feina, el que m'estressa és saber que s'hi pot posar remei i no poder-ho fer.
Arrib a casa amb la sensació de la feina feta, amb la sensació de que les hores dedicades a fer feina han servit per alguna cosa, encara que hi hagi dies on no tot surt com voldríem. És una sensació que feia molts mesos que no tenia.
He de dir que enyor molta gent de l'antiga feina. Hi vaig deixar molt bons professionals i millors persones, d'aquells que m'agradaria tenir amb nosaltres si el projecte APSL cresqués. Al Parc Bit també he retrobat antics companys de feina, molts ex-TUIS de la part de direcció i comercial que emigraren cap a projectes més engrescadors, antics companys de Viajes Iberia (gent us promet que quan no vaig tant de cul us faré una visita), companys Bulmeros i companys d'SMI.
Han estat tres mesos de mantenir contactes i crear ponts, no tant amb possibles clients com amb empreses i autònoms que tenen un tarannà semblant a nosaltres. Gent amb qui sé que podré comptar en un futur i gent que sap que pot comptar amb nosaltres.
Són temps difícils, de crisi, però també d'oportunitats. Vers la tudada de doblers que fan algunes institucions amb estudis d'estudis que estudien l'estudi, vers les subvencions atorgades a empreses que no les necessiten, potser les petites empreses com la nostra tenen la seva oportunitat. L'empresa privada s'ha de mirar molt bé on inverteix el seu capital, ha de cercar un rendiment als doblers i mirar molt la relació qualitat preu. Són temps on empreses com APSL poden tenir l'oportunitat. El temps ho dirà.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica APSL
PHP o Python
Escrit per Aaloy a 30 de April , 2010 a les 8:25 p.m.
Avui he tingut una interessant conversa telefònica, una mini-consultoria d'una hora podríem dir, com a presa de contacte per a un projecte que sembla força interessant i ambiciós.
Com és habitual una de les preguntes ha estat per què Python i no PHP? La veritat és que no hi ha una resposta única, sempre depèn del projecte. No hi ha una tecnologia única que encaixi a tots els projectes i sempre s'ha d'avaluar bé. Però quan el projecte no té únicament una vessant web, les possibilitat de que Python encaixi millor són més altes. Després de tot Python és un llenguatge de propòsit general, que ha demostrat les seves capacitats amb branques tan diferents com la programació web o el càlcul numèric, passant per la generació de gràfiques científiques i el control de robots.
També, com gairebé sempre, surt el tema de que amb PHP es més fàcil trobar gent. És veritat, però també és més fàcil trobar gent amb Java o amb PL/SQL. El tema està en que si el que volem no és gent, sinó dur endavant un projecte, el que no necessitam és gent sinó bons programadors i aquí la cosa ja es complica.
El PHP és un llenguatge que té un nivell d'entrada molt baix. És molt fàcil començar a fer coses, d'aquí que molta gent amb pocs coneixements de programació comença amb PHP. A més posar una web en producció també és molt senzill. Un ftp i un accés a una base de dades és suficient per fer la major part de les webs. Això ens dóna una gran quantitat de programador PHP aficionat, fa aplicacions i surten, però no hi ha una metodologia darrera i sovint les aplicacions no són mantenibles.
Una primera conclusió doncs: és molt més senzill destriar els bons programadors Python que els bons programadors PHP. La feina és més senzilla. Si algú s'ha atracat a Python per programar ja significa que té inquietud per fer les coses bé. El nivell d'exigència inicial per a fer webs amb Python també és més alt, has d'aprendre un framework, saber configurar un servidor web optimitzat per a la teva aplicació, ... En definitiva, no te pots haver quedat amb els coneixements bàsics "per a que la cosa funcioni i prou", s'ha d'haver anat més enllà.
Està clar que en PHP també es pot programar bé. Llavors segurament el programador que entrevistarem ens dirà que coneix or fa feina amb un framework. Bé, això està bé. Però llavors ja hem perdut la hipòtesi inicial de que era més fàcil trobar programador amb PHP perquè a més el programador PHP ha de ser bo en PHP i bo amb el Framework i l'àmbit de cerca es redueix molt.
Fent feina amb un framework PHP també hem perdut un dels "avantatges" del PHP: la capacitat d'escriure codi ràpidament i posar-ho en producció. Quan poses un bastiment PHP les velocitats d'execució són ridícules si les comparam amb les de Python i Django. Eps, potser suficients pel que volem, però per res comparables. Però la velocitat d'execució no és el més important, el més important és la velocitat de desenvolupament, i posant un bastiment PHP també perdem això. Resulta ara que el PHP no és tan directe com pensàvem, ni hi ha tanta gent que el conegui com fèiem comptes.
Segona conclusió: Si volem fer servir un framework amb PHP per programar no tindrem tants programadors a on triar i perdem molt en velocitat d'execució.
Però és que a més el projecte és gran i s'ha de mantenir al llarg del temps. Què triam PHP o Python llavors? Si el projecte és gran no importa tant que el programadors coneguin el llenguatge, basta que n'hi hagi uns quants experts que pugin fer el mentoring i la formació i deixar que la gent es vagi fent amb el llenguatge. El que sí necessitam són bons programadors, gent que sàpiga programar bé i no tengui por d'aprendre coses noves.
En aquest cas Python també sortirà molt afavorit. Aquí ja estam parlat de comparar PHP+Framework PHP amb Pyton + Django. Python té una cosa sempre present: el codi ha de ser clar i mantenible, si no ho és no és pythonic. El PHP segueix una altra filosofia... Si hem de mantenir un projecte gran en el temps Python és una de les millor eleccions que es poden fer: és molt més difícil escriure codi il·legible i una vegada el programador s'ha impregnat de la filosofia que hi ha dins el llenguatge el codi surt sols. És divertit escriure i mantenir codi, perquè és fàcil llegir-lo. Pensem que quan es tracta de mantenir codi ens passarem molt més temps llegint el que altres han escrit que creant nou codi. Tenir un depurador a Python, poder fer unit tests amb facilitats (recordem que la llibreria de unit test forma part de la pròpia distribució de Python), tenir un servidor web integrat com a Django. Tot això fa que la feina de manteniment correctiu i evolutiu sigui més senzilla. La gent que heu/hem tingut que mantenir codi PHP i que ha pasasat a Python i Django segur que està fent capades d'assentiment.
Tercera conclusió: Python fa que el codi que s'ha de mantenir durant molt temps sigui molt més mantenible. Dedicarem menys temps a la depuració. Si ho complementam amb la política de Django d'estabilitat de versions la cosa ja és per nota.
Podem entrar també en les interioritats del llenguatge. Python és un llenguatge madur, amb llibreries molt ben establertes, ben documentat, ben pensat. PHP fins fa poc no tenia orientació a objectes i encara així escriure un objecte i utilitzar-ho amb PHP és força farragós si ho comparam amb Python. Tot a Python és un objecte. Però el que trob més important és la quantitat de codi que es necessita per fer la mateixa tasca. Per programes grans el codi Python és entre dues i 5 vegades més curt que el codi PHP. Això vol dir menys codi que depurar, menys codi que llegir. En definitiva codi més mantenible.
Però sobretot el més important de tot per mi és l'experiència que he tingut amb programadors de PHP que han passat a conèixer bé Python i Django. S'han divertit en el procés i es segueixen divertint programant amb Python. Per mi és un factor important, ja que un programador motivat crea millor i és un factor decisiu en l'èxit de qualsevo projecte. Així que aquí va la meva
Quarta conclusió: perquè Python és un llenguatge fotudament divertit per a programar o en la versió en anglès: It's a hell of a lot of fun to code again!
Per a més referències hi ha un article força extens que compara PHP i Python a la wiki de Python.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python
vimdiff i grep
Escrit per Aaloy a 27 de April , 2010 a les 12:13 a.m.
Aquest és un post de servei públic, una petita configuració al .bashrc que ens permet gestionar fàcilment el control de diferències partir de mercurial i subversion. L'he trobat al tips and tricks de mercurial i és prou senzill i útil:
hgdiff() {
vimdiff -c 'map q :qa!<CR>' <(hg cat "$1") "$1";
}
svndiff() {
vimdiff -c 'map q :qa!<CR>' <(svn cat "$1") "$1";
}
i per fer cerques trob molt útil
export GREP_OPTIONS="-R -i -n --exclude-dir=\.svn --color=auto"
També és útil recordar algunes comandes de vimdiff
do - Posa els canvis de l'altra finestra a la finestra on tenim el cursor dp - Posa els canvis de la finestra on tenim el cursor a l'altra ]c - Va al següent canvi [c - Va al canvi anterior Ctrl W + Ctrl W - canvia de finestra :diffupdate - diff update :syntax off - syntax off zo - obre el text plegat zc - plega
En el meu cas ]c presenta conflictes amb algun plugin així que tocarà investigar quin o canviar el mapeig.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Codi lliure Linux
Productivitat
Escrit per Aaloy a 25 de April , 2010 a les 10:35 a.m.
Aquesta setmana al grup de Django hi havia una interessant discussió damunt la idoneïtat de Django per una startup. Bàsicament la discussió girava entorn de la tecnologia, i de com si imposam una tecnologia al proveïdor aquest la posarà com a excusa si el projecte fracassa o no s'entrega a temps.
Per mi això vol dir una cosa: si hem d'encarregar quelcom a un proveïdor ens hem d'assegurar que farà el que toca. És a dir, si ja d'entrada et diu "nosaltres no feim feina amb la tecnologia xxx i ho faríem millor amb yyy" doncs la millor opció crec que és anar cap a un altre proveïdor.
Però el que m'ha agradat més ha estat una aportació que m'ha duit fins a un article de Kurt Grandis anomenat Python + Django vs. C# + ASP.NET: Productivity Showdown.
El vertaderament interessant de l'article de Grandis no és el resultat en sí. Demostra que a la seva empresa la productivitat del desenvolupament en Python i Django ha doblat la del desenvolupament en C# i ASP.NET, i és la demostració en sí el que fa interessant l'article.
No es tracta de que hagi llegit un white paper i ha vist la llum. Sinó que a partir del que coneix de la seva empresa ha posat en marxa un estudi sistemàtic per a provar si la seva hipòtesi de que l'augment de productivitat en Python era millor o no.
Salvant les distàncies, és més o manco el que ens va dur en els temps de TUI a canviar el desenvolupament des de Java+J2EE amb tot l' stack tecnològic de Tomcat, Spring, Hibernate i altres cap a Django i Python. Aleshores les necessitats de l'empresa eren la de poder crear aplicacions web en un temps molt curt, amb moltes adaptacions posteriors, aquest darrer requeriment per pròpia idiosincràsia del negoci.
Teníem les dades del que ens constava posar un projecte Java en producció en temps i esforç. Potser condicionat per la meva vessant de gairebé físic i m'agrada tenir dades experimentals o vet a saber per què, però m'agrada tenir constància de l'esforç que duen els projectes, així que vaig anar recopilant dades com temps, línies de codi, temps d'inici mínim d'un projecte, temps de desplegament, etc.
Els resultats a favor dels projectes fets en Python i Django eren aclaparadors. En el nostre cas l'equip de feina era igual de bo amb ambdues tecnologies. Així que poguérem comparar peres amb peres.
Vull dir amb això que l'elecció de la tecnologia i del llenguatge de desenvolupament és una cosa prou seriosa com per no fer-la a cop d'impuls. Convé mesurar i decidir en base als nostres propis estudis i conclusions. Que per nosaltres el factor de productivitat fos Python no vol dir que per una altra empresa ho sigui, potser pel tipus de desenvolupament que es fa els va millor fer feina amb Java, en PHP , ...
És important poder avaluar el projecte i l'empresa. Invertir temps i recursos en fer l'estudi. Avaluant productivitat, riscs i variables com el vendor lock, la motivació de l'equip i com no el retorn de la inversió.
Grandis ens conta com ho va fer ell i per això és un exemple tan valuós. Sovint ens trobam que darrera una decisió com la canviar de llenguatge de programació o tecnologia no hi ha res que la recolzi. Hem d'acostumar-nos a fer aquests tipus d'estudis si volem que la Informàtica comenci a tenir la consideració de es mereix.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Comentari de "El lado humano del software"
Escrit per Aaloy a 19 de April , 2010 a les 8:18 p.m.
La ponència va començar amb uns minuts de retard, la cortesia típica per a que la gent acabi d'arribar, minuts abans en Joan Barceló em va presentar a José Barato, d'Atos Consulting i férem un cafè, descafeinat, això sí, que els moments abans de parlar ja duc una bona embranzida com per apujar-la més amb la cafeïna.
A la sala poc menys de 60 persones. Algunes cares conegudes: Suki, JoanMi, Pau, Joan Carbonell, ... Potser hi ha més gent que conec, però en Joan Barceló ja m'està presentant i no tinc temps de fixar-m'hi massa. Paraules afalagadores de Joan, no sé si les meresc, però encara així són benvingudes.
He previst una exposició d'uns trenta minuts, més o manco a minut per transparència. Una altra vegada em record a mi mateix que he de trobar alguna mena de plugin o utilitat per a poder posar un crono a la pantalla que em vagi marcant el temps. Amb el mòbil al costat ja va bé per nar mirant l'hora de tant en tant i ara per ara això ha de bastar.
Vaig parlant un poc de filosofia de la gestió de projectes, de la importància de l'equip i de com les eines de codi obert ens poden acompanyar en tot el camí de la gestió de projectes. Sóc molt insistent en que l'eina no és l'important, que no és un fi en sí mateix, sinó que l'important és el projecte i la gent que l'ha de dur a terme.
Passa el temps i acab amb la presentació, en Suki veig que ha tuitejat l'inici i el final. Per això veig que he estat gairebé 37 minuts parlant. Se m'ha fet curt. M'encanta parlar d'aquests temes. Crec que fer pedagogia i ser insistent és la única via per a començar a canviar les coses. Que hi hagi una seixentena de persones a la sala, alguns amb resposabilitats de gestió de projectes potser ajudarà a que la gestió de projectes de programari canvii cap a una gestió on es dóni la importància a l'equip en el seu conjunt i es tengui en compte que el desenvolupament de programari no és com el que fa hamburgueses (m'agrada l'exemple de José Barato).
Després en Joan Barceló ens parla de OpenPPM, eina de gestió de carteres de projectes desenvolupada en codi obert i que està propera al seu alliberament. Ens parla de les eines utilitzades. Veig alguns comentaris en referència a la corbata i a que surt Word, Excel i Microsoft Project com a vies per donar-li de menjar a la bèstia. D'aquí dos temes a dir, per una part el tema de dur corbata o no, és quelcom personal, a mi no m'agrada, però tampoc m'agraden massa els vaqueros. Crec que la vestimenta no ha de condicionar la importància de les paraules i de les idees, encara que sóc conscient que sovint ho fa. De la utilització de formats tancats com a via d'entrada sí que crec que condiciona la llibertat del projecte, però en soc optimista. Fa un grapat d'anys tenir empreses com SM2 o Atos involucrades en un projecte lliure i parlant-ne obertament a unes ponències fora impensable. Està clar que encara hi ha coses a millorar, però el que no podem fer és voler-ho tenir tot de cop, s'ha d'anar fent camí. S'ha de reconèixer el que s'ha fet, l'esforç i la iniciativa i animar a seguir polint els detallets que queden per a poder considerar el producte vertaderament lliure.
La darrera conferència va ser la de José Barato, d'Atos Consulting. Pareix que José i jo hem llegit els mateixos tipus de llibres, ja que tant De Marco com Yourdon a DeathMarch formen part de les meves referències obligades. Jose va desgranar els principals conceptes que exposa De Marco i va explicar algunes anècdotes personals de Death March. Una de les anècdotes em va fer por: programadors coaccionats per fer feina sense anar a casa, dormint a la oficina. Segur que José Barato ja no ho fa això i n'ha après la lliçó, però segur que encara hi ha consultores que no han fet el canvi i aquests tipus de pràctiques poden ser fins i tot normals.
El cap de projecte té una obligació vers el projecte: la obligació de mirar de dur-lo endavant, però també té una obligació vers l'equip, la de no vendre'ls la moto. Embarcar un equip a una missió impossible sense el seu consentiment o dur-los més enllà del que humanament és possible fa malbé l'equip i el projecte.
En resum, unes xerrades entretingudes. Jo m'ho vaig passar molt bé i esper que la gent que hi va venir també trobàs coses interessants de la xerrada.
Gràcies a Suki per les fotografies.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
El lado humano del software
Escrit per Aaloy a 13 de April , 2010 a les 7:26 p.m.
El divendres vinent particip en la xerrada El lado humano del software, encara estic acabant de perfilar la xerrada, però com diu el títol parlaré de la gestió de projectes fent servir programari obert.
Tanmateix m'agrada el títol de la xerrada, ja que no vull parlar de com fer servir un o altre programa, sinó anar indicar quins problemes ens trobam en la gestió de projectes de programari i com hi ha programes de codi obert que resolen el problema, i ho fan des d'una vessant orientada a les persones i al grup de desenvolupament.
Pensant en la xerrada sorgeix un altre tema, què és el que fa un cap de projecte sigui un cap de projecte? La gent del PMIB vol anar cap a la professionalització d'aquesta activitat, però sé cert que molts ens conformaríem amb que l'accés a cap de projecte no fos una manera de cobrar més i deixar de programar, sinó una activitat on la gent que hi accedesqui en tengui vocació i formació.
No hi ha res dolent en que una persona que programa vulgui ser cap de projecte, particularment trob que un cap de projecte que ha estat un bon programador pot entendre millor les necessitats que té un equip de desenvolupament i connectar millor amb l'equip i el client. El que no m'agrada és que la gent que és bona programant i que ho vol seguir fent, si vol mantenir un nivell de sou tengui que anar cap a la direcció de projectes si no li agrada.
S'ha de valorar la feina de cap de projecte i s'ha de valorar la feina d'un bon programador, d'un bon tècnic de sistemes, ... La feina de cap de projecte no pot ser un objectiu per cobrar més, sinó una elecció raonada i no motivada sols per l'aspecte econòmic del lloc de feina.
El món està ple de caps de projectes de software de Microsoft Project i fulla de càlcul a una unitat compartida de Windows que han accedit a ser-ho perquè no els ha agradat mai programar (dubt si mai els ha agradat la feina informàtica) i no volen aprendre res nou. Crec que és això el que s'ha d'evitar, potser professionalitzant més l'ofici n'és una via, però un punt important és el d'anar fent pedagogia a les empreses de que no hi ha res dolent el pagar més a un bon programador o per un bon dba que a un mal cap de projecte.
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Actualitzat vimrc
Escrit per Aaloy a 03 de April , 2010 a les 11:59 a.m.
He actualitzat la meva configuració de .vimrc i els pluggins i ressaltat de sintaxi que hi ha a .vim
- El subversion: http://code.google.com/p/appfusedjango/source/browse/#svn/trunk/myvim
- El .vimrc
- El .vim
Novetats
- Substitució de snipEmu per snipmate. SnipMate fa si fa o no fa el mateix però té una sintaxi més senzilla i clara i permet fer nous snippets molt més fàcilment.
- He afegit un nou ressaltat de sintaxi per json.
- El colors per defecte per gvim passa a ser ara wombat i he canvait el tipus de lletra a DejaVu Sans Mono, ja que té una bona distinció entre la vocal O i el zero, entre l'u i la i, bastant millor per programar.
- Activació per defecte dels menús i de la toolbar a gvim
- Neteja de la configuració a .vimrc
- Pos els alias a un fitxer apart dins ~/.vim/abbr, feu
aliasper veure el que hi ha. - Integració de més codi de pycopia especialment dels snippets per Django.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Testejant Django amb Nose
Escrit per Aaloy a 02 de April , 2010 a les 10:19 a.m.
A poc a poc però sense pausa estic embarcat en la creació d'un motor de reserves orientat cap a hotels i cadenes hoteleres. És a dir, no es tracta de fer un sistema genèric orientat a la integració d'xml com els que poden necessitar agències i TTOO, sinó de tenir quelcom flexible i ràpid de personalitzar orientat a cobrir les necessitats més o manco complexes de la venda directa on line de nits d'hotel.
És a dir, el sistema ha de cobrir el bàsic (gestió del nombre d'habitacions disponibles, tarifes, descomptes per ocupació, aturada de vendes, etc) però també ha de permetre cobrir necessitat que en aquests moments no coneixem. Per tant, tenir una bona bateria de tests que ens assegurin que afegint noves característiques no ens estam carregant les que ja hi ha és fonamental.
La idea del Test Driven Development és que s'han d'escriure els tests abans d'escriure el codi. Jo no sóc tan purista i els tests els escric quan els necessit, unes vegades abans i unes vegades després d'escriure el codi. La raó és molt senzilla, quan estic immers en l'escriptura de codi per a que passi un test, sovint me trob afegint noves característiques per les que no tenc cap test encara. Llavors crec que el millor és seguir a la zona de programació pura i dura i després escriure els tests. Crec que no és tan important el moment en el que s'escriuen els tests unitaris com el fet de tenir-los.
Un motor de reserves com el que descric es pot fer en qualsevol llenguatge, en el meu cas hem triat fer-ho amb Python i amb Django, ja que ens dóna molta flexibilitat posterior a l'hora de fer adaptacions, que és el que cercam. Així doncs la definició del model de dades i l'ORM que s'utilitza és el de Django, la qual cosa fa que sigui important poder testejar-ho amb les eines que ens proporciona aquest bastiment.
Llegint la documentació de Django podem veure que aquest fa servir els units test de tota la vida i que a més per a que els tests siguin realment unitaris el que fa es utilitzar una base de dades nova i neta cada vegada que executam un test, d'aquesta manera ens asseguram que no hi ha dependències entre diferents execucions de casos de prova i per tant que els tests són realment unitaris respecte a les dades.
Tot i que sigui una solució totalment vàlida, consider que eines com nose fan l'escriptura de tests unitaris una tasca molt més divertida, ja que no has de passar pena de com estructura els test, sinó simplement els has d'escriure amb unes convencions de codi (per exemple els tests han de començar o contenir la paraula test). Per mi això significa menys complicacions i poder reaprofitar petits troços de codi que tanmateix hauria necessitat escriure per provar l'aplicació sense tenir que donar-los el formalisme que necessita un unit test. L'ideal per mi és tenir nose integrat dins el sistema de test de Django.
Afortunadament més gent ha tingut aquesta idea i per sort per mi, gent amb un coneixement més profund que jo de nose a nivell intern com per fer-ne una adaptació per Django, us present el django-nose. És una aplicació que s'instal·la amb pip o easy_install i que necessita molt poca configuració, afegirem 'django_nose' al settings.py a la secció INSTALLED_APPS i afegirem TEST_RUNNER = 'django_nose.run_tests' per dir-li a Django que farem servir el nostre motor de tests enlloc dels seus.
La gràcia d'aquest mòdul i de nose és que és compatible amb el que ja hi havia, però a més afegeix molta més funcionalitat i agilitat a l'hora de crear els tests. Basta fer un python manage.py test --help per adonar-nos de tota la quantitat d'opcions que ens afegeix el mòdul a l'hora de testejar. D'aquestes m'agradaria destacar-ne algunes:
-
--with-coverageEns permet utilitzar la utilitat de coverage de Ned Batchelder que ens permetrà veure quines línies de codi no hem testejat encara. Amb opcions addicionals és capaç de generar-nos un html navegable per a que poguem veure exactament el context de les línies testejades i de les que queden sense provar. -
--processesEns permet aprofitar els nuclis del nostre ordinador, els tests s'executen en paral·lel (recordau que els tests unitaris no han de tenir dependències entre ells) accelerant notablement el temps de procés. -
--with-xunitFa que en lloc de tenir la sortida típica dels unit tests tenguen el format de xunit, el mateix que es fa servir als unit test de Java, per exemple, i que ens permetrà integrar els nostres unit tests amb eines d'integració contínua com Hudson.
A l'hora de testejar una aplicació com el motor de reserves és imprescindible partir de dades conegudes i controlades per poder determinar els resultats esperats. Per això la manera que té Django de carregar les dades és simple i elegant. A cada unit test i abans de l'execució de cada cas de prova es crea la base de dades (en el meu cas un sqlite3 en memòria) i es carreguen les dades inicials (o fixtures en la nomenclatura) que es defineixen a cada unit test. Els fitxtures no són més que arxius en format json, yaml o xml que representen els registres que hi ha d'haver dins la base de dades.
Per exemple: [{"pk": 1, "model": "sites.site", "fields": {"domain": "example.com", "name": "example.com"}} ]
Aquests arixus els podem crear nosaltres directament amb un editor com vim o bé aprofitar-nos de l'entorns de Django i crear-los a partir de l'admin. Així podem introduir les dades a la nostra base de dades i fer un
./manage.py dumpdata applicacio.model
per exemple:
./manage.py dumpdata sites.Site --indent=4
ens proporcionarà el codi json per al model Site, l'indent el que fa es proporcionar espaiat addicional per a que sigui més bo de llegir i de modificar.
Si ens va millor tractar amb yaml, és prou senzill canviar el format:
python manage.py dumpdata sites.Site --format=yaml --indent=4
- fields: {domain: example.com, name: example.com}
model: sites.site
pk: 1
Dins un mateix unit test podem carregar tants arixus de fixtures com vulguem, ja que basta definir una llista del que s'ha de carregar, això vol dir no tenir que tractar amb grans arixus de dades de proves, sinó poder-los fer molt més manejables i sobretot reaprofitables.
La combinació de fixtures, unit test de Python, eines de testeix de Django i nose és molt difícil de batre. Per una part tenim que escriure tests amb Python costa una fracció del temps i de codi respecte a escriure'ls en un altre llenguatge, però a més nose fa que la tasca sigui molt més natural i la capacitat de generar els fitxtures des del mananager de Django fa que una tasca avorrida es convertesqui en trivial.
Tenir una bona bateria de test és fonamental per provar l'aplicació, per demostrar que els casos que s'estan considerant funcionen i tenen les sortides que deim que han de tenir. Però la utilitat dels tests unitaris va més enllà. Són una eina imprescindible en la refactorització.
Una vegada l'aplicació ja fa el que volem arriba l'hora de plantejar-se si es pot fer millor, si l'aplicació pot ser més eficient, de refer el codi per a evitar repeticions. La regla fonamental de la refactorització és que no hem d'introduir funcionalitat nova, quan refactoritzam tot ha de funcionar com abans. Els tests unitaris ens ajuden a demostrar que la nostra refactorització és bona, en tant en quant passin exactament els mateixos tets que teníem abans de fer cap modificació.
Faceu Test Driven Development o agafeu una aproximació més pragmàtica, el cert és que tenir bons unit tests és una inversió de futur que costa sols un poc més de temps quan estam desenvolupant, ja que amb nose els tests es poden reaprofitar de les petites rutines per proves que tanmateix hauríem d'escriure. Els beneficis el veurem a mig i llarg plaç: quan refactoritzem, quan canviem codi, quan les proves les llanci un sistema d'integració contínua. És massa bo per a no fer-ho servir.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Python Django
Truc: copiar text entre instancies de VIM
Escrit per Aaloy a 21 de March , 2010 a les 6:34 p.m.
Com sabeu darrerament estic fent servir VIM com a editor de referència. N'estic aprenent encara, però vull compartir un truc, millor dit, una tècnica que ens permet copiar text entre diferents instàncies de vim o entre una instància de vim i una altra aplicació Linux.
És una cosa que trobava a faltar però que fins aquest dissabte no he trobat com fer (és el que té llegir els manuals, que t'enteres de coses!).
Resulta que Vim té molts de registres de còpia i un d'ells és el registre * que ens permet copiar des de i cap el porta-retalls del sistema operatiu.
Així doncs farem:
Per copiar de Linux a Vim.
- Seleccionam un text i feim el típic Ctrl+C
- Anam a Vim i ens situam al lloc on volguem aferrar
- Pitjar
"*p(dobles cometes, asterisc p) i ja ho tindrem aferrat.
Copiar de Vim a Vim entre instàncies diferents
- Ens posam amb mode visual i seleccionam el text
- Pitjam
"*y(dobles cometes, asterisc y) i ja ho tenim al porta-retalls - Anam a l'altra insancia de vim, ens situam a lloc i pitjam
"*pcom abans
Esper que us ajudi tant com a mi
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Codi lliure
El 1.996.632.000
Escrit per Aaloy a 14 de March , 2010 a les 10:56 a.m.
Aquest és el pressupost en pessetes del que pot costar un portat de promoció i venda de productes turístics a la nostra comunitat, o el que és el mateix, a tots nosaltres.
Segons recullen alguns diaris i en paraules del President Antic:
"Será una plataforma pionera a nivel mundial que permitirá ver toda la oferta turística de las Islas Baleares vía 'online' y que contará con la tecnología de la empresa Microsoft, lo que nos permitirá adelantar en el campo de la internacionalización de nuestros productos y nuestra oferta"
Personalment mesclar Tecnologia turística, Microsoft i Administració pública tot en un mateix paquet ja em pareix aberrant. Una empresa privada pot permetre's el luxe de comprar el que vulgui i a qui vulgui, les decisions que prengui són cosa seva i l'impacte anirà contra el seu compte de resultats (bé, excepte si ets un banc, que llavors si te van malament les coses el Govern et finançarà). Però en aquest cas estam parlat d'una administració públic, d'esquerres per més senyes, que té com a obligació vetllar pels interessos dels ciutadans i afavorir la igualtat d'oportunitats.
L'anunci, ara per ara un titular, significa per una banda ja haver decidit amb quina tecnologia es farà el portal, és a dir, haver decidit que una part considerable de l'import anirà a una sola empresa, Microsoft, participi o no en el desenvolupament final del projecte.
En Toni Roig a una contesta al via Twitter em diu que ell està content perquè es tracta el programari com a una infraestructura. Això seria veritat si les bases de la infraestructura fossin lliures. Les carreteres són infraestructures que faciliten el comerç, però pots anar d'un lloc a l'altra sense que t'imposin el cotxe i quan s'anuncia una carretera no es diu amb quina marca d'asfalt es farà ni qui en serà el proveïdor.
Anar cap a una plataforma Microsoft implica tenir infraestructures tancades, on sols hi podrà participar en la seva creació qui pagui el peatge de Microsoft. Implica fer una inversió codi no reaprofitable pel sector de les TICS i per al sector turístic.
Per mi, fer una infraestructura significa posar les bases per a que la iniciativa privada pugui desenvolupar el seu negoci i generar ocupació, dotar de serveis bàsics i eficients. Donar la canya i no directament els peixos.
Ara se'ns diu que no hi ha res decidit, però la realitat és que als mitjans de comunicació han sortit ja noms i tecnologies: tecnologia Microsoft i les empreses de Turistec. Quan la gent de fora de Turistec i lligada al programari lliure ens hem alarmat pel fet de que pareixia ja tot decidit intenten calmar-ho dient que no hi ha res lligat encara. Ens ho hem de creure? Potser sí, estic disposat a creure'm-ho però això vol dir que algú ha fet molta mala feina de comunicació i que té uns tics ben allunyats del que hauria de ser una concepció social de la inversió en TIC.
Supòs que aviat sortirà el contraposar tecnologies, el que no hi ha res semblant al que Microsoft ofereix, ... Potser sí, potser no, però si no hi és, tractar el programari com a infraestructura vol dir que el Govern no ha d'invertir en una solució finalista, sinó en la creació dels mitjans. S'inverteix en l'aeroport, en el port, en la carretera,... l'avió, vaixell o vehicle que ho posi cada un! . Crec que és aquest un dels aspectes que fan més por de tot el projecte, la diferència de concepció en el que és el paper de l'Administració Pública en els projectes TIC que volen impulsar l'economia i en com aquesta inversió ha de repercutir en la societat.
Després, en tot aquest projecte se fa una associació d'idees també molt perillosa: l'empresa privada de balears és Turistec. Perdona toniroig, potser ho estic traient de contexte, que el Twitter és molt limitat per fer reflexions, però ja ha sortit vàries vegades el nom. Voldrà dir això que per poder participar en el projecte les empreses hauran de formar part de Turistec? Creis que totes les empreses i professionals poden pagar-se les quotes del club? Té Turistec com a conjunt una postura comuna vers la tecnologia que ha d'utilitzar-se en l'Administració pública per tal de garantir el vessant social de la inversió? Permeteu-me dubtar-ho des del moment que el propi CMS de l'associació és programari tancat.
Fins ara he tractat les formes i la conclusió per mi es clara: no són formes d'anunciar els projectes, ni una concepció social de les TICs. Recorden massa a les formes Mates per sortir a la foto i els ciutadans d'aquesta comunitat no ens ho mereixem.
Anem ara als continguts i a la idea en sí. Que el Govern impulsi el sector de les TICs i el sector turístic està molt bé, que vulgui tractar el programari i les IT com una infraestructura, molt bé. Però esper que realment es faci això, que es crein les infraestructures, que tot el que es crei al voltant sigui reaprofitable i utilitzable i que les inversions que es facin quedin com a benefici per a la societat. Per mi això significa invertir en solucions obertes, en coneixement i en impulsar el reaprofitament de recursos, precisament el que implica fer les coses amb mentalitat de programari lliure.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica Codi lliure
Pip pip hurra!
Escrit per Aaloy a 13 de March , 2010 a les 12:08 p.m.
Què voleu, estic content de veure que una eina com pip funciona tan bé.
Pip és una eina per a la instal·lació de paquets i dependències per Python, molt més avançada que easy_install ja que permet tot el que feia easy_install però a més, permet mantenir d'una manera fàcil un arxius amb totes les dependències del nostre projecte.
Ens permet instal·lar paquests de Python des dels repositoris de Pypi, des de subversion, git, mercurial a través d'un fitxer de requeriments simple i a la vegada funcional.
Mode batalleta on:
Ahir vespre estava fent feina amb un projecte mascota que tinc, un motor de reserves per hotels i cadenes hoteleres fet amb Python i Django.
El projecte necessita de força llibreries: la darrera versió de django, nose pels tests, sphinx per la documentació, django debug toolbar, django extensions, south per la migració de dades, ipython, ipdb, pep8, coverage, pytlint. Tot això (i algunes més que s'hi afegiran) constitueixen l'entorn de desnvolupament del projecte.
Actualment faig feina amb tres ordinadors: el fix (el PPC del que tant he parlat per aquí), portàtil un Dell D820 i un Dell de 10". Segons on estic i el que he de fer en faig servir un o altra, o duc dins la borsa el portàtil gran o el petitó.
Per això el pip m'ha solucionat tant la vida. Ara quan desenvolup un projecte me basta mantenir al repositori del control de versions un arxiu amb els requeriments del projecte. Cada vegada que afegeixo una nova dependència no la instal manualment sinó que la pos a aquest arixu i execut
pip install -E $VIRTUAL_ENV -r requirements.txt
dins el meu virtualenv a partir d'aqui i quan he de canviar d'ordinador i vull tornar a fer feina en el projecte, basta baixar-me els canvis i tornar i tornar a executar a aquest ordinador l'ordre que he posat un poc més amunt. Amb una bona connexió en pocs segons (potser minuts) tindrem l'entorn de desenvolupament del programa totalment operatiu.
Mode batalleta off
Pel que en tingueu interés deix aquí un parell d'enllaços:
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Consoles per Python
Escrit per Aaloy a 08 de March , 2010 a les 8:08 p.m.
Quan hom comença amb Python qualsevol ajuda és benvinguda i quan ja en saps un poc més llavors el que cerques és poder provar coses ràpid, flexibilitat i eines potents.
Sigui com sigui un dels avantatges de Python com a llenguatge de programació interpretat és que ens proporciona una consola de comandaments que ens permet provar les coses d'una manera pràcticament immediata. Tot i això, com us dic, quan comences a aprendre'n la consola que hi ha per defecte potser no és el més amigable del món.
Us presento unes quantes consoles més per poder triar i remenar:
bpython
És una consola molt amigable per la gent que comença: té autocompletat per defecte i ens mostra la documentació de les funcions que anam teclejant. Ens permet copiar el nostre codi a Pastebin, amb la qual cosa ens facilita la tasca de comentar el que surt (o no surt) amb altres persones. Té també una versió per gtk (bconsole-gtk) i s'integra amb Django fent servir eines de tercers. És ideal per a començar a jugar amb l'entorn i aprendre la sintaxi de les comandes.
dreampie
És també una shell força interessant per la gent que comença, surt del típic prompt i presenta una secció on es pot anar introduint el nostre codi. Amb ctrl+intro el codi passa a la shell i s'executa. És multiplataforma i s'integra amb matplotlib (pels qui necessitin fer gràfiques). Com a cosa interessant, ens permet guardar la feina en html, ideal per muntar tutorials.
pyShell
Junt amb Pycrust són utilitats que podem trobar al paquet wxPython. Tenen autocompletat i mostren la documentació. Són consoles potents però requereixen tenir instal·lat wxPython. M'agrada PyCrust perquè et mostra un poc les interioritats de l'intèrpret de Python, té una secció anomenada namespace on pots veure tot l'espai de noms que hi ha carregat i navegar-hi. Per exemple fer un import os posa el paquet os a l'espai de nom i podem moure'ns i veure'n les funcions que té, constants i la documentació.
ipython
La meva preferida. Una consola potent, gairebé pot reemplaçar una shell per les tasques més habituals. Té resaltat de sintaxi i autocompletat, però ja has de saber un poc més el que estàs cercant. S'integra molt bé amb Django i permet executar directament comandes de shell. El manual és molt complet i dóna una idea de la potència de la consola.
idle
Python ja ve amb les bateries incloses. A més de la consola habitual també podem trobar l'idle una consola gràfica i editor. Té resaltat de sintaxi i autocompletat. Li han fet una bona rentada de cara darrerament i també és una opció a considerar. A més recordau que és a més un editor força complet per Python.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python
Col·laboració
Escrit per Aaloy a 07 de March , 2010 a les 8:05 p.m.
En Galigan l'altra dia es demanava pel Twitter com és que la gent que fa feina de manera independent no s'uneix per poder fer front a "consultoras dinosaurio".
Com que el Twitter és massa curt i massa immediat per poder poder dir les coses, doncs li vaig prometre un apunt al blog per contar com veia jo les coses. Potser amb aquest apunt tampoc aconseguiré explicar tot el que vull dir i el que pens del tema, però al manco serà un poc més desenvolupat que no un grapat de frases al Twitter.
Primer un poc de història.
La idea d'un conjunt de professionals autònoms que s'uneix baix una mateix marca no és nova a les illes. Fa temps i a partir d'un grup de gent que es coneixia de Bulma hi va haver un intent de fer tal cosa. Pel que jo sé (no hi vaig participar a l'experiment) la cosa no va acabar d'anar del tot bé.
Desconec exactament les raons del fracàs de l'experiment, però potser una d'elles va ser la inexperiència en unions com aquesta. En altres sectors com els missers i gestors per exemple, aquests tipus de col·laboracions són molt més habituals.
Tot i que no funcionàs la idea és prou bona. Va ser el punt de partida que ens motivà a formar APSL, no ja com a una marca sinó com a una societat limitada. La idea fonamental era, i és, unir a professionals amb una visió del que és el desenvolupament d'aplicacions web comú, professionals que es complementin i amb un objectiu comú.
L'experiment APSL
APSL té un nucli estable de gent des de el principi, que hi col·labora d'una manera o altre, uns són socis, d'altres just col·laboradors voluntaris (un bon exemple d'això són els #creant_bits). Però tothom amb una visió semblant de la informàtica i amb una cosa fonamental: confiança mútua.
Des de la seva formació APSL ha tingut com a objectiu la col·laboració entre professionals, però per a que tal cosa es produesqui aquesta col·laboració s'ha de donar de manera natural, ordenada i amb el consens de tothom. La confiança és a més el nexe que fa possible el projecte. Tothom que hi forma part ha de poder tenir la confiança plena de que cada un farà el que s'ha de fer en cada moment, que els egos no han de prevalèixer damunt l'objectiu més gran que és dur endavant un projecte empresarial a llarg termini.
La visió no és sols orientada a la informàtica, sinó també al model empresarial, a l'ètica empresarial, el que darrerament s'ha anomenat la responsabilitat social de l'empresa. Per a nosaltres això representa fer negocis d'una manera molt determinada, convertint-nos no sols en proveïdors dels nostres clients, sinó en col·laboradors, en una relació quasi simbiòtica on tothom hi ha de sortir guanyant. En poques paraules, no es tracta de donar el pelotazo sinó de mantenir una relació de confiança i col·laboració que s'estengui al llarg del temps.
Supòs que tot això us sonarà a la gent que heu parlat amb mi i com molts us adonareu no és una cosa massa habitual en el nostre sector (sobretot fora del programari lliure), per això dic que APSL és un experiment, perquè trob s'ho paga intentar que un projecte així tiri endavant.
Per què empresa?
L'empresa és el nexe d'unió. Representa una manera formal de fer les coses i estableix unes regles de joc comercials i mercantils. Implica que hi ha un admintrador/gerent que dóna la cara, que pot coordinar els distints projectes i saber què fa tothom.
I per mi això és el que marca la diferència entre projectes semblants que s'estructurin al voltant d'una marca i dels que s'estructuren al voltant d'una empresa: la figura de l'administrador, de la persona que ha de vetlar per a que l'empresa funcioni com a tal, encara que internament els seus membres siguin tots professionals.
L'empresa com a tal dona recolzament als professionals que la formen. Fa que el tot sigui major que la suma de les parts, i a la seva vegada imposa tota una sèrie d'obligacions: facturació comuna, comptabilitat clara, despeses comunes, ...
Des del moment que es té un lloc comú de reunió, que s'ha de pagar, una facturació i uns comptes que s'han de presentar, la col·laboració passa de ser una cosa esporàdica entre professionals i convertir-se en un tirar del carro comú. S'han de tenir millors serveis compartits, aquella lasser que fa falta, el servidor que s'ha d'ampliar i gestionar, els clients que s'han de visitar, ...
APSL està pensada per créixer de manera orgànica i pausada en vers l'objectiu d'agrupar professionals, de sumar talent i proporcionar serveis comuns que d'altra manera no es podrien tenir, d'arribar a projectes que amb un altre tipus d'estructura serien directament inabastables.
Però tot això ja us dic que té tota una sèrie d'implicacions que s'han de conèixer i que potser en altres intents d'aquest tipus no s'han donat tant. Deixau-me canviar un poc de registre i no referir-me tant a APSL sinó a com ho veig en general.
Què implica un projecte de col·laboració?
-
Objectius comuns. Ja no es cosa d'anar cada un pel seu compte i que l'empresa sols es tengui en compte a l'hora de presentar-se a un projecte, sinó que s'ha de tenir l'objectiu de fer que l'empresa com a tal cresqui. Els projectes ja no són propis sinó que són de l'empresa, de la mateixa manera que ho són les despeses.
-
Confiança professional Tothom ha de poder confiar amb tothom i els clients han de poder confiar en els professionals de l'empresa. La visió de l'empresa i del model de negoci ha de ser la mateixa per tot els professionals agrupats entorn a l'empresa.
-
Complementarietat En un negoci global com és la informàtica els professionals que s'agrupin en un projecte de col·laboració han de ser complementaris i no tan sols en l'aspecte tècnic (que també) sinó en l'aspecte fin i tot de caràcter. No tot és programar, també s'ha d'anar a captar clients, fer pressupots, parlar amb gestors, dissenyar l'aplicació, documentar, fer fotografies, ...
-
Serveis compartits Un altre dels nexes del projecte ho han de representar els serveis compartis: el local, els servidors, la infraestructura posada a disposició del integrants del projecte. El local, per exemple, fa que hi pugui haver un punt de feina on la gent que es sent més còmoda fent feina fora de casa hi pugui anar. S'ha de pensar a llarg plaç i reservar capital per a invertir en el projecte: millor mobiliari, local amb més possibilitats, millors servidors, possibilitat de organitzar cursets, d'anar a conferències.
-
Despeses S'ha de ser conscient que un projecte de col·laboració a llarg plaç té despeses. La feina d'organització i gestió interna pot arribar a ser força important quan es tracta de gestionar un projecte on un gran nombre de professionals han de de col·laborarar, s'ha de mantenir per una estructura gran un nivell d'abstracció semblant al que es tenia com a professional, però aprofitant les sinèrgies que implica col·laborar amb altra gent. Això vol dir que els beneficis de la nostra feina com a professionals ja no són sols nostres, sinó que són de l'empresa i dels altres col·laboradors. Joel Spolsky tracta molt bé el tema a The Development Abstraction Layer. Fitxau-vos que les despeses no es refereixen al material, a la llum o al local, sinó a tot el necessari per mantenir el nivell d'abstracció que permeti aprofitar les sinergies que impliquen posar feina en comú.
-
Creixement orgànic Personalment pens que s'ha de ser caut a l'hora de créixer. S'han de cercar les col·laboracions permanents quan la gent ja es coneix i ha fet feina junta en alguns projectes. A l'hora d'admetre nous membres aquesta admisió no ha de ser fruit de la necessitat sinó de l'acord de tots els membres. Ja no estam sols, som un equip, una empresa i per tant la decisió de amb qui es col·labora i amb qui no ha de ser quelcom comú.
-
Suport mutu Quan un fa feina sols qualsevol problema o incidència personal té un impacte brutal damunt la seva activitat. Per una empresària el naixement d'un fill pot representar tant una alegria com a un risc. Col·laborar implica estar a les dures i a les madures, minimitzar els impactes que puguin tenir els membres. Ara es funciona com a empresa i com a tal els projectes i els clients són comuns. Implica estar dispost a conèixer els clients i els projectes de l'altra gent, ser-ne el backup en cas que fos necessari, i si més no sempre tenir-ho previst.
Així és com jo ho veig, i és el que estam intentant dur a terme amb APSL. Personalment crec que qualsevol projecte de col·laboració que es presenti just en termes mercantilistes i d'oportunitat té poc futur. S'han de tenir en compte més coses. Tot i que es vulgui mantenir la llibertat de moviments que implica ser un professional autònom s'han d'establir unes regles de joc i s'han d'assumir tant beneficis com obligacions.
Traducciones/Translations by apertium
12 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes APSL
Cloud Application Architectures
Escrit per Aaloy a 01 de March , 2010 a les 8:34 p.m.
Avui he acabat de llegir "Cloud Application Architectures" de George Reese. Un llibre que no arriba a 190 planes però que està ple de consells damunt el que és l'arquitectura d'aplicacions al núvol.
La visió del llibre no és tant per tècnics com per a gestor d'IT que s'atraquen a aquest tipus d'arquitectura de desplegament. Basant-se sobretot en AWS Reese presenta l'AWS d'Amazon i la conveniència d'estar o no al núvol.
No entra en com configurar tal o qual cosa, sinó que entra en temes tals com els cost d'estar al núvol, el retorn de la inversió i el que hem de considerar abans de moure'ns cap allà. Avantatges i inconvenients.
Tracta també aspectes com la seguretat a AWS (donant molts bons consells, per cert), recuperació de desastres i entra un poc de passada en el dimensionament de l'arquitectura (el capacity planning) de la nostra aplicació.
És un llibre força entretingut que es devora amb rapidesa i també tremendament útil per tenir una visió de conjunt del que representa posar les nostres aplicacions al núvol.
L'altra dia algú deia que amb el núvol s'acabarien les feines de la gent de sistemes. Fent una llegida al llibre de Reese te n'adones que la feina no tan sols no s'acabarà, sinó que serà tant o més important que ara. Poder definir la capacitat adequada al nostre sistema, tenir un bon pla de contingència, còpies, encriptació de la informació, scripts d'aturada automàtics, de desplegament, control de la demanda, ... Feines que són necessàries i que s'han de fer també, de manera diferent de com se feien les coses.
Poder instal·lar un sistema operatiu a una màquina nova és trivial. El que se necessitarà son gent de sistemes que conegui els aspectes econòmics de desplegar aplicacions al núvol, ser capaç de definir scripts per automatitzar tasques, respondre a caigudes ràpidament, etc. etc. El que sí pareix que es necessitarà és gent potser d'un perfil concret: professionals de sistemes que sàpiguen programar, que estiguin còmodes amb una línia de comandes i que entenguin les implicacions econòmiques i de seguretat del que estan fent al núvol.
Llibre totalment recomanable doncs!
Fitxa tècnica:
Cloud Application Architectures George Reese Ed. O'Reilly ISBN 978-0-596-15636-7
Per cert, aprofitant que ara ho record, pos també els llibres que va recomanar Ricardo al darrer creant bits.
- Daemon, Daniel Suarez
- Freedom (TM) de Daniel Suarez
- Hight Performance MySQL de Arjen Lentz
- The Big Switch de Nicholas Carr
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Software Testing Techniques - An Empirical Approach
Escrit per Aaloy a 27 de February , 2010 a les 7:27 p.m.
Aquesta setmana passada vaig llegir la tèsi de Rory Tulk "Software Testing Techniques, an Empirical Approach" de l'Universitat de Toronto (una vegada més gràcies a Jordi Cabot per publicar l'enllaç). La tesi es pot trobar via la plana de Rory o bé descarregàr-se-la directament.
Rory investiga damunt les capacitat de testeig segons el grau de maduresa tècnica de qui fa el testeig. La hipòtesi és que els tècnics més experimentats són millors testejadors que els juniors. És un treball que s'ho paga llegir per la pròpia estructura de la tesi i veure com s'ha conduit l'experiment.
Però el que més m'interessa del tema són les conclusions: l'experiència no té massa a veure amb el nombre d'errors trobats però sí que pareix que té a veure amb els tipus d'errors que es troben. Encara que el nombre de casos estudiats fa que les conclusions no siguin estadísticament significatives, sí que entronca en les pràctiques més o manco habituals de fer que sigui una persona diferent de la implicada en el projecte de desenvolupament la que provi els programes, ja que sovint descobreix errors que s'han passat per alt als desenvolupadors, que en teoria són més experimentats trobant-los.
D'aquí una possible conclusió seria que els equips de testeig i qualitat han d'estar formats tant per gent senior com per gent menys experimentada, de manera que es puguin complementar mútuament. Això vol dir, però que hi ha d'haver una rotació en els equips de testeig, ja que en cas contrari així con els juniors es vagin convertint en programadors experimentats tendran tendència a trobar uns tipus d'errors concrets, i no provar coses que d'altra manera, sense els condicionants de l'experiència provarien.
L'altra conclusió marginal interessant és el bon funcionament de la lectura del codi com a eina per a la detecció d'errors. Segons Karl E. Wiegers autor de Peer Reviews in Software un lector experimentat de codi pot arribar a caçar fins al 90% d'errors en el codi. Dins l'estudi de Rory precisament qui té la taxa de detecció d'errors més grans és una persona que va fer servir el mètode de llegir el codi per a detectar els errors.
Una lectura interessant i que convida a reflexionar, ja que comença a donar una base per a estudis posteriors. El testeig no és, com moltes branques del desenvolupament, una ciència exacta, però el que pareix clar és que els equips de testejadors han de ser diversos en la seva manera de veure les coses i que no basta una manera de testejar. I tot i això segur que quedaran errors sense caçar, per saber més o manco quants ja sols ens queda anar cap a mètriques estadístiques com les corbes S o les corbes de Rayleigh. El Software Mesasurement and Estimation de Lida M. Laird an Carol Brennan ten té un bon grapat de mètodes estadístics.
Com a conclusió addicional: convé registrar els tests que es fan, els errors que es detecten i estudiar-los, no com a via per a premiar els testejadors (el típic de condicionar un pagament d'objectius) o de penalitzar els desenvolupadors, sinó com a manera d'estudiar estadísticament els tipus d'errors que s'estan trobant i poder saber quan convé renovar par de l'equip de testeig. L'estar en un equip de testeig per exemple podria ser part de la carrera professional d'un programador.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Tot són estils de gestió
Escrit per Aaloy a 26 de February , 2010 a les 1:23 p.m.
Un link passat per Jordi Cabot al Twitter anomenat Asshole driven development em fa recordar el complexe que és la interacció humana en la gestió de projectes.
Quan més gran és una empresa més possibilitats hi ha de veure's reflexat en una de les definicions que fa Scott Berkun, més que res per una qüestió de probabilitats. Personalment m'he trobat molt amb el Cover Your Ass Engineering (CYAE) ja que és el típic que es presenta quan enfrontes una solució de codi obert amb una solució propietària a un gestor més preocupat pel seu lloc de feina i cobrir-se les esquenes si hi ha el mínim risc, que per les possibilitats de benefici real de l'empresa.
L'_Asshole Driven development (ADD)_ realment m'ho he trobat poques vegades, més que res perquè quan m'he trobat en situacions on els tirs anaven cap aquí he preferit anar cap a opcions alternatives. Ja sabeu que em costa molt combregar amb rodes de molí, i l'ADD és precisament això: fer les coses no perquè són tècnicament correctes o millors per l'empresa, sinó perquè qui mana (que no és normalment l'amo de l'empresa) diu que s'ha de fer ell que ell diu i punt.
El que sí m'he troba sovint són dos estils d'entendre la gestió de projectes i la pròpia feina del cap de projecte. M'explicaré:
Per mi l'objectiu d'un projecte informàtic és sempre aportar valor a l'empresa. És a dir hi ha d'haver un benefici mesurable en el projecte, ja sigui benefici en imatge, en menor temps de feina intern per fer les coses, en un major control o el millor de tot, un benefici real en termes de negoci.
Partint d'aquesta base entenc la feina d'un cap de projecte de desenvolupament com el d'aquella persona que s'ha d'encarregar de coordinar la feina, relacionar-se amb el client i sobre tot, de prendre decisions. L'important és estar focalitzat en que la feina surti i representi un benefici pel client i per això el cap de projecte ha d'eliminar els obstacles que es presentin per tal que la gent que fa feina en el projecte pugui fer la feina que millor sap fer.
Això vol dir no convocar a reunions multitudinàries als membres de l'equip quan aquestes no aporten res. És encarregar-se d'anar a parlar amb altres departaments, amb el negoci, dur el control administratiu del projecte, fer el reporting. És a dir, totes aquelles coses que formen part de la cerimònia del projecte i que mal duites poden impedir als membres "productius" fer la seva feina.
Amb aquesta filosofia entenc que el cap de projecte ha de posar tots els recursos a la seva disposició per dur bon terme el projecte. Si el programador té problemes amb una rutina o amb el llenguatge ha de mirar de solucionar-los, bé ell mateix o cercant algú que ho pugui fer. Alguna vegada m'han dit que donar suport als programadors no és la meva feina i n'estic en total desacord. La feina d'un cap de projecte és precisament aqueixa: donar suport, i si aquest suport significa resoldre un dubte de programació, depurar en conjunt un algorisme on algú s'ha quedat enrocat, s'ha de fer si es tenen els coneixements i l'oportunitat. Perquè per damunt de tot el cap de projecte està per eliminar obstacles i donar solucions. Si un projecte ha de sortir i no puc ajudar més que en dur els cafès doncs millor llevar-se d'enmig i demanar a la gent pel sucre que vol i si els vols sols o tallats.
L'altra estil de gestió és òbviament el contrari: reunions per pressionar la gent, reunions per repartir culpes i concentració del cap de projecte en la cerimònia, és a dir, gestionar concentrant-se amb el com i no amb l'objectiu final.
Perquè està clar que tot projecte pot fallar, per les causes que siguin. Però quan falla l'excusa no pot ser anar cap a un Cover Your Ass Engineering (CYAE) i establir mecanismes burocràtics i de control absurds per a que no tornin passar les coses, sinó cercar la causa de base del problema i solucionar-la de manera que afecti de manera mínima a la cerimònia del procés.
Si un programa falla perquè no s'ha pogut provar, la solució no és tenir que redactar un document a casa passi a producció on l'equip de programadors certifica que està bé, el testejador certifica que ha provat l'aplicació i el tècnic certifiqui que ha passat el pegat que li han dit; sinó demanar-se perquè no hi ha tests unitaris, perquè no hi ha (o han fallat) les integracions contínues. Potser el que ha fallat és que la gent no té prou formació per a realitzar bons tests. Massa cerimònia mata la creativitat i far perdre l'objectiu del projecte, formar a la gent fa millors professionals.
Tot són estils de gestió, jo sé el que m'agrada i intent posar en pràctica, adaptant l'estil de gestió al client, al projecte i a l'equip. Els programadors no són els curritos del cap de projecte de torn, és el cap de projecte el qui ha de fer feia pels tècnics i programadors i procurar que ells puguin fer la seva feina.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica APSL
Ubuntu Netbook Remix
Escrit per Aaloy a 20 de February , 2010 a les 11:37 a.m.
Ahir vespre me va pegar per instal·lar l'Ubuntu Netbook Remix al Dell Latitude 2100 que vaig comprar fa uns mesos.
No l'havia actualitzat de versió i vaig trobar que era una bona ocasió per provar tant la creació d'una distribució en un USB com la pròpia distribució Netbook, a veure si aprofitaria millor l'espai.
Amb la configuració de fàbrica i una vegada instal·lades les utilitats bàsiques de programació em quedàven uns 3 GB de disc lliure dels 16 GB. Això implica tenir que anar alerta amb els documents que es decarreguen, fer neteja de tant en tant del projectes, etc.
Tampoc era res greu. Quan un compra un Netbook ja ha de ser conscient amb un disc d'estat sòlid de 16 GB es tindran unes limitacions d'espai que no hi ha a discs de Tera en que surten ara alguns ordenadors de sobretaula. Per mi el Netbook representa la mobilitat, té un configuracio mínima per fer feina i em permet dur-ho a la motxilla carregant 3 kilos menys que amb l'altra portàtil. Una eina per a cada feina!
Així que dit i fet!
- Baixam la distribució Ubuntu Netbook Remix
- Posam un llapis USB (que formatejarem així que al tanto amb les dades que hi teniu).
- Executam el programa
usb-creator-gtk, que ens demanarà l'ISO d'origen i l'USB de destí i formatejar l'USB destí. Ho feim i seleccionam la partició de l'USB. Nota mental: el diàleg de l'usb-creatores petit i no es veu la partició amb la qual cosa quedava seleccionat tot el disc i em deia que no hi havia espai lliure. Quan fas la instal·lació a les dues del vespre en el darrer que pensava jo era en redimensionar la finestra! :) Així que fora fer aquestes coses amb són. - Anam al Netbook. En arrancar pitjarem F12 per entrar a la configuració i canviar l'ordre d'arrencada per a que agafi primer l'USB. En acabar hem de pensar en deixar-ho tot igual. En el meu cas perquè tenc a més una tarjeta SD de 4GB addicionals i no vull que perdi temps en arrancar cercant el sistema operatiu que ja sé que no hi és.
- Una vegada arrancat amb l'USB ja sols es cosa de dir-li que instal·li. Li deim que faci servir tot el disc (es perdran totes les dades!) i a esperar una estona.
- Quan acaba la instal·lació tornam a deixar la prioritat de dispositius d'arrancada amb el disc dur com a primera opció i realitzam un
sudo apt-get dist-upgradeper deixar el sistema amb totes les actualitzacions i pegats. - Després convé actualitzar els controladors de maquinari per a que ens vagi millor la tarja WIFI.
- Gairebé ja està. Sols configurar les aplicacions preferides i instal·lar vim, virtualevn per Python, Chrome, yolk, git, shutter i trapassar la configuració de Vim. Amb això ja tenc un entorn de feina més que complet.
- Com que el Dell 2100 té pantalla tàctil convé fer-ne la configuració. Cosa de cinc o deu segons tocant creuetes i després ja tindrem un entorn on les aplicacions es poden engegar amb el dit i amb 11 GB liures.
La distribució per ara i amb poc menys de 5 hores que duc amb ella pareix força usable amb la pantalla tàctil funciona molt millor que amb la versió de fàbrica de Dell. Això sí ens hem d'acostumar a la manera de presentar les aplicacions: totes surten a pantalla completa, que amb el poc espai que hi ha disponible tampoc és cap mala cosa, però es fa un poc estrany al principi.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Codi lliure
Vim IDE per Django i Python
Escrit per Aaloy a 17 de February , 2010 a les 8:18 p.m.
Encara que faig servir distints editors i entorns integrats (IDE) per programar en Python i Django hi ha sempre la constant de retornar cap a Vim i gVim.
La cosa està però, en que per al desenvolupament normal no vull renunciar a un parell de coses que fan la vida més fàcil:
- Resaltat de sintaxi amb colors personalitzables i/o una paleta de colors còmoda per fer-hi feina.
- Autocompletat (dins cert límits, que això és un llenguatge dinàmic) i ajuda integrada.
- Plantilles per no haver d'escriure molt. Per exemple els shebangs, o els models de Django.
- Distints tipus de tabulació segons el llenguatge, quatre per Python, però 2 per HTML i Javascript.
- Possibilitat de tenir oberts molts arxius a la vegada i accedir-hi fàcilment
- Navegació pel sistema d'arxius integrada
I poca cosa més. Després quant més potent sigui l'editor millor, i per això Vim n'és de potent!! El problema és que ja m'agradaria poder fer servir amb agilitat un 20% de les seves capacitats.
En la meva recerca de l'editor perfecte he anat modificant el .vimrc i afegint plugins diversos, i configuracions que anat trobant d'aquí i d'allà. Per si a algú li va bé, he posat el meu .vimrc i .vim amb els plugins a l'appusedjango. Ja me contareu!
Eines per a la isntal·lació de plugins
Si feis un apt-get vim-addons obtindreu una petita utlitat que us permetrà veure quins plugins teniu instal·lats al vostres sistema i activar-los pel vostre usuari. En el meu cas tenc:
bufexplorer installed markdown-syntax installed matchit installed python-indent installed python_bike installed supertab installed surround installed taglist installed utl installed winmanager installed xmledit installed
En local (i instal·lats a mà) tenc també:
- ftplugin
- nerdtree_plugin
- snippetsEmu
- taglist
- mathit
- supertab
- vcssvn
Hi ha altres plugins interessants com el nerdcommenter i altres, però encara m'he d'anar acostumant al altres.
Referències
La veritat és que em costa dir d'on ho he tret tot, la configuració és una feina orgànica, he anat agafant coses d'aquí i d'allà, així que pos els darrers consultats.
Disclaimer: NO sóc cap expert amb vim, així que moltes coses van per assaig i error.
Download
-
El subversion: http://code.google.com/p/appfusedjango/source/browse/#svn/trunk/myvim
-
El .vimrc
- El .vim
Al svn trobareu un .vimrc que heu de posar al vostre home i un arxiu comprimit amb .vim que conté plugins, plantilles i demés, descomprimiu-lo també al vostre home.
No he de recordar la impirtància de fer còpies de seguretat de la configuració antiga abans de res, veritat?
Pels debianites i ubuntaires
Per a tenir l'entorn funcional necessitareu instal·lar
- sudo aptitude ctags
- sudo aptitude vim-addons-manager
- sudo aptitude vim-python (segons versions...)
comprovat per bibigeek (gràcies!) pels ubuntaires amb PPC com jo, no hi ha vim-python i convé recompilar vim amb suport per Python.
Esper que us sigui d'utilitat!
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Nocturna
Escrit per Aaloy a 14 de February , 2010 a les 8:53 p.m.
Entre lectures informàtiques i altres herbes aquests dies m'he estat llegint Nocturna, una història de vampirs i zombies de Guillermo del Toro y Chuck Hogan.
Al principi la novel·la comença amb poc ritme, però després de les cent primeres planes la cosa s'anima i quan l'acabes ja veus que la història quedarà incompleta, que potser és sols un començament.
La mà de Guillermo del Toro es nota en el desenvolupament de la història i la presentació dels personatges, tant que ben bé podría ser un guió.
Supòs que el llibre no serà mai considerat com una de les joies de la literatura però entretén.
Nocturna Guillermo del Toro i Chuck Hogan Círculo de Lectores ISBN 978-84-672-3689-7
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
The medici effect
Escrit per Aaloy a 06 de February , 2010 a les 7 p.m.
Avui he acabat de llegir The Medici Effect, un llibre que em va recomanar fa unes setmanes Greg Garrison, un de les persones amb més idees que m'he trobat fa temps.
The Medici Effect tracta de la innovació, dels camins que duen a les noves idees. De com la mescla de conceptes, experiències i gent dóna lloc a noves idees, a nous productes que trenquen amb tot el que hi havia fins al moment. Es creen nous negocis, nous camps d'investigació, noves empreses no de manera evolutiva sinó disruptiva, fruit d'una combinació de factors i de gent.
El llibre tracta de com poder conseguir aquest factor disruptiu, de com trobar el Frans Johansson, l'autor, anomena la intersecció. El punt de trobada on les corrents i les idees es mesclen i donen lloc a una cosa nova.
Johansson ens mostra amb exemples com distintes persones i empreses són conscients d'aquests tipus de combinacions i de com els cerquen activament en els seus negocis.
El llibre és prou interessant, motivador fins i tot. Alguns dels consells que dóna són prou bons. Tot i això les idees que presenta es poden resumir en pocs conceptes:
- Cerca la intersecció.
- Reconeix la innovació
- Assumeix el canvi i no tenguis por a trencar barreres i xarxes socials.
- Assumeix el risc
Amb això vull dir que és un llibre que es podria haver estalviat un 50% de les 190 planes de text. Sovint es fa repetitiu ens alguns exemples i es perd un poc per les bardisses a l'hora de focalitzar el tema.
En resum, un llibre interessant, que convé llegir, especialment si ja us heu convençut de que la innovació és una bona cosa, sou capaços de generar idees o simplement voleu una visió de com altres gestionen projectes i idees que canvien el món.
Fitxa Tècnica The Medici Effect Frans Johansson Harvard Business Scholl Press ISBN-13: 978-1-59139-186-9
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Llibres i revistes Gestió de projectes
L'oficina autista
Escrit per Aaloy a 06 de February , 2010 a les 12:27 p.m.
L'autisme es caracteritza per una escassa interacció social, problemes en la comunicació verbal i no verbal, activitats i interessos greument limitats, inusuals i repetitiu. Viquipèdia
Aplicat a l'activitat laborar podem parlar de l'oficina autista, aquell entorn de treball en que les condicions ambientals, d'organització i de feina fan que la gent es retragui en ella mateix, minimitzant la comunicació i la interacció a nivells mínims, interessant-se sols pel que passa pel seu redol i intentant frenar i minimitzar qualsevol tipus de canvi.
Un dels símptomes de l'oficina autista és entrar i veure que molta gent té els auriculars posats i es sent el remor de la música sonant a les seves orelles. Això i un entorn renouer i amb una densitat de gent molt gran.
De Marco a Peopleware ja tracta el problema de la densitat de gent i la productivitat. Encara que una persona pugui fer feina en un espai reduït, posar molta gent mantenint la proporció d'espai fa que el renou i la sensació d'agobi augmentin. Suposem que una persona necessita 5 m² per fer feina, no és el mateix tenir 4 persones a un despatx de 20 m² que tenir 40 persones a una oficina de 200 m², la quantitat d'interaccions, renous, gent anant amunt i avalls, ... La productivitat es ressent.
Els tècnics però som gent que ens agrada fer feina i que la feina surti. De Marco diu que en aquests casos la gent intentarà fer feina de la millor manera que pugui, escapant-se a sales de reunions i a altres espais menys problemàtics. Avui en dia tenim tota casta d'aparells electrònics que ens permeten aïllar-nos d'un entorn poc apte per a la feina.
Aquest aïllament, però, té un problema fonamental, l'oficina es converteix amb una oficina autista. La gent no participa del que es cou ni tant sols amb el seu grup de treball. Els comentaris i la comunicació informal no existeixen. Per comunicar amb la gent del mateix equip i que està a pocs metres es necessari l'enviament d'e-mails i convocar reunions. La productivitat decau, es perd la sensació d'equip i de grup.
Potser algú ara dirà que ell es posa els cascs perquè fa feina millor amb música. Això no hi té res a veure, encara que trobem estudis que diguin que això no és veritat en tasques que requereixen molta concentració també segurament en trobarem que diuen tot el contrari. Aquests tipus d'estudis poden estar desviats per mor del que s'anomena Efecte Hawthorne. El fet però, que fins i tot en els casos de que hi pugui haver un petit augment de la productivitat personal, es perd la productivitat del grup, que és molt més important.
Si l'oficina és autista és quelcom que s'ha de millorar. Si no ho és hem de procurar que no s'hi convertesqui (sobretot si no hi ha factors ambientals associats). La comunicació ha de ser fluïda, les comunicacions formals s'han de deixar per coses formals. Si volem gaudir de la productivitat i eficiència que dóna fer feina amb grup hem de crear els factors ambientals que la facin possible. Si els factors ambientals són bons, no hi ha excusa per a deixar que l'aïllament autoimposat impedeixin una comunicació eficaç.
Traducciones/Translations by apertium
10 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Ressenya de creant Bits al núvol
Escrit per Aaloy a 05 de February , 2010 a les 11:19 p.m.
Tercera edició del creant bits, aquesta vegada amb un convidat d'excepció, Ricardo Galli, quen ens xerrà de como havien passat el meneame des d'una instal·lació clàssica a una configuració damunt Amazon AWS.
Com sabeu gràcies a la iniciativa del Parc Bit, a les empreses incubades com la nostra, APSL ens deixen disposar d'algunes sales per a les reunions, conferències, etc.
A les 14:15 aproximadament arribàrem al Parc Bit i la gent de seguretat ens obrí la sala. Deixàrem els portàtils i començarem a deixar llesta la sala. En Guillem, el tècnic, del Parc Bit i el personal de seguretat com sempre ens donaren totes les facilitats possibles, sense ells iniciatives com aquesta tampoc serien possibles.
L'aforament de les sales és limitat, però tot i estar un poc estrets i després de reordenar cadires i taules sortírem a menjar un poc. Entrepà ràpid i a les 15:30 a la sala a deixar les quatre coses que faltaven llestes: aigua, caramels i com no les gominolas que s'estan convertint en una tradició. Potser l'associació de dentistes i dietistes ens hauria de patrocinar alguna jornada, després de tot els durem molts clients! :)
Arriba Ricardo i comprovam que tot va bé. Vol fer l'experiment de fer streaming de video amb Ustream des del mòbil amb Android. Jo també havia fet experiments a casa amb el meu i es veia prou bé, però no n'estava del tot convinçut.
Al final podem configurar un "soport", mont un bastiment amb els seu mòbil amb una capseta per dur els disc dur portàtil. El disc dur fa de contrapès i la capsa té el tamany ideal, connectam el cable d'alimentació per USB al portàtil d'En Pau, que ens dona l'autonomia que necessitam sense tenir que passar allargadors per les taules.
La sala està plena, l'atenció és màxima, En Ricardo es un crack explicant i contant les coses. La gent pel twitter ens diu que l'streaming va prou bé. Fantàstic! Així ho podrem anar fent a propers actes.
La xerrada amb Ricardo no pot ser més interessants: aspectes tècnics, aspectes de configuració, exemples, aspectes econòmics i projeccions de futur.
Particularment de la xerrada he sortit amb idees addicionals:
- fer servir un entorn al núvol com a entorn de desenvolupament i proves
- entorn d'integració contínua. El Hudson per exemple permet distribuir la càrrega en molt de servidors. L'AWS ens permetria passar els tests d'integració amb un temps molt curt a un preu més que raonable.
- Consolidació de servidors. A partir de 4 servidors dedicats (segons els meus càlculs) és econòmicament rentable anar cap al núvol, no hi ha pràcticament diferència de preu i l'escalabilitat i flexibilitat és molt gran.
Qued estorat de les capacitats de l'AWS, del ben pensat que està tot. Està fet per ser usable i provat en condicions reals, la de tenir que escalar un lloc web com Amazon. La gent d'Amazon ha convertit una despesa en un negoci. Ells haurien de tenir quelcom semblant a l'AWS per el seu propi lloc. Amb un cost marginal que supòs que deu ser molt baix han creat un negoci nou.
També me n'adon del que està passant: Ricardo ens està contant no tan sols com ho han muntat amb pels i senyals, sinó que a més ens diu les dificultats que ha tingut, els perquès de cada cosa i ens presenta els cost real del que paguen, desglossat amb cada concepte. No és gens habitual i és una cosa més que fa que la xerrada sigui tant interessant.
Acabam com a quatre hores després. La xerrada ha estat molt bé, hem après coses noves i ens hem divertit. Què més es pot demanar?
Gràcies a tots els que heu vingut al Parc Bit a compartir un horabaixa amb nosaltres, als voluntaris que ens han ajudat a muntar i desmuntar i a tots els que ens heu segui per Ustream i el twitter, i obviament moltes gràcies a Ricardo per ser així com és i compartir amb nosaltres la seva experiència.
Enllaços
El hashtag de la jornada ha estat #creabits o bé i gràcies al cromo de DZPM twetchat, el genèric és #creant_bits.
Els vídeos: video de la primera part i a video de la segona part i la presentació en pdf.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Informàtica APSL
Code for food
Escrit per Aaloy a 03 de February , 2010 a les 5:17 p.m.
La frase "I will code for food" és un acudit que un és pot trobar referint-se al mal pagat que estam la gent que es dedica a la informàtica en general, i també per a indicar que un programador vocacional pot voler fer la seva feina a canvi de no res (i el problema és que sovint ho fa).
En el meu cas el code for food s'estava convertint en una sensació. La sensació d'estar de florero i de estar a un lloc veient passar les hores sols per a poder dur un sou a casa.
No ho puc fer jo això. Potser me trobaré amb la necessitat del "I will code for food", però la realitat és que m'agrada massa aquesta professió com per a ser un simple espectador, així que ha arribat l'hora de emprenndre noves aventures i deixar una pseudo-comoditat per anar cap el desconegut, cap a l'aventura de dur endavant nous projectes i reptes.
No puc dir que per una part no em sàpiga greu, he conegut gent molt bona durant aquests sis darrers anys (i també vertaders ineptes, tot s'ha de dir) i estic encantat l'equip de gent amb la que he fet feina, des de la gent que em va aguantar en els temps difícils de reestructuració com a cap de suport i instal·lacions, fins als distints equips de gent que m'han tingut de cap de projecte de desenvolupament web. Hem fet moltes coses, duit a terme molts projectes, hem rigut i ens hem indignat plegats, ... És una experiència que m'ha enriquit com a persona, perquè se'ns dubte, de la professió el més important no és la tecnologia en sí, ni els ordinadors més o menys ràpids, el més important és la gent.
En la nostra cultura no estam acostumats a que la gent deixi una feina segura, potser perquè internament hi ha molta gent que aspira a ser funcionari. Personalment crec que deixar una feina (tenguis o no un altre projecte) ha de ser una decisió meditada, però que ha de ser una opció que ha d'estar allà. Consider que una feina com la informàtica pot i ha de ser quelcom més que una feina, jo l'entenc com a una vocació.
Deix una feina "segura" perquè em va la marxa, perquè vull sentir-me bé amb jo mateix, perquè m'agrada massa la feina que he triat com a professió, perquè vull aixecar-me als matins amb ganes d'anar a fer feina i no amb la sensació que he d'anar a passar l'estona a una cadira. Vull que la meva feina servesqui per a generar negoci, tenir el convenciment de que el que faig contribuirà a donar valor. Potser és mal d'entendre però cada un és com és.
Eps! I'll code for food :)
Traducciones/Translations by apertium
16 comentaris, 0 trackbacks (URL) , Tags: Informàtica General APSL
Ressenya de creant Bits, el déjà vu
Escrit per Aaloy a 30 de January , 2010 a les 10:41 a.m.
El segon creant bits dedicat a la introducció de Python i Django d'ahir va a tornar aplegar un bon nombre de gent interessada per la programació i per Python i Django.
Cares conegudes i gent que vaig poder desvirtualitzar. Em va fer especial il·lusió poder desvirtualitzar Guillem, ja que per un motiu o altre mai ens havíem pogut trobar personalment.
Aquesta vegegada preferírem no allargar molt la jornada i no es donà la xerrada damunt la posada en producció d'aplicacions Django. La passada jornada En Bernat va tenir molt poc temps i acabarem molt tard, així que ho hem deixat per a una millor ocasió.
Aquest pic el consum de gominolas per part dels assistents va ser menor, lluny del rècord de kilo i busques de l'altra vegada. :-P La idea és que si algú s'avorreix al manco se n'endurà un sabor dolç de boca.
Entre l'anecdotari comentar el mal cos que se'ns quedà a tots quan un tassó d'aigua va vessar damunt un portàtil Macbook Pro nou de trinca. Després de netejar-lo va tornar a la vida i esper que segueixi així. Hi va haver un segon intent de tragèdia, quan el que es va vessar va ser cafè i no aigua, afortunadament aquest cop no va tocar el portàtil.
Sols me queda agraïr l'assistència de tots i especialment dels companys que donàren l'assistència tècnica i ajuda. Esper que tothom se n'anàs amb una millor idea de la que tenia a l'entrada damunt el que és Python, el que es pot fer i de la potència de Django per al desenvolupament web.
Ara a encalentir motors per a la xerrada de Ricardo al proper creant bits.
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: Python Django
Agile Estimating and Planning
Escrit per Aaloy a 22 de January , 2010 a les 6:31 p.m.
Avui he acabat de llegir Agile Estimating and Planning de Mike Cohn. És un llibre dens, d'unes 300 planes plenes de bons consells, gràfics, fórmules i metodologia.
Encara que el títol fa referència a l'estimació de projectes àgils, més aviat diria que és un manual de metodologia àgil i en especial d'Scrum. Tenc llibres dedicats a Scrum que no són tan instructius com ho és aquest.
Cohn ensenya la distinció entre estimar tamany i durada i introdueix molt bé el concepte scrum de la velocitat de l'equip. Però sobretot es concentra en una idea molt clara: l'important no és l'estimació en sí, sinó en donar valor al negoci, per això dedica 4 capítols a la priorització i a la orientació cap al retorn de la inversió i la generació de valor. Potser són els capítols més densos del llibre, però marquen la diferència d'aquest llibre amb d'altres. Segons la nomenclatura de marketing ho classificaria com un excitement, quelcom que no m'esperaba trobar així i que m'ha sorprés gratament.
De la penúltima compra que vaig fer és de ben llarg el llibre més interessant. Fa estona vaig acabar el "Behind the closed doors" i encara que està bé, aquest és un llibre que l'eclipsa, tant per la manera que té Mike Cohn de plantejar els temes com per la quantitat d'inforamció útil que ens proporciona.
Altament recomanable per tots aquells interessats en les metodologies àgils.
Fitxa tècnica
Agile Estimating and Planning Mike Cohn Ed. Prentice Hall ISBN: 978-0-13-147941-8
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
Editors, IDEs i eines
Escrit per Aaloy a 19 de January , 2010 a les 7:01 p.m.
Ahir en Jordi Cabot em demanava l'opinió per Twitter dels IDEs, ja que hi ha gent que vol fer el que s'anomena web modeling tools, és a dir, passar les eines de modelat a un entorn Web.
Jordi no n'està massa convençut de la idea, ja que per exemple, els IDEs de programació per web no pareix que tenguin tirada, i fins i tot molta utilitat en aquests moments.
Particularment els llenguatges de modelat com l'UML m'agraden com a eina comú per a comunicar idees i no com a una eina per a la generació d'aplicacions completes. Veig utilitat a les eines de modelat web quan hom tengui entorns dispersos i col·labortius, on aquestes eines, amb un llenguatge simbòlic comú, serveixin per a definir i comunicar conceptes i tasques. Això no seria més que una pissara col·laborativa potenciada amb eines per fer més fàcil el dibuix. Ja està prou bé tot i així.
Actualment hi ha un grapat d'eines web per a la construcció de wireframes, interfícies d'usuari on l'important no és el disseny final, sinó la col·locació de cada component i la idea general de la interfície. Aquestes aplicacions son prou sofisticades, però no tenen massa a oferir respecte aplicacions com Pencil si no és per seva manca d'instal·lació i el tenir els dissenys a la web. Manca però el que es pugui fer un disseny realment col·laboratiu, on tothom pugui aportar idees damunt el mateix disseny, que és el que afegiria vertader valor a aquest tipus d'eines.
En el cas dels IDEs no es tracta sols de comunicar, es tracta de codi que s'ha d'escriure. Encara que es pot argumentar que un programador es passa més temps pensant i depurant que escrivint codi, el cert és que tenir un bon editor és fonamental. Per mi aquí el que és fonamental és tenir control del codi i poder treure el màxim suc de l'editor i de l'entorn.
Amb això vull dir que per defecte defuig de llenguatges de programació que m'imposen un editor o un IDE concret i que no s'integren amb un control de versions obert com subversion (com a mínim). L'IDE no importa, és que importa és el codi i el llenguatge i les restriccions que aquest imposa a l'hora de desenvolupar.
Els IDEs tenen de bo que ens donen la feina de triar les eines feta: editor, depurador, control de versions, tot ben integrat si hi ha sort, de tal manera que no fa falta canviar de programa per fer les tasques més habituals i això representa una bona ajuda per aquells que s'atraquen per primera vegada a un llenguatge de programació. També es força habitual que els IDEs editors molt potents, amb autocompletat, gestió d'arxius, cerques avançades, etc. És a dir, ajudes a la productivitat que ens poden anar molt bé.
Però hem de ser conscients que tot això té un preu: els IDEs són feixucs, consumeixen molts recursos de màquina i poden no donar-nos totes les característiques que volem: el depurador pot ser massa simple o no funcionar, estar limitats a un llenguatge de programació, no ser compatibles amb el nostre control de versions...
Aquests tipus de limitacions segurament no la trobarem a editors com Vim, o Emacs o semblants, ja que es limiten a les tasques d'edició i miren d'arribar al nombre més gran de llenguatges possible. Les eines de depuració o control de versions queden fora, se n'han de fer servir d'externes. Això no representa massa problema per gent acostumada a fer feina en entorns Unix, però sols representar un entrebanc important per la gent que sols fa feina amb Windows i en que anar a la consola pot representar un vertader trauma.
Particularment m'agraden els IDEs i els faig servir més o menys en funció del llenguatge i del programa que estic fent. Per a escriure Python faig servir Netbeans o Ulipad darrerament, per Java fonamentalment Eclipse, perquè m'agraden les ajudes que tenen, fent-me la vida més fàcil. Però tot i agradar-me procur no dependre'n i moltes vegades acab amb el vim com a editor, encara que sigui sols per mantenir el múscul actiu.
El que no m'agraden són els IDEs de programació que t'amaguen el que hi ha per davall, que no et deixen anar al codi o que es guarden el codi (como el PL/Forms d'Oracle). Però fixau-vos que no és culpa dels IDEs, és per pròpia construcció del llenguatge de programació, l'eina és sols un reflex del que hi ha per davall.
Per mi no és tan important l'eina que es faci servir per editar el codi com que aquesta no vulgui tenir el monopoli del codi editat. El codi ha de poder modificar-se independentment de l'editor, ha de poder posar-se en un control de versions, hem de poder saber els canvis que se n'han fet.
Les eines gràfiques de generació de codi (que alguns venen com a els nous IDEs) ens amaguen el codi, la visualització del que fan és molt complexe quan les tasques a realitzar van més alla dels exemples bàsic i fan molt difícil saber què s'ha canviat i a on, i el treball en equip es coordina bloquejant la tasca dels altres. Aquests IDEs no m'agraden. Poden significar un augment de productivitat inicial, però no escalen bé en programadors i representen una hipoteca tecnològica (i sovint pecuniària) de la qual n'hem de ser ben conscients.
Com a programador estic sempre a la recerca de l'eina perfecte, que em permeti desenvolupar programés més ràpid i ser més productiu, però hi ha coses a les que no puc renunciar: al control del codi, al control de versions i sobretot a poder canviar d'eina quan jo vulgui.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
FireLogger per Python
Escrit per Aaloy a 15 de January , 2010 a les 3:42 p.m.
Quan hom fa feina amb Django una de les primeres coses que aprèn és a mirar la consola del servidor de desenvolupament. Al la consola hi apareixen els missatges d'error i els logs bé en forma de prints o com a logs de Python.
Convé evitar fer prints i fer servir els logs. Aprofitarem el funcionament del logger per tal de discrimitar els tipus de log i distingir entre els missatges que volem que es mostrin sols en depuració (DEBUG), errors o informatious.
Una configuració molt bàsica del logs és la que propòs a projecte base d'appfusedjango, molt ràpidament:
Al properties.py o al settings configuram el sistema de log
1 2 3 4 5 | import logging logging.basicConfig( format="%(asctime)s-%(levelname)s-%(name)s-%(lineno)s-%(message)s", level = logging.DEBUG, ) |
i a cada arxiu on el volguem fer servir
1 2 | import logging log = logging.getLogger(__name__) |
Això ens permte configurar a un sols lloc el nivell de log que volguem i a més saber des d'on s'estan generant els missatges.
Com a retruc, a més ens servirà per poder mostrar els logs a la consola del Firebug gràcies a l'aplicació FireLogger.
Aquesta aplicació té una instal·lació en dues parts, ja que hem d'instal·lar el plugin de Firefox que hi trobareu a la plana (la versió 0.7 en el moment d'escriure això) i després instal·lar les llibreries Python necessàries.
La plana recomana fer servir easy_install però en aquests moments el paquet que hi ha al PyPi està desactualitzat així que millor instal·lar-ho a mà:
sudo easy_install paver sudo easy_install jsonpickle git clone git://github.com/darwin/firepython.git cd firepython sudo python setup.py install
Amb això a una Ubuntu basta. Una vegada insta·lat anirem a la nostra palicació Django i a la secció del MIDDLEWARE_CLASSES afegirem
firepython.middleware.FirePythonDjango
Podem obrir ara la consola de Firebug i trobarem una nova secció anomenada Logger. Aquí apareixeran els missatges de Log de la nostra aplicació. Podem filtrar per la criticitat del log i a la mateixa vegada tenim tota la potència del Firebug per a la depuració de l'aplicació.
Una bona eina per tenir al caixó de les de desenvolupament i depuració.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Creant bits al núvol
Escrit per Aaloy a 12 de January , 2010 a les 12:01 a.m.
Atenció:
La inscripció es tancada. Hem superat el màxim de la sala i estarem estrets :) El comentari número 31 marca el límit, a partir de pacoros ja no n'hi caben més!!
N'Andrés ens ha creat el link al Google Calendar, aprofitau-ho per no oblidar l'edeveniment.
Si algú per les raons que siguin al final no pot venir per favor que ho digui i així donam l'oportunitat a altra gent.
Gràcies a tots!
L'any comença fort i interessant!
Moltes vegades m'haureu sentit dir que la gent que programa ha de tenir coneixements d'arquitectura de maquinari (i a la inversa). Els projectes web no són sols programació, sinó que són el resultat de la unió, de l'equip.
Per això em complau anunciar-vos un nou creant bits, aquesta vegada dedicat a sistemes. Encara no hem tancat les presentacions, però sí que us puc avançar que comptarem amb la presència de Ricardo Galli, que ens parlarà de primera mà de com Menéame va migrar al núvol d'Amazon.
Creant Bits al Núvol
Dia: 5 de febrer de 2009
Lloc: Parc Bit, sala de premsa. Carretera de Valldemossa, Km 7,5 Palma
Horari: començam a les 16:00
Presentacions:
- Meneame al núvol
- per concretar.
Organitza: APSL
Agraïments: Al Parc Bit, que ens deixa la sala i molt especialment a Ricardo.
Com apuntar-se?
Deixau un comentari a aquest apunt. Teniu en compte que la capacitat de la sala és limitada, podem arribar com a molt, molt a 30 persones.
FAQ
- Hi haurà streaming? Per ara no. Muntar saraus amb streaming y demés implica mobilitzar a molta gent. moltes coses que poden fallar, molts nirvis. Fem-ho fàcil i podrem seguir.
Aquesta vegada, també fora catering! :-P
Traducciones/Translations by apertium
39 comentaris, 0 trackbacks (URL) , Tags: Informàtica Codi lliure APSL
Creant Bits, el déjà vu
Escrit per Aaloy a 07 de January , 2010 a les 9:24 p.m.
Em complau anunciar una segona edició de Creant Bits destinada a tots aquells i aquelles que no poguéreu assistir a la primera.
Els contingut seran bàsicament els mateixos, en tot cas mirarem de resoldre algunes mancances de la primera presentació, però en un 99% serà tot el mateix:
- Introducció bàsica al llenguatge Python, amb exercicis.
- Introducció a Django: arquitectura i possibilitats
- Instal·lació d'una aplicació Django a Apache.
La sala serà la mateixa que a la presentació anterior.
Creant Bits, el déjà vu
29 de gener de les 16:00 a les 21:00
Sala de Formació - Parc Bit
Pensau a dur el portàtil carregat amb el Python instal·lat. Hi ha connexió inhalàmbrica a la sala i el Parc Bit ens deixa un projector.
La sala té una capacitat per a 20 persones màxim. Per apuntar-vos deixau un comentari a aquest apunt.
Per cert, aquesta vegada tampoc hi ha catering! :)
Traducciones/Translations by apertium
23 comentaris, 0 trackbacks (URL) , Tags: Python APSL Django
Si House fos programador ...
Escrit per Aaloy a 04 de January , 2010 a les 7:35 p.m.
Ahir estava mirant la presentació de James Bennet a la DjangoCon anomenada "UR DOIN IT WRONG" i me'n vaig adonar que feia referència a una sèrie de màximes tipus:
#11919 No. You must believe the ERROR MESSAGE. You MUST believe the error message.
La conferència és molt bona, us la recoman. El cas, però, és que em va picar la curiositat i vaig seguir l'enllaç fins a arribar a una entrada de comp.lang.perl.misc del març del 2002 on Mark Jason Dominus feia una relació de consells que ell tenia a un arxiu anomenat File of Good Advice.
Les màximes, encara que plenes de sentit comú, tenen una mala llet considerable, i m'han recordat al nostre metge de la tele favorit. Supòs que no desapareixeran de la xarxa, però per si un cas les torn a escriure aquí. Ha passat temps, però la majoria són perfectament aplicables! Esper que les disfruteu tant com jo ho he fet.
#11900 You cannot just paste code with no understanding of what is going on and expect it to work. #11901 You can't just make shit up and expect the computer to know what you mean, Retardo! #11902 You said it didn't work, but you didn't say what it would have done if it *had* worked. #11903 What are you really trying to accomplish here? #11904 Who the fuck cares which one is faster? #11905 Now is the time in our program where you look at the manual. #11906 Look at the error message! Look at the error message! #11907 Looking for a compiler bug is the strategy of LAST resort. LAST resort. #11908 Premature optimization is the root of all evil. #11909 Bad programmer! No cookie! #11910 I see you omitted $! from the error message. It won't tell you what went wrong if you don't ask it to. #11911 You wrote the same thing twice here. The cardinal rule of programming is that you never ever write the same thing twice. #11912 Evidently it's important to you to get the wrong answer as quickly as possible. #11913 Gee, I don't know. I wonder what the manual says about that? #11914 Well, no duh. That's because you ignored the error message, dimwit. #11915 Only Sherlock Holmes can debug the program by pure deduction from the output. You are not Sherlock Holmes. Run the fucking debugger already. #11916 Always ignore the second error message unless the meaning is obvious. #11917 Read. Learn. Evolve. #11918 Well, then get one that *does* do auto-indent. You can't do good work with bad tools. #11919 No. You must believe the ERROR MESSAGE. You MUST believe the error message. #11920 The error message is the Truth. The error message is God. #11921 It could be anything. Too bad you didn't bother to diagnose the error, huh? #11922 You don't suppress error messages, you dumbass, you PAY ATTENTION and try to understand them. #11923 Never catch a signal except as a last resort. #11924 Well, if you don't know what it does, why did you put it in your program? #11925 Gosh, that wasn't very bright, was it? #11926 That's like taking a crap on someone's doorstep and then ringing the doorbell to ask for toilet paper. #11927 A good approach to that problem would be to hire a computer programmer. #11928 First get a book on programming. Then read it. Then write the program. #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way. #11930 Would you like to see my rate card? #11931 I think you are asking the wrong question here. #11932 Holy cow. #11933 Because it's a syntax error. #11934 Because this is Perl, not C. #11935 Because this is Perl, not Lisp. #11936 Because that's the way it is. #11937 Because. #11938 If you have `some weird error', the problem is probably with your frobnitzer. #11939 Because the computer cannot read your mind. Guess what? I cannot read your mind *either*. #11940 You said `It doesn't work'. The next violation will be punished by death. #11941 Of course it doesn't work! That's because you don't know what you are doing! #11942 Sure, but you have to have some understanding also. #11943 Ah yes, and you are the first person to have noticed this bug since 1987. Sure. #11944 Yes, that's what it's supposed to do when you say that. #11945 Well, what did you expect? #11946 Perhaps you have forgotten that this is an engineering discipline, not some sort of black magic. #11947 You know, this sort of thing is amenable to experimental observation. #11948 Perhaps your veeblefitzer is clogged. #11949 What happens when you try? #11950 Now you are just being superstitious. #11951 Your question has exceeded the system limit for pronouns in a single sentence. Please dereference and try again. #11952 In my experience that is a bad strategy, because the people who ask such questions are the ones who paste the answer into their program without understanding it and then complain that it `does not work'. #11953 Of course, this is a heuristic, which is a fancy way of saying that it doesn't work. #11954 If your function is written correctly, it will handle an empty array the same way as a nonempty array. #11955 When in doubt, use brute force. #11956 Well, it might be more intuitive that way, but it would also be useless. #11957 Show the code. #11958 The bug is in you, not in Perl. #11959 Cargo-cult. #11960 So you threw in some random punctuation for no particular reason, and then you didn't get the result you expected. Hmmmm. #11961 How should I know what is wrong when I haven't even seen the code? I am not clairvoyant. #11962 How should I know how to do what you want when you didn't say what you wanted to do? #11963 It's easy to get the *wrong* answer in O(1) time. #11964 I guess this just goes to show that you can lead a horse to water, but you can't make him drink it. #11999 You are a stupid asshole. Shut the fuck up.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django Conyes marineres
Shutter i Pencil com a eines de comunicació
Escrit per Aaloy a 02 de January , 2010 a les 12:48 p.m.
Avui m'agradaria parlar de dues eines que crec que ens poden ajudar molt en la tasca de comunicar-nos amb el nostre client a l'hora de definir un projecte: pencil i shutter.
Pencil és una eina que s'instal·la com a un plugin de Firefox (encara que es pot executar de manera independent) i que serveix per fer diagrames orientats a interfícies d'usuari. Ha evolucionat molt darrerament i ens permet crear prototips prou rics en widgets, tant per a definir interfícies d'escriptori com per a definir interfícies web. En la versió 1.1-rc2 que és la que he estat provant, ens permet crear documents multiplana, crear els nostres propis components, té un visor d'imatges que enllaça amb openclipart i ens permet exportar el disseny creat a a html, pdf o odt.
Shutter és un capturador de pantalla avançat, el millor que he vist fins ara per Linux. Ens permet capturar la pantalla, una finestra, un troç de finestra i modificar mínimament la imatge aplicant-li efectes o afegint-hi text. És a dir, té tot el necessari per a convertir-se en una eina imprescindible a l'hora de fer manuals o documentació que impliquin afegir imatges d'un programa.
Per mi aquestes eines tenen un gran valor. Pencil permet definir l'estructura bàsica d'una aplicació sense perdre massa temps i sense entrar en el disseny final. És a dir, ens permet avançar en el què ha de fer l'aplicació en lloc d'enrocar-nos en l'aparença de la mateixa. Això és molt important en les etapes inicials dels projectes, pensau que molta gent no sap el que vol, i encara que sàpiga el que vol teniu en compte que la feina d'un cap de projecte no és tant donar al client el que vol sinó donar al client allò que necessita. Tenir eines que ens permetin comunicar a alt nivell per a poder esbrinar què és allò que es vol ver és força important. Aquestes eines per la seva banda han de ser tals que no ens dugui massa feina ni esforç crear els dissenys, ja que per una banda el projecte encara no sabem si es farà i per altra se suposa que hi haurà força canvis, així que les iteracions entre les xerrades amb el client i els canvis que es puguin fer han de ser molt ràpides. Pencil trob que comença a tenir una bona relació entre capacitat de comunicació i velocitat a l'hora de fer els canvis.
La veritat és que els wireframes en aquestes etapes es podrien fer perfectament amb llàpis i paper. Hi ha autors que recomanen que sigui així. Això però quan es posa en un pressupost o dins una presentació no té l'impacte visual necessari per a donar una imatge de qualitat al projecte, i per tant que en lloc d'eines com Pencil es pugui fer servir paper i llapis de colors i un escanner depèn més de l'audiència a qui va destinada la presentació o el pressupost que el que sigui possible fer-ho d'una maner o altre.
Eines com Shutter i Pencil ens donen la capacitat de fer bons pressuposts, tutorial; concentrant-nos en el que es vol dir i donar la referència visual. Són un estalvi de temps i donen lloc a un augment de les nostres capacitats de comunicació, en el que volem dir sense que el temps per posar-ho elegant sigui un impediment.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Codi lliure
Connectant el blog amb Twitter
Escrit per Aaloy a 30 de December , 2009 a les 5:06 p.m.
Feia estona que volia connectar el blog amb Twitter, de manera que cada vegada que escrigui un post s'envii directament a Twitter sense tenir que fer-ho jo. No és gran cosa, però és la vagueria informàtica: si es pot automatitzar perquè fer-ho a mà? :)
De llibreries de connexió cap a Twitter des de Python n'hi ha un bon grapat, la majoria el que fan és crear un envolcall a l'API de Twitter per tal que sigui més manejable des de Python i evitar repeticions de codi.
La llibreria que jo he fet servir s'anomena twython i té el mèrit de ser la primera que he provat. Potser n'hi ha de millors o més completes, però pel que he de fer ja basta.
El que vull doncs és que cada vegada que escrigui un nou post, s'envii un nou Twitt. Per fer-ho hi havia dues opcions clares: sobrescriure el mètode save del model o bé utilitzar senyals.
He triat fer-ho amb senyals ja que m'estim més no fer massa complexe el mètode save, i a més la senyal post_save ja ens informa de si s'ha gravat un registre nou o un registre antic. El codi de fet és tan senzill com això:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # Signals def twitt_post(sender, **kwargs): is_new = kwargs.get('created') if settings.SEND_TWITT_ON_POST and is_new: instance = kwargs.get('instance') import twython try: twitter = twython.core.setup(username = settings.TWITTER_USER, password = settings.TWITTER_PASSWORD) twitter.updateStatus(_(u"Nou post al Blog de Trespams: %s %s") % (instance.headline, instance.get_absolute_url(), ) ) except AuthError, e: logging.error("Error in twitter account") logging.error(e.message) except Exception, e: loggin.error('Error in twitter post %s' % e.message) # Connect the signal with the callback post_save.connect(twitt_post, sender=Entry) |
twitt_post és el callback és a dir, la funció que es cridarà quan es gestioni la senyal, com a arguments passa la classe, la instància i si el registre es nou o no.
Obtenim primer si el post es nou o no, no vull empipar a la gent cada vegada que faci una correcció ortogràfica o tipogràfica, així que sols enviaré els twitts quan el post sigui nou. També he fet que sols s'envii si la variable de configuració SEND_TWITT_ON_POST així ho diu.
Després ja és cosa de utilitzar la llibreria (login i enviar, així de fàcil) i capturar les possibles excepcions.
Finalment el que feim és connectar l'event amb el model i la funció callback.
Si tot va bé aquest post ja s'hauria d'enviar automàticament.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
I trobaré gent que sàpiga Python?
Escrit per Aaloy a 30 de December , 2009 a les 1:06 p.m.
Sovint quan plantejam que un desenvolupament ho farem amb Python i Django, la gent de les primeres coses que demana és a veure si trobarà gent que sàpiga Python i Django per dur el manteniment posterior, o si nosaltres deixam el negoci, o si ha de contractar algú, ...
Qui està un poc aficat en el tema de la programació web sap que és relativament senzill trobar gent de coneix PHP o Java, però encara el tema Python no està tan arrelat al subconscient com per a que soni com a llenguatge de referència.
Idependentment del que al final s'opti per un llenguatge o un altre, el "trobar gent" serà tant o més complicat en PHP o Java como ho pot ser en Python, ja que conèixer el llenguatge no implica necessàriament poder-se fer càrrec de l'aplicació o que el manteniment de la mateixa sigui senzill. És més, m'atreviria a dir que molts programes web que hi ha en PHP o Java són molt complexes de mantenir per algú aliè al desenvolupament inicial.
Aprendre un llenguatge és relativament senzill, conèixer-ne la sintaxi i poder llegir el codi pot dur pocs dies, setmanes si m'apurau. Després la tasca és saber com està fet el programa, entendre què fa i començar a trobar on s'ha de modificar cada cosa, i és aquí on el llenguatge importa menys que com s'ha desenvolupat el programa.
El model Python i Django fa molt més senzill fer programes bons de seguir, la sintaxi de Python es legible per pròpia construcció del llenguatge, i un programa que utilitzi Django com a bastiment i que segueixi les convencions de codi de Django mateix i de Python serà molt menys propens a les "sorpreses" que un típic programa PHP que segueix sols les convencions del seu programador, i segurament que a un programa Java-J2EE on vet a saber quines llibreries o tecnologia s'haurà utilitzat.
Amb això no vull dir que no es puguin fer programes mantenibles en PHP o Java, sinó que si el que volem en un futur és prendre el control del desenvolupament d'un programa que hem comanat a un tercer, el més important no és tant el llenguatge de programació sinó com estigui estructurat el programa, la legibilitat del codi, el comentaris i la documentació.
Quan un desenvolupament està fet en Python i Django augmentant les nostres possibilitats de que sigui mantenible posteriorment. Potser necessitarem un temps previ de formació en el llenguatge (o formar als nostres programadors interns), però aquest temps es veurà de sobres compensat per la facilitat de manteniment posterior. Per mi és una inversió de futur.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Aquest 2009 s'acaba
Escrit per Aaloy a 20 de December , 2009 a les 1:38 p.m.
El 2009 ja gairebé s'ha acabat, així que com és habitual convé fer un poc de recapitulació del que ha estat l'any 2009 i definir el que esper del 2010.
Trespams
Sense haver acabat l'any aquest és l'apunt que fa 77, això vol dir que ha estat un any prou constant en el que és la publicació d'apunts en el blog, . M'agrada escriure, em relaxa i em permet posar idees en clar. Si a més aquests posts serveixen a algú més, encara que sols sigui per passar l'estona, crec que s'ho paga el petit esforç de posar-se davant l'ordinador i teclejar.
En aquest moments Trespams té uns 900 visitants més o manco habituals. D'aquest n'he pogut desvirtualtitzar un tant per cent molt petit, potser un 10%, alguns han deixat comentaris i hem pogut mantenir converses virtuals tant pel blog, correu o Twitter. Per mi és una de les experiències més gratificants del blog: poder compartir idees i pensaments amb comunicació bidireccional.
Des del principi el blog ha estat per mi essencial a l'hora de posar en ordre les meves idees i dèries. La gestió de projectes, la gestió d'equips de programació, l'estimació de projectes de programari, Python i Django. Tot sempre amb un fil conductor comú: el programari lliure.
El blog vol ser també part de la meva petita aportació al moviment del programari lliure. Programari lliure per mi significa no sols compartir codi, sinó compartir idees de com podem crear i gestionar aquest codi, eines, idees, ... El coneixement ha de fluir per a que tots com a societat ens en puguem beneficiar.
Python i Django
Per Python i Django també ha estat un bon any. Ha sortit l'esperada versió 3 de Python i Django ha assolit una velocitat de creuer que el consolida com un dels bastiments de referència en la programació web moderna. La llista de Django té uns 15.000 subscriptors, al repositori de projectes de Python, PyPi hi ha una cinquantena de projectes i actualitzacions de projectes diàriament.
Esper que el 2010 torni a ser un any Python, projectes com PyPy i Unladen Swallow poden donar encara més empenta a aquest fantàstic llenguatge. Esperem que l'onada Python arribi també a les empreses per a que tots ens puguem gaudir d'una programació més clara, mantenible i sobretot divertida, on el llenguatge no sigui un condicionant sinó un vehicle per a la creació de programes i la generació de valor per al negoci i en definitiva per a la societat.
Pel 2010 l'objectiu és anar creant més exemples a Appfusedjango, millorar-ne la documentació amb Sphinx. Voldria també millorar el codi d'aquest blog, fer-lo més accessible als dispositius mòbils. M'agradaria poder fer aportacions al projecte Basie, un projecte amb el qual he pogut coneixer noves formes de col·laboració, de control del codi, d'eines, nova gent.
Tot això farcit d'apunts en aquest blog, com a manera de presentar el que m'agrada, d'animar a la gent a participar, i com ja he dit, com a manera d'ordenar les meves pròpies idees. Es presenta doncs un any 2010 força interessant.
Creant Bits
Creant bits és la demostració del que es pot fer quan les idees es converteixen en accions. Un petit comentari al Twitter i la col·laboració de molta gent va fer possible que una vintena de persones ens trobàssim al Parc Bit per parlar de tecnologia, de Python i de Django.
La meva intenció és repetir-ho al llarg del 2010 i més si tenim disponibilitat de Sala. En aquests moments i baix el paraigües d'APSL tenim accés a les sales de formació del Parc Bit i convé aprofitar-ho. Quan no hi tenguem accés ja veurem que feim, però m'agradaria que fos quelcom que anàs perdurant en el temps fins que el cos aguanti i la gent no es cansi.
L'altra dia per un comentari que vaig fer al Twitter d'un curs de Python se'm va demanar si Creant Bits seguiria essent gratuït. La resposta es sí, Creant Bits és una aportació al moviment del programari lliure, com ho poden ser alguns dels apunts del blog, o altres projectes en els particip. No crec que es pugin considerar cursos en el sentit que l'objectiu del Creants Bits no és que la gent surti amb un coneixement profund de la tecnologia, sinó el de presentar el que es pot fer, parlar, reunir-nos i animar a la gent a provar coses, donant-los el primer impuls.
Els cursos sí que els cobr. Quan una empres em demana un curs de Python i Django els objectius és que la gent que participi surti amb un domini del temari que els faci ser productius una vegada acabat el curs. Són moltes hores de curs i moltes hores de preparació per la meva part. L'horari del curs, la localització i els assistents són responsabilitat de l'empresa que em contracta i és aquesta qui fitxa els objectius.
A Creant Bits ens reunim amics i coneguts, gent que ja ens coneixem de manera física i virtual o que tenim ganes de conèixer-nos, amb ganes d'aprendre coses i relacionar-nos. Potser al llarg del temps i amb diferents trobades la gent que participa es veurà amb un coneixements semblants als que tindria amb un curs formal, però això serà tant per l'impuls de la xerrada com per la seva iniciativa personal, i això crec que és la diferència fonamental amb un curs. A un curs vols que la gent surti preparada amb tants coneixements com sigui possible en un temps raonable, a una trobada com Creant Bit a mi el que m'agradaria és que la gent sortís amb motivació per poder començar, amb una petita llum a la foscor, que permeti, amb el seu esforça personal, avançar en el món del programari.
M'estic extenent molt amb aquest tros, però és que veure tanta gent reunida perquè sí per mi ha estat molt important, ja que ha representat passar del món de les idees al món de l'acció, del món de les intencions als fets. L'injecció de moral per mi (i esper que per als participants) ha estat grandiosa i tenc ganes de repetir l'experiència al 2010.
APSL
Al 2009 hem consolidat APSL, l'empresa de la que són CEO i soci. És una empresa atípica, feta a la nostra manera d'entendre els projectes, amb l'ètica al davant, sense voler tenir clients captius sinó essent-ne col·laboradors. Volem fer partíceps a les empreses del que significa el programari lliure, de com les coses es poden fer d'una altra manera fins i tot amb els pressuposts.
Estam intentant rompre amb la idea de pressuposts tancats per a projectes de programari. Creïem amb la idea de que el pressupost inicial ha de ser orientatiu, que després el que importa és que el programa que s'entregui representi el que necessiti l'empresa, que no és necessàriament el que l'empresa vol a l'inici del projecte.
No és una tasca senzilla, representa canviar un poc les regles del joc. Actualment les negociacions d'un projecte sempre estan encaminades a que el risc del projecte ho assumeixi una de les parts. El client intenta que sigui l'empesa desenvolupadora la que assumesqui el risc intentant tancar el mínim possible. L'empresa de programació intentant minimitzar el risc mirant de tancar-ho tot i de protegir-se en el pressupost. És una situació un tant perversa, en la qual tothom hi perd en un moment o l'altra, com en una ruleta russa.
Tot projecte té un risc i aquest hauria de ser compartit i minimitzat. Creim amb la idea d'Scrum com a metodologia de desenvolupament i com a manera de facturar a un projecte. El client assumeix un cert risc: el pagament anticipat d'una quantitat i l'empresa n'assumeix un altre: que l'empresa en qualsevol fita del projecte pugui tancar-lo, dient que el que té ja és el que volia o donar-lo a un altre proveïdor.
El 2010 m'agradaria que fos un any de creixement per APSL perquè voldria dir que aquesta filosofia de treball i gestió ha estat entesa, que una altra manera d'entendre la relació empresa-client és possible.
Gestió de projectes
A 2010 m'agradaria aprofundir en el tema de l'estimació de projectes des d'un punt de vista col·laboratiu. Una de les mancances que tenim com a col·lectiu és que estam massa encaixonats dins la nostra manera de veure les coses, potser sense tenir massa idea del mercat. Són les nostres estimacions raonables? Són les nostres maneres de pressupostar adients? Som competitius? Podem fer alguna cosa per millorar les nostres estimacions?
Crec que es un punt amb la cooperació hi té molt a dir. On podem col·laborar explicant projectes, explicant el perquè de les valoracions i el temps total, per a que serveixin de referència. També es podrien organitzar sessions d'estimació àgil, amb Planning poker estimation. És una idea a la que estic donant voltes però que encara no sé molt bé com organitzar.
També m'agradaria posar en marxa algun tipus de projecte col·laboratiu local, potser lligat al Creant Bits, que servesqui no sols per aprendre sinó també per tenir un producte que pugui beneficiar-nos a tots.
Moltes idees i molts projectes que m'agradaria fer. Tot això s'ha d'acompassar necessàriament amb la dedicació a la família, amb els projectes alimenticis i amb altres projectes que no estan lligats a la informàtica que m'agradaria assolir. Per exemple, no tenc cap coneixement de llenguatge musical, i és una cosa que des de fa anys m'agradaria aprendre. Potser el 2010 serà l'any...
L'any de la crisi
El 2009 passarà per ser l'any de la crisi, però tot i això crec que hem viscut temps interessants. El problema amb la famosa crisi és que tot s'ha enlentit, és com si haguéssim perdut un any, estant a l'expectativa, a veure-les venir. Per mi aquesta expectativa ha estat doble, ja que en hem trobat amb la fusió de TUIE i Hotelbeds, amb la qual cosa molts projectes s'ha paralitzat a l'espera del que passaria.
Com es diu "qui espera desespera", però crec que no ha estat el cas. La sensació de pèrdua de temps és intensa, però tot i això projectes com APSL, el Creant Bits, els passejos amb els nins amb bicicleta i els amics del Twitter no em queda la sensació d'any perdut, sinó d'any de reflexió, de tenir temps de descobrir coses noves i punts de vista diferents.
Encara que molts (la majoria) de pressuposts presentats encara estan al caixó d'algú, poder parlar amb els clients crec que m'ha enriquit com a persona, no des del punt de vista econòmic, però si des del punt de vista espiritual i tot suma!.
Com sempre un espera que l'any que començarà serà millor que l'anterior. Sigui com sigui serà també un any interessant de viure.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django Gestió de projectes Codi lliure APSL
Experiment amb Python i CAVAL
Escrit per Aaloy a 16 de December , 2009 a les 8:36 p.m.
Turistec ha presentat recentment la iniciativa CAVAL com una seria d'especificacions per promoure la interoperabilitat de dades entre solucions TIC per al sector turístic.
Aquestes especificacions tenen una implementació de referència a la web de proves de Viajes Urbis, on podem trobar la documentació, l'API de Java, els WSDL, els endpoints per REST i una plana de proves que ens permet testejar el nostre client contra l'especifiació d'Urbis.
Es d'agraïr l'especificació de referència d'Urbis, però la veritat, crec que estaria molt millor com a iniciativa de Caval i no deixar l'especificació de referència a una web separada del domini principal. Tal com està pareix com si s'hagués acabat la subvenció i no es pogués pagar el hosting o el desenvolupament. A més es podria posar el codi de la implementació a la web, donant la possibilitat de que la gent hi faci aportacions, encara que fos Caval l'entitat encarregada de certificar finalment la solució.
Ara és cosa de no deixar-ho morir, falta una implementació real de referència (podria ser la d'Urbis però amb la marca Caval), el codi font d'aquesta, poder tenir accés al codi des d'un control de versions i per què no poder participar amb aportacions i correcció d'errors. En la implementació de referència crec que es tindria que tenir en compte que la majoria de possibles consumidors de l'especificació són petites i mitjanes empreses. Això vol dir fugir d'implementacions de referència que requereixin grans instal·lacions o coneixements tècnics avançats, la implementació ha de tenir un nivell d'entrada molt suau, amb pocs requeriments de servidor, de tal manera que es pugui tocar molt ràpidament.
No sé si arribaré a fer una implementació de referència en Python, potser seria un bon exercici per futurs creant-bits, però el que sí es pot fer és començar a jugar amb el que té Urbis.
Per això farem servir Suds, com que estam de proves, en lloc de la llibreria recomanada farem servir la beta. Suds és una llibreria per a consumir serveis webs SOAP. A diferència d'altres eines com ZSI no genera codi, sinó que construeix els objectes al vol.
Anem per feina!
El primer que farem es descarregar la beta i instal·lar-la al nostre entorn. En el meu cas faré servir un virtualenv de manera que no tendré dependències amb altres paquets.
Com que volem veure les cridades que es generen establirem el nivell de login de Suds a DEBUG
1 2 3 4 | import logging logging.basicConfig(level=logging.INFO) logging.getLogger('suds.client').setLevel(logging.DEBUG) |
Per a fer les proves mapejarem el servei d'Hotels, que té per url http://test.viajesurbis.com/serveis/caval/20091127/soap/HotelBookingService?wsdl
1 2 3 4 | from suds.client import Client url = "http://test.viajesurbis.com/serveis/caval/20091127/soap/HotelBookingService?wsdl" client = Client(url) |
ara podem fer un print client per tenir l'estructura de mapeig que ha fet Suds,
Suds ( https://fedorahosted.org/suds/ ) version: 0.3.8 (beta)
build: R627-20091211
Service ( HotelBookingService ) tns="http://caval.travel/20091127/hotelBooking"
Prefixes (1)
ns0 = "http://caval.travel/20091127/hotelBooking"
Ports (1):
(HotelBookingServicePort)
Methods (6):
confirmHotelBooking(cavalHotelBookingConfirmRQ rq, )
getAvailableHotels(cavalHotelAvailabilityRQ rq, )
getDetailedValuation(cavalHotelBookingValuationRQ rq, )
getEstablishmentDataSheets(cavalGetEstablishmentDataSheetsRQ rq, )
getOffersList(cavalGetOffersListRQ arg0, )
notifyHotelBookings(cavalHotelBookingNotificationRQ arg0, )
Types (52):
abstractAuthenticatedAgencyRQ
abstractAuthenticatedRQ
abstractRS
...
roomOccupation
roomType
supplement
valuatedLine
valuatedOccupation
zoneWithOffers
Fitxau-vos que ens està donant els mètodes del web service i els tipus que hi ha definits.
Per tractar amb arguments simples no necessitam gaire cosa més. Podríem cridar als mètodes directament. El problema és que els arguments no són simples, així que tendrem que crear-los així com els necessitem.
Per a les nostres proves farem utilitzarem getAvailableHotels, com que a la web d'Urbis hi tenim un client web ens anirà bé per validar el que feim.
Cream l'objecte que contindrà la petició:
1 | rq = client.factory.create('cavalHotelAvailabilityRQ') |
si feim un dir(rq) podrem veure les propietats que té l'objecte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | In [11]: dir(rq) Out[11]: ['__contains__', '__delattr__', '__doc__', '__getitem__', '__init__', '__iter__', '__keylist__', '__len__', '__metadata__', '__module__', '__printer__', '__repr__', '__setattr__', '__setitem__', '__str__', '__unicode__', 'agentId', 'airportIds', 'boardGroupFilter', 'checkIn', 'checkOut', 'cityIds', 'establishmentClassificationFilter', 'establishmentIds', 'establishmentNameFilter', 'excludeOnRequest', 'fromRow', 'gzipResponse', 'hotelCategoryGroupFilter', 'language', 'login', 'numRows', 'occupations', 'onlyOffers', 'password', 'removeHotelInfo', 'roomGroupFilter', 'rqId', 'stateIds'] |
Que podem comparar amb l'exemple de la web d'Urbis
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <getAvailableHotels xmlns="http://caval.travel/20091127/hotel"> <rq xmlns=""> <login>xml</login> <password>xml</password> <agentId>1</agentId> <language>es</language> <gzipResponse>false</gzipResponse> <stateIds>569061</stateIds> <checkIn>01/1/2010</checkIn> <checkOut>05/1/2010</checkOut> <occupations> <adultsPerRoom>2</adultsPerRoom> <childrenPerRoom>0</childrenPerRoom> <numberOfRooms>1</numberOfRooms> </occupations> <removeHotelInfo>false</removeHotelInfo> </rq> </getAvailableHotels> </soapenv:Body> </soapenv:Envelope> |
Però a més Suds ens dóna més informació damunt els paràmetres que el propi dir, així si feim un print rq
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | In [13]: print rq -------> print(rq) (cavalHotelAvailabilityRQ){ gzipResponse = None login = None password = None rqId = None agentId = None language = None airportIds[] = <empty> boardGroupFilter[] = <empty> checkIn = None checkOut = None cityIds[] = <empty> establishmentClassificationFilter[] = <empty> establishmentIds[] = <empty> establishmentNameFilter = None excludeOnRequest = None fromRow = None hotelCategoryGroupFilter[] = <empty> numRows = None occupations[] = <empty> onlyOffers = None removeHotelInfo = None roomGroupFilter[] = <empty> stateIds[] = <empty> } |
Podem veure que ens dóna també informació sobre els objectes i sobre els alguns d'ells són col·leccions, llistes Python.
Assignem-hi valors:
1 2 3 4 5 6 7 8 | rq.login = 'xml' rq.password = 'xml' rq.agentId = 1 rq.language = 'es' rq.gzipResponse='false' rq.stateIds=569061 rq.checkIn='01/01/2010' rq.checkOut='05/01/2010' |
Arribam ara a l'ocupació, aquí s'espera una llista del tipus availRQOccupation així que l'hem de crear l'objete primer
tal com he fet abans al la petició
1 2 3 4 5 6 | room = client.factory.create('availRQOccupation') room.adutlsPerRoom = 2 room.childrenPerRoom = 0 room.numberOfRooms = 1 rq.removeHotelInfo ='true' client.service.getAvailableHotels(rq) |
Si heu seguit els passos fins aquí veureu el log amb el SOAP-XML que s'ha generat, i que falla miserablement amb un error:
1 2 3 4 | <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body><soap:Fault><faultcode>soap:Client</faultcode> <faultstring>Unmarshalling Error: com/sun/xml/bind/v2/runtime/reflect/opt/Const </faultstring> </soap:Fault></soap:Body></soap:Envelope> |
Dont' panic!
Si comparam el que hem enviat (per això tenim el log a DEBUG) i ho comparam amb l'exemple que ens dóna Urbis veim que estam enviant tags buids i això a la implementació d'Urbis pareix que no li agrada gens.
Com que Suds fa la generació automàticament pareix que ho tenim un tant pelut, però no és així, supòs que Suds (si no ho ha fet ja) potser algun dia posarà l'opció de no generar tags buids, o potser la gent d'Urbis corregirà la implementació de referència per no petar amb aquests tags (que hauríen de ser vàlids, per una altra banda), però mentre és el que tenim, així que com a pas previ abans d'enviar-ho el que farem serà eliminar de la petició els atributs que estan buids.
1 2 | for attr in dir(rq): if not attr.startswith('_') and not getattr(rq, attr): delattr(rq,attr) |
si imprimirm el rq ara
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | (cavalHotelAvailabilityRQ){ gzipResponse = "false" login = "xml" password = "xml" agentId = 1 language = "es" checkIn = "01/01/2010" checkOut = "05/01/2010" occupations[] = (availRQOccupation){ adultsPerRoom = 2 childAges[] = <empty> childrenPerRoom = 0 numberOfRooms = 1 }, removeHotelInfo = "true" stateIds = 569061 } |
Si ara ho tornam a enviar veurem que torna a pegar una petada, però aquest cop si ens fixam ens retorna la resposta, la petada diu
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (129, 0))
Als tips de Suds ens avisa que alguns servidor posen caràcters de control a la responsta que fan que el parsejador SAX que fa servir Suds doni una excepció (ara ja sabeu perquè la gent fa una rialla d'aquelles d'incredulitat quan li dus que la S de SOAP ve de Simple), per això el permet Suds és afegir-hi un filtre a la resposta
1 2 3 | import string from suds.bindings.binding import Binding Binding.replyfilter = (lambda s,r: ''.join([c for c in r if c in string.printable])) |
Ara sí:
1 2 | rs = client.service.getAvailableHotels(rq) print rs.totalRows |
En el meu cas m'han sortit 76 hotels. Si feim un print rs en veurem l'estructura de dades, i amb un dir(rs) les propietats i mètodes que tenim disponibles, ens fixam amb availableEstablishments
A partir d'aquí ja és sols cosa d'anar accedint als distints elements de l'estructura i decidir com presentam la informació que hem obtingut. Per exemple i per no fer-me massa llarg, per imprimir els noms dels hotels que hem trobat basta fer:
for hotel in rs.availableEstablishments:
print hotel.establishmentName
Per acabar, si us demanau pel rendiment d'això, heu de saber que Suds manté el WSDL en caché, de manera que no necessita demanar-lo cada vegada. La caché és configurable.
Pel nostre exemple, la disponibilitat de la tenim en poc més de 3 segons.
2009-12-16 20:07:36,179-INFO-__main__-36-Iniciam la consulta 2009-12-16 20:07:39,215-INFO-__main__-38-Fi de la consulta
Considerant que en el entorn de test via web d'URBIS la resposta l'obtenim entre 10 i 14 segons, doncs jo dira que està d'allò més bé.
Pos tot el codi per a que sigui més fàcil fer les proves:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/usr/bin/env python # -*- coding: UTF-8 -*- import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s-%(levelname)s-%(name)s-%(lineno)s-%(message)s",) logging.getLogger('suds.client').setLevel(logging.INFO) log = logging.getLogger(__name__) from suds.client import Client import string from suds.bindings.binding import Binding # Com que la resposta té problemes filtram Binding.replyfilter = (lambda s,r: ''.join([c for c in r if c in string.printable])) url = "http://test.viajesurbis.com/serveis/caval/20091127/soap/HotelBookingService?wsdl" client = Client(url) rq = client.factory.create('cavalHotelAvailabilityRQ') rq.login = 'xml' rq.password = 'xml' rq.agentId = 1 rq.language = 'es' rq.gzipResponse='false' rq.stateIds=569061 rq.checkIn='01/01/2010' rq.checkOut='05/01/2010' room = client.factory.create('availRQOccupation') room.adultsPerRoom = 2 room.childrenPerRoom = 0 room.numberOfRooms = 1 rq.occupations = (room, ) rq.removeHotelInfo ='true' # no volem informació de l'hotel ara # bug? de la implementació de referencia, eliminam tags buids. for attr in dir(rq): if not attr.startswith('_'): if not getattr(rq, attr): delattr(rq,attr) log.info('Iniciam la consulta') rs = client.service.getAvailableHotels(rq) log.info('Fi de la consulta') # i la llista d'hotels for hotel in rs.availableEstablishments: print hotel.establishmentName |
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python
Responsabilitat social corporativa
Escrit per Aaloy a 13 de December , 2009 a les 12:04 p.m.
Es comú en les empreses modernes, sobretot quan volen refundar-se, venen consultor i demés que es comenci a parlar de la missió, de la visó i s'acabi parlant de la responsabilitat social corporativa.
Les empreses se n'estan adonant que el negoci no es pot fer d'esquena a la societat, sinó amb la societat. Que no basta complir amb el que diu la llei, sinó que convé participar activament en tasques que ajudin a millorar el nostre món. Es el que se'n diu una acció win-win, és a dir, tothom hi guanya: hi guanya l'empresa en nom i prestigi i hi guanya la societat en conjunt.
Quan parlam d'empreses de desenvolupament, i des del meu punt de vista, la responsabilitat social té molt a veure amb el que l'empresa de desenvolupament faci servir codi lliure.
El retorn a la societat es pot fer creant projectes o esponsoritzant-los, creant documentació, participant a forums, ... Això però sols és una part. Quan una empresa de desenvolupament tria fer servir el codi lliure està dient als seus clients que no vol que estiguin fermats, que vol que el client pugui ser lliure de triar el proveïdor que més el convengui i que no vol que el seu futur estigui hipotecat.
Als seus treballadors l'empresa els està dient que l'important són les persones, els seus coneixements i la seva formació, que poden participar activament en el desenvolupament de les eines que fan servir i tenir un coneixement més profund de la tecnologia.
Crear programes lliures, utilitzar-los, participant amb el seu desenvolupament, les empreses estan retornant un benefici a la societat al mateix temps que se'n beneficien elles. És la responsabilitat social corporativa entesa com a part bàsica de l'empresa i no com a un afegitó per a quedar bé.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
L'ecosistema Python
Escrit per Aaloy a 07 de December , 2009 a les 1:23 p.m.
Començar a programar amb Python és molt senzill, sols ens hem de baixar l'intèrpret de ca'n Python i podem començar a programar. Python ve amb les bateries incloses, això vol dir que el que descarregam ens dóna l'interpret, un editor prou potent (l'IDLE) i un conjunt immens de llibreries per fer pràcticament qualsevol cosa que se'ns acudesqui.
Quan comencem a fer programes grans, ens trobarem amb una sèrie de problemes i necessitats que faran que acabem amb un conjunt de programes instal·lats a més de Python.
Instal·lador de llibreries
-
easy_install ens permet davallar i instal·lar llibreries del repositori Pypi de Python.
-
pip Un reepmplaçament de easy_install amb un gran nombre d'opcions addicionals.
-
yolk que ens permet obtenir informació damunt els paquets instal·lats.
Entorn virtual
Amb segons quins projectes o per provar llibreries, convé separar els entorns de Python, de manera que cada un tengui les seves pròpies llibreries i dependències si convé. Per això hi ha dues utilitats fonamentas:
-
virtualenv que ens permet crear entorns separats de Python i instal·lar-hi allà les llibreries.
-
virtualenvwrapper que envolcalla virtualenv amb un bon conjunt d'utilitats i afegitons per fer-nos la vida més fàcil.
Editors més potents
Els editors són una qüestió de preferències personals. Al cap i a la fi Python és text pla, tot i això no em puc estar de recomanar-ne alguns:
- Ulipad. Multiplataforma, basat en WxPython i fet en Python.
- Netbeans. Potser té un dels millors editors del mercat i un IDE prou bo per Python.
- Eclipse junt amb el plugin PyDev
- Vim Perquè tothom l'hauria de conèixer al manco per fer les quatre coses bàsiques d'edició, guardar i sortir.
Utilitats
Algunes utilitats són tan bones que les instal gairebé al mateix temps que configur l'entorn de desenvolupament
- ipython una shell per a l'intèrpret de comandes molt millorada.
- ipdb Depurador de línia de comandes un poc més atractiu.
- winpdb Un depurador gràfic per a Python que permet la depuració remota. Fantàstic per quan hi ha problemes.
- kodos És un testejador d'expressions regulars per Python.
- sqlite manager plugin per Firefox per a la gestió de bases de dades sqlite.
Després i segons els projectes ja vaig instal·lant unes llibreries o unes altres (entre d'elles PIL, wxPython, pyQt, Django, Reportlab, etc) però per mi el que us he presentat constitueix ara mateix el meu ecosistema Python bàsic, es a dir, el conjunt d'aplicacions que permeten evolucionar el programes.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Creant bits amb Django i Python
Escrit per Aaloy a 04 de December , 2009 a les 11:46 p.m.
Hem arribat a la sala als voltants de les 14:30, allà el responsable tècnic del Parc Bit (Gillem) ens ha explicat com estava tot, endollat el projector i ajudat amb les cadires. Un 10 per la gent del Parc Bit i de l'Incubit, tant per deixar-nos la sala com per l'ajuda.
Hem començat a preparar-ho tot. Respiram un poc més tranquils quan hem comprovat que la connexió a Internet funcionava. Després de 2 mesos i busques sense ADSL començava a pensar que teníem gafe.
Als projectors no els sol agradar el portàtil amb resolució de 1920px, així que m'ha toca configurar-ho un poc. El projector una passada, arriba a 1600x1200 px i des del fons de la sala es veu bé.
La sala de formació té capacitat per unes vint i tantes persones assegudes a la taula. No hi havia cadires abastament i la gent del Parc Bit ens ha ajudat a torbar-ne més.
Després d'això, quan al part tècnica ja funcionava hem anat a cercar la poca intendència que hi ha preparada: aigua i gominolas. Si tot falla, pens, al manco la gent que vengui se'n podrà anar amb un gust dolç.
Primera sorpresa del dia: Xus s'entrega amb una cafetera Nesspresso, cafè i galletes per tothom. No tenc paraules!
Son les 15:30, ja ho tenim tot llest i anam a fer una mossegada ràpida. Allà trobam gent coneguda que també assistiran a la trobada.
En Juan s'adelanta per anar rebent la gent, seguidament baixam, són les quatre i comença a omplir-se la sala.
Molta gent coneguda, amics virtuals que es desvirtualitzen. Em sap greu poder dedicar més temps a presentar-nos com toca, esper que hi haurà més ocasions.
A les 16:30 aproximadament començam: primer amb la part Python i després amb Django. L'objectiu és evitar la por a començar, donar la primera empenta. Qued admirat pel nivell que hi ha a la sala. Veure tants informàtics junts, interessats per aprendre em fa tornar l'esperança en la professió. Sols per això ja s'ho paga els nirvis de muntar una cosa d'aquestes.
No sé estar assegut, m'agrada més explicar i comentar passejant, les gominolas al manco ajuden a recuperar energies. El michelín ho notarà segur :)
Hem acabat amb més de mitja hora de retràs de la part Django, En Bernat tendrà menys temps. És una llàstima, perquè una de les gràcies de Django és la flexibilitat que té per a deplegar-se allà on més ens convengui a nosaltres. Ha de resumir molt la xarl·la i es limita a mostrar la configuració amb mod_python. A veure si a la propera ens dona temps de que mostri wsgi i la potència del balanceig.
Són les nou passades. Acabam. Anam saludant a la gent que marxa i començam a recollir. Encara queda temps per anar parlant amb la gent que queda de batalletes i tecnologia.
En Pau i na Sílvia han fet fotos, quan les tengui les penjaré junt amb les presentacions. Els twitts estan com creant_bits.
Fi de la crònica!
Gràcies a tots per assistir, perdonau els que no heu pogut venir per falta d'espai. La gent que ha vingut de ben segur que us contarà que la sala tampoc no donava per massa més. Però no serà la darrera!
Moltes gràcies a Juan (morenosan), Xus (m'has deixat sense paraules) i Pau per les labors d'assistència tècnica. Gràcies especialment per Bernat, que s'ha currat una presentació. A Paco per la idea del nom, i per damunt de tot a tota la gent que un divendres de pont s'ha desplaçat al Parc Bit i ha estat més de cinc hores compartint la nostra passió per la informàtica.
Si algú em diu que a partir d'una twittejada es podia muntar un sarau com aquest no m'ho crec. La màgia de la comunicació!
Com dic, esper que no sigui la darrera. Personalment he gaudit del contacte amb els assistents, de desvirtualitzar gent, de veure que la visió que tenc de la informàtica és compartida, de pensar que les coses es poden fer d'una altra manera.
Avui no dormiré! :)
--
He pujat les presentacions a SlideShare. Les fotografies són a Flicker, gràcies a Silvia i Pau.
Traducciones/Translations by apertium
8 comentaris, 0 trackbacks (URL) , Tags: Python Django
Desplegament de Django
Escrit per Aaloy a 29 de November , 2009 a les 1:53 a.m.
Una de les característiques que més m'agraden de Django per desenvolupar és que ja ve amb el seu propi servidor integrat. És un servidor no apte per entorns de producció, de fet a les planes de Django es recomana repetides vegades que NO es faci servir a producció, però que va molt bé al desenvolupament.
El que fa tenir aquest servidor és per una banda acursar el temps necessari per començar a desenvolupar. Una vegada creat el projecte i la primera aplicació, posam el servidor en marxa amb un python manage.py runserver i ja tenim accés a un complet servidor web.
A més ens permet depurar des del principi les nostres aplicacions. La consola del servidor que acabam d'executar mostrarà els missatges del servidor i els logs que li enviem com un servidor web qualsevol, però a més ens servirà de consola de depuració de Python.
Encara que hi ha entorns com Eclipse+Pydev que ens permeten posar punts de ruptura directament al codi, un dels mètodes més simples consisteix en escriure import pdb;pdb.set_trace() allà on vulguem que s'aturi el programa. Llavors, en arribar-hi a la consola on hem executat el servidor ens apareixerà l'entorn de depuració de Python (el pdb). Si volem fer un poc més de feina podem instal·lar l'ipdb i tendrem una consola de depuració amb autocompletat i resaltat de sintaxi.
A Python diuen allò de "batteries included" per indicar que amb Python hi ha tot el necessari per arrancar, Django segueix la mateixa filosofia, de manera que no necessitam configurar cap servidor web per començar a fer-hi feina i ens proporciona a més eines de depuració prou potents: la possibilitat de depurar amb pdb/ipdb o semblants, la depuració mitjançant els missatges d'error de les plantilles o la possiblitat de depurar evitantn la recàrrega amb l'opció de --no-reload del servidor de desenvolupament.
Una vegada ja tenim l'aplicació creada i depurada passam al desplegament. Pels experts de sistemes no ha de ser cap problema seguir les instruccions de les instruccions de desplegament de Django. Es pot desplegar en Apache (mod_python o mod_wsgi), damunt ngnix, lighthttp, Cherokee, ... En general no es tant cosa del servidor com de triar una tecnologia considerant el nostre entorn d'execució.
Perquè pensau que Django està pensat per ser escalable per amunt i per avall. Segons les restriccions del nostre entorn de producció ens convindrà elegir una tecnologia o una altra. Decidir si ens convé tenir un sols servidor http o separam l'execució de l'aplicació del servidor de continguts, quin tipus de caché farem servir, etc. etc.
Tot és molt flexible, però aquesta flexibilitat fa que ens tenguem que fer preguntes, Django no decideix per nosaltres com s'ha d'instal·lar. Fa recomanacions però en general s'adapta al que hi ha.
Si un disposa d'uns tècnics de sistemes com els que jo tenc la sort de fer feina, aquesta flexibilitat és fantàstica, segons l'aplicació decideixen la tecnologia que es fa servir, la caché, les instàncies que s'aixecaran o com es serveix el contingut estàtic. Si un s'ho ha de fer tot i no disposa d'un servidor propi (o al manco d'un servidor virtual) el desplegament vindrà marcat pel que ens deixi el nostre ISP.
Posar una configuració? Doncs no, dependrà de cada aplicació i de cada entorn. Sols un parell de recomanacions:
- wsgi funciona molt bé
- Si podeu separau el servidor d'aplicacions Django del servidor de contingut estàtic.
- Amb un poc més de pressupost es pot tenir un servidor dedicat o virtual configurat i podrem treure tot el suc a la nostra aplicació.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Una ullada a Sphinx
Escrit per Aaloy a 27 de November , 2009 a les 11:36 p.m.
Si heu fet servir la documentació de Python, Django o potser alguna de les aplicacions més importants o darrerament li heu fet una ullada al Building Skills with Python us n'adonareu que comparteixen un estil comú. Django ha personalitzat les plantilles, però com podem veure a la part on explica com es crea i es contribueix a la documentació, podem feure que Django fa servir Sphinx.
Sphinx és l'eina amb la qual s'estan creant les documentacions dels principals projectes basats en Python (encara que ens permet escriure qualsevol tipus de documentació) i poc a poc esdevé la killer appplication de la documentació tècnica.
Començar amb Sphinx és prou senzill, sols necessitam tenir Python instal·lat i
$ easy_install Sphinx $ sphinx-quickstart
i anar contestant les preguntes. Si heu compilat alguna vegada algun programa al món Unix veureu com quan acabin les preguntes s''haurà creat un directori amb un arxiu anomenat Makefile (make.bat per altres). Executant-lo ens crearà un directori build amb les bases del que pot ser la nostra documentació.
I és que Sphinx és bàsicament un compilador orientat a la creació de documentació. Agafa documents escrits en Restructured Text i crea un lloc web en HTML, genera un pdf o latex. Això vol dir que per poder treure'n el màxim partit s'ha de conèixer Restructured Text i fer-li una ullada a les comandes que Sphinx incorpora per crear les taules de contingut, fer el resaltat de sintaxi, incorporar imatges o fórmules matemàtiques. Una vegada passat el període d'aprenentatge (que ja us dic que és curt) veureu que el resultats que s'obtenen són espectaculars.
Ja he dit sovint pel blog que m'agrada escriure la documentació (i escriure en general) en text pla, utilitzant LaTeX, Markdown o ResTructured Text. Sphinx ajunta el fet de poder escriure la documentació com m'agrada amb un resultats realment professionals. És a la documentació hipertextual el que LaTeX és per a la documentació científica.
Potser ara us estareu demanant perquè fer la documentació amb aquesta eina i no limitar-nos a un document amb OpenOffice (o fins i tot en Word!!!), se m'acudeixen un parell mallorquí de raons:
- El text pla es pot posar damunt un control de versions.
- Permet que molta gent participi en la creació de la documentació.
- Sphinx ens dóna unes plantilles que fan que la documentació llueixi.
- El ressaltat de sintaxi Python ve de sèrie i costa ben poc fer el ressaltat per altres llenguatges.
- El cercador està inclòs a la documentació
Però sobretot, perquè amb Sphinx escriure documentació és divertit. Pots distribuir-te la feina com vols, no has de passar ànsia per la maquetació final, ni per que les imatges se t'han descol·locat i no saps on han anat a parar (si heu fet documents de més de 20 planes amb un processador de text sabreu què vull dir). I que escriure documentació no sigui feixuc segurament farà que ens faci menys peresa documentar i tothom ens estarà eternament agraït. Jo ja he començat amb la documentació d'appfusedjango que no se digui que no predic amb l'exemple.
Personalment crec que Django ha marcat un abans i un després en el món de la documentació de projectes, de tal manera que cada dia més projectes i aplicacions emulen la manera de documentar de Django i Django (com Python) fa servir Sphinx. Demostrant que per a que un projecte tengui èxit no basta que sigui bo sinó que ha d'estar ben documentat.
No cerquem en Sphinx la bala de plata. Fer bona documentació no és senzill, Sphinx sols fa que sigui menys pesat i ens dóna un resultat final molt més amigable als nostres lectors. Un dels creadors de Django,Jacob Kaplan-Moss, ha escrit un conjunt de posts damunt com s'ha d'escriure bona documentació: Writing great documentation, de lectura imprescindible. Però tot i que no sigui fàcil s'ha de començar, ens hem d'avesar (i jo el primer) a que Sphinx sigui part de les eines de projecte, a escriure documentació i a millorar el nostre estil, tanmateix diuen que la pràctica fa el mestre, no?
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Ulipad 4
Escrit per Aaloy a 24 de November , 2009 a les 11:53 p.m.
Acab de devallar-me la darrera versió (la quatre) de l'editor Ulipad. És un editor fet en Python damunt les llibreries wxPython.
La primera impressió que m'ha donat l'editor es pot resumir en una paraula: velocitat. És un editor molt ràpid, carrega en pots segons i l'autocompletat de codi, a més d'estar a un nivell molt bo, és també molt ràpida. Sols per això ja trob una justificació més que raonable per donar-li una oportunitat.
La gestió de projectes és un tant limitada, únicament ens presenta un sistema de fitxers, però és suficient per la majoria de projectes.
El suport de Python és molt bo i és extensible mitjançant plugins. En té un per Django que ens deixa executar el servidor de desenvolupament de Django. Tanmateix tot això és un poc anecdòtic si ho comparam amb la senzillesa i usabilitat d'aquest editor. Per ara (i duc una hora llarga amb ell) m'està agradant molt.
Destacar la bona integració que té amb la shell de Python, basant-se en pyCrust, la integració amb pylint i un parell d'utilitats que ens fan la vida més fàcil: un testejador d'expressions regulars i un gestor de trossos de codi (snippets).
Una altra de les coses que m'ha agradat és el suport que té per a l'edició de documents en RestructuredText, permetent-nos tenir una previsualització en temps reals de com queda el document.
He trobat a faltar un major suport per l'execució de test unitaris (sols té integrats els doctests) i la integració plena d'un depurador. Es recolza en un depurador molt bo, en Winpdb, però en aquesta versió pareix que s'ha deixat un tant desactualitzat. Supòs que obrint un ticket s'arreglarà aviat.
És un editor senzill, útil per que vol un editor gràfic i no pot o vol fer servir IDEs com Netbeans o Eclipse.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Anunci Python i Django workshow
Escrit per Aaloy a 20 de November , 2009 a les 8:24 p.m.
Actualització
Hem arribat als 20. La resta haureu d'esperar a la propera!
Tothom que s'ha apuntat fins al meu darrer comentari, el 24 entra dins aquest primer workshow. Aniré posant per aquí i pel Twitter les novetat que hi hagi.
Em sap greu pels que els agradaria venir i han quedat fora, però compreneu que la sala és petita, 20 persones són moltes i el format que hem pensat (amb voluntaris ajudant als nouvinguts) no dóna per massa més.
Si la cosa agrada us promet que no serà la darrera! :)
No sé quin nom posar-li, en Paco proposa al twitter "programming python & django before beers" o "def bit():" però a les hores que acabarem (més de les 18:00) ja us dic jo que al Parc Bit no hi ha res obert per anar fer unes cerveses. M'ha agradat molt el Creant Bits, començant amb Python i Django i ja veurem com acabarem...
Així doncs faig l'anunci oficial:
Creant Bits amb Python i Django Divendres 4 de desembre Hora: 16:00 a 20:15 (o més) Lloc: Sala de formació del Parc Bit Organitza: APSL Col·labora: Incubit, que ens deixa la sala.
En quant als continguts, crec que els hauríem d'afinar entre tots. Per començar jo us proposaria el següent:
- Introducció a Python (1.5h)
- Pausa (15 min)
- Introducció a Django (1.5 h)
- Pausa (15 min)
- Posant una aplicació Django a producció (45 min)
La idea seria que la gent li fa ganes saber què és això de Django i Python pugui fer-se'n una idea. Es donarien quatre pinzellades de Python, amb exemples que tothom pugui executar al seu portàtil.
Per la part Django: mostrar com començar, que és, veure com es pot crear una plantilla, l'organització del codi i veure alguns exemples d'aplicacions, etc. Ha de servir com a presa de contacte i que tothom pugui fer-se una idea de les possibilitats que té aquest bastiment.
Com que al final el que volem tots és posar-lo en producció, s'explicaria com n'és de bo de fer posar-ho a un entorn Apache.
Però com us dic sols és una idea. El temps és limitat, però si estau interessats en donar-li una altra orientació estic obert a qualsevol possibilitats.
Requisits
- Tothom amb el seu portàtil, millor amb Linux. Si algú vol dur el seu fix i pantalla serà benvingut, però avís que hi ha una passejada i no sé com està la sala d'endolls.
- Python 2.5 ó 2.6 instal·lat, el 3.x no us funcionarà amb Django.
- Un editor amb ressaltat Python: vim, gvim, notepad++, Netbeans, Eclipse, ...
- La darrera versió estable de Django insta·lada. La 1.1.1 en el moment d'escriure això.
- Navegador Firefox amb el Firebug instal·lat
- iPython instal·lat
Inscripció
Lliure, però teniu en compte que la sala té una capacitat d'unes 20 persones, així que, per favor, deixau un comentari per a que pugui controlar quants serem i saber si hem arribat al límit de la sala. Al comentari podeu posar el tipus d'orientació que us agradaria.
Quan serà la propera?
Dependrà de l'èxit d'aquesta i de que Parc Bit/Incubit tengui lliure la sala i ens la cedesqui (des d'aquí moltes gràcies des de ja!). M'agradaria que això acabàs com a grup d'usuaris/empreses més o manco estable, però això ho hem de decidir entre tots.
Altres
Miraré d'informar-me com està la sala en el tema de connexions d'Internet. Si hi ha connectivitat fins i tot podríem intentar fer un projecte en grup, si no aquesta potser la propera vegada.
M'agradaria poder dir que hi haurà catering, però seria mentida :)
Traducciones/Translations by apertium
33 comentaris, 0 trackbacks (URL) , Tags: Python Django
Planes estàtiques amb Flatpages
Escrit per Aaloy a 19 de November , 2009 a les 6:15 p.m.
Fa estona que volia posar contingut no directament relacionat amb el Blog a Trespams, ja sabeu, quí soc, sobre el blog i coses d'aquests, però no ho arribava a fer. Finalment m'he decidit i aprofitaré per explicar com podem fer aquest tipus de coses amb Django.
El primer de tot és centrar el problema. L'objectiu és tenir lligat a la nostra aplicació (el blog en aquest cas) un conjunt de planes que no estan relacionades amb l'aplicació o aplicacions, que no han de ser editades o ho han de ser molt poc.
El cas típic són les planes de condicions legals, les planes de "sobre mi" dels blogs. Agafau la idea, no?
Com que és un cas molt comú Django té una aplicació al contrib pensada per fer precisament això. Ens proporciona un formulari on podem posar el títol, el contingut en format html i indicar si volem la plantilla que s'utilitzarà, si permetem comentaris o no i si l'usuari ha d'estar registrat al sistema per veure la plana. Aquesta aplicació se'n diu Flatpages.
La documentació de Django està força ben explicada.
-
Afegim 'django.contrib.sites' a INSTALLED_APPS del nostre setting.py si no hi és ja. Si no hi era convé fer un syncdb. Crearem una entrada al Sites amb la nostra url i també posarem el SITE_ID del settings.py el valor de l'id d'aquest registre. Si sols en teniu un serà 1.
-
Afegim 'django.contrib.flatpages' als INSTALLED_APPS.
-
Afegim 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' a MIDDLEWARE_CLASSES del settings.
-
Executam
python manage.py syncdbper a generar les taules de Flatpages. -
Cream el directori flatpages dins el nostre directori de templates i cream l'arxiu d'default.html. Aquesta serà la plantilla per defecte que s'utilitzarà. Hem de personalitzar-la com volguem. A aquesta plantilla flatpages li passa la variable
flatpage, a partir de la qual podem obenir el títol i el cos del text amb{{flapage.title}}i{{flatpage.content}}. Podeu fer una ullada al codi de trespams del svn per tenir-ho més clar.
Ara ja sols és cosa d'anar afegint registres amb les urls i continguts que volguem. Django en no trobar una plana abans de mollar un 404 el que farà és anar a flatpages, si la url correspon a una que hagem definit generarà la plana a partir de la plantilla i els continguts del registre corresponent.
Per acabar, dir que no fa falta posar el filtre safe a les variables. Per defecte se suposa que l'html és segur, ja que no està pensat per a que un usuari extern a l'aplicació l'editi.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Comparant Django i Drupal
Escrit per Aaloy a 16 de November , 2009 a les 5:56 p.m.
Pareix que alguns desenvolupadors de PHP s'estan plantejant anar cap a Python i Django com a una via per a fugir de les complexitats i problemes del PHP.
Des d'aquest blog vull encoratjar-los a al manco provar-ho i després decidir si convé o no fer l'esforç. Personalment pens que sí, pero tot dependrà de l'experiència que tengui cada un i de com vulgui enfocar els projectes.
Per ajudar en la decisió trob que és força interessant visitar dos enllaços:
El primer és una apunt i el segon és la discusió a un fil de la llista d'usuaris de Django. No us perdeu els comentaris, on es discuteix si Django i Drupal són comparables o no.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Recull de llibres
Escrit per Aaloy a 13 de November , 2009 a les 7:02 p.m.
Aprofitant que aviat hi haurà força dies de vacances he fet la meva comanda típica a Amazon. Cada cop va millor el servei, estic elegint l'opció de courier (el segon servei d'enviament per preu), que en teoria ha d'estar entre 3 i quatre setmanes i m'estan arribant els llibres en cosa de 10 dies. Els vaig comanar el 3 i han arribat entre el 12 i el tretze, en dos enviaments diferents.
Pel servei que dóna he de dir que soc client fidel d'Amazon i que cada vegada que intent comprar llibres per correu a llibreries suposadament potents d'aquí, cada vegada me n'he d'empenedir. La única ocasió que record que va funcionar tot bé en temps i dobler va ser comprant llibres de ciència ficció de segona mà a una llibreria d'aquells amb una plana web dels anys 80.
Potser algun dia em passaré a la tinta electrònica, però ara per ara el DRM i jo no som bons amics. Vull poder fer el que vulgui amb el llibre, llegir-los on i com jo vulgui i no estar amb l'ai al cor per si un dia algú decideix que ja tenc prou llibres al lector o que no els puc compartir amb ningú.
Per mi els llibres són una eina de feina, d'esbarjo i aprenentatge. M'hi deix una pasta, ho sé, però tanmateix no tenc massa mals vicis. M'agradaria poder dir que com comentava Joel Spolsky, que l'empresa em subvenciona els llibre o que hi ha una biblioteca potent, però no és així, no fins que APSL no tengui prou capital al manco. A la única empresa on m'he trobat una biblioteca tècnica més o manco decent va ser a Infomallorca (Viajes Iberia), on En Juan - mai vaig aclarir si eren seus o de l'empresa- se n'encarregava de mantenir-ne una bona col·lecció, que no cal dir-ho vaig anar devorant.
A les altres empreses ha estat sempre molt complexe justificar la compra de llibres. Tan complexe que m'estim més pagar els llibres de la meva butxaca tot i que sovint els necessit per la feina o m'ajuden a fer la feina millor.
Avui he fet neteja dels llibres que tenia al lloc de feina. Ens mudam d'oficina i ens han dit que allà és tot tan de disseny que no podem dur-hi més que els ordinadors, que no hi ha lloc per res, potser el just per seure i prou. La pissarra també l'hauré de deixar. Al manco a la nostra petita oficina d'APSL no hi ha aquestes restriccions (això sí, encara no hi ha ADSL).
Aquesta remesa té un poc de tot, us ne faig cinc cèntims, tant just els he fullejat, però aquí teniu els títols i el que n'esper de cada un:
-
Agile Estimating and Planning. Estimació de projectes àgils. Una metodologia àgil no vol dir no fer pressuposts, vol dir tenir orientació cap allò que aporta valor i en el món de l'empresa es comença aportant valor si les nostres estimacions formen part d'un pla de negoci. És el que he començat a llegir i per ara m'està agradant molt.
-
Plone 3 Theming. Plone és al meu entendre el millor CMS lliure i no lliure del mercat. Pensat per dur llocs amb molts d'editors i un volum molt gran, un dels seus punts foscs és el de com personaltitzar l'aspecte del lloc. Estic pensant fer el nou lloc d'APSL damunt Plone sols per viure en carns pròpies el que pot ser l'adaptació d'un disseny que sé exactament el que ha duit amb Django.
-
Behind Closed Doors. Llibre dedicat a les tècniques de management, a la gestió de persones i conflictes des del punt de vista tècnic. Encara que molts consultors de RR.HH. posen tothom al mateix sac gestionar equips tècnics i de programadors no té res a veure amb gestionar equips de cadenes de muntatge o de vendes. També n'he llegit d'aquest i la veritat és que hi ha moltes situacions que quan pens com o si es podria extrapolar a un equip de programadors em faig un fart de riure.
-
Cloud Application Architectures. Llibre damunt arquitectures de núvol. Pel que pareix està a camí entre informació per administradors de sistemes i responsables de negoci que volen saber a on se la juguen. Sovint he dit que la gent de sistemes convé que sàpiga programar per fer millor la feina, i de la mateix manera convé que programadors i caps de projecte com jo mateix estiguin al dia de les possibilitat i implicacions de la tecnologia més de sistemes.
Així com els vagi llegint aniré posant la ressenya. Ara estic llegint a Pablo Tusset: "Sakamura, Corrales y los muertos rientes", tenc ganes de veure si millora a les acaballes, perquè per ara, fluix, fluix.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Posar preu
Escrit per Aaloy a 08 de November , 2009 a les 4:23 p.m.
Per experiència sé que una de les coses que més ens consta a la gent que fem feina amb bits és posar preu a la nostra feina. Tenim una feina que no entrega un producte físic i on fer i desfer no implica feina física. Si en lloc de vendre còpies el que feim és vendre serveis: programari a mida, configuració de servidors, adaptació de programes, etc. llavors tècniques de màrqueting com les que ens ensenya Neil Davidson a Don't just roll the dice són poc aplicables.
La cosa està en que hem de posar un preu per hora a la nostra feina i aquest preu ho hem de posar amb criteris empresarials, és a dir, valorant el que feim i el que el mercat diu que pot valer la nostra feina.
Per posar aquest preu el que necessitam és una referència. L'ideal podria ser anar al sector i demanar a quant cobra l'hora i quins són els seus marges, però donada la naturalesa de la feina i del sector em tem que aquesta informació estaria ben esbiaixada. A veure:
Una cosa és posar un preu per hora i l'altra és que les hores ens surtin a aquest preu (que és el desitjable). L'ideal és que la desviació entre els dos factors sigui mínim, és a dir, hora feta hora facturada, però això vol dir o bé fer feina amb el que se coneix com a "time and materials", que és el que en construcció se'n diu fer feina a jornal, o bé no equivocar-se massa en els pressuposts i dur un control real de les hores que es fan i de les despeses incorregudes a cada projecte.
Ens hem de plantejar què val el nostre temps i comparar-lo amb el que guanyaríem fent feina amb una altra activitat. Una de les comparacions més senzilles és comparar a quant ens surt l'hora real de feina amb el que ens cobra la netejadora o el mecànic per canviar l'oli, demanar-nos si les hores ens estant sortint millor que si treballàssim en qualsevol d'aquests oficis, o bé si els nostres ingressos són els que són perquè feim més hores que el rellotge.
Crec que és una reflexió personal, però que tothom que fa feina pel seu compte s'ha d'arribar a fer i quan més aviat millor, mentre perquè no començar a dur un control de hores per projecte? Ànims, no és tan complicat, el Trac per exemple té plugins per fer-ho, Eclipse i Netbeans ens permeten controlar el temps que dedicam a cada projecte, fins i tot una llibreteta o agenda que puguem dur damunt ens servirà. No controlar els temps per la gent que viu de vendre serveis és com aquella empresa que no s'empatxa de la comptabilitat i sols sap si té doblers a la caixa o no. Controlar el temps ens permet saber què ingressam en la nostra feina, en què dedicam les hores i poder saber quin és el punt de tall, és a dir, el preu per hora a partir del qual he cobert les nostres despeses bàsiques i començar a poder dir que guanayam doblers amb la nostra feina.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes
Mantenibilitat de programari
Escrit per Aaloy a 02 de November , 2009 a les 6:11 p.m.
En aquest article intentaré definir què es la mantenibilitat del programari, com es classifica i miraré d'analitzar l'impacte que pot tenir un llenguatge de programació tipat o no en relació a la mantenibilitat. És la precuela de l'apunt Mantenibilitat en llenguatges tipats i no tipats d'aquest mateix blog, on intentaré definir què és el manteniment i recolzar amb xifres l'impacte que pot tenir utilitzar un llenguatge tipat o no.
Definició de manteniment: La modificació d'un producte de programari després de la seva posada en producció a fi i efecte de corregir defectes, augmentar-ne el rendiment u altres atributs o adaptar-lo a les modificacions de l'entorn.
El manteniment de programari es classifica en quatre categories:
-
Manteniment correctiu. És a dir, la correcció d'errors (bugs) de tota la vida.
-
Manteniment adaptatiu. No hi ha canvi de funcionalitat però ara s'ha de fer feina amb altres condicions. Per exemple un canvi a l'IVA o a un nou plà contable.
-
Manteniment perfectiu o de perfeccionament. Destinat a afegir alguna característica nova al sistema, per tal de fer-ho millor.
-
Manteniment preventiu: Fet de manera interna per tal de millorar el sistema sense afectar-ne a les característiques externes.
Podem agrupar el manteniment adaptatiu i el perfectiu com a millores al sistema, considerades aquestes com quelcom que ha demanat l'usuari i que no estava previst a les especificacions del programa quan es va posar en producció.
Dins el mateniment correctiu podem trobar d'acord amb William E. Lewis les següents categories:
- Errors de disseny: el sistema no s'adapta al que l'usuari havia demanant.
- Errors de lògica: parts del programa no testejades, condicions no previstes, etc)
- Errors de codificació. Errors que resulten de una mala implementació de la lógica o per una mala escriptura del codi.
- Errors de càlcul. Resultat de mesclar tipus incompatibles o fer els càlculs agafant dades incorrectes.
- Errors d'entrada/sortida. Errors de forma, protocols d'entrada i sortida incorrectes, etc.
- Errors d'interfície: nombre de paràmetres incorrectes per exemple (pensen en interfícies XML sense anar més enfora).
- Errors en la definició de dades: Fallades d'inicialització de dades, mal us d'indexs,...
D'aquests tipus d'erros, fitxem-nos que el compilador tipat sols caçarà alguns dels errors de codificació i alguns dels errors d'interfície. Els errors de càlcul no es refereixen sols a mesclar tipus, sinó també a agafar les dades que no toquen o fer operacions incorrectes. Fins i tot en el cas de la mescla de tipus, un llenguatge tipat tampoc és cap garantia, ja que la majoria tenen maneres de passar dades d'un tipus a un altre, i qualsevol programador que codifiqui per coincidència pot acabar aplicant el typecast necessari per a que el compilador no es queixi.
El més important de tota questa classificació d'errors és notar que la gran majoria són errors que no depenen de si el nostre llenguatge de programació es tipat o no, es poden donar en qualsevol llenguatge.
Però anem un poc més enfora. Resulta que en terme mig un 60% del cost d'un programa és cost de manteniment (els intervals van entre un 40 i un 80%). De totes les fonts d'errors que hem enumerat, resulta que la correcció d'errors representa sols un 17% del total del cost de manteniment. Un 60% es dedica a tasques de millora del sistema (el que hem anomenat manteniment perfectiu), representant el manteniment adaptatiu un 18% del cost. El 5% que queda es dedica al manteniment preventiu, és a dir, tasques de mantenimient internes i sovint lligades a la refactorització del codi.
Veim doncs que el cost de manteniment no està en la correcció d'errors, sinó en el manteniment evolutiu i en el manteniment perfectiu. És a dir, el nombre de millores que ens demanaran els usuaris del nostre programa (externs o interns en el manteniment preventiu) representen el 83% del cost de manteniment total.
Perquè aquest cost? Doncs perquè un canvi representa que s'ha de definir i entendre el canvi, avaluar-ne l'impacte (15%), mirar la documentació (si existeix) del programa (5%), seguir el programa per veure que fa el que se suposa que fa (25%), fer el canvi (20%), testejar i depurar (30%) i finalment actualitzar la documentació (5%). És a dir, quan s'afegeix una nova característica a un programa en producció el cost emnor és el de fer el de codificar, el gruix del cost se'n va en entendre el problema (45%) i en la depuració (30%), és a dir, un 75% en tasques que no són directament de codificació i per tant on el tipat del llenguatge poc hi té a veure.
Llavors quan ens demanam què fa un programa mantenible, ens estam demanam com podem fer que el temps necessari per entendre el programa sigui el mínim possible. Reduint el temps d'entendre el que fa el programa reduïm el cost de manteniment i per tant fem el programa més mantenible.
I entendre el codi implica llegir el codi, poder seguir-lo. Es a dir, el codi per a ser mantenible ha de ser escrit pensant en les persones, recordau, no hem d'escriure codi per a que ho executin les màquines sinó per a que ho llegeixin les persones. Un codi millor estructurat és més fàcil de llegir, variables ben posades, codi que no es repeteix, etc. Una vegada més el tipat del llenguatge no hi té res a veure, de fet la literatura ens parla que les inspeccions de codi disminueixen fins en un factor 10 el cost de manteniment, per què? Doncs perquè fan que els programes siguin llegibles, un codi mal d'inspeccionar no passa i per tant no es mantindrà.
En conclusió, la mantenibilitat no és la dóna el tipat del llenguatge, ens la dóna la claretat i l'expressivitat del mateix i la nostra pròpia metodologia de programació i bones pràctiques.
Referències:
- http://www.research.umbc.edu/~cseaman/ifsm698/lect0903.ppt
- Software testing and continuos quality improvement. William E. Lewis (p.285)
- http://en.wikipedia.org/wiki/Software_maintenance
- Facts and Falacies on software engineering. Robert L Glass (p.115)
- Peer Revies in Sofware. Karl E. Wiegers (p. 6)
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Python Essential Reference - 4th Edition
Escrit per Aaloy a 02 de November , 2009 a les 11:14 a.m.
Python Essential Reference, en la seva quarta edició és un llibre dens, com es pot esperar d'un manual de referència, així que no és el millor llibre per a introduir-se en la programació amb Python, en canvi, si ja heu seguit algun tutorial, o algun altre llibre introductori, trobareu que Python Essential Reference toca aspectes pocs coneguts del llenguatge.
El llibre està dividit en tres parts, la primera, més de 200 planes, tracta la sintaxi del llenguatge en profunditat, la segona part, la referència en sí, va desgranant les principals llibreries que hom pot trobar de sèrie en una distribució de Python i la tercera ens ensenya com extendre Python amb C i com es comunica Python amb altres llenguatges (C, .Net o Java).
No es pot dir que ell llibre tengui caràcter pedagògic, però els exemples són als punts justs on ajuden a fer-se una bona idea del que se'ns explica. Com que l'autor David M. Beazley també contribueix a la documentació de Python trobarem que hi ha força semblances entre la documentació oficial i aquesta referència, tot i això, la manera d'explicar algunes coses i l'organització de la documentació és diferent i fa que se n'aprofiti més la lectura.
És un llibre per tenir aprop quan un programa en Python i per rellegir de tant en tant, a l'era Internet aquets tipus de manuals en paper són cada cop menys necessaris, però tot i això útils per gent com jo que prefereix llegir amb comoditat i/o en qualsevol lloc o moment.
Fitxa tècnica:
Python Essential Reference 4th Editon David. M. Beazley Ed. Addison Wesley ISBN: 978-0-672-32978-4
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes Python
Mantenibilitat en llenguatges tipats i no tipats
Escrit per Aaloy a 01 de November , 2009 a les 12:38 p.m.
Quan surt aquesta discusió sovint, al manco al meu àmbit, la discusió es redueix a comparar Java i Python. Recentment en Paco ha obert la capsa dels trons al twitter amb una afirmació "Para escribir código mantenible, mejor un L.P. fuertemente tipado. Si es compilado, mejor".
Damunt el tipat o no em remetré al post de Ned Batchelder i a un comentari d'aquest post, amb al qual hi estic d'acord en un 90%, que traduït lliurement i sense limitar-ho a java diria:
-
Python maximitza la productivitat dels bons programadors
-
Els llenguatges tipats (Java a l'original) minimitzen el mal que els programadors mediocres poden fer al sistema.
Tant de bo la segona afirmació fos certa. La gent pot ser molt creativa i cap tipat del món no pot evitar que es faci un borrat complet contra la base de dades, que s'equivoqui amb l'algorisme del càlcul de l'IVA, les possibilitats són infinites. La referència obligada de que el tipat fort no és cap garantia de mantenibilitat la tenim al post How to Write Unmaintainable Code o passar-se per The daily WTF. El primer cas és fins i tot més sagnant, ja que la gran majoria d'exemples i tècniques es refereixen a llenguatges fortament tipats com el C, C++ i Java. Usos creatius del define, noms de variables que no tenen res a veure amb el que fa la variable, noms lleugerament semblants que fan coses totalment distintes,...
No vull fer sang damunt el tipat fort, la majoria de les coses que expliquen al How to Write es poden extrapolar a qualsevol llenguatge de programació. Però la realitat és el tipat fort no és cap garantia de mantenibilitat.
La mantenibiliat ens la donen les convencions del codi, la documentació, la inspecció periòdica o sistemàtica del nostre codi (o del codi d'altres), el llegir el code complete i aplicar els consells i pràctiques també ajuda força. Tenir test unitaris, programes que ens gestionin l'adherència als estàndarts i la complexitat del codi (n'hi ha per Java, Python, C++, ...), gestió acurada del errors, tests de regressió, etc. a l'hora de la mantenibilitat poden fer molt més que el simple tipat.
Potser perquè molts de programes que he fet al llarg del temps s'han mantingut en producció durant anys sóc un tant fanàtic de la mantenibilitat, preferesc codi matenible a codi guais que al cap d'un mes ningú, ni el seu creador, sabrà perquè ho va fer d'aquella manera. I aquest tipus de mantenibilidad no la dóna el tipat fort o el compilador, la mantenibilitat ens la dóna la gent i les regles que ens imposem a l'hora de crear el codi.
Com la seguretat la mantenibilitat no és quelcom que es pugui posar una vegada el programa està llest. La mantenibilitat ha de formar part del procés de desenvolupament. Sovint he refet o he fet refer codi perquè era mal de seguir, per massa acoblament, perquè la quantitat de ifs feia difícil saber per on anava el codi, i això m'ha passat tant en Java, Pascal o FORTRAN com en Python.
Llavors, pensant en que els programes es fan per a ser mantenibles tant en llenguatges tipats com en els no tipats, la pregunta que ens faríem doncs és perquè triar un llenguatge o un altra i aquí ja entraríem en un altre tipus de discusió.
Si pensam sols en termes de mantenibilitat i suposant que programam com toca potser estarem d'acord que hauríem de triar un llenguatge que fos bo de llegir, de seguir, expressiu i d'alt nivell. El millor codi és aquell que no s'ha d'escriure.
Per mi pocs llenguatges compleixen això tant bé com Python, és un llenguatge molt clar de llegir, amb una corba d'aprenentatge molt suau i amb una dèria cap a la llegibilitat i la mantenibilitat que està incorporada al llenguatge dins la pròpia sintaxi (la identació) i a l'intèrpret mateix (provau import this) o llegiu The Zend of Python i les convencions de codi són públiques i definides des del 2001, la qual cosa no vol dir que no s'hagin canviat al llarg del temps.
En conclusió: el codi mantenible no ho dóna un compilador sinó el programador i la gestió que se dugui del projecte. No podem confiar en que el tipat fort ens farà la feina i ens alliberarà de la feina de crear tests unitaris, de comprovar que el codi està d'acord als estàndards o de que fa el que ha de fer.
Java, C, C++ són grans llenguatges no perquè tenguin tipat fort, sinó pel que els programadors hem fet amb ells. De la mateixa manera Python, PHP, Perl, Ruby són grans llenguatges no per la seva absència de tipat, sinó per codi que ens permeten escriure.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica Python Java
Curs de ASCII art en Python - I
Escrit per Aaloy a 25 de October , 2009 a les 4:25 p.m.
Avui iniciam el primer curs de ASCII art en Python. Per començar un repte: el pare de n'ETE en ASCII art, generat en Python. Seria així:
1 | print(chr(79)) |
I ja ho tenim, Don ETE!
Eps! Algú ha vist les meves pastilles?
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Conyes marineres
Risc o seny
Escrit per Aaloy a 25 de October , 2009 a les 8:56 a.m.
Llegint l'article de Ned Batchelder, "The Scalability of programming languages" me n'adono que es troba en una tesitura com la que jo potser me trobaré d'aquí poc. Ell, un dels creadors de Tablo, comprat fa dos anys i mig per HP, es veu que es troba sota pressions per deixar de desenvolupar l'aplicació en Python per fer-ho en un dels llenguatges "corporatius" d'HP.
Per mi Django i Python representen un avantatge competitiu, ja que permeten una posada en producció, des de la concepció de la idea fins a posar l'aplicació al servidor, molt més curta, un temps de reacció als canvis i incidències difícilment superable, i sobretot, una capacitat de manteniment que fa que es pugui tocar una aplicació feta fa anys sense problemes.
El més curiós,però, és veure com les novetats, tot allò que pot representar una ruptura amb "la manera de fer les coses" presenta un problema fins i tot en les empreses que han fet de la innovació una de les seves raons de ser.
En una era on la tecnologia representa un avantatge competitiu important, limitar-se a allò que fa tot hom vol dir que no s'aprofita aquest avantatge. Això no vol dir tirar-se de cap cap a una nova tecnologia tan aviat com apareix, però una vegada avaluada, si la nova tecnologia representa una millora respecte al que tenim, el risc de ser dels primers en fer-la nostra es pot veure compensat per l'avantatge que ens donarà. Fins i tot si es demostra que la tecnologia no era allò que esperàvem, l'esforç necessari per a implantar-la i el canvi mental que suposa, farà que el nostre equip estigui més obert a les novetats i que llavors sigui molt més senzill anar introduint millores als nostres processos.
És un poc també com la situació en la que una empresa té l'opció de crear un nou programa per a comercialitzar els seus productes o comprar-ne un de ja fet. Desenvolupar-lo implica més risc i cost, però ens dóna un control total damunt el programa i podem fer-hi les modificacions que facin falta per adaptar-lo als nostres processos de negoci. Comprar-ho fet vol dir que qualsevol amb el capital suficient pot fer el mateix que nosaltres comprant el mateix programa que nosaltres. El que es dóna a més, és que nosaltres podem haver pagat per unes modificacions al programa que han costat temps i esforç de desenvolupar, i la nostra competència les tendrà des del primer dia a cost zero. Adéu a l'avantatge competitiu!
En aquests moments la tecnologia web i els llenguatges que li donen suport estan en un moment d'evolució important: llenguatges d'script per desenvolupar webs, pas cap a models de base de dades no relacionals, utilització de bastiments javascripts purs, serveis REST... Tot això està molt lluny dels llenguatges i tecnologies "corporatives", però són les tecnologies que formen la base de les noves aplicacions d'Internet, de la innovació.
Les empreses hauran d'elegir si prefereixen quedar-se en un sector madur i anar fent el mateix que tothom, o començar a apostar per la innovació i jugar-se-la de tant en tant amb projectes i tecnologies no tant consolidades però amb molta projecció.
Els riscs hi són, però ja se sap, qui vol peixos ...
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Consultes dinàmiques a Django
Escrit per Aaloy a 15 de October , 2009 a les 9 p.m.
Estic mirant de fer un poc més fàcil la integració de jqGrid amb Django, integrar la paginació ha estat força senzill ja que jqGrid i Django fan servir un conjunt de variables semblant: plana actual, total de registres i llista de registres.
jqGrid passa aquests paràmetres per GET quan feim un camvi de plana, per tant podem aprofitar l'objecte paginator de Django per fer la paginació com si fos una aplicació HTML clàssica, sols que en lloc d'HTML retornarem JSON (o XML).
La cosa es complica un poc més quan es tracta de cercar. jqGrid fa servir quatre paràmetres: _search, que es posa a true quan s'ha activat la cerca, searchField que conté el camp pel qual es cerca. SearchField retorna el contingut de la variable index de colModels si existeix o bé el nom. Llavors tenim també searchOper que ens informa del tipus de cerca que es vol fer. Per exemple, passa eq per indicar la coincidència exacta, ew per indicar acaba amb i cn correspon a la sentència IN d'SQL. Per acabar searchString conté el valor del que estam cercant.
Així doncs es tracta de montar un filtre de manera dinàmica amb Django a partir dels valors que ens envia el jqGrid. El primer que hem de fer és fer la taula d'equivalències que mapejarà cada operació de jqGrid amb una operació equivalent de Django.
Per exemple:
1 2 3 4 | django_equivalences = { 'eq': '%s__iexact', 'lt': '%s__lt', 'le': '%s__lte'} |
Això éns permet convertir fàcilment una expressió d'igualtat per a un camp amb l'equivalent Django
1 2 | field = self.request.GET.get('searchField') op = request.GET.get('searchOper') % field |
Amb això ens trobam amb dos problemes: què feim amb les condicions del tipus "no és igual a" o "no comença amb" i què feim amb les expressions "in". I si m'apurau amb un problema més, com passam aquestes condicions que constriuim (o construirem) dinàmicament a Django. Perquè Django espera construccions del tipus Entry.objects.filter(id__gt=4) i nosaltres el que farem és construir-les.
Si ens fixam en la documentació veurem que el problema dels inclosos i dels exclosos està resolt per filter i excludes. Amb la mateixa construcció i generant la consulta amb excludes en lloc de filter ja ho tenim. Sols necessitam doncs que el mapeig a més de la plantilla ens retorni el tipus a que correspon filter o bé excludes.
1 2 3 4 | django_equivalences = { 'eq': ('filter', '%s__iexact'), 'ne': ('exclude','%s__iexact'), 'lt': ('filter', '%s__lt')} |
Suposant que la nostra classe es diu Entry podríem fer quelcom semblant a això:
1 2 3 4 5 6 7 | searchField = request.GET.get('searchField') op = self.request.GET.get('searchOper') value = request.GET.get('searchString') tipo, filtro = django_equivalences[op] query = {filtro%searchField:value} record_list = Entry.objects.filter(**query) if tipo == 'filter' \ else Entry.objects.exclude(**query) |
Fitxem-nos com hem fet la construcció dinàmica. En lloc de crear el codi el que feim és crear un diccionary query que té com a clau l'operació de filtratge damunt el camp que jqGrid ens passa i com a valor, el que volem cercar.
Ens queda encar un petit detall, què passa amb l'in, a Django mapejaria com icontains i espera una llista de valors com a paràmetre. Està clar que ho podríem tractar com un cas particular, però anem-ho a fer divertit, el que farem serà afegir una funció com a valor del mapeig que ens dirà el que hem de fer amb el valor, llevat de in i ni (includes i not includes) no s'ha de fer res, millor dit la funció ha de retornar el mateix valor que li passam (us sona la funció identitat?) i en cas contrari convertirem el valor que ens passi a una llista de valors mitjançant el mètode split(',').
Així doncs el nostre mapeix seria:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | identity = lambda x:x django_equivalences = { 'eq': ('filter', '%s__iexact', identity), 'ne': ('exclude','%s__iexact',identity), 'lt': ('filter', '%s__lt',identity), 'le': ('filter', '%s__lte',identity), 'gt': ('filter', '%s__gt',identity), 'ge': ('filter', '%s__gte',identity), 'bw': ('filter', '%s__istartswith',identity), 'bn': ('exclude','%s__istartswith',identity), 'in': ('filter', '%s__in',lambda x: x.split(',')), 'ni': ('exclude','%s__in',lambda x: x.split(',')), 'ew': ('filter', '%s__iendswith',identity), 'en': ('exclude','%s__iendswith', identity), 'cn': ('filter', '%s__icontains', identity), 'nc': ('exclude','%s__icontains', identity) } field = request.GET.get('searchField') op = self.request.GET.get('searchOper') value = request.GET.get('searchString') try: tipo, filtro, f = django_equivalences[op] except KeyError: tipo, filtro, f = django_equivalences['eq'] filtro = str(filtro % field) query = {filtro:f(value)} record_list = Entry.objects.filter(**query) if tipo == 'filter' \ else Entry.objects.exclude(**query) |
Com veis un exercici interessant perquè hi ha un poc de tot: funció lambda, us dels diccionaris, ús de les funcions com a objectes i pas de paràmetres a una funció mitjançant un diccionari.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django
Prova de concepte: APSLHOTELS
Escrit per Aaloy a 11 de October , 2009 a les 10:15 a.m.
Ahir al vespre vàrem obrir al públic la nostra prova de concepte del que pot ser una plana de reserves d'hotels: http://hotelestest.apsl.net/. I quan dic prova de concepte en refereixo a poder mostrar el que es pot fer amb la tecnologia Python+Django.
A la nostra comunitat un tant per cent elevat de la informàtica gira al voltant del negoci turístic. Quan vas a parlar amb algú del sector i li dius que programaràs la seva aplicació amb Python i Django sovint ho troben un poc estrany, estan acostumats al PHP i com a molt al Java o .Net, no veuen clar que es pugui fer.
Aquesta prova de concepte vol mostrar el senzill que és i algunes de les possibilitats que té la tecnologia actualment. Per fer la demostració volíem que la plana es connectàs a un XML/SOAP d'un tercer ja que d'aquesta manera es cobreix l'ús més habitual: fer una aplicació web on el motor i la capa de presentació estan separades per un servei XML. Dels proveïdors amb que contactàrem vàrem tenir molt bona acollida i suport de la gent de Valadis/Versys, ens varen donar moltes facilitats des del començament i el seu XML és molt senzill de mapejar. Està clar que les idees que es presenten es poden desenvolupar amb gairebé qualsevol proveïdor XML d'hotels, però vàrem tenir la sort de poder topar amb aquesta gent i que ens donàs accés al seu sistema de proves sense cap problema. Des d'aquí moltes gràcies.
Així doncs, tenim una aplicació B2C que permet reserva hotels i que connecta al motor XML de test d'un proveïdor extern. Com a bon entorn de test he de dir que es troba en contínua evolució i que les dades que es mostren són sols un subconjunt molt limitat de les que es tendrien en un entorn de producció. No us fixeu massa en les dades, sinó en el bessó del que es mostra. Per cert, podeu provar tot el que volgeu, tanmateix no es fa cap tipus de pagament ni control a la tarja que poseu.
Feta aquesta introducció anem a veure un poc la bèstia:
El desenvolupament
Com he dit l'aplicació està desenvolupada fent servir Python+Django, pel control de versions s'ha fet servir Subversion i pel control del projecte s'ha fet servir Trac.
Per crear l'aplicació hem mapejat l'XML a objectes Python amb la llibreria lxml, una llibreria que envolcalla les llibreries C libxml2 i libxslt. La velocitat del C i l'expressivitat de Python.
Per la depuració i programació hem fet servir: django-extensions, debug_toolbar, ipdb i ipython. La primera llibreria ens proporciona tot un conjunt de funcions còmodes per l'administració de l'aplicació, debug_toolbar ens diu quina plantilla es fa servir en cada pantalla, les seves herències, les sql que es generen, etc. ipdb és un depurador de línia de comandes, com el pdb però amb autocompletat i ressaltat de sintaxi. ipython és una consola Python, Django l'aprofita si està instal·lada, proporciona autocompletat, resaltat de sintaxis i un gran nombre de comandes extra.
Els editors més habituals han estat Netbeans, Eclipse, Vim, Kate i Notepad++ (per Windows). L'editor importa poc, tots estan configurats per fer feina amb UTF-8 i els tabuladors configurats a 4 espais. Amb això en tenim prou per poder fer servir en qualsevol moment l'editor que més ens agradi. Particularment vaig d'un a l'altra segons la màquina que faig servir.
Per les planes de contingut estàtic hem fet servir django-page-cms, la idea és mostrar com un gestor de continguts es pot integrar dins l'aplicació.
Els css i js es comprimeixen abans de servir-se gràcies a django-compress. Això vol dir que podem fer cachés mesos. Quan el css o el js canvii sols hem de tornar a generar els arixus comprimits i la llibreria els posa un nou nom.
La configuració de sistemes
L'aplicació s'executa en un chroot propi dins un servidor propi que duu moltes més aplicacions.
vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Pentium(R) Dual CPU E2180 @ 2.00GHz stepping : 13 cpu MHz : 1994.999 cache size : 1024 KB top - 08:52:55 up 729 days, 13:56, 0 users, load average: 0.07, 0.02, 0.00 Tasks: 126 total, 1 running, 125 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1015232k total, 984036k used, 31196k free, 154472k buffers Swap: 2097144k total, 2948k used, 2094196k free, 90536k cached
L'entorn d'execució s'independitza de la màquina amb aquest chroot i a més es va crear un entorn virtual separat per l'aplicació amb virtualenv, això permet tenir un control total damunt les llibreries i el Python Path.
Seguint les millors pràctiques, hem separat els dominis que serveixen el contingut estàtic del contingut dinàmic. Això és prou senzill amb Django i sols has de recordar escriure les url amb {{MEDIA_URL}}.
Donat que és una màquina amb altres aplicacions volíem que el consum de memòria fos mínim. Per això hem optat per que el servidor http no fos un Apache sinó nginx que tenim configurat tant per servir el contingut estàtic com per a fer de proxy invers cap al motor WSGI que executa l'aplicació Django.
Pel motor WSGI triarem CherryPy (d'aquí no res posarem Tornado). Amb això tenim una relació de consum de recursos de màquina i rendiment molt òptima i una escalabilitat horitzontal fabulosa. Posant-hi un balancejador podem anar copiant i aferrant chroots i dins cada chroot podem tenir tantes instàncies de l'aplicació con suporti la màquina.
És veritat que no calia complicar-se tant per a una prova de concepte, però la idea no és tan sols mostrar el que es pot fer en programació, sinó com la tecnologia i el frameworks s'adapten a les necessitats actuals i futures de rendiment. És a dir, que s'escala cap amunt i cap avall.
L'aplicació
A la primera plana hi trobam el cercador, el típic cercador afegiria. Aquí utilitzam jquery-ui pels widgets de calendari. Hi ha la demostració de l'autocompletat als apartats de destinos i nombre de hotel.
El errors es mostren a la plana de manera poc intrusiva. Per això s'utilitzen plugins de jquery i les capacitats de serialització json de Python i Django, junt amb la validació de formularis de Django. És molt més senzill del que sona.
També es pot veure la utilització que es fa del CMS en les planes de Aviso Legal per exemple i també hi podem trobar dos tipus d'ofertes.
Aquestes es mantenen dins la part d'administració. No són gaire sofisticades, però serveixen per mostrar el dinamisme que es pot aconseguir i el concepete d'url semàntica.
Picant damunt una oferta per exemple, anirem a la plana de resultats. Recordem que anam contra un entorn de proves i que les dades són les que són. La idea és poder mostrar com les dades de l'hotel es carreguen dinàmicament mitjançant una cridada AJAX i com l'aplicació manté en sessió les dades de la selecció.
Hem posat també un filtre js. Pitjant damunt el filtre de categoria desapareixen els hotels amb aquesta categoria. Es pot utilitzar el mateix concepte per a filtrar els resultats per altres camps (preu, tipus d'habitació, ...)
A partir d'aquí ja anam a les pantalles que obtenen la informació de compra i a la de gràcies. Res destacable en aquest punt que no hagi sortit abans.
Pas a producció
Hi ha gent que ens ha demanat pel pas a producció d'aquesta aplicació. Recordau que és una prova de concepte, no hi haurà pas a producció, serveix per mostrar idees de programació, conceptes tecnològics i d'optimització.
El que si es pot fer és desenvolupar una solució a mida amb aquestes tecnologies, però serà sempre per a un tercer i si es fes hi hauria molta feina que en la prova de concepte s'ha obviada:
- Continguts estàtics: hem posat lorem ipsum gairebé per tot.
- Filtres
- Paginació de resultats
- Connexió amb una passarel·la de pagament
- Generació del bono
- Enviament del bono al client
- Backoffice de control
L'aplicació tal com està i en les seves possibles evolucions té per objectiu que gent com nosaltres que ens dedicam al desenvolupament Python i Django poguem mostrar al món turístic el que es pot fer. Consideram l'aplicació com un Projecte Mascota: hi anam dedicant hores quan ens fa ganes.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Esquivant la mort, de Josh Bazell
Escrit per Aaloy a 27 de September , 2009 a les 8:59 p.m.
Aquest cap de setmana, entre copa de vi, fideus i passejades he llegit el llibre "Esquivant la mort" de Josh Bazell. És la història d'un assassí reciclat a metge. La portada diu que és "un thriller hilarant, entre House i Els Soprano". Jo no diria tant i crec que la comparació amb House li ve però que molt molt gran, coses del marketing.
Tot i això és un llibre molt entretingut, amb un ritme molt ben aconseguit i que t'engantxa, no tant per veure com s'acaba la cosa, sinó per conèixer-ne més coses del personatge i de la seva història.
M'ha agradat força. Absteniu-vos els sensibles.
Fitxa tècnica:
Esquivant la mort Josh Bazell, traducció d'Elisabet Ràfols Editorial l'Eclèctica bromera ISBN 978-84-9824416-8
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Simple Web services
Escrit per Aaloy a 23 de September , 2009 a les 8:33 p.m.
L'altra dia ens van donar un "curset" d'introducció a TIBCO i ho pos entre cometes perquè curset potser no és la paraula adient, ja que més aviat va ser una presentació comercial. Tot i això i entre capada i capada d'avorriment vaig tenir l'ocasió de parlar amb el formador (o deformador) dels serveis dins les possibilitat que ofereix TIBCO. Deia que era molt senzill agrupar serveis i generar el WSDL corresponent per a ser consumit fàcilment per altres aplicacions.
No dubt que això sigui així però les meves reticències fonamental venen donades pel fet de que quan vols que el teu servei sigui consumit externament, el que has de fer és facilitar al màxim que la gent ho pugui fer.
El SOAP és un protocol que va néixer per ser simple i que ha acabat essent complexe fins al punt de fer-se immanejable, sobre tot gràcies a les extensions que es varen introduir per a facilitar-ne la creació i consum per llenguatges concrets. L'article de Peter Lacey del 2006, anomenat The S Stands for Simple en fa una discussió emprant el mètode socràtic que s'ho paga llegir.
Quan per raons de negoci (el cap ho ha exigit, per dir-ho més clar) hem tingut que fer els web services amb SOAP el que hem procurat sempre és controlar molt bé el resultat final del WSDL de manera que fos fàcilment consumible tant pel qui l'ha creat (Java en el nostre cas) com per altres llenguatges (Python per exemple). Aquest resultat difícilment s'obté si qui genera el SOAP suposa que és el mateix que l'ha de consumir i per tant no veu la complexitat des del punt de vista d'un tercer, sinó que genera el WSDL de manera que la transformació inversa li sigui favorable.
Per una altra banda afegir la capa SOAP i consumirla té un cost (el famós payload) en termes de capacitat de procés i ampla de banda. Si alguan cosa té és que entre namespaces, definicions i subdeficinions, un missatge que podria de ser de pocs bytes multiplica el seu pes per 100 o per 1000.
Per una altra banda, la complexitat del WSDL fa que sovint no basti el WSDL com a documentació (un dels objectius del SOAP) sinó que s'ha d'adjuntar una documentació addicional explicant cada missatge, quins són els paràmetres, etc. Així que argumentar que el WSDL s'autodocumenta és pecar un poc d'ingenuo i optimista.
El SOAP és bo si es mantén simple, el problema és que fer-ho simple i consumible fàcilment duu molta feina i se suposava que això ens ho hauria d'evitar.
Ara mateix l'alternativa és tornar a la simplicitat. Evitar la sobrecàrrega de feina de màquina i gent que suposa el SOAP i anar cap a protocols més senzills:
-
XML+HTTP. Amb una eina d'extracció de documentació podem fer la web de documentació i proves al mateix temps que escrivim el servei. Activant la compressió del gzip del servidor ens queda tot d'allò més compacte.
-
XML-RPC. Anam un poc més enllà. Podem consumir l'XML com si d'una llibreria es tractàs. Igual que abans la documentació dins el codi ens pot permetre estalviar molta feina. David Fisher ha fet un exemple molt instructiu amb Django d'aquest concepte.
-
Json-RPC o Json+HTTP. El Json s'ha convertit en un format d'intercanvi potent i senzill. Perquè no utilitzar-ho? Es pot consumir gairebé des de qualsevol llenguatge modern i la transformació a objectes nadius és trivial.
-
REST. Utilitzam les URL si l'HTTP per al nostre intercanvi d'informació. És el que mou la web. Se li ha donat un nom i un conjunt de criteris per a formalitzar el mecanismes d'accés als serveis.
El gran avantatge de tot això és que la generació del servei no requereix de llenguatges "empresarials", sinó que ho podem fer fins i tot amb qualsevol microframework (web.py, Tornado, ...) amb Django o amb qualsevol cosa que ens permeti respondre a una petició http i tractar-ne les capçaleres.
Per Django per exemple tenim el projecte Django-Piston que ens permet crear una API REST per als nostres projectes d'una manera molt poc intrusiva.
Fa una bona temporada que el SOAP i els WSDL que hem fet sols estan en manteniment. Si els tengués que fer ara i depengués de mi o serien serveis REST o bé XML purs i segurament tampoc estarien fets en Java.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django
Comenta, que serveix
Escrit per Aaloy a 21 de September , 2009 a les 9:02 p.m.
Quan un fa programes per aprovar l'assignatura sap que ha de posar comentaris perquè si no no és considera un codi professional, així que els posam per obligació, perquè hi han de ser, però potser sense adonar-nos de la seva utilitat real.
Els programes que feim per aprovar rarament són molt complexos, són exemples que es poden fer en poques setmanes i que rarament s'hauran de mantenir. La vida real és força diferent, els programes tenen un cicle de vida llarg, d'anys o dècades i s'han de fer millores correctives i adaptatives.
Aquell programa que ahir teníem molt clar al cap d'uns anys potser ja no ho tindrem tant i els comentaris que posàrem faran que tot ens resulti molt més fàcil d'entendre. I ja no diguem res si no som nosaltres el que hem de mantenir el codi!
Els bons comentaris ens haurien de dir el perquè del codi, què fa, què espera a l'entrada i què a la sortida. El codi ens dirà com ho fa. Això vol dir que el codi també ha de ser llegible, teclejar una mica més no costa tant i podem posar noms a les variables, a les classes, a les funcions, que tenguin significat.
Python per exemple té dues castes de comentaris, els que es fan servir per documentar el per què, i que sovint es presenten en forma de cometes triples i que es lliguen al doc (i a l'ajuda) de l'objecte i els comentaris fets amb la parrilla (#) que s'han de fer servir per comentar aspectes del codi que no necessitin. Java té quelcom semblant.
Però podem anar una mica més enllà. L'altra dia al twitter algu deia que li quedava fer la documentació de la pràctica. També molt habitual :) Posar bons comentaris ens pot estalviar una bona feina i no tan sols això, sinó que serà text de qualitat ja que s'ha fet amb menys presses i amb la ment més fresca en relació al que se està fent.
I encara una utilitat més: el pseudocodi. Particularment quan he de fer una cosa complexa començ per escriure'n les passes i les pos en forma de comentari. D'aquesta manera tenim més clar el que s'ha de fer i el temps s'aprofita, ja que aquest pseudocodis seran després els comentaris que ajudaran a seguir millor el codi.
No vull acabar sense citar una eina fantàstica per a la documentació: l'Sphinx us podeu adonar d ela bona feina que fa amb la documentació de Python o Django per exemple. Sphinx té una cosa molt bona, ens permet extreure els comentaris del nostre codi Python i afegir-los a la documentació, de manera que du el reaprofitament i la màxima DRY al món dels comentaris i la documentació. Per poc que us agradi el RestructuredText no deixeu de fer-li una ullada a aquesta eina, fins i tot si no programau en Python.
Per cert, en el seu dia vaig deixar un petit tutorial de RestructuredText a Bulma.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
La qualitat de vida
Escrit per Aaloy a 17 de September , 2009 a les 12:44 a.m.
Disclaimer: Avuir parlaré un poc de jo. Em sap greu pel qui tengui que aguantar les meves batalletes, però com molts sabeu mantenc aquest blog perquè m'agrada i a més em desestressa, ja que em permet reflexionar i posar en clar pensaments que d'una altra manera quedarien fent voltes pel cap.
Mode batalleta ON!
Potser us n'haureu adonat que tenc dues feines: la principal, com a cap de projecte web a una important empresa turística i APSL una aposta de futur junt amb altra gent i que em permet explorar camins que em serien molt difícils de seguir a l'altra banda. Potser hauria d'afegir una tercera, la de pare de família, però deixem-ho aquí, ja que si bé te a veure amb la gestió de projeces, no té res a veure amb la programació :)
Fa uns anys l'empresa principal es fa fusionar amb un altra d'igual tamany i ara han arribat a IT les onades del tsunami en forma de subrogació de contractes. Dins la xerrada damunt el que es guanya i el que es perd per mi té molt manco importància el fet monetari o de posició com el concepte de "qualitat de vida".
Com podreu suposar m'agrada la feina que faig. Cap feina és perfecte i per això APSL cobreix la part que a l'altra li falta: possibilitat de relacionar-se amb clients externs, contacte amb el mercat real, gestió des de zero de l'empresa, ...
La subrogació d'empresa en principi implica mantenir les mateixes condicions laborals, però òbviament la part subjectiva, el que jo anomen qualitat de vida canvia o pot canviar. I com que m'agrada fer llistes us explicaré algunes de les coses que més valor.
-
La diversió. M'agrada divertir-me fent feina. Sentir passió pel que faig, superar reptes i posar coses en marxa i acabar-les. Per mi avorrir-me no és tenir poca feina, un es pot avorrir estant les vuit hores fent el mateix o no fent res. No avorrir-se és fer el que a un el motiva i li agrada, i per mi això és fonamental. Passam massa hores a la feina com per passar-les a disgust. Trob que aspirar a fer una feina que t'agradi i que a més et paguin és una aspiració a la que no s'ha de renunciar.
-
La proximitat. No m'agrada conduir, i no m'agrada estar 40 o 50 minuts a la carretera. Si no em fes res podria estar fent feina a la Península per molt més sou, però valor molt la qualitat de vida que em dona plantar-me a l'oficina des de Binissalem en 15 o 20 minuts i tenir temps suficient per arribar a fer un cafè. Fa anys vaig canviar de feina, estava a Viajes Iberia, el factor decisiu va ser el que necessitava 40 minuts per aparcar i anar a l'oficina, més 20 minuts de trajecte. Estava molt bé allà, però per mi això no és qualitat de vida, i és una de les feines o he estat més còmode, amb companys i caps magnífics.
-
L'horari. Cap horari és perfecte, d'això en sóc ben conscient. Tot i això m'agrada que el meu horari em permeti arribar a casa a temps per ajudar els menuts amb la tasca, amb temps per llegir, amb temps per dedicar-ho a APSL. Està clar que no necessàriament tot al mateix dia i a la mateixa vegada. M'agrada més un horari continuo que un de partit, i si no pot ser un horari compacte. Les guàrdies no m'agraden pel que signifiquen a l'impacte de la vida familiar.
-
El lloc de feina. M'agrada tenir una taula ampla. Sóc molt dispers amb els trastos i m'agrada tenir a mà llibres, apunts i al manco dos ordinadors. La cadira se suposa còmoda i el monitor decent, quan puc triar jo dos monitors (a casa i a APSL). M'agrada tenir a mà una pissarra i un lloc de reunions on fer els scrums diaris. M'estim més el silenci que el renou i m'agrada poder sentir la llum solar. Tenir una cafetera és fonamental i millor encara si el cafè és bo i el paga l'empresa.
-
De l'ambient. No sóc classista, trob que la relació amb la gent ha de ser franca i oberta independentment del rol de feina que tengui cada un. No m'hi trob còmode en ambients on per tenir una carrera laboral has de llepar culs i riure gràcies quan no en tenen i no fer-te amb els subordinats. M'agrada que em diguin les coses amb franquesa, educació i a la cara, i procur fer el mateix. Intent separar la persona de la feina, encara que sé que és difícil. Si algun aspecte de la feina de la gent del meu equip no m'agrada procur fer-li saber, no com a retret, sinó com a ajuda. Tant fa lo bé o malament que me caigui una persona fora de la feina, dintre a més de l'amistat hi ha una relació professional, una feina a fer i un grup en el qual tots depenem de tots.
-
De la tecnologia. M'agrada fer les coses de la manera més eficient possible o al manco tan eficientment com es pugui. Sóc partidari de tecnologies obertes i de llenguatges de programació i metodologies àgils. No conceb la programació sense un sistema de control de versions. Poder fer projectes amb Python és part de la diversió.
-
De la gent. M'agrada la gent amb iniciativa, que proposi coses, que accepti noves idees. Valor molt poder confiar en que la gent amb dirà que estic equivocat si troben que ho estic o que seran lliures de proposar millores i noves maneres de fer les coses. Hi ha gent que se sent còmode amb pilotes i beneits perquè no li fan hombra, a mi m'agrada poder dir que faig feina amb gent que és tant o més vàlida que jo.
Ens passam molt temps a la feina i crec que ja tenc prou experiència com per valorar aquests factors subjectius tant o més que una promesa de projecció de carrera o incentius econòmics. El sou és important, no diré que no, però a l'hora de agafar una feina o de decidir deixar la que tenc el que pesa no és tant el sou com les perspectives de millora en qualitat de vida, en tenir una feina prou interessant com per a que valgui la pena aixecar-se cada dia per anar a la feina.
Mode batalleta off!
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica General
Django CherryPy vs Tornado
Escrit per Aaloy a 14 de September , 2009 a les 7:28 p.m.
Fa pocs dies s'ha alliberat un motor web anomenat Tornado part de la tecnologia que mou FriendFeed.
És un servidor no bloquejant que promet molt en quan a velocitat, pensat per moure FriendFeed i escalar la càrrega que faci falta.
Independentment de que es pugui desenvolupar amb ell tot una aplicació, sols la part de servidor http ja és prou interessant com per fer-li una ullada. En un post a la llista de Django Bret Taylor, un dels autors de Tornado, postejava com connectar el motor amb Django mitjançant WSGI.
Actualment una de les configuracions que més m'agraden per desplegar aplicacions és la combinació nginx+CherryPy WSGI+Django (amb balancejadors, memcached i tota la pesca gràcies a la bona feina de Bernat i Pere), així que estava força intrigat per veure com respondria Tornado.
La base estava feta: una mini-aplicació "hello world" que vaig escriure per comparar aquesta tecnologia/arquitectura amb diferents frameworks PHP, així que ha está un no res actualitzar la darrera versió de CherryPy WSGI i crear una nova aplicació semblant per Tornado.
El codi font és a:
I ara els resultats:
La màquina és un PPC 1 Gb de RAM, 2 CPU de 2 GHz
Amb Tornado WSGI:
ab -c 10 -t 60 http://localhost:8888/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Finished 25022 requests
Server Software: TornadoServer/0.1
Server Hostname: localhost
Server Port: 8888
Document Path: /
Document Length: 266 bytes
Concurrency Level: 10
Time taken for tests: 60.019 seconds
Complete requests: 25022
Failed requests: 0
Write errors: 0
Total transferred: 9333206 bytes
HTML transferred: 6655852 bytes
Requests per second: 416.90 [#/sec] (mean)
Time per request: 23.987 [ms] (mean)
Time per request: 2.399 [ms] (mean, across all concurrent requests)
Transfer rate: 151.86 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 6
Processing: 3 24 1.9 24 68
Waiting: 0 24 1.9 23 68
Total: 7 24 1.9 24 68
Percentage of the requests served within a certain time (ms)
50% 24
66% 24
75% 24
80% 24
90% 25
95% 26
98% 27
99% 28
100% 68 (longest request)
Usant CherrPy amb 3 threads (la millor configuració per la meva màquina segons les meves proves)
ab -c 10 -t 60 http://localhost:8088/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Finished 21500 requests
Server Software: CherryPy/3.0.3
Server Hostname: localhost
Server Port: 8088
Document Path: /
Document Length: 266 bytes
Concurrency Level: 10
Time taken for tests: 60.001 seconds
Complete requests: 21500
Failed requests: 0
Write errors: 0
Total transferred: 8299000 bytes
HTML transferred: 5719000 bytes
Requests per second: 358.33 [#/sec] (mean)
Time per request: 27.907 [ms] (mean)
Time per request: 2.791 [ms] (mean, across all concurrent requests)
Transfer rate: 135.07 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 20.5 0 2999
Processing: 3 28 10.7 26 413
Waiting: 3 26 10.3 24 412
Total: 3 28 23.1 26 3031
Percentage of the requests served within a certain time (ms)
50% 26
66% 28
75% 30
80% 31
90% 34
95% 38
98% 43
99% 48
100% 3031 (longest request)
En resum:
416.90 req/s for Tornado WSGI 358.33 req/s for CherryPy
Tornado fa que una CPU es posi al 100% gairebé des del començament de l'execució de la comanda ab, CherryPy també posa la CPU al 100% però ho fa més tard i potser això explica la diferència, potser algún gurú de CherryPy em podrà dir una configuració millor que la que tinc.
58 peticions representen un 16% més de peticions que pot aguantar Tornado respecte de CherrPy, i si us hi fixau el codi que es necessita per executar-hi Django és pràcticament calcat gràcies al WSGI.
Seguesc fent proves, però per ara la cosa pinta molt bé.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Python Django
Lean software development
Escrit per Aaloy a 13 de September , 2009 a les 12:23 p.m.
Aquesta setmana he acabat de llegir Lean Software Development, An agile toolkit de Mary i Tom Poppendieck.
El llibre descriu la metodologia anomenada Lean Development, un conjunt de pràctiques i consells que ens poden ajudar a agilitar els nostres desenvolupaments i minimitzar el riscs dels nostres projectes.
El Lean Delopment és la translació de les pràctiques de desenvolupament de vehicles de Toyota al món del programari, que es resumeixen en set principis:
- Eliminar la brossa. Tot allò que no aporta valor al producte des del punt de vista del client és brossa.
- Potenciar l'aprenentatge. El desenvolupament no és duu bé amb pràctiques que fermen la gent, les típiques de la producció en cadena de bens de consum.
- Decidir el més tard possible. Deixar els desenvolupaments oberts als canvis, de manera que cuan la decisió es prengui es pugui aplicar el més aviat possible.
- Entregar el més aviat possible. Els cicles de desenvolupament han de ser curts i permetre a l'usuari i al programador entendre millor el que es vol mostrant el que ja es té fet.
- Potenciar l'equip. Els programadors saben fer la seva feina, i la millor manera de gestionar un equip no és mitjançant el mocromanagement sinó donant-los marge de maniobra i capacitat de decidir.
- Construir pensant en la integritat. La integritat és allò que l'usuari perceb com a un tot, com un producte redó, i allò que el programador a nivell intern perceb com a un tot que funciona.
- Veure el conjunt Evitar la micro-optimització i la suboptimització, és allò de que els arbres no et deixin veure el bosc.
Els autors proposen 22 eines per pensar, que desenvolupen aquests set principis i ens fan reflexionar damunt el que és el desenvolupament de programari i el paper que e el Lean Development dins el conjunt de metodologies àgils.
El Lean Development més que una metodologia és una filosofia de desenvolupament. Xoca frontalment amb ISOs i CMM i totes aquestes coses oficials amb tantes sigles. Amb tot allò que vol fer que el desenvolupament de programari s'assembli a una cadena de muntatge, ho resumeix molt bé a una cita de McNight "If you put fences around people, you get sheep. Geve people the room they need.". Tanmateix la manera clàssica de fer de les cadenes de muntatges s'ha demostrat ineficient i per tant passar-ho al programari és intentar aplicar una metodologia que ja se sap que no és bona.
També toca un dels aspectes més problemàtics del desenvolupament: com s'apliquen les metodologies àgils quan un fa feina per tercers i té que fer un pressupost. El Lean development té com a filosofia donar al client allò que necessita en lloc d'allò que ha demanat i això no encaixa massa bé amb especificacions tancades i pressuposts clau en mà. El llibre proposa tot una sèrie de tipus de contracte diferents dels habituals. Un dels que més m'ha agradat és el co-source contract, on les dues companyies fan feina juntes i hi ha una transferència de coneixements del venedor al client.
El tema de l'aplicabilitat de les metodologies àgils quan fas feina per un tercer és sempre problemàtica. S'han d'explicar molt bé les coses i el client ha de tenir la voluntat d'entendre i la confiança mútua de que cap de les parts intentarà aprofitar-se de la bona fe de l'altra. Els contractes a preu fitxe donen lloc a usuaris insatisfets - veure també Is Fixed-Price Software Development Unethical?- però en la meva opinió l'usuari també ha de ser conscient del que està demanant al desenvolupador. Si la seva intenció és transferir el risc del projecte a l'empresa desenvolupadora llavors segur que hi haurà problemes, ja que el venedor intentarà protegir-se fent exactament el que diuen les especificacions.
M'agrada la definició de confiança que els autors atribueixen a Dyer: "la seguretat de que l'altra part complirà amb les seves obligacions i que no explotarà les vulnerabilitats". Crec que és la base d'una bona relació comercial: el comprador no explota al venedor i aquest no se n'aprofita del client més que per l'obtenció d'un benefici just. Ben allunyat del "pelotazo".
Si ja estau familiaritzats amb les metodologies àgils, especialment l'Scrum, els conceptes del Lean Development us sonaran molt. El llibre més que donar consells de com aplicar la metodologia com una recepte, ens convida a pensar en cada un dels conceptes, en cada una de les 22 "eines per pensar" que hi ha al llibre.
El llibre m'ha agradat, potser perquè compartesc molt de la filosofia i pensament que hi ha a les seves planes, el tractar el desenvolupament com a una tasca de persones no reemplaçables, on s'ha de potenciar tant l'individu com el grup. El llibre serveix per a reflexionar, per a pensar en el que estam fent en el dia a dia, diria que el podríem classificar com un llibre d'autoajuda del desenvolupament de programari.
Fitxa tècnica:
Lean Software Development. An Agile Toolkit Mary Poppendieck i Tom Poppendieck Ed. Addison-Wesley ISBN-13: 978-0-321-15078-3
Traducciones/Translations by apertium
8 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes Gestió de projectes
Contes de fades
Escrit per Aaloy a 03 de September , 2009 a les 6:47 p.m.
M'agrada llegir llibres damunt metodologies de programació, especialment m'agraden aquells que et fan pensar, és a dir, que no et diuen fil per randa el que has de fer sinó que fan que una vegada llegits quedi un remanent de coneixement aplicable i adaptable a les situacions del dia a dia.
Tot i això sempre me quede un regustet amarg perquè moltes de les coses que s'expliquen les veig massa idealitzades. Sempre hi ha un superusuari, un p_roject owner_, els directius saben el que volen i fins i tot hi ha pressupost per al desenvolupament.
Els projectes són prou grans per poder fe iteracions d'un més o dos, hi ha equips dedicats en exclusiva al projecte, la metodologia que es proposa al llibre (aplicada amb èxit o no) s'ha explicat, s'ha entès i ha estat assumida per la direcció de l'empresa.
El client entén perfectament què és una iteració i el perquè un pressupost tancat no és el més adequat, que les estimacions són sols referències i que podrà veure el progrés del programa sense cap problema.
El client accepta de bon grau les reunions periòdiques, testeja el programa i fa les correccions adients per tenir el que vol, òbviament mai s'entra en coses tan poc agradables com discutir qui es fa càrrec dels canvis...
Potser els països anglosaxons (la majoria d'autors que llegeixo són d'allà) ho tenen millor assumit, o les companyies són més grans i tenen menys por a invertir en desenvolupaments trencadors. Vet a saber, però ara per ara per mi aquestes situacions s'assemblen més a un conte de fades que a una situació real.
M'agrada pensar que potser algun dia em veuré en una situació semblant a la que conten els llibres, però ara per ara, em qued sols amb les idees, que amb un poc de sort em serviran per pensar com millorar el procés de desenvolupament.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Decoradors a Python
Escrit per Aaloy a 30 de August , 2009 a les 7:22 p.m.
Què és un decorador
Un decorador és el nom d'un patró de disseny. Els decoradors alteren de manera dinàmica la funcionalitat d'una funció, mètode a classe sense tenir-ne que fer subclasses o canviar el codi font de la classe decorada. En el sentit de Python un decorador és quelcom més, inclou el patró de disseny, però van més allà, Bruce Eckel els assimila a les macros de Lisp.
Els decoradors i la seva manera d'utilitzar-se ens ajuden a fer el nostre codi més net, a autodocumentar-lo i a diferència d'altres llenguatges de programació no requereixen que ens aprenguem un altre llenguatge de programació (com passa amb les anotacions de Java per exemple). En la seva utilització podem atracar-nos a la programació orientada a aspectes (AOP) o utilitzar-los per a afegir sistemes de control a les nostres funcions, de log, caché, ... Les possibilitats són infinites. El decoradors formen part de Python des de la versió 2.4 i com diu Michele Simionato ens aporten el següent:
- Redueixen el codi comú i repetitiu (l'anomenat codi boilerplate).
- Afavoreixen la separació de responsabilitats del codi
- Augmenten la legibilitat i la mantenibilitat
- Els decorador són explícits.
Aquesta potència té un preu: en rendiment (que s'haurà d'avaluar per a cada aplicació) i en complexitat a l'hora de desenvolupar-los. Un decorador típic veurem que és molt bo d'escriure, però la cosa es complica un poc quan volem passar paràmetres o mantenir la signatura del mètode. Aquesta complexitat no és tant pel codi que s'ha d'escriure sinó perquè hem de recordar com s'ha d'escriure el decorador per a cada cas.
Afortunadament veurem que gent com Michele Simionato han desenvolupat paquets que ens simplifiquen molt la vida. Tot i això i abans de fer servir aquestes utilitats convé saber què són i desenvolupar-los sense ajuda. És un poc com aprendre's les taules de multiplicar i després ja utilitzar la calculadora.
Classificació dels decoradors
Podem dividir els decoradors en grups:
- Segons els paràmetres que admeten:
- No admeten paràmetres
- Sí admeten paràmetres
- Segons si preserven la signatura del mètode al que decoren:
- Decoradors no que preserven la signatura
- Decoradors que si la preserven
Els decoradors més senzill són aquells que no admeten paràmetres i no preserven la signatura
Un decorador que no fa res
Per començar crearem un decorador que el que farà es convertir qualsevol funció en un /dev/null, és a dir, no retornarà res i no farà res amb la funció.
1 2 3 4 5 6 7 8 | def forat_negre(f): def none(): pass return none @forat_negre def di_hola(): return "hola" |
Si executam di_hola() no tendrem cap resultat, millor dit tindrem None
La sintaxi @ del decorador de Python és el que s'anomena syntactic sugar, és a dir, una manera d'escriure les coses que ens simplifica la legibilitat, però fet i fet es podria escriure perfectament com
1 2 | di_hola = forat_negre(di_hola) di_hola() |
i tendríem el mateix que fa el decorador. Recordem que les funcions són objectes i que es poden assignar i passar com a paràmetres a Python.
Tot i la senzillesa de l'exemple ens serveix per veure el següent:
Un decorador no és més que un envolcall cap a una funció i per tant ha de retornar una funció, més concretament un callable, per a entendre'ns, qualsevol cosa que posant-hi un doble parèntesi al costat () no peti.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def retorna_objecte(f): ....: def obj(): ....: return object() ....: return obj ....: In [17]: def di_hola(): ....: return "Hola" ....: In [18]: di_hola = retorna_objecte(di_hola) In [19]: di_hola() Out[19]: <object object at 0xf7f745e8> |
Al nostre decorador forat_negre li hem passat una funcició sense paràmetres, però si li passam paràmetres ens trobarem una sorpreseta
1 2 3 4 5 6 7 8 | @forat_negre def suma(a,b): return a,b suma(2,3) TypeError Traceback (most recent call last) TypeError: none() takes no arguments (2 given) |
que per una altra banda és del tot normal, hem definit el forat_negre de tal manera que retorna una funció sense paràmetres, així que si li intentam passar els paràmetres que tenia la funció decorada senzillament es queixa i peta.
Anem a definir un poc millor el nostre decorador per a que no ens passi així i poder admetre el mateixos paràmetres que la funció decorada
1 2 3 4 5 6 7 8 9 10 11 12 | def forat_negre(f): "d'aquí no surt res" def none(*args, **kw_args): pass return none @forat_negre def suma(a,b): "suma dos parametres qualsevols si pot" return a+b suma(2,2) |
Ara ja no dona error. Així doncs una altra conclusió: a més de tornar una funció, hem de procurar que la definició de las funció que tornam admeti al manco els mateix nombre de paràmetres que la funció que volem decorar. Si no sabem quants són aquests ens curam en salut amb args i kw_args.
Fixem-nos que no hem mantingut la signatura de la funció i com a experiment intentau fer un help(suma). Tornarem damunt això un poc més endavant. Ara per ara ja sabem com crear decoradors simples a partir d'una funció.
Fent decoradors no intrusius
Si heu fet un help(suma) o un suma.__name__ potser un haureu sorprés en veure que le nom de la funció és none en lloc de l'esperada suma. Si pensau amb el que hem fet tampoc és d'extranyar, fet i fet hem substituït la funció original per
una altra, recordem que el decorador f aplicat damunt la funció g és equivalent a fer g = f(g).
El que és aconsellable és que el decorador sigui capaç de mantenir la documentació i el nom de la funció que decora, ja que d'aquesta manera es simplifica l'ús de la funció i els autocompletadors de codi no es tornen bojos.
Això ho podem fer de dues maneres: la llarga i la curta
La manera llarga
1 2 3 4 5 6 7 | def forat_negre(f): def none(*args, **kw_args): pass none.__doc__= f.__doc__ none.__dict__= f.__dict__ none.__name__= f.__name__ return none |
Amb les tres instruccions adicionals que hem posat tornar a recuperar les metadades de la funció original que passam al decorador. Si hara feim un help veurem que es fa damunt el nom de la funció correcta suma i que l'ajuda també és la seva.
Help on function suma in module __main__:
suma(*args, **kw_args)
Suma dos parametres qualsevols si pot
Fixem-nos en la signatura de la funció no s'ha preservar. Abans admetia dos paràmetres i ara n'admet un nombre qualsevol. Per la majoria de casos això no té més importància, però al final de l'article veurem com es pot resoldre.
La manera curta
Com que el tema de reservar les metadades és força interessant i comú, al mòdul functools hi trobam la funció wraps que és en sí mateixa un decorador i que fa aquesta funció. D'aquesta manera el codi anterior quedaria:
1 2 3 4 5 6 7 | from functools import wraps def forat_negre(f): @wraps(f) def none(*args, **kw_args): pass return none |
Fixau-vos que hem fet servir un decorador per crear un altre decorador. Insistirem en aquest tema més tard.
Un decorador amb arguments
El decorador que hem fet a l'apartat anterior era prou simple, feia ben poca cosa i no tenia paràmetres. Si volem fer decoradors hem de fer primer de tot que siguin útils, i també ens trobarem amb la necessitat de que aquests decoradors admetin paràmetres.
A Django, per exemple, podeu trobar que el decorador de cache admet paràmetres que ens permet dir-li durant quan de temps ha de cachejar els resultats, o el decorador vary_on_headers, que ens permet modificar el contingut de la resposta de les vistes afegint les capçaleres que indiquem.
Anem a veure com ho podem aconseguir nosaltres. També hi ha dues maneres de fer-ho, la clara i la complexa. La manera clara és la que recoman i utilitza una classe per a fer el decorador, la complexa requereix més esforça per a entendre què està fent el decorador, és més curta, però personalment preferesc un codi més legible.
De la mateixa manera els decoradors que hem fet com a funcions es poden crear com a classes, però en aquest cas, crec que la definició en forma de funcions és més bona de seguir, i ens permetrà distingir clarament entre els dos tipus de decoradors: el que no admeten paràmetres que es construeixen preferentment mitjançant funcions i els que admeten paràmetres, que es construeixen preferentment fent servir classes.
Per seguir amb el forat negre, ara el nostre exemple el que farà es mostrar el resultat o no segons li roti. Per això el que farem serà passar-li una funció com a paràmetre que en ser executada determinarà si s'ha de mostrar el resultat de la funció decorada o no
El mètode clar de fer decoradors amb arguments
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/usr/bin/env python # -*- coding: UTF-8 -*- import random class forat_negre_sonat(object): "Un decorador amb fam" def __init__(self, mostrar): self.mostrar = mostrar def __call__(self, f): def none(*args, **kw_args): if self.mostrar(): return f(*args, **kw_args) else: return "Nop" return none @forat_negre_sonat(mostrar = lambda :random.choice((True, False))) def suma(a, b): "Suma dos elements que li passam com a paràmetre" return a+b if __name__=="__main__": print suma(2,3) print suma(5,6) print suma(9,5) |
Fitxem-nos amb que hem fet:
-
Hem creat una classe Python que al seu constructor (l'init) agafa el paràmetre o paràmetres que vulguem. És un constructor normal, així que admet paràmetres per defecte per exemple.
-
Recordem que el decorador hem dit que ha de ser un objecte cridable (callable), a una classe, la cridabilitat la dóna el mètode call. Aquesta classe la definirem de manera que agafi la funció a decorar com a paràmetre. D'aquesta manera tenim accés tant als paràmetres del decorador, que hem passat al constructor, com a la funció decorada, que hem passat com a paràmetre al call.
Després d'això ja sols en queda encapsular la cridada com ho fèiem al cas anterior, retornant el decorador en lloc de la funció decorada.
A l'exemple el que he fet és mostrar que el paràmetre pot ser el que nosaltres vulguem, en concret he passat una funció anònima, creada amb lambda que és la que s'encarrega d'establir l'aleatoritat del resultat.
Si voleu podem fer aquest decorador una mica més complet, fent que admeti a més de funcions valors i que preservi el nom i documentació de la funció decorada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #!/usr/bin/env python # -*- coding: UTF-8 -*- import random class forat_negre_sonat(object): "Un decorador amb fam" def __init__(self, mostrar=None): self.mostrar = mostrar def __call__(self, f): def none(*args, **kw_args): if callable(self.mostrar): opcion = self.mostrar() else: opcion = self.mostrar if opcion: return f(*args, **kw_args) else: return "Nop" none.__name__ = f.__name__ none.__doc__ = f.__doc__ return none @forat_negre_sonat(mostrar = lambda :random.choice((True, False))) def suma(a, b): "Suma dos elements que li passam com a paràmetre" return a+b @forat_negre_sonat(mostrar=True) def resta(a,b): return a-b if __name__=="__main__": print "Exemple amb %s " % suma.__name__ print suma(2,3) print suma(5,6) print suma(9,5) print "Exemple amb %s " % resta.__name__ print resta(2,3) print resta(5,6) |
El mètode enrevessat de fer decoradors amb arguments
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def forat_negre_dos(mostrar): def wrap(f): @wraps(f) def wrapped_function(*args, **kw_args): if callable(mostrar): opcion = mostrar() else: opcion = mostrar if opcion: return f(*args, **kw_args) else: return "Nop" return wrapped_function return wrap |
Bé, enrevessat, el que es diu enrevessat no ho és, per una cosa tan simple no té massa història, però fixau-vos que és un poc més mal de seguir.
El primer que hem fet és definir la nostra funció, on hi hem posat els paràmetres que admet. Aquest funció retorna una altra funció que admet un argument, que és la funció decorada, que a la seva vegada admet un nombre indeterminat d'arguments (recordem que això ho estam forçant nosaltres).
Com que la segona funció, wrapped_function està definida dins wrap, té accés al paràmetre del decorador i pot actuar en conseqüència.
Encadenant decoradors
Els decoradors es poden encadenar, és a dir, una funció pot tener tans decoradors com faci falta i necessitem, sols limitats pel nostre sentit comú i la legibilitat del programa. Dos decoradors són habituals, tres no es veuen gaire, quatre o més són per pensar-s'ho.
Per a l'exemple manllevaré un dels decoradors més útils, el memoize, que ens permet cachejar una funció segons els seus paràmetres. Al Python Decorator Library hi ha una implementació del patró memoize prou senzilla de seguir amb el que ara sabem i a més ens servirà per completar la construcció de decoradors sense paràmetres fent servir una classe.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class memoized(object): """Decorator that caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned, and not re-evaluated. """ def __init__(self, func): self.func = func self.cache = {} def __call__(self, *args): try: return self.cache[args] except KeyError: self.cache[args] = value = self.func(*args) return value except TypeError: # uncachable -- for instance, passing a list as an argument. # Better to not cache than to blow up entirely. return self.func(*args) def __repr__(self): """Return the function's docstring.""" return self.func.__doc__ |
A diferència de la construcció amb paràmetres, al constructor de la classe memoized s'hi posa com a paràmetre la funció a decorar, i al mètode call hi van els paràmetres de la funció, en lloc de la funció a decorar com es feia a l'altre mètode.
Per què s'ha fet servir aquesta manera si l'altra és més senzilla? Dons perquè necesitam mantenir en memòria la caché i el que fa és mantenir-la en un diccionari dins de la mateixa classe. Si la caché fos externa (amb memcached per exemple), això s'hauria pogut fer perfectament en forma de funció.
A més definirem un decorador que ens servirar per indicar quan entram a la funció i comprovar el decorador memoized.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def log(f): "Registra l'execució de la funció" def wrap(*args): print "Excutant %s, args: %s" % \\ (f.__name__, ",".join(str(x) for x in args)) return f(*args) return wrap @memoized @log def fibonacci(n): "Return the nth fibonacci number." if n in (0, 1): return n return fibonacci(n-1) + fibonacci(n-2) print fibonacci(12) |
Provau d'executar aquest codi amb i sense la funció memoized. Amb els dos decoradors activus veureu que el cada decorador agafa com a entrada la funció ja decorada que surt del decorador que té més avall. Així el memoized agafa com a entrada la funció fibonacci ja decorada amb el log.
Podeu fer la prova amb un exemple més simple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #!/usr/bin/env python # -*- coding: UTF-8 -*- def uppercase(f): "Dada una función f que devuelve un string lo pasa todo a mayúsculas" def wrap(): return f().upper() return wrap def make_bold(f): "Dada una función f que devuelve un string le añade los tags de bold" def wrap(): return "<strong>%s</strong>" % f() return wrap @make_bold @uppercase def say_hello(): return "Hello world" print say_hello() |
Provau canviant l'ordre dels decoradors i veureu perfectament com es van aplicant els decoradors des de la funció per amunt. A l'exemple primer es converteix el "Hello word" a majúscules i després se li apliquen els tags de negreta.
La signatura pendent
Abans d'acabar ens queda un tema pendent: la signatura. Els decoradors que hem creat poden preservar el nom i la documentació de la funció que decoren, però no preserven la signatura, és a dir, el nombre de paràmetres que li passam.
Michele Simionato ha escrit un mòdul excel·lent anomenat decorator que extén la utilizació dels decoradors, mantén la signatura de la funció, el nom i la documentació, i a més ens dona la possibilitat de crear factories de decoradors. Una eina per a tenir sempre a mà. Amb aquest mòdul podríem escriure el codi de l'exemple anterior com:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from decorator import decorator @decorator def uppercase(f, *args): "Donada una funció f que retorna un string ho passa a majúscules" return f(*args).upper() @decorator def make_bold(f, *args): "Afegeix el tag strong a la sortida de la funció" return "<strong>%s</strong>" % f(*args) @uppercase @make_bold def say_hello(nom): "Di hola, home!" return "Hello world %s" % nom if __name__=="__main__": from inspect import getargspec print say_hello('World') print say_hello.func_name print say_hello.__doc__ print getargspec(say_hello) |
Si executau el codi podem veure que no ens ha fet falta recore a wraps o a reasignar nom, la pròpia llibreria de Simionato ho ha fet. A més, si ens fixam en la sortida de l'exemple:
<STRONG>HELLO WORLD WORLD</STRONG> say_hello Di hola, home! ArgSpec(args=['nom'], varargs=None, keywords=None, defaults=None)
La primera línea correspon a la sortida de la funció que hem decorat. La segona és el nom d'aquesta funció. Ens surt el nom de la funció original i no el del decorador. La documentació també s'ha mantingut i per acabar, podem veure que la signatura de la funció és correcta, ens diu que té un argument obligatori anomenat nom.
Conclusió
Esper haver deixat un poc més clar el tema dels decoradors. Crear-los no és difícil, utilitzar-los és simple, sols hem de tenir clar què són i quan fer-los servir. Són una eina potent que ens permet fer el nostre codi més legible i cohesionat. Fora por i a disfrutar amb els decoradors.
Com tot en aquesta vida, usau-los amb coneixement i moderació.
Referències
Per escriure aquest article m'he basat en múltiples fonts, les més importants i útils han estat:
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Qooxdoo
Escrit per Aaloy a 20 de August , 2009 a les 10:31 p.m.
Qooxdoo és un bastiment per a la creació d'aplicacion web amb aparença d'escriptori, és a dir el que es coneix com a RIA (Rich Internet Applicatinons).
Aquests darrers dies he estat donant-li una ullada a aquest bastiment. Feia temps que li estava seguint la pista i finalment m'he decidit a avaluar-lo com toca, és adir, començant a fer-hi alguna cosa productiva.
Quan un va a la web de Qooxdoo el primer que pot reparar és que el bastiment compta amb un bon conjunt d'exemples que ens permeten veure les possibilitats del producte. L'aparença de Qooxdoo no és tan cuidada com la d'Extjs per exemple, però en el seu conjunt presenta tota les funcionalitats necessàries.
A l'hora d'avaluar el bastiment m'he fixat en dos punts que per mi són claus: la mantenibiliat de les aplicacions i les seves capacitats de connexió amb altres sistemes.
Donat que el cicle de vida de les aplicacions és molt més llarg que el temps de desenvolupament, tenir un bastiment que ens permeti crear aplicacions mantenibles és fonamental. El bastiment ens ha de permetre estructurar l'aplicació en mòduls i a més ens ha d'abstreure de les complexitats del javascript en el que fa a les colisions de noms.
Qooxdoo resol aquest tema molt bé. No és tan sols un bastiment gràfic, sinó que ha creat un vertader llenguatge orientat a objectes amb les possibilitats bàsiques que ens dóna el javascript. La gent que ve de Java es sentirà com a casa amb aquest model d'objectes: ens permet tenir variables i mètodes estàtics, crear fàcilment mètodes, parla de constructors, d'herència i fins i tot hi ha alguan cosa semblant als interfícies. Aquest model de programació es pot aplicar per modularitzar el codi, de manera que podem crear objectes que representin una finestra amb el seu contingut o bé fer un objecte per a representar un aspecte concret: un menú per exemple.
A l'hora de posar el sistema en producció Qooxdoo se n'encarrega d'esbrinar quins són els mòduls que es fan servir i empaquetar i comprimir els distints mòduls que hem creat en un únic arxiu (més de 500 K a les meves proves). Com es pot veure està força ben pensat, i és una de les coses que més m'han agradat, ja que amb una aplicació gran és molt fàcil perdre la pista del que es fa i acabar amb mega-arxius javascript que tenen un poc de tot. Qooxdoo ens ajuda a estructurar el nostre codi sense perder l'avantatge de poder fer el desplegament a producció amb un únic arxiu javascript.
La connexió amb altres sistemes també em feia passar un poc de pena. Hem connectat bastiments javascript fent servir json, xml i cridades ajax i quan més complexe és el bastiment més dificultats hi ha amb el json, ja que sempre ho esperen d'una determinada manera.
Qooxdoo permet connectar-se mitjançant Ajax i fent servir Json RPC. He creat una sèrie de serveis jrpc de prova amb Django i he mirat de connectar-los. M'ha costat una mica ja que no comptava amb el problema de la seguretat del javascript a IE i Firefox. No es permeten cridades a dominis diferents (crossdomain), però tampoc a ports diferents. Com que Django a desenvolupament ho tenia a localhost:8000 i el javascript ho tenia com a file:// no hi havia manera de fer la connexió per POST. La solució ha esta utilitzar nginx per a servir el javascript i a més per servir de proxy invers cap a Django, amb això ja he pogut fer la connexió sense problemes i tenir el millor dels dos mons, independitzant la capa de presentació de la capa del web service, creat amb el servidor Django i amb capacitat d'autodocumentació, de manera que el servidor Django és capaç de generar una plana on es publiquen els mètodes del json rpc i una petita utilitat per comprovar-ne el funcionament. Semblant al WSDL però millor i tot.
Encara és prest per saber si Qooxdoo complirà totes les espectatives que hi tenc. Falta comprovar com es porta amb widgets complexos: taules, llistes, mescla de contingut web html amb el javascript generat i veure com es pot tractar l'autenticació i la seguretat. Per ara pareix que generar interfícies d'usuari potents és prou senzill i que la comunicació amb altres sistemes és possible, i ara per ara li veig moltes més possibilitat que opcions com Dojo i Extjs, sobretot perquè li veig una filossofia que m'agrada: la de tenir un sistema pensat per al desenvolupador i per al qui ha de mantenir l'aplicació.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django qooxdoo
Dell Latitude 2100, recapitulació
Escrit per Aaloy a 17 de August , 2009 a les 4:52 p.m.
Un comentari de Paco me dóna peu a fer una recapitulació damunt el portàtil. Per cert, he deixat unes quantes fotos de família al Flickr.
El portàtil resulta molt còmode a l'hora de moure'l d'una banda a l'altra. En aquests quinze dies i escacs que duc amb ell he de dir que és nota molt la diferència entre dur aquesta jugueta i el portàtil de 15,4 polzades. La meva esquena ho agraeix, i més si he de caminar una bona estona.
La durada de la bateria, 5 hores, és un poc curta per el que se suposa que hauria de durar una bateria de 6 cel·les, però en el seu favor he de dir que són 5 hores reals, és a dir, fent feina.
El teclat és molt còmode. A l'igual que en a l'altra portàtil m'agradaria poder tenir un botonet per desactivar el touchpad, ja que mentre escrius és molt senzill tocar-lo sense voler i dur el cursor a qualsevol banda.
L'IDE que faig servir per programar actualment és el Netbeans. El Dell 2100 amb 2 GB de RAM no té cap problema per moure'l i va força fluid. La cosa canvia un poc en posar-li un monitor extern. Us explic: aquest portàtil ho faig servir també per programar i ho tenc amb una configuració de monitor dual, és a dir, tenc un escriptori virtual consistent en la pantalla del portàtil (1024x576) i un monitor Dell de (1680x1050). La tarja gràfic mou bé el conjunt, però els scrolls verticals se noten, no són fluids. No és el suficientment greu com per no deixar-te fer feina, però sí una mica empipador. Aquest efecte és nota bastant al Netbeans i un poc al Firefox. És l'emperò més gran que li he trobat per ara...
L'altra cosa a notar és el carregador. És petit si ho comparam amb els carregadors estàndard de Dell, però encara és gran. En el seu favor dir que és compatible amb els carregadors dels seus germans grans i per mi això s'ha convertit en un avantatge, ja que amb el Dell de 15,4" vaig comprar dos carregadors: un per la docking i un per transportar, així puc jugar amb aquest fet i tenir un carregador a cada lloc de feina.
El disc d'estat sòlid es porta mol bé. És ràpid i tot el sistema tan just fa renou. De tant en tant es posa en marxa un ventilador, però ni ho sents. De totes maneres trob que s'encalenteix més del que esperava i potser això explica la "poca" durada de la bateria.
La visibilitat de la pantalla és molt bona. Pràcticament no hi ha reflexos, encara que no he arribat a aprofitar-ne les possibilitat que té el que sigui una pantalla tàctil. Deu ser un trauma infantil, ma mare me deia que és de mala educació assenyalar amb el dit. :)
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Tal dia com avui
Escrit per Aaloy a 12 de August , 2009 a les 9:23 p.m.
però fa catorze anys (14) em casava amb Na Catalina. En aquestes hores arribàvem al restaurant de Pollença després de la sessió fotogràfica de rigor.
El menuts no es creuen que feim festa. No en feim, però tants d'anys ja són un motiu de celebració.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: General
La Ruta del éxito de Luis Miravitlles
Escrit per Aaloy a 11 de August , 2009 a les 8:22 p.m.
L'altra dia em deixaren "La Ruta del éxito. MRW Claves de un modelo de gestión innovador" i avui he dedicat una estoneta a llegir-ho.
El llibre és un elogi d'MRW, del seu model d'empresa i de com va passar de una empresa de missatgeria local amb pèrdues a l'empresa que coneixem avui. És un enaltiment de la figura del seu màxim impulsor, Francisco Martín Frias.
A llarg de poc menys de 150 planes, Luis Miravitlles ens conta la història de MRW, la seva obsessió per la qualitat i el tracte al client, el seu compromís amb la gent i de com es va refundar com a franquícia en un moment en que aquest concepte pràcticament no era conegut a espanya. És interessant veure com MRW ha compaginat les tasques de marketing amb la part social de l'empresa, la qual cosa demostra que el benefici empresarial no té perquè anar en contra del benefici social. Si hi ha imaginació i ganes les dues coses es complementen.
El llibre presenta a cops un estil narratiu, d'anecdotari i a altres un estil més formal, amb xifres i documents. L'autor ja n'avisa d'això i com els capítols es poden llegir de manera independent tampoc xoca massa.
No conec MRW per dintre i no puc dir-vos que el que es diu al llibre sigui veritat o no, però sincerament m'agradaria que fos així. És que es compta al llibre és del tipus d'organitzacions que m'agraden, orientades a la feina, amb gent motivada i on hi ha la suficient cultura empresarial per permetre les millores i reconèixer els seus impulsors. Al manco això és el que ens mostra el llibre. Potser sigui una faula, però ja us dic que és del tipus d'històries que m'agraden, segurament perquè un dels meus somnis és poder arribar a fer quelcom semblant a MRW però a l'àmbit del desenvolupament web.
Sigui com sigui el llibre és inspirador, de lectura fàcil (poc menys d'hora i mitja) i adequant per passar una estona llegint i que se't quedi un bon sabor de boca. Pel títol que té segurament no el compraria, però si teniu l'ocasió de fer-li una ullada, hi ha coses pitjors per passar l'estona.
Fitxa tècnica:
La Ruta del éxito MRW Claves de un modelo de gestión innovador Luis Miravitlles Editorial Gestión 2000 ISBN 84-8088-623-4
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
La empresa en la web 2.0 de Javier Celaya
Escrit per Aaloy a 09 de August , 2009 a les 11:59 a.m.
Ahir vaig acabar de llegir "La empesa en la Web 2.0" de Javier Celaya. El libre té una estructura i un contigut que recorda els apunts d'un blog. De fet Celaya recorda en el llibre que alguns dels apunts han estat publicat en el seu blog i adjunta alguns comentaris.T enc el llibre en paper, existeix una edició de descàrrega lliure per mòbils, però la veritat és que està força amagada.
Al llarg de 279 planes Celaya intenta explicar des de la òptica empresarial que és això de la web 2.0 i quin impacte pot tenir en les empreses. Tracta temes com la importància de les xarxes socials, el blogging, microblogging i wikis, donant apunts sobre quina ha de ser la posició de les empreses davant aquestes xarxes i com es poden anar introduïnt aspectes de la web 2.0 dins les organitzacios per tal de millorar-ne la gestió.
El llibre m'ha agradat, sobretot perquè compartesc gairebé al 100% les apreciacions de Celaya, i perquè he trobat en el llibre allò que cercava: com explicar en paraules planeres i orientades a gent amb perfil empresarial l'impacte de les noves tecnologies web en les empreses.
No m'ha agradat tant l'extensió del llibre. Crec que hi ha força palla i que ben bé podria ser un llibre de 150 planes. De tant en tant es posa a escriure noms i característiques de llocs web sense entrar-hi a fons i et dona la sensació de que estan allà per omplir.
Com dic el llibre és interessant, no perquè expliqui coses que desconec sinó per la manera d'explicar-les. La relació preu/contingut, però l'he trobada força alta, després d'haver llegit el llibre 20 Eur em pareix car.
Xerrar per exemple amb Benjamí o Ricardo, o amb "els tertulians de la torrada" crec que en temes de web 2.0 aporta tant o més que el llibre. Celaya, però, ho explica orientat al món empresarial i això se li ha de reconèixer.
Fitxa tècnica:
La empresa en la web 2.0 Javier Celaya Ed. Gestión 2000 ISBN: 978-84-9875-008-9
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
Llegint codi
Escrit per Aaloy a 06 de August , 2009 a les 8:15 p.m.
Llegir codi és una de les millors maneres que hi ha d'aprendre a programar. Veus com la gent fa certes coses i pots començar per copiar-les per passar a demanar-te per què es fa d'aquella manera i finalment mirar de millorar-ho.
M'agrada llegir codi, però també es veritat que quan he de llegir codi que he comanat per un projecte i veig segons quines coses em pos un poc de mala llet, no és res personal, crec que és un defecte del meu caràcter, d'aquest xic de perfeccionisme que tots duim a dintre.
Primer de tot s'ha de tenir en compte que escriure codi és molt personal, no hi ha una manera única de fer una mateixa cosa i els codi es converteix en una extensió de la personalitat de l'autor i de la seva manera de fer les coses.
Per això convé sempre ser caut a l'hora de valorar el codi d'altres. Sempre hi ha una manera millor de fer-ho, sempre hi ha una altra manera de fer-ho, la nostra manera.
Pel que es veu afectat per la revisió, les coses no són menys fàcils, sovint pareix que el codi és com un fill nostre, i que una vegada escrit, com nin malcriat, se li han de perdonar tots els defectes.
Personalment quan veig alguna cosa que no m'agrada ho dic. Al llarg del temps he desenvolupat una certa habilitat per veure quan un codi fa mala olor, i segons el que he dormit el dia anterior puc ser més o menys políticament correcte.
De tipus d'errors n'hi ha molts, i jo en tenc la meva classificació particular (ja sabeu, el món es divideix en dos tipus de persones, aquells que fan llistes i els que no).
-
Errors puntuals. Són la típica cagada que li ha passat a tothom. Qui digui que a ell no li ha passat és perquè no ha programat prou. Són errors que poden ser greus en termes de les conseqüències, però que s'han de prendre com això, com part de la feina. Són errors per aprendre a no tornar-los fer.
-
Errors de "però mira que guai que sóc". Sovint no són errors, sinó trossos de codi dels quals el creador se'n va sentir molt orgullós però que són mals de depurar i que es poden reescriure fàcilment per fer el mateix de manera més clara i amb menys línies de codi. Potser el programa funciona, però no és correcte, li falta qualitat i a la llarga representa un problema en el mateniment correctiu i evolutiu. Sovint aquest tipus d'error està molt relacionat en el concepte de reinventar la roda i amb el síndrome NIH (Not Invented Here). S'han de corregir tot d'una que es presenten i mirar de conscienciar a la gent per a que no es repetesquin.
-
Errors de seguiment dels estàndards de codificació. No tenen excessiva importància, però dificulten la lectura del codi i l'evolució del programari. Els estàndards de codificació i localització del codi serveixen per a que qualsevol persona que no està familiaritzada amb el codi, pugui llegir-ho sense dificutat i saber on ha d'anar a trobar les coses. Particularment me resulta molt més fàcil llegir un codi amb noms de variables ben posats, amb els comentaris allà o toca. Llegir codi requereix molt atenció i esforç i tenir que bregar a més amb distintes maneres de codificar no ho fa més fàcil.
-
Errors d'arquitectura: Cohesió i acoblament. Cohesió bona, acoblament innecessari dolent. I m'estic referint a l'acoblament de codi, a casa que cada un faci el que pugui. Tenir tot el relacionat a un mateix lloc (llibreria, paquet, arxiu, ...) i no separat en mil i un trocets que fan mil i una coses sols per peresa de no crear un nou arxiu o estructurar el programa, d'això se'n diu cohesió. L'acoblament és la dependència que hi ha entre mòduls distints i que fa que sovint aquests no es puguin reutilitzar de manera independent. L'acoblament és necessari per a construir programes, però ha de tenir un perquè. Cohesió i acoblament són conceptes que van molt lligats i codi amb poca cohesió sols presentar molt acoblament.
-
Errors de concepte. Són els errors que es cometen perquè un no s'ha aturat a pensar en el que està fent i bé per desídia o bé per malentesos crea codi que no té sentit. És el típic error de permetre fer reserves per dies passats i coses semblants. Són errors que em preocupen, perquè vol dir que s'està programant sense reflexionar i això és molt perillós. La programació no és sols picar codi, és picar codi amb una finalitat i aquesta no sols ha de ser la de cobrar a final de mes, sinó que ha de servir al nostre client. Quan són errors per desconeixement del negoci s'ha d'insistir en que se demani tot el que no es coneix, quan són errors per no pensar en el que se està fent convé insistir en conscienciar a la gent del tipus de feina que fa.
-
Errors de code monkey. Errors de copiar i aferrar, funcioni el codi o no. S'ha copiat cinquanta vegades el mateix sense aturar-se a pensar si convendria fer-ho d'una altra manera. Són errors que al igual que l'anterior m'empipen especialment, ja que per defecte vull pensar que la gent fe la seva feina el millor que sap. Em preocupen perquè sovint vol dir que s'ha escrit el codi a tot màquina per cobrir l'expedient i que les hores s'han dedicat a altres coses. Estirada d'orelles.
No passa res per cometre errors, el que no és admissible es no aprendre dels errors, o preferir reinventar la roda per no aturar-se a pensar en maneres alternatives. Quan el problema es molt bàsic hem de pensar que l'error sols estar en la nostra banda, que la funcionalitat existeix però no l'hem vista i hem de llegir més. L'alternativa: codificar-ho nosaltres mateixos, o començar a pensar que l'error és de la pila TCP del nostre ordinador i posar-se a davallar-se el codi per anar a fer la depuració no és la primera opció que un ha de pensar. Primer s'han de provar les coses més habituals, ja que el el 99,9% de casos l'error serà nostre, del nostre codi.
Llegir el codi, el nostre i els d'altres, ens ajuda a reflexionar sobre allò que podem millorar i a evitar els errors més comuns. Recordem que com a programadors no escrivim codi per a ser executats per les màquines, sinó per a ser llegits per altres persones.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
El economista naturalista
Escrit per Aaloy a 02 de August , 2009 a les 11:15 a.m.
El economista naturalista és un llibre d'iniciació a l'economia de la vida diària. Mitjançant exemples va explicant situacions que ens podem trobar a la vida diària i donant-ne una explicació des del punt de vist econòmic.
L'autor, Robert Frank, ha seleccionat un conjunt de preguntes fetes per estudiants i aprofita les seves respostes per anar introduint conceptes econòmics destacant:
- El cost d'oportunitat
- La relació cost-benefici
- Els costs marginals
- Les barreres per a la segmentació de preus mitjançant els descomptes
- Els mercats perfectes
- La relació entre bens comuns i bens individuals
- La idea de que no hi ha "doblers gratis"
- La relació entre benefici individual i col·lectiu
És un llibre força entretingut, 275 planes d'exemples que van explicant distintes situacions (algunes molt americanes) d'una manera clara. Això no vol dir que les explicacions siguin una veritat absoluta, sinó que hi ha una explicació econòmica per dita situació i que si més no serveix per il·lustrar conceptes econòmics d'interès.
El llibre m'ha agradat força, però no tant com "El economista camuflado", potser no tan lleuger de llegir, però que aprofundeix molt més en cada exemple.
Un llibre molt recomanable pels qui els agrada entendre un poc més el món que els envolta.
Fitxa tècnica Titol: El Economista Naturalista Autor: Robert Frank Editorial: Península ISBN: 978-84-8307-826-6
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Dell Latitude 2100
Escrit per Aaloy a 31 de July , 2009 a les 12:19 a.m.
Ha costat, però finalment fa dos dies vaig rebre el portàtil i el ratolí que faltava. Ara sols falta la borsa :) Avui m'he dedicat a configurar-ho un poc i dur un poc més al límit les possibilitats del sistema.
El portàtil és un Latitude 2100 amb 2 Gb de RAM, 16 Gb de disc dur d'estat sòlid, càmera de 1,3 Mp i pantalla tàctil. La pantalla és de 10 polzades amb una resolució de 1024x576 px.
El portàtil és dens, vull dir, que el pes es deixa notar en un volum tant reduït, i el que sobta més és el tamany de la bateria. El vaig demanar de 6 cel·les i sobresurt molt. Els dissenyadors de Dell han tingut l'encert, al manco, d'aprofitar aquest fet per a fer-ho servir de soport i dinar-li al ordinador una inclinació molt bona per escriure. Potser amb la bateria estàndard, de 3 cel·les, l'estètica del portàtil serà millor, però particularment el que m'interessa és tenir molta autonomia més que tenir una portàtil cool. Per ara ja duc 4 hores fent coses, connectat a Internet, fent servir la càmera, configurant, etc i segons el sistema encara en tendria per 1 h i 25 minuts més.
El teclat permet escriure amb comoditat. Recorda al teclat del Dell de 12" i és molt còmode. El touchpad està molt pròxim al teclat i no és desactivable i fa que es tengui que anar un poc més alerta de l'habitual a l'hora d'escriure per tal de no tocar-lo i situar el cursor a un lloc on no voldries.
El portàtil ve de sèrie amb Ubuntu 9.04, al manco l'espera ha significat que no he tingut que actualitzar massa el sistema, ja que el portàtil anterior duia una Ubuntu 8.x. Una i de les coses que provat és la connexió 3G de Vodafone. Una meravella, ha estat posar el modem i m'ho ha detectat, he posat el PIN i ja està, connexió establereta. La velocitat no l'he poguda comprovar, Binissalem pel que es veu encara està fora de l'autopista 3G :(
Una de les coses que més em disgusta de Gnome és el desaprofitament de l'espai que fa. Amb pantalles grans això no és un gran problema, pero quan sols hi ha 576 px s'han de treure pixels d'allà on no n'hi ha. Per això he instal·lat un nou tema Gtk que no desaprofita tant d'espai vertical anomenat Human Compact i he fet quelcom semblant amb el Firefox.
El resultat és que menús que no hi cabien a la pantall ara queden més o manca per la mitat o un poc més. Visualment és un poc menys atractiu, però és molt més pràctic a l'hora de fer feina.
Poca cosa més dir d'aquest portàtil. L'estètica es sòbria i funcional, recorda als IBMs de fa uns anys, i tot ha funcionat a la primera, la única modificació real ha estat la de la distribució del teclat que m'ha obligat a eliminar l'idioma americà per posar-hi l'espanyol.
Aquest apunt està escrit des del portàtil amb gedit i pujat amb el Firefox. Com podeu veure el tamany del teclat per permetre'm escriure en mode verbose :-P
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Linux
Django 1.1
Escrit per Aaloy a 29 de July , 2009 a les 8:35 p.m.
Des de fa poquetes hores ja tenim la versió 1.1 de Django. Les novetats es poden trobar a l'anunci oficial de Django 1.1.
Per mi el més interessant són els canvis a l'ORM (les agregacions són una característica llargament esperada) i les millores a l'Admin, que es pot personalitzar sense fer tant esforç com abans.
Enhorabona als "core developers" i a tots els que feim feina amb Django. Tenim cada dia un bastiment més productiu i potent, on tot el que s'afegeix no és per mor del marketing o perquè fa "cool", sinó perquè realment serveix per a la feina.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django
Actualitzar svn
Escrit per Aaloy a 18 de July , 2009 a les 11:45 a.m.
Cada vegada que surt una nova versió d'Eclipse s'actualitza la llibreria javahl que és la que se n'encarrega de la interfície de subversion.
Això no seria cap problema si no fos que com que el client java té una versió més actualitzada que el client per línia de comandes, amb la qual cosa una vegada actualitzat un projecte fent servir Eclipse deixa de poder actualitzar-se per línia de comandes.
Això es pot sol·lucionar tornant a baixar la versió del repositori local, però tornarem a tenir el mateix problema quan tornem a actualitzar.
L'altra sol·lució és actualizar el client subversion del nostre equip. El procés és molt senzill i està força ben explicat al blog An Extraordianry Bison, tanmateix pos aquí els passos més importants:
-
Actualitzar les dependències del nostre sistema per a poder compilar subversion:
sudo apt-get install build-essential libapr1-dev libaprutil1-dev libneon27-dev
-
Descarregam el codi font del subversion. La darrera versió actual és la 1.6.3, així que:
cd /tmp wget http://subversion.tigris.org/downloads/subversion-1.6.3.tar.bz2 tar xjf subversion-1.6.3.tar.bz2 cd subversion-1.6.3
-
Ara ens queda el cicle de configure, make, make install típic. Com que el que volem és tenir sopurt per ssl i per JavaHL farem
./configure --with-ssl --enable-javahl --with-jdk=/usr/lib/jvm/java-6-sun make -j3 make -j3 javahl
Un parell de notes: el j3 sols és convenient (que no necessari) si teniu una màquina amb més d'un processador (de doble nucli), li podeur donar el valor del nombre de nuclis més un, en cas contrari make gestionarà per si mateix el nombre de traballs simultànis que llança. En el meu cas, al manco, és més òptim "limitar-ho" així.
-
Feim la instal·lació:
sudo make install install-javahl
Amb un poc de sort amb això ja tedrem actualitzat el client de svn a la darrera versió i ens tornarà a funcionar el client de línia de comandes.
Personalment ho he provat a Ubuntu 9.1 amb arquitectura PPC64 i amb arquitectura i386 i cap problema. Funciona tant l'Eclipse com el client de línia de comandes. El Netbeans es segueix queixant de que no troba la llibreria javaNL però ja caurà, ja ...
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Escalabilitat, multiprocessador i GIL
Escrit per Aaloy a 16 de July , 2009 a les 8:34 p.m.
Una de les dèries que tenim com a informàtics (o que hauríem de tenir) és la d'aprofitar el millor possible els recursos que tenim a la nostra disposició.
Això es tradueix algunes vegades en discussions de que si un llenguatge és millor que un altre en l'aprofitament de la màquina, i quan toca a Python, el tema estrella és el GIL, el mecanisme intern que fa servir Python per poder ser multi-fil. GIL fa que les aplicacions que fan un us intensiu dels fils no siguin tan òptimes com podrien ser (potser sí són més segures i més bones de programar, però això és una altra història) i que puguem pensar no facin tan bon us dels múltiples processadors com es podria suposar. En aquests casos el millor potser és llegir un article molt aclaridor, en lloc de començar a pegar destralades.
Tot i això, pareix que hi ha una confusió entre el que representa l'escalabilitat d'una aplicació i el nombre de processadors d'una màquina. En principi pareix el mateix, però realment no ho és.
La vertadera escalabilitat no la dóna el fet de que l'aplicació aprofiti al 100% els 4 o 8 processadors que pugui tenir el nostre servidor, l'escalabilitat la tenim quan aquesta mateixa aplicació pot executar-se damunt 8 màquines amb els processadors que tenguin. És a dir, que davant un problema que necessiti més potència de màquina, la solució no sigui posar una màquina amb més processadors, sinó posar més màquines.
Aqui ja no parlar d'aplicacions que executin fils, parlam d'aplicacions que executen processos, de comunicacions entre processos, de particionat de la nostra aplicació de manera que pugui distribuir-se.
Una de les maneres més senzilles que he trobat d'obtenir això és mitjançant els sistemes de missatgeria i de les coes de feina. En aquest cas tenim un o varis servidors que actuen de gestors de les coes de feina i una sèrie de processos que envien tasques a la cua per a ser realitzades, processos que realitzen les tasques i processos que consumeixen els resultats. El GIL no és un problema, el problema és pensar en com s'ha de fer l'aplicació, en com distribuir les càrregues entre els servidors, en definitiva, el problema és d'enginyeria de programari pur i dur. Passam de pensar en dues dimensions a pensar en n-dimensions.
Si hi ha una cosa que té bona Python és la poca distància que hi ha entre voler fer una cosa i tenir la capacitat de fer-la. Així doncs fer programes que facin servir les cues és realment trivial: posam un servidor, el beanstalkc per exemple, les llibreries Python que facin de client i ja ho tenim llest. Separar l'aplicació real per a que vagi en capes i establir un sistema integrat de control, això ja és una altra cosa :)
Quan parlam d'aplicacions web un sistema de coes a més pot fer-se servir per a augmentar l'escalabilitat de la nostra aplicació i donar un millor temps de resposta als nostres usuaris.
Imaginem per exemple una situació típica: la nostra web (feta amb Django, per suposat) quan acaba el procés de compra envia un e-mail a l'usuari amb la factura del que acaba de comprar.
Si no ens hem complicat la vida, tendrem que dins la mateixa vista que guarda les dades de la compra hem posat una cridada a la funció que genera el pdf amb la factura i la cridada a la funció que l'envia.
Encara que la factura es generi força ràpid, generar i enviar el pdf pot ser un problema si tenim molta càrrega, consumeix cicles de CPU que estam llevant als visitants de la nostra web.
En aquest cas podem tenir una maquina o vàries destinades a la generació i enviament de les factures. La nostra aplicació web sols envia a la cua (a una altra màquina o màquines) la petició de que s'ha de fer la factura, i els processos que tenim escoltant a la cua de treballs generaran i enviaran la factura.
Com que l'enviament del treball a la cua de treballs és pràcticament instantani, l'usuari té la sensació de que la web ha respost molt ràpidament. Com que tenim màquines dedicades per a la generació de les factures aquestes també es generen força aviat i s'envien. Mentre hem deixat el servidor (o servidors web) descarregats per atendre més peticions. Hem escalat!
És un exemple típic, com veis l'escalabilitat no s'ha aconseguit posant més màquines que fessin de servidors d'aplicacions Django o posant més processadors, sinó separant les tasques en màquines especialitzades. Si parlam de parsejar XML la cosa és encara més divertida, a l'article [High-performance XML parsing in Python with lxml] (http://www.ibm.com/developerworks/xml/library/x-hiperfparse/) de la web d'IBM i gairebé a les acaballes també ens dóna la pista: l'estratègia de dividir i conquerir; una altra vegada més pensar en com feim les coses.
Aquest és un apunt damunt escalabilita, Python i Django, però perfectament podríeu substituir Python pel vostre llenguatge de capçalera i Django pel vostre bastiment web preferit, Python fa fàcil provar totes aquestes coses, però el realment important és adonar-se de que es poden fer.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Portàtil Dell 10" - casi
Escrit per Aaloy a 10 de July , 2009 a les 5:10 p.m.
Dia 15 del mes passat vaig comanar un portàtil Dell de 10" amb disc dur d'estat sòlid de 16 Gb i 2 Gb de RAM i bateria de 6 cel·les i Ubuntu com a sistema operatiu. Total 1,5 Kg de pes. La idea és que fos el portàtil de les reunions i viatges, amb prou autonomia per aguantar un dia normal de feina sense problemes.
Avui m'ha arribat, bé, casi... Ha arribat romput amb un cop d'aquests que fan fredat a la pantalla que és difícil d'explicar. La capsa ja venia copejada, però no foradada i no m'explic com el transportista (UPS) li ha pogut pegar un viatge com aquest a un article que s'ha de manipular com a fràgil.
A més d'arribar amb 15 dies de retràs que arribi d'aquesta manera és una putada. Si torba més el model ja serà antic.
Tot i això al manco ha arribat, cosa que no puc dir del ratolí ni de la borsa de transport, que s'han perdut pel camí. Serà cosa de la crisi?
El portàtil en sí i amb la mitja pantalla que es veu, està força bé. Les tecles són més usables que al portàtil de 9" encara que el mig quilet de pes també s'ha de tenir en compte. Duu Unbutu 8.10 de sèrie que ha arrancat foça ràpid. No l'he configurat perquè no m'hi veig, però promet.
És un portàtil força compacte,dens afegiria i crec que té el tamany ideal pel que cerc: que em permeti fer feina un parell d'hores sense problemes i sobre tot que em permeti dur-ho sempre a la motxilla. El que ara duc és un Dell també de 15,4" (sense copetar) i els gairebé 3,5 Kg es noten si t'has de moure molt i anar a peu. Té molta més resolució que el de 10", gairebé el doble, però com que és també un dels meus ordinadors principals de feina, no m'hi sent còmode passejant-lo. La idea del portàtil de 10" és el de tenir-hi sols la feina del moment i la resta obtenir-ho on-line.
M'hagués agradat poder escriure més coses i contar-vos si va bé o no, i si val el que he pagat per ell, però ara per ara sols us poc contar aquestes petita anècdota. Hauré d'esperar un poc més i confiar en el servei d'atenció al client de Dell, i que la reposició sigui ràpida.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Eclipse Galileo vs Netbeans Python (trunk) per Python i Django
Escrit per Aaloy a 05 de July , 2009 a les 11:42 a.m.
La publicació de la nova versió d'Eclipse, Galileo ha servir d'excusa per a tornar (al manco temporalment) a Eclipse com a entorn de desenvolupament per Python.
És la versió Galileo d'Eclipse millor que Netbeans? Doncs depèn, al cap i a la fi del que es tracta és de que l'IDE ens faci més productius, però a partir d'aquí ja és una qüestió de preferències personals.
Anem a veure les meves...
Facilitat d'instal·lació
La facilitat d'instal·lació és important perquè fa que puguis actualitzar de versió o posar un nou programador a fer feina en poc temps. La gent que fa feina amb PL em diu que necessita molt de temps per poder tenir l'entorn de desenvolupament llest, i com tots sabem temps són doblers.
Ambdós entorns són iguals de bons d'instal·lar. Ambdós tenen una arquitectura de plugins, així que la velocitat de posada en marxa depèn fonamentalment del nostre ampla de banda.
Si ens limitam a Python dir que la versió de Netbeans per Python ja duu el pluggin integrat i necessita davallar menys coses. De la mateixa manera no és necessiten pluggins addicionals al Netbeans per fer feina amb javascript, css o html, ja ve tot de sèrie.
Guanya Netbeans però de ben poc, ja que gràcies a projectes com Yoxo podem configurar-nos la nostra pròpia distribució d'Eclipse.
Portabilitat
Faig feina gairebé al 99% damunt Linux, però amb versions i386 i PPC. De tant en tant he de provar alguna cosa damunt Windows i per això vull que el meu entorn de desenvolupament pugui funcionar igual de bé en totes aquestes plataformes.
Aquí hi ha un guanyador clar: Netbeans. Funciona igual de bé a totes les plataformes. Eclipse dóna molts problemes al PPC i de fet aquesta plataforma no està soportada als repositoris oficials.
Suport per Python
La versió Python de Nebeans ja té el pluggin integrat. Eclipse necessita el pluggin PyDev. Ambdós pluggins són molt bons: permeten la utilització del virtualenv, tenen ressaltat de sintaxi, autocompletat, ajudes, plantilles, refactorització i creació de Unit Tests. Empat!
Suport per Django
Cap d'ells proporciona un suport específic per Django, encara que Netbeans ho té com a projecte. Tanmateix, però, el més important és que l'entorn permeti executar el python manage.py runserver --noreload en mode depuració.
Aquí Netbeans falla. El depurador està molt enfora del depurador d'Eclipse i Pydev, que et permet posar punts de ruptura on vulguis i té tot el que un necessita en depuració. Amb Netbeans no hi ha més remei que fer servir import pdb; pdb.set_trace() al codi i utilitzar el depurador de línia de comandes. És un punt de millora molt important per Netbeans, i si no us sentiu còmodes amb la depuració per línea de comandes llavors l'elecció clara és Eclipse.
Suport per CSS
Eclipse necessita el puggin d'Aptana per posar-se a nivell de Netbeans i al meu parer no ho aconsegueix del tot. Ambdós tenen ressaltat de sintaxis, autocompletat i ajudes, però Netbeans a més et pot presentar un exemple de com queden les coses. Útil en algunes ocasions per veure visualment que l'estil que estam modificant queda com volem o que és el que volem modificar. Netbeans guanya per poc.
Suport per Javascript
Una altra vegada més Eclipse necessita d'Aptana per posar-se a nivell de Netbeans. Netbeans més proporciona un mode de depuració de javascript basada amb Firebug que va força bé. Pareix que Eclipse també suporta quelcom semblant però no és tan inmediat com amb Netbeans. No és una opció molt important, però donat que estam parlant d'integració de les eines més habituals a l'IDE s'ha de tenir en compte. Netbeans guanya.
Control de temps i tasques
Ambdós entorns ens permeten gestionar llistes de tasques a fer i controlar el temps dedicat a cada tasca. Associar arxius a tasques i controlar automàticament quan hi estam fent feina i quant no. Això és fonamental pels qui factures a hores o senzillament volen dur un control dels projectes.
Nosaltres feim feina amb Trac i Eclipse gràcies al pluggin Mylyn permet connectar-se a un repositori Trac i gestionar-ne les tasques. Eclipse guanya!
Aprofitament de l'espai
Personalment m'agrada tenir una distribució on tengui a la vista l'arbre d'arxius, l'editor i la consola de tasques i missatges. Quan faig feina amb les dues pantalles de 20" puc posar l'IDE a una pantalla i el navegador a l'altra, però quan faig feina amb sols una pantalla l'aprofitament de l'espai de l'IDE fa que pugui, o no, col·locar-hot tot per a tenir una visualtizació més ràpida i ergonòmica.
Eclipse consumeix molt més espai que Netbeans. Es pot tunejar un poc, però la tendència és a desaprofitar pixels en menús, pipelles i demés. L'estructura de Netbeans per mí és molt més elegant i amb un aprofitament d'espai gairebé òptim. Com a IDE per al portàtil: Netbeans.
Integració amb SCM
La integració amb el sistemes de control de versions és prou bona a ambdós entorns. En la nova versió la integració del pluggin Subversive és excel·lent a Eclipse i l'assistent gràfic en el maneig de branques de Netbeans és simplement genial.
En les operacions del dia a dia Eclipse guanya. Té una opció que et permet veure els canvis entrant i sortint (això també ho fa Netbeans) però a diferència de Netbeans la interfície d'usuari està molt més orientada a la usabilitat i és trivial llevar arxius, marcar-los com a no integrables, veure'n les diferències abans d'integrar, etc.
La usabilitat de Netbeans és força dolenta, de fet és molt més còmode anar per línia de comandes. Guanyador i amb molt avantatge: Eclipse.
Revisió de canvis
Netbeans ens permet mostrar quins canvis hem fet a l'arxiu que estam editant i manté un control local de versions. Eclipse també manté aquest control local, però la usabilitat és inferior.
A l'hora de mostrar diferències Netbeans manté el ressaltat de sintaxi, Eclipse no. Per mi el més útil és el control local i aquí Netbeans és el millor.
Plantilles
Ambdós IDEs ens permeten crear i gestionar les nostres pròpies plantilles de codi i ho fan força bé. Empat!
Execució de tests unitaris
Ambdós sistemes ho permeten, però com passa amb el control de versions, el d'Eclipse és molt més usable. Guanyador per poc: Eclipse.
Refactorització
Els dos entorns suporten la refactorització de códi. Empat!
Eines d'edició
Ambdós entorns ens permeten fer cerques a tot el projecte, fer servir expressions regulars, substitucions, ... Els dos editors són força avançats i més que suficients per a les necessitats d'edició de codi. Empat!
Afegitons
Eclipse des del principi ha fet de la possibilitat d'extendre l'entorn mitjançant pluggins una virtut. Netbeans s'hi ha incorporat més tard i això es nota. La quantitat d'afegitons per Eclipse esborrona, per Netbeans cada cop n'hi ha més i millors però encara Eclipse n'és un clar guanyador.
L'aposta per Python i Django
Eclipse no té una orientació clara cap a Python, però gràcies a PyDev i a la facilitat que té Eclipse per a integrar pluggins s'ha convertit en un entorn molt potent per a la programació.
Netbeans en canvi té un build sols per Python, ple suport i al roadmap hi ha la intenció de suportar Django: creació de projectes, plantilles, etc. L'aposta per Python a ca'n Netbeans pareix molt més clara que a Eclipse, encara que en aquests moments i com a regla general, actualment Eclipse proporciona molta més funcionalitat i integració que Netbeans.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Comerç electrònic?
Escrit per Aaloy a 27 de June , 2009 a les 9:03 p.m.
Estic emprenyat! Potser és l'efecte de que se m'acabin les vacances, tot s'ha de dir, però també perquè aquests dies he pogut comparar la diferència que hi ha entre les llibreries on-line espanyoles i les americanes, tot una decepció.
El diumenge 21, comptant que estaria una setmana de vacances, volia llegir dos llibres que m'havien recomanat: "El Economista Naturalista" i "Fest-te bruixot, fest-te savi", que no tot ha de ser informàtica :) Així que vaig anar cercant a les llibreries on-line espanyoles amb l'esperança de trobar-los i tenir-los en un parell (dos) de dies o potser tres.
El llibres els vaig trobar a Casa del Libro i vaig triar l'opció d'enviament urgent (2 dies, fins aquí bé), un poc més cara, però tanmateix el que importava era tenir la lectura de vacances a punt.
El divendres al migdia vaig rebre un missatge que me deia que no tenien cap dels dos llibres en stock i que podria estar entre 4 i 20 dies hàbils en arribar, si l'editorial els tenia, però que en tot cas ells no se'n feien responsables. Penós!
Compr força llibres a l'any, normalment llibres tècnics, però si hi ha una cosa certa és que cada cop que els compr a llibreries on-line espanyoles em duc una decepció. Amazon o Barnes and Noble també es queden fora estoc, se'ns dubte, però mirem-ne les diferències:
-
És molt rar que si demanes més d'un llibre estiguin tots esgotats. No m'ha passat mai.
-
No donen la culpa als altres, sinó que es disculpen per haver quedat sense existències, te donen una data aproximada i te diuen que t'enviaran l'altra o els altres sense cost addicional
És a dir, he pagat més per un servei urgent (que ja vos jugaria alguna cosa que no em reemborsaran) i a més rebré els llibres quan a ells els vagi bé. Al missatge no hi ha cap link per a cancel·lar la comanda, si tens res a dir telèfon o formulari d'incidències, que per suposat he omplert.
Em fa ràbia! Tothom s'omple la boca amb paraules com a innovació, competitivitat, que el futur és on-line i després topes amb la realitat: l'empresa espanyola (llevat de molt comptades excepcions) encara no creu amb Internet, els que hi són ho fan gairebé per obligació, com a una despesa més que com a una inversió.
Veus planes mal fetes (potser és deformació professional) sols compatibles amb un navegador, amb un disseny poc orientat a l'usuari, lentes, sense cuidar ni la semàntica de la plana, desactualitzades, tècnicament dolentes ... I no és cosa de llocs petits, sinó d'empreses que haurien de tenir un potencial inversor important, i que per tant això sols s'explica per desídia o bé perquè com dic, veuen el tema del comerç electrònic com a una despesa.
Gent! Espavilau! Convé que l'empresariat d'aquesta terra comenci a fer un curs intensiu de comerç electrònic, que aprengui a distingir una web ben feta d'una altra que no ho està, que sàpiga demanar un pressupost com toca i no "qualsevol cosa per estar a Internet". En definitiva, convé adonar-se de que Internet és un canal de venda important i no basta amb ser-hi, actualment és necessari tractar-lo com si fos una tenda física, mimar-la i entendre que és un negoci 24x7 on la gent espera immediatesa i començar a modificar els fluxs de negoci per anar adaptant-ho a aquesta nova realitat.
Què passarà si un dia Amazon fa una web de llibres en castellà (o català, o gallec)? Doncs que ja no hi haurà temps de reacció. És el mateix que els està passant ara als hotelers, massa dependents de les reserves dels TTOO. Un canal on-line fort i una bona política de preus els hagués permès negociar millor i tenir un canal de venda extra consolidat.
No basta amb tenir un iframe (com fam molts) cap a un banc de llits dins la web presencial de l'hotel per a que ens vengui els nostres llits, s'ha de tenir el control total del que estam venent, és el nostre negoci. Això permet jugar amb les ofertes de darrera hora, fer promocions, és a dir, controlar què i com venem el nostre producte i no deixar la comercialització totalment en mans de tercers.
M'emprenya veure com tenim accés a les mateixes eines que tothom i com ens estam quedant endarrera quan en podríem ser capdavanters.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica General
Enumerate: indexant les llistes en Python
Escrit per Aaloy a 21 de June , 2009 a les 11:21 a.m.
Quan feim feina amb llistes de tant en tant en sorgeix la necessitat de fer feina amb l'index de la llista en lloc (o a més) de l'element de la llista en sí.
Sovint ens podem trobar fent coses com
1 2 3 4 5 | x = ['a','b','c'] i = 0 for item in x: i +=1 print i, item |
Davant aquest tipus de problemes, pensau que el més habitual és que el propi llenguatge ja ho tengui resolt, de la mateixa manera que els problemes més habituals de la programació web estan resolts per Django.
El nostre problema es redueix a fer servir enumerate. Aquesta funció agafa un iterador (una llista per exemple) i ens retorna un nou iterador, els elements del qual són una tupla composta pel comptador (l'índex) i l'element de l'iterador inicial que li passam com a paràmetre.
enumerate pot agafar com a paràmetre un nombre que serà el valor inicial de la seqüència (per defecte zero). La seva sintaxi és doncs enumerate(iterable, start=0)
Amb això podem escriure el codi anterior com
1 2 3 | x = ['a','b','c'] for i, item in enumerate(x): print i, item |
o sí volem comptar a partir d'1
1 2 3 | x = ['a','b','c'] for i, item in enumerate(x, 1): print i, item |
El nom a més és prou descriptiu de la funcionalitat que fa, amb la qual cosa el codi ens queda fins i tot millor documentat.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Sobre l'edat, la depuració del codi i SOA
Escrit per Aaloy a 14 de June , 2009 a les 6:38 p.m.
Aquesta setmana he trobat un grapat d'apunts molt interessants al Planet de Python, el primer és Programming is not the right thing to do i TDD Anti-Patterns.
El primer article és un comentari a Programmers: Before you turn 40, get a plan B, on tracta la suposada obsolescència dels programadors a partir dels 40 anys.
El segon és una classificació dels principals errors que un pot trobar-se quan programa fent servir la metodologia coneguda com a Test Driven Development.
Del primer, potser perquè ja estic passant els 40 m'afecta és personalment. És cert que la meva feina diària és més de gestor que de programador, i que fins i tot he procurat cercar-me un pla B, però crec que el que diferencia un bon programador i algú que programa com a feina no és l'edat, sinó la curiositat i les ganes d'aprendre. Potser amb l'edat la nostra capacitat d'aprendre coses noves empitjora i ens feim més lents, però és ben cert que millora la nostra capacitat de relacionar experiència i coneixements, ja que els tenim.
El que sí diria és que ens tornam més sibarites. Personalment m'atrau més fer feina amb tecnologia que m'agradi i amb projectes interessants que amb altres feines, potser millor pagades, però menys satisfactòries. Supòs que és perquè m'agrada la feina que he triat com a mitjà de vida, i em deprimiria (em deprimeix de fet a vegades) veure-la convertida en un simple mitjà per posar un plat calent a taula.
El segon article a més del que té de millors pràctiques, m'admira per la facilitat que tenen els anglosaxons per posar noms a les coses. L'objecte Good, El mentider, l'heroi local. Noms graciosos però que resumeixen el que es vol dir o que senzillament ajuden a pensar més en el que es fa.
D'aquest article vaig anar a parar a una utilitat, el pudb que desenvolupa un depurador en mode text per a Python. No tant potent como el ipdb o el pdb, però que té un entorn gràfic més agradós.
La depuració i el testeig per mi no són disciplines menors. Ens passan gran part del temps depurant i testejant, i potser un dels avantatges de tenir els quaranta és que ja intueixes moltes vegades on és el problema, fent bona la dita de que sap més el dimoni per vell que per dimoni. De totes menares quan m'he d'enfrontar amb una sessió de depuració procur anar-hi amb una certa metodologia:
-
Suposar que la culpa és al codi. Pareix una tonteria, però suposar això implica començar a cercar primier pel més obvi, per alguna cosa que hem trencat. Si no ho feim així fàcilment podem caure amb el que McConnell a "Code Complete" anomena Debugging by Superstition (veis un altre nom interessant), per explicar el comportament de certs programadors que cerquen defectes misteriosos pensant que el compilador, l'editor, el sistema operatiu, el món, ... està contra ells.
-
Formular una hipòtesi. És en la depuració on podem demostrar que la programació és una ciència. Feim una hipòtesi i la comprovam, si no és cumpleix la hipòtesi la teoria és incorrecta i hem de cercar el problema per un altre costat.
-
Modificar una cosa cada vegada. Com en la refactorització, sols que en el cas de la depuració es tracta de que el programa es comporti de manera diferent, i.e. que funcioni.
-
Testejar la solució. No sigui cosa que resoldre el problema ens introduesqui nous problemes o en faci aparèixer de nous que havien estat amagats.
També aquesta setmana he tingut l'oportunitat de llegir un treball d'Accenture damunt SOA. He de dir que tractava el tema força bé, sense decantar-se per un proveïdor concret. Estic convinçut que SOA és una bona cosa, el que no tenc clar és que tengui que ser necessàriament complexa. Crec que amb SOA està passant un poc el que va passar en el seu dia amb els EJB: s'intenta aplicar a problemes que realment no requereixen tanta complexitat.
Com en el cas de la depuració sóc partidari de començar primer pel més obvi: que no necessitam tanta complexitat segurament, i anar cap a arquitectures més senzilles però igualment vàlides: XML sobre Http, REST i després anar complicant-ho si és necessari i el retorn de la inversió ho justifica.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Django: Guia d'aprenentatge
Escrit per Aaloy a 07 de June , 2009 a les 4:49 p.m.
La pregunta a la que vull intentar respondre en aquest article, és la que fa força gent que vol canviar la manera en que fa aplicacions web i com que ha sentit parlar molt bé de Django, s'atraca a aquest bastiment amb l'esperança de poder millorar la seva productivitat, és a dir: què he de saber per començar a fer webs amb Django?
Primer de tot em de saber què és Django. Django és un bastiment, és a dir, tot un conjunt de llibreries que interactuen entre sí i que estan orientades a fer i mantenir llocs i aplicacions web.
Primera cosa, doncs, Django no és un llenguatge de programació. Per a fer servir Django es necesita conèixer el llenguatge de programació amb el que està creat i aquest llenguatge no és ni més ni manco que Python.
Segona cosa: Com a bastiment que és Django requereix que les coses es facin d'una determinada manera, és el que anomena modle MVT (Model Vista Template), però al mateix temps ens està dient que per sí sol Django no ens construirà la nostra aplicació. Hi haurem de fer feina, segurament aquesta feina serà més ràpida i productiva, però no hi ha solucions màgiques.
Prerequisits
- Se suposa que sabeu programar en algun llenguatge d'alt nivell.
- Se suposa que teniu coneixements d'HTML i CSS
- Se suposa que teniu coneixements del que és una base de dades relacional i d'SQL
- Se suposa que saber fer anar la línia de comandes
Si no compliu aquests quatre requisits convendria replantejar-se el tema. Segurament trobareu que Django no és l'eina màgica que havíeu suposat.
En aquests temps de crisi costa molt dir que no als clients i una vegada emmerdats anar cercant l'eina màgica que ens tregui del problema. Per molt bona que sigui l'eina sempre hi haurà una sèrie de requisits, si no els compliu, millor cercau una altra cosa (potser una altra feina?) o anau invertint en la vostra formació de base.
Supòs que tots els que llegiu això compliu de sobra aquests requisits i m'estic passant de prudent i tiquis-miquis, però tenc una anècdota molt recent: l'empresa per la que treball habitualment va demanar un pressupost a una empresa externa. A aquesta empresa (no diré noms, però no és de Mallorca) se li va demanar que el pressupòs contemplàs que el llenguatge de programació triat per fer l'aplicació fos Python+Django, Java J2EE (amb Hibernate, Spring i JSP) i que en tot cas podien presentar la proposta per PHP. La proposta Java feia servir CakePHP i Zend i cap referència a cap tecnologia Java. La proposta PHP cap referència a versió de PHP. Imaginau quina impressió dóna el pressupost! Per acabar-ho de rematar la primera cosa que deia és que s'havia de fer l'anàlisi de requeriments. Què s'ha pressupostat doncs? Entenc que amb la crisi tothom està arreplegant tot el que pot, però tot té un límit!
Així doncs, per a començar, suposarem que ja teniu un cert nivell informàtico-programador i que no és la primera vegada que sentiu parlar de l'HTML i heu picat planes web a mà. L'SQL potser inicialment no serà tant necessari, però si realment volem arribar a fer aplicacions web mantenibles és imprescindible saber-ne i conèixer al manco els fonaments de les bases de dades relacionals.
Bé, ja ho tenim clar, i si heu arribat fins aquí ara estareu esperant que us digui cap on heu de tirar, què és el que s'ha d'aprendre i amb quin ordre per fer que la corba d'aprenentatge sigui el més suau possible. Som-hi doncs!
El bàsic de Python
Python és un llenguatge de propòsit general, molt net i estructurat. Es poden fer tant aplicacions de consola, aplicacions web o aplicacions gràfiques, el que vulguem. El que propòs aquí es el mínim que convé saber per poder fer webs quan abans millor i anar aprenent el llenguatge i les seves llibreries associades així com ho necessitem.
Una guia molt senzilla és la que tenim a Python para todos de Raúl González Duque, i que ens servirà com a referència d'estudi i com no el tutorial de Python. Què hem de saber en aquesta etapa?
La consola
- Utilitzar Python en mode consola: Python com a calculadora
- Instal·lació i execució d'iPython
El llenguatge
Hem de perdre la por a fer feina amb una consola de comandaments. La consola ens permetrà experimentar ràpidament amb el llenguatge, ens n'adonarem del que representa fer feina amb un llenguatge interpretat i fer fer-ho am iPython a més ens permetrà veure algunes de les possibilitat d'aquesta consola (que no oblidem la utilitza Django si està instal·lada).
- Creació del "Hola Món". Establim les regles de tabulació (tabulació a 4 espais, UTF-8 i format Unix pels arxius és la meva elecció.)
- Tipus bàsics: experimentació amb el intèrpret i l'editor. Nombres, cadenes, boolenas, llistes, tuples i diccionaris.
- Sentències de control:
if,for,pass,breakicontinue - Dates a Python.
- Creació de funcions bàsiques. Paràmetres per nom, valors per defecte.
- Documentació i comentaris
Amb això ja tindrem les nocions bàsiques del llenguatge. Encara no hem entrat en tota la potència de Python però si hem programat en una altra llenguatge ja tindrem en ment un bon anàlisi comparatiu. Segurament ja estareu pensant com refer alguns programent en Python.
- Orientació a objectes bàsica.
- Les funcions són també objectes. La funció lambda
- Els paquets.
Amb un poc de sort ja sabreu què és la orientació a objectes, si nó és un bon moment per aprendre'n. L'objectiu és adonar-nos de que tot en Python és un objecte i com s'estructura el codi en classes, mòduls i paquets.
- Programació funcional: fonamental veure la comprensió de llistes.
- Ordenació de llistes.
- Creació Manipulació de fitxers, utilització de les llibreries
osysys - Les excepcions.
Amb això ja tindrem gairebé el 80% del que necessitarem per fer una aplicació de consola, però no oblidem que a més nosaltres volem fer aplicacions web i a més amb Django, així que afegirem un parell de coses més:
- Expresions regulars bàsiques amb Python. L'eina Kodos.
- El mòdul Sqlite3 i el plugin de Firefox per a gestionar les bases de dades Sqlite.
- l'
easy_install. Hem de saber què és i com utilitzar-lo per a instalar noves llibreries. - Batteries included. Convé saber què significa aquest concepte i veure, al manco llegir, quines són les principals llibreries que Python inclou i què fan.
Amb això ja ens estam orientant cap a la web i Django. Les expressions regulars les farem servir sovint a Django a l'hore de mapejar urls amb les funcions Python corresponent. El mòdul sqlite ens permetrà veure el que és la API d'accés a base de dades de Python, familiaritzar-nos amb sqlite i si no ho havíem fet ja, començar a instal·lar els primers plugins de Firefox. Perquè tothom té Firefox per a desenvolupar webs, no?
Django
Podem començar a fer aplicacions web una vegada coneguem i ens sentim còmodes amb el llenguatge. El temps dedicat a Python no és per res temps perdut, ben al contrari. Feis exercicis, creau scripts, llegiu codi, l'important és poder llegir Python i que les instruccions surtin de manera natural.
- Instalau Django des del subversion
- Feis el tutorial de Django.
No està pensat per ser un manual de millors pràctiques sinó per mostrar el principal del bastiment i tenir alguna cosa repetible, una base comú.
- Mirau appfusedjango, el subprojecte
project. Està fet per a crear nous projectes pel mètode de copiar i aferrar.
Els models
- Creació de models: l'ORM de Django.
- Utilització de la consola per a introduïr dades als models
- Utilització del manager de Django per afegir dades.
- Execució de consultes fent servir l'ORM
En les aplicacions web passarem força temps manipulant dades, bé des de la web o bé directament amb scripts i la consola. Convé que no hi hagi por.
Les plantilles
- Creació de planes estàtiques
És un primer exercici. Consisteix en agafar un grapat de planes estàtiques i convertir-les en una aplicació Django utilitzant el direct_to_template. Això
ens ha de permetre veure com, sense més complicacions podem fer planes a la manera tradicional (i inefectiva).
- Les plantilles de Django: definició i concepte d'herència.
- Filtres
- Tags
- Refer les planes estàtiques anteriors fent servir l'herència de plantilles.
Aquí començarem a veure les possibilitats que té Django respecte de la manera més tradicional de fer les coses. Veurem que fer webs amb blocs i pensant en diferències és molt productiu.
El view.py i url.py
- Veure com les urls mapegen contra funcions Python
- Utilització de les plantilles
- Les expressions regulars i les urls.
- HttpResponse, render_to_template , redirect
Ens n'hem d'adonar que no hi ha màgia, que tot és codi Python que envolcalla al protocol HTTP.
Formularis
- Creació de formularis.
- Renderització de formularis
- Formularis lligats a dades
- Validació i control d'errors.
- Pujar arxius i imatges.
- L'autenticació
Dedicau el temps que sigui necessari als formularis. De ben segur en fareu molts al llarg del cicle de vida d'una aplicació web. Django és molt elegant en la seva utilització.
Quan es veuen els formularis m'agrada passar també per l'autenticació, ja que en aquest punt ja es té tot el necessari i consider que l'aspecte de la seguretat s'ha de tractar tot d'una que es pot.
Reflexió
No sé ben bé com anomenar aquesta etapa, però convé que dediqueu alguns dies a fer una aplicació web des de zero. Pensau en alguna que es us agradaria fer i vegeu-ne la seva viabilitat. Reduïu-ne l'abast si és necessari, però intentau fer una aplicació web completa.
L'objectiu és adonar-nos del que sabem, del que no sabem i del que no sabíem que no sabíem.
Django i Javascript
- Json i Django
- Exemple de jQuery (o la llibreria que utilitzeu) i com lliga amb les urls y views de Django.
No sols d'HTML viu l'home i cada cop les planes web tenen més javascript. Django és agnòstic en el que fa a la llibreria a utilitzar, però sigui com sigui fa que sigui realment fàcil interactuar amb llibreries javascript com jQuery, extjs o Dojo.
Fent les webs escalables
- Internacionalització
- Els principals middlewars.
- Sistemes de cachés
- Context processors
- Creació de tags pròpies
Aquí ens n'adonarem de les respostes que dóna Django als problemes reals quan la nostra web passa de ser una idea a estar en producció i té prou visites. Hem de veure a més com podem interactuar amb les peticions HTTP i amb la informació que passam a les plantilles.
Reutilització
- Convé adonar-se de com Django permet reutilitzar codi, de l'estructuració del projecte en aplicacions i d'aquestes en mòduls PYthon.
- Repassar els principals settings.
- Repassar les aplicacions que ja venen incorporades al bastiment: e-mail, sessions, paginació, signals, sitemaps i sites.
- Algunes aplicacions interessants: django-photologuer, django-page-cms, django-rosetta, django-command-extensions
Reflexió 2
Tornau a fer l'aplicació anterior incorporant javascript, internacionalització, cachés i tags fets ad-hoc. Mirau com queda el codi i com queda l'aplicació.
Arribats a aquest punt ja estau llets per anar agafant cada vegada més coneixements. No oblideu que aquests han de venir tant des de la part Python com de Django. Quan una cosa no vegeu com es pot fer amb Django cercau en el propil llenguatge. Si és un problema comú segur que està solucionat en el propi bastiment, i si no ho està vol dir que ja té solució a nivell de llenguatge de programació.
Això és tot, esper que us servesqui de guia i us animi a fer feina en aquest bastiment. Recordau, però que no hi ha bales de plata i que tot requereix esforç i dedicació.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django i python: orientat a la feina
Escrit per Aaloy a 03 de June , 2009 a les 6:36 p.m.
Avui, mentre explicava a la gent de l'equip web un grapat d'optimitzacions que podem fer per fer que les nostres aplicacions siguin més ràpides i actualitzables, al mateix temps pensava que en la potència que ens està donant Python i Django gràcies a la seva orientació cap a fer les coses com s'han de fer.
La comparació amb Java, l'altre llenguatge que feim servir, no pot deixar d'estar present, i llevat d'excepcions (poques) he de dir que la combinació Python i Django en surt sempre afavorida davant de Java.
Django està molt orientat a la web, però no de qualsevol manera, està orientat a fer webs que s'han de mantenir i que han d'escalar. Per això veus que és gairebé trivial fer coses que en altres plataformes resulten força costoses: qui no recorda el que s'ha de fer per fer un redirect amb Struts, per exemple?, o la complexitat que té validar formularis tant amb Struts com amb Spring?.
Django està orientat a fer aplicacions pel món real, això vol dir: que surtin ràpides, puguin sofrir moltes modificacions al llarg del seu cicle de vida i que es pugin actualitzar també molt ràpidament.
El bastiment segueix de molt aprop la filosofia de Python, la de mantenir les coses legibles i simples. Hi ha d'haver sempre una manera obvia de fer les coses, i quan fas feina amb Django veus que els 90% dels problemes que et planteja una aplicació web tenen resposta directa. La resta poden dur un poc més de feina, que normalment vol dir fer herència d'alguna classe.
Una de les darreres aplicacions en les que he pogut comparar Java i Python ha estat una aplicació que agafa XML, el manipula i el posa dins una base de dades. L'aplicació original, feta amb Java+Spring+Hibernate, va dur setmanes de feina, mesos si contam el manteniment posterior. Fer el mateix amb Python (lxml+sqlalchemy) ha duit menys de 4 dies-home de feina.
Posar l'aplicació Java en producció també va ser un poc malson per mor de les dependències entre les llibreries. Posar-la en Python dins un virtualenv és pràcticament immediat.
Tampoc ha resistit la comparació el manteniment i la correcció d'errors. El temps que passa per localitzar l'error i fer l'actualització en Python és mínim, en Java multiplicant per 10 o per 20 aquest temps.
Ens queda un tema: el rendiment. Com moltes vegades he dit per aquí el rendiment basta que sigui "prou bo", és a dir, per l'aplicació que estam parlant partíem d'un temps de càrrega d'entre 4 hores en les primeres versions Java, a 30 minuts a les darreres versions amb multi-fil. Amb màquines amb 8 Gb de RAM i menjant-se la màquina tant amb memòria com amb processador.
La versió Python també es feta amb multi-fil, on el nombre de fils és parametritzable, amb pool de connexions i demés. Sols que escrit amb un 10% de les línies de codi. El temps? Doncs 6 minuts i mig. Consum de memòria: mínim, ús de la CPU: intensiu però sense deixar torrada la màquina.
Python està orientat a que les coses es facin i es mantenguin. Per algunes tasques concretes potser no serà la millor solució, però cada vegada estic més convençut que és el primer que s'ha de provar. Si no va prou bé, el prototip ens haurà servir per a conèixer millor l'abast del problema sense haver-hi invertit molt de temps, i sempre som a temps d'optimitzar alguna secció del codi amb C, de maneres per utilitzar codi C (o C++) o bé d'escriure codi intermig que es transformi en codi C compilable n'hi ha força. Al wiki de Cpython (una de les eines que ens permet fer això) n'hi ha un bon grapat.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Python Django
I no passa res
Escrit per Aaloy a 24 de May , 2009 a les 7:16 p.m.
En la literatura de gestió de projectes anglosaxona es parla d'un efecte teamicide, és a dir, d'un efecte aniquilador de projectes per referir-se a situacions que per la seva naturalesa més tard o més prest repercuteixen en el rendiment i la cohesió de l'equip de treball, poen-lo dur a la seva destrucció.
Avui parlaré d'una d'aquestes situacions, l'anomenada "no passa res" o en la seva variant de "tanmateix tot seguirà igual".
Supòs que més d'un podrà donar exemples d'aquesta situació i de la poca gràcia que fa. Us pos un grapat d'exemples de situacions:
-
L'equip ha fet una recomanació que no ha estat escoltada i arrel d'això s'ha de tornar a refer part de la feina. No hi ha conseqüències de cap casta per la persona que no va escoltar les recomanacions i sí més feina per l'equip.
-
S'ha posat al davant d'un projecte algú de provada ineptitud. Tothom sap que el projecte acabarà tard o malament o les dues coses. El projecte acaba com se suposava, malament, i s'assigna al responsable inepte a un nou projecte i a un altra persona a recollir els plats trencats.
-
S'ha fet una reunió de varies hores per decidir que en aquella reunió no es decidiria res. S'ha perdut el temps de tots els assistents, però no passa res.
-
S'ha fet una reunió per determinar un pla d'acció. Tothom hi està d'acord, però a les poques hores algú ja es surt de l'acordat. Es torna a la situació de desgavell anterior.
-
Un membre de l'equip es queixa de mala manera al cap de la feina d'un altre company. No passa res.
L'efecte destructor del "no passa res" ve donat per mor de l'efecte de pèrdua de control que es té damunt la feina. La gent arriba a la conclusió de que faci el que faci tot seguirà igual i que la seva feina o no feina no pot canviar les coses. Per tant s'acaba en gent que fa hores a la feina, però que aquestes no són productives.
Eliminar l'efecte "no passa res" és una tasca de comunicació. Sovint l'interessat donarà molta importància a temes que no la tenen i això se li ha d'explicar, altres vegades el tema sí que té importància, i les actuacions que se'n derivin (tot i que poden ser duites dins la discreció) s'han de fer públiques, potser sense assenyalar culpables però sempre fent saber que les coses es prenen seriosament.
L'opció de no fer res sols du a la desconfiança i a la deixadesa. El problemes grans de demà són els problemes petits que no hem resolt avui.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes
Django, imatges i Imagekit
Escrit per Aaloy a 23 de May , 2009 a les 4:46 p.m.
Django Imagekit és una llibreria creada per Justin Driscoll que ens permet crear miniatures i/o distints tamanys d'imatges a partir de la imatge original, i que s'integra molt bé amb Django. És una llibreria més senzilla que la de django-photologue ja que no té tota la funcionalitat per a crear gal·leries fotogràfiques.
El tutorial per a fer-la anar està força bé, però aprofitaré la benentesa per a fer cinc cèntims de com podem pujar una imatge al nostre site amb Django i presentar-la de nou.
El codi font de l'exemple complet és a appfusedjango.
El model
Per començar definim el model:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from django.db import models from imagekit.models import ImageModel from django.db import models from imagekit.specs import ImageSpec class Photo (ImageModel): image = models.ImageField(upload_to='photos') comments = models.TextField() num_views = models.PositiveIntegerField(editable = False, default = 0) class IKOptions: spec_module = 'sample.specs' cache_dir = 'photos/cache' image_field = 'image' save_count_as = 'num_views' def thumb(self): if self.image: return '<img src="%s">' % self.thumbnail.url else: return "" thumb.allow_tags = True thumb.short_description = 'Foto' |
En aquest cas es tracta d'un model molt senzill, guardam la imatge image al directori photos i posarem dins la base de dades tant la referència del fitxer (això és important, dins la base de dades no és guarda la imatges sinó sols la metadada) i el comentari.
El camp num_views ens pots servir per anar guardar la quantitat de vegades que s'ha vist la imatge i és utilitzat si volem per la llibreria d'Imagekit.
La part interessant és a la classe IKOptions. Aquesta defineix quin tractament se li donarà a la imatge, on s'enmagatzemaran les miniatures i a quin camp es fa referència.
spec_moduleÉs el mòdul d'ImageKit que es farà servir i que defineix els tamanys possibles. D'aquí una estona el veurem amb detall. En el nostre cas el modul es diuspecs.cache_dir: guardarem els distints tamanys generats aphotos/cacheimage_field: Les metadaes son pel campimagedel model.
El mètode thumb ens serviex per poder posar la miniatura dins el llistat de l'admin.
Els tamanys
Per definir els tamanys Imagekit distingeix entre el que és la visualització de la imatge i les manipulacions que s'hi fan. La imatge original necessita passar per uns filtres que Imagekit anomena processors. Una imatge pot generar-se aplicant un o més d'aquests filtres.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | from imagekit.specs import ImageSpec from imagekit import processors # define the thumnail processor class ResizeThumb(processors.Resize): width = 100 height = 75 crop = True class ResizeDisplay(processors.Resize): width = 600 class ResizeBig(processors.Resize): width = 800 # define your spec class Thumbnail(ImageSpec): pre_cache = True processors = [ResizeThumb,] class Display(ImageSpec): processors = [ResizeDisplay,] class Big(ImageSpec): processors = [ResizeBig,] |
A l'exemple sols faig servir un tipus de processor el de Resize per a redimensonar la imatge als tamanys que farem servir.
Pujam una imatge
Per pujar una imatge necessitam definir un formulari, el mètode que tractarà aquest formulari i les urls que farem servir, així com les plantilles que es mostraran.
Les urls
Aquesta és la part senzilla.
1 2 3 4 5 6 7 8 9 | from django.conf.urls.defaults import * from django.conf import settings from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^$','sample.views.index', name="main-page"), url(r'^display/(?P<id>\d+)/$','sample.views.display', name="display-image"), .... |
Definim una url per l'index que identificarem per nom main-page i que serà tractada al mètode index del mòdul views del nostre paquet sample.
I una altra ulr que ens permetrà visualitzar la imatge a partir del seu identificador. Anomenam a aquesta url display-image, original que és un...
El formulari
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # -*- coding: UTF-8 -*- from django import forms from PIL import Image class AttachmentForm(forms.Form): """Form for the attachment sample. Added a simple validation to accept only png files checking for 'image/png' in the content_type of the file""" image = forms.FileField(help_text="add a png or jpg file") comments = forms.CharField(widget= forms.Textarea, help_text="describe the image") def clean(self): "Validate the entire form" cleaned = self.cleaned_data try: file = cleaned['image'] except Exception, e: # perhaps this is not a file raise forms.ValidationError("Not valid file: %s" % e) if not file.content_type.lower() in ["image/jpeg", "image/png", "image/jpg"]: raise forms.ValidationError("Just jpg or png files please") im = Image.open(file) if not im.format in ['JPEG','PNG']: raise forms.ValidationError("Just jpg or png files please") return cleaned |
El formulari com es pot veure és d'allò més normalet, definim un camp per la imatge i un camp per als comentaris.
La part "nova" està en la validació. No ens podem fiar del que ens diu la gent que puja, així que le que farem és comprovar que el mime type es correspon amb un format vàlid, i com que fins i tot això es pot manipular, farem una comprovació addicional amb PIL per a comprovar que la imatge és el que diu ser. Aquesta comprovació dependrà del vostre nivell de paranoia.
Tractant la imatge
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from models import Photo from django.http import HttpResponseRedirect from django.shortcuts import render_to_response from forms import AttachmentForm def index(request): "Obtains the attachment and saves it to the disk" if request.method == 'POST': form = AttachmentForm(request.POST, request.FILES) if form.is_valid(): f = form.cleaned_data['image'] foto = Photo() foto.image.save(f.name, f) foto.comments = form.cleaned_data['comments'] foto.save() return HttpResponseRedirect('/') else: form = AttachmentForm() fotos = Photo.objects.all() return render_to_response('index.html', {'form':form, 'fotos': fotos}) |
Per a tractar arxius i imatges la part delicada és recordar que hem de passar la informació al formulari afegint el request.FILES i pensar a posar al formulari enctype="multipart/form-data"
A més d'això hem de guardar dues vegades: una per la imatge, que guardarà el contingut dins el sistema de fitxers, i una altra per la resta del model i les metadades de la imatge. Per això tenim un foto.image.save(f.nam, f) guarda la imatge al sistema de fitxers.
Mostrar una imatge és prou senzill
1 2 3 | def display(request, id): foto = Photo.objects.get(pk=id) return render_to_response('image.html', {'foto': foto}) |
Mostrant les imatges
Al template hi passam objectes del tipus Photo, que recordem tenen tota la fontaneria del ImageKit.
Això vol dir que a més de la imatge original, puc fer servir els formats que he definit a specs: Thumbnail, Display, Big.
Per utilitzar-los en la nostra plana sols hi hem de fer referència:
1 2 3 | <li><img src="{{foto.thumbnail.url}}" /></li> <li><img src="{{foto.display.url}}" /></li> <li><img src="{{foto.big.url}}" /></li> |
com podem veure sols és cosa de fer referència al tamny definit i treure'n el que ens interessa, en el nostre cas la url per a mostrar la imatge.
Per darrera ImageKit se n'ha encarregat de fer les transformacions i guardar la imatge a la caché, de manera que la feina pesada de generació dels distints tamnays sols se fa un cop.
A partir d'aquí ens podem comlicar tant com voguem, per exemple:
- Al mètode clean fer que no es puguin pujar imatges de més d'un tamany.
- Reescriure el mètode save del model per a que no es guardi la imatge original sinó una altra imatges ja reduïda.
- Escriure més processors per fer més manipulacions a les imatges.
- etc. etc.
Però el és segur és que amb això que us he contat tingueu el 90% dels casos solucionats.
Nota: Oscar, esper que això et servesqui ;)
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django vs PHP frameworks
Escrit per Aaloy a 10 de May , 2009 a les 6:36 p.m.
Llegint llegint he anat a parar a una plana que compara els principals bastiments (frameworks) PHP entre sí per demostrar com n'és de ràpid el KumbiaPHP comparat amb els altres.
Com que el codi utilitzat per les proves està disponible, doncs he vist que era un simple hello world, així que he creat un projecte hello_world a appfusedjango per poder comparar amb Django.
Disclaimer: La velocitat d'execució no ho és tot. Segur segur, que fet en x ben optimitzat l'aplicació y és més ràpida per aquesta prova. Això no és per veure qui la té més llarga, sols intent comparar coses més o manco semblants per saber on estam. Disclaimer 2: Qui en sap d'aquest tipus de proves és la gent que es dedica més a sistemes, en Bernat o en Guillem, per exemple :)
Amb què he fet les proves?
- La màquina es un PPC 64 de 2 MHz amb 1 Gb de RAM utilitzat Ubuntu 9.1 i Gnome com a Desktop. És a dir, no he fet servir un servidor i hi ha moltes coses executant-se.
- Python 2.5.2 (r252:60911, Jul 31 2008, 17:33:15) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2
- Com que em feia peresa muntar i configurar l'Apache he fet servir un servidor fet amb Django, el CherryPy, concretament el mòdul WSGI que podeu trobar al Django-Cerise sense executar-ho amb mode daemon per tenir major facilitat de modificar la quantitat de threads.
- La versió de Django és la trunk
- Per a les proves finals he optimitzat l'aplicació llevant tot el codi de depuració i middlewares que no es feien servir com el del la compressió gzip.
L'aplicació
L'aplicació no té cachés (tot a dummy i sense per-site-cache) i he fet que la plana en generar-se passi per la vista per a que es faci tot el recorregut MVT.
Els resultats:
executam ab -c 10 -t 60 http://localhost:8088/ cada vegada:
- Aplicació amb codi extra, servidor amb 10 threads 277 req/s
- Aplicació amb codi extra, servidor amb 3 threads 285 req/s
- Aplicació amb codi extra, servidor amb 5 threads 285 req/s
- Aplicació optimitzada, servidor amb 5 threads 334 req/s
- Aplicació optimitzada, servidor amb 3 threads 331 req/s
KumbiaPHP, el més ràpid de la comparativa PHP treu 34 req/s, casualitat? He fet alguna cosa malament? Potser, però no sóc el primer, hi ha gent que també ha notat un fort augment del rendiment en passar de PHP a Django.
I una de les proves:
ab -c 10 -t 60 http://localhost:8088/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Finished 20009 requests
Server Software: CherryPy/3.0.3
Server Hostname: localhost
Server Port: 8088
Document Path: /
Document Length: 266 bytes
Concurrency Level: 10
Time taken for tests: 60.003 seconds
Complete requests: 20009
Failed requests: 0
Write errors: 0
Total transferred: 7723474 bytes
HTML transferred: 5322394 bytes
Requests per second: 333.47 [#/sec] (mean)
Time per request: 29.988 [ms] (mean)
Time per request: 2.999 [ms] (mean, across all concurrent requests)
Transfer rate: 125.70 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 82.1 0 3001
Processing: 4 27 41.7 24 2295
Waiting: 0 25 41.5 21 2291
Total: 5 30 92.1 24 3038
Percentage of the requests served within a certain time (ms)
50% 24
66% 28
75% 30
80% 32
90% 37
95% 43
98% 50
99% 59
100% 3038 (longest request)
(development)aaloy@G5:/tmp/djangocerise-master/src$ ab -c 10 -t 60 http://localhost:8088/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Finished 19863 requests
Server Software: CherryPy/3.0.3
Server Hostname: localhost
Server Port: 8088
Document Path: /
Document Length: 266 bytes
Concurrency Level: 10
Time taken for tests: 60.006 seconds
Complete requests: 19863
Failed requests: 0
Write errors: 0
Total transferred: 7667358 bytes
HTML transferred: 5283558 bytes
Requests per second: 331.02 [#/sec] (mean)
Time per request: 30.210 [ms] (mean)
Time per request: 3.021 [ms] (mean, across all concurrent requests)
Transfer rate: 124.78 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 3
Processing: 12 30 9.0 29 361
Waiting: 10 28 8.7 27 361
Total: 12 30 9.1 29 362
Percentage of the requests served within a certain time (ms)
50% 29
66% 31
75% 33
80% 34
90% 37
95% 40
98% 44
99% 47
100% 362 (longest request)
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
nose, per testejadors amb mala memòria
Escrit per Aaloy a 10 de May , 2009 a les 10:42 a.m.
Supòs que ja ningú dubta de la importància dels test unitaris a l'hora de programar. Els tests ens permeten provar que el que feim és correcte i repetir-ho tantes vegades com volguem i de manera controlada.
Els tests són una part important dels mecanismes de refactorització d'aplicacions, ja que ens asseguren que l'aplicació funciona de la mateixa manera abans i després de refactoritzar.
Els test, però, tenen un problema, fins ara els test unitaris s'han d'escriure d'una determinada manera, recordar les llibreries que has d'importar, com fer un testsuite. Per mi això significa anar a la documentació del pyUnit cada vegada o copiar un test anterior. És el que té dedicar-se a gestionar projectes, que no pots tenir al cap coses que sols fas servir de tant en tant, ja que sols dediques una quantitat mínima d'hores a programar.
Davant aquesta necessitat de fer tests sense tenir que preocupar-nos de la fontaneria intrínseca del pyUnit una de les millors opcions que hi ha és la llibreria nose. Vull dir, si sé que nose és perfecte per la feina (acudit fàcil).
Per fer un test típic basta recordar el següent:
- la sintaxis dels
assertde Python:assert condicio, missatge. - que gairebé qualsevol funció o classes que contengui
testoTestseparat amb quió baix és una funció testejable. - Que un test falla quan l'
assertfalla - Que fent un
nosetest -v nomexecutarem els tests en mode verbose del paquet o funció que li indiquem
La documentació és molt més àmplia, indica quan capturar la sortida, com fer l'equivalent al setup i al teardown dels pyUnit, capturar excepcions, etc. Però el 80% de vegades aquestes quatre coses que indic seran més que suficients.
La llibreria nose ens permet escriure els tests de la manera que estam tots acostumats quan escrivim codi per provar una funció, en nivell de formalització i cerimònia comparat amb els unittests clàssics és mínima, i per tant afavoreix que poguem convertir el codi de proves informal a codi per a la realització de test unitaris amb tant sols reanomenar la classe o funció que hem escrit, i moltes vegades ni tan sols això, ja que, no sé vosaltres, però jo ja tenia la mania de anomenar test a les funcions de prova :)
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Custom management commands
Escrit per Aaloy a 09 de May , 2009 a les 1:03 a.m.
Si heu fet al manco el tutorial de Django haureu fet servir per exemple el típic
python manage.py runserver
per a iniciar el servidor. A partir de la versió 1.0 de Django podem fer servir una sintaxi semblant per crear comandaments lligats a la nostra aplicació i que s'executin també d'aquesta manera.
Podem crear comandaments per fer qualsevol cosa, de fet es que acaba fent és executar un script de Python. Així doncs, ens podríem demanar quina avantatja hi ha en fer-ho així, vàries:
- No necessitam definir cap variable d'entorn per dir quin settings hem de fer servir, l'script manage.py ja se n'encarrega.
- El comandament quedarà lligat a l'aplicació. Per tant podem crear comandaments que depenguin d'una aplicació concreta i que la complementin.
- Podem accedir a l'ajuda del comandament si l'hem definida. Permet a l'usuari saber com ha de fer servir la comanda.
Podem crear tres tipus de comandament a mida, que trobam definits dins django.core.management.base
-
Comandaments que hereten de
AppCommandi que poden prendre com a paràmetre una llista d'aplicacions Django. -
Comandaments que hereten de
LabelCommandque poden prendre com a argument qualsevol cadena de text. -
Comandaments que hereten de
NoArgsCommandi que no prenen paràmetres.
Si anau a la documentació oficial de Django veureu que el que hi ha és més aviat poc. Potser perquè quan ja saps com és fa pareix tan fàcil que potser no mereix l'esforç. Tot i això, crec que és una opció prou útil i que hauria de tenir més importància a la documentació.
Afortunadament hi ha al manco dos articles prou bons que ens ajuden amb exemples a treure partit d'aquesta funcionalitat. Si anam al codi font comprovarem que tot està força documentat, però la realitat és que encara que a partir de la versió 1 fer aquests tipus de coses s'ha convertit en trivial, en versions anteriors no ho era.
Aquest apunt té per objectius fer publicitat d'aquesta funcionalitat, podeu trobar més informació al codi font de Django i als següents apunts:
i exemples tant al codi font de Django com a django-extensions .
Fes-hi una ullada, després de tot, fer un hello world d'aquesta manera és prou senzill:
1 2 3 4 5 6 | from django.core.management.base import NoArgsCommand class Command(NoAgrsCommand): help ="prints hello world" def handle_app(self, app, **options): print "Hello world" |
Per provar-ho creau un paquet python anomenat management dins la vostra aplicació Django, i dins aquest paquet un altre anomenat commands. Dins aquest hi posaríem els nostres scripts. Per exemple si la nostra aplicació es diu uep i volem crear un comandament que es cridi com python manage.py hello hauríem de crear una estructura com:
uep/
__init__.py
models.py
management/
__init__.py
commands/
___init__.py
hello.py
Els noms dels comandament poden col·lisionar, així que o bé tenim noms prou especials o bé convé prefixar-los amb el nom de la nostra aplicació per tal de tenir una oportunitat més.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Enmig d'aquest silenci
Escrit per Aaloy a 25 de April , 2009 a les 11:49 a.m.
El amics de No diguis dois han tret nou disc, el segon ja, anomenat Enmig d'aquest silenci.
Mentre posam la web definitiva per ara el domini apunta al Facebook, en poder he de recuperar el projecte i penjar les lletres i demés.
Encara no els he pogut convèncer de que publiquin en Creative Commons, però no perd l'esperança, potser el proper disc?
Des d'aquí donar-los l'enhorabona pel disc i per l'empenta que tenen. Esper que faceu molts bolos aquest estiu! :)
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: General
Visor de logs amb Django
Escrit per Aaloy a 22 de April , 2009 a les 8:53 p.m.
L'altra dia em vaig trobar amb la necessitat de mostrar els logs de l'aplicació a la plana web que estava desenvolupant.
Per anar bé, els logs han de ser dinàmics, és a dir, la plana ha de refrescar-se segons apareguin noves línies de log (i això vol dir Ajax). La idea és tenir quelcom com el tail -n 100 f ... del Linux. Per la naturalesa de les peticions Http, no podem arribar a tenir la funcionalitat del tail, però podem atracar-nos-hi un poc. Aquest article explica com ho podem fer utilitzant Django, Python i jQuery.
El javascript
La part del navegador ha de refrescar-se automàticament i sols el tros que correspongui a la visualització dels logs. A cada refresc haurà de cridar al servidor, obtenir la informació del log i presentar-la.
Per aconseguir això utilitzarem Jquery i un afegitó anomenat Timers. Aquest plugin ens permet definir de manera una funció que s'executarà cada x milisegons fins que l'aturem o tanquem el navegador.
El temps de refresc dependrà de la nostra aplicació, i el truc està en donar-li un temps un poc menor que la velocitat a la que la nostra aplicació genera les línies de log. No fa falta mirar-s'hi gaire, sols és per donar una major sensació d'actualització en temps real i que es mostri la informació línia a línia. Si li donam un temps major farem menys peticions i la presentació del log potser es faci per blocs de línies.
També necessitarem fer una cridada Ajax al servidor per a que ens doni les línies de log. Això ho podem fer directament amb jQuery, amb la funció jQuery.ajax per exemple. Veurem que a més del text del log necessitam la darrera posició llegida, així que farem servir el getJSon, que ens permetrà obtenir la informació de manera més estructurada.
El servidor
Per simular el tail farem un poc de trampa. La primera vegada que es faci la petició ens situarem al final del fitxer de log i la segona ja enviarem la informació. És a dir, mostram al informació a partir de la segona vegada que es crida la funció. Com que el temps es suposa que és petit no té massa importància i simplifica molt la programació. Hem de tenir en compte que l'obtenció de log ha de ser ràpida.
Per a posicionar-nos farem servir la funció seek i tell ens donarà la posició resultant una vegada llegit el fitxer. Aquesta posició és la que anirem passant a cada petició, de manera que quan tornem a llegir el log, ho farem a partir de la darrera posició llegida. A l'exemple a més he fet servir la funció reverse per tal d'ordenar la llista de línies llegides de més nova a més antiga i simular l'scroll.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | from django.http import HttpResponse from django.utils import simplejson def _tail(f, actual = 0): """ Returns a tuple with the actual position on the file and the last read lines in html format. """ text ="" if actual == 0: f.seek(0, 2) else: f.seek(actual) log = f.readlines() if log: log.reverse() text = "<br/>".join(log) return f.tell(), text def tail(request): "Tail simulation" f = open('sample.log', 'rU') pos = int(request.GET['pos']) pos, msg = _tail(f, actual= pos ) f.close() data = {'msg': msg, 'pos' : pos } return HttpResponse(simplejson.dumps(data)) |
Fixem-nos que el que tornam és una estructura json, creada a partir d'un diccionar Python mitjançant el simplejson.
A més consumim la posició del fitxer des de la que hem de començar a llegir, que vindrà donada pel paràmetre get. No he posat validacions ni tractament d'excepcions, ho deix com a exercici per al lector (això sempre queda bé dir-ho quan un no té massa ganes de fer feina :-P )
Amb el que ara veim del codi de servidor, el codi javascript ja és entenidor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <script type="text/javascript"> $(function() { var pos = 0; var demos = $("div.wrapper div.demos"); var active = false; $('#log').ajaxStart(function(){$('#loading').show()}); $('#log').ajaxStop(function(){$('#loading').hide()}); $('.controlled-interval', demos). find('.start').css("cursor", "pointer").click(function() { if (!active) { active = !active; $('#log').everyTime(1000, 'controlled', function() { $.getJSON( "/log/tail/?pos="+pos, function(data) { if (data.msg !=''){ $("#log").prepend(data.msg+'<br/>'); } pos = data.pos; } ) }); } }).end().find('.stop').css("cursor", "pointer").click(function() { if (active) { active = !active; $(this).parents("div"). find('#log').stopTime('controlled'); } }); }); </script> |
Qui fa la feina és $('#log').everyTime(1000, 'controlled', function() qui es que manté el timer. Cada vegada que passa un segon (1000 ms) es crida al la funció del servidor amb la posició que acabam de llegir. El primer cop no tenim aquesta posició i la inicialitzam a zero, d'aquí que necessitem dues cridades a la funció per obtenir el primer log.
Notem com és de simple manipular el json a Javascritp. data té el text que hem d'escriure i la darrera posició de l'arxiu. Si el text està en blanc simplement ens limitam a actualitzar la posició; si hi ha contingut el posarem dins del div amb identificador log que tenim definit dins la plana.
S'hi pot fer molta més: posar-hi més disseny, podríem fer que es retornàs ja informació la primera vegada que es crida, tenir un reset per a que cuan continua el log sols venguin les darreres línies i no tot el bloc, però la idea és la mateixa:
- fer servir un timer
- fer servir ajax enviant la darrera posició on hem arribat
- fer servir seek i tell per posicionar-nos dins l'arxiu
Com és habitual l'exemple ho podeu davallar d'appfusedjango, o directament un svn co http://code.google.com/p/appfusedjango/source/browse/#svn/trunk/tail
Hi trobareu també una petita utilitat anomenada generate_log.py executant-la en una consola escriu línies de text que poden ser llegides per l'exemple.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Fer massa bona feina
Escrit per Aaloy a 22 de April , 2009 a les 12:03 a.m.
Que amb les eines que et proporciona Django i un ganes de fer les coses bé, seguint els estàndards i fent les webs semàntiques s'obtenen bons resultats de posicionament és una cosa que puc comprovar dia rere dia.
La darrera ha estat una petició d'una de les seccions de l'empresa per a que féssim alguna cosa amb un micro-site que havíem llançat feia uns dies, ja que quan cerques pel nom del client al Google surt el nostre micro-site enlloc de la plana web de la marca principal.
Explicació: la plana principal del client està desactualitzada, té una relació de pes de la plana front continguts nefasta i està maquetada fent servir taules.
Per una part estic content perquè veig que en el que fa a posicionament i indexabilitat feim les coses prou bé, i per altra banda estic sorprès i fins i tot amoinat per la petició de "fer alguna cosa", que demostra una falta de fonaments en una gent que demana aquest tipus de coses.
Per al que tothom seria un avantatge competitiu: sortir el primer a Google, l'han convertit en una altra manera de dir que no fas bé la teva feina. Encara me fa mal la llengua.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Traduccions automàtiques
Escrit per Aaloy a 20 de April , 2009 a les 11:15 a.m.
De tant en tant vaig jugant amb el tema de les traduccions automàtiques, m'atreu molt el camp per la seva utilitat, complexitat tecnològica i sobre tot pel que significa a l'hora d'atracar el coneixement i la informació a tothom sense obligar al qui escriu a expressar-se en una altra llengua.
Fins ara els meus dos referents en traducció automàtica eren el motor que fa servir la Generalitat de Catalunya i Internostrum, desenvolupat per la Universitat d'Alacant.
En un d'aquests experiments he arribat al projecte Apertium, un sistema de codi obert per a la traducció automàtica de documents.
Pel que llegeixo està basat en el codi d'Internostrum i està liderat també la Universitat d'Alacant. El que més m'ha agradat però, és veure com universitats, govern i altres organismes s'uneixen per al finançament d'un projecte de codi obert del qual tothom en port sortir beneficiat. La gent que fa investigació pot tornar a la societat el resultats de la seva investigació i al mateix temps els usuaris podem implicar-nos en el projecte, encara que sigui de beta-testers.
He posat l'enllaç de les traduccions al blog. M'ha impressionat la qualitat de les traduccions que aconsegueix el motor. Estaria molt bé poder-li dir dins el codi html que hi ha parts que no ha de traduir, però tot i això, els resultats crec que parlen per si sols.
Gent d'Apertium la meva enhorabona i moltes gràcies pel vostre esforç!
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Carregant imatges
Escrit per Aaloy a 19 de April , 2009 a les 11:35 p.m.
Normalment quan treballam amb imatges amb Django ho feim des del punt de vista de disseny, és a dir, posam les imatges al directori on s'han de servir i per avall. Potser a vegades hem fer servir quelcom com el Django Photologue per a tenir les fotografies més estructurades dins la nostra aplicació.
Què passa però, si el que volem és carregar les fotografies des d'un script a la nostra base de dades, o quan ens trobam que la informació no ve pels canals habituals d'una imatge que es puja mitjançant un formulari.
Aquest és el cas que tractarem en aquest apunt. Tenim una imatge que ens arriba codificada en base64 i el que volem és afegir-la amb un petit comentari a la nostra aplicació.
El model que farem servir és tan senzill com això:
1 2 3 4 5 | from django.db import models class Photo (models.Model): image = models.ImageField(upload_to='photos') comments = models.TextField() |
La imatge ens ha arribat com a una cadena de text. El contingut ho podeu trobar al subversion del projecte appfusedjango.
El primer que hem de fer es decodificar la imatge, després crearem una instància de la classe Photo, li assignarem el contingut, el comentari i guardarem. Fins aquí supòs que tothom d'acord.
El problema, però, és que ImageField suposa que li passarem una objecte del tipus File i nosaltres el que tenim és una cadena de text. Necessitarem per tant simular aquest tipus de dada de manera que puguem tractar amb informació que no vengui directament d'un fitxer de text. Ni més ni manco el ContentFile. Aquesta classe que podem trobar a django.core.files.base el que fa és precisament això.
Una altra de les coses que hem de fer és guardar la imatge i assignar-li el nom. Per fer això haurem de crear el nostre objecte Photo, guardar la imatge i després guardar-ho tot a la base de dades.
Anem a veure com quedaria:
>>>import base64 >>>from django.core.files.base import ContentFile >>>from sample.models import Photo >>># ja tenim tot el necessari >>>raw_data = base64.b64decode(open('test/encoded_logo.b64').read()) >>># acabam de llegir les dades, podrien arribar directament >>>foto = Photo() >>>foto.image.save('the-image-name.gif', ContentFile(raw_data)) >>>foto.comments = "Django & Python rules!" >>>foto.save()
El pas del 'image.save' és necessari perquè Django no guarda les imatges per defecte dins la base de dades sinó al sistema de fitxer (de fet podem guardar-ho allà on ens vengui de gust gràcies a les possibilitats del custom storage) així que necessitam definir tant el nom de la imatge com les dades. A la definició del camp ImageField ja li hem dit que voliem deixar les imatges a la carpeta photos que estarà dins el directori que tinguem definit com el nostre MEDIA_ROOT.
El projecte que he pujat serveix per demostrar la idea. Per provar-ho basta fer un
$ python manage.py shell
des del directori del projecte imatges per a convèncer-vos que la cosa funciona veient com es van creant les imatges dins la carpeta media/photos/ del projecte.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Nou ressaltat de sintaxis pel blog
Escrit per Aaloy a 11 de April , 2009 a les 5:24 p.m.
Fins ara Trespams tenia un ressaltat de sintaxi basat en Javascript, el que feia que no resultàs molt natural escriure apunts amb molt de codi font, ja que significava tenir que posar codi html dins el markdown per tal de marcar aquell tros de codi com a ressaltable pel Javascript.
Com a part de les modificacions he canviat això pel ressaltat basat en Pygments.
Aquest plugin permet fer servir tota la potència de Pygments per al ressaltat, podem resaltar HTML, plantilles Django, Javascript, Java, gairebé qualsevol cosa, i a més fent servir una sintaxi molt més natural, basta afegir un SheBang típic de Unix per a indicar el llenguatge.
La implementació està pensada per a no generar el codi HTML des de Markdown cada vegada, sinó que es guarden dues versions, una amb el codi original i l'altra amb el codi convertit a HTML i ja renderitzat amb els plugins. Això fa que el guardar l'apunt sigui un poc més lent (ha de convertir, reindexar i guardar) però la plana es pot mostrar molt més ràpidament. Optimització prematura? Potser sí, però tanmateix és d'aquelles coses que consideraria una millor pràctica.
El canvi fa que el codi antic no aparegui ressaltat, a poc a poc ho aniré canviant així com vagi revisant els apunts. El que no fa (crec) és trencar res, manté el codi dins un <pre> però no ho ressalta.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Django regroup
Escrit per Aaloy a 10 de April , 2009 a les 7:36 p.m.
He fet quatre cosetes al programari del blog, per tal de mirar de passar al màxim la validació del w3c, encara tenc problemes amb els pre que em genera el markdown dins paràgrefs i que no passen la validació, però al manco ara la plana es veu prou bé amb Konqueror.
Fent neteja m'he trobat amb la necessitat de refer la jerarquia de l'històric d'apunts. No era gens neta i com que ara el blog té un menú prou potent, he decidit posar molta cosa que estava al lateral com a opció del desplegable.
Per fer la jerarquia d'articles el que es ja el primer de tot és obtenir la llista d'arxius. Això ho feim cridant un tag creat ad-hoc pel blog
{% get_yearly_archive as archive_list %}
que el que fa és executar
Entry.objects.current_active().dates('pub_date', 'month', order='DESC')
i posar-ho a una variable que pot ser usada a la plantilla.
Amb aquest tag obtenim la llista de mesos en els que hi hem fet apunts. Un element d'aquest llista és per exemple:
datetime.datetime(2008, 2, 1, 0, 0)
Com podem veure és un tipus datetime de python i com a tal podem obtenir-ne fàcilment l'any objecte.year o el mes objecte.month.
El que volem, com dic, és fer una jerarquia, és a dir, tenir una cosa com:
- 2009
- Abril 2009
- Març 2009
- 2008
- Desembre 2008
Això normalment duria força feina, però és aquí quan hom veu que Django està pensat per als reptes de la vida real, ja ve amb un template tag predefinit que ens permet fer agrupacions, el regroup
Donada una llista ordenada regroup ens crea una estructura de dades que contindrà els elements pels quals volem fer el grup i dins aquests els element de la llista que tenen aquest element.
En el nostre cas hem posat l'historial dins una variable anomenada archive_list, que recordem és una llista de datetime. Farem
{% regroup archive_list by year as historial_list %}
Amb això hem creat la nostra estructura de dades. Fixem-nos que l'exemple que duu la documentació de Django diu que regroup té com a paràmetre una llista de diccionaris. És part de la gràcia del tipat feble, pel que fa al funcionament de la funció l'estructura datetime es comporta com espera l'iterador groupby que és el que fa servir internament.
Podem simular-ho perfectament a la consola de iPython
1 2 3 4 5 | >In [43]: p = itertools.groupby (x, lambda z: z.year) >In [44]: for i in p: > ....: print i[0] > ....: for j in i[1]: > ....: print j |
Ja tenim l'estructura de dades, així que ara sols quedar recorre i presentar la informació tal com la volem. Per això cal tenir en compte que la nostra estructura defineix la variable grouper que fa referència al valor del camp pel qual estam fent l'agrupació
1 2 3 4 5 6 7 8 9 10 11 12 | {% for year in historial_list %} <li><span class="dir">{{year.grouper }}</span> <ul> {% for d in year.list %} <li><a href='{% setting "BLOG_ROOT" %} {{ year.grouper }}/{{d|date:"m" }}/' class='menu_content'> {{ d|date:"M Y" }}</a> </li> {% endfor %} </ul> </li> {% endfor %} |
Com és habitual, és més llarg d'explicar que de fer.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Ubuntu 9.04 per PPC
Escrit per Aaloy a 09 de April , 2009 a les 2:59 p.m.
Entre robiol i robiol (ja veus no sóc de panades!) em vaig posar a actualitzar el PPC. Volia ser conservador i anar cap a la versió 8.10 d'Ubuntu, però com sempre el PPC ha resultat ser una capsa de sorpreses.
L'actualització em va deixar amb un sistema on el xinerama no funcionava, gairebé sense dreceres de teclat, el kded ben mort i un refresc de pantalla desesperant. Ni reconfigurant pantalla ni res, massa dependències a resoldre i tot plegat un desgavell.
Mentre amb el portàtil davallava la imatge per tornar-ho a deixar tot estable, vaig pensar en la dita de from the lost to the river que traduït del bilingüe al català, ve a dir alguna cosa així com tanmateix ja ballam i vaig posar a fer up
sudo update-manager -d
Quatre hores o cinc després ja ho tenia tot llest. El resultat és que estic escrivint aquest apunt des de el Gnome amb Xinerama funcionant i configurat des de l'entorn gràfic.
La mala notícia: que sols funciona el Gnome, l'entorn Kde no fa el refresc de pantalla bé i tampoc configura el Xinerama. El darrer no em preocupa gaire, estava dispost a prescindir del Xinerama, però els problemes fan que el Firefox sigui completament inusable, els quadres d'entrada de dades apareixen en negre.
En altre aspecte dir que aquesta versió (al manco per PPC i amb el Gnome) dóna tota la sensació de ser més ràpida que l'anterior. Així que ara per ara toca tonar a Gnome una temporadeta. Tanmateix també és un magnífic entorn.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Linux
Aigua d'abril
Escrit per Aaloy a 07 de April , 2009 a les 8:12 p.m.
Avui aprofitant que plou convendria que més d'un deixàs a casa el paraigües i és fes una bona remullada, a veure si li fa profit.
Podrien començar els defensors del bilingüisme hipòcrites que diuen bilingüisme quan realment volen dir monolingüisme castellà, fent que cada cop més ens trobem discriminats en la nostra terra i en la nostra cultura.
Pareix que també li faria profit al senyor Zapatero, ja que pareix que d'aigua d'abril potser no n'està sobrat si ens hem de fixar en alguns anomenaments recents.
Mentre l'aigua cau per tothom seguiré demanant-me el perquè quan es volen tapar altres problemes, els mateixos de sempre tornen a fer bandera d'un problema que no és tal, i en el perquè hi ha gent que els hi fa el joc.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: General
Comentaris funcionant (esper)!
Escrit per Aaloy a 04 de April , 2009 a les 12:26 a.m.
Gràcies a Hugo me n'he assabentat que la darrera actualització del blog havia fet malbé el sistema de comentaris.
He pujat una nova versió sense el codi de depuració que feia que els comentaris no es poguessin processar ja que hi havia un punt de ruptura :(
Bé, res greu, coses de les actualitzacions a les males hores del vespre. En Pau també m'ha passat una incidència amb la visualizació del calendari amb Firefox 3.5. Pau, d'això se'n diu viure al límit!
Encara he de netejar molts divs innecessaris de l'anterior disseny. Vull jugar també amb algunes APIs de llocs socials i integrar-les, una de les primeres segurament serà la de Delicius.
Com que a mi també m'agrada viure perillosament estic aprofitant l'edició del blog per provar les versions de desenvolupament de Netbeans per Python. Estic tirant de les construccions del Hudson i provant-ho damunt el PowerPC.
No puc comparar-ho amb l'Eclipse perquè tanmateix damunt el PowerPC com ja he contat l'Eclipse no va gens bé, així que ja no hi ha comparació possible.
Res, que si algú s'anima a posar un comentari donaré per tancat el bug!
Traducciones/Translations by apertium
8 comentaris, 0 trackbacks (URL) , Tags: Python Django
Nou disseny
Escrit per Aaloy a 01 de April , 2009 a les 11:02 p.m.
Bé, dir nou disseny a la nova imatge de Trespams no és dir molt. Ni tan sols diria que és un disseny :-P
Però bé, la idea és anar cap a un disseny molt més minimalista que l'anterior, on sigui un poc més bo de fer afegir coses sense tenir que preocupar-se per si destroçarà massa cosa o no.
Encara queda fer molta neteja, però ara aquest blog té un disseny mínim: el que ve de fàbrica amb blueprincss i sols hi ha alguns retocs per deixar les coses un poc més col·locades i accessibles.
Els menús estan manllevats de Free CSS Drop-Down Menu Framework amb algunes petites adaptacions al css per a que es pugui servir des de un directori distint a l'original.
Es podria dir que estic refactoritzant el blog. Per ara el que vull és anar fent neteja i que tot funcioni igual que abans. Després quedarà llevar les parts que ja no es fan servir, per acabar anar afegint el nou.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Python més ràpid
Escrit per Aaloy a 28 de March , 2009 a les 11:42 a.m.
En Miquel ahir em va fer un enllàc vist pel Menéame. Reseguint la cadena d'enllaços arribam al projecte unladen-swallow.
El projecte és força interessant, i si segons diuen tenen per objectiu augmentar la velocitat d'execució de Python fins a cinc vegades vol dir que li haurem de tenir esment. Tot i que el projecte no arribi a bon port, de bon segur que les contribucions que pot fer a la base de codi de Python seran important. Recordem que Google té en plantilla a Guido Van Rossum el "pare" i dictador benèvol de per vida de Python.
La cosa està, però en no caure en el parany de dir que com que s'està treballant en la velocitat d'execució de Python aquest és un intèrpret lent. En quant a velocitats d'execució el que ha de primar sempre és el fet de si el compilador o intèrpret és prou ràpid per la feina. Si sols miram la velocitat segurament encara acabaríem fent les coses en Assembler, però la cosa està en que normalment el punt crític en quant a l'execució no està tant en el compilador o intèrpret, sinó en l'algorisme que feim servir.
Escriure un bon algorisme està directament relacionat amb la capacitat del programador, per suposat, però el llenguatge també hi intervé. Un llenguatge mal d'escriure, mal de depurar fa molt més difícil programar algorismes òptims, ja que el programador no sols s'ha de concentrar en el què vol fer, sinó que també ha de pensar en com ho ha de fer amb les eines que té.
Un dels grans avantatges de Python és que ens permet concentrar-nos en el que volem fer més que en el com. El llenguatge flueix de manera natural, la relació entre línies de codi i funcionalitat és molt baixa, de manera que aconseguim molt amb molt poques línies, però a més, aquestes tenen una expressivitat que fa fàcil saber que estam fent.
Per una altra banda Python també ens ofereix una gran quantitat d'eines per enllaçar amb programes i llibreries de C, o eines com Cython que fan que fer extensions en C per Python sigui molt semblant a programar en Python mateix. La programació numèrica és un altre dels camps on Python brilla, permet tenir tota l'expressivitat del llenguatge a l'hora de dir el que s'ha de fer i delegar la feina a les llibreries específiques de C.
Esper que el projecte tengui molt d'èxit i que aviat en puguem veure els fruits, però pensau que escriure codi lent es pot fer en qualsevol llenguatge de programació.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Trucs de l'administrador de Django
Escrit per Aaloy a 19 de March , 2009 a les 11:50 p.m.
Encara que a la documentació de l'administrador ho diu, sovint estam tan acostumats a fer feina amb camps que ens oblidam que al list_display de l'admin de Django hi podem fer servir qualsevol atribut o mètode susceptible de ser cridat (entre d'altres opcions).
Això obre tot un món de possibilitats a l'hora de presentar informació en forma tabular dins l'admin, podem crear enllaços cap a altres seccions, mostrar imatges, el que se'ns pugui ocorre i que tengui algun tipus de lligam amb el model.
Un exemple ben senzill, suposem que tenim un model que té una imatge associada, el que voldríem és que a la informació ens aparegui aquesta imatge, llavors faríem:
Al model afegim
1 2 3 4 5 6 7 | def get_foto(self): if self.foto: return '<img src="%s" width="64">' % self.foto.url else: return "" get_foto.allow_tags = True get_foto.short_description = 'Foto' |
i a l'admin.py afegirem a la configuració de l'administrador del nostre model
1 | list_display = ('get_foto', ...) |
Podem complicar-ho tant com vulguem, un exemple ho tenim al Django Snippet d'Admin list Thumbnail, que complica la funció per a crear les miniatures de les imatges que es presentaran i disminuir així el pes de la plana.
El que és important d'aquest exemple és veure l'ús que es fa de allow_tags, si el mètode té aquesta propietat Django no escaparà l'html que li passem, donant-nos joc a presentar tot tipus de codi html, baix la nostra responsabilitat, clar.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Fent net
Escrit per Aaloy a 19 de March , 2009 a les 6:52 p.m.
Una de les primeres coses que estic fent al Blog és la part de neteja. El codi és heretat de Blogmaker i hi ha molta cosa que amb les noves versions de Django es pot fer d'una altra manera o senzillament que es pot fer quan abans no es podia.
Ara la part d'administració de Django es pot personalitzar bastant, no és per tirar coets i normalment si s'han de fer coses complexes preferesc crear un backoffice ad-hoc, però pel que és redactar un apunt ja va prou bé.
Això m'ha permès eliminar força codi relacionat amb la part de presentació dels apunts i l'edició. Com que estic fent servir Markdown per a l'edició dels apunts he posat un editor anomenat Markitup, que permet tenir un entorn més amigable per a l'edició de Markdown i personalitzar les accions.
Per posar el codi dins l'administrador ha estat senzill. Amb la versió 1.0 Django va separar la part de vissualtizació i edició del model, amb la qual cosa podem definir com s'editarà el nostre model mitjançant un objecte que hereda de admin.ModelAdmin. Un dels aspectes més interessants és que podem afegir arxius Javascript i css, de manera que afegir el javascript necessari per fer servir l'editor de Markitup enlloc del simple text area ha estat cods de fer
class Media:
"Javascript configuration for Entry model in Admin"
js = [(settings.BLOG_MEDIA_PREFIX + 'js/jquery.js'),
(settings.BLOG_MEDIA_PREFIX + 'js/entry_change_form.js'),
(settings.BLOG_MEDIA_PREFIX + 'js/markitup/jquery.markitup.pack.js'),
(settings.BLOG_MEDIA_PREFIX + 'js/markitup/sets/markdown/set.js'),
(settings.BLOG_MEDIA_PREFIX + 'js/editor.js')
]
css = { 'screen': (
(settings.BLOG_MEDIA_PREFIX +
"js/markitup/skins/markitup/style.css"),
(settings.BLOG_MEDIA_PREFIX +
"js/markitup/sets/markdown/style.css") )
}
A fer dissabte s'ha dit!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Nova versió del blog de Trespams
Escrit per Aaloy a 18 de March , 2009 a les 10:56 p.m.
Avui hem posat en producció (beta total) una nova versió del programari que fa que aquest blog pugui llegir-se. Això potser ho haureu notat els que feis servir l'Akregator, ja que els fils RSS us apareixeran duplicats (al manco a mi me passa), em sap greu.
Les novetats són sobretot en la part tècnica: nou cercador, més javascript en la part d'administració i l'execució baix un entorn virtualenv que permetrà fer-ne actualitzacions de manera separada de la resta d'aplicacions Django del servidor.
Aniré escrivint damunt les millores així com tengui temps. Aquest apunt és sols per avisar que Trespams està en beta i que si peta miserablement i m'ho voleu fer saber us estaré agraït.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Llibreries per a la manipulació de Dates
Escrit per Aaloy a 13 de March , 2009 a les 5:44 p.m.
Aquests dies m'ha tornat a pegar per a fer feina al Blog. En Bernat m'ha creat un virtualenv al servidor i ho aprofit per anar fent-hi quatre coses.
L'aspecte gràfic no canviarà per ara, si ho fa serà per convertir-se en més minimalista encara, el que sí canviarà és la part interna i les eines d'administració.
Fent feina amb l'administració m'he topat amb la necessitat de manipular dates amb Javascript. La llibreria Javascript que he posat per a gestionar taules Datatables(per l´unic motiu que tenia ganes de provar-la) no gestiona bé formats que no siguin el de Date de javascript, molt anglosaxó, ell.
Per arreglar-ho vaig tirar d'una llibreria de Javascript que ens permet manipular dates i formats de la manera que vulguem, i això m'ha fet recordar la conveniència de deixar per escrit un grapat de llibreries de manipulació de dates que extenen les que ja tenen els meus llenguatges de programació preferits:
Datejs Magnífica llibreria per a javascript. La versió "estable" es un poc antiga però fa el que ha de fer i també hi ha la del subversion, que encara no he provat, però que serà el que faré quan acabi aquest apunt. Un petit emperò, no sé que fa, però me deixa el Firebug torrat i ben torrat, necessita gairebé cinc minuts per tornar en sí.
python-dateutil s'està convertint en una referència obligada per a la manipulación de dates en Python, i això que Python de per sí ja ho fa fàcil.
python-egenix-mxdatetime un vell conegut per als qui hem tractat amb bases de dates amb Python. És la llibreria recomanada per la seva potència i rapidesa. L'anterior potser té la novetat i la senzillesa però la llibreria d'Egenix té la solvència que dóna l'edat.
Joda Time l'equivalent Java de les llibreries anteriors. Forma part de les llibreries que sempre posa a qualsevol projecte Java.
Abans de reinventar la roda (o el calendari) no oblideu fer una ullada a aquestes llibreries.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Java
Repetiu amb mi: KISS
Escrit per Aaloy a 08 de March , 2009 a les 10:35 a.m.
El principi KISS és una d'aquelles regles fonamentals en la programació i gestió de projectes. Ens diu que hem de procurar que el nostre producte, codi, projecte es mantengui el més simple possible, però contràriament al que algú es pugui pensar, això no implica pèrdua de potencia o funcionalitat, ben al contrari.
Fer les coses simples implica aturar-se a pensar en el que un està fent, demanar-se si hi ha una manera més neta de fer-ho, una manera més senzilla, i si hi és aplicar-la, està doncs molt relacionat amb un terme fonamental en la programació: la refactorització.
El problema doncs és adonar-nos de quan estam complicant les coses de manera innecessària i per això és necessari tenir la ment oberta, ja que sovint estam tan aprop del nostre propi codi que ens costa tenir la perspectiva suficient com per veure que el que estam fent es pot fer d'una altra manera.
Una de les maneres més efectives és intentar explicar a algú com funciona, com ho hem fet. Explicar implica recapitular, tornar a pensar en el que hem fet i encara que el nostre interlocutor no faci "carusses" potser ens trobarem reflexionant damunt la complexitat del que estam dient.
Una altra bona opció és documentar, l'aplicació , el codi. Quan documentam l'aplicació es fa una cosa semblant a l'explicació i té el mateix resultat, quan documentam el codi i ho rellegim ens podem adonar de la seva complexitat: si la documentació ha d'explicar com es fa en lloc de què fa el codi, segur que ens hem botat la regla KISS.
Si hi ha alguna cosa en aquest món que compleix el segon principi de la termodinàmica és el codi i els programes. Esforçar-se en fer les coses de la manera més simple ens proporciona un punt de partida que ens permetrà allargar la vida del codi i disminuir-ne el temps de manteniment. Hem de tenir clar que l'entropia és una força de l'univers, no podem guanyar, però podem fer que el desastre arribi més tard.
Però la regla KISS no s'aplica sols al codi, l'hem d'aplicar també als projectes i també se l'haurien de fer seva els usuaris. Mantenir un projecte simple implica fugir de funcionalitats innecessàries, saber quan hem d'aturar i limitar l'abast del projecte. Per això també ens serà d'ajuda un altre acrònim: MOSCOW. La simplicitat al projectes és doncs poder destriar bé el gra de la palla, el que és necessari i el que no.
Els programadors tenim tendència a afegir funcionalitat "per si un cas", codi que no sabem si s'utilitzarà mai, i que potser el que estigui fent és limitar-nos en el futur. Potser l'allau de funcionalitats és quelcom que fa vendre el producte, quantes vegades hem vist com es llancen versions noves de programari que mantenen els mateixos errors però amb noves funcionalitats! Però en el programari desenvolupat per ser utilitzat per l'empresa, mantenir-se dins del necessari implica menor cost inicial i menor cost de depuració i manteniment.
De fet, quan s'ha de pressupostar el cost d'un projecte es distingeix entre projectes que s'utilitzaran sols a l'empresa dels projectes que s'han de distribuir massivament. Els segons tenen un cost molt més elevat, ja que tenim la necessitat d'una depuració més exhaustiva i també perquè sabem que aniran carregats de funcionalitats sols necessàries per a vendre el producte.
Sovint quan desenvolupant programari d'ús intern caiem en el parany de voler tractar-ho com si fos programari de venda comercial. El programari que desenvolupam per al client intern ja el tenim venut, no hi ha d'haver un marketing basat en les n-mil característiques que fa més respecte la competència, sinó en la funcionalitat que dóna, en la diferència de cost o de control que ens dóna fer les coses amb el nou programari en lloc de fer-ho com es feia abans. Això vol dir, concentrar-se en el fonamental, mantenir el programa simple i funcional des del principi, ja que amb l'us segur que s'anirà complicant, no ho compliquem de sortida.
A la gent que ens comana el projecte els hauríem de fer partíceps de la regla KISS, fer-los conscients de la importància de separar l'essencial de l'accessori, del cost que suposa complicar innecessàriament les coses.
Fer les coses simples és molt complicat, no hi ha dubte, és més senzill fer-les complexes sense pensar en les conseqüències, però llavors voldrà dir que no estam fent bé la nostra feina.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes
Validació de formularis amb Ajax, jQuery i Django
Escrit per Aaloy a 01 de March , 2009 a les 2:37 p.m.
Validació Ajax amb Django
A un dels projectes que estam fent el client va demanar una funcionalitat que requeria que s'enviàs un formulari al servidor i se'n fessin les validacions, però que la plana no es tornàs a recarregar. Un treball per Ajax, se'ns dubte. El problema era que tal com funciona el mecanisme habitual de processament de formularis amb Django, es requereix que es torni a recarregar la plana.
Una opció podria ser la de fer tota la validació del formulari amb Javascript, però llavors tendríem el perill de que l'usuari desactivàs el Javascript al navegador i pogués enviar dades directament sense validar. Podría fer-se tot per duplicat, és a dir, fer la validació amb Javascript i també al servidor, però això va en contra de la norma DRY (Don't repeat yourself).
Així doncs el que volem és el següent:
Enviar el formulari per ajax, però que sigui també possible fer un POST normal.
El servidor ha de fer les validacions i la plana presentar el missatge d'error si hi ha problemes.
Primer sense javascript
El primer que hem de fer és veure que tot funciona abans de posar-hi el javascript, així que crearem la nostra aplicació, crearem el formulari i hi posarem les valicacions que vulguem.
Farem un formulari molt senzill, el típic formulari de contatcte, però ho aprofitarem per introduïr-hi una opció nova a Django 1.0: la personalització dels missatges de validació.
from django import forms class ContactForm(forms.Form): "Defines the login for as in the Django sample" subject = forms.CharField(label="subject: *", max_length=100) message = forms.CharField(label="Request", widget=forms.Textarea(attrs={'rows':'10', 'cols':'80'})) email = forms.EmailField(label = "Your email *", max_length=120, error_messages = {'required': u"No e-mail, no message"}) cc_myself = forms.BooleanField(required=False) def clean_message(self): "We wan't to verify that it containts some words" msg = self.cleaned_data['message'].strip() if len(msg.split(None)) >5: raise forms.ValidationError(u"Really? This is quite short for a message") return msg
La manera més ràpida de mostrar el formulari és quelcom com
<table>
<form action='.' method="POST">
{{form}}
<tr><td span="2"><input type="submit" value="send" name="enviar" /></td></tr>
</form>
</table>
Però té un problema, que no controlam on es posen els missatges d'error i nosaltres volem controlar-ho. En aquest cas, i per simplicitat, posarem tots els missatges d'error a la part superior de la pantalla. Així que hem de rescriure la plantilla per a que ho contempli.
El nostre formulari queda doncs com
{% if form.errors %}
{{ form.errors }}
{% endif %}
<table>
<form action='.' method="POST" >
<tr><td>{{form.subject.label}}<td>{{form.subject}}</td></tr>
<tr><td>{{form.message.label}}<td>{{form.message}}</td></tr>
<tr><td>{{form.email.label}}<td>{{form.email}}</td></tr>
<tr><td>{{form.cc_myself.label}}<td>{{form.cc_myself}}</td></tr>
<tr><td span="2"><input type="submit" value="send" name="enviar" /></td></tr>
</form>
</table>
És a dir, ara tenim exactament el que teníem abans (no us hi fixeu amb la maquetació), però ara si hi ha errors es presentaran a la part superior del formulari.
Concentrem-nos ara en la manera de presentar els errors. Com que la nostra idea és que es puguin mostrar els errors que venguin per Ajax, el que farem és no presentar-los així, sinó que els posarem dins un div i farem que aquest es presenti o no en funció de si hi ha errors.
{% block errors %}
<div class="errores" {% if not form.errors %} style="display: none" {% endif %} >
<p id="error_msg">
{{form.errors}}
</p>
</div>
{% endblock errors %}
Això a efectes pràctics és el mateix que el cas anterior, ja que com que si no
hi ha errors from.errors no mostrarà res. El que sí hi ha ja és
tota l'estructura que ens servirà per mostrar els errors dins l'arbre DOM de la
plana web.
I ara i afegim l'Ajax
Necessitam tres coses: enviar el formulari per ajax, que si hi ha errors de validació els puguem presentar i que si tot va bé es faci la redirecció cap a la plana que toqui.
Hi ha alguns projectes que volen fer aquest tipus de coses de manera més o manco genèrica, però ara per ara no n'hi ha cap que em convenci, així que millor ho feim a mà. Si més no us deixo alguns enllaços:
El que sí faré es manllevar codi d'aquests projectes per als nostres propòsits, especialment del Django Ajax Validation.
En concret, adaptam el codi que ens permet obtenir els errors i passar-los a una estructura json:
class LazyEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, Promise): return force_unicode(obj) return obj def validate(request, form, new_url=''): if form.is_valid(): data = { 'valid': True, 'url': new_url } else: if request.POST.getlist('fields'): fields = request.POST.getlist('fields') + ['__all__'] errors = dict([(key, val) for key, val in form.errors.iteritems() if key in fields]) else: errors = form.errors final_errors = {} for key, val in errors.iteritems(): if key == '__all__': final_errors['__all__'] = val if not isinstance(form.fields[key], forms.FileField): html_id = form.fields[key].widget.attrs.get('id') or form[key].auto_id html_id = form.fields[key].widget.id_for_label(html_id) final_errors[html_id] = val data = { 'valid': False, 'url': new_url, 'errors': final_errors, } json_serializer = LazyEncoder() return HttpResponse(json_serializer.encode(data), mimetype='application/json')
El validate és una funció prou genèrica, ens tornará una variable, valid que ens indicarà si hi ha errors de validació o no, la url on s'ha de redireccionar i la matriu d'errors.
Django ja posa al request una variable per indicar-nos si la petició s'ha fet per HttpRequest o no, request.is_ajax() això ens permetrà distingir com s'ha enviat el post i fer la validació d'una manera o altra
def index(request): redirect_url = '/thanks' if request.method == 'POST': contact_form = ContactForm(request.POST) if request.is_ajax(): return validate(contact_form, redirect_url) else: if contact_form.is_valid(): # do whatever you need as everything is valid return HttpResponseRedirect(redirect_url) else: contact_form = ContactForm() return render_to_response('index.html', {'form': contact_form})
El codi del view.py és d'allò més senzillet, sols feim que si la petició ve per post, tornam una cosa o altra en funció de si aquesta és una petició Ajax o si és una petició normal.
Fins ara no hem posat gens de javascript i tot segueix funcionant amb normalitat.
És temps de posar-ho les llibreries javascript. Ho farem amb jQuery, que és la que tenc més per mà, supòs que amb altres llibreries no hi ha d'haver cap problema, i a més faré server un plugin força bo per al tractament de formularis amb jQuery, el jQuery Form Plugin.
Com presentar els missatges, si s'han de presentar tots, els efectques que volguem, ja es cosa nostra. El json el que ens torna és l'identificador del camp i una matriu amb tots els errors que hi hagi. El procés que facem ja és cosa nostra.
$(document).ready(function(){
form_options = {
timeout: 3000,
dataType: 'json',
type: 'POST',
beforeSubmit: function(formData, jqForm, options) {
// you can add additional validation here and return
// false if it's not valid
jQuery('#boton').toggle();
},
success: function(responseJson, statusText) {
if (responseJson.valid) {
// redirect to hte new url
document.location.href = responseJson.url;
} else {
// create the error structure
var msg = ""
for (key in responseJson.errors) {
camp = key.split('_')[1];
msg = msg + camp+":"+responseJson.errors[key][0]+"<br/>";
}
$('#error_msg').html(msg+'<br/>');
$('.errores').show(100);
jQuery('#boton').toggle();
}
}
};
$('#testform').ajaxForm(form_options);
});
A l'exemple el que he fet és montar un missatge amb el primer error de cada camp sols a efectes demostratius, podeu fer el que us vengui millor: validar abans d'enviar, mostrar efectes als camps dels errors, mostrar un diàleg, sols estau limitats per la vostra imaginiació i el Javascript.
El codi complet de l'exemple l'he pujat al projecte appfusedjango
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Llibres a febrer de 2009
Escrit per Aaloy a 26 de February , 2009 a les 9:19 p.m.
Ahir em vàren arribar dos llibres nous:
- jQuery in Action de Bear Bibeault i Yehuda Katz, editorial Manning, ISBN 978-1933988351
- Django 1.0 Template Development de Scott Newman, editorial Packt Publishing, ISBN 978-1-847195-70-8
Pels títols ja sabeu de què van, així que com sempre us dic un poc el que esper de cada un i les primeres impresions:
JQuery in Action
De l'estil d'aquesta sèrie de Manning: bona edició i continguts interessants explicats correctament. Estic encara als primers capítols de la primera lectura ràpida i m'està agradant força. Al JQuery l'estic fent servir cada cop més i necessitava un llibre com aquest per poder-ne tenir una idea completa. Hi ha molta documentació del JQuery, però està prou dispersa com per a que un llibre com aquest tengui sentit.
Django 1.0 Template Development
Aquest ho vaig comprar perquè m'interessava veure com s'introduïa el tema del desenvolupament Django orientat a dissenyadors més que a programadors. Com sabeu sóc de la opinió que el dissenyador/maquetador ha de formar part activa dins un equip de programació web, amb el mateix nivell d'implicació que un analista/programador. Això vol dir fer anar un subversion, maquetar amb un editor de text com Eclipse o Netbeans i com no entendre com es poden fer servir les plantilles Django de la mateixa manera que es coneixen les possibilitats del CSS. La conclusió que en tenc per ara és: a poc a poc i amb molts exemples. Me pareix una bona aproximació i esper tenir l'oportunitat de posar-ho en pràctica. El llibre pot ser un bon material de referència per a propers cursos.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes Python Django
Django a l'empresa: liquidacions de despeses
Escrit per Aaloy a 22 de February , 2009 a les 6:57 p.m.
Aquesta setmana hem posat a preproducció una aplicació interna per a la gestió de les despeses feta amb Python, Django i Postgres. La idea és poder saber quines són les despeses més comuns per tal de fer-ne un seguiment i si s'escau poder fer una negociació amb els preoveïdors habituals.
Per això era necessari que les liquidacions de despeses que fins ara es feien amb un excel (quin mal fan els excels a les empreses!) es facin ara mitjançant una aplicació web. D'aquesta manera a la primera etapa l'usuari té exactament el que tenia abans, a saber, una fulla de paper que el seu cap pot signar i després presentar al caixer; però a més l'empresa començarà a tenir dades que es podran analitzar.
L'autentificació dels usuaris es fa contra l'Active Directory de l'empresa, en les darreres versions de Django és trivial canviar de sistema d'autentificació i han aparegut diferents snippets que ens permeten canviar el sistema d'autentificació estàndard per un altre. En el meu cas l'snipet d'autentificació per l'Active Directory ens ha anat força bé. De la mateixa manera seria trivial fer l'autentificació contra un LDAP o contra un altre sistema és força senzilla i la documentació de Django és molt aclaridora.
En aquesta aplicació a més de l'autenticació hem fet molta feina amb jQuery, hi ha moltes dades amb autocompletat (per les companyies aèries i pels aeroports per exemple), validacions, quadres de diàleg modals, etc. Es tractava de fer una aplicació el més àgil possible, però sense deixar de ser una plana web, per tal de no assustar massa als nostres usuaris. És una cosa en la que s'ha d'anar alerta, m'agrada molt l'article de Jefff Atwood Avoiding The Uncanny Valley of User Interface que explica el perquè es pot produïr un rebuig de l'usuari quan les coses volen ser massa paregudes al que ja coneix però sense arribar a ser-ho. En el nostre cas els usuaris conèixen les aplicacions d'escriptori i les interfícies de Forms i qui més qui manco sap fer anar un navegador web.
Podríem haver fet una aplicació RIA amb Extjs per exemple, però per molts dels usuaris que faran servir l'aplicació veurien que és una aplicació d'escriptori sense notar que s'executa al navegador. Per ells això implica complexitat, que algú en faci la formació individualitzada com es fa a les altres aplicacions. Massa cosa per el que ha d'esser una aplicació que té per objectiu imprimir un paper. Així doncs vàrem preferir que l'aplicació es semblàs a una plana web, amb formularis i enllaços, on el que s'imprimeix també és una plana web. Potser encara així algú trobarà l'aplicació complexe, però crec que ja serà per por i reticència al canvi més que per mor de l'aplicació en sí.
L'aplicació ha estat desenvolupada per un equip relativament nou en la programació Python i Django i tot i això s'ha pogut entregar en el temps previst (que ja considerava aquest fet per una altra banda). Això no fa més que refermar-me en el convencimient de que a més de la potència del llenguatge hem de considerar també la corba d'aprenentatge a l'hora de triar amb què farem el desenvolupament.
En aquest projecte i en els temps de crisi en que estam, encara em resulta sorprenent que hi hagi algú que es qüestioni si la base de dades en lloc de ser Postgres no hauria de ser Oracle. En aquests casos m'agradaria poder amollar allò de "It's about costs stupid!" i dedar-me tan ample. El que més em sobta és que s'amolla com si tu fossis el que has de justificar la decisió, quan realment hauria de ser a l'inrevessa. Per què fer una cosa damunt Oracle quan es pot fer amb Postgres (o Mysql)? Amb preocupa aquest tipus d'inèrcia informàtica, de curtor, que no s'atura a pensar en els costs actuals i futurs, tant és si hi ha al mateix moment algú d'Oracle demanant pel nombre de llicències. Sorprenent!
Però bé, és d'aquestes coses que acabes assumint com a comportament normal i que potser ni amb tota la pedagogia del món s'arribarà a res. Tenc l'esperança que aquesta crisi que vivim al manco servesqui per a que la gent es plantegi un poc la relació costs beneficis. Sols que s'aturi a pensar-ho un moment de ben segur que ja no caldrà el justificar el perquè s'ha anat cap a una solució de programari lliure. La part ètica? Què voleu que us digui, si la part econòmica ja costa (i estam parlant d'empreses!) imaginau-vos que pot arribar a costar que s'entengui el que representa el programari lliure en la vessant social i ètica.
I és una llàstima, perquè hi ha moltes empreses sortint de l'armari, que publiquen el codi que fan servir internament en forma de projectes lliures, de llibreries. El darrer exemple que se m'acud ve del Washington Times que ha obert un blog amb un bon conjunt de projectes Django o també un post damunt robots controlats amb Python.
Projectes com els que treim darrerament venen a mostrar que la tan cercada reutilització, els mètodes per lluitar contra la crisi del software, potser són molt més aprop del que ens pensam. El codi lliure permet la reutilització a nivells mai somiats, Python a més ho fa més fàcil, Django ho fa divertit per la web.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Caçant bubotes
Escrit per Aaloy a 14 de February , 2009 a les 1:43 p.m.
Poc a poc hem anat evolucionant la nostra arquitectura d'aplicacions des de aplicacions monolítiques fetes amb J2EE cap a aplicacions on la capa de serveis està en Java (per ara!) i aquests es consumeixen amb Python, utilitzant Django com a bastiment web.
Per a consumir serveis SOAP feim servir una llibreria anomenada ZSI que ens permet generar les classes Python a partir el WSDL dels serveis.
ZSI és un projecte que avança molt a poc a poc, veus que no està mort, que funcina, però la versió 2.1 fa estona que està en alfa. Tot i això, la versió 2.0 funciona prou bé com per poder consumir els serveis sense problemes.
L'altra dia però, ens vàrem trobar amb un problema d'aquests que classific com a "bubota". Atacàvem al servei que tenim de Transfers i tot anava com a la seda, atacàvem al d'excursions i el mateix. Atacàvem als dos dins la mateixa aplicació i l'espai de noms es feia un embolic, de manera que ens posava l'espai de noms del primer servei que s'executava.
Ho va descobrir en Juanjo i jo li deia que no podia ser fins que vaig fer un petit test de manera independent de l'aplicació que estam fent i ho vaig tocar amb les mans. Hi havia un problema i ara el problema era poder identificar a on, al webservice (poc probable), a la capa de servei que cosumia el SOAP (probable), al mapeig del ZSI (menys probable) o al ZSI en si (encara menys probable).
Quan un es troba amb un problema així, el primer és anar de més probabilitat a menys i anar descartant coses. La idea a més és aprofitar que hom està fent la depuració per a refactoritzar el codi, de manera que la feina de depuració serveixi a més per deixar un codi més clar i per tant més fàcil de depurar (recordau la primera regla de la refactorització: l'aplicació ha de funcionar exactament com funcionava abans, no introduïm nova funcionalitat).
Així doncs va començar un procés de refactorització de la primera capa, la que consumia el servei mapejat amb ZSI. Vaig organitzar millor el codi en paquets, vaig eliminar importacions innecesàries i vaig aillar totalment la part de transfers de la part d'excursions. Els tests però treien sempre el mateix, error quan atacàvem als dos serveis a l'hora.
La següent passa va ser anar a veure el codi generat pel ZSI (amb wsdl2py). Els generador de codi van molt bé, però sovint són massa genèrics. Així que també vaig fer-ne la refactorització. Eliminar totes les importacións amb arterisc, canviar nom comuns als dos paquets de transfers i excursions, i passar la part de defnició de tipus Soap a un arxiu independent, de manera que sols importàssim els realment necessaris. Tampoc! Els tests seguian donant el mateix... Bé al manco la refactorització era conseqüent...
Ara ja sols quedava la passa de la depuració línia a línea, fins i tot anant al codi del ZSI. Per això vaig començar amb un depurador senzillet comp el pdb (amb la seva versió d'ipdb) i vaig poder identificar a quin punt hi havia el problema. Pareixia estar en les cridades que feia el codi generat cap el ZSI. Per a facilitar la depuració en aquest punt ja vaig passar a un depurador gràfic, el winpdb, ja que permet veure d'una ullada totes les variables locals i globals.
Entrant al ZSI vaig descobrir la bubota. El ZSI cacheja els tipus d'objectes generats, però de tal manera que ho fa de manera global a l'aplicació, per tant, si dos objectes tenenen el mateix nom (com era el nostre cas), retorna el primer nom generat amb el seus espai de noms (cagada del ZSI al meu entendre). Potser és poc comú el que feim, però crec que és un cas típic d'optimització prematura. Es cachegen els tipus generats potser sense importar-hi.
La solució doncs va ser llevar les cachés, fes que generàs el tipus cada cop. Esperava pot ser una pèrdua de rendiment, però no és així, pareix que fins i tot posar i treure de la caché és comparable al temps d'execució a la genereació del tipus. He d'afinar un poc més amb aquesta apreciació, però el que està clar és que per al consum que es fa del servei, la diferència de temps no és significativa a l'ordre dels milisegons, i del tot menyspreable si ho comparam amb el *lag * produït per les línees de comunicació. Amb la caché activada 1 segon, i sense 1 segon igual.
La bubota està caçada, els fantasmes desapareixen quan es fa la llum i amb tot el procés he après molt millor com funciona el ZSI per dintre.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Entorns de treball virtuals per Python
Escrit per Aaloy a 12 de February , 2009 a les 6:23 p.m.
Si he fet feina amb Python amb projectes diferents us haureu trobat amb algun d'aquest problemes:
La llibreria que heu devallat del svn per a un projecte té canvis, les necessitau pel projecte actual però són incompatibles amb el projecte anterior.
Necessitau provar l'aplicació que teniu amb les mateixes llibreries i versió que hi ha a producció. Podeu tirar de svn per la versió de producció, però les dependències de les llibreries han canviat.
Teniu tants paquets i llibreries instal·lats al
site-packagesque les utilitats d'autocompletat es tornen bojes per mostrar-vos les ajudes.
Per a resoldre tots aquets problemes hi d'altres semblants podem fer ús de dues utilitats com són el virtualenv i el virtualenvwrapper, creades per Ian Bicking i Doug Hellmann respectivament. Veurem en aquest article com fer-les servir.
El primer que hem de fer és instal·lar-les. Ho podem fer amb easy_install virtualenv i easy_install virtualenvwrapper. La primera utilitat és la que realment farà la feina, l'altra és un script que ens facilita el maneig i la gestió dels distints entorns.
Suposaré que ens trobam en la situació de que volem crear un entorn net, on crearem la nostra aplicació i que tendrà totes les llibreries i dependències necessàries per a executar-la. Per començar el primer que farem serà configurar el nostre entorn de treball
$mkdir ~/.virtualenvs
Ara editarem el nostre arxibu .basrch i hi afegim
export WORKON_HOME=$HOME/.virtualenvs source /usr/bin/virtualenvwrapper_bashrc
La localització del virtualenvwrapper_bashrc pot canviar segons la distribució, adaptau-la segons convengui.
Després d'editar el .bashrc feim un source ~/.bashrc per a activar els canvis i ja podem crear el nostre primer entorn virtual.
Crearem un entorn anomenat estable que tindrà la versió estable de Django i poca cosa més. Prèviament ens haurem baixat dita versió i l'haurem descomprimida a un directori temporal.
$ mkvirtualenv --no-site-packages estable $ workon estable
Això ens haurà creat un entorn de Python amb les llibreries per defecte. És el que li hem dit amb --no-site-packages. Si no li haguéssim posat aquesta opció, ho hagués creat, però amb tot el que tenim al site-packages actual, si ens interessa bé, però si no, com és el cas, millor pensar en crear els entorns virtuals fent servir aquesta opció.
Ara podem anar al directori on hem descomprimit Django i fer un python setup.py install. Si us hi fixau veureu que Django ara no s'instal·la al directory site-packages del sistema, sinó al del entorn virtuals. Això és així perquè hem activat l'entorn amb la comanda workon. Aquesta comanda ens permet veure els entorns que tenim definits i a més, posant-hi el nom del entorn, canviar d'entorn virtual, a partir del canvi, les comandes d'instal·lació via setup.py o easy_install es faran a l'entorn virtual actiu.
Si voleu tornar a l'entorn de treball del sistema podeu desactivar l'entorn virtual amb un deactivate.
Tenim un petit problema però, necessitam el PIL i és una tudada d'espai tenir-ho que instal·lar des de zero. Per això podem fer dues coses, o bé crear un enllàç simbòlic dins l'entorn virtual, en el nostre cas dins $WORKON_HOME/stable/lib/python2.5/site-packages/ o bé fer ús de la comanda que ens proporciona el virtualenvwrapper anomenada add2virtualenv. Així si executam
$workon estable $add2virtualenv /usr/lib/python2.5/site-packages/PIL
Hauríem afegit al nostre entorn virtual el paquet PIL del sistema. Ho podeu anar fent amb paquets que necessiteu, però teniu en compte que l'objectiu de l'entorn virtual és tenir un sistema net i no acabar amb tots els paquets que hi ha al sistema llincats.
Podem crear tants entorns virtuals com necessitem i vulguem, fins i tot un per cada aplicació. La comanda workon ens permetrà visualitzar-los i canviar entre ells amb tota facilitat.
Si optau per crear un entorn virtual per aplicació segurament trobareu molt útil saber que a directori bin del nostre entorn virtual podem crear dos scripts que d'existir s'executaran associats a l'entorn virtual, es tracta de postactivate que s'executa després d'activar l'entorn i predeactivate que s'executa abans de la desactivació.
En algunes aplicacions el meu postactivate és tan senzill com un canvi de directori cap a la carpeta de feina de l'aplicació i una actualització (via svn up) del codi.
Anem ara al tema de l'autocompletat. Com ja he comentat darrerament estic fent servir Netbeans per Python com a entorn de desenvolupament. Netbeans ens permet definir quins entorns d'execució farem servir (i gràcies a Xus vaig saber del cromo que deia que podíem fer-ho servir per a indicar a Netbeans que fes servir aquest entorn.
Una vegada creat el nou intèrpret de Python dins el Netbeans segurament encara haureu de pensar en fer una cosa més, assignar-ho al nostre projecte ja que en cas contrari tindria l'entorn antic. Així doncs anau a les propietats del projecte i assignau com a Python Platform l'entorn virtual que acabau d'afegir.
Podeu crear tants entorns d'execució de Python com siguin necessaris, cada un amb el seu entorn virtual associat i fer que sigui l'entorn d'execució per defecte del projecte. Això farà que l'autocompletat sols us mostri les opcions que es poden agafar d'aquestes llibreries, resolent un dels emperons més grans que particularment li trobava a l'autocompletat de Netbeans. Amb això i amb la recent descoberta de que depurar Javascript des de Netbeans és possible i més àgil que amb firebug (encara que ho faci servir, deu ser cosa del refresc del navegador), encara fa que em decante més per Netbeans com a entorn de desenvolupament per defecte per Python amb el permís de Vim, clar.
Us aconsello jugar amb els virtualenvs, fer proves, mirar quins paquets i utilitats feis servir més, si els vostres aplicatius s'executen bé en un entorn net (com possiblement serà l'entorn de producció), podeu crear-ne tants com vulgeu. Un entorn típic per a desenvolupar amb Django té un tamany de 35M (du -h $WORKON_HOME/estable/), que no és res pels tamanys dels discs durs actuals.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Una setmana interessant
Escrit per Aaloy a 01 de February , 2009 a les 11:51 p.m.
Aquesta ha estat una semana d'allò més interessant, moltes petites coses que per separat no són res, però que en conjunt fan que hagi estat prou interessant:
Primer un anecdotari: pel Facebook reb un missatge que em diu que "encara que no ens coneixem, estaria molt interessat en participar en un casting". Ja m'ha passat un parell de vegades que em confonguin amb el director de cinema. No deixa de ser divertit ...
Setmana d'actualització cap a KDE 4.2. En Guillem em va dir que li anava força millor que el 4.1 així que a provar-ho falta temps. L'actualització ha anat força bé, també he aprofitat per actualitzar l'OpenOffice a la versió 3. Per ara tot molt bé. El 4.2 me dona menys problemes que el 4.1.
He acabat el curs de Django i Python. M'agrada ensenyar i quan la matèria és tan agraïda com aquesta encara és millor. L'experiència ha estat molt gratificant, sols esper que els alumnes hagin disfrutat tant curs com el professor.
Poder passar un parell d'hores amb linuxeros ha estat també un bon punt. Aquest cop a més de l'anecdotari informàtic també hi va haver ocasió per parlar de fotografia i màquines.
També ha estat una setmana de bubotes informàtiques. Un problema de colisió de noms que pareix impossible i que en canvi apareix. M'ha fet perdre un bon grapat d'hores i encara no sé perquè passa.
El divendres vaig tenir la "Evaluación del rendimiento", un paripé com un altra d'aquests que fan les empreses que juguen a ser grans. La única utilitat que li veig és poder parlar de tu a tu, però poca cosa més. Tanmateix tenc una manera d'entendre la feina, l'empresa i la informàtica molt diferent del que és la "realitat corporativa" i potser molt més proper a la cultura corporativa. Pareix que el tema de cultura corporativa, el compromís ètic, el play to win, son frases que queden molt bé a les presentacions, però després la realitat és ben diferent. I per rematar-ho quan dic que el que em faltaria és un curs d'ESADE per poder participar en el consell de direcció, no es pren ni en consideració. :-P
La reducció de jornada està força bé. Me dóna temps de fer moltes més coses, d'aturar un poc i pensar cap a on tirar. La veritat és que ara per ara m'atreuen molt més els meus propis projectes. La reducció em permet compaginar-ho tot i poder estar amb la família. Pensar que a les tres estic fora fa que encara que em concentri en els projectes, no me'n duc la feina a casa, potser començ a ser part de la "realitat corporativa".
A veure com es presenta el febrer. Potser serà un mes divertit. He de pensar si convé o no canviar de cotxe (el Saxo aviat farà tretze anys i ja comença a ser hora). He estat visitant concessionaris, però surt amb la sensació de que m'estan prenent el pèl. També tenc ganes de fer una bona ullada als nous Dell ultraportables. Ara ja es poden configurar amb 2 Gb de RAM i es pot optar per distints tamanys de disc dur d'estat sòlid. Fe i fet es pot tenir un portàtil de 1 Kg de pes força potent per uns 500 Eur. Estic molt content amb el portàtil Dell acutal, això de la pantalla de 1920x1200 és una canya, però es fa molt feixuc per dur-ho damunt cada dia, si em decideixo ja ho comentaré per aquí.
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: General
El llibre negre de l'emprenedor
Escrit per Aaloy a 25 de January , 2009 a les 12:19 p.m.
En Xus m'ha fet arribar el llibre de Fernando Trías de Bes "El llibre negre de l'emprenedor", de l'editorial Empresa Activa. El subtítol del llibre "No diguis que mai no t'ho han advertit" ja ens dóna una bona idea de per on van els tirs. Un "Eps!, que això d'emprendre no és senzill, ves alerta!"
El llibre està dirigit als emprenedors, a tot aquell que té una idea i vol que aquesta esdevingui un negoci. A diferència d'altres llibres que ho pinten tot de color de rosa, aquest llibre mostra els problemes amb que pot trobar-se un emprenedor i que són els factors de fracàs que cal evitar si un vol tenir èxit en l'empresa.
Tracta temes com els socis, les relacions de l'emprenedor amb la família, la importància de donar valor a la pròpia feina i sobretot, de tocar de peus a terra.
El llibre m'ha agradat molt, potser algú s'ho llegeixi i li fugin les ganes d'emprendre una aventura empresarial, però crec que el principal que es pot extreure de llegir el llibre és el d'evitar tenir la sensació de que "aquest problema sols me passa a mi", és a dir, que quan passi un dels problemes típics saber que "són coses que passen" i no fer-ne un gra massa, senzillament resoldre'l de la millor manera possible i sortir-ne'n.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Quan els arbres no et deixen veure el bosc
Escrit per Aaloy a 18 de January , 2009 a les 8:27 p.m.
M'ha agradat molt l'anàlisi que fa Bruce Momjian al seu blog damunt el nombre òptim de paràmetres de configuració d'una base de dades al seu apunt The optimal Number of Database Performance Settings.
Fa una interessant reflexió damunt com un nombre molt gran de paràmetres de configuració al final resulta en una menor taxa de tunning de la base de dades, ja que la gran quantitat de paràmetres a tocar fa que el nombre de gent que s'atreveix a tocar-los sigui cada vegada menor.
En altres àmbits de la informàtica ens trobam un problema semblant en l'anàlisi de requeriments, és el que es coneix com anàlisi paràlisi. És a dir, quan l'obsessió per tenir-ho tot ben lligat fa que no arribem a tenir res.
Metodologies com Scrum intenten evitar aquesta situació proposant un model de desenvolupament iteratiu i adaptatiu, en el sentit de que no fa falta tenir-ho tot al 100% analitzat per començar. Es parteix de la idea que això sols fa el projecte inviable i el que propugna és que a tot projecte hi ha canvis i hem d'estar preparats per evolucionar el projecte amb els nous requeriments.
A la gestió d'una empresa o d'un departament informàtic també ens podem trobar amb aquest antipatró.
Al departament informàtic: informes de planes i més planes amb estadístiques de seguiment de projectes, ratios, gràfiques, etc. etc. que no se mira ningú i de les quals ningú treu cap conclusió.
A la gestió de projectes: obsessió per tenir-ho tot a un project, per controlar les línies de codi que fa cada programador, per saber quants minuts dedica a anar a pixar.
A l'empresa: Sistemes de bussiness inteligence que no s'acaben de posar en marxa mai perquè encara falta aquell informe que estaria molt bé de tenir. Com al departament informes i més informes que al final no s'arribarà a mirar ningú. Quadres de comandament que pareixen mosaics de Gaudí.
Com tot a la vida cal saber què és el més important, i del més importat allò que ens serveix per prendre decisions i allò que permet avaluar l'estat del projecte, empresa, departament... A un projecte no és tan important saber quantes línies escriu un programador sinó quina és la quantitat de tasca que queda per fer. No és tan important saber qui ha fet un error com saber qui el pot corregir. No és tan important el control damunt la gent com saber que la teva gent no necessita ser controlada.
Demanar massa informes sols pel fet de tenir-los és un signe clar de que quelcom no funciona com hauria de funcionar, que en lloc de gestionar la productivitat s'està gestionant l'ocupació de la gent.
A l'hora de demanar un informe, preguntau-vos per a què ho necessitareu, quines hipòtesis voleu demostrar, durant quant de temps es vol dit informe, i sobre tot, demanau-vos si tendreu temps per a mirar-vos-lo i treure'n conclusions. En cas contrari pot passar com el nombre de paràmetres d'optimització de les bases de dades: teniu tant per mirar, tant per remanar que no sabeu el que és realment important i acabareu sense fer res.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes
Balanç del 2008
Escrit per Aaloy a 31 de December , 2008 a les 11:32 a.m.
Aquest serà el darrer apunt d'aquest any, i com a tal toca fer balanç del que ha significat aquest 2008 que aviat s'acaba.
Programació
A l'aspecte de programació ha estat un bon any: Django ha tret la versió 1 i Python l'esperada versió 3. Hem vist com han aparegut força projectes basats en Django que marcan la línia cap a l'esperada reutilització de codi.
Ha estat l'any on personalment he fet molta més programació amb Django que en Java. Els tipus de projectes que han sortit feien que fos molt més ràpid i optim fer-ho d'aquesta manera. Alguns dels llocs web han tingut força visites i hem pogut comprovar el bé que se comporta Django.
L'aparició de Netbeans per Python també crec que és una notícia prou important. Fins ara pareixia que Python estava apartat dels plans de Sun (no així dels de Google com s'ha vist amb l'AppEngine) i pel que apunta pareix que a mitjà plaç i amb permís d'Eclipse i Aptana podria ser l'editor de referència per Python.
Gestió de projectes
He seguit amb discussions filosòfiques damunt el que és un projecte i el que no és. Per mi un projecte per definició ha de tenir una data d'acabament, però ja he perdut l'esperança de que algunes coses canviïn.
Scrum com a metodologia cada cop m'agrada més. Estic molt còmode amb la idea de que les persones són el més important de l'equip i de que el cap de projecte ha de ser un facilitador. Scrum s'adapta molt bé a aquesta manera de pensar i de fer.
De la família
Llums i ombres enguany. Llum pel naixement del meu segon nebot, ombres per la pèrdua de gent propera, en un cas molt jove que va omplir la família de consternació, i un petit ensurt amb el Pare que afortunadament no ha anat a majors.
Els meus menuts creixent dia a dia, enguany ja saben colcar en bicicleta (amb 3 sessions en tingueren prou per aprendre'n!) i trobar la IP del seu ordinador Linux.
Dels amics
Donar-vos les gràcies per ser-hi, per aguantar-me els acudits dolents i pels bons moments que hem passat junts. La vida no seria digne de ser dita vida sense els amics.
De la feina
La feia principal rara, moltes baixes, buids de poder i una fusió que pareix que no s'arriba a concretar. Personalment he demanat una reducció de jornada que esper es concreti al 2009. No m'agraden les situacions d'impàs i mentre tot es defineix prefereixo dedicar més temps a la família.
De la feina "pla B" bé, molt bé. Projectes molt interessants que esper es concretin molt aviat. El 2008 ha estat un any de transició, d'agafar embranzida per l'any següent i crec que s'ha aconseguit.
Gràcies a tots i totes per seguir aquest blog i pels comentaris que anau deixant. Esper que el 2008 hagi estàs profitós per les vostres vides. Ens llegim al 2009!
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: General Python Django
Django no és PHP ni JSP
Escrit per Aaloy a 27 de December , 2008 a les 1:38 p.m.
Alguna de la gent que s'atraca a Django per desenvolupar web ve de PHP o del món Java (amb JSP) i intenta aplicar les mateixes tècniques que havia fet servir abans, trocejant les planes i fent servir includes, desaprofitant la potència de les plantilles de Django.
Includes per la maquetació
Els includes existeixen en Django, però no tenen la mateixa importància que en PHP a l'hora de fer la maquetació.
Les plantilles a Django es poden heretar. Això és un concepte nou per la gent que ve de PHP o JSP, però és la manera de muntar les planes web. El que feim és definir la nostra plantilla base (o plantilles) i programarem per diferències. És a dir, quan hem creat la plantilla, la plana següent la maquetarem pensant "és com la plantilla base però amb aquesta secció i aquest altra diferent".
Cada una de les diferències la podem posar dins un bloc. Així les plantilles hereten els continguts i el blocs de les plantilles pare i podem sobreescriure els continguts dels blocs.
Això vol dir que normalment no trocejarem la nostra plana en capçalera, menú, contingut i peu, en quatre arxius diferents, sinó que estarà tot dins el mateix arxiu i el que farem serà definir distints blocs segons convengui o no sobrescriure'ls en les plantilles filles.
No hem de passar pena de posar massa blocs, de fet millor trocejar massa que massa poc. I encara així, sempre som a temps d'editar la plantilla base per anar afegint els blocs que necessitem.
Includes per a carregar llibreries
JSP té el concepte de taglibs per a realitzar funcions com el formateig (fmt), estructures de control (core), etc.
A Django la majoria d'aquestes estructures estan ja dins el llenguatge de plantilles, definint els tags i els filtres. Els primers realitzen accions complexes i contenen les estructures de control de fluxe, els segons ens permeten modificar el contingut final que es mostrarà a l'usuari.
Com al Java amb el JSP Django ens permet definir llibreries de tags i filtres que es poden utilitzar en la generació de la plantilla amb un simple {% load "nom-de-la-llibreria" %}.
Les plantilles de Django no permeten incloure codi Python i el que es pot fer és limitat. La idea és que la plantilla tracti sols amb la capa de presentació i tot el que requereixi tractar amb regles de negoci o funcionalitat complexa es delegui a la capa Python.
Els includes de Django
Estan pensats per evitar tenir que repetir codi no per a la maquetació dels continguts. Pensem en el cas que tenim funcionalitat semblant però que ha d'anar a plantilles amb unes estructures molt diferents. Llavors el que feim és extreure aquell troç de funcionalitat i posar-ho a un arxiu separat per tal que es pugui reaprofitar el codi.
És més, si la repetició encapsula funcionalitat i aquesta es pot reaprofitar en altres aplicacions l'adequat seria crear un tag que generàs l'HTML. Django proporciona fins i tot decoradors que ens permeten crear molt fàcilment plantilles html que agafin paràmetres, o crear tags que generin HTML tal i com nosaltres el volem.
En definitiva, abans de posar-vos a maquetar convé fer una ullada a la documentació de Django, començant per Django template for designers que ens introduirà en els principals conceptes, després pegar una bona llegida als tags i filtres i una vegada dominem Python anar cap a la creació de les nostres pròpies llibreries de tags.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python Django
Cursos de Python i Django
Escrit per Aaloy a 23 de December , 2008 a les 6:03 p.m.
Els que em coneixeu segurament haureu notat que m'agrada ensenyar de la mateixa manera que m'agrada aprendre. Ensenyar permet compartir experiències i coneixements amb un nivell de comunicació que és difícil d'assolir en un llibre o un article, i poder ensenyar allò que a més t'agrada ho fa tot molt més divertit.
Com en moltes coses, per mi la màxima és fer les coses com m'agradaria que algú les fes si fossin per mi. Això sovint fa que m'ho prengui de vegades massa seriosament, sóc exigent amb els altres i per tant també ho sóc amb mi.
Per a que un curs sigui productiu la gent que hi assisteix hi ha d'anar mínimanent motivada. Una manera de tenir aquesta motivació és que la matèria que s'hi imparteix es vaig a utilitzar en un futur proper o ja s'estigui utilitzant.
Python i Django fa que sigui molt ràpid poder tenir un entorn de proves i començar a fer coses. La corba d'entrada és molt suau i es poden començar a fer aplicacions molt ràpidament, per tant, augmenten les possibilitats de que la gent ho pugui fer servir en el seu dia a dia, fins i tot si no s'hi dedica al 100%. Tasques d'administració de sistemes, scripts d'importació, generació de codi, etc. són molt ràpides de fer en Python i per tant es pot veure un resultat immediat del que s'ha après. La realimentació que s'aconsegueix, la gratificació de l'ego, fa que la gent pugui veure una utilitat en allò que fa.
A mi els formadors que m'agraden són aquells que a més de dominar la matèria (no ho doneu per suposat, no és la primera vegada que vaig a un curs on que l'impartia sols sabia el que deien les presentacions que duia preparades) hi fan feina. Sobretot en la part tècnica això es nota molt. Qui fa feina dia a dia amb una tecnologia a més de tenir-ne els coneixements també us podrà donar consells, millors pràctiques, trucs de la professió que no estan als manuals. Llavors és cosa de cada un aplicar-los o no, però el que està clar que a més d'una simple explicació de coneixements hi ha la part de transmissió d'experiència.
Per això m'agrada que els formadors no es dediquin professionalment a la formació, sinó que la seva feina principal impliqui fer feina amb aquella tecnologia i obviament m'aplic el mateix criteri. M'agrada ensenyar, però em trob molt més còmode amb mi mateix ensenyant allò que faig servir, en el meu cas Python, Django o gestió de projectes informàtics.
Ensenyar implica també preparar-se les classes. Per mi aquesta preparació no significa llegir-se la matèria (que també) sinó a més preparar exemples, la línia argumental de la classes i un conjunt de "plans bé". És a dir, tu prepares el que se suposa que serà el contingut de la classe d'aquell dia, però pot ser que s'avanci més ràpid del que s'havia pensat, o que sorgeixi més interès per un tema concret o que trobis que és millor fer un exemple més senzill per acabar de lligar el que s'havia explicat. Poder anticipar-se a tot això i tenir-ho previst també fa que s'avanci molt més en la formació. A mi que el formador se quedin pensant en el que ha de donar a continuació no m'agrada gens.
És difícil trobar gent bona per donar formació, de la mateixa manera que és difícil trobar bons programadors. Particularment aspir a que la gent acabi amb el convenciment de que després dels cursos en sap més que abans de començar, que la formació se li faci curta i es quedi amb ganes de saber-ne més.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django
Dos apunts d'avui
Escrit per Aaloy a 16 de December , 2008 a les 8:48 p.m.
Avui he llegit pels RSS dos apunts que m'han agradat:How Are You Staffing Your Startup? i Outsourcing Killed By Django And Ruby On Rails
El primer apunt reflexiona sobre el paper dels administradors de sistemes als equips de desenvolupament, a les startups. La veritat és que no hi puc estar més d'acord, especialment quan la feina té a veure amb la web.
Entenc la web com una feina d'equip, on es necessita, a més de la idea, els desenvolupadors que la programin, els creatius i maquetadors i la la gent de sistemes per a que ho posi en producció i tengui cura de l'estabilitat del sistema.
Pens que a part de l'èxit d'una aplicació hi té molt a veure l'entorn on es desenvolupa, tenir un entorn de preproducció adequat, tenir un entorn de producció escalable. Que la gent de sistemes pugui dedicar temps a monitoritzar l'aplicació, a millorar les eines que té a cercar o crear-ne de noves.
L'altra apunt fa referència a com Django i Rails poden canviar la mentalitat d'outsourcing de les empreses. Ambdós bastiments fan que el cost de les aplicacions sigui menor i que la quantitat de codi repetitiu que s'escrigui sia molt menor que en les aplicacions escrites en Java (o .Net donat el cas).
Potser l'article no està redactat de manera molt afortunada (ja veureu els comentaris), però crec que la idea és vàlida. Django i Rails permeten fer més coses amb menys gent, però a més fa que la gent millor encara destaqui més i sigui més productiva, ja que l'hem alliberada de gran part de les tasques repetitives que no aporten valor i que precisament són les que tenen més sentit externalitzar.
Això no vol dir que la gent de la India els països de l'Est o Sudamèrica no sigui creativa, sinó que senzillament no fa falta treure les coses fora quan a casa t'ho poden fer igual o millor a pràcticament el mateix cost i temps.
Dugem les coses un poc més enfora. Suposem un projecte gran, 100.000 línies de codi Java pel cap baix. Aquests tipus de projectes són els que normalment se durien cap a consultores de fora. Amb Django se pot convertir en un projecte de 20.000 línies tranquilament i llavors els projectes que es treien fora perquè no hi havia mans per al desenvolupament es poden posar en mans d'empreses d'entre 5-10 desenvolupadors amb garanties de que el projecte s'acabi i s'entregui. En poques paraules, es pot passar de les macro-consultores a les PYMEs altament especialitzades i localitzades fins i tot al territori de qui demana l'aplicació. En la meva opinió això és bo, ja que per una part abaratint els costs fa possible que es puguin fer altres projectes, però a més perquè s'està afavorint un treball de qualitat, no basat en la força bruta sinó en la capacitat de l'equip.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Gestió de projectes
Batalletes de la professió
Escrit per Aaloy a 13 de December , 2008 a les 12:35 p.m.
He passat una estona rient pel post de James Carr anomenat Why must people degrade my profession. Pareix que aquestes situacions no són sols patrimoni dels informàtics patris, sinó que també companys de professió d'altres bandes també s'hi troben.
Potser l'article (el rant millor dit) ens fa gràcia perquè ens hi veim reflexats, però està clar que quan hom viu la situació no li fa gràcia.
Record que estan al càrrec del departament de suport de l'empresa un dels operadors va rebre una trucada, feia poc que s'havien començat a instal·lar impressores a color i algunes donaven problemes. Així que quan l'usuari va cridar i va dir que tenia problemes amb la impressora el primer que va dir el tècnic és:
(en castellà a l'original)
- ¿Impresora de color?
- Sí, claro, de color gris como las otras
Jo que l'escoltava em tirava pel terra, però a ell no li va fer gens de gràcia us ho assegur.
Hi ha una màxima que diu que no s'ha atribuir a la mala fe allò que es pot atribuir a l'estupidesa, i en soc un ferm partidari, però està clar que l'estupidesa a grans dosis pot ser desesperant. Ja sabeu: l'intel·ligència humana té un límit, l'estupidesa no.
Quan un es dedica a la gestió de projectes i a la programació les situacions són unes altres, però sovint també te dóna la sensació de que estan degradant la professió, bé per estupidesa, be per mala fe.
Curiosament el que sí me trobat és que aquestes situacions no es donen als projectes privats i sí als projectes d'assalariat.
En el primer cas la gent sol tenir més o manco clar el que vol, sap que la teva feina té un preu i que li cobraràs per allò que demani. S'escolten molt més quan els dius: "sí, això se pot fer, però serà car, te propòs que ho facis així i així i et sortirà més barat, tendrà més rendiment, etc.". Agraeixen la teva feina de consultoria i tu acabes satisfet per haver donat una solució al client, ja convertit en amic, que li estalviarà diners i que a més li permetrà tenir un sistema o aplicació de la qual tu també te'n sentiràs orgullós.
Perquè això és important. Per un bon professional, a més del sou hi ha l'amor propi d'haver fet una bona feina. Això no és patrimoni sols de la informàtica, he vist el mateix en picapedres, fontaners, sabaters, metges, ... Independentment de la feina són persones que tenen una cosa en comú: que estan orgullosos de la feina que fan i la volen fer el millor possible.
Pareix, o al manco així em passa a mi, que la cosa canvia quan qui comana la feina no s'hi juga res, i encara és pitjor si qui ho comana no és el mateix que ho ha de fer servir. Aquí les situacions que m'he arribat a trobar són directament de vinyeta de Dilbert. Si fa uns anys algú m'hagués dit que l'empresa posaria webs sense continguts i que no passaria res no m'ho hagués cregut i ja en duim dues d'aquestes.
Tècnicament n'estic orgullós: les webs són ràpides, escalen bé, s'indexen bé... Però com a professional no puc sentir-me còmode amb la situació, m'agradaria veure la feina acabada, poder dir "veis això ho hem fet nosaltres" i no quedar empegueït.
La situació és encara pitjor quan intentes explicar les diferència entre una web B2C i una web B2B, del perquè algunes coses que es fan a un B2B on controles qui es pot connectar, el creixement de les peticions, al cap i a la fi; no es poden aplicar a webs on no saps com s'utilitzaran, ni si demà sortiràs a l'Slashdot o al meneame, o senzillament faran servir els teus serveis moltes planes que a la seva vegada no saps el nombre de visites potencials que poden tenir. Això que hauria de ser molt clar per qualsevol que entén com funciona Internet sorprenentment no es considera ni es vol considerar.
Com que ningú s'hi juga res, ni tan sols el prestigi, la posició que adopta alguna gent és la de no deixar fer la feina, deixar que el temps passi i evitar que els projectes avancin. No sé si això es fa de manera conscient o inconscient, però es una dinàmica descoratjadora per la gent que ens consideram bons professionals, que ens sentim orgullosos de que els projectes surtin i vagin bé.
Permetre dins una empresa aquest tipus d'actituds i no fer-ne res, és per mi un exemple de degradació de la professió i potser fins i tot de l'empresa. Per mi és pitjor que el que explica Carr, ja que en el seus cas i com apunten els comentaris, el que vol l'usuari és algú que li pugui resoldre els problemes i acudeix a qui té més aprop que creu que en sap més que ell. En el segon cas la degradació és més greu, ja que potser no és tan visceral, però sí que toca més els fonaments de la professió i amb unes repercussions molt més profundes, tant econòmiques com de motivació de la gent.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
És temps de Python
Escrit per Aaloy a 08 de December , 2008 a les 1:55 a.m.
En Paul Graham a un conegut assaig deia que si un volia bons programadors tenia que anar cercant a gent que fes feina amb Python. Era per allà el 2004 i supòs que la gent de Google li va fer cas, un poc exagerats per això, posant en plantilla a Guido Van Rossum. A l'assaig es fa referència a que algú amb prou interès per aprendre un llenguatge minoritari com el Python hauria de tenir passió per la programació i per tant téndria mols números per ser un bon programador.
Potser ara Graham es decantaria per coses com Scala o Erlang, però tanmateix el que importa realment és que la gent que s'ha apropat a Python fins ara ho fa cercant alguna cosa millor, un llenguatge més manejable i que li permeti expressar en codi les seves idees.
Bastiments com Django, Pylons o Turbogears han donat una nova magnitud al llenguatge, posicionant-lo com un competidor de primera línia en el desenvolupament web.
La pròpia experiència indica que Python i un framework web com Django permet una productivitat un ordre de magnitud superior a la que s'obté en Java i una corba d'aprenentatge molt menor i més suau.
Aquests darrers mesos hem posat en producció dues web noves i estam a punt de llançar una web per a la gestió de congressos i events que ataca a un web service consumit en Python, tot això a partir d'un equip mínim de programació i en el darrer cas fins i tot a partir de gent que mai havia programat en Python. La programació és molt ràpida i l'escalabilitat i els temps de resposta de les webs tan bo o millor que les webs que tenim en Java. Dels continguts, què dir-vos? Programació no hi té res a veure ;)
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Nou nebot
Escrit per Aaloy a 07 de December , 2008 a les 11:34 a.m.
Doncs això, que des de ahir a les tres de la matinada tenc un nou nebot, Marc, de tres quilets i mig.
El projecte nebot 2.0 ha complit totes les expectatives de durada i s'ha entregat just el dia que tocava, a l'igual que el projecte nebot 1.0 que també s'entregà en plaç, desenvolupat per la mateixa empresa.
Hi ha que tenir en compte que a la família hi ha alguns projectes que s'han entregat abans de plaç, sense anar més lluny, el projecte Fill 1.0, s'entregà gairebé tres mesos abans de la data estimada. Respectar les dates d'entrega sempre és bo, no convé ni fer massa prest ni fer tard.
Això són projectes i no els informàtics :)
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: General
Python 3.0 ja és aquí
Escrit per Aaloy a 04 de December , 2008 a les 9:11 p.m.
Després d'anys de feina tenim la nova versió de Python aquí. La llista de novetats és força nombrosa i implica a més que es romp la compatibilitat cap enrera.
Tranquils no passa res! Python 3.0 representa el primer intent de rentada de cara a Python per a convertir-lo en el que serà un llenguatge fins i tot més potent que l'anterior, sense perdre la riquesa i expressivitat actual de Python, però solucionant d'una vegada problemes com el del tractament uniforme del tipus de dades sencer, l'unicode i tenir difernts maneres de fer el mateix per obtenir resultats semblants (range i xrange per exemple).
Als sistemes operatius seriosos poden conviure vàries versions de Python sense dificultats. Ara mateix a la meva màquina tenc el 2.4 i el 2.5 essent aquest darrer la versió per defecte. A poc a poc les distribucions l'aniran incorporant, primer com a opció i d'aquí un parell d'anys com a versió per defecte, però llavors ja no serà el 3.0, sinó el 3.x segurament.
L'important del llançament de la versió 3.0 és que a partir d'ara començarem a veure millores en el rendiment de Python 3, pel que pareix la versió 3.0 és més lenta que la 2.5, i a poc a poc s'aniran adaptant les llibreries de tercers.
Això vol dir que no fa falta frissar massa a portar totes les nostres aplicacions al 3.0. Primer convé esperar a que les nostres distribucions preferides posin la 2.6 com a versió per defecte i després anar adaptant-nos poc a poc i començar a agafar conciència dels canvis de la 3.0 per a fer que quan donem el pas gairebé tot ho faci l'script automàtic de conversió.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python
Formulari compost a Django
Escrit per Aaloy a 23 de November , 2008 a les 7:48 p.m.
Get the Englist translation of this post at: Gencat
Obtén la traducción al castellano de este post en: Gencat
Django té un sistema de tractament de formularis molt bo. Ens permet per una banda la reutilització de codi, ja que separa el que és la definició del formulari i la seva validació de la part de presentació.
La validació de la informació és d'allò més interessant, ja que assegura que si un camp del formulari l'hem definit com a sencer, el valor de la variable que obtindrem serà un sencer, o en cas contrari hi haurà un error de validació.
Per tot això, la idea és utilitzar el formularis de Django sempre que sigui possible i reutilitzar tot el que tinguem.
El problema es presenta quan en una plana ens n'adonam que necessitam dos formularis, no hi ha cap exemple de com fer-ho a la documentació. Veurem que una vegada solucionat el problema és tant obvi i simple que efectivament no importa documentar-ho, encara que estaria bé :)
Per a aquest exemple he posat el codi al repositori d'appfusedjango
Anem per feina
La idea és ben senzilla, crearem dos formularis i els farem servir a la nostra vista. Per a facilitar-no les coses, podem posar els dos formularis dins una llista de manera que per muntar la plana sols haurem de recorre la llista de formularis que li passam.
A l'exemple he creat dos formularis LoginForm i ContactForm, que es generaran a two_forms.html
def two_forms(request):
if request.method == 'POST':
contact_form = ContactForm(request.POST)
login_form = LoginForm(request.POST)
if login_form.is_valid() and contact_form.is_valid():
# do whatever you need as everything is valid
return HttpResponseRedirect('/thanks/')
else:
contact_form = ContactForm()
login_form = LoginForm()
forms = [contact_form, login_form]
return render_to_response('two_forms.html', {'forms': forms})
Com podem veure el funcionament és el mateix que en el cas d'un formulari normal, sols que hem crear-ne dos (o els que vulguem) i anar cridant al mètode is_valid per fer les validacions.
Això funciona perquè cada formulari agafa del post sols les dades que coincideixen amb els camps que té definits i perquè a l'hora de muntar la plana Django mira si el formulari té errors (la validació es fa tant cridant a is_valid com accedint als errors), d'altra manera i donat que Python fa servir l'avaluació curta de l'and, no tindríem els errors del segon formulari si el primer ja no validàs. Això explica el perquè hi ha aquesta doble via de llançar la validació a Django.
I això ens duu de manera natural a la següent qüestió, què passa si als formularis hi ha camps amb al mateix nom?
Doncs que Django no serà capaç d'esbrinar a quin camp correspon cada cosa in ens trobarem amb un petit problema.
Però tranquils, això està controlat, basta afegir un prefix que sigui únic per a cada formulari. Aquest prefix s'afegirà al nom dels camps que es generen per a l'HTML i d'aquesta manera en recuperar la informació Django sabrà quin camp correspon a cada formulari.
Hem de tenir cura d'assignar el prefixe tant a la part del GET com a la part de POST de la funció.
I això és tot, fàcil i net!
Observacions finals
A l'exemple de tres formularis amb el mateix nom he deixat codi de depuració, el import ipdb; ipdb.set_trace(), ho podeu llevar, levar sols la i del ipdb o bé instal·lar el ipdb, un depurador un poc més potent que el pdb de tota la vida i amb ressaltat de sintaxis.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Netbeans IDE 6.5 edició Python
Escrit per Aaloy a 22 de November , 2008 a les 11:51 a.m.
Fa no res ha sortit l'edició Early Accés de Netbeans per Python.
L'IDE integra un editor amb autocompletat de codi, depuració integrada, integració de subversion i tot el que un normalment pot esperar d'un entorn avançat de programació.
En la documentació he vist que hi ha una branca per Django, però encara no he trobat com accedir-hi. Tanmateix no té molta importància ara per ara, ja que si és un bon editor per Python ho serà per editar projectes Django.
En l'execució damunt el PPC amb la màquina virtual IBM JDK6, funciona acceptablement bé, però he tingut que variar alguns dels paràmetres d'inici per a que l'entorn no s'arrossegàs tant. Res de nou, per Ecipse també ho vaig fer, i la impressió general és que llevat els casos en que a la màquina virtual li pega per consumir el 99% de les dues CPUs, l'entorn es comporta molt bé.
El paràmetres de tunejat:
-J-Xmx356m
-J-Xverify:none
-J-XX:CompileThreshold=100
-J-XX:PermSize=64m
-J-XX:MaxPermSize=96m
-J-Djava.net.preferIPv4Stack=true
Aspectes destacats
Entorn de feina: net, molt net. Aprofita molt l'espai de treball i es deixa un gran espai per a l'editor.
El completat de codi és del milloret que he vist. A més han aconseguit extreure la documentació i presentar-la de manera poc intrussiva i elegant.
Possibilitat de crear plantilles. És una de les coses que faig amb Vim i que molts editors tenen, però que no acaben de funcionar tan bé com les de Vim. Netbeans ho fa. He portat algunes de les plantilles de Vim sense problemes.
Navegació entre objectes pitjant amb la tecla Ctrl damunt l'objecte. És un de les coses que més m'agraden d'Eclipse per Java i Netbeans també ho ha incorporat a Python.
Neteja de imports innecessaris. Ens deixa el codi més net.
Tecles ràpides per gairebé totes les opcions. Per mi és important que allò que faig habitualment permeti ser executat sense tenir que llevar les mans del teclat.
Possibilitat de crear les nostres pròpies plantilles.
L'eina de gestió de diferències entre fitxers manté el l'acoloriment de sintaxi. Una gran millora respecte a tot el que hi ha. És una eina fantàstica.
Punts a millorar
L'autocompletat té un preu: l'inici del programa és lent ja que parseja tot el que troba. Si teniu l'opció del la finestra de tasques activada la cosa pot arribar a ser insuportable. Afortunadament si posam que sols ens mostri les tasques de l'editor actiu la cosa millora. Tot i així crec que falta algun tipus de configuració per poder definir per projecte les llibreries que s'utilitzaran i les que no per agilitar-ne el parseig i evitar que algunes vegades a l'autocompletat surtin cents d'opcions que no tenen res a veure amb el projecte.
La integració amb subversion és bona, però la interfície de selecció del que s'ha de pujar i del que no és molt farragosa, ja que s'ha de seleccionar element a element amb un desplegable.
Pareix haver hi un error quan es selecciona una plantilla, ja que sols te deixa triar les de Python i Others. Es posa tot allà dintre i ja està, però sorprèn.
Refactorització. La que té Eric4 amb Rope o la de pyDev mateix permeten més opcions.
Hi ha un bon grapat de coses que vull explorar com són les macros, la inserció de codi i mirar més a fons el comportament de les plantilles, crec que se n'hi pot treure molt de suc.
Com a conclusió dir que m'ha agradat molt aquest entorn. Potser estic molt condicionat a que ha funcionat força bé en el PPC, però en la meva opinió és un entorn fantàstic per al desenvolupament de Python en general i de projectes Django en particular.
El faré servir una temporada, sols hi duc dos dies, a veure si tot confirma ser tant bo com sembla i puc trobar com instal·lar la branca per Django. Això sí, el vim seguirà essent un dels meus principals entorns de desenvolupament: quan un ha de fer modificacions de codi ràpidament o treballar per ssh no hi ha res millor. Sempre serà o bé una eina principal o complementària. Sempre és bo tenir dos editors de capçalera.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python Django
El django-admin no és per fer aplicacions d'usuari final
Escrit per Aaloy a 15 de November , 2008 a les 10:24 a.m.
Quan la gent dóna les seves primeres passes amb Django sovint queda enlluernada pel django-admin, una aplicació Django que ens permet definir un gestor de les nostres aplicacions, de manera que podem gestionar els usuaris, donar-hi permisos, gestionar les bases de dades, etc.
Hi ha que dir que l'aplicació està molt ben feta i es pot configurar moltíssim: indicar quins camps s'han de visualitzar, per quins camps es cercaran, fins i tot posar-hi javascript o modificar-ne l'aparença per a que la nostra aplicació faci el que nosaltres volem.
Aquesta facilitat però, té un perill, la gent té tendència a pensar que Django serveix per fer aplicacions web amb l'admin, que la seva aplicació ha de ser l'admin, així que recordem-ho:
El django-admin no és per fer aplicacions d'usuari final
Django admin fa molta màgia per dintre i aquesta màgia es basa en convencions que s'apliquen als models i a la definició del ModelAdmin, i aquestes convencions fan que per una part pugem tenir un gestor per a la nostra aplicació en quatre potades, però per altra, que si volem fer alguna cosa que surti del que està definit i establert ens durà molta feina.
La millor manera d'encarar-ho és tenir molt clar per a què serveix l'admin i per a què no:
Manteniment de les nostres taules de configuració i mestres? sí. Normalment ens anirà fantàstic per això i a meś ho podem tenir molt ràpidament. És ideal en les primeres etapes del desenvolupament, ja que es pot donar a l'usuari per a que carregui dades de prova i ja veu com pot funcionar l'aplicació.
Com a gestor web de la nostra base de dades? També anirà molt bé. Podem mapejar les taules i els camps que volem administrar, fer cerques, filtrar, editar i esborrar.
Com a eina d'usuari final per a que pugui configurar l'aplicació? Sí, si aquesta sols implica operacions senzilles, per exemple l'edició d'una plana web, afegir registres a una taula, etc. Podem definir quines taules pot tocar cada usuari i definir-ne perfils.
Com a eina d'usuari final on l'aplicació té molta lògica de negoci o bé un fluxe complex. NO. Millor començar un gestor pel nostre compte. Fer formularis CRUD amb Django és molt senzill i encara que pareix que dupliquem el que hi ha al django-admin, aquesta feina extra es veurà compensada a l'hora de definir els fluxs més complexos, ja que tindrem tota la potència de Python i Django al nostre abast i no estarem limitats a les convencions i funcionament del Django admin.
Les coses funcionen molt millor quan s'utilitzen per allò que estan pensades.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Rapid GUI Programming with Python and Qt
Escrit per Aaloy a 10 de November , 2008 a les 12:30 a.m.
El divendres vaig rebre un nou llibre:
Rapid GUI Programming with Python and Qt
Editorial Prentice Hall
Autor: Mark Summerfield
ISBN: 978-0-13-235418-9
Es tracta d'un manual de programació per al desenvolupament d'aplicacions amb Python i les Qt.
Me l'he estat fullejant i la veritat és que sols amb la qualitat de l'edició el llibre promet.
El primers capítols duen una petita introducció a Python, que segurament servirà a la gent que s'atraqui al món del la programació d'aplicacions d'escriptori portables, cercant quelcom més senzill de fer anar que la programació en C++.
L'estructura s'orienta per temes, on es van construint aplicacions de diferents nivells de complexitat i es complementa el tema amb tot un seguit d'exercicis per a que el lector faci feina pel seu compte.
Els que ens dedicam fonamentalment a la programació web, sovint tenim tendència a pensar que l'escriptori clàssic no té sentit, i això no és cert. Ara per ara encara hi ha força aplicacions i entorns on una aplicació d'escriptori pot solucionar millor els problemes al nostre client que una aplicació web. Poder oferir una solució feta amb Python amb una llibreria com Qt4 (no oblidem tampoc les WxPython) sens dubte ens serà de profit per ambdues parts.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes Python
Senyals a Django
Escrit per Aaloy a 03 de November , 2008 a les 8:35 p.m.
El mecanisme de senyalització de Django ens permet desacoblar les nostres aplicacions, ja que permet notificar d'accions que es produeixen a tot una sèrie de receptors o subscriptors d'aquestes senyals.
Podem distingir dos tipus de senyals a Django:
Les senyals que venen predefinides a bastiment i que podem trobar a la documentacio de Django. En aquest cas Django se n'encarrega de llançar l'avís de que una acció concreta s'ha produït i nosaltres com a programadors podem generar codi per tal de subscriure'ns a aquest tipus de missatges i disposar-ho tot per a que s'executi el codi que ha de respondre a aquestes accions.
Les senyals definides per l'usuari. Es un cas més general que l'anterior. Django ens permet definir les nostres pròpies senyals i enviar-les. En aquest cas doncs, podem definir tant la senyal com el tractament que se'n faci.
Escoltant senyals
Per a escoltar una senyal necessitam fer dues coses:
Definir la funció que rebrà la senyal amb el codi que s'ha d'executar.
Connectar la funció amb la senyal, és a dir subscriure's a la senyal.
Les funcions que haurem de definir han de ser de la forma:
def nom_funcio (sender, kwargs): "Aqui va la documentacio" # aqui el codi pass
Hem de tenir en compte que el nombre d'arguments que pot transmetre una senyal per definició pot canviar en qualsevol moment. Els arguments es passen per nom, i la nostra funció ha d'estar preparada per gestionar aquest possible canvi d'arguments.
Per a connectar la senyal amb la nostra funció importarem la senyal a la que ens vulguem subscriure i ens hi connectarem amb el mètode connect de la pròpia senyal.
Per exemple per connectar-nos a la senyal que s'emet quan una petició http ha acabat bastaria fer:
from django.core.signals import request_finished request_finished.connect(nom_funcio)
Les senyals tenen un paràmetre per defecte, el sender, que ens permet subscriure'ns sols a aquelles senyals que provenguin d'instàncies d'una classe determinada.
Definint les nostres senyals
Per a definir les nostres senyals hem fer dos passos:
Definir la senyal i els arguments que passarà
Allà on ens interessi enviar la senyal amb els arguments que hem definit
Pel primer pas basta importar django.dispatch i crear una instància de Signal amb els paràmetres que hem definit.
import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
Enviar la senyal és encara més senzill, basta cridar al mètode send amb els paràmetres que hem definit, sense oblidar-nos d'establir la variable sender amb l'objecte que ha enviat la senyal.
Suposem que volem que el sistema ens avisi automàticament cada cop que algú esborra un usuari de la base de dades.
Per a mostrar-ho farem ús del senyal pre_delete que es troba a django.db.models.signals. Per al registre crearem una taula a la BD que guardarà l'usuari que se va esborrar i el seu nom.
La senal pre_delete s'envia quan s'entra dins el mètode delete del model, com a arguments té el sender que és la classe que envia la senyal i instance que recull l'objecte que s'eliminarà de la base de dades.
Nosaltres ens volem registrar sols a les senyals que impliquin eliminar usuaris de l'aplicació, així que sols ens subscriurem a les senyals que provenguin de django.contrib.auth.models.User
El nostre model seria
#!/usr/bin/env python # -*- coding: UTF-8 -*- # Autor: aaloy from django.db import models from django.contrib.auth.models import User from django.db.models.signals import pre_delete class Eliminat(models.Model): user = models.CharField(max_length=30) created = models.DateTimeField(editable=False, auto_now_add=True, blank=False, db_index = True) def __unicode__(self): return self.user def registra(sender, **kwargs): instancia = kwargs['instance'] usuari = Eliminat(user=instancia.username) usuari.save() pre_delete.connect(registra, sender=User)
Per a veure com podem utilitzar les nostres pròpies senyals, crearem una senyal que registrarla la IP i el nom de la vista.
Per això crearem una nova classe, per exemple LogIp, que mantindrà el registre i connectarem el senyal amb la funció registre_ip
Hem de tenir en compte que es un exemple acadèmic, té poc sentit fe aquest tipus de coses, és a dir, definir una senyal dins el mateix model i enviant-la a la vista. Té molt més sentit que el senyal s'envii en resposta a una acció dins el propi model o a una acció particular de la vista i que una aplicació externa s'hi subscrigui.
class LogIp (models.Model): "Logs the ips and calling functions" name = models.CharField(max_length= 200) ip = models.IPAddressField() created = models.DateTimeField(editable=False, auto_now_add=True, blank=False, db_index = True) in_view = django.dispatch.Signal(providing_args=['ip', 'name']) def registra_ip(sender, **kwargs): ip = kwargs['ip'] name = kwargs['name'] log = LogIp(name= name, ip=ip) log.save() in_view.connect(registra_ip)
in_view és la nostra senyal, com a paràmetres hem posat ip i name, això vol dir que la funció que es registri com a escoltadora els pot fer servir i ha de ser capaç de admetre'ls. Per una altra banda també ens diu que allà on enviem la senyal amb el send haurem de proporcionar també aquests paràmetres.
Si llançam el senyal a la vista quedaria com
def list(request): "Lists the deleted users" deleted = Eliminat.objects.all() in_view.send(sender=chivato.views.list, ip=request.META['REMOTE_ADDR'], name=request.get_full_path()) return render_to_response('list.html', {'deleted':deleted})
Amb això cada cop que algú des de el seu navegador accedeixi a la funció quedarà registrada la url d'accés i la seva ip.
Tot el codi font amb un projecte complet llest per funcionar, sols heu de canviar las rutes al properties.py a appfuse o directament
svn checkout http://appfusedjango.googlecode.com/svn/trunk/signals
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
The myths of innovation
Escrit per Aaloy a 02 de November , 2008 a les 7:22 p.m.
Ahir vaig acabar de llegir the myths of innovation, d'Scott Berkun, que havia rebut via Amazon en la remesa d'agost.
Amb aquest llibre he acabat la remesa d'agost, però encara me queden altres lectures informàtiques, que eren menys interessants que aquestes i que encara no he acabat, així que supòs que podré resistir fins que arribi la nova remesa que ja he comanat.
Del llibre dir que m'ha agradat molt, és un assaig molt lúcid i interessant del que significa la innovació, de com s'hi arriba i de l'impacte que té tant en els innovadors com en la societat.
El llibre desfà molts mites, el de la serendipia per exemple n'és un. Estam acostumats a que ens diguin que molts grans descobriments de la humanitat s'han fet per casualitat, com si un dia el descobridor s'aixecàs veies la cosa i au, ja tenim el descobriment.
La innovació i el seu èxit, segons ens explica Berkun són una combinació de circumstàncies, factors socials, talent de l'innovador i sobre tot de feina molta feina, tant per adonar-se de que allò és una cosa nova, com per a posar-la en pràctica.
Lectura recomanada!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Els checkbox i radio buttons a Firefox 3 i kubuntu
Escrit per Aaloy a 27 de October , 2008 a les 9:06 p.m.
Aquest és un apunt d'utilitat pública, és a dir, potser és una xorrada per la majoria, però per si algú s'ha trobat en la meva mateixa situació crec convenient explicar-ho.
La cosa és que amb KUbuntu el Firefox no es porta massa bé. Quan un selecciona un radio button o un checkbox l'estil de la selecció fa que no sàpigues si realment has fet clic o no fins que no has pitjat a un altre lloc de la plana. Bastant molest tot plegat...
No hi havia manera de saber si era un bug o què, ja que cercava per Firefox Styles o chekbox i clar sortien milers de planes de disseny i javascript. Afortunadament per mi vaig arribar a la plana de larns que es veu tenia el meu mateix problema.
La solució passa per anar al panell de control de kde (Arranjament del sistema) i anar a l'opció d'Aparença. Seleccionam GTK Styles and fonts i en l'opció GTK Styles seleccionar Use another style seleccionant-ne un que no sigui el Qt, en el meu cas Raleigh, o bé es pot instal·lar el QtCurve:
sudo apt-get install kde-style-qtcurve qtcurve
Amb això els problemes de visualització de Firefox 3 desapareixen.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Scrum
Escrit per Aaloy a 19 de October , 2008 a les 8:59 p.m.
Pens que tothom tenim un llenguatge de programació que ens és afí, com al Harry Potter amb les varetes, podríem dir que no és el programador qui elegeix el llenguatge de programació, sinó que hi ha un llenguatge que encaixa perfectament amb la manera de pensar del programador.
En la metodologia de gestió de projectes crec que passa un poc el mateix. Quan hom pensa que el més important en els projectes són les persones i s'ho creu, les metodologies clàssiques no encaixen, ja que tenen tendència a pensar que els programadors són intercanviables, com un peó de la cadena de producció.
Quan es posa èmfasi en que la programació la fa la gent i que el factor realment diferenciador en la productivitat i l'èxit d'un projecte no és tant l'eina de programació com la gent que hi ha implicada, arribarem prest a les metodologies àgils.
Dins aquestes n'hi ha una que a mi m'escau d'allò més bé, en que m'hi sent més identificat i aquest és l'Scrum.
L'Scrum és una metodologia senzilla, on l'equip ho és tot i el cap de projecte no diu el que s'ha de fer sinó que és un facilitador, és a dir, la persona encarregada d'eliminar els obstacles que puguin posar en perill [1] el projecte.
Scrum fuig de la idea de que s'ha de tenir tot totalment clar abans de començar i abraça la idea del canvi, del dinamisme en els projectes. M'agrada perquè va per feina, sols amb la mínima cerimònia i sempre amb l'objectiu de que el client acabi obtenint allò que necessita i que sovint no és allò que havia demanat inicialment.
[1] "Pero que parezca un accidente"
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes
CMS i Django
Escrit per Aaloy a 02 de October , 2008 a les 9:09 p.m.
Llegit un apunt d'Okkum m'ha fet pensar en el joc que ens poden donar els CMS en el desenvolupament web i en els perills que també comporten.
De CMS n'hi ha en gairebé qualsevol llenguatge i bastiment que tengui una mínima orientació cap a la web, ja que al cap i a la fi es tracta de facilitar que l'usuari que ha de crear els continguts de la web ho tengui fàcil per fer-ho, i que les limitacions que imposa el CMS facin que tota la web tengui una estructura comú (afegiu-hi aquí la paraula corporativa).
Per PHP i Java n'hi ha per avorrir de CMS, per Python també n'hi ha un bon grapat, però si me'n tengués que quedar un per les possibilitats que té i la funcionalitat que aporta se'ns dubte em quedaria amb Plone.
De totes maneres, l'apunt no vol ser una comparativa de CMS, sinó reflexionar damunt les seves utilitats i els seus perills. Una web que és bàsicament contingut té en un CMS l'aplicació ideal. Si ho volem fer amb Django actualment hi ha dues possibilitats que destaquen:
Django cms alliberat recentment i que és un complet sistema de publicació de continguts.
Django page cms una aplicació per Django, és a dir pensada per a integrar-se amb un projecte web.
Cada un d'aquests projectes representa una manera d'entendre els CMS. El primer imposa que el CMS sigui l'aplicació principal i que en tot cas les funcionalitats que es vulguin afegir s'hi facin a partir del que el CMS ofereix, amb més o manco passibilitats d'integració. Pot anar molt bé si la única cosa que hem de fer és posar un formulari, però pot ser un maldecap si volem construir-hi la nostra aplicació web.
El Django page cms, per contra, suposa que serà una aplicació més a l'ecosistema del projecte, i per tant està pensant per integrar-se en qualsevol projecte. En contra té menys funcionalitat de CMS, menys cosa feta que l'anterior.
L'elecció d'un camí o un altra dependrà de l'aplicació i del client. Si hi ha o hi pot haver funcionalitat més enllà de la gestió de continguts és millor anar cap a una solució integrable que cap a una solució de CMS pura. Si els nostres usuaris no saben el que volen ni cap a on ha d'evolucionar la web doncs el sistema de component també és recomanable. Per webs de contingut que s'han de gestionar i mantenir ràpidament, el CMS pur és ideal.
I si el vostre negoci depèn del CMS, doncs no ho dubteu gaire: Plone, a anys llum de qualsevol CMS obert o tancat, i és també Python.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Formació interna en Python i Django
Escrit per Aaloy a 30 de September , 2008 a les 9:15 p.m.
L'altra dia una persona es va posar en contacte amb mi per a veure si li podia ajudar en un projecte, que resultà ser un deathmarch en tota regla.
La cosa és que l'home es queixava de que no trobava gent formada en Python i Django. Normal, la gent formada està fent feina i la tecnologia és prou nova com per a que encara sols la gent amb més inquietuds informàtiques hi estigui aficada.
Personalment crec que és part de la responsabilitat de l'empresa la de formar els seus treballadors, i la d'aquests aprofitar les formacions obviament. Per una empresa l'objectiu fonamental seria el de tenir treballadors capaços de autoformar-se, d'aprendre noves tecnologies ràpidament. Després de tot la tecnologia, especialment la tecnologia web, avança a un ritme tant alt que l'expert d'avui es pot convertir en l'inútil del futur.
En els darrers mesos he estat donant cursos de formació interns amb Python i Django a la gent que desenvoluparà tres dels propers projectes web. Gent que es reciclarà d'altres tecnologies i que té com a denominador comú les ganes i la capacitat d'aprendre.
De l'experiència actual n'he tret dues conclusions que vull compartir amb vosaltres:
La formació de 30 hores en Python i Django no és suficient. Em varen quedar molts punts que m'agradaria haver tractat. Tot i això crec que orientar la formació en vàries tandes en lloc de fer maratons seguits permet a la gent assimilar millor els coneixements i donar temps a la gent per a que pugui investigar i anar ampliant coneixements pel seu compte.
El seguiment és fonamental. El mentoring és una tècnica molt eficaç per assolir i transmetre coneixements i és quelcom que no he vist contemplat mai en cap dels cursos que he m'han donat. Les empreses pareix que suposen que una vegada donat el curs l'alumne ja pot volar sol, i realment no és així. El seguiment posterior, l'anar polint imperfeccions, la de fer petits monogràfics dins un projecte concret és una tècnica que personalment m'ha donat molts bons resultats en el passat i crec que aquesta no en serà una excepció. Això si, un acaba molt cansat quan els components de l'equip estan enfora (antiproductiu? sí, no us diré que no, però ja sabeu la dita del català antic, "donde hay patrón...")
La cosa està doncs que la gent comença a ser prou productiva com per fer avançar el projecte, i que tenir un projecte on pot començar des de zero, els ajudarà a fixar coneixements, no tan sols de programació, sinó de la manera pythònica de fer les coses.
Una vegada acabat el projecte sols em quedarà anar a Ca'n Paco i comprar-me unes sabates noves, hauré de passar el ticket a l'empresa :-P
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
En text pla per favor
Escrit per Aaloy a 28 de September , 2008 a les 9:16 p.m.
Ho he de reconèixer, tothom té els seus tics i un dels meus és la meva dèria per escriure ten text pla. Quan he d'obrir un editor de texts normals em fa molta peresa. Tot i conèixer com posar una negreta o una cursiva fent servir combinacions de tecles em pareix molt més natural escriure amb un editor com vim o Kate o en les vegades que he de fer servir Windows el notepad++.
Es pot dir que "vaig veure la llum" quan vaig tenir que escriure el meu primer document de més de 100 planes ple de taules i imatges incrustades. Aleshores el Word era la única opció i va ser un vertader malson fins que ho vaig enviar a fer punyetes i vaig decidir escriure el document fent servir LaTeX. Vaig poder dormir molt millor!
Després vaig descobrir les meravelles del RestructuredText per a escriure documents tècnics i la simplicitat de la sintaxis dels wikis. Pels apunts al blog m'he passat directament al Markdown.
El text pla ens permet llegir els nostres documents en qualsevol editor, transformar-los en diferents formats, posar-los sota un control de versions i veure'n les diferències des de la web o des de el nostre client preferint de subversion.
Com tot en aquesta vida no hi ha res perfecte, hi cada cosa hi té el seu lloc:
- LaTex: per documents llargs, i/o que necessiten d'una presentació final amb molta qualitat.
- RestructuredTex : per a la documentació tècnica que no necessita tenir una presentació final tan polida com la del document LaTex.
- Markdown per aquest blog.
- wiki per la documentació compartida al mediawiki o al trac.
De tots aquests formats el LaTeX potser sia que costa més d'aprendre al principi i que té un marcat que dificulta un tant la lectura del text. Els altres llenguatges de marcat estan pensat per a ser bons de llegir i d'interpretar semànticament amb tant sols obrir-los a l'editor.
Quan veig gent que duu el control de versions amb un document Word anomenat document_v1.0.293b.doc deixat a al carpeta v1 del directori documents o coses semblants no puc deixar de pensar en com se complica la vida la gent amb tal de no aprendre res nou. La d'hores que s'hauran perdut mirant si el document que tenen en les mans és la versió final o per veure les diferències entre una versió i una altra (òbviament lo del control de versions dels documents, per a què!).
La informació cada cop circula menys en paper i més en format electrònic, potser seria hora que les empreses es plantegessin si una manera d'estalviar temps i recursos seria la d'ensenyar als empleats a fer anar un control de versions, a passar d'un document tipus Rest a un Pdf, a que les darreres versions dels documents són les que hi ha al subversion. La majoria dels documents que circulen per les empreses són de consum intern i sols necessiten ser llegits i entesos, assegurant que la informació que contenen està actualitzada, cosa molt més fàcil d'aconseguir amb documents de text pla.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
La zona
Escrit per Aaloy a 19 de September , 2008 a les 9:20 p.m.
Estar en la zona és estar en el nirvana de la programació, a l'estat mental en que les idees passen a línies de codi, on els dits es mouen pel teclat en un flux constant i quasi hipnòtic.
Estar a la zona no és fàcil però sortir-ne sí. Estar a la zona enganxa, de manera que una sortida de la zona sobtada sovint va seguida d'uns minuts de mala llet, dirigida contra el responsable d'haver pertorbat l'estat mental per excel·lència del programador.
Aconseguir l'estat mental adequat per entrar a la zona és una qüestió molt personal de cada programador, però ho podríem comparar amb els rituals de fan els esportistes abans de sortir a competir. Entrar a la zona significa complir amb un ritual, amb una lletania que ens ajuda a aconseguir les condicions de partida que ens han de dur al flux, a la zona. Per un és no tenir papers a la taula, per altres tenir la taula plena de papers, altres han de disposar totes les icones de l'escriptori d'una determinada manera, altres obrim les consoles que necessitarem abans de començar i les distribuïm entre els escriptoris de manera que ho tenguem tot distribuït tal com ens agrada, tal com ens va bé.
Quan un està a la zona el temps passa més aviat, a la darrera compilació li segueix una altra darrera compilació i així successivament, qui està a la zona se'n resisteix a sortir-ne i inconscientment voldria que l'estat de beatitud que es té duràs un poc més. Ja hi haurà temps per anar a dinar, "un moment que ara acab això...", "gairebé ja ho tenc,", frases típiques que a ben segur us haureu trobat dient-vos a vosaltres mateixos o a un tercer.
Per entrar a la zona s'han de donar les condicions adequades, l'ambient de treball hi influeix molt. Si hi ha interrupcions cada pocs minuts normalment ja ni s'intenta entrar a la zona, ja que sortir-ne una vegada hi has entrat és un petit trauma i les persones intentam evitar les experiències negatives.
Per això es recomana que els programadors tenguin els seus propis despatxos evitant telefonades, interrupcions i reunions innecessàries. L'estat mental productiu per a un desenvolupador és el de la zona, és l'estat que el motiva a anar a fer feina cada matí, és una llàstima veure departaments de programació "diàfans" amb telèfons sonant per tot, fins i tot n'he vist que a més de no tenir paret i despatxos estaven aferrats a la cafeteria.
La productivitat en el món de la programació passa per donar a la gent les condicions òptimes per fer feina. L'estructura organitzativa hauria d'estar orientada a que la gent que fa desenvolupament pogués fer-ho amb tranquilitat, gaudint de la seva estada a la zona. Potser per això la majoria gaudim més de la programació a casa que a l'oficina, a casa és més fàcil accedir a la zona i menys complicat mantenir-s'hi.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Llista de llenguatges de programació que conec
Escrit per Aaloy a 09 de September , 2008 a les 8:40 p.m.
En Corey Goldberg escriu al seu blog damunt la llista de llenguatges de programació que coneix, amb la qual cosa ha iniciat un memme? ;)
La cosa està en llistar els llenguatges de programació en el que un se n'ha desfet en un moment o altre de la seva vida. És a dir, no val dir que un coneix el llenguatge Petito si no ha passat de "hello world".
En el meu cas i per ordre cronològic
- GW-BASIC
- Turbo Basic/Quick Basic
- Assembler 8086
- Shell
- FORTRAN
- Pascal
- Icon
- Matlab
- Modula 2
- Object Pascal (Delphi)
- SQL
- Python
- Forté
- C
- VbScript
- Java
- Javascript
Ja no es podríen classificar com d'haver fet res seriós:
- Fast (un llenguatge que generava .com especialitzat en fer jocs).
- Lisp
- C++
- Groovy
- Ruby
- C#
El Deplhi és un dels llenguatges que més he disfrutat de programar, però em vaig cansar de les tonteries de Borland i vaig trobar Python, quina gran troballa! Des d'aleshores no l'he deixat mai al Python, encara que altres llenguatges també s'han anant fent el seu lloc, el Python sempre ha estat en primera línia, encara que fos per generar codi per altres llenguatges.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Python
Avaluació pererosa a Python: un exemple amb Django
Escrit per Aaloy a 04 de September , 2008 a les 3:16 p.m.
Aprofitant que tenc vacances (eps! una setmana i ja s'acaben) aprofitaré per comentar un codi que serveix tant per entendre un poc més Python com per fer feina amb Django. La idea és del blog themorge.org
class PersonForm(ModelForm): "Simple form for the Person model" class Meta: model = Person
def edit(request,id=None): """Edits the Person model""" formulario = PersonForm(request.POST or None, instance = id and Person.objects.get(id = id) ) if request.method == 'POST': if formulario.is_valid(): persona = formulario.save() return HttpResponseRedirect('/fitxa/guardada/%s/'%persona.id) return render_to_response('edit.html', {'formulario': formulario})
Això representa un formulari d'edició amb Django (versió trunk). Tenim definit als models de l'aplicació una classe Person i el que volem és crear un formulari d'edició a partir d'aquest model.
A la classe PersonForm podem veure com hem creat el formulari a partir de la definició del model. Podem personalitzar el formulari afegint-hi validacions específiques, canviar la manera que s'edita etc, però si volem una cosa bruta i ràpida amb quatre línies en sortim (sí, la documentació sí és necessària).
Definim ara la part d'edició en sí, en el meu cas l'he anomenada edit, i fa referència a una plantilla edit.html, que bàsicament conté
<form action="." method="post">
<table>
{{formulario}}
</table>
<button name="submit" value="submit" type="submit">Send</button>
<button name="reset" value="reset" type="reset">Reset</button>
</form>
L'embolcall de l'html ho deixo com a exercici pel lector.
Anem a veure què passa quan a través de la url anam a parar a l'edit. Tenim dos casos possibles inicialment, que vulguem afegir un mou registre o que en volguem modificar-ne un ja existent. En el primer cas se'ns ha de mostrar un formulari en blanc, i en el segon un formulari amb les dades omplertes del l'objecte Persona agafat de la base de dades per l'ORM de Django.
Els urls que jo he definit són
(r'^edit/(?P\d+)/$','edit'),
(r'^add/$','edit'),
Com veim hi ha dues urls que apunten al mètode edit, la primera agafa l'id com a paràmetre, per la qual coses les urls serien de la forma /edit/10/ i la segona no agafa cap paràmetre i per tant queda com /add/. De fet podríem no haver fet la distinció entre edit i add, però si la feim el codi html ens quedarà molt més bo de llegir, més semàntic.
Estudiem el cas add. Quan entrem al mètode edit, com que no li passam l'id agafarà el valor per defecte, a saber None ja que així ho me definit al mètode, i ara comença la part interessant...
Definim un objecte de tipus PersonForm, la inicialització de la classe agafa dos paràmetres, el primer són els valors inicials del formulari i el segon és la instància de la classe que volem modificar.
Quan seleccionam editar un registre o afegir-ne un de nou, el que feim és un GET i quan guardam el registre hem definit al nostre codi HTML que el que farem és un POST.
Així doncs, ara hem fet un GET. L'operador or en Python funciona de la següent manera: x or y primer avalua x, si x és vertader retorna x i si no avalua y i retorna el resultat. Fixem-nos que deim que és una avaluació pererosa perquè si x dóna vertader, y mai s'arribarà a avaluar. Com que hem fet un GET la primera expressió és False i n'avaluarà la segona, amb la qual cosa obtenim un preciós None com a resultat de la inicialització de valors.
Anem ara a la segon part, la que ens defineix la instància, en aquest cas tenim un and. L'and funciona de la següent manera: x and y primer avalua x si x és fals llavors retorna el seu valor i si no s'avalua y i es retorna el seu valor. En el cas doncs de que x sigui fals ja no s'avaluarà y.
En el nostre cas hem passat el valor id=None llavors ja no itentarà ni crear una instància de l'objecte, senzillament passarà None com a valor de la instància, és a dir, res, i això indicarà a Django que es tracta d'un registre nou.
Per tant, quan hem entrat via add que que obtenim és un formulari buid. Com que hem entrat per GET l'if no s'avaluarà i Django ens presentarà una plana html amb un formulari buid.
Suposem ara que feim un /edit/2/, en aquest cas també haurem passat per GET però el valor de l'id serà 2.
formulario llavors tendrà None com a valors inicials per la mateixa raó que abans, però ara el primer terme de l'and és vertader i se n'avalua el segon, això fa que obtinguem com a valor per la instància l'objecte Person que té id igual a 2. En aquest cas tendrem un formulari ple amb els valors del registre i Django ens presentarà un formulari amb les dades de l'objecte com a valors i lligarà la instància al formulari (això significa que podrem fer formulario.save() per guardar el registre).
Molt bé, ja tenim un formulari, ple o buid, tant fa, ara el que feim és afegir o modificar dades i pitjam damunt l'opció de guardar. Això farà un post i cridarà a la mateixa url (el punt a l'action així ens ho garanteix), això significa que per a la inserció l'id serà None i per afegir l'id serà un número, 2 en el nostre cas.
Ara entram per POST, la qual cosa fa que la primera part de l'or sigui vertadera, amb la qual cosa el formulari tindrà com a valors inicials el que hagem posat, perquè això? dons per si no hem passat la validació del formulari, si anam per POST i el formulari no passa la validació, anirem novament a la mateixa plantilla, però ara tindrem com a valors del formulari el que hem passat, és a dir, si no passam la validació tornarem a tenir un formulari ple amb les dades que hem escrit.
És important fixar-se que les dades inicials a diferència de les dades que passem per la instància no necessàriament han de ser vàlides, no passen pels mecanismes de validació de Django, i això és el que ens permet recuperar tot el que hem escrit encara que estigui malament segons la validació.
Seguim, si hem entrat per edit l'id serà None i per tant ja no es crea cap objecte Person, si hem entrat per add l'id tindrà valor i s'avaluarà el segon terme de l'and amb la qual cosa haurem recuperat el registre de tipus Person que té id igual al nombre passat i l'haurem lligat al formulari.
Com que és un POST i passam la validació el que se fa és guardar el registre (si estava inicialitzat farà un update, sinó farà un insert a la base de dades i ens retornarà la instància de la classe Person que s'ha guardat.
Ara, que ja s'ha guardat sols ens queda fer un redirect de manera que evitem problemes amb dobles pitjades i refrescs varis. En el meu cas vaig a una url que em presentarà la fitxa que tot just acabam de crear/modificar.
Esper que aquest exemple us hagi agradat tant com a mi quan ho vaig veure. És tot un exemple de l'expressivitat de Python i del ben pensat que està Django. Però el més important de tot d'aquesta història és que sempre es pot aprendre alguna cosa i que per aprendre és important dedicar temps a llegir codi dels altres.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django
Django 1.0
Escrit per Aaloy a 04 de September , 2008 a les 8:48 a.m.
La versió 1.0 de Django fa sis hores més o menys que ha sortit del forn, es pot veure ja el comunicat oficial a la plana web del projecte.
Els números són impressionants, de de la darrera versió estable s'han fet 4.000 commits, s'han resolt 2.000 errors i s'han afegit o llevat prop de 350.000 línies de codi. I el que trob un factor diferenciador de Django: s'han afegit 40.000 línies noves de documentació, pocs bastiments de codi obert dediquen tants esforços a la documentació.
Se m'ha acudit passar-li el sloccount a trunk del projecte
| SLOC | Directory | SLOC-by-Language (Sorted) |
|---|---|---|
| 46235 | django | python=46235 |
| 24683 | tests | python=24683 |
| 341 | docs | python=341 |
| 80 | examples | python=80 |
| 56 | top_dir | python=56 |
| 16 | scripts | sh=16 |
| 0 | extras | (none) |
| 0 | patches | (none) |
Totals grouped by language (dominant language first):
| python: | 71395 (99.98%) |
| sh: | 16 (0.02%) |
Total Physical Source Lines of Code (SLOC) = 71,411
Development Effort Estimate, Person-Years (Person-Months) = 17.68 (212.16) (Basic COCOMO model, Person-Months = 2.4 * (KSLOC1.05))
Schedule Estimate, Years (Months) = 1.60 (19.15)
(Basic COCOMO model, Months = 2.5 * (person-months0.38)) Estimated Average Number of Developers (Effort/Schedule) = 11.08
Total Estimated Cost to Develop = $ 2,388,334
Si a més contam css, javascript i l'html amb una altra eina
./cloc-1.04.pl --exclude-dir=.cvs,.svn --no3 .
http://cloc.sourceforge.net v 1.04 T=11.0 s (80.8 files/s, 10177.7 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Python 739 15302 8184 83136
HTML 100 364 15 1725
Javascript 15 107 269 1547
CSS 15 83 82 505
XML 10 49 8 431
make 1 12 4 54
SQL 8 1 9 40
Bourne Shell 1 4 7 17
-------------------------------------------------------------------------------
SUM: 889 15922 8578 87455
-------------------------------------------------------------------------------
Hem d'agraïr la feina feta als desenvolupadors principals de Django i a la comunitat que s'ha format al voltant per tot l'esforç i la bona feina feta.
Django s'ha convertit per mi en un factor diferenciador en el que fa a productivitat i velocitat de desenvolupament, cada nova millora ha estat sempre orientada fer les coses més naturals per al programador, més pythoniques, molt en la línia del llenguatge de programació en el qual està fet Django, el Python.
Ara sols resta anar adaptant el codi per a incorporar les millores i les noves maneres de fer feina. Els canvis dels darrers mesos han estat tan grans i tan ràpids que sovint costava anar seguint el fil, però el resultat és un bastiment com per a sentir-se orgullosos.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django
Rei o ric
Escrit per Aaloy a 01 de September , 2008 a les 10:13 a.m.
Al blog de Carlos Blanco, en l'apunt realmente necesitas un inversor hi vaig trobar una frase que diu Aconsejo a los emprendedores que busquen inversión que primero se planteén si “¿Quiero ser Rey o Quiero ser Rico?“.
Estic traient la frase de context i no es ben bé la situació en que ens trobaríem, però crec que val la pena reflexionar-hi.
Quan hom munta una empresa ho fa amb una visió del que vol que sigui l'empresa, però sempre amb la sana intenció de poder-hi viure. Es a dir, fer pasta és una dels objectius de tota empresa mercantil, però això no lleva que a més hi pugui haver un objectiu social diferent.
A la pregunta de rei o ric podríem contestar: republicà! És a dir, hi ha diferents models i visions d'empresa que poden compatibilitzar el fet de guanyar-se la vida, fer diners i no plantejar-se la venda de l'empresa com un objectiu a priori.
La meva visió d'empresa se pareix molt a la que va dur a Joel Spolsky a fundar Frog Creek. Vull una empresa on la gent tècnica s'hi senti com a casa, que cada dia el motivi per aixecar-se del llit i fer feina, una empresa on es valori el talent individual i del grup. És a dir, aquell tipus d'empresa on a la gent amb talent informàtic s'hi pegui per fer feina.
A un seminari un consultor va amollar "motivado se viene de casa, no es la función de la empresa motivar a los empleados". No hi estic d'acord. És funció de l'empresa crear un entorn i unes condicions que motivin a la gent a fer-hi feina, i aquesta motivació no ha de ser una motivació externa (la pastanaga de doblers per objectius, per exemple) sinó una motivació interna, fruit de que la gent vulgui donar el millor de sí mateixa perquè així contribuirà a mantenir el lloc de feina on li agrada estar.
Accés a bon equipament, a la possibilitat de teletreballar, la possibilitat de trobar-te en un lloc de feina amb gent igual que tu, a que es valorin les opinions i les iniciatives, amb accés a les darreres tecnologies. Crec que això motiva més que cap altra cosa perquè fa que la motivació surti de dintre de la gent. Fa que pugui explicar als seus companys on fa feina i ho pugui fer amb orgull de ser part d'una empresa on la majoria hi voldrien fer feina.
I no m'interpreteu malament, el sou també és important, però no és el més importat a vegades. Suposem una empresa que te deixa teletreballar però que et paga diguem 200 Eur menys que una que té jornada partida i que està a 30 Km de casa. Una vegada has restat el dinar i la benzina resulta que la que fa teletreball te surt més rentable que l'altra, i si te paga el mateix ja hi estàs guanyant.
El consultors de RRHH intenten aplicar als tècnics informàtics les mateixes receptes que aplicarien a una cadena de muntatge, de manera que no se valora al tècnic i se'l té per intercanviable, no es valora el coneixement i el valor que pot aportar.
No és la meva idea d'empresa, i si algun dia, esperem que no molt llunyà, em veig a poder fundar la meva pròpia empresa vull que sigui tant per fer doblers com per demostrar que un altre model d'empresa és possible, que és possible anar a fer feina cada dia sabent que no ho fas sols per doblers, sinó perquè t'agrada estar allà i t'agrada el que fas.
Traducciones/Translations by apertium
12 comentaris, 0 trackbacks (URL) , Tags: Informàtica
AppfuseDjango actualitzat a la versió de Django
Escrit per Aaloy a 16 de August , 2008 a les 11 a.m.
Avui he actualitzat AppfuseDjango per a que funcioni amb la darrera versió de Django.
Darrerament hi ha molts canvis a Django, ja atracant-se a la versió 1.0, i alguns d'ells són incompatibles amb les versions anteriors.
La idea de l'aplicació és que servesqui de punt de partida per altres aplicacions i com a codi de mostra per a la gent que està començant amb Django. El tutorial de Django està força bé per començar, però després, quan has de fer una aplicació amb manteniments, internacionalització, etc. es queda un poco curt. No hi ha res a dir, l'objectiu del tutorial és ensenyar i el d'una aplicació com AppfuseDjango l'objectiu és ser un punt de partida.
De fet ja fa estona que no faig servir la utilitat de Django per a crear projectes i aplicacions, el que faig és fer un export d'AppfuseDjango i començar a partir d'allà.
Pels qui us demaneu què s'hi pot trobar:
- Un manteniment CRUD: llistat, alta, baixa i modificació d'un registre.
- Exemple de paginació
- Mostra com internacionalitzar una aplicació.
- Un exemples de com fer anar l'Ajax i json amb extjs i jqgrid
Però el més important crec que no és tant el codi que es mostra sinó que es vegi l'organització d'un projecte.
Veureu que s'ha tret la configuració del settings.py cap a un properties.py, que no trobareu al codi, sinó que hi ha un properties.py.template. Això es fa per deixar l'aplicació preparada per l'entorn de producció i per a ser utilitzada per molts desenvolupadors. Fent-ho així, poden tenir distintes configuracions per a cada un dels desenvolupadors i com que són pròpies de cada un estan fora del control de versions de l'aplicació. Tanmateix sols és cosa de copiar el properties.py.template i modificar-ho per a adaptar-ho a les nostres necessitats (directori, caché, etc.).
Una altra cosa que he anat posant són algunes optimitzacions i hacks útils trobases pels fòrums o de collita pròpia. Entre elles una que ens permet tenir una caché de plana que depèn de l'idioma de visualització, és a dir, es genera la clau de la caché amb l'idioma de l'usuari.
Com a darrera incorporació, un mètode molt elegant d'editar i inserir registres que fa ús de l'avaluació pererosa en Python, trobat a themorgue.org, el codi ha quedat molt net, potser una mica menys entenidor que abans, però l'estalvi en línies de codi ho compensa.
Els plans futurs crear branques amb distints tipus de projectes per assolir l'objectiu de tenir el punt de partida bàsic per a cada tipus d'aplicació: html pura, html amb ajax, RIA, etc. i així sols tenir que baixar l'estrictament necessari en cada cas.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Remesa de llibres agost-2008
Escrit per Aaloy a 10 de August , 2008 a les 12:09 p.m.
Dissabte vaig rebre una nova remesa de llibres de ca'n Amazon. El dólar encara està força baix i tenia ganes de lectura. Els darrers que vaig comanar han resultat ser força bons i encara me'n queda algun per acabar del tot, però aquests dies em torna fer ganes llegir damunt un dels aspectes de la informàtica més interessants que hi ha: les persones.
De fet hi ha un nexe comú en tota la remesa de llibres és que no són llibre excessivament tècnics, com sí ho era l'altra remesa i sí són llibres on el component fonamental és la gent, els programadors i tècnics. Hi ha llibres generalistes on el tema principal també són les persones i les seves motivacions, fish y quien se ha llevado mi queso serien uns dels més coneguts, però per be o per mal la gent tècnica té/tenim altres motivacions, som diferents de la mitjana de la gent, més introvertits, més donats a la lògica, més intel·ligents, més guapos, més calentorros, millors amants... i els llibres que tracten dels grups de tècnics, de les seves anècdotes i vides van sovint molt més enllà de faules damunt formatges i peixos.
Res, anem per feina:
Smart & Get Thinks Done. De Joel Spolsky. Editorial Apress. Un llibre de butxaca damunt com captar i retenir el talent.
Managing Humans. De Michael Lopp. Editorial Apress. Anecdotari, consells i un poc de mala hòstia. He aprés com se diu gili... en anglès. És el primer que estic llegint, i encara que he de tirar de diccionari sovint, pel tipus d'expressivitat peculiar de Loop, m'està engantxant.
The myths of innovation. De Scott Berkun. Editorial O'Reilly. Un llibre damunt la innovació, el que ens motiva a abraçar noves tecnologies, i damunt el mateix sentit del canvi. Vaig llegir una cita atribuïda a Bernard Shaw que crec que va en el sentit del llibre "les persones raonables s'adapten al món, les persones insensates fan que el món s'adapti a elles. Per això progressar depèn de les persones insensates". Fins que tenen èxit i deixen de ser insensates als ulls de la societat, afegiria.
Agile project management with scrum. de Ken Schwaber. Editorial Microsoft Press. Gestió d'equips i projectes utilitzant la metodologia scrum. És una de les metodologies àgils que més m'agraden i que potser són més aptes per anar introduint a empreses tradicionals sense provocar una ruptura massa gran. Al contrari dels sistemes operatius, els llibres de Microsoft Press solen tenir molta qualitat.
Com sempre, si trob que algun d'ells es mereix una ressenya especial ja l'aniré posant.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Estan les bases de dades propietàries condemnades?
Escrit per Aaloy a 03 de August , 2008 a les 5:08 p.m.
Aquesta és la traducció del títol de l'apunt que fa Allan Packer, Are Propietary Databases Doomed on fa una més que interessant reflexió damunt el paper de les bases de dades lliures davant les bases de dades propietàries, i les pràctiques d'empreses com Oracle i IBM que fan que cada cop més gent es plantegi migrar cap a solucions no propietàries.
La tria de la base de dades està molt relacionada amb conceptes com la hipoteca tecnològica i l'escalabilitat, i l'efecte es tant més fort quan l'aplicació a desenvolupar ha de tenir un component web orientat al B2C. El que en un moment donat era una decisió de tipus "salvar el cul" i apostar per una base de dades propietària, davant l'èxit d'utilització del producte es converteix en un maldecap, ja que la suposada escalabilitat de la solució demostra no ser-ho tant en quant els beneficis se n'aniran darrera les llicències. Potser la tecnologia és escalable, però el cost no, i no tan sols això, sinó que ens condiciona l'elecció de hardware des del moment que la llicència va per processador, o el fabricant canvia la llicència per poder treure més suc del fet de tenir-nos fermats.
He sentit frases com "com que ja tenim Oracle desenvoluparem l'aplicació damunt aquesta BD", error, senyor meu, tu no tens Oracle, Oracle que té a tu, i desenvolupar una aplicació més que tiri d'aquesta base de dades no fa sinó estrènyer la corda, i si no recorda-ho la propera vegada que tenguis que canviar de hardware i tenguis que demanar equips antics amb menys cores, ja que no vols tenir que ampliar la llicència de la bases de dades.
En la part de negoci tradicional, on el nombre d'usuaris està molt limitat i poques possibilitats de creixement, ens trobam que les bases de dades lliures cobreixen perfectament les necessitats de la majoria d'usuaris i empreses, però és que a més, una per empresa que vulgui fer un desenvolupament web orientat al gran públic, triar una base de dades tancada per suportar l'aplicació és hipotecar el futur de l'empresa, on qui al final realment acabarà guanyant és la companyia que hi ha darrera de la base de dades.
Les bases de dades obertes representen una inversió de present i de futur perquè no el condicionen. Representen a més un estalvi pel present tant en forma d'estalvi en llicències com per l'augment de la capacitat de negociació que donen quan per alguna raó has de conviure amb el programari propietari.
En aquesta època de crisi, on les empreses estan mirant de retallar els seus costs de totes totes, és hora que es deixin de tonteries com retallar en els bolígrafs o en la qualitat del paper de bany i comencin a veure els beneficis que hi ha quan s'aposta per una altra model de programari, un model, recordem-ho basat en serveis i no en vendre trocets de paper que imposen limitacions artificials a la utilització d'un programari que és bàsic pel negoci.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
I ja som a l'agost
Escrit per Aaloy a 01 de August , 2008 a les 8:47 p.m.
I fa un calor que no vegis, tot i això vaig tenir l'oportunitat d'assistir a una reunió, on se'ns comunicà una notícia llargament esperada per alguns, on l'ambient va ser d'allò més gèlid. Ara per ara classificaré la notícia dins l'apartat de moviments relacionats amb la fusió, i ens queda estar a l'expectativa del que pot passar a partir de setembre. No deixa de sorprendre'm que encara que no pugui anticipar massa coses sí que estic copsant el tempo.
Siguem optimistes i classifiquem-ho com a de bona notícia, però per molt bona que sigui queda en un no res davant una notícia, també llargament esperada i que fa no res es va fer la realitat: la vinguda al món de una preciosa nina de Juan i Mayuko a.k.a. morenosan, des d'aquí l'enhorabona, i molt d'ànims a la parella per aguantar les nits d'insomni que els esperen el propers mesos.
Per la part més negativa, comprovar el malament que funcionen el que haurien de ser els serveis d'atenció a emprenedor i més en temps de crisi, on el que es fa es destruir i no crear. Hem contactat diverses vegades amb la gent de l'Incubit i és senzillament al·lucinant que la persona que ho duu "estigui de vacances" cada vegada, ja van dos periodes en dos mesos i pareix que cada vegada ens toca a nosaltres.
La veritat és que ens aniria molt bé tenir el suport de l'Incubit per alguns projectes que volem muntar, però és desesperant veure com funcionen per aquí les coses. Segueixo el blog de Jaime Estévez i em fa molta ràbia comprovar com ho va tenir de "fàcil" poder contactar amb un viver d'emprenedors, i nosaltres no aconseguim ni que ens retornin les telefonades.
Potser hauria de fer el mateix que els de l'Incubit i anar-me'n de vacances, però fa molta calor per voltar pel món i tot està massificat. M'estim més deixar-ho per més envant, i ara dedicar el temps lliure a seguir les novetats de Django i anar adaptant-les al blog. Ahir vaig donar d'alta el projecte a Ohloh, així afegeixo el meu petit granet d'arena per a que Python siguin mantinguen una bona posició dins la comparativa de llenguatges.
Encara queda un bon tros d'estiu i les vacances de la majoria de gent tot just comencen, una bona època per anar a fer feina sense passar ànsia pel tràfic, sense l'stress de les telefonades i amb l'aire condicionat de l'oficina.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: General
Lliçons de xinès per geeks
Escrit per Aaloy a 27 de July , 2008 a les 12:54 a.m.
Al blog de Marcelo Ramos he trobat un apunt amb aquesta imatge
que pareix que prové de makeuseof.com. Una troballa prou divertida de Marcelo. :)
El de l'arbre de Nadal m'ha fet especial gràcia, ja que a l'oficina hi ha una divertida anècdota amb un rack de comunicacions i un arbre de Nadal com a protagonista.
Endevinau que s'havia desendollat per encendre els llums de l'arbre? ... Sí, això mateix!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Conyes marineres
Unit tests
Escrit per Aaloy a 25 de July , 2008 a les 6:10 p.m.
Supòs que no he de convèncer ningú de les bondats dels tests unitaris a l'hora de desenvolupar.
Encara que no arribem als extrems que proposa la gent que fa "test driven development" tenir tests ajuda a l'hora de provar les aplicacions:
- Queda constància del que s'ha provat
- Les proves són repetibles
- Es poden anar afegint noves proves quan es detecten noves situacions i/o errors.
- Ens ajuden a la refactorització, ja que ens ajuden a comprovar que la refectorització no ha variat el funcionament del programa.
El clàssic en test unitàris per Python és PyUnit que segueix una aproximació diguem-ne ortodoxa, és a dir, basada en crear una classe que extén TestCase i a partir d'aquí anar agrupar els tests en el que s'anomena una TestSuite.
Una altra aproximació ben diferent és la de doctest, aquí el que tenim és que s'escriu el codi de testeig i la serva sortida dins de la mateixa aplicació, no hi ha API però sovint pot resultar un tant confús.
Finalment tentim un nouvingut (relativament, que ja té uns anyets) el py.test, que ve avalat per la gent de PyPy i que va ser creat per a testejar el desenvolupament de l'intèrpret de Python fet en Python.
En Grig Gheorghiu's té un conjunt de tres articles comparant unittest, doctest i py.test, encara que són un poc antics, en temps Internet, crec que ajuden molt a veure les principals mancances i avantatges de cada un.
Per suposat, hi ha molts més a sistemes de testeig, podeu trobar-ne una recopilació a Python Testing Tools Taxonomy
He estat gairebé una setmana desenvolupant i fent tests amb py.test, i he de dir que m'ha agradat, és molt més còmode de fer anar que cap dels altres. Basta que creis un mètode que comenci amb test_ o acabi en _test i ja ho tenim llest per ser provat, que passi el test o no sols es cosa de que hi hagi un asssert que retorni vertader si ha passat un testo o fals si no l'ha pasat.
Una de les característiques que m'han agradat més és la possibilitat de desactiva ràpidament un test amb disabled = True on el valor es pot substituir per una condició, amb la qual cosa podríem fer que un test s'executàs o no en funció de l'avaluació d'una condició, per exemple, si detectam que estam a l'entorn de producció no borrar la base de dades!
I també he trobat molt còmode l'opció de poder establir condicions d'inici i acabament per tot un mòdul, això m'ha permés per exemple, obrir una sessió i mantenir la connexió i el identificador de sessió per a tots els tests, tancant la sessió sols quan tots els tests ja han acabat.
La part que m'ha xocat és la manera de testejar les excepcion, ho fan amb
py.test.raises(Exception, func, *args, **kwargs)
py.test.raises(Exception, "func(*args, **kwargs)")
És a dir, s'ha d'importar el mòdul py i cridar a py.test.raises, després posarem l'excepció que volem tractar, la funció que s'ha de testejar i que genera aquesta expepció i seguidament els paràmetres que té la funció.
Crec que això ha estat la única cosa més complicada d'aprendre. La resta és tot ben natural.
Me falta provar la part de distribució de tests, però per ara crec que va camí de convertir-se en la meva eina de testeig Python de referència, a l'espera, això sí, de veure com ho puc integrar amb Hudson.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
A voltes amb els trackbacks
Escrit per Aaloy a 22 de July , 2008 a les 8:01 p.m.
Benvolguts amics, coneguts i saludats,
Aprofitant la calor, la benentesa, i la moguda de Django estic aprofitant per retocar el sistema de trackbacks del blog.
Estic abusant un poc de la confiança i fent proves a altres blogs a més del meu, per veure si hi ha problemes.
Si veis alguna cosa rara, trackbacks que venen de trespams amb poc sentit o antics, perdonau-me, estic abusant de la vostra confiança i amabilitat. Procuraré no fer massa destrossa, i no cal dir-ho, esborrau el que convingui.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Moguda a ca'n Django
Escrit per Aaloy a 20 de July , 2008 a les 9:49 p.m.
Django camina amb passes fermes cap a la versió 1.0, impulsat per la gent que vol una versió estable amb totes les millores actuals. S'ha definit tot una sèrie d'Sprints per a impulsar el desvenvolupament, anar integrant les millores ja provades i tancar tickets d'error.
En el procés hi ha tot un conjunt de decisions que s'han de prendre i que trenquen amb la versió estable anterior. Els canvis a Django són força graduals, i gairebé no trenquen mai les coses d'una manera bèstia, és veritat, les aplicacions deixen de funcionar, però és relativament senzill arreglar les coses si un ha anat seguint la branca de desenvolupament.
Un d'aquests canvis que "ha trencat coses" ha estat la integració del nou mòdul d'administració, que té força incompatibilitats, ja que refà tot el que era la definició de l'administrador. La gent de Django manté una llista d'incompatibilitats que fan que la feina, encara que se tengui que fer, sigui senzilla.
He actualitzat dos dels projectes que tenc a Google code, aquest blog per exemple. I ara queda anar migrant totes les aplicacions que tenim on-line. El trunk és massa bo i estable com per a no fer-ho servir, però de tant en tant dóna aquestes feinetes.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Django
Benchmark: mako i lmxl
Escrit per Aaloy a 13 de July , 2008 a les 9:20 p.m.
Estam plantejant fer una remodelació de la web B2B que tenim, ara està feta en Java i aprofitant la remodelació la meva intenció ( si me deixen clar), és aprofitar que la remodelació és força important per a reescriure el codi en Python i Django. Si fos un canvi petit no m'ho plantejaria, però és un canvi que pot dur mesos de feina i en aquest cas refer-ho amb Python suposa no allargar els temps de desenvolupament, encara que la feina global en termes de funcionalitat sigui més gran.
Però tampoc és cosa de tirar-se a la piscina, i abans de res convé saber amb què ens trobarem. Un dels aspectes més crítics és que hem de consumir un servei web en format xml sobre http. Cap problema, urllib per exemple és capaç de fer tot això i molt més, la cosa està en poder generar els xml i consumir-los en molt poc temps.
Aquest cap de setmana m'he entretingut fent un petit benchmark [1], volia comprovar una hipòtesis: fer servir un llenguatge de plantilles per generar les peticions xml i un parsejador per a consumir l'xml que m'arribarà. L'altra opció es generar les peticions directament amb la llibreria de parseig.
La primera opció té com avantatges que s'ha d'escriure menys codi i que queda força documentada la petició en sí. La segona te l'avantatge de que que sols fas servir una llibreria. Així doncs el que ha de dir la darrera paraula és el factor rapidesa. Serà més ràpida la llibreria de plantilles o la de l'xml?
Primer presentarem els candidats: per una part mako, un llenguatge de plantilles que surt molt ben parat a les comparatives de velocitat i de l'altra lxml una interfície Python damunt unes de les llibreries per tractar xml més ràpides del mercat libxml2 i libxslt.
Per fer les proves tirarem de les dades que representen els cotxes que he tingut:
VEHICLES = {'seat': {'id': 1, 'color':'blanc', 'preu':150000},
'ax' : {'id': 2, 'color':'blanc', 'preu':1100000},
'505' : {'id': 3, 'color':'blanc', 'preu': 500},
'saxo': {'id': 4, 'color':'blau', 'preu':1500000}
}
El que farem és generar un xml que representi aquesta estructura de dades. Com que tant amb mako com lxml la cosa va força ràpida, farem 10.000 repeticions.
El codi per mako és
from mako.template import Template
template = """
<vehicles>
% for marca, desc in vehicles.items():
<vehicle id = "${desc['id']}">
<marca>${marca} </marca>
<color>${desc['color']} </color>
<preu>${desc['preu']} </preu>
</vehicle>
% endfor
</vehicles>
"""
plantilla = Template(template)
for i in xrange(1, REPETICIONS):
xml = plantilla.render(vehicles=VEHICLES)
El que feim és compilar la plantilla un pic, per simular les condicions reals, ja que en una aplicació en producció és el que faríem, i renderitxar l'xml amb les dades fins al nombre de repeticions desitjat.
Per lxml la cosa és semblant, sols que el codi (si no tenim en compte la definició de la plantilla) és una mica més llarg
from lxml import etree
for i in xrange(1, REPETICIONS):
root=etree.Element( 'vehicles' )
for marca_vehiculo, desc in VEHICLES.items():
vehicle = etree.SubElement(root, 'vehicle', id = str(desc['id']) )
marca = etree.SubElement(vehicle, "marca" )
marca.text = marca_vehiculo
color = etree.SubElement(vehicle, "color" )
color.text = desc['color']
preu = etree.SubElement(vehicle, 'preu')
preu.text = "%.0f" % desc['preu']
xml2 = etree.tostring(root, pretty_print=False)
També en aquest cas procuram que hi hagi igualtat de condicions, i hem posat el pretty_print a False de manera que l'xml generat no estarà ben tabulat i no quedarà tan elegant com el el cas de mako, però també és el que faríem en un entorn de producció.
I ja està, ara sols falta executar-ho i mostrar-ne els resultats:
| Repeticions | mako | lxml |
| 100 | 0,0761 s | 0.0277 s |
| 1.000 | 0,2897 s | 0.2823 s |
| 10.000 | 2.3076 s | 2.8906 s |
D'això en treim dues conclusions:
- Que ambdues aproximacions són molt ràpides en la generació de l'xml.
- Que mako s'aprofita molt bé de la precompilació de les plantilles. En el benchmark he considerat que es compilava un pic i després s'executaven les repeticions. Si no consideram el temps de compilació
| Repeticions | mako | lxml |
| 100 | 0,0201 s | 0.0277 s |
| 1.000 | 0,2079 s | 0.2750 s |
| 10.000 | 1,9888 s | 2.9513 s |
És a dir, que si feim sempre feina amb el mateix tipus de peticions, l'opció de fer servir mako per a generar les peticions xml, compilant les plantilles a l'inici de l'aplicació és té un rendiment molt millor que generant l'xml cada cop amb l'lxml.
Per cert, les proves estan fetes amb Ubuntu Linux corrent en un PowerPC de doble processador de 2 GHz, és a dir, res de l'altre mon.
[1] Sí, ja ho sé, no m'hauria d'endur feina a casa
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python
Protocol Buffer
Escrit per Aaloy a 08 de July , 2008 a les 10 p.m.
Protocol Buffer és una llibreria d'intercanvi de dades que Google ha alliberat i que segons promet és de 20 a 100 vegades més ràpida que l'XML (i ja no parlem de SOAP) per a l'intercanvi de dades entre aplicacions.
Lo de la velocitat s'haurà de comprovar, però el que sí pareix clar és que és prou senzilla per ser abastable, la documentació és bona, i ja va dirigida als tres principals llenguatges de programació (C++, Java i Python).
Com que en faig servir dos habitualment, doncs es cosa de fer-hi una ullada i algunes proves d'stress a veure si realment és tant ràpida com diuen.
La cosa no sé si s'imposarà com a format d'intercanvi entre llocs d'Internet, però el que sí tenc clar és que si és més ràpid pot ser ideal com a format per a tecnologies SOA dins de la mateixa empresa. Una reducció d'un factor 10 ja seria prou bona, amb l'avantatge de que es podrien crear (com ara, per cert) serveis en un llenguatge i consumir-los en un altre, però sense tenir que pagar el preu que suposa en termes de rendiment fer-ho en format WSDL.
Es prest, per donar-ne una opinió amb més fonament, però pel que he vist de la documentació i els exemples, crec que aquest format i jo ens durem bé :)
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Java
Django i oracle
Escrit per Aaloy a 06 de July , 2008 a les 1:10 p.m.
Aquesta setmana ens hem vist amb la necessitat de crear una aplicació que havia de connectar amb un web service i agafar les dades de l'aplicació legacy que està feta en Oracle.
Hi havia dues alternatives, l'opció de salvemos el culo que implicava fer-ho tot en Java i no arribar a temps, o jugar-nos-la i fer-ho en Python i Django, i aquí el Boogeyman [1], no ens havíem trobat mai amb la necessitat de connectar directament Django amb Oracle, així que el primer de tot va ser veure com es podria fer i si ens trobaríem algun problema.
Per connectar amb Oracle, s'han de fer servir una llibreria anomenada cx_Oracle i de les llibreries d'Oracle mateix. Com que no vaig trobar les llibreries per la meva versió d'Ububuntu, doncs a compilar toca!. Vaig trobar una guia força bona a la web, sols vaig necessitar instal·lar una llibreria addicional a Ubuntu - si no la teniu en executar us petarà per a que no la troaba, i posar les llibreries d'Oracle a l'ldconfig.
Així doncs, vençut el Boogeyman, tota la resta era conegut i controlat: els serveis web amb ZSI encara que pot resultar un poc embullat al principi, quan li agafes el què, és molt potent. Si a més li posam una façada per adaptar-ho al que volem, consumir serveis web fets amb SOAP deixa de tenir misteri. Per una altra banda la part de manteniment web amb Django ja està força controlada, i la part de consola que també havia de tenir l'aplicació tampoc era nova. Python de fet té una utilitat anomenada Cmd o també es pot fer servir una utilitat de tercers anomenada cmd2 que hi afegeix algunes característiques interessants.
L'important d'aquesta història, però, no és la batalleta, no és tant veure que es pot fer feina amb Oracle amb Django i Python, sinó adonar-se de que per a que un projecte es pugui dur a terme amb garanties una de les coses més importants que s'han de fer és descobrir aquelles coses que sabem que no sabem i a ser possible descobrir el més aviat possible allò que no sabem que no sabem.
Si en aquest projecte s'hagués començat per altres tasques ens hauríem pogut trobar en dificultats a l'hora d'accedir a les dades i la feina feta serviria ben poc, o si més no, el projecte s'hauria endarrerit. Controlant el primer de tot el que pot donar dificultats augmenta les nostres possibilitat d'èxit.
[1] El Boogeyman representa allò que desconeixem i que ens fa por. Als projectes és important descobrir el primer de tot els monstres ja que ans al contrari ens poden donar un ensurt en fases on ja no hi podem fer res.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Sigues dinàmic
Escrit per Aaloy a 29 de June , 2008 a les 3:53 p.m.
L'altra dia vaig fer un petit prototip per veure amb quines dificultats em trovaba a l'hora de connectar amb Python contra l'LDAP de l'empresa (un Notes) i contra l'Active Directory. Aquesta funcionalitat ja la tenia desenvolupada en Java, però com que l'aplicació que estava plantejant es faria amb Python, vaig començar a mirar els tempes més problemàtics: l'autentificació i com imprimir els pdfs.
La connexió amb l'LDAP i la funcionalitat que volia, per tal d'obtenir tota la informació del l'usuari que es connectava no va ser gens problemàtica, en total 76 línies de codi davant les 350 llargues de Java, o el que és el mateix en Python vaig haver d'escriure un 80% menys de línies per a tenir la mateixa funcionalitat. D'això no poden concloure que sempre els programes en Python seran un 80% més curts, però és una evidència més del que parlam quan deim que s'escriu molt menys codi i que és més ràpid fer-ho.
El perquè en aquest cas concret, dóna peu a aquest apunt, presentarem la manera de tractar amb Python dues situacions bastant comuns quan ens hem de connectar a altres sistemes o fer servir llibreries de tercers: la transformació de diccionaris en objectes i el com tractar el cas en que tenim múltiples paràmetres opcionals.
Diccionaris a objectes
La situació és la següent: tenim un diccionari que volem passar com a paràmetre i fer servir les seves claus com si fossis propietats de la classe, de tal manera que si una clau no existeix ens dóni el valor per defecte.
Aquesta situació me la vaig trobar connectant a l'LDAP. La llibreria de Python en interroga l'LDAP torna un diccionari i volia que aquest diccionari formàs part de la classe Usuari que havia de contenir tota la informació de l'usuari que s'estava connectant a l'aplicació.
Suposem doncs que el diccionari que ens retornen és:
dades = {'nom': 'Antoni Aloy',
'telefon': '555 55 55 55',
'localitat': 'Binissalem',
'email': 'aaloy@example.com',
'blog': 'http://trespams.com'
}
El que volem és posar tota aquesta informació dins una objecte de tipus Usuari de tal manera que sigui fàcilment manipulable i entendible. És a dir, que puguem fer usuari.telefon,
class Usuari:
"Exemple de com transformar les claus d'un diccionari en propietats"
def init(self,ldap_prop = dict()):
self.__propietats = ldap_prop
def __getattr__(self, name):
"Obtenim l'el valor de la propietat del diccionari"
try:
return self.__propietats[name]
except:
return "No assignada"
def __str__(self):
"Representació textual de l'usuari"
return "%s - %s" % (self.nom, self.email)
def propietats(self):
"Retorna la llista de propietats"
return self.__propietats.keys()
Ho podríem fer servir amb el codi següent:
if __name__ == "__main__":
u = Usuari( ldap_prop = dades)
print "Nom %s" % u.nom
print "Telefon %s " % u.telefon
print "Provincia %s " % u.provincia
print u
El nostre cas era prou senzill, si volem quelcom més complexe podem anar a a una recepte de Michael Foord, on podem veure com s'extén l'objecte diccionari per a fer el mateix que hem fet en el nostre exemple i a més permetre la utilització de paràmetres normals.
Parametrització
Tenim una classe amb una gran quantitat de paràmetres que es poden modificar. Per defecte tots aquests paràmetres tenen un valor per defecte. Volem que l'usuari pugui actualitzar els valors i obtenir-los. A més hi pot haver paràmetres que són sols de lectura.
Aquesta situació me la vaig trobar instanciant classes de Reportlab. A l'hora d'utilitzar la llibreria ens trobam en aquesta situació: tenim una gran quantitat d'atributs que podem assignar, però la major part del temps els valors per defecte ja ens estan bé. Vegem com ha resolt la situació la gent de Reportlab:
class BaseDocTemplate:
"""...."""
_initArgs = { 'pagesize':defaultPageSize,
'pageTemplates':[],
'showBoundary':0,
'leftMargin':inch,
'rightMargin':inch,
'topMargin':inch,
'bottomMargin':inch,
'allowSplitting':1,
'title':None,
'author':None,
'subject':None,
'keywords':[],
'invariant':None,
'pageCompression':None,
'_pageBreakQuick':1,
'rotation':0,
'_debug':0}
_invalidInitArgs = ()
def __init__(self, filename, **kw):
"""create a document template bound to a filename (see class
documentation for keyword arguments)"""
self.filename = filename
for k in self._initArgs.keys():
if not kw.has_key(k):
v = self._initArgs[k]
else:
if k in self._invalidInitArgs:
raise ValueError, "Invalid argument %s" % k
v = kw[k]
setattr(self,k,v)
p = self.pageTemplates
self.pageTemplates = []
self.addPageTemplates(p)
...
A l'hora de crear la classe BaseDocTemplate els atributs es defineixen dins un diccionari _initArgs, a la inicialització de la classe l'únic paràmetre obligatori és filename, però perfectament podem fer
myTemplate = BaseDocTemplate(filename="test.pdf", showBoundary=1, author="aaloy")
A l'init el que fa es repassar-se tots els atributs que hem definit al diccionari, si els paràmetres que s'han passat no coincideixen amb la clau del diccionari es crea un nou atribut a l'objecte amb el valor que té al diccionari (el valor per defecte). En canvi si hi és, verifica primer que no sigui un paràmetre de sols lectura, comprovant-ho a _invalidInitArgs i en cas que no ho sigui crea l'atribut amb el valor que li passam com a paràmetre en lloc del valor per defecte que té definit al diccionari.
D'aquesta manera ens permet utilitzar i assignar valor molt fàcilment i sols inicialitzar allò que necessitam.
La quantitat de codi que ens estalvien aquests deus receptes és proporcional al nombre d'atributs que tengui la nostra classe si la fessin en un llenguatge de programació no dinàmic.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python
No estàs sol
Escrit per Aaloy a 26 de June , 2008 a les 8:15 p.m.
"When the productive have to ask permission from the unproductive in order to produce, then you may know your culture is doomed."
Llegit a un apunt de James Carr que a la seva vegad ho havia llegit del lblog de Reg.
Pels que els costa un poc més llegir l'anglès que el català:
Quan els productius han de demanar permís als improductius per tal de produïr, llavors saps que la teva cultura està condemnada.
On diu cultura, posau-hi empresa o la vostra organització altament jerarquitzada, sí, aquella que posen sempre d'exemple quan es parla del principi de Peter.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: General Conyes marineres
La meva experiència amb Django
Escrit per Aaloy a 22 de June , 2008 a les 12:03 p.m.
En Maties Bonet ens va escriure un e-mail a mi i a Guillem demanant-nos per la nostra experiència en l'ús de Django.
Amic Maties, bona cosa has demanat! Pepara't perquè aquest apunt pot ser llarg :)
La meva relació seriosa amb Django ja té més de dos anys, és difícil estimar la data, però si en tingués que donar una seria la del 3 d'agost del 2006, data del primer commit del major projecte que hem fet amb Django fins ara,amb actualment més de 12.000 línies de codi
Aquest projecte inicialment estava desenvolupat en PHP, però necessitàvem més funcionalitat i essent les nostres filies més tendents cap al Python que cap a altra cosa, començarem a investigar els bastiments que començavent a surgir. Cercàvem quelcom que permetés una bona escalabilitat, facilitat de desenvolpament i una separació molt clara entre codi i capa de presentació. A més una de les restriccions inicials era que el servidor que tenia que dur tot això no havia de ser massa potent, un host virtual baratet hauria de ser suficient per començar.
Amb Juan avaluarem un grapat d'opcions. Anàvem mirant frameworks i en discutíem els avantatges i inconvenients. Férem una ullada a Pylons, a TurboGears i alguns altres, fent algun prototip i discutint-ne els resultats.
TurboGears estava força bé, i Pylons representava gairebé l'estat de l'art en quant a integració de componentes, però Django tenia una avantatja per a nosaltres fonamental: la seva integració entre els distints components (integració que a més no compromet a res), una documentació fantàstica i el ser un bastiment que s'havia fet servir en projectes grans, en projectes que estaven funcionant. Es podria dir que no era sols una idea sinó que el funcionament del framework era una realitat.
Així doncs ens decidirem per Django. Mesos després Guido Van Rossum com el framework que li agradava més. Un any i mig després veuríem Django com un bastiment suportat per Google. Això vol dir que tenim bon ull per les tecnologies? Segurament, però vist en perspectiva l'elecció de qualsevol dels altres dos bastiments també ens hauria anat força bé.
Django, però té aquell quelcom que et fa sentir content i satisfet amb la programació que fas. És entenidor i abastable i quan t'enfrontes a un problema de la vida real trobes que hi ha una solució en Django, per una raó molt senzilla: el bastiment es va crear per resoldre problemes de la vida real, com una resposta a la necessitat que tenien els seus creadors de tenir un bastiment que els proporcionàs una gran rapidesa en el desenvolupament i al mateix temps una gran escalabilitat.
Una vegada vàrem veure la potència del bastiment, junt amb la potència de Python i ho compararem amb el que teníem i feiem en Java, el pas següent va ser lògic: utilitzar el que sabíem en la feina diària per a l'empresa per la qual treballàvem, una multinacional del turisme. Sense deixar Java del tot, ara podíem incorporar una nova eina que ens permetria poder desenvolupar webs a la velocitat que li agradava al negoci.
Posar Django i Python a una empresa molt tradicional no és senzill, "aquest tipus de la web sempre fent coses rares!" Però l'evidència s'imposa i amb un poc de ma ampla del nostre director d'informàtica anterior començarem a fer els nostres primers projectes amb Django per a l'empresa. És una tasca que avui en dia encara costa. Quant més consultors externs té l'empresa més difícil és aquesta tasca. Aquests suposats experts no tenen idea de què és Django i de les seves possibilitats, i tampoc els convé, ja que després de la consultoria hi sol haver un desenvolupament i com que el desenvolupament és més ràpid i ells cobren per hores, doncs que no convé gaire. Però això és una altra història i també serà un altra apunt.
Actualment doncs, feim/faig servir Django i Python en quatre grans tipus de projectes:
- projectes on no s'ataca a la base de dades "legacy" de l'empresa, sinó que s'han desenvolupat des de zero.
- projectes on hi ha una gran part de continguts i a més lògica de negoci senzilla.
- projectes que consumeixen web services en SOAP que estan a la seva vegada desenvolupats en Java.
- el nostres projectes particulars, com aquest blog.
Els resultats són molt bons, un exemple: fa dues setmanes ens telefonaren del dimecres per a un projecte crític, s'havia de crear una web completa per a un client que havia d'estar llesta el divendres al matí de la mateixa setmana. El dimecres horabaixa en tendríem més detalls.
L'horabaixa ens defineixen un poc millor el projecte: bàsicament contingut que se'ns aniria passant en format word i que segurament aniria sofrint modificacions damunt la marxa.
Tot just penjar el telèfon ens posarem en marxa. La gent de sistemes creà el repositori subversion pel projecte (no importa la pressa que tenguis, sempre, sempre un control de versions) i inicià la configuració del nou domini.
Una hora després ja teníem el domini intern funcionant i la primera versió del codi dins el subversions. Havíem reaprofitat la funcionalitat que teníem per a la gestió de continguts i ara sols era cosa de crear el disseny, passar-ho a plantilles i posar el contingut. El que ens feia més por era no tenir els DNS replicats per l'hora d'entrega.
El dijous al matí el disseny ja estava llest i es comença a maquetar i pujar continguts. Es crearen algunes plantilles per a fer que les opcions de menú canviessin dinàmicament i s'anava pujant tot al servidor de producció mitjançant un update del subversions. El temps de pujada d'una nova versió era aproximadament de 30 segons, versió que ja pujava testejada gràcies a que amb Django pots anar provant l'aplicació amb el seu servidor integrat (i amb recàrrega automàtica).
Ens sobraren un parell d'hores del temps limit. Total del projecte 35 hores-home. Entregable: aplicació amb subdomini propi, tipus portal de continguts, multi-idioma, amb menús desplegables, i la maquetació a partir de documents word de l'equivalent a una trentena de planes web amb una mescla de text, fotografies i descàrrega d'arxius. Rendiment de l'aplicació: generació d'una plana web en 1,2 segons sense caché.
Si ho haguéssim tingut que fer en Java encara estaríem muntant el CMS o pujant els continguts. Amb les plantilles de Django i la possibilitat d'herència que tenen, poguérem crear el nostre lloc web amb molt poc temps i passar els continguts a HTML de manera molt més ràpida que l'equivalent a crear el disseny en un CMS clàssic de PHP o Java (ja no en parlem de fer el mateix amb Java i sense CMS).
El millor de tot és que encara que no sabíem que se'ns demanaria estàvem raonablement segurs de que si no era res molt complexe es podria fer, ja que el bastiment no ens fermava (com sovint fan els CMS més habituals) sinó tot el contrari.
La meva experiència amb Django? Fantàstica i demostrable. Fins al punt que quan veig el que puc fer en aquest entorn em fa molta peresa tornar cap a Java, els temps d'espera tot i que desenvolupam en local resulten molests, les posades en producció s'eternitzen. I això que gràcies al nostres administradors de sistemes ho tenim tot que va com una seda a l'entorn J2EE i les posades en producció són ràpides, però quan ho compares amb un pocs segons tot resulta lent.
Consider Django com un avantatge competitiu: ens permet fer desenvolpaments molt ràpidament i a més sabem que escalaran bé. Com que no estam lligats a cap bastiment de javascript concret podem incorporar el que necessitem segons el projecte: jQuery, extjs, res... i la separació que es fa en capes de l'aplicació també es pot fer a l'hora de desenvolupar i permet treballar en paral·lel a la gent de sistemes, disseny i programació.
I així doncs, quan voleu que posem Django a la vostra empresa?
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python Django
A la pregunta de Servo ....
Escrit per Aaloy a 15 de June , 2008 a les 7:20 p.m.
Al comentari del darrer apunt de Servo es demanava el perquè el Set hauria de ser més ràpid si el primer algorisme és d'ordre N.
El codi dels sets es molt semblant al dels diccionaris, però està una mica més optimitzat, a l'igual que els diccionaris està implementat com una taula hash, però a diferència d'aquests els conjunts sols guarden el parell clau/hash en lloc de la tripleta clau/valor/valor del diccionari.
Com que els sets guarden els parells clau/hash, totes les operacions binàries, com la intersecció s'executen sense cap cridada al mètode _ _hash__ dels elements individuals. Això és molt més ràpid que el codi equivalent que fa servir diccionaris.
També resulta que quan feim un bucle damunt un set Python (CPython) directament recorre la taula hash en lloc de fer ús d'un iterador (que seria un poc més lent).
La pregunta ha servit per fer un poc de recerca, de fet la meva resposta és la traducció d'una resposta molt completa l'he trobada a Python in Science .
Però no ens conformem amb això, fem un "show me the code" a la plana citada anteriorment hi ha un exemple que ens anirà bé per començar. Es tracta de trobar la intersecció de dos conjunts, però ho podem adaptar per fer les cerques al diccionari:
import random import time REPETICIONS = 1000 ## Generam els valors seta = set([random.randint(0,100000) for n in xrange(10000)]) setb = set([random.randint(0,100000) for n in xrange(10000)]) print "Cerques a conjunts" t0 = time.clock() for i in xrange(REPETICIONS): total = seta.intersection(setb) print "Intersections - Time: %s seconds"%(time.clock()-t0) t0 = time.clock() for i in xrange(REPETICIONS): total2 = [] for element in seta: if element in setb: total2.append(element) print "Fent el bucle Time: %s seconds"%(time.clock()-t0) ## I ara el nostre cas print "Cerques amb diccionaris" ## Generam els valors dicta = {} dictb = {} for i in xrange(10000): dicta[random.randint(0,100000)]=i dictb[random.randint(0,100000)]=i t0 = time.clock() for x in xrange(REPETICIONS): total2 = [] for valor in dicta.keys(): if dictb.get(valor): total2.append((valor, dicta[valor])) print "Bucle - Time: %s seconds"%(time.clock()-t0) t0 = time.clock() for x in xrange(REPETICIONS): total2 = [ (repe,dicta[repe]) for repe in set(dicta).intersection(set(dictb))] print "Set intersection - Time: %s seconds"%(time.clock()-t0)
I aquí el resultat
Cerques a conjunts Intersections - Time: 0.94 seconds Fent el bucle Time: 6.11 seconds Cerques amb diccionaris Bucle - Time: 11.63 seconds Set intersection - Time: 6.97 seconds
En el primer cas estam davant un algorisme d'ordre N² davant un algorisme NlogN sin o record malament de la intersecció de conjunts.
El nostre cas és una mica menys clar en el que fa a l'ordre de l'algorisme, però amb el codi es pot veure com el resultat final s'obté és un 60% més ràpid.
Tot i això fixem-nos amb que per a obtenir el resultat en segons he tingut que fer 1.000 iteracions i que hem fet servir un conjunt de 10.000 elements, sols per a que quedi clar de que potser ambdós algorismes són prou ràpids per a la nostra tasca diària. Sols hem de tenir clar que quan cerquem maneres d'optimitzar el nostre codi, mirar si feim aquests tipus d'algorismes moltes vegades
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Trobar elements repetits
Escrit per Aaloy a 15 de June , 2008 a les 12:37 p.m.
Tenim el següent problema: "tenim dos diccionaris amb dades i volem trobar els elements d'una diccionari que estan també dins l'altra"
Suposem, per exemple que tenim:
x = {'a':1,'b':2,'r':3}
y = {'a':1,'r':3, 'c':14}
La opció més directe pareix ser la de recorre els elements de la primera llista i veure si hi són a la segona, una cosa com
for valor in x.keys():
if y[valor]:
print valor, y[valor]
a 1 r 3
o bé una altra opció més curta:
for repe in set(x).intersection(set(y)):
print repe, x[repe]
o si m'apurau
[ (repe,x[repe]) for repe in set(x).intersection(set(y))]
[('a', 1), ('r', 3)]
Ara quan algú us demani que és això de que Python ve amb les piles incloses ja teniu un exemple més per a mostrar.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python
Millores al blog
Escrit per Aaloy a 08 de June , 2008 a les 11:30 a.m.
De tant en tant faig feina al blog, no per escriure-hi sinó per afegir-hi noves funcionalitats. Encara hi ha moltes coses que m'agradaria posar-hi i millorar, però a poc a poc esper anar arribant-hi.
A la darrera actualització he fet algunes millores que recomanaven al Google Webmaster Tools com la d'afegir descripcions úniques per apunt. Django a les seves plantilles té el filtre truncatewords_html que m'ha anat fantàstic per això.
Una de les millores que volia fer també era la d'amagar un poc tota la llista de mesos que hi ha. Aquest blog té apunts des del 2004 i la llista començava a ser molt llarga. Ara veureu que sols apareixen els anys (sempre que tingueu el javascript activat clar) i que en pitjar damunt ells es despleguen els mesos. Fer això ha estat entretingut perquè ha implicat jugar amb dos tags més de Django, el for per obtenir si estava a la primera posició del bucle o a la darrera, per tal de poder tancar els divs, i el tag ifchanged que ens permet saber si una variable (en el meu cas l'any) ha canviat o no respecte al seu valor anterior.
Amb aquestes eines ha estat possible muntar l'estructura necessària per a utilitzar un el Animated Collapsible DIV, una petita utilitat per jquery que permet ocultar i mostrar divs a voluntat, agrupant-los per categories si convé.
Ara la plana principal al meu entendre queda un poc més neta i amb prou espai a la columna lateral esquerra per anar afegint més coses.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django
Capa de negoci a Django
Escrit per Aaloy a 28 de May , 2008 a les 11:55 p.m.
Del post anterior em quedava el tema de tractar el tema de la capa de negoci en els llenguatges dinàmics. Com en el cas anterior faré servir Django com a exemple i deix al lector la feina d'extrapolar cap el seu llenguatge dinàmic+bastiment preferit.
En Domingo diu que els llenguatges dinàmics mostren molta de la seva potència a la capa de presentació, que és allà on en treuen més profit. Això és veritat però es queda curt. És a dir, quan un usuari demana un canvi, el més habitual és que aquest s'acabi reflexant en la capa de presentació,però això no vol dir que no se canvii la capa de negoci. El fet però és que anar des de la capa de persistència, passant per negoci i mostrar el resultat al navegador, té un cicle de temps més curt en el llenguatge dinàmic, interpretat, que en el compilat, ja que sol ser molt més curt fer els canvis (gearing factor i totes aquestes herbes) i necessitea un temps més curt de desplegament, però no ens enganem, és tot el procés que és curt, si no afecta a capa de presentació el que passarà és que el desenvolupament serà encara més ràpid.
Sovint amb les aplicacions del tipus crea el teu blog en 10 minuts en Django, Rail o qualsevol altra, es dóna una idea equivocada del que se pot fer, donant la imatge de que aquestes aplicacions van molt bé per fer webs que depenen d'un conjunt de taules senzilles i que tenen una lògica de negoci poc complexa.
Bé, supòs que podríem demanar-li a Ricardo, que és un exemple que tenim ben aprop,de com s'ho fa per calcular el karma de Meneame o per saber si una notícia ha de sortir en portada o quan ha de deixar de ser-hi. Tot això es lògica de negoci, està feta en un llenguatge interpretat, el PHP.
En el cas de Django no oblidem que el que tenim per davall és Python i que l'ORM que ens proporciona Django ho podem fer servir o no, substituir-ho per un altre, fer les cridades directament a BD o senzillament, utilitzar-ho com a part del nostre model de negoci i posar-i les regles que ens convenguin.
Segons la nostra aplicació podem anar afegint custom managers que ens permetran definir regles damunt les dades que volem obtenir, mètodes de classe per definir les funcionalitats que vagin damunt tots els elements de la taula, i missatges que ens ajudin a manipular la informació i les seves relacions.
Això ho podem fer directament des de la classe de l'ORM, el model, o bé, recordem que tenim Python a la nostra disposició, crear un nou paquet, crear una classes o un conjunt de classes i utilitzar el model per aplicar les regles de negoci que vulguem quan aquestes s'hagin de convertir en registres de la base de dades o la seva informació hagi de venir de la base de dades. Per cert, i abans que algún ho demani, sí hi ha transaccions!
Això vol dir que podem fer servir els llenguatges dinàmics per a modelar la nostra capa de negoci, doncs sí, ho podem fer. Això vol dir que la nostra aplicació ha d'estar escrita en un llenguatge dinàmic sempre? No, depèn de l'aplicació. Potser per una aplicació concreta amb un requeriments concrets tenir un contenidor EJB amb transaccions distribuïdes serà el que necessitam, el que vull dir és que no podem descartar fer l'aplicació en un llenguatge dinàmic sols perquè ens hem quedat amb la idea de que sols va bé perquè el seu ORM te crea molt fàcilment les taules i els CRUDs.
De fet la part d'administració de Django va molt bé com a eina administrativa, però no és una eina d'usuari final. Com a desenvolupador te va molt bé perquè pots fer cerques ràpidament, començar a omplir les dades del manteniments mestres i anar directament a les butzes de les dades, però no hem de confondre això ni amb l'aplicació final i amb que és tot el que se pot fer amb els llenguatges dinàmics.
I encara hi ha un punt que no hem tractat, el tema de la integració dels llenguatges dinàmics amb els llenguatges compilats (jpython, jruby, groovy, etc). Segons la nostra aplicació i els nostres usuaris, tenir un llenguatge interpretat, fins i tot creat per al domini de la nostra aplicació pot ser una opció molt interessant. Permeteu-me una batalleta: fa un grapat d'anys vaig desenvolupar el programa de gestió d'excursions de l'empresa on feia feina (Delphi + IBObjects + Firebird), una aplicació client servidor clàssica amb un grapat de procediments amagatzemats quan feia falta. La cosa és que hi havia excursions que tenien ofertes que el proveïdor donava i que s'havien de cotitzar, ofertes del tipus: "si es reserva una excursió per dos adults i un nin, el nin tendrà un 25% de descompte damunt la tarifa" o "el tercer adult es gratis i els nins no paguen" etc. Això ho podria haver desenvolupat amb un bon conjunt de camps de la base de dades i tenir previstes les condicions, però la solució hagués estat visualment atractiva però mala de programar i molt propensa a errors. Per contra vaig optar per a modelar-ho con si fos una fórmula de una fulla de càlcul, a la que els meus usuaris estaven acostumant on es podia jugar amb el preu per data, amb sumes, restes, if i tant per cents i parèntesi, un mini intèrpret pensat per a tractar amb fórmules matemàtiques. Les condicions així posades eren flexibles i amb unes possibilitats pràcticament il·limitades respecte al que haurien estat si ho hagués fet amb una "interfície amigable". En aquest cas, integrar un intèrpret a l'aplicació va ser la millor solució.
Com no me cansaré de repetir, no es tracta de dinàmics/interpretats respecte d'estàtics/compilats. Es tracta de perdre la por i els perjudicis i poder triar en cada cas aquella tecnologia que millor s'adapti al problema a resoldre de manera que aquest es pugui resoldre amb el menor cost actual i futur per al nostre client, en alguns casos aquest llenguatge serà C, C++, C#, Java o el que sigui, però en altres, en molts altres un llenguatge dinàmic serà la millor opció per als nostres clients.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Python Django
D'errors i línies de codi
Escrit per Aaloy a 26 de May , 2008 a les 9:30 p.m.
En Domingo al seu blog fa una referència al meu apunt damunt llenguatges dinàmics i un bon grapat de bones reflexions.
Això de no creure's el que dic és una postura molt sana, sobretot perquè en la redacció d'un apunt me puc deixar detall i dades que són interessants. Una postura crítica ajuda a reflexionar i a completar les frases que d'altra banda s'haurien deixat com a dogmes de fe. Jo sóc del mateix tarannà, hi ha coses que me crec i coses que a poc que vegi indicis de contradiccions, doncs cerc més informació o deman explicacions. Això, he de dir també, m'ha causat força problemes en el món empresarial, on sovint el "no pensis" és una qualitat que ajuda a progressar.
Bé, però no me'n vull anar per les bardisses, o sí, ja que hi sóm, aprofitaré per dir perquè no faig servir el Twitter: no hi ha espai abastament :)
Afirmació: El nombre de línies de codi que escriu un programador al dia és una constant. Això és un efecte estadístic. Fa temps es parlava de que un programador escriu cinc línies de codi sense errors al dia. Està clar que és una dada estadística i fins i tot controvertida, ja que que és molt complexa definir què és i que no és una línia de codi i de que les línies de codi no s'han de fer servir per mesurar el rendiment. Tot i això podem trobar referències capítol 5 de Software estimation de McConnell on a la Taula 5.1 torbam la relació entre les línies d'un projecte i les línies de codi per programador i any. Això no vol dir que tots els programadors escriguin les mateixes línies de codi (de fet la productivitat entre programador pot arribar a un factor 10 -Peopleware-, però sí que en mitja i per a una organització i projecte, el nombre de línies de codi que s'escriu en promig és constant. A Sofware Mesurement and Estimation diu "Studies have shown that a proficient programmer can programm aproximately the same number of debugged lines of code per day regarless of the language". D'aquí que gent com QSM o David Consulting Group facin comparatives entre llenguatges per a comparar l'expressivitat de cada llenguatge. Per exemple C té un gearing factor de 128 i Java de 53. Això vol dir que una funció que en C necessita 128 línies de codi en Java en necessitarà en promig 53. Si un programador experimentat escriu, essent optimistes 10 línies de codi depurat al dia, llavors necessitarà 13 dies en C i 6 en Java (nombres redons).
D'aquí llavors que els llenguatges dinàmics, al necessitar menys línies de codi per fer el mateix poden completar els projectes en un temps més curt. Com que el temps significa doblers, implica que els projectes surten més barats.
Afirmació: el número de errores directamente proporcional al número de líneas que se escriben Aquí també entram en temes estadístics. De fet es parla de nombre d'errors d'un programa per mils de línies de codi. De la mateixa manera que en el cas de les línies de codi que escriu un programador, hi ha moltes diferències, però Casper Jones a "Program Quality and programmer Poductiviy (1997)" va recopilar algunes dades, que també cita en McConnell. També Reifer en va fer estudis, per exemple per la part Web estudià 65 projectes, i trobà que el ratio és de 6 errors per KESLOC (KESLOC Kilo (Thousand) Equivalent Source Lines of Code). Aquest nombre depèn força del tipus del projecte i de l'organització, però és estadísticament significatiu. Per tant, si donam com a bo el que els llenguatges dinàmics necessiten menys línies de codi per expressar el mateix que els llenguatges compilats tradicionals (Java, C, C+, ...) tendrem que el nombre d'errors en valor absolut també serà menor.
He trobat també una comparativa entre el nombre d'erros per Java i C++ a un paper de Geoffrey Phipps anomenat Comparing Observed Bug and Productiviy Rates for Java and C++, me l'he d'acabar de llegir, però conclou que amb un 95% de confiança C++ té 9,7 vegades més defectes per KLOC que Java i que a més els defectes en Java són més fàcils de corregir. D'aquí a fer una extrapolació cap a la banda dels llenguatges dinàmics hi ha sols un pas, sols falta que algú s'animi a fer l'estudi.
En Domingo també demana l'opinió damunt els llenguatges dinàmics per la capa de negoci, però això crec que dóna per un apunt per ell sol, així que ho deixaré per la propera vegada, però promet, amenaç, amb tractar-ho.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica Python Django
Llenguatges dinàmics
Escrit per Aaloy a 25 de May , 2008 a les 11:18 a.m.
Al blog de Ricardo he esta llegint l'apunt anomenat "Lenguajes dinámicos, programadores y FUD" així com els seus comentaris. Tot i que hi he deixat allà un comentari amb la meva opinió, crec que com a programador en llenguatges dinàmics i tradicionals he de dir la meva.
El primer de tot que voldria fer és evitar el FUD damunt els llenguatges dinàmics, per una raó molt senzilla: la realitat és molt cruel i estam cansats de veure i de llegir damunt projectes web realitzats en Python, Ruby o PHP que estan triomfant i que no desapareixen o exploten per mor de no tenir un llenguatge compilat al darrera. Per tant, la primera cosa que hem de tenir clara és que la teoria pot estar molt bé, però la realitat ens està dient dia a dia que és possible escriure i mantenir programes en llenguatges dinàmics. A un li poden agradar més o menys aquests tipus de llenguatges, però el que no es pot fer és negar la realitat.
També m'agradaria focalitzar l'àmbit de discussió: estam parlant de programes web. Per programes d'escriptori no tenc dades abastament, potser perquè els llenguatges dinàmics brillen en el desenvolupament web més que en la part d'escriptori, llevat de que considerem el Visual Basic com a llenguatge dinàmic, clar.
La cosa està en que amb les màquines actuals els llenguatges dinàmics son ja prou ràpids com per ser competitius amb els llenguates compilats. Això no vol dir que siguin més ràpids, sinó que són prou ràpids per fer la feina i que la diferència de velocitat que hi hagi no sigui rellevant. Que PHP ens serveixi una plana en 1 segon i en Java la serveixi en 0,98 segons, doncs no és rellevant ja que per l'usuari de l'aplicació no significarà cap diferència en l'espera.
Això vol dir que ens hem de passar ja a programar en un llenguatge dinàmic i deixar els compilats? No. Vol dir que és necessari que a més d'un llenguatge tradicional convé que tinguem al caixò de les eines un llenguatge dinàmic. D'aquesta manera quan ens demanin una aplicació podrem sospesar els pros i els contres i fer-la en el llenguatge que s'adapti millor al projecte. Fins i tot si el nostre projecte es farà en un llenguatge tradicional, tenir un llenguatge dinàmic se pot integrar al projecte en forma de rutines de generació de codi, scripts de testeig, etc.
Dit això, i considerant l'àmbit de les aplicacions web, anem a veure avantatges i inconvenients d'elegir un llenguatge dinàmic per al nostre projecte, com que el que més conec és el Python, em permetreu la llibertat de donar els exemples i les referències en aquest llenguatge, in en Java en el cas de llenguatge compilat, en el ben entès que segur que hi ha el mateix tipus de solucions en Ruby, PHP o el vostre llenguatge dinàmic preferit i en C, C++ o .Net, etc.
Cicle de desenvolupament Agafem una aplicació web típica Java desplegada a un servidor Tomcat i la mateixa aplicació feta en Python. El cicle al primer cas és: escriure codi, compilar, corregir els errors de sintaxi, desplegar-ho al servidor, provar i iniciar novament tot el cicle, bé per escriure nou codi o bé per corregir els errors. A l'aplicació Python+Django tendríem: escriure codi, provar i tornar a escriure el nou codi. L'augment de productivitat la tenim no per el fet de no tenir que corregir errors, sinó pel fet de no tenir temps d'espera en el desplegament i per haver d'escriure menys línies de codi.
Errors de sintaxi. Aquí algun haurà pensat, "s'ha deixat els errors de sintaxi", efectivament, ho he fet perquè vull dedicar-lis el seu propi apartat. El compilador caça els errors de sintaxi i ens n'informa, però això vol dir que hem d'executar el compilador, és veritat que això els IDEs com Eclipse ho fan automàticament, però tot i això s'ha de fer. Realment podem fer el mateix amb eines com Pylint o Pychecker i a més el primer a més és capaç de treure tot un conjunt d'estadístiques damunt la qualitat del codi, talment com ho fan eines Java com PMD. El pylint per exemple és el que fa servir PyDev per a indicar els errors de sintaxi i donar avisos damunt el codi. Està clar que aquests errors potser no seran tan acurats como els dels compiladors, però són prou bons com per fer la feina, amb l'avantatge, però que ho podem llançar quan nosaltres vulguem i que no s'ha de passar necessàriament pel compilador per a executar el programa.
Per una altra banda, que el compilador o pylint ens caci els errors de sintaxi ens pot donar una falsa sensació de seguretat, el errors de sintaxis poden fer petar l'aplicació, és veritat, però els errors més greus solen ser els errors en la lògica de negoci de l'aplicació. Quan aquests se detecten el que s'ha de fer és corregir-los el més aviat possible, i en aplicacions web entram en
La fase de desplegament El temps que necessitam per posar una aplicació en producció seria anecdòtic si les aplicacions no tinguessin errors. Necessitar 30 minuts o 10 minuts per una aplicació que es posi en producció i que estigui mesos o anys sense modificar-se no és significatiu. Però, si l'aplicació sofrirà canvis o els errors que es detectin s'han de resoldre el més aviat possible, una diferència de 30 minuts en el desplegament pot marcar la diferència. En el cas d'un error en la lògica de l'aplicació que afecti a un .jar, significa en el millor dels casos compilar l'aplicació o el jar corresponent, substitur-ho i reiniciar el servidor d'aplicacions o l'aplicació, cosa que pot dur entre uns 30 segons y un bon grapat de minuts, depèn del que hi hagi desplegat. El el cas d'un llenguatge dinàmic sovint basta actualitzar els arixus afectats (svn update per exemple) i fer un reload del servidor Apache que tenguem. Cosa d'un parell de segons tot plegat. Està clar que podem minimitzar el primer cas amb servidors redundants i configuracions d'alta disponibilitat, però a un cost major de complexitat.
L'orientació a la tasca Les aplicacions web tracten fonamentalment amb text i produeixen text. Agafam dades de formularis, les tractam, obtenim dades de les bases de dades i les manipulam per a presentar-les a l'usuari en una sortida HTML, etc. Tractar cadenes és part fonamental de les aplicacions, i això és una cosa que els llenguatges compilats fan en general força malament des del punt de vista del nombre de línies de codi que s'han de picar. Els llenguatges dinàmics són força bons tractant informació textual. Posaré un exemple que ens pot servir per il·lustrar aquest fet: les plantilles. En Java tenim tres llenguatges de plantilles principalment: JSP-EL (ja ho sé està agafat pels pels però acceptau-me'l), Freemaker i el venerable Velocity i en general són força infumables. Comparem-ho amb el que hi ha per Python i veurem la diferència (Django, Web String, Cheetath, Mako, Jinja, ...). No crec que sigui anecdòtic, la diferència és que és força senzill manipular text en Python i per tant és força senzill crear-te el teu propi llenguatge de plantilles.
Productivitat El nombre de línies de codi que escriu un programador al dia és una constant. Això vol dir que si volem tenir més productivitat s'ha d'anar cap a llenguatges que ens permetin escriure més funcionalitat en menys codi. Donat el boom que viuen actualment els llenguatges dinàmics encara no hi ha molta literatura al respecte in encara no hi ha ni Ruby, ni PHP ni Python al QSM, però sí que hi ha forces comparatives, una de les més interessants és la d'Stephen Ferg que senyala que programar en Python és de 5 a 10 vegades més productiu que fer-ho en Java.
Diversió i motivació Els llenguatges dinàmics són sexy. Permeten al programador un alt grau de realimentació. Pot provar les seves idees molt ràpidament i això el motiva molt més que tenir que esperar a que el compilador acabi per poder fer les proves.
Pel demés, els llenguatges dinàmics també necessiten unit tests (sols que es poden escriure més ràpidament i amb menys línies), una gestió acurada dels projectes, planificació del que volem fer i refactorització del codi.
La conclusió de tot això és que deixem de banda FUDs que no duen a res i a l'hora d'avaluar un projecte considerem també si és apte per a ser fet en un llenguatge dinàmic, si ho és endavant, el nostre cul no perilla per dita elecció, ja que tant Python, com Ruby com PHP seran prou capaços de fer la feina.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django
vim ide per python
Escrit per Aaloy a 17 de May , 2008 a les 9:22 a.m.
Aquesta setmana i gràcies a l'entrada del blog de sontek he retornat al vi com a editor principal per a la programació en Python.
Periòdicament estic canviant entre vim, kate o Eclipse amb PyDev, segons la màquina en que faig feina i el que estic fent, però pas gran part del temps fent feina amb la consola i trobar la configuració que permet tenir el millor de els entorns gràfics a vim m'ha sorprès gratament.
Amb la configuració i el conjunt de plugins que ha seleccionat sontek tenim un editor que permet tabs, autocompletat, plantilles, integració amb subversion i tota la potència d'edició de vim. El tema del depurador integrat està un poc més verd, però tampoc l'he trobat massa a faltar.
A un dels comentaris hi havia la recomanació per a la instal·lació a més de NERDTree un navegador de fitxers integrat al vim que facilita molt la vida, i també ho vaig posar. També he adaptat les plantilles que venen per Django per a que agafi la sintaxi del trunk i he afegit algun retoc més com que posi la codificació als fitxers i coses així, les plantilles són tan bones de modificar que me pareix que puc acabar amb un bon repositori de codi :)
Tot i que no poseu la configuració crec que és interessant fer-hi una ullada a com ha organitzat Sontek (John M. Anderson) el seu fitxer de configuració per veure un exemple del que es pot fer amb vim i de com es pot incloure codi Python dins l'arxiu de configuració. Una de les maneres d'aprendre a programar és llegir codi d'altres (bon codi si és possible) i en l'arxiu de configuració de vim podem dir el mateix: llegint configuracions d'altra gent podem arribar a personalitzar l'editor fins a límits insospitats.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Python Django
Tras el incierto horizonte
Escrit per Aaloy a 11 de May , 2008 a les 11:02 a.m.
Ahir vaig acabar de llegir Tras el incierto Horizonte de Frederik Pohl. La novel·la està força bé per als que com a mi ens agrada la ciència ficció dura, és a dir, amb força referències científiques i tecnològiques, i aquesta novel.la n'està farcida: intel·ligències artificials, forats negres, astronomia, referències a les constants universals...
La trama és també molt bona, lligant a poc a poc les subtrames que hi ha, com l'origen del Patriarca o els Primitius i com a bona novel·la de ciència ficció deixant-te amb més interrogants que respostes.
De totes maneres val a dir que se li nota un cert pas del temps, hi ha que pensar que l'escrit original és de 1980, quan fa referència a quantitats monetàries (1 mil·liò de dòlars per exemple donen per moltes coses a l'època i no ara) i en algunes referències als ordinadors: un gigabit és una gran quantitat de memòria, ordinadors amb aquesta memòria que omplen una nau ... Tot i això, entra també en la manera de programar les intel·ligències artificials i en el concepte de pagament per us de potència informàtica, propi dels anys 70-80 i que ara amb Google i Amazon torna a estar vigent.
El llibre es pot llegir independentment de la nove·la anterior, Pórtico, ja que les referències s'expliquen prou bé i no interfereixen gaire en la trama principal.
Deu euros ben gastats i un bon grapat d'hores de diversió!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Pont blanc
Escrit per Aaloy a 05 de May , 2008 a les 9:40 p.m.
Com molta gent jo també m'he agafat el pont. Han estat un grapat de dies per descansar un poc, desconnectar un poc (no me'n vaig endur el portàtil) i gaudir de la companyia de la família i els amics (Pere, Marga, Aina i Neus) que amablement ens van acollir a casa seva i ens feren de guies per l'illa d'Eivissa i Formentera.
Es veu que en aquesta època encara no hi ha molta gent pel mig i es pot gaudir de les illes com toca, sense massificacions, a poc a poc i anant un poc més enllà del turisme de discoteca, bauxa i platja. Són illes fantàstiques, amb unes vistes meravelloses i on encara et pots sentir sols i acompanyat a la vegada.
Deixant els aspectes més bucòlics, dir que em va sorprendre agradablement el viatge amb Balearia (no pos l'enllaç a la plana, perquè la veritat, no li fa justícia a la comoditat del viatge i tanmateix no funciona massa bé) i desagradablement el Chevrolet Kalos que llogarem (a l'oferta d'Internet posava Peugot 206 o equivalente). Resultà un cotxe sense gens d'acceleració, de mel i sucre, amb un cosum molt més alt que el que em pensava (amb el Saxo he de dir que estic molt mal acostumat) i el que és pitjor, amb un disseny que feia que amb quedàs sense vissibilitat a les corbes d'esquerra. Per acabar-ho de rematar el volant esta disposat de tal manera que tapa el contaquilòmetres. Bé, al manco ja sé quin cotxe no compraré.
Passades les vacances es pot dir que comença un nou cicle. L'empresa per la que treball viu un procés de fusió que en aquests moments, sigui per unes raons o altres, ha degenerat en una fuga de capital humà cap a altres empreses (director general, director financer, director d'informàtica, directors regionals, etc. etc) i on la política oficial respecte a sous i possibilitats de promoció és la de no pujar l'IPC i on se'ns va dir que per promocionar el millor que es pot fer es canviar de feina cap a altres empreses (bé, al manco no es podrà dir que no es predica amb l'exemple!).
Com no podria ser menys també estic a la recerca activa de feina, per les mateixes raons que altres companys que ja han deixat l'empresa, però en el meus cas me trob que he d'entrevistar a gent per a cobrir els llocs buids.
Un és un professional i faig la feina el millor que sé i puc, mirant de trobar les millors persones per la feina entre els currículums que m'han arribat. Tot i això, des del punt de vista ètic em sent violent entrevistant gent quan jo mateix estic cercant feina, quan el futur és incert a l'empresa, quan qui entri en plantilla es trobarà a poc amb que el seu poder adquisitiu ha baixat a l'any següent i quan no m'atrevesc a recomanar la feina a amics i coneguts amb feina per por a fer-los la putada de la seva vida.
El que sí veig és que ara per ara, la majoria de gent que ens està arribant (i llevat d'alguna excepció) és gent que no s'ha molestat gens en aprendre res pel seu compte, que veu la informàtica i la programació com aquell que posa maons, que li han de dir com es fa una cosa i llavors la fan, però que no se molesten en veure si hi ha coses millors, ni tan sols s'ho plantegen. No és el tipus de perfil que m'agrada, però pareix que és el tipus de perfil que ara per ara vol canviar de feina i veu en el mercat àvid de programadors Java l'oportunitat de progressar econòmicament encara que professionalment no tengui el tarannà, l'experiència o els coneixements que haurien de tenir.
Potser, però, aquest sigui el tipus de perfil que l'empresa espanyola demana o que sigui el perfil que està disposada a pagar. L'emperò és que aquest tipus de perfil acomodatici i institucionalitzat no rendeix, no innova, no evoluciona, i si el teu negoci es basa en un component tecnològic important, com és el cas de la web, fotuts estam.
Aquests dies de vacances m'han fet reflexionar, plantejar-me el futur i decidir-me de l'espera passiva a l'espera activa, sigui amb un canvi de feina, sigui donant una empenta major al projecte d'empresa o senzillament fent de freelance si el projecte és prou interessant. El que tenc clar és que no m'agrada tenir conflictes ètics, no tenc edat.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: General
Dos llibres
Escrit per Aaloy a 26 de April , 2008 a les 10:21 a.m.
Mentre esperàvem al vol de tornada vaig aprofitar per anar de compres per l'aeroport, a una llibreria com no pot ser d'altra manera :) Vet aquí el que vaig comprar:
Tras el incierto horizonte, de Frederik Pohl, editat per Zeta. M'agrada la ciència ficció i ja fa un bon grapat d'any vaig llegir Pórtico, així que vull provar sort amb la continuació. De Pohl llegit també "Mercaderes del espacio" i "La guerra de los mercaderes" i també m'agradaren força. Esper que aquesta novel·la, de 362 planes, estigui al nivell de les altres.
Sun Tzu. El Arte de la Guerra. Comentat per Tao Hanzhang, de l'editorial Bresca. Per allò que és un llibre molt citat (a el juego de Ender per exemple) i també recomanat per les escoles de negocis. En la situació actual potser un títol del tipus "El último que apague la luz" de l'editorial Melaspiro o "Maricón el último" de A. Hisus Quedais hagués estat més adient, però bé un poc de culturilla, sempre va bé.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Alfresco Community Conference
Escrit per Aaloy a 25 de April , 2008 a les 9:37 p.m.
El dia 22 d'aquest mes vàrem assistir a l'Event d'Alfresco Community Conference a Barcelona. Per a qui no ho conegui Alfresco és un DMS (Document Management System) lliure que ha agafat molta volada darrerament, encara que és un producte molt jove.
Per anar-hi agafàrem un vol molt prest, no eren encara les set del matí, i això vol dir aixecar-se a les cinc del matí. En favor de la gent d'Alfresco he de dir que les conferències varen ser prou interessants com per a mantenir-me despert, encara que no puc prometre que se m'escapàs el cap alguna que altra vegada.
A nivell organitzatiu les conferències varen estar molt bé: la sala molt ben preparada, amb traducció simultània fins i tot i la intendència (la teca) prou bona. Sols em va quedar el dubte de perquè un recinte amb capacitat amb tanta gent té uns excusats com els que té. Mai havia anat a un lloc on els tios fessin coa per anar al bany.
Punts anecdòtics a part, he de dir que vaig sortir força content de les conferències. Vàrem veure cap a on apunten les novetats d'Alfresco i de pas també es pogué veure cap a on desenvolupa la gent. Els d'Alfresco estan deixant els JSF, segons ells fan que les aplicacions siguin molt males de mantenir, i vàrem poder veure dues aplicacions, una feta per un desenvolupador independent i una altra oficial d'Alfresco, que tenien una cosa en comú: estar desenvolupades amb Extjs. Els d'Alfresco han fent una aposta molt forta per la comunicació de l'aplicació amb json, xml, rest, webdav, etc i segons vàrem poder veure han fet que sigui força fàcil poder publicar la informació en aquests formats.
Potser sigui autoconvenciment, però la cosa és que el tema del JSF no m'ha acabat de convèncer mai. Massa enrevessat i mal de mantenir, però és el que empreses com Oracle estan recomanant per fer el canvi tecnològic de Forms cap a la web, l'excusa és que hi ha dissenyadors visuals per JSF, però em fa por que amb l'excusa de la productivitat a l'hora de pintar pantalles s'estigui optant per una tecnologia que aviat quedarà obsoleta. La gent té tendència a anar cap a coses que agumenten la productivitat, deixen fer coses i els faciliten la vida, d'aquí que bastiments com Spring i Hibernate triomfin on els EJB varen fracassar.
La gent d'Alfresco pareix que ho veu clar i que s'estima més retirar-se ara i apostar cap a una altra tecnologia més mantenible per la capa de presentació. Potser va ser una de les millors conclusions que en vaig poder treure de la conferència.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Java
Aquest blog ja té calendari
Escrit per Aaloy a 19 de April , 2008 a les 2:16 p.m.
Una de les coses que li faltava al blog (entre d'altres) era la d'un calendari mensual on es poguessin veure els dies que hi ha apunts.
Trob que és una bona cosa que el calendari estigui a la plana principal, ja que serveix per donar una idea del ratio de publicació d'apunts al blog, i a més ens permet una navegació molt ràpida a les entrades del darrer mes.
Per posar el calendari inicialment he intentat fer servir un snippet però no m'acababa de fer el pes. A més tenia que lligar-ho amb el dia d'avui per defecte i amb el mes o dia que estigués vegent l'usuari del blog. Així que he acabat per fer el meu propi template tag. Aquest agafa una variable del tipus datetime que estigui al contexte de la plantilla i renderitza el calendari, anant a cercar si hi ha apunts en cada dia.
El tag no ha quedat molt genèric, ja que està acoblat a blog, però és prou senzill d'adaptar per fer un calendari genèric. El que m'ha duit gairebé més feina és la part d'estils. Com veureu encara queda un tant "cutre", però com que ja fa la feina, doncs a publicar-ho i ja ho aniré polint.
També vaig posar una altra xorrada l'altra dia, un gràfic que fa servir l'API de Google i que permet veure un diagrama de pastís amb la classificació d'apunts per tag. Si feis clic damunt la paraula tag ho podreu veure.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Django
Primeres modificacions al blog nou
Escrit per Aaloy a 15 de April , 2008 a les 9:11 p.m.
Avui he fet les primeres modificacions al Blog. Ja us deia que això de posar en producció les coses et força a trobar i corregir els errors més ràpid.
M'he trobat que els RSS no funcionaven. La idea era mantenir la compatibilitat amb els RSS de Wordpress, de tal manera que els vells subscriptors no notassin el canvi, però me vaig deixar una s i no anaven. El canvi ha esta molt senzill, però ha sigut cosa d'esperar a arribar a casa per fer les modificacions.
De pas he aprofitat per arreglar quatre etiquetes que no estaven ben posades i posar una validació als comentaris de manera que "peti" en posar un comentari buid. La part de comentaris és potser el que menys m'agrada, ja que encara fa servir les llibreries de oldforms de Django i jo ja estic molt acostumat a les noves. El canvi de oldforms a newforms serà de les primeres coses que vull fer. El que em frena un poc és la part de control de l'spam, però miraré si puc fer servir algun component per a connectar amb l'Akismet i fer-ne el backoffice per a controlar-ho.
De les coses que més m'agraden del nou programa és la possibilitat de fer servir el Markdown per a escriure els posts. Al Wordpress segurament se deu poder fer alguna cosa per l'estil, però no m'hi he volgut barallar mai. Vaig posar també javascript per a colorejar codi Python, així que ara veureu que els articles que tenguin codi quedaran un poc millor presentats.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Powered by Django
Escrit per Aaloy a 14 de April , 2008 a les 9:24 p.m.
Un dels propòsits del 2008 pareix que ja s'ha complert. Gràcies a Bernat avui hem canviat el blog vei en wordpress que quedarà a blog.trespams.com, més que res per si alguna cosa anàs malament mentre es fa el canvi.
El nou blog està en fase beta, però seguint els principis del la programació àgil, he preferit posar-ho en producció i anar polint els detalls que queden. Com podeu veure pel titol el blog és Django powered. Corre damunt un servidor dedicat que tenim per APSL dins un entorn chroot que en Bernat ha montat.
El codi font del blog està disponible al repositori de google code, com a una branca amb suport unicode del blogmaker, així que tothom és benvingut a col·laborar-hi i a posar-hi tickets pels errors que segurament hi trobareu.
Al codi font també hi ha l'importador de Wordpress cap al blog, de manera que veureu que els articles de l'antic lloc, comentaris i trackback estan inclosos en el nou. La importació no ha estat massa complexa i s'ha fet a partir de l'exportación en format RSS que fa el Wordpress. Tot i això hi ha petites millores a fer, com les de tractar millor els paràgrafs. Alguns articles encara no han passat per la modificació i les lletres es veuen molt atapides, fruit de la combinació de l'importado i de la fulla d'estils que he fet servir per a contruir el lloc, el multiflex.
Encara queden cosetes a polir, veig que m'he deixat el peu del "powered by django" per exemple, la part d'agraïments, etc. etc. que aniré posant durant els propers dies i setmanes. El d'avui és una beta, gairebé alfa, però com us dic, crec que l'important és perdre la por i posar-ho en producció i anar-ho millorant dia a dia.
Traducciones/Translations by apertium
6 comentaris, 0 trackbacks (URL) , Tags: Python Django
Python for Scientists
Escrit per Aaloy a 13 de April , 2008 a les 12:49 p.m.
L'altra dia a la llista de Python announce vaig veure que hi havia una comunicació de P.Raybaut on deia que havia llançat el Python (x,y), una distribució de Python orientada al món científic.
A mi, pel meu passat en això del càlcul numèric i científic,per mor de un bon grapat d'assignatures de càlcul numèric de Físiques, la idea m'agrada molt i es d'agrair l'esforç que ha fet aquest senyor per triar i integrar un bon grapat d'eines que de ben segur ajudaran a la gent que tengui que fer càlculs numèrics i manipulació de dades.
A part de que hom faci servir la distribució o no (està força orientada al món Windows per exemple), el que és també interessant és veure la selecció de llibreries i programes que s'ha fet. Permet fer des de processament de senyals amb SciPy a manipulació del port paral·lel o sèrie per l'entrada de dades, sense oblidar que inclou la integració del dissenyador de les Qt i les PyQt mateixes.
En Ricardo al seu blog apuntava que havia canviat la introducció a Perl per una introducció a Python i Django. Potser l'aparició de paquets com Python (x,y) servirà per a que el càlcul numèric sigui molt més amè per les noves generacions de físics, matemàtics i estadístics. En el món de la física el FORTRAN és el rei del càlcul numèric encara, però amb eines com aquest la cosa pot anar canviant. Si més no la combinació de Python i interfícies cap a llibreries FORTRAN pot donar-nos el millor d'ambdós mons, amb permís, això sí, de projectes com Parallel Python, del qual esper poder parlar-ne un altra dia.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Ja tenim el compte d’Appengine
Escrit per Aaloy a 11 de April , 2008 a les 11:37 p.m.
Doncs això, fa poques hores he rebut el missatge que diu que ja puc fer coses amb l'Appengine de Google, en morenosan en va dir ahir que havia rebut també el seu, així que pareix que estan obrint el grifó bastant de pressa.
Ara es cosa d'anar pensant què es pot fer. De totes maneres no es tant l'aplicació en sí, com poder provar l'entorn i començar a veure les seves possibilitats, com s'hi fa feina, quines diferències hi ha entre poder fer l'ORM de Google i el de Django, veure les limitacions que ens imposa...
Temps al temps!
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python Django
El millor IDE per Python i Django
Escrit per Aaloy a 10 de April , 2008 a les 10:28 p.m.
Amb tot el rebumbori del llançament de l'appengine supòs que aviat tendrem una munió de gent demanant-se quin IDE és el millor per desenvolupar en Python i Django, peticions de recomanacions, etc. Vull tractar d'adelantar-me a les peticions, així que us diré quin es per mi el millor entorn de desenvolupament per Python i Django: es diu Gnu-Linux i dues pantalles panoràmiques de 20".
Python és un llenguatge interpretat que et permet fer proves molt ràpidament, sovint el que fas es obrir una consola (recomanació mirau IPython com a consola) i començar a provar les idees que tens. Va molt bé per provar la sintaxi, fer petites proves, depurar, etc). Per tant el que necessitam és un entorn que ens permeti tenir un sistema de consoles potent on sigui fàcil llançar l'intèrpret i tener tantes consoles com volguem. Aquí els Linux sobresurten i veureu que es una eina molt potent de programació.
Si a més hi posam Django ens trobam que necessitam llançar el servidor i veure'n les traces així que necessitam una consola addicional que és convenient que estigui visible mentre anam fent els canvis i les proves. Per aquí ja podeu veure el perquè dels dos monitors de vint polzades. Així en una pantalla podem tenir l'editor que facem servir (ara hi aniré a això) i a l'altra podem tenir la consola del servidor, el navegador i alguna consola addicional per anar culetjant.
Del navegador supòs que no farà falta dir que per desenvolupar res millor que el Firefox amb les extensions del Firebug i el Web Developer, veritat?
Passem doncs a l'editor. Personalment l'elecció de l'editor té a veure amb l'ús que n'he de fer a la sessió de treball. Si la previsió és que desenvoluparé una bon grapat d'hores faig servir Eclipse amb el plugin PyDev a la pantalla d'edició, l'altra com us dic, queda reservada pel navegador i la consola de Django. Si sols he de fer petites modificacions o vull provar alguna cosa l'elecció principal és el vim i sovint faig servir el Kate, ja que té un afegitó que permet executar, sí ho heu adivinat, una consola.
Idependentment de l'editor que a cada un li vagi millor, és molt útil manejar-se mínimament amb el vi/vim, ja que ens permetrà fer modificacions ràpides als servidors de producció, modificacions que s'hauran d'integra dins el sistema de control de versions (SCM), que tot val a dir-ho és imprescindible i ha de formar part del nostre entorn de desenvolupament. L'elecció del sistema de control de codi depèn també de les preferències personals de cada un, però per començar no és una mala elecció anar cap el subversion, ja que hi ha interfícies gràfiques força ben fetes que ens ajudaran en la tasca, un parell de plugins d'eclipse i una linea de comandaments prou potent que ens permetran treballar amb el sistema de control de versions sigui quina sigui la nostra elecció d'editor, tanmateix sols es cosa d'obrir una consola.
El millor IDE per mi no és un programa, és la combinació de programari, maquinari i millors pràctiques que fan que la nostra experiència de programació en Python i Django sigui productiva i divertida, sense perdre mai de vista la potència que ens dona la línia de comandes. Si en el teu projecte Python depens de les facilitats que te dona un editor determinat per a escriure codi, segur que estàs fent quelcom malament.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Bons temps per Python
Escrit per Aaloy a 09 de April , 2008 a les 12:03 a.m.
La blogosfera en va plena Google ha llançat el seu appengine , un servei que permet hostejar aplicacions de fins a 500 Mb d'espai i 5 milions de visites mensuals que Google ha llançat i que té com a llenguatge vehicular el Python.
Per a accedir-hi un s'ha d'apuntar a la llista d'espera, ja que pareix que els comptes en fase beta s'han esgotat, i tot i les limitacions del sistema en el que fa referència als accessos als sistemes de fitxers, limitacions de la part de base de dades, que no es puguin llançar subprocessos i coses per l'estil, obre la possibilitat a tot un ventall d'aplicacions web.
On la notícia ha impactat més és a la comunitat Python: un llançament espectacular de Google, amb Guido pel mig, am Python com a protagonista i amb Django com a estrella convidada, ja que Django, encara que la versió "estable", ve de sèrie en el sistema.
Si encara no ho heu fet és un bon moment per aprendre Python i Django (ueps, tal volta seria un bon moment per publicitar-ne cursos :-P ) ja que un dels emperòs més grans que hi havia és que no se disposava d'un servidor a preus assequibles on poder fer anar les aplicacions. Ara amb el llançament de Google, les possibilitats de fer desenvolupaments amb Python i Django es multipliquen, limitats a les possibilitats de l'entorn que proporciona Google, sí, però permetran en breu començar a fer aplicacions web i hostetjar-les a un preu inmillorable.
Amb això esper a més que els hostingaires de sempre es posin les piles i donin a preus raonables allotjament per Django, proporcionant a més el servei que ara Google no ofereix: el de tenir una base de dades relacional pròpia al darrera.
I és que un dels grans problemes de l'oferta de Google és que no ets ben bé l'amo de la teva base de dades i algunes coses que permet fer l'ORM de Django molt fàcilment a l'ORM substitutiu de Google no es poden fer.
És clar que no totes les aplicacions necessiten d'una base de dades relacional al darrera, així que l'appengine de Google és per una part un bon banc de proves per veure com va això de la programació web amb Python i Django i per una altra una manera ràpida i econòmica de posar en producció projectes web que d'altra manera tendrien un cost prohibitiu pel programador mig.
Traducciones/Translations by apertium
2 comentaris, 3 trackbacks (URL) , Tags: Informàtica Python Django
onAIR2008
Escrit per Aaloy a 02 de April , 2008 a les 7:49 p.m.
El dilluns vaig anar a la presentació de l'onairtour d'Adobe, on es presentava la tecnologia air i flex mitjançant un bon grapat de conferències.
L'organització va estar força bé, el comentari que ho resumeix seria el de "he estado en bodas peores" (en madrileny a l'original), ja que cada dues conferències hi havia sessió de tapeo.
De la part tecnològica doncs un sabor agredolç. Per una part una tecnologia que no saps ben bé si és oberta o tancada, si serà realment multiplataforma de bon de veres o sols lligada a uns sistemes operatius concrets, i per l'altra tens el veure que per certes aplicacions el que es presentava tenia moltes possibilitats.
La idea en sí és bona i crec que Adobe ha fet un bon ús de les possibilitats de webkit. El problema és que ja sabem com les gasta aquesta empresa i jo sóc un bon exemple, ja que no hi ha visor de flash per Linux PPC, així que per molt interessant que em paregui la tecnologia ara per ara ni és del tot lliure ni és totalment multiplataforma.
Per una altra banda, les APIs pel que digueren encara estan força verdes, amb molts canvis d'una versió a un altre.
La idea d'Adobe és que la gent pugui aprofitar els seus coneixements de Javascript per fer aplicacions d'escriptori i fins i tot fer aplicacions que puguin fer feina desconectats de la web i això mateix és el que pretén també Google amb Gears, així que ens esperen temps interessant en aquesta tecnologia.
El problema que hi veig en tot això és que s'està tornant a reinventant la roda. Ara el cool és fer aplicacions d'escriptori programant amb Javascript. Què voleu que us digui, si tenc que fer una aplicació d'escriptori multiplataforma ara per ara pegaré a Python i les pyQt o les wx. Si a més la vull per web, doncs ja n'hem de parlar un poc més, però no crec que l'objectiu final sigui fer aplicacions client-servidor en Javascript.
Aquest tipus de tecnologia segur que té grans avantatges si la teva aplicació ha de permetre't poder fer feina desconnectat de la web. L'emperò és que cada vegada la gent viu connectada i no desconnectada, de manera que la necessitat de tecnologies d'aquest estil cada vegada serà menor.
L'altra "novetat" és que air ens permetrà accedir directament a la màquina de l'usuari, se suposa que amb totes les precaucions (signat de certificats - pagant clar). Coneixent l'usuari mig, que no llegeix els diàlegs i es limita al "siguiente-siguiente", doncs supòs que d'aquí poquet podrem veure els primers virus escrits en javascript per air.
En definitiva, una presentació molt bona, una organització excel·lent, unes cadires que te deixaven el cul que no sabies si era teu i una tecnologia que té coses bones, però que ara per ara no me mereix prou confiança com per a recomenar-la.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Propietats a Python
Escrit per Aaloy a 21 de March , 2008 a les 1:41 p.m.
En Corey Goldberg al seu blog a un recull interessant d'enllaços de lectura obligada per aquella gent que està fent la transició de Java o C# cap a Python.
Un dels més interessant és l'article de Phillip J. Eby anomenat Python is not Java on recull les diferències fonamentals que hi ha entre programar en Java o programar en Python. Una de les afirmacions més xocants és potser aquesta: Getters and setters are evil. Evil, evil, I say! Python objects are not Java beans. Do not write getters and setters, és a dir "Els getter i setters són el dimoni. El Dimoni, dic. Els objects de Python no són Java beans. No escriguis getters i setters."
La frase pot semblar molt bèstia, i de fet ho és, ja que és una afirmació que s'ha de matitzar molt, com de fet ho fa en Ryan Tomayko al l'apunt Getters/Setters/Fuxors on s'explica molt bé quan fer servir aquest tipus de construccions, però en definitiva el que ens hem de quedar és amb la idea de que normalment Python no necessita mètodes accessors i que l'ús normal d'aquest és el de marcar un atribut com de sols lectura.
Com sempre hi ha "la manera de Python" de fer les coses, i sol ser la manera més senzilla de fer-les.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Python
Integració de Hudson i Trac
Escrit per Aaloy a 15 de March , 2008 a les 11:52 a.m.
A un altre post ja vaig parlar de Hudson, un sistema d'integració contínua, relativament nou però que permet fer el que un necessita d'aquestes característiques de manera fàcil i amb una interfície molt cuidada.
Hudson es pot integrar amb Trac, de manera que al Timeline del projecte trac poguem veure com han anat les integracions sense tenir que anar al Hudson. D'aquesta manera la gent que fa el seguiment del projecte pot veure a més dels commits al subversions, modificacions al wiki i tickets, com han anat les integracions i quan s'han fet.
La integració dels dos aplicatius és força senzilla:
- Instal·lam el python-feedparser si no ho tenim ja al nostre servidor.
- Anam a http://trac-hacks.org/wiki/HudsonTracPlugin i descarregam el plugin.
- Descomprimim el plugin i amb permisos d'administrador executam python setup.py install això ens crearà el paquet egg i configurarà el plugin a nivell global dins el trac.
- Editam l'arxiu trac.ini del nostre projecte trac que volguem enllaçar amb Hudson i modificam la llista de components, en el meu cas la cosa queda com
[components] iniadmin.iniadmin.iniadminplugin = enabled webadmin.* = enabled HudsonTrac.* = enabled
- Cream també una entra a anomenada hudson allà on posarem tant la url del rss del nombre projecte hudson que volguem controlar com el de la vista del projecte, de tal manera que s'hi crei un enllaç dins Trac
[hudson] display_subprojects = false feed_url = http://servidorhudson/hudson/view/Java/rssAll main_page = http://servidorhudson/hudson/view/Java/
- Canvia el servidorhudson pel vostre servidor. Aquí el que he fet és enllaçar directament contra la vista de projectes anomenada Java que he creat. Podria enllaçar a un projecte concret o a una vista relacionada amb el projecte que es gestiona amb el Trac.
Si s'han seguit aquestes passes i una vegada refrescada la plana del Trac, ens apareixerà una nova secció anomenada Hudson a la part de navegació del Trac que enllaça a la url que hem posat a main_page i al timeline apareixerà una opció que ens permetrà visualitzar les integracions, en forma de control check.
Pels que feu servir Trac de manera habitual, és interessant instal·lar-se també el plugin IniAdminPlugin, que ens crea un menú de configuració per web del trac.ini del nostre projecte.
És interessant a tot això adonar-se de que gràcies als formats oberts, en aquest cas al RSS que publica Hudson i que pot consumir Trac, dues aplicacions fetes en tecnologies totalment diferents es poden integrar.
Al Hudson passa una cosa semblant, està pensat per tractar amb format oberts, típicament sortides XML en format UnitTest, la qual cosa permet afegir-hi projectetes de Python, Java o SoapUI.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Java
Tancar una web
Escrit per Aaloy a 01 de March , 2008 a les 11:19 a.m.
Aquesta setmana estic un poc tristot. El dijous vàrem tancar definitivament la web B2C posant el banner final de tancament i redirigint les planes que hi apuntaven cap a una marca blanca.
El dijous mateix ens va dir adeu la persona responsable del B2C, professional com n'hi ha poques i una de les persones que més coneixen el món de la venda on line en el seu sector.
Està clar que tot evoluciona i que els negocis no són per sempre, però aquest cas em sap un greu especial ja que hi tenia una forta implicació emocional en el projecte, per haver-hi estar estat en els seus començaments més llunyans i per l'amistat que m'uneix amb la que fins ara era la seva responsable i amb gran part del seu equip. Em sap greu pel tancament, per la gent que hi havia fent feina, però sobretot me sap greu perquè crec que el projecte mai no va tenir cap oportunitat.
No ha estat una sorpresa, sols era qüestió de temps, la web ha estat víctima de l'estratègia del powerpoint que tan habitual s'ha fet en algunes empreses.
Abans deien que el paper tot ho aguanta, ara podríem canviar paper per powerpoint. Pareix que si un objectiu es posa a una presentació aquest ja ha de ser factible i ja no importa justificar res més.
Quan les presentacions es converteixen no en una manera de resumir dades, sinó en les dades mateixes podem estar segurs que s'està seguint el mètode de direcció d'empreses powerpoint. Abans de tot això se'n deia fum i miralls i ningú s'ho creia; ara pareix que si li posam un envolcall tecnològic i feim unes presentacions ben xul·les i colorides perdem la perspectiva de que és possible i del que no.
Potser algun dia tothom se n'adoni que no per estar en una presentació el que hi ha és realitat, de que les presentacions sols han de servir per resumir, però que quan es tracta de dades sempre hi ha d'haver un suport darrera, i quan es tracta de negocis a més hi ha d'haver el pla de negoci i una estratègia. Llavors potser no no ens deixarem seduir per les transicions, els efectes i els colorins de les presentacions sinó que tocarem de peus a terra i serem capaços de demanar d'on surten les dades que sustenten la presentació.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Eleccions 2008
Escrit per Aaloy a 26 de February , 2008 a les 11:13 p.m.
En aquest blog no és habitual que parli de política, però crec que en aquesta ocasió s'ho mereix: per primera vegada les forces nacionalistes de les illes s'han unit per conformar una coalició amb el nom d'Unitat per les Illes, que com a capdavanter presenten un dels millors oradors i polítics que ha donat aquesta terra: Pere Sampol.
Ahir vaig anar a sentir a Pere a Binissalem. El seu discurs és entenidor i clar. Proposa una cosa ben clara: fer que les illes tenguin una veu pròpia, que la gent conegui la nostra realitat. Personalment estic cansat de veure com es gasten mil·lionades a la Península en grans construccions i infraestructures quan aquí no hi ha manera de fer que el tren arribi a Alcúdia, que Binissalem tengui una escola pública com cal i no les aules prefabricades que hi ha ara.
A les Illes patim un expol·li fiscal que en Pere fa molt de temps que denuncia. A cap senador de les Illes se l'havia sentit mai defensar les Illes i fer conèixer els nostres problemes. Pere en pocs mesos ha fet un bon grapat d'intervencions, i a ben segur que si entra al Congrés les coses per la nostra comunitat poden començar a anar bé.
Crec en el vot útil, i per mi votar PP o PSOE no ho són, senzillament perquè les persones que suposadament ens han de representar estan subjectes a disciplina de vot i han de fer no el que és millor per nosaltres, sinó el que és millor pels seus partits. El vot útil pot ser el d'un partit minoritari que pot ser clau a l'hora de negociar uns pressuposts o una investidura, i que tal volta pot capgirar el tradicional expol·li fiscal que vivim des de fa dècades.
Dins la meva postura de vot útil, també hi ha una qüestió molt pràctica, a Pere és molt fàcil arribar-hi, és una persona molt accesible. La darrera vegada que vaig parlar amb ell vaig poder-li fer arribar de primera mà el que pens damunt el cannon digital, l'SGAE i els drets d'autor mals entesos. Es va comprometre a fer una proposició al respecte i confio que la podrà fer com a congresista en lloc de com a senador.
Vet aquí la meva postura, en un temps en que la política estatal no il·lusiona l'opció d'Unitat representa per mi una oportunitat de que les coses canviïn com no l'hem tinguda mai, i al manco per mi es mereixerà el petit esforç d'atracar-me al col·legi electoral.
M'han fet arribar una presentació amb les dades que va donar Pere Sampol al meeting, pos l'enllaç per si algú n'està interessat.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
No adivinis, mesura
Escrit per Aaloy a 24 de February , 2008 a les 5:58 p.m.
A l'hora de fer estimacions de projectes una de les regles bàsiques que hi ha és que si existeix algun tipus de dada mesurable és millor això que res, i que és millor tenir una dada objectiva i reproduïble que tirar d'arts adivinatòries.
Això és aplicable també a altres àmbits de la programació: en lloc de dir "aquest algoritme crec que millora el rendiment" mesurem els seus efectes abans i després, sols d'aquesta manera podrem avaluar objectivament les millores que tenim.
En lloc de dir "el rendiment en producció serà millor", comprovem-ho, agafem-ne mostres i facem extrapolacions. Comprovem els canvis que feim quan posem cachés, optimitzam la base de dades, augmentam la memòria del sistema i documentem-ho tot.
La informàtica és una ciència i com a tal les afirmacions si no són demostrables i reproduïbles sols tenen sols el valor que els vulgui atribuir cada un segons la solvència de la persona que les fa. Si les afirmacions van acompanyades de mesures i dades, ja no és cosa de creure o no, és cosa de comprovar. Potser per això a tots ens agraden tant els benchmarks.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes
Decàleg: com desmoralitzar un equip tècnic
Escrit per Aaloy a 14 de February , 2008 a les 1:14 a.m.
Vols desmoralitzar un equip? No saps com fer-ho? T'explicam com, és molt fàcil
- Fes una pujada de sous ridícula i insultant. Justifica-la dient que els pressuposts no es poden canviar. Millor si ho fas el mateix dia que dius que l'empresa ha tingut uns beneficis extraordinaris, molt per damunt del pressupostat.
- Fes una borsa única per la pujada ridícula del punt anterior que se repartirà en proporció inversa al sou que s'està cobrant actualment. No tenguis en consideració que potser hi ha gent junior que ha de fer un canvi salarial d'escala. Si és així, el canvi salarial també sortirà de la borsa.
- Condiciona la pujada salarial no a la competència sinó al que ja s'està cobrant, de manera que la gent sàpiga que el sou no depèn de la competència professional, sinó del que cobren la resta de companys. A més té el factor motivador de fer que es vegi a la gent junior com a amenaces, ja que normalment comencen cobrant menys.
- Deixa ben clar que la única manera d'aconseguir no perdre poder adquisitiu cada any és marxar o canviar de categoria laboral. Això té l'avantatge de potenciar el principi de Peter i fer que la gent arribi el més aviat possible al seu màxim nivell d'incompetència, però a més té altres conseqüències no menys interessants:
- Donat que en una escala jeràrquica el nombre de llocs més especialitzats es va reduint, la única manera d'aconseguir mantenir o millorar el poder adquisitiu és que el cap immediatament superior renuncii o el facin fora. Per tant, els subordinats han de tractar per tot els mitjans de putejar els seus caps.
- Per tal d'evitar que els subordinats el facin fora, el millor que pot fer el cap és rodejar-se de subordinats sense iniciativa, llepaculs i incompetents, de manera que el cap sempre destaqui. Les noves contractacions de personal i promocions professionals fes que vagin en aquesta línia.
- La gent que no vulgui entrar en el joc acabarà marxant, i per tant sols quedarà a l'empresa un perfil homogeni de gent que entén de què va la cosa.
- Diguès que s'acomiadarà molta gent en breu. La gent que tengui més possibilitats de col·locar-se a altres llocs anirà fugint i l'empresa es quedarà amb tots aquells que tenen més problemes per trobar feina. D'aquesta manera el més probable és que et quedis en una posició ideal per a assolir el punt 4 i les seves conseqüències.
- Contracta quant més consultors externs millor a preus ridículament alts per a que facin la feina de la gent que se n'ha anat per mor de l'augment de sou. Demostraràs que ningú és imprescindible i a més faràs befa dels que quedin.
- Posa al teu equip fites impossibles. Després contracta a empreses externes pel projecte dient-les que facin el que puguin.
- Negocia contractes de manteniment absurdament inflats amb els teus proveïdors. Després tanca el negoci d'aquell departament amb l'excusa de que no hi ha beneficis.
- Exigeix resultats però no donis les eines per a aconseguir-los i deixa ben clar que mai es tindran.
- Explica a tothom que ets el salvador de l'empresa i que els altres tenen molta sort de tenir-te. Fes-los sentir que viuen permanentment en una història de Dilbert.
Desmotivar gent que fa una feina vocacional no és fàcil, esperam que aquests senzills consells us siguin d'utilitat.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Conyes marineres
Integració contínua
Escrit per Aaloy a 10 de February , 2008 a les 5:50 p.m.
Recentment he estat fent un poc de recerca per veure com podia aplicar els conceptes d'integració contínua als nostres projectes. El conjunt d'aplicacions que tenim ha anat creixent al llarg del temps i les dependències entre les llibreries i les aplicacions també ho ha fet.
La idea de la integració contínua és que hi ha un mecanisme automàtic que recull les actualitzacions dels diferents repositoris de control de versions que es tenguin i aplica els tests d'unitat per comprovar que tot funcioni i que els tets passen. D'aquesta manera, i si s'han fet els tests, podem minimitzar l'impacte d'un canvi d'una llibreria en les aplicacions, és a dir, si pel que sigui canviam una llibreria i els canvis impacten a una aplicació de manera no prevista, quan construïm l'aplicació no passarà els tests.
El programari d'integració contínua permet seguir els tests, treure'n estadístiques i veure manera integrada què és el que ha fallat o comprovar que tot ha anat bé. A més es pot utilitzar el programari per a la construcció de l'aplicació i el seu desplegament als entorns de proves. Fet i fet, aquest tipus de coses es poden fer molt bé amb scripts i ens asseguram que en tot moment tenim la nostra aplicació a punt.
En entorns on hi ha molta gent, la integració continua garanteix que si algú "peta" l'aplicació amb commit que no passa els tests, aquest fet es descobrirà prest i es podrà minimitzar el seu impacte. La majoria de sistemes que he avaluat a més permeten a més dels tests unitaris, passar tests al codi font per intentar detectar errors, veure que se segueixen les regles d'estil, etc.
Per a les meves necessitats volia que el sistema d'integració contínua fos capaç de fer feina amb Java (la majoria ho compleixen) però que a més pogués passar els tests de Python i que en general pogués fer des de la construcció de l'aplicació, passar els tests i fer-ne el desplegament.
El que més m'ha agradat per ara és un sistema anomenat Hudson. Hudson és una aplicació recent, feta en Java, fàcil de desplegar i de fer anar. La interfície està molt cuidada i té tot el que necessit per començar. A més hi ha un article de com fer la integració per Python, que m'ha anat molt bé per començar.
Hi ha moltes més alternatives, a mi Hudson me va molt bé perquè té tot el que necessit per aquesta etapa del desenvolupament i és prou extensible com per a que pugui cobrir les nostres necessitats del futur proper. Hi ha altres sistemes a on triar, la gent de Confluence n'ha fet una taula comparativa. Mirau i comparau, però si teniu les mateixes necessitas que jo, no deixeu de fer una ullada al Hudson.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java Gestió de projectes
Programa trinxera
Escrit per Aaloy a 02 de February , 2008 a les 1:45 a.m.
Els anglosaxons són molt bons inventant nous termes per a fer referència a situacions típiques i expressar en poques paraules un concepte. En el món de la programació i projectes un dels que més m'agrada és de "pizza team", que descriu un equip de projecte d'un tamany adequat com per poder demanar una pizza quan hi ha hores extres a fer i no quedar amb gana.
No per això hem de deixar, però, que en tenguin l'exclusiva dels neologismes, així que aquí va la meva contribució: el programa trinxera.
El programa trinxera descriu aquell programa darrera del qual s'amaga un equip o una organització per tal d'impedir l'avanç de l'enemic. Qui és l'enemic és del tot irrellevant, potser una part de l'organització, un client, o els simples avanços tecnològics.
El programa trinxera es caracteritza per estar totalment acoblat, per la dificultat de saber per a un observador extern què fa el codi o perquè el programa fa el que fa. El programa és tan complexa que es requereix moltes vegades més feina saber el que fa que refer el codi de nou.
Per a que un programa trinxera sigui de qualitat a més ha de tenir moltes ramificacions, ha de ser un programa que faci de tot, que tant servesqui per gestionar l'empresa com per a enviar SMS. Cada necessitat que plantegi el client s'ha d'acabar lligant d'alguna manera amb el programa, d'una manera íntima i indissoluble, de tal manera que sigui impossible saber on comença un modul i on acaba un altre.
El programa trinxera es un gran devorador de recursos. Per la seva pròpia definició ha de ser totalment monolític i per a cada mòdul que se l'incorpora requerir més i més màquina. Com a bona trinxera ha de ser tortuós i amb molts llocs on amagar-se, de tal manera que si algun dia l'enemic es capaç d'entrar a la trinxera, se'l pugui estar esperant al proper racó per donar-li una sorpresa en forma de milers de línies de codi embullat i ineficient.
Per acabar de ser perfecte, el programa trinxera ha d'estar fet amb algun llenguatge obsolet, a ser possible mal de depurar i testejar, del qual sols els atrinxerats en saben algunes coses, no moltes, sols les justes per anar fent modificacions, però no les suficients com per a poder arribar mai a desfer el que s'ha creat.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Conyes marineres
Ajà! List comprehension explained
Escrit per Aaloy a 31 de January , 2008 a les 8:47 p.m.
En les darreres versions Python va introduir una modificació de sintaxi que permet no tirar tant de la programació funcional per algunes coses, el que es coneix com a list comprehension .
Encara que els exemples ajuden a fer-se una idea de com funciona la sintaxi, el que m'ha acabat d'obrir el ulls damunt la idea i la seva utilitat ha estat aquest article. En ell s'explica la sintaxi des del punt de vista matemàtic, és a dir, els matemàtics estan acostumats a escriure conjunts de la manera X = { x | x mod 2 = 0 } on x pertany als Naturals serveix per a indicar el conjunt dels nombres parells.
Els múltiples de tres, per exemple es poden escriure com
T = { 3x | x pertany als naturals}
Quan programam els nostres conjunts són finits, però la idea és la mateix i és ben bé la notació que es fa servir per la sintaxi de la list comprehension.
parells = [2*x for x in range(0,10)]Ens tornarà la llista dels deu primers nombres parells, o bé
parells = [x for x in range(0,101) if x%2 ==0]ens retornarà la llista dels nombres parells que hi ha entre zero i 100. Notació matemàtica en estat pur.
Si en lloc d'una variable en tenim dues, llegit en termes de conjunts matemàtics la notació té tot el sentit del món
parelles =[(x,y) for x in range(0,3) for y in range(0,5)]
Diu: conjunt de tots els parell on el primer nombre va de zero a tres (no inclòs) i el segon va de zero a cinc (no inclòs).
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4)]Si el que volem és el mateix conjunt però on els dos nombres no són iguals bastaria fer
parelles =[(x,y) for x in range(0,3) for y in range(0,5) if x != y]és a dir:
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 3), (2, 4)]
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Deseconomia d’escala
Escrit per Aaloy a 30 de January , 2008 a les 10:13 p.m.
Normalment hom ha sentit parlar de les economies d'escala, per exemple, en la reducció del cost d'un producte gràcies a la seva producció en massa. O per exemple en la reducció de costs que tenen dues empreses que es fusionen gràcies a la reducció de personal que suposa unificar la gestió dels seus processos: dur els recursos humans de 1000 persones pot tenir un cost no molt major que dur-los de 800, i segurament serà menor que mantenir dos departaments per separat que gestionin 600 i 400 persones. El mateix podem aplicar a processos comptables, o a l'àmbit de la producció i les compres, on el volum implica una reducció del cost final.
També hem de tenir en compte, però, que existeix l'efecte contrari, el que s'anomena deseconomia d'escala ( diseconomy of scale en anglès). Aquest efecte se dona quan amb l'augment de volum no s'aconsegueix una reducció dels costs sinó que els costs augmenten.
En el món del programari els efectes de la deseconomia d'escala no s'han de menysprear, ja que tenim per una part els factors comuns gairebé a totes les empreses i projectes i per una altra amb els relacionats amb qüestions pròpies del desenvolupament. Així, que un projecte sigui 10 vegades més gran que un altre, no implica que costi 10 vegades més, entra en joc la deseconomia d'escala i ens podem trobar que doblem el cost, i quan major és el projecte major és la desviació que podem tenir. L'esforç no escala linealment amb la mida del projete, ho fa exponencialment.
Factors comuns
- Cost de la comunicació. Un equip gran necessita major comunicació que un petit (de fet l'equip òptim està entre 5 i set persones), necessita de més coordinació, de més reunions i això té un cost en temps i esforç.
- Cost de la jerarquia. Sense entrar en efectes tan perniciosos com el del principi de Peter, quan més jerarquitzada està l'organització més alts són els sous dels seus directius i això s'acaba reflexant en el cost global del projecte.
- Factors polítics. El projecte es fa no per una necessitat sinó per fer quedar bé algú, o s'inclou una determinada característica inútil sols per no discutir amb el cap de torn.
- Temps de resposta. Quan l'organització és petita és senzill trobar respostes. Quan més gran és l'organització més complexe és poder organitzar les agendes i el projecte es pot aturar perquè no es troba ningú disponible en capacitat de decisió.
- Inèrcia. Moure una organització gran costa temps i esforç. Tant és si es mou per fer un canvi estratègic com per fer un projecte amb una nova tecnologia de programació. Quan més gent hi ha, més probabilitat hi ha de trobar sectors reacis als canvis.
- Duplicitat d'esforços. En organitzacions grans les possibilitats de que un grup estigui fent el mateix que un altre, que dues persones estiguin fent coses semblants augmenta. Això està lligat a la comunicació o a la falta d'ella. Mantenir un alt grau de comunicació implica un cost molt alt i molt de temps i no mantenir-la duu a la duplicitat d'esforços.
En el que fa estrictament relacionat al desenvolupament, la deseconomia d'escala la podem trobar a:
- Tendència cap a la mitjana de l'equip. En un equip reduït podem tenir ratios de productivitat molt alts si els seus membres estan per damunt la mitjana. En projectes molt grans la necessitat d'incorporar personal és tan gran que no és pot seleccionar al millor del millor, sinó al que hi ha disponible. La diferència entre els nostres millors programadors i els pitjors pot estar en una relació 10:1.
- Augment de la complexitat del projecte. És habitual que quan major sigui el projecte més complexitat tingui. Encara que la taxa d'errors sigui lineal amb el nombre de línies de codi, la complexitat influeix negativament en la taxa d'errors que hi podem trobar.
- Dificultats en les estimacions. Les calibracions dels models d'estimació que podem tenir deixen de tenir validesa si el projecte és major que tres vegades el projecte més gran que haguem fet.
- Necessitat de més controls al codi. Quan l'equip augmenta no basta fixar unes regles d'estil i esperar que tothom les compleixi. Ens hem d'assegurar que es compleixen, i això implica invertir en programari i en gestió.
Referències:
- http://en.wikipedia.org/wiki/Economies_of_scale
- http://en.wikipedia.org/wiki/Ideal_firm_size
- http://financial-dictionary.thefreedictionary.com/Diseconomy+of+Scale
- http://archive.adaic.com/docs/present/ajpo/pll-cost/html/tsld028.htm
- Software Measurement and Estimation: A Practical Approach. Laird & Brennan
- Software Estimation. Steve McConnell
- Peopleware. DeMarco & Lister
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica General
Lògica
Escrit per Aaloy a 27 de January , 2008 a les 1:26 p.m.
Hem d'anar a veure uns amics que tenen bessones i l'hi he explicat al meu fill petit, de quatre anys, la conversa va anar així:
Anirem a veure uns amics que tenen filles bessones.
Saps que vol dir bessones?
Clar, que estan repetides!
Encara tenc la rialla a la boca per la contundència de la resposta.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Winpdb
Escrit per Aaloy a 27 de January , 2008 a les 11:15 a.m.
Winpdb és un depurador en mode consola i gràfic per aplicacions Python.. Fa un parell de setmanes que han alliberat una nova versió. En la seva part gràfica, el programa presenta una interfície clara i permet la depuració remota de les aplicacions.
Es pot utilitzar per depurar scripts de Python molt fàcilment sols executant el programa passant-hi com a paràmetre l'script a depurar, tal com se fa amb el depurador estàndard de Python.
La vertadera potència, però està en la facilitat en que es poden depurar aplicacions remotes o aplicacions com les que es poden fer en Django per exemple. En a quest cas afegint aquesa línia al que vulguem depurar
import rpdb2
rpdb2.start_embedded_debugger_interactive_password('clau de seguretat')
ens permetrà connectar-hi el depurador.
Winpdb fa temps que roda, però és la primera vegada que puc fer anar la depuració remota sense problemes. Una eina més a afegir a la capça de programació.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Sotfware Estimation, d’Steve McConnell
Escrit per Aaloy a 21 de January , 2008 a les 11:22 p.m.
Avui he acabat el darrer capítol del llibre d'Steve McConnell. El llibre prometia i he de dir que no està malament. Recull els conceptes bàsics de l'estimació de projectes i dóna molta bibliografia i temes per a aprofundir en els conceptes en els que McConnell sols entra de passada.
El llibre, a l'estil dels millors de McConnell es bo de llegir, i en aquest pareix que ha evitat entrar en fórmules o la part més dura de l'estadística, com si li fes un poc de por l'adagi de que per a cada fórmula perdria un lector. Això li lleva un poc de profunditat al llibre, però les referències incloses al manco poden servir de guia al lector que vulgui aprofundir més en aquests temes.
El llibre toca tots els grans temes de l'estimació de projectes, però no entre en profunditat a tocar cap metodologia, ni punts funció, ni estimació per casos d'ús, ni Mark II o Cocomo 2, per exemple. El que sí entra és en distingir els distints tipus d'estimació: de tamany, de l'esforç i de temps, posant de rellevància la relació que hi ha entre ells (que no són ni molt manco lineals). Algunes de les idees i gràfiques que hi ha al llibre mereixeran una lectura més detallada i segurament un apunt, ja que tenen implicacions interessants, com per exemple la del tamany òptim d'un equip de desenvolupament.
També és bo saber quin es l'abast del llibre de McConnell. Els mètodes d'estimació que presenta no serveixen ni per projectes petits ni per projectes de mil·lions de línies de codi. L'aplicabilitat de les tècniques que es presenten està limitada a projectes en el rang que va entre les desenes de milers de líness de codi i els pocs centenars de milers de línies.
En definitiva, garebé de tres-centes planes de lectura entretinguda, amb dades amb les que reflexionar i treballar, però que s'ha de complementar amb altres llibres de l'autor i l'estudi en més profunditat d'alguna metodologia d'estimació, després de tot, com McConnell mateix recomana, no és bo sols limitar-se a una única estimació i en aquest cas a un sol autor.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
“Sólo para usuarios avanzados”
Escrit per Aaloy a 20 de January , 2008 a les 12:25 p.m.
Un dels darrers projectes en el que estic implicat és una web a mig camí entre d'imatge i d'utilitat, que ha de premetre a l'usuari que la visiti conèixer els productes que oferta una de les marques de l'empresa. Per les raons que siguin, la direcció va decidir que del desenvolupament de l'aplicació se n'encarregàs una empresa externa i encarregar-me a mi la gestió tècnica.
La cosa està en que els productes a mostrar s'han de carregar a una base de dades mitjançant un backoffice propietari de l'empresa encarregada del desenvolupament. Amb la qual cosa tenim que el desenvolupament final són dues aplicacions: el backoffice per carregar les dades de producte i la part de presentació que s'ha de nodrir d'aquests productes per fer la web.
Després de suar sang per posar el backoffice damunt un servidor Tomcat vaig començar a fer quatre proves amb ell. Els camps obligatoris no estaven indicats de cap manera, així que la cosa anava un poc per prova i error. En una d'aquelles vaig aconseguir completar la fitxa del producte (o això pensava jo) i donar-li a guardar. A la una, a les dues, i .... pam! pantalla amb missatge d'error de la BD, d'aquests de "not null constrain violated in field XXX_INFR" o una cosa semblant.
Oks, m'he deixat algun camp - vaig pensar-. El problema és que no sabria dir quin és. Si això me passa a mi, que estic més o manco acostumat a veure aquests tipus de missatges, quan ho vegi la persona o persones encarregades de introduir el producte, segur que això serà una font de problemes, ja que despistarà l'usuari i l'enlentirà en la seva tasca, a saber, introduir el producte el més ràpid que pugui.
Així doncs vaig cursar la petició formal de que s'indicassin els camps obligatoris amb la marca d'asterisc típica i que es controlessin els errors de validació de BD de manera que es presentàs a l'usuari final un missatge descriptiu.
La resposta va ser "el backoffice es sólo para usuarios avanzados" i que la petició estava fora de lloc.
No sé a quin món viu aquesta gent, però per mi aquesta contesta és el mateix que no voler admetre que el programa té errors, que no els pensen corregir i que ha de ser l'usuari el que assumeixi aquests errors i els eviti si pot. Un backoffice de càrrega de dades no pot ser mai per usuaris avançats, quan des del principi s'ha pensat que sigui personal no especialitzat qui carregui les dades.
No es pot fer recaure les pròpies errades damunt l'usuari, és prepotent i poc professional. Tot programa té errades, algunes són més fàcils de solucionar i altres menys. Sovint per manca de de temps i el sempre present "time to market" algunes errades queden allà de per vida, però s'ha de tenir present que hi són, posar-les damunt la taula i no culpabilitzar l'usuari de les mancances que té el nostre programa.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Markdown
Escrit per Aaloy a 02 de January , 2008 a les 5:35 p.m.
Markdown
Markdown és un llenguatge orientat a l'escriptura de documents de manera que siguin bons d'escriure i bons de llegir. Amb això comparteix la mateixa filosofia que altres com reStructuredText o Textile, és a dir, són llenguatges que permeten escriure la documentació de manera que sigui llegible directament en text pla.
Així com com reStructuredText és va força bé per escriure documents llargs i complexos, Markdown és ideal per al l'escriptura d'apunts als blogs, ja que a més del seu marcatge particular, permet incloure directament html si ho necessitam.
Mesclant markdown i HTML
Consideram dos tipus d'elements HTML a l'hora de incloure codi HTML dins el document markdown:- elements de bloc: Per poder passar a escriure HTML dins el document markdown he de tenir en compte que el codi HTML ha d'estar separat de la resta del document markdown per un línia en blanc i l'HTML ha de començar a la primera columna, és a dir, sense espais ni tabuladors. Si feim servir l'HTML no podem fer servir la sintaxi markdown, és a dir, una vegada inicial el bloc html tot allò és html.
- elements en línia: Podem utilitzar l'html així com vulguem, per exemple, podem fer servir indistintament l'asterisc o <strong/> per marcar una paraula o frase en negreta. Són elements en línia <span>, <cite>, <a>, <img> etc.
Elements de bloc
Paràgrafs
Per a indicar un paràgraf simplement hem de deixar una o més línies en blanc. La conversió que fa markdown cap a HTML fa que es generin marques de paràgraf <p>. Si volem generar sals de línies amb <br/> haurem de fer acabar el nostre paràgraf amb dos o més espais en blanc i seguidament pitjar la tecla de salt de línia.
Capçaleres
Markdown pot fer servir dos estils de capçaleres:
Capçalera tipus H1
==================
Capçalera tipus H2
-------------------
o bé fer servir # per a indicar el nivell de la capçalera que volem fer servir, així:
# Això és un H1
## Això és un H2
### Això és un H3
###### Això és un H6
encara que no és estrictament necessari podem fer acabar la capçalera també amb el mateix símbol. Per exemple:
# Capçalera H1 estèticament millor #
Citacions
Markdown permet citar text fent servir el símbol > davant cada línia que vulguem que figuri com a citada o davant el paràgraf. Així:
> això és una cita literal d'un text
queda com
això és una cita literal d'un text
Llistes
Podem fer servir llistes ordenades i no ordenades. Les perimeres es fan posant un nombre seguit d'un punt, i les segones amb un asterisc, guió o símbol de suma.
Per exemple:
Llista no ordenada
* Joan
* Pere
* Miquel
Llista ordenada
1. Joan
2. Pere
3. Miquel
No és necessari mantenir l'ordre de la nuemració en un llista ordenada, basta que hi hagi un nombre seguit d'un punt, a partir d'aquí Markdown ja ho generarà com toca.
Si els elements de la llista estan separats per una línia en blanc, markdown generarà tags de paràgraf al voltant dels elements de la llista. Si l'element està composat per dos o més paràgraf hem de tenir en compte que cada paràgraf de la llista ha d'estar identat al manco per 4 espais o un tabulador. Per posar codi dins una llista l'hem d'identar al manco 8 espais o 2 tabuladors.
Si per la raó que sigui no volem que s'inicii la numeració d'una llista, haurem d'escapar el punt amb la barra invertida .
Blocs de codi
Els bloc de codi van molt bé quan un ha de parlar damunt programació o té necessitat de posar un llistat de codi dins el text. Markdown genera el tag <code> si identam cada línia que formi part del codi amb un tabulador o quatre espais.
El bloc de codi continuarà fins a trobar un bloc que no estigui identat o fins al final de paràgraf.
Dins un bloc de codi els (&) i (< >) són gestionats automàticament pel makdown i convertits de manera que es pugui representar fàcilment codi HTML. Per a facilitar que es pugui escriure de markdown la sintaxis markdown no es processada dins un bloc de codi, la qual cosa, per exemple permet escriure aquest article.
Línia horitzontal
Generar una línia horitzontal <hr /> és tan senzill com posar asteriscs o guionets al començament de la línia i que no hi hagi res mes. Queda molt bé indicar visualment que es tracta d'una línia horitzontal decorant-ho un poc més. Per exemple:
queda molt més clar que si sol feim
*
Tot i això el resultat el mateix:
Elements en línia
Enllaços.
Per posar un enllaç la sintaxi és
[nom que ha d'aparèixer](url "text del títol")
per exemple:
[trespams](http://trespams.com "blog de trespams")
genera el codi
<a href="http://trespams.com" title="blog de trespams">trespams</a>
Si hem d'enllaçar recursos locals dins el mateix servidor, podem fer servir camins relatius, per exemple:
[mira Sobre mi](/about/ "sobre mi") per més detalls
Podem enllaçar també per referència i fer servir dreceres per escriure el link quan en nom i l'enllaç coincideixen:
Tenc 10 vegades més tràfic des de [Google][] que des de
[Yahoo][1] o [MSN][2].
[Google]:http://google.com "El cercador Google"
[1]:http://search.yahoo.com/ "Cerca a Yahoo"
[2]:http://search.msn.com/
En el primer cas com que l'enllaç i el nom coincideixen ens bastaria posar el nom, en el segon cas feim la referència i també posam el títol i en el tercer cas hem fet la referència però no posam el títol. Això genera:
Tenc 10 vegades més tràfic des de Google que des de Yahoo o MSN.
La idea de les referències no és que siguin més fàcils d'escriure sinó que es fan per augmentar la llegibilitat del codi, ja que es veu que hi ha un enllaç però aquest no posa renou dins el codi.
Èmfasi
Per posar negretes o cursives feim servir el doble asterisc o l'asterisc simple respectivament. També podem fer servir el guionet de subrajat, doble en el primer cas i simple en el segon.
**Això va en negreta** i això _italic_
Això va en negreta i això italic
Si volem posa un asterisc * o un guionet de subrajat _ ho haurem de fer escapant els caràcters, així * i _.
Codi
Per indicar que estam escrivint codi, però que aquest s'ha de tractar com a un element de línia farem servir l'accent greu `, per exemple:
exemple de funció lambda `lambda x,y: x+y`
en [Python](http://python.org "Python site")
exemple de funció lambda lambda x,y: x+y en Python
Imatges
Per a incloure una imatge la sintaxi és

De la mateixa manera que amb els enllaços, podem indicar les imatges per referència de manera que la sintaxi queda com:
![Text Alt][referència]
[referència]: url/a/la/imatge "títol opcional"
Altres
- Markdown ens permet dreceres per a la generació d'enllaços. Simplement hem d'escriure el nom de l'enllaç i envoltar-ho de < >. Per exemple l'enllaç http://trespams.com, s'ha generat com
<http://trespams.com> - Per escriure adreces d'e-mail també ho podem fer d'auesta manera, però en aquest cas markdown fa una conversió intel·ligent per mirar de fotre els spammers, convertir cada caràcter de l'adreça al seu equivalent hexadecimal.
- Per a escapar un caràcter amb significat especial a markdown ho podem fer precedint-ho de </li>
Agraïments
Aquest document és una traducció lliure al català del document original en anglès escrit per John Gruber. Ha estat escrit amb l'editor Kate de KDE com a part de la documentació en català de que esper que sigui aviat el meu nou programari per a la gestió del blog de trespams. Podeu trobar el document original en format markdown dins el subversion del projecte.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
La pesca del salmón en Yemen
Escrit per Aaloy a 27 de December , 2007 a les 11:32 a.m.
Entre lectura informàtica i programació aquestes vacances he mirat de trobar un grapat d'hores per a la lectura lleugera. En aquest cas d'un llibre que vaig comanar del Circulo de lectores
La pesca del salmón en Yemen
Paul Torday
Ed. Circulo de Lectores
Traducció: Luis Murillo Font
El llibre és amable de llegir, cautivador en alguns aspectes i proper a la crua realitat política actual en altres. Tracta de la consecució d'impossibles, com la de la introducció de la pesca del salmó a un país com el Yemen. Té aquell puntet filosòfic que et fa pensar, però poc més. És un relat ben embastat, construït a base de cartes, e-mail i escrits al diari personal del protagonista, la qual cosa ens atraca als seus pensaments més profunds.
El llibre no m'ha desagradat, però de cap manera es pot publicitar com a satiric o humorístic. Es deixa lleigir i a cops et fa reflexionar. Una lectura per anar llegint en els interminables talls publicitaris que hi ha aquestes festes.
Si el trobau a una biblioteca o us ho deixen es pot llegir, però no en puc recomanar la compra.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
Propòsits pel 2008
Escrit per Aaloy a 23 de December , 2007 a les 6:03 p.m.
El 2007 ja fa les darreres i és temps de recapitulació i de pensar en quins són o poden ser els objectius pel 2008. La llista de propòsits convé que no sigui massa llarga, ja diuen que qui molt abraça poc estreny, però sí que convé que sigui ambiciosa, que motivi a fer coses.
Per mi el 2007 ha estat potser un any que podríem classificar de transició, han passat moltes coses i una de les més importants, que afecta a l'estabilitat laboral tindrà continuïtat dins el 2008 (esper!), dins l'àmbit tècnic el 2007 ens va permetre definir com seria l'arquitectura que volem utilitzar, i que també esperam que exploti dins el 2008. Supòs que per més d'un també ho haurà estat de transició, no oblidem que el 2007 ha estat any electoral i al Govern de les Illes i a molts d'ajuntaments s'ha canviat de color polític.
A la feina aquest 2007 ha estat mogudet, bàssicament per dos motius importants:
- Canvi de director financer. Encara que sóc una persona prou oberta als canvis aquest no ho vaig acabar d'entendre. Potser tenc massa implicació personal a l'assumpte, ja que a l'anterior director el coneixia des de feia temps i el tenc per una de les persones més íntegres, treballadores i amb una visió de les coses molt clara que conec. Els anys que he estat treballant amb ell n'he après molt, moltíssim, de com gestionar, de cultivar un esperit crític, de com es pot discrepar, discutir solucions i arribar a enteses... La relació d'amistat segueix i seguirà, però enyor la seva manera de fer les coses.
- Fusió amb First Choice. Segurament és una de les coses que més ha condicionat la feina dels darrers mesos. Pareix que entre els empleats de les dues bandes hi ha poca informació damunt el que pot passar i de les implicacions que això pot tenir a curt plaç. Com he dit abans el 2007 és de transició, sobretot perquè la gent està a l'espera de que les coses es defineixin al 2008.
A la part tècnica el 2007 ha suposat la consolidació de la feina amb Python i Django, consolidació que ha donat fruits dins el 2007 en forma de webs per l'empresa i fetes particularment i que esper que en doni molts més dins el 2008. Django ara per ara ja té gairebé tot el que necessit per fer el tipus d'aplicacions web que m'agraden. També el 2007 ha estat l'any del llançament de dos RIAs importants: Extjs 2.0 i Dojo. Encara que hi havia versions anteriors, la versió d'Extjs suposa poder fer aplicacions web on la part de presentació està gestionada per javascript. La combinació d'Extjs i Django és molt bona. Al 2007 hem començat a gratar a les possibilitats que té aquesta combinació, i esper que puguem veure aplicacions web realment espectaculars dins el 2008.
Pel 2008 tenc dos projectes que m'agradaria que prenguessin tota l'embranzida per fer-los una realitat: apsl i el nou blog de trespams.
apsl és un grup de desenvolupament web. Al 2007 hem començat a definir-ho i crear-ne la infraestructura, a poc a poc segons el temps i la feina ho deixaven fer. Parteix de la idea que el desenvolupament web actual i futur no és sols cosa del dissenyador o programador solitari, sinó que es necessita ja tot un conjunt de gent que treballi junta per aconseguir webs i aplicacions webs que sigui accessibles tant a les persones com als cercadors, sense oblidar que tot això necessita tota una estructura d'entorns de desenvolupament i producció que no se pot deixar de banda. I també en la idea de que els projectes, com passa en el programari lliure, poden avançar sense tenir que tenir a la gent fermada a una oficina, que el teletreball, amb petites dosis de presencialitat, serveix ben igual per dur a terme projectes i que aquest són tant o més controlables que si tens la gent a una oficina.
El nom pot ser tant "agrupació de programadors en software lliure", "advanced programming solutions on linux" o senzillament pensar que és un domini de quatre lletres, bo de recordar i de dir, que és fonamentalment com va sortir :) apsl vol servir també de marca paraigua, de manera que es pugui donar suport logístic i administratius a desenvolupadors, dissenyadors i tècnics que d'altra manera es poden trobar sols i sobrecarregats de feina que no els agrada. Moltes vegades he sentit parlar a companys de que feina mesos que havien d'haver presentat una factura a un client, de que no tenen temps de fer un pressupost, etc. És a dir, proporcionant la capa d'abstracció de la que parla Joel i al mateix temps no condicionar la llibertat que dona poder triar ells projectes en els que fas feina.
Al 2007 ens hem concentrat en crear l'estructura tècnica i legal necessària per donar suport a la idea: s'ha creat la web, s'ha definit el logo i la papereria necessària, s'han posat en marxa i configurat els servidors amb els serveis necessàris: apache, django, python, php, subversion, trac, correu, ldap, etc. etc. etc. mirant que tot pugui escalar fins allà on volguem i puguem. Al 2007 s'ha registrat la marca i el logo i iniciats els altres tràmits burocràtics. El tema de la marca era fonamental, ja que es vol basar tot el model de negoci en Internet, i la marca ha de ser un dels principals actius, i a la vegada és un dels temes més complexes, ja que el registre duu força temps, des de fa unes poques setmanes la marca ha estat definitivament reconeguda i concedida, així que el projecte té al manco les bases necessàries per començar.
Al 2008 m'agradaria poder consolidar el projecte: trobar prou finançament pel projecte que el permeti créixer, donar-lo a conèixer al teixit empresarial i començar a captar projectes importants que puguin determinar-ne la viabilitat. Els fonaments estan posats, crec que la idea és bona i necessària, el model de negoci pot funcionar i ara sols es cosa de poder dedicar-hi més temps per anar creant-ne l'estructura.
Del nou blog de trespams dir que la idea és substituir el Wordpress per un basat en Blogmaker, o el que és el mateix en Python i Django. Wordpress està molt bé, pero vull quelcom més, alguna cosa de la qual en pugui controlar les butzes i fer afegitons així com jo vulgui. Segurament amb Wordpress es pot fer, però vull que el blog es convertesqui també en un projecte mascota i per això n'he de poder controlar totalment el codi i el contingut.
En aquests moments la cosa ja està molt avançada, he creat un projecte a Google anomenat trespams, de manera que si algú vol mirar el codi, o fins i tot afegir-se al projecte ho podrà fer. Està completament basat en Blogmaker per ara, però l'he anat modificant per a que sigui l'aplicació en lloc d'un afegitó d'una web, adaptant-ho a la branca de desenvolupament de subversion de Django i modificant plantilles i codi relatius a la internacionalització. La idea és anar incorporant les correccions d'errors i codi no estrictament lligat a trespams a Blogmaker, però sense sacrificar la llibertat que em doni poder mantenir la meva versió del codi.
La conversió d'articles ja està acabada, els permalinks de Wordpress, comentaris i tracbacks es mantenen prou be. Les categories són un petit problema, però les he substituït per tags i la cosa pareix que funciona. Encara queda molta cosa a fer, però esper que al manco la part principal del blog pugui estar llesta a finals de gener del 2008, i a partir d'aquí anar publicant ja els pots directament contra el nou sistema.
Dos objectius ambiciosos, cada un en la seva pròpia mesura, un més social i econòmic, l'altra més tècnic i personal però amb la mateixa característica, el desig de que ambdós projectes puguin tenir èxit dins el 2008.
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: Informàtica General
Un 14!
Escrit per Aaloy a 15 de December , 2007 a les 7:43 p.m.
No, no he tret una travessa de futbol, tampoc hi jug, així que seria un poc difícil, però l'alegria de veure un 14 no sé si serà comparable.
La cosa va anar així: se'n va demanar fer un resum que comportava fer una consulta d'agrupació a la base de dades més gran que tenim en Postgres, ja n'he parlat altres vegades.
Era una consulta damunt camps no indexats, així que ja vaig suposar que torbaria un poc, després de tot la darrera vegada que la vaig consultar una de les taules implicades tenia gairebé un mil·lió de registres.
La consulta va tornar uns quants centenars de resultats i torbà uns 50 segons en tornar la resposta. Vaig fer una consulta semblant damunt una de les altres taules i torbà un poc més, gairebé minut i mig, també lògic, ja que en aquest darrer cas la quantitat d'agrupacions a fer era molt més grossa i tampoc no tenia cap índex llevat del de la clau primària.
Content amb la resposta ho vaig contar als companys, i vaig fer un count(*) damunt la taula, un 1 i un 4, és a dir un mi·lió quatre-cents mil registres i la base de dades se les havia menjat com si res.
L'altra taula, la més lenta en tenia un parell més, gairebé dos mil·lions, però, un moment, va dir un dels companys, la primera taula hauría de tenir més registres que la segona.
I efectivament, és veritat, la ment a vegades veu el que vol veure, i allà on jo vaig veure un mil·lió quatrecents-mil registres i havia catorze mi·lions i busques de registres.
La base de dades va tan bé i dona tans poc problemes que no hem reparat cap pèrdua de rendiment i la màquina que la duu habitualment està al voltat del 0% de càrrega.
Postgres: capacitat per manejar grans volums d'informació? sí Problemes? zero Caigudes? zero Manteniment? zero.
No sabeu la tranquilitat que et dona una base de dades així.
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Projecte mascota: NDD
Escrit per Aaloy a 07 de December , 2007 a les 9:15 p.m.
Hi ha uns tipus de projectes, normalment petits, que serveixen per provar nous conceptes i idees, que els anglosaxons, sempre tan ocurrents amb els noms, anomenen projectes mascota: els pet projects.
Aquest tipus de projectes estan molt lligats als programadors que els fan, se'ls agafa "carinyo", a força de bregar amb ells provant noves idees. Els pobres però, també solen ser un conjunt de pegats, ja que no es caracteritzen per una arquitectura ben definida i elegant, sinó per ser un conjunt de proves de concepte i de noves rutines que el programador vol provar.
Aquests darrers dies he posat en marxa el meu pet project: a partir de la necessitat de refer una web he començat a desenvolupar el que serà el nou lloc web de No Diguis Dois. Té tot allò que el caracteritza per ser un projecte mascota:
- No hi ha implicació econòmica, la família és la família.
- Es fa a hores lliures
- Hi vaig provant tot el que se m'acud :)
La idea és acabar amb un lloc web on el grup pugui posar la seva biografia, cançons, fotografies i mantenir als fans al tanto de les seves actuacions.
El projecte correrà damunt Django, bé de fet ja corre, però sols a la meva màquina per ara ja que s'han de pujar molts continguts i m'ha servit per provar tot un grapat de pluguins i idees:
- Photologue: és una aplicació Django molt senzilla que s'integra dins l'administrador i que ens permet mantenir galeries de fotos. L'he adaptada un poc per a que estigui en català i per a que s'adapti a les meves necessitats, però m'ha estalviat molta feina, ja que tot el manteniment i les plantilles venen donades.
- jcarousel: Una vegada ja tenim les fotos convé presentar-les bé. Jcarousel és un afegitó per jQuery que ens permet mostrar galeries de fotos. Com que a més volia mostrar la foto en gran, he optat per l'estàndard
- ThickBox : No hi ha prou lloances per aquest afegitó de jQuery que és cada dia millor. En dues potades tenia connectada la galeria de jcarousel amb la presentació del ThickBox. L'exemple del jcarousel ha fet més nosa que servei ja que està molt lligat a mostrar sols una galeria, però sigui com sigui ara puc mostar diverses galeries de fotos i quan se'ns selecciona una passar a la presentació de ThickBox.
- He provat els inclusion tags de Django. Una virgueria de fa poc. El problema era que volia mostrar a cada plana contingut dinàmic i a la mateix vegada no perdre la potència de les vistes genèriques. Els inclusion tags permeten definir en dues potades tags per a la nostra aplilcació, de manera que ara tenc un {% show_components %} com a tag que em permet generar sempre que vulgui la llista de components. Això m'ha permès treballar amb sols amb una plantilla i que totes les altres n'heretin, fins i tot les vistes genèriques i disminuir l'acoblament de les aplicacions com photologue de l'aplicació que he generada per la gestió del lloc web de No Diguis Dois.
- També he fet servir el nou tag per les cachés de Django. Aquest tag ens permet definir una caché sols per un tros de la pàgina web. En el meu cas l'he fet servir per mantenir els menús, part dels quals es genera dinàmicament. El tema de les cachés en Django està força ben aconseguit, es pot cachejar part de la plana, la plana sencera, les dades, o qualsevol cosa que vulguem, ja que tenim accés a l'API, i no tan sols això, sinó triar si volem fer servir la memòria, el sistema de fitxer, la base de dades o el memcached per a gestionar-la.
Encara em queden força coses més a provar, com l'edició en línia dels continguts, però no sé si serà per aquesta versió. Ara els plans són sortir en quant tinguem llests els continguts i netejar un poc el codi i pujar-ho a un repositori subversion public, per si algun altre grup de rock ho pot aprofitar.
Supòs que la web es llançarà poc abans del nou disc, i esper tenir el codi prou netejat com per a poder-ho publicar en condicions. És el que té un pet project, que a la que et descuides te mossega els calçons.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes
Foto del metro de Palma
Escrit per Aaloy a 02 de December , 2007 a les 4:28 p.m.
Si no fos pels edificis hauria dit que era la foto de l'entrada del metro de Palma d'Asima.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Conyes marineres
On són els programadors?
Escrit per Aaloy a 02 de December , 2007 a les 2:51 p.m.
L'altra dia a un dels fòrums on hi estic subscrit un dels participants em va demanar de publicar una oferta de feina per a un lloc de programació en Java/J2EE. L'oferta era per un lloc de feina a Sevilla i a més de l'experiència en programació J2EE el candidat tendria
"como responsabilidad el análisis y diseño orientado a objetos, patrones de diseño, modelado de bases de datos, integración de aplicaciones, gestión de rendimiento y profiling de aplicaciones, así como de calidad de procesos de desarrollo."
Després de la publicació de l'oferta de feina i després d'un parell de dies, aquesta persona es posà en contacte novament amb mi per dir-me que del més de mig centenar de persones subscrites al grup sols una havia demostrat interès per l'oferta de feina.
Aquest tipus d'històries és bastant habitual pel que es veu entre la gent que es dedica a la selecció de personal. Posen una oferta que consideren atractiva i després s'estranyen del poc interès que ha despertat l'oferta, del molt que costa trobar gent tècnica. Anem a pams:
Les ofertes destinades per a personal tècnic han de ser concretes. No sé perquè però sovint m'he trobat que la gent té por a presentar-se a una oferta de feina perquè no compleix un dens n-mil requisits que hi solen haver. A vegades les ofertes de feina pareixen cartes al reis d'un nin de vuit anys, s'hi posa de tot, sense prioritzar i sense cap tipus de criteri.
Si estam cercant un programador J2EE doncs convé que ens centrem en que conegui la tecnologia, en l'experiència (2 - 3 anys basta, més tampoc no garanteix res i eliminam candidats). Si consideram que és imprescindible també hi posarem els bastiments amb els quals feim feina a l'empresa i després com un "seria bo que ..." la resta. Per exemple, si cercàs un programador J2EE per fer feina amb el nostre grup demanaria experiència amb programació J2EE damunt Tomcat i coneixements d'Spring. Com a punts addicionals coneixements d'Hibernate, Acegi, Axis o XFire, haver treballat amb un control de versions y coneixements de Linux i Python. Però el focus principal estaria en el bessó del que s'està cercant. Després una vegada reunits els currículums ja se'ls podrà fer l'enquesta.
El segon punt important és indicar sou i horari. Darrerament estic veient que poques empreses posen el rang salarial que estan disposats a pagar. Això també frena als possibles candidats que ja estan col·locats a un altre lloc. Tenir que anar a una entrevista o actualitzar el currículum sabent que hi ha força possibilitats que el lloc de feina estigui més mal pagat que el que se té actualment no és motivant. Si la feina pareix interessant i a més el rang salarial està un poc per damunt que el que se cobra, doncs hi ha moltes més possibilitats de poder captar candidats que estiguin fent feina, i quan es cerquen candidats amb molta experiència aquests s'han de captar d'altres llocs.
El tema de l'horari també és important. Res motiva més que una oferta que digui "horari flexible", "possibilitat de teletreball" o que els divendres s'acaba al migdia. En un mercat on els rangs salarials són baixos i semblants a totes les empreses, el factor que pot diferenciar la captació d'un candidat o no són els beneficis addicionals que pugui aportar l'empresa. A igualtat de sou i hores, una empresa que faci jornada contínua segur que és molt més atractiva que una amb jornada partida.
La solvència de l'empresa també és un dels altres factors a tenir en compte. Si en lloc del típic "importante empresa de ámbito nacional" es pot dir el nom de l'empresa i aquesta té presència a Internet serà molt més atractiva pel possible candidat. De rebot podríem entrar aquí en l'apunt d'Enrique Dans, en el sentit que un blog corporatiu ajuda als candidats a fer-se una idea de l'atractiva (o no) que és l'empresa. No estic d'acord amb que un directiu pel fet de ser-ho tengui que tenir un blog, però sí que com a empresa es bo tenir un blog corporatiu un es pugui veure el rum-rum de l'empresa i la seva filosofia. En Joel Spolski pareix que ho té molt clar això: després de llegir els seus apunts a un li fan ganes de fer feina per ell.
En el cas de l'oferta d'aquest conegut no es deia ni el nom de l'empresa i a més l'adreça de contacte del seleccionador era una adreça de gmail. Bé, podria haver estat pijor i l'adreça ser de hotmail, però sigui com sigui són punts en contra de l'oferta i que no motiven a perdre unes hores actualitzant el currículum i a enviar-lo.
Per acabar un dels punts que al manco jo tenc en compte a l'hora de valorar una oferta és on és el lloc de feina. Que el lloc de feina sigui al centre de la ciutat on no es pot aparcar, o que estigui mal comunicat i tengui que perdre molt de temps en arribar-hi resten punts a una oferta. No serveix de res que una empresa pagui més si tanmateix després ho perdràs o en temps (o el que és el mateix en qualitat de vida) o en benzina, més l'emprenyo matinal de tenir que cercar aparcament. No diguem res si l'oferta, per molt interessant que sigui és a una altra ciutat.
L'empresari/cap típic està massa acostumat a valorar la feina, no per rendiment o projecte, sinó per presencialitat. És allò de que ja que no puc controlar la teva ànima controlaré el teu cos... Això implica que els candidats per molt bons que siguin estaran limitats als del propi entorn geogràfic o bé als que estiguin disposats a traslladar-se a viure a una altre lloc, i el treball que això representa sovint no compensa l'esforç.
És mal de fer trobar programadors? No ho crec, el que és mal de fer és trobar bones ofertes de feina.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Preparant les vacances de Nadal 2007
Escrit per Aaloy a 30 de November , 2007 a les 11:10 a.m.
Acab de rebre tres llibres que vaig comanar fa poc menys de dues setmanes a ca'n Amazon. Pareix que la rapidesa en l'enviament no ha estat casualitat, sinó que comença a ser una constant.
Això de que el dolar estigui tan baix està acabant amb la meva economia, veus un llibre interessant, mires el preu a Amazon i al canvi surt molt bé, però clar, per un no s'ho paga fer una comanda, així que hi poses també aquell altra que veres l'altra dia i ja que hi som ....
Al 2007 em queden 5 dies de feina i això vol dir que tendré temps per anar-los llegint. La quantitat la dic per a que tots aquells que llegiu això sigueu conscients que n'és de dur ser un lector compulsiu: vosaltres estareu fent feina mentre jo m'hauré d'estar a casa, calentet, al sofà llegint els llibres que he rebut els darrers mesos. ;)
I els llibres són:
Scalable Internet Architectures Ed. Omnti (Sams Publishing) Theo Scholssnagle ISBN 0-672-32699-X
RESTful web services O'Reilly Leonard Richardson & Sam Ruby ISBN 0-596-52926-0
Javascript (The Definitive Guide 5th Edition) O'Reilly David Flanagan ISBN 0-596-10199-6
He fet una ullada ràpida als tres llibres i pareix que el que prometien a les ressenyes ho compleixen:
Scalable Internet Architectures fa un recull de millors pràctiques per fer aplicacions web escalables. Explica els principals conceptes i hi ha molts de gràfics que ajuden a assimilar-los. Alguna vegada he dit que el personal de sistemes ha de saber programar, m'estic aplicant la dita a la inversa: la gent que ens dedicam principalment al món de la programació d'aplicacions convé que estigui al dia del que se pot fer quan s'ajunten arquitectures de software, xarxa i hardware.
RESTful web services ens presenta una nova manera d'entendre els serveis web, de fet presenta una nova manera d'entendre la web sencera, en lloc de com a un conjunt d'aplicacions separades la tracta com a un conjunt de serveis. Darrerament se n'està parlant molt de serveis REST i aquest llibre potser la referència, el llibre de capçalera per tenir una visió global de tot el que es mou al voltant dels serveis web i quin paper juga l'arquitectura REST.
Javascript és tant un manual de javascript pels qui ja saben programar, com una referència del llenguatge. Havia tingut en les mans una edició anterior i em va fer molt bona impressió. Pareix que no li falta res, gairebé 1000 pàgines de lletra ben atapida donen per molt. No ho recoman com a tutorial de Javascript sinó com a llibre de referència i explicació dels conceptes i aplicacions més dures del Javascript.
Com sempre, això són les primeres impressions, així com les vagi llegint miraré de posar-ne ressenyes més extenses.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
L’analista
Escrit per Aaloy a 25 de November , 2007 a les 6:32 p.m.
Tret del llibre Software requirements,
L'analista és la persona que ajuda als qui han demanat el projecte [1] a trobar la diferència entre el que ells diuen que volen i el que realment necessiten.
[1] stakeholders a l'original
M'ha feta gràcia la definició perquè és quelcom que sovint és perd al rol d'analista. L'analista ha de poder dir la seva en el projecte, proposar solucions, millores i expressar sense por el perquè troba que el que s'està demanant no funcionarà, o no és necessari.
Encara que se pugui dir que el client sempre té raó, si duim aquesta frase a les seves darreres conseqüències en el desenvolupament de programari, estarem pervertint la feina de l'analista.
És potser el mateix que quan un demana un disseny web i li diu al dissenyador des de com vol el format, les fotos, els colors i la tipografia. Llavors per a què vols un dissenyador web?
Pel que es veu aquest tipus de situacions no és sols pròpia d'analistes o dissenyadors web. Parlant amb un arquitecte em deia que té clients que ja li venen amb els plànols fets i que no atenen a raons, són els que solen acabar amb el bany aferrat a la cuina. També vaig viure una situació semblant amb un interiorista, el client li deia com ho volia tot, col·locació, llums, decoració, fins que l'home l'hi va tenir que dir que aquells temes eren precisament la seva feina.
Potser ens ho tendríem que plantejar de tant en tant allò de dir: "escolta, això és la meva feina, si la vols fer tu endavant però després també t'has de responsabilitzar dels resultats".
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes
The Rozenshtein Method
Escrit per Aaloy a 22 de November , 2007 a les 9:14 p.m.
Suposem que tenim una base de dades de factures i algú ens demana a veure si li podem dir quina és la facturació total de cada any i la seva distribució en els diferents mesos. Això és el que s'anomena fer un crosstab report, és a dir, fer la transformació de dades que estan en files a columnes i normalment fer una operació damunt alguna quantitat numèrica d'interès.
Al blog d'Stephen Forte he vist un mètode que ens permet fer precisament això d'una manera elegant anomenat el mètode Rozenshtein. Stephen diu que n'està enamorat d'aquest mètode i és ben comprensible, el mètode és elegant i resol d'una manera senzilla el tema dels crosstabs reports a bases de dades sql. L'Stephen ho explica molt bé, però us resumiré la idea, es tracta de trobar una expressió numèrica que s'avalui com a zero o un que ens farà de discriminador de la columna, de manera que multiplicada per la quantitat que volem operar fa que aquesta es compti (quan l'expressió val un) o que no.
Per no repetir l'exemple de Stephen en posaré un de més senzill, suposem que tenim una taula on hem anat guardant els e-mails que hem rebut on tenim la data en que l'hem rebut. Volem saber quants e-mails hem rebut cada mes. A la taula mantenim un camp anomenat created_at que conté la data en que hem rebut l'e-mail. Podríem fer
select extract (year from created_at) as any, count(id) as total, sum(1 - abs(sign(extract(month from created_at)-1))) as "GEN", sum(1 - abs(sign(extract(month from created_at)-2))) as "FEB", sum(1 - abs(sign(extract(month from created_at)-3))) as "MAR", sum(1 - abs(sign(extract(month from created_at)-4))) as "ABR", sum(1 - abs(sign(extract(month from created_at)-5))) as "MAY", sum(1 - abs(sign(extract(month from created_at)-6))) as "JUN", sum(1 - abs(sign(extract(month from created_at)-7))) as "JUL", sum(1 - abs(sign(extract(month from created_at)-8))) as "AGO", sum(1 - abs(sign(extract(month from created_at)-9))) as "SEP", sum(1 - abs(sign(extract(month from created_at)-10))) as "OCT", sum(1 - abs(sign(extract(month from created_at)-11))) as "NOV", sum(1 - abs(sign(extract(month from created_at)-12))) as "DIC" from taula_emails group by 1
Això és un cas particular del mètode Rozenshtein, ja que com es pot veure el que feim realment és comptar registres. Sense fer les simplificacions cada més hauria quedat com
sum(1*(1 - abs(sign(extract(month from created_at)-MES)))) as "EL_MES"
El primer un correspon a la dada que volem operar de la fila, en el nostre cas és tan simple com dir que és 1 per a que la suma vagi comptant-les, però pot ser qualsevol operació que hi puguem fer. El mètode ho podem classificar d'idea feliç, però una vegada captat és prou senzill de fer anar. En aquest cas el que s'ha fet és extreure l'ordinal del mes i restar-li l'ordinal que correspon a la columna del mes que volem tractar. Aquesta operació ens donarà zero si la data de la fila que tractam és igual a la columna del mes o diferent de zero si no ho és. Per exemple,
extract(month from now()) = 11
ja que aquest post està escrit al novembre del 2007, si repassam l'sql veurem que els resultats qute tendríem per gener seria (11-1 = 10), per febrer (11-2 = 9), per octubre (11-10 = 1) per novembre (11-11 = 0 aja!) i per desembre 11-12 = -1.
Recordem que el que necessitam és un valor que sigui zero o un, i per això el que es fa és utilitzar la funció sign, que retorna -1 per valors negatius, 1 per valors positius i 0 pel zero.
Si després li aplicam el valor absolut (abs) resulta que hem aconseguit una funció que ens dona zero quan té el valor que nosaltres volem i un quan no el té, la restam d'un tenim just el contrari, és a dir, que valdrà un quan tengui el valor desitjat i zero quan no el tengui.
Aquesta funció és la que multiplicarem pel valor a operar, en el nostre cas 1 però podria ser perfectament el valor d'una altra columna. I ja ho tenim!
any total GEN FEB MAR ABR MAY JUN JUL AGO SEP OCT NOV DEC 2007 100 10 10 19 20 5 15 8 5 2 5 1 0
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Matemàtiques i programari lliure
Escrit per Aaloy a 18 de November , 2007 a les 11:01 p.m.
L'article de Ricardo anomenat "Las matemáticas necesitan de sofware libre", m'ha recordat que tenia pendent fer un petit apunt damunt un programa que recentment ha alliberat SAGE.
SAGE a diferèncie d'altres opcions privatives permet veure l'algorisme que hi ha per davall dels càlculs i com les opcions privatives permet fer càlculs simbòlics i numèrics. A més compta amb opcions per enllaçar amb programes matemàtics privatius i lliures.
SAGE permet fer gràfiques, calcul simbòlic, calcul numèric i n-mil coses més, totes documentades al manual. I el millor de tot, el llenguatge de programació triat: Python.
A la web de SAGE també trobam una opció per poder provar el programa on-line, es poden fer proves, però va moooolt lent, tot i això es pot veure i provar la potència de la solució.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Què torbes a corregir un error de producció?
Escrit per Aaloy a 18 de November , 2007 a les 4:34 p.m.
Trobar un error al teu codi és un emprenyo. Poder començar la depuració en 30 segons, trobar l'error 2 minuts, pujar-ho al subversion i actualitzar la versió de producció de manera que als 5 minuts d'haver detectat l'error estigui corregit no té preu.
Això és el gran avantatge dels llenguatges d'script, que el temps que passa des de que trobes un error a poder-ho corregir és molt curt (llevat d'excepcions amb errors difícils de trobar i depurar, clar). Curt perquè normalment posar en marxa l'entorn de desenvolupament no duu més que uns pocs segons i ja pots començar a depurar.
Si tot està ben organitzat el codi estarà a un repositori subvesion i l'entorn de producció no serà sinó un client de subversion, de manera que fer una actualització una vegada trobat un error que no afecti a la base de dades, és bàsicament
- svn ci
- ssh al servidor
- svn update
I en alguns casos recarregar l'Apache. Encara desenvolupament i sistemes siguin equips separats, davant un error crític el temps de resposta pot ser tan curt com 5 minuts.
L'experiència amb Java és que ja directament és necessiten els 5 minuts sols per posar en marxa l'entorn, 5 o 10 minuts més per depurar i si hi ha sort i sols era un error de jsp 2 mintus més actualizar i forçar la compilació del jsp per a que el proper usuari no vegi en enlentiment en la pàgina. Normalment més del doble per a corregir el mateix tipus d'error.
Si la correcció de l'error implica canviar codi que no sigui jsp o html les diferències són encara més grans i sovint pot implicar tenir que reiniciar el servidor, la qual cosa ens obligarà a tenir sempre dos servidors balancejats si no volem tenir als usuaris aturats durant 5 minuts. L'Apache es recarrega en segons, i tot i que sempre és bo tenir-ho tot duplicat i balancejat, la necessitat no es tan forta com en el cas anterior.
Personalment m'agrada molt Java i les llibreries que s'han desenvolupat en aquest llenguatge, però si el nostre negoci depèn del ràpid que puguem actualitzar la nostra aplicació web hi ha entorns i llenguatges amb més avantatges que Java o .Net.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Python Java
The Computer Language Benchmarks Game
Escrit per Aaloy a 15 de November , 2007 a les 12:13 p.m.
El llenguatge x és millor!.Quantes vegades no haurem sentit aquesta frase defensant un o altre llenguatge de programació. Tots tenim les nostres preferències, condicionades per la nostra història, coneixements i manera de pensar. Podríem dir que hi ha un llenguatge de programació especial per a cada programador, aquell en que se sent més còmode tant perquè el coneix com perquè s'adapta a les seves estructures mentals.
De tant en tant, però convé tocar un poc de peus a terra i comparar llenguatges, potser el llenguatge que ens agrada més no és el més convenient per la tasca a realitzar, o no es tan ràpid com ens pensàvem.
Una manera de comparar llenguatges és la de crear tot una sèrie de programets típics i desenvolupar-los en els llenguatges que vulguem estudiar i veure quin té l'execució més ràpida o consumeix menys memòria, i això és precisament el que han fet la gent de The Computer Language Benchmarks Game, aquí trobareu un entorn on poder comparar distints llenguatges i fins i tot si trobau que falta alguna implentació o que podeu fer un programa dels que se proposen de manera més eficient poder enviar-ho.
Com que escor molt cap a la web m'he entretingut a comparar un grapat de llenguatges d'script entre ells i després comparar-los amb Java o C#.
- Python i Perl en general són molt semblats tant en velocitat d'execució com amb consum de memòria. Sols a l'execució de fasta per la generació de seqüències de DNA llueix més Python per mor d'un consum de memòria molt més petit. També és interessant comparar com en el tema de les expressions regulars Python no queda tan enfora de Perl com un podria suposar-se i que queda molt millor que el PHP per exemple.
- Python i PHP. En general Python és millor, però no hi ha una diferència prou gran com per marcar la diferència en la majoria d'aplicacions, llevat de que tinguem que fer molts de càlculs, però clar, llavors potser un llenguatge interpretat no és d'entrada el més ràpid.
- Python i Java. En velocitat de CPU Python queda molt malament llevat de casos molt particulars com el regex-dna, així que si sols coneixem Python i Java i hem de fer molts càlculs millor el segon, si hem de tractar cadenes millor Python. El mateix seria aplicable a PHP o Perl. Si el problema que tenim no és la velocitat sinó el consum de memòria, ja ens podem anar acostant més a Python i mens a Java.
La pàgina té un nom molt apropiat i t'hi pots passar hores fent comparacions, mirant com està codificat cada programa, com és d'elegant el codi i les línies que s'ha necessitat per realitzar cada algorisme.
Comparar és divertit, però no sols de velocitat i consum de cpu viu el programador. Saber en línies generals com se comporta el nostre llenguatge habitual comparat amb els altres és sempre profitós, però ens hem de situar sempre en perspectiva i situar el llenguatge en la casta de projectes que desenvolupam. Si l'aplicació no té un consum de memòria o cpu intensius aquestes característiques del llenguatge potser importaran menys que la velocitat en la que podem formar als desenvolupadors, en la mantenibilitat de codi, en el nombre de línies de codi que es necessiten per implementar un punt funció, ... i sobretot hi té molt a veure la capacitat de la gent que programa. No serveix de res tenir un llenguatge ràpid si el nostre codi és erroni o totalment ineficient.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Plantilles a Python
Escrit per Aaloy a 14 de November , 2007 a les 9:34 p.m.
Python te un sistema de tractament de cadenes molt potent i a la vegada molt entenidor. Una de les necessitats que tot programador té és el de muntar missatges més o manco estandaritzats en que sols varien uns pocs paràmetres.
Per exemple, suposem que tenim una llista de noms i edats, per seguir amb els exemples típic suposarem
agenda = [('Benjamí', 31), ('Pau', 22), ('Juan',34),
('Ricardo',38),('Guillem',28), ('Bernat',58)]
i volem construir amb cada un d'ells una frase del tipus: Benvolgut [nom] ara que ja tens [edat] anys ...
Una primera opció és la de fer servir l'operació de formateig de cadenes a Python amb la qual cosa podríem escriure un codi semblant a
for persona in agenda:
···print "Benvolgut %s ara que ja tens %i anys" % persona
que ens donaria com a resultat
Benvolgut Benjamí ara que ja tens 31 anys Benvolgut Pau ara que ja tens 22 anys Benvolgut Juan ara que ja tens 34 anys Benvolgut Ricardo ara que ja tens 38 anys Benvolgut Guillem ara que ja tens 28 anys Benvolgut Bernat ara que ja tens 58 anys
Les opcions de formateig de cadenes esperen una llista i substituexien cada paràmetre que tenim a la cadena per l'element de la llista corresponent. Això és suficient per la majoria de casos en que ens trobarem, però la cosa és que no queda massa documentat què és cada paràmetre, i per això Python ens deixa posar nom als paràmetres de la cadena i passar enlloc d'una llista un diccionari, ara es substituirà cada paràmetre pel valor de la clau agafada del diccionari. L'exemple està agafat un tant pels pèls però seria:
for persona in agenda:
···print "Benvolgut %(nom)% ara que ja tens %(edat)i anys" % {'nom':persona[0],'edat':persona[1]}
En la mateixa línia Python té a més una classe dins el paquet string anomenada Template que ens permet crear plantilles com a tals i fer-ne la substitució de paràmetres bé per nom o mitjançant un diccionari. En aquest cas l'esforç adicional de teclejar es veu compensat per un codi autodocumentat, per exemple
from string import Template
plantilla = Template("Benvolgut ${nom} ara que ja tens ${edat} anys")
for persona in agenda:
···print plantilla.substitute(nom=persona[0], edat = persona[1])
La potència de Template es veu quan hi ha molts de paràmetres, ja que es molt més senzill saber quan ens hem deixat un paràmetre, normalment per un nom mal posat i a més proporciona la funció safe_substitute, que genera la plantilla fins allà on pot i es molt útil a l'hora de depurar una plantilla amb una gran quantitat de paràmetres.
Si encara volem més, hi ha una gran quantitat de llenguatges de plantilles de tercers que podem utilitzar des de Python, en deix alguns enllaços:
L'elecció d'una alternativa u altre dependrà del que necessitem, i en el cas de les plantilles de tercers del si elegim un bastiment web o un altre, de si volem separar molt el codi de la capa de presentació o de si ens sentim més o menys còmodes amb la sintaxi d'XML per les plantilles.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Rhino: Javascript per Java
Escrit per Aaloy a 13 de November , 2007 a les 9:21 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Veure-les venir
Escrit per Aaloy a 12 de November , 2007 a les 8:16 p.m.
- L'empresa A és una empresa.
- L'empresa B és també una coneguda empresa local amb la qual ja s'hi ha fet feina.
- L'empresa C és una empresa consultora d'àmbit nacional i internacional amb la qual ja s'hi ha fet feina.
- Empresa A: desconeguda.
- Empresa B: amb referències i contínues visites dels comercials.
- Empresa C: empresa amb referències però coneguda per ser molt cara.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica General
Technical Debt
Escrit per Aaloy a 07 de November , 2007 a les 1:30 a.m.
En Marcos m'ha fet arribar un interessant article anomenat Technical Debt, d'Steve McConnell un dels meus autors preferits. En ell McConnell ens parla del concepte del deute tècnic, és a dir, l'equivalent a l'import en hores de feina que haurem de pagar en el futur quan en el desenvolupament d'una aplicació prenem determinades decisions.
Per exemple, quan no posam comentaris al codi estam adquirint un deute tècnic, ja que més endavant la persona que ho tengui que depurar o fer-ne modificacions ho tindrà molt més mal de fer i hi haurà de dedicar més hores de feina. També contreim aquest tipus de deute quan per exemple decidim fer la nostra aplicació depenent d'una determinada base de dades, donant per suposant que no necessitarem portar-la mai a una altra. En aquest cas el deute pot fer-se palès quan tenguem la necessitat de canviar de base de dades o bé pot no aflorar mai si l'aplicació acaba el seu cicle de vida sense necessitat de canviar de base de dades.
Es distingeixen dos tipus de deutes tècnics, aquell en el qual hem caigut de manera no intencionada i aquell totalment intencionat i que respon a una decisió estratègica. Els no intencionats s'han d'evitar sempre, ja que no hi tenim cap control, dels intencionats n'hem de ser conscients i avaluar-ne la relació entre el risc que assumim i el possible cost d'aquest risc vers els beneficis que en podem obtenir.
Tal i com passa amb els deutes financers, aquests tipus de càrregues poden ser fruits d'una planificació a llarg plaç o bé per necessitats puntuals del moment. Tal com passa amb el deute financer que en tenim a curt i llarg plaç (la visa i l'hipoteca) podem tenir un deute tècnic a llarg plaç, com per exemple fer una aplicació depenent d'una versió concreta d'un sistema operatiu si sabem que no el canviarem en diguem tres anys, o bé a curt plaç, com algunes decisions que s'han de prendre per tal de sortir al mercat abans que la competència i que s'hauran de resoldre una vegada el programa estigui en producció.
En els dos exemples, es veu que el deute existeix: als tres anys les dependències s'introduïren del sistema operatiu s'hauran de eliminar, els errors les característiques no documentades de la versió inicial del programa s'hauran d'arreglar.
A més de saber que existeix el concepte de deute tècnic ens permet atracar-nos més cap el llenguatge que parla la gent que comana normalment els programes. Ajuda a ser conscient del cost de determinades decisions tècniques i a poder fer un símil entre el cost financer i el cost tècnic, de manera que es pugui fer palès un possible cost ocult, que després haurà d'assumir-se o no, en funció dels beneficis que hi pugui haver.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
sqlitemanager
Escrit per Aaloy a 06 de November , 2007 a les 2:03 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
AppFuseDjango
Escrit per Aaloy a 01 de November , 2007 a les 10:35 p.m.
AppFuseDjango és una aplicació d'aquestes que t'ajuden a començar, sense pretensions, sense fer res de profit més que mostrar d'una manera senzilla com fer les coses. En aquest cas, l'objectiu és tenir una mini-aplicació que mostri com començar a fer coses amb Django, amb el servidor de desenvolupament ja configurat per servir continguts estàtics (cosa que nos s'ha de fer després en producció), preparat per la traducció del lloc, paginació de llistats, etc.
La idea és anar afegint funcionalitats però sempre de manera que tot quedi el més entenedor possible, és adir, si s'han d'escriure tres línies de codi en lloc d'una per a que la cosa es pugui seguir es farà. De la mateixa manera si és necessari que l'aplicació tengui més d'un mòdul (ara sols té una agenda xorra) també es posarà.
L'he creat com un projecte de Google Code, i he de dir que estic gratament sorprés del bé que funciona el repositori subversion.
El wiki no m'agrada massa, m'estím més l'estil de Trac, però el subversion funciona molt bé i es pot configurar per a que t'envii un missatge cada cop que es fa una integració, així que en conjunt estic satisfet.
Esper que pugui servir a algú, si més no, a mi em serveix com a punt de partida dels meus propis projectes.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Sóc kinestèssic, mira per on
Escrit per Aaloy a 31 de October , 2007 a les 1:10 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
LUGs 2.0
Escrit per Aaloy a 28 de October , 2007 a les 12:33 p.m.
Traducciones/Translations by apertium
7 comentaris, 0 trackbacks (URL) , Tags: General
Sqliteman
Escrit per Aaloy a 22 de October , 2007 a les midnight
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Ampliant la biblioteca
Escrit per Aaloy a 19 de October , 2007 a les 4:27 p.m.
Avui he rebut la darrera comanda d'Amazon. Darrerament el servei de correu s'està portant molt bé. Els enviaments m'arriben als quinze dies. Supòs que alguna cosa hi tendrà que veure que la gent cada cop escrigui menys correspondència ordinària i que ara el personal de correus tengui més temps per dedicar-ho a la paqueteria.
A Binissalem el que no he aconseguit encara és que me dugin el paquet a casa. Pareix que ho enviï a l'adreça que ho enviï mai hi sóc i tampoc no hi ha ningú per recollir el paquet. No em sap greu tenir-ho que anar a recollir si és un dia com avui que estic de vacances, però si no m'he d'esperar normalment fins al dissabte o demanar per favor que m'ho vagin a recollir. I quan l'avís t'ha arribat un dilluns esperar un dissabte és una eternitat!
Tres llibres nous per llegir les properes setmanes, que ara venen moltes festes i de les darreres lectures sols em queda ja el llibre de McConnell: sofware estimation, que ho vaig deixar momentàniament aparcat engatxat per "El Economista Camuflado" de Tim Hardford, que ha resultat ser una lectura del tot recomanable. Resumint, he rebut els següents llibres:
Software requirements
Ed. Microsoft Press Karl E. Wiegers - ISBN 978-0-7356-1879-4
Peer Reviews in Software
Ed. Addison-Wesley Karl E. Wiegers - ISBN 0-201-73485-0
Refactoring Databases
Ed. Addison-Wesley Scott W. Ambler i Pramond J. Sadalage
El primer, sofware requirements, l'he comprat per tenir una visió sistemàtica del que representa fer l'anàlisi de requeriments d'una aplicació. Tothom que hagi programat per un tercer sap què és fer l'anàlisi de requeriments i qui més qui manco té la seva manera de fer-ho. M'interessa tenir la visió d'un tercer en el tema.
Peer reviews
ve de la lectura del llibre de Robert L. Glass "Facts and Fallacies of Sofware Engineering", en un dels fets, Glass afirma que la revisió de codi pot eliminar fins el 90 % d'errors abans d'anar a la fase de test. Em vaig quedar amb moltes ganes de saber-ne més, i com que Glass recomana molta bibliografia a cada un dels seus fets i falàcies, doncs vaig poder anar directament a la font.
Refactoring Databases és la continuació de Refactoring, improving the design of existing code
, al igual que el primer està editat en tapa dura i a més es presenta com a un llibre de referència. La refactorització de les bases de dades és tant o més interessant que la refactorització del codi, però m'atreviria a dir que és encara més delicada pel que representa d'estar tractant amb un dels bens de les empreses: les seves dades, i també una de les que més alegries ens poden donar, ja que una refactorització sovint pot anar acompanyada d'un augment del rendimento o de la capacitat de guardar i tractar la informació d'una manera que no es podia fer abans de la refactorització.
L'euro en aquest moments està molt bé per anar comprant llibres, em sap greu per la gent que es dedica a l'exportació, però a mi ja m'està bé que estigui així.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
i18n
Escrit per Aaloy a 13 de October , 2007 a les 4:04 p.m.
- Tutorial de Sun
- The localisation guide.
- Gettex, informació de la Wikipedia
- Gettext, el programa.
- Django i18n
- Integració de Django i Babel
- Zaval, editor de recursos per Java
- Resource boundle editor, un altre editor
- Kbabel, editor d'arxius po de KDE
- GTranslator, editor d'arxius po de Gnome.
- poEdit. I un altre editor d'arxius po
- pootle. Editor d'arxius po basat en web.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
De festa!
Escrit per Aaloy a 01 de October , 2007 a les 9:22 p.m.
Vaig demanar un parell de dies de festa per mirar de sobreviure a la festa del vermar, que un ja té una edat i sols substituir la feina d'oficina per anades i vingudes passejant ja em deixa esgotat.
Les festes amb infants són unes altres festes: el ritme no ho imposes tú, t'ho imposen ells, així com l'horari en el qual es poden fer les coses. Els fideus del sopar a la fresca d'enguany sortiren prou bons. No massa coents, al manco fins la cullerada que feia cinc o sis. L'amo En Miquel té tot una tècnica per això del coent. Per controlar la quantitat que li posa fa un calderó de brou bullint els pebres coents. L'anys passat de coents que eren no t'hi podies atracar, enguany els bitxos tenien menys força.
El sopar a la fresca és temps també de xafardejar amb els veïnats, entre remolcada i remolcada em vaig assabentar que una periodista havia tancat el negoci de Paco Pol, el meu amic artesà sabater. Obviament l'emprenyadura de Paco era justificada, ja que el negoci està ja prou fotut de fer anar, per a que per mor d'un titular erroni la gent es pensi que ja no t'hi dediques. La vida de l'artesà és dura, però no, no tanca, encara hi ha Paco per estona, calcant a nombroses agrupacions de ball de bot de l'illa, i fent sabates de les que a mi m'agraden, per a peus amples i de pell.
Entre passejada i passejada també hi ha temps per la lectura. Aquests dies estic llegint "El economista camuflado" de Tim Hardford en una edició de Planeta per a Círculo de lectores. Estic just a le meitat de les més de tres-centes pàgines del llibre i tot i el cansament que duc acumulat per mor de les festes, vaig trobant estones per a dedicar-hi. Hardvord te mostra com pensar en l'economia d'una altra manera, com factors que s'interrelacionen en la complexitat de la societat. Ens explica conceptes com la fixació de preus, la relació de l'economia i els embussos de tràfic, el perquè els bancs tenen els macro edificis que tenen o perquè la sanitat americana està tan burocratitzada. Tot ho explica en termes econòmics però totalment entenedors. Esper que la resta del llibre estigui tan bé com el que duc llegit.
Entre festes i lectures he dedicat poc temps a la informàtica, sols un parell de proves bàsiques quan Juan em va dir que finalment s'havia posat en producció un mòdul per la part d'agències. Aquest mòdul s'integra dins la web principal i té com a fet diferenciador que està desenvolupat totalment amb Python i Django. Ja havíem fet algun experiment amb aquesta tecnologia, però amb aquesta posada en producció es pot dir que s'han acabat els experiments i que es pasa a integrar Python i Django com a un element més de desenvolupament i productivitat.
Som conscients que és un risc, no per la tecnologia en si, sinó per a que pot venir un il·lumiat/consutor dient que estaria millor en EJB3-chupiwais. Afortunadament hi ha molts casos d'èxit per mostrar i molts amb una quantitat de visites que ja voldrien la majoria de webs on-line.
Fins ara cada vegada que ha vingut algú a dir-nos el que havíem de fer, resultava que ja ho feiem amb escreix, l'equip es prou àgil per a permetre una evolució ràpida en les tecnologies i amb moltes ganes d'aprendre. Si sumam això a que hi ha tecnologies que veus que et faciliten la vida més enllà del que pugui dir l'expert de torn, abraçar les novetats que aporten valor al negoci no és tan complicat com molts ens volen vendre.
Aquest cop crec anam fins i tot més endavant, però amb una postura molt segura i raonada. La capacitat de poder fer modificacions ràpid i de respondre a les necessitats del negoci en dies i hores i no en mesos ens ha fet evolucionar cap a aquestes tecnologies, sempre es pot millorar, però ara per ara és difícil trobar una combinació millor que la que estam fent servir.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Ordre a la llista!
Escrit per Aaloy a 23 de September , 2007 a les 7:18 p.m.
Una de les accions més repetitives que sovint feim quan passam cap a la capa de presentació és la d'ordenar els elements que volem que es presentin. Potser algú dirà que els elements ja poden venir ordenats de la consulta a la base de dades, però què passa si en lloc d'atacar a una base de dades directament obtenim el que s'ha de mostrar d'un servei web? o ja hem fet un tractament de les dades i ara les volem ordenar per un altra camp. Poder fer ordenacions de manera senzilla i ràpida ens soluciona molts maldecaps.
Anem a veure com Python ens permet fer ordenacions de llistes de pràcticament qualsevol cosa. Python fa servir el mètode sort per a ordenar una llista. L'exemple més senzill seria l'ordenació d'una llista d'enters
$ llista = [2,4,5,6,7,6,7] $ llista.sort() $ llista [2, 4, 5, 6, 6, 7, 7]
Sí, és tan senzill com pareix, i fins i tot podem fer
$ llista.reverse() $ llista [7, 7, 6, 6, 5, 4, 2]
Però clar, una llista a Python pot contenir qualsevol cosa, no sols sencers, anem a veure què passa si passam una llista de parells (tuples)
$ llista = [(1,5),(1,2),(2,2),(3,5),(4,8),(1,9)] $ llista.sort() $ llista [(1, 2), (1, 5), (1, 9), (2, 2), (3, 5), (4, 8)]
Suposem però que jo el que vull és que s'ordeni pel segon element de la tupla, aquí si un prové d'altres llenguatges de programació ja se pot esperar tenir que escriure un bon munt de codi, però no en Python, l'ordenació es fa per una clau i podem definir quina és aquesta clau passant-li al mètode sort una funció construida de manera que prengui un sol element i ens retorni la clau a comparar.
Per fer el que volem farem servir el mòdul operator, i dins aquest la funció itemgetter, aquesta funció ens retorna una altra funció que aplicada damunt una llista o tupla ens donarà l'element especificat que haguem definit, així per exemple
$ segon=itemgetter(1) $ segon(llista) (2, 2) $ llista [(1, 2), (2, 2), (1, 5), (3, 5), (4, 8), (1, 9)] $ segon(llista) (2, 2) $ segon((1,5)) 5
Farem servir aquesta funció per a obtenir la clau per la qual volem ordenar la nostra llista, així
$ llista.sort(key=segon) $ llista [(1, 2), (2, 2), (1, 5), (3, 5), (4, 8), (1, 9)]
Pensem en les implicacions que té això quan volem omplir un select d'html, encara que la llista ens hagi arribada ordenada per codi, podem fàcilment canviar l'ordenació al texte sols amb aquesta instrucció. Un altra paràmetre que ens serà de molta utilitat a l'hora de fer ordenacions és el cmp, aquest ens permet passar una funció que donats dos arguments haurà de retornar un nombre positiu per indicar que el primer és major que el segon, zero per indicar que els elements són igual o negatiu per indicar que el segon és major que el primer.
Per exemple, suposem que el que volem fer és ordenar la nostra llista segons el que sumen els seus components.
$ t=llista[:] #Farem primer una còpia de la llista original
$ def ordena(x,y):
p1 = x[0]+x[1]
p2 = y[0]+y[1]
return p1-p2
$ t.sort(cmp=ordena)
$ t
[(1, 2), (2, 2), (1, 5), (3, 5), (1, 9), (4, 8)]
$ llista
[(1, 2), (2, 2), (1, 5), (3, 5), (4, 8), (1, 9)]
O també poden fer un codi més florit i escriure
$ t = llista[:] $ t [(1, 2), (2, 2), (1, 5), (3, 5), (4, 8), (1, 9)] $ t.sort(lambda x,y: x[0]+x[1]-y[0]-y[1]) $ t [(1, 2), (2, 2), (1, 5), (3, 5), (1, 9), (4, 8)]
Si algú ha tingut la paciència d'arribar fins aquí, un momentet, que ara ve el més interessant. Què passa quan en lloc de llistes de nombres tenim llistes d'objectes? Doncs res, podem fer servir el paràmetre cmp o el paràmetre key segons ens vagi millor per fer l'ordenació. Anem a veure tres maneres de fer el mateix. Primer definirem la nostra llista d'objectes
class Persona:
def __init__(self, nom, edat):
self.nom = nom
self.edat = edat
def __cmp__(self, altri):
return cmp(self.edat,altri.edat)
Aquí el que he defint és una funció cmp dins la classe, que és la que faríem servir per defecte a l'hora d'ordenar una llista d'objectes d'aquest tipus, així:
$ agenda = [Persona('Benjamí', 31), Persona('Pau', 22),
Persona('Juan',34), Persona('Ricardo',38),
Persona('Guillem',28),
Persona('Bernat',58)]
$ agenda.sort()
$ for amic in agenda:
$ print "%25s \t %i" % (amic.nom, amic.edat)
Pau 22
Guillem 28
Benjamí 31
Juan 34
Ricardo 38
Bernat 58
Ara suposem però que volem ordenar la llista per nom. Una opció seria refer el mètode cmp, però tenim altres opcions. La primera és encriure una nova funció de comparació:
$ def compara_nom(amic1, amic2): $ return cmp(amic1.nom,amic2.nom) $ agenda.sort(compara_nom) $ for amic in agenda: $ print "%25s \t %i" % (amic.nom, amic.edat)
Benjamí 31
Bernat 58
Guillem 28
Juan 34
Pau 22
Ricardo 38
O bé, si ens agrada més l'opció lambda
$ agenda.sort(lambda amic1, amic2: cmp(amic1.nom,amic2.nom))
Però encara tenim una altra maner, deixant que Python faci la feina per nosaltres, hem d'indicar la clau d'ordenació i fer que les eines de comparació del llenguatge facin la seva via. El problema però està en com dir-li quina clau fer servir, això s'aconsegueix amb attrgetter de la llibreria operator.
$ agenda.sort(key=attrgetter('nom'))
$ for amic in agenda:
$ print "%25s \t %i" % (amic.nom, amic.edat)
Fixau-vos el senzill que seria poder fer una ordenació per qualsevol camp de la classe.
Referències:
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Python
Cap a una nova arquitectura de desenvolupament
Escrit per Aaloy a 15 de September , 2007 a les 11:46 a.m.
En el negoci on-line cada cop és més important adaptar-se als canvis més ràpid, posar nous serveis a l'abast dels clients i fer-ho per ahir. Fins ara havíem fet servir dues aproximacions diferents:
- aplicacions fetes en Python i Django, per les parts més dinàmiques i mensy crítiques del negoci
- aplicacions desenvolupades anb Java/J2EE de contenidor fi (Tomcat) per les parts més serioses del negoci.
Llevat de la conya de que Java deixa més tranquils a consultors i auditors, he de dir que la tecnologia té moltes coses bones, la qualitat del programari obert és molt bona, i bastiments com XFire (ara baix l'ala del projecte Apache), Spring o Hibernate fan la vida del programador molt més senzilla, encara que la corba d'aprenentatge sigui gran. La tecnologia està té un gran nombre d'eines i els IDE de desenvolupament com Eclipse o Netbeans són vertaderes meravelles.
El problema fonamental que té fer-ho tot en Java és que és força lent fer el desplegament de les aplicacions, així com fer petits canvis en la lògica de negoci o la capa de presentació. Fer un canvi que afecti a la part del model implica sovint tenir que recarregar l'aplicació a Tomcat, maleir quan a la sessió de depuració veus que no t'ha refrescat les classes, reiniciar el contenidor, esperar fins a un minut o dos que recarregui tot i començar la depuració.
La posada en producció també es veu afectada per com fa les coses la tecnologia, la velocitat i l'estabilitat que dona Java i el Tomcat s'aconsegueixen fent que les aplicacions es despleguin al contenidor, que la capa de presentació es compili en temps d'execució. La qual cosa vol dir, que un desplegament típic de les aplicacions pot dur un mínim d'uns 15 minuts entre baixar el servidor, posar-hi l'aplicació, pujar el servidor i fer que aquest compili els jsp. Baixar el servidor no vol dir aturar-ho, sinó llevar-ho de l'accés públic, encara que sovint aquest llevar-ho de l'accés públic també implica l'aturada.
Davant això tenim aplicacions fetes amb Django i Python, on provar un canvi no duu més que uns pocs segons, el servidor de desenvolupament respon de manera immediata als canvis fets en el codi. Posar una aplicació a l'entorn de proves normalment implica actualitzar el repositori de subversion al tag que s'hagi determinat com estable i fer un reload de l'Apache, tot plegat menys de 15 segons. Passar-ho a producció normalment és igual de senzill, moltes vegades ni tan sols és necessari establir un procediment d'aturada del servei, ja que l'actualització de les plantilles no implica aturada i un reload de l'Apache no arriba al segon en els mega servidors de producció.
Hem d'aconseguir anar cap a una arquitectura d'aplicacions i de desenvolupament que aconsegueixi unificar el millor dels dos mons: la facilitat de desenvolupar i testejar aplicacions sense capa de presentació que té Java i la potència i facilitat de fer canvis a la capa de presentació de Python i Django.
En altres apunts ja he comentat cap a on volia anar, fer els serveis en Java, que se n'encarregaran d'accedir a les bases de dades i fer tota la fontaneria necessària i fer tota la capa de presentació web en un llenguatge dinàmic, en el nostre cas Python amb el bastiment Django, que sigui un consumidor dels serveis web.
Amb això podem no tant sols escalar les aplicacions, sinó també escalar l'equip de desenvolupament, ja que podem tenir equips fent feina a cada una de les capes de l'aplicació sense que hi hagi pràcticament interferències una vegada s'han definits els serveis.
Donat que els serveis no tenen capa de presentació i per tant no hi ha compilacions de JSP per exemple, resulta que el temps necessari per desplegar-los és molt petit comparat amb de l'aplicació sencera. El testeig es relativament senzill, bé amb tests d'unitat direcatament en Java o amb eines com SoapUI.
Ens queda doncs lligar la capa de serveis (arquitectura SOA que queda millor), amb la capa de presentació. Consumir serveis web Soap complexes amb Python fins ara no era senzill, l'espacificació Soap és tan complexe que llevat de el propi Java i .net (a la seva manera), són capaços de convertir el wsdl publicat a classes manejables pel programador. Però això està canviant i ho està fent molt ràpid, el projecte ZSI ha madurat molt els darrers temps i a les darreres proves ha demostrat que és capaç de consumir els serveis web fets amb XFire sense problemes. També hi ha que dir que els serveis ja s'han pensat de tal manera que siguin fàcils de mapejar, evintat fer us de característiques sols suportades sols per Java, però això no crec que sigui una mancança sinó una inversió de futur, augmentar la complexitat implica augmentar també temps de depuració i tenir que lluitar amb incompatibilitats entre versions.
Els prototips realitzats fins al moment són molt encoratjadors, els temps de resposta de tot plegat és excel·lent, sense fer optimitzacions tenim temps de 0.6s des de la capa de presentació feta amb Python fins a la capa de base de dades a la que s'hi ha accedit mitjançant un servei web fet amb Java i XFire.
Encara que hi ha una regla que diu que quan es fa un estudi per veure la viabilitat d'un projecte aquest estudi sempre dóna que és viable, per ara tot pareix demostrar que el camí pel que estam anant és correcte i que per projectes amb molts programadors és molt productiu, ja que a més de separar l'aplicació en capes, estam separant en capes el propi desenvolupament.
Queden encara força aspectes a estudiar, però que no són tant d'arquitectura d'aplicacions com de metodologia de desenvolupament i de desplegament de les aplicacions, de manera que s'acabin optimitzant tant els mètodes de desenvolupament, el mètodes de desplegament com la comunicació entre els membres del projecte. L'objectiu és poder respondre ràpid a les necessitats del negoci i que la tecnologia no ens condicioni de manera negativa el temps de resposta, mantenint al mateix temps l'estabilitat i l'escalabilitat de les aplicacions.
Hi som molt aprop....!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Creant objectes a la manera de Python.
Escrit per Aaloy a 09 de September , 2007 a les 10:33 p.m.
- El patró MVC (Model view controller) de sobres conegut per la gent que es dedica al desenvolupament web fonamentalment.
- El patró MVP (Model view presenter) , que intenta fer que la part d'interacció sigui més testejable y que Flower ha considerat que s'havia de xapar en dos.
- El patró Presentació Model, que independitza la capa de presentació de la vista, en un intent de separar el que és la part de comportament i estat de la vista en un model que és part de la presentació però que no es específic d'una implementació d'interfície concreta.
class Agenda:
... def __init__(self, nom, llinatge, telefon, amic=True):
... self.nom = nom
... self.llinatge = llinatge
... self.telefon = telefon
... self.amic = amic
...
La manera habitual de crear un objecte de tipus Agenda seria per exemple
amic = Agenda('toni','aloy','971xxxxxxx')
Suposem ara que tenim la informació dins una llista o una tupla, bastant habitual si per exemple hem importat les dades d'un arxiu de text o des de una base de dades, aleshores podem tenir la informació com
un_amic =('Pau','Rul·lan','971xxxxxxx')
La creació de l'objecte és molt ràpida d'escriure
amic2 = Agenda(*un_amic)
amic2.nom
'Pau'
És a dir, s'han substituït els paràmetres de construcció de l'objecte pels valors de la llista. Aquesta substitució és posicional, és a dir, el primer valor correspon al primer paràmetre, el segon al segon, etc. La sintaxi és conseqüent amb la manera d'anomenar llistes de paràmetres en la construcció de funcions, per exemple:
def prova (x, *y):
... print x
... for item in y:
... print item
...
prova(2,3,4,5,6,7)
2
3
4
5
6
7
prova (2,7,10)
2
7
10
Però clar, si això funciona d'aquesta manera i estam parlant de Python i haurà una manera obvia de fer el mateix si en lloc d'una llista tenim un diccionari, és a dir, ara tenim:
un_amic ={'nom':'Benjamí','llinatge':'Villoslada','telefon':'971xxxxxxx'}
Les claus del diccionari coincideixen amb els noms dels paràmetres, i hauríem de poder fer
amic3 = Agenda(**un_amic)
Això és Python, i per tant
amic3.nom
'Benjam\xc3\xad'
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Python
Llegir codi
Escrit per Aaloy a 09 de September , 2007 a les 1:36 p.m.
Aquests darrers dies estic llegint el llibre wxPython in Action de Robin Dunn i Noel Rappin. El llibre és un tutorial de com escriure aplicacions fent servir la llibreria wxPython i com fer servir cada component (widget) que la llibreria inclou.
En el que és la explicació de cada component i els exemples hi ha una gran quantitat de llistats de codi font i comentaris damunt aquests llistats. Això m'ha fet recordar el capítol en que Glass tracta la importància de poder llegir codi. Diu, i estic completament d'acord, que a programar no se n'aprèn sols coneixent la sintaxi del llenguatge de programació, sinó també escrivint programes i sobretot llegint codi que ha escrit altra gent, i que aquesta capacitat de llegir codi s'hauria de cultivar més a les universitats i escoles tècniques.
Sense aquesta capacitat de llegir codi d'altres també ens trobam que llegir tutorials com el de wxPython es fa pràcticament impossible, si no som capaços de llegir el codi, interpretar mentalment que fa i imaginar-nos la sortida, no ens queda més remei que picar el codi i executar-ho per aprendre, la qual cosa fa que l'avanç en el domini de la llibreria sigui molt més lent.
Ser capaç de llegir el codi d'un altre ens permet aprendre noves tècniques que potser no estan explicades en el llibre, normalment perquè no és el seu objectiu, i ens permet la lectura a llocs allunyats de l'ordinador: al sofà, a la fresca a la terrassa,...
El programari lliure ens permet llegir codi que ha fet altre gent, veure com funciona, aprendre noves tècniques o veure el que s'ha fet malament o maneres de millorar-ho. Aquesta capacitat és fonamental a l'hora d'aprendre el funcionament d'una nova llibreria, de fer inspeccions de codi abans de posar en test un programa, o a l'hora de depurar o modificar codi que ha fet una altra persona.
Les èpoques del programador solitari que ho feia tot han ja queden lluny. El més normal actualment és que els programes és desenvolupin en equip i la gent acostumada a llegir codi ho té molt més fàcil per a adaptar-se a la feina en equip.
Si una persona sols ha fet feina fent servir programari tancat no haurà tingut l'oportunitat d'aprendre el que significa poder veure codi de tercers i per tant la seva evolució com a programador serà menor que aquells que estan acostumats, bé per necessitat o bé per convicció, a llegir el codi font d'altres persones.
Com vaig sentir a dir a Ricardo Gali a una conferència de Bulma, el codi és una font en sí mateixa per emmagatzemar i transmetre coneixement.En els cas dels programadors això també es tradueix en possibilitat d'aprenentatge i amb minimitzar el nombre d'errors i tasques de depuració.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Llibres i revistes Gestió de projectes
L’akismet, que filtra massa
Escrit per Aaloy a 04 de September , 2007 a les 9:31 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Facts and Fallacies on Sofware Engineering
Escrit per Aaloy a 04 de September , 2007 a les 6:15 p.m.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
Intrussisme professional a la informàtica
Escrit per Aaloy a 03 de September , 2007 a les 7:26 p.m.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
trespams ha fet tres anys
Escrit per Aaloy a 31 de August , 2007 a les 9:33 p.m.
Ja ha plogut força des de que va tres anys vaig posar en marxa aquest bloc. Han estat tres anys d'escriure de tot un poc, però sobretot del que m'apassiona: la programació i la gestió de projectes i estimació informàtics, tant des del seu vessant tècnica com de la vessant humana.
Les estadístiques del Wordpress em diuen que comptant aquest hi ha 167 entrades al bloc, la qual cosa vol dir un poc més d'una entrada setmanal. Vist en perspectiva no és massa, però a mi ja m'està bé.
Vaig començar a escriure a mena d'exercici. Sempre m'ha agradat escriure, però fer-ho quan altra gent et pot llegir és una altra cosa, imposa respecte. Tenir un bloc és una manera de perdre la por escènica i acostumar-se a la comunicació escrita com a mitjà d'expressió.
Des del principi aquest ha estat un bloc en català, per que sí, perquè m'agrada, perquè és el meu bloc on dic el que vull i perquè s'ha de poder parlar de tecnologia i de qualsevol cosa en català. En Benjamí ho explica molt bé al seu apunt damunt llengua i tecnologia.
El boc a més ha servit per mantenir el contacte amb un bon grapat de gent i directa o indirectament contar-los el que estic fent, els meus interessos, el tic-tac de la feina, convidant-los a ser partíceps dels meus pensaments i de les meves inquietuds. Ha servit també com a mitjà on poder desestressar-me, sovint fent conya de situacions viscudes a la feina o al carrer, gairebé sempre, però, conservant la vessant tecnològica del bloc.
Als visitants assidus i no tant assidus de trespams, us vull agrair el vostre interès i els comentaris i aportacions. Moltes gràcies!
un pam, dos pams, tres pams, ...
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: General
Fusió freda.
Escrit per Aaloy a 26 de August , 2007 a les 1:51 p.m.
Com he comentat en algunes ocasions l'empresa per la que treball està immersa en un procés de fusió, que culminarà la primera setmana de setembre amb la creació d'una nova companyia.
Com la fusió freda, de la qual aquest article pren nom, hi ha moltes especulacions del que serà, de les possibilitats i del que passarà a partir d'ara, i com en aquesta hi ha poca informació i una sensació de que a la que se grati una mica hi pot haver una gran decepció.
La manca d'informació en un procés així crec que no es bona. Davant la incertesa la gent té tendència o bé a cercar-se un lloc de feina amb més bones perspectives, o bé a adoptar una posició de wait-and-see, és a dir, de veure-les venir. En qualsevol dels dos casos l'empresa hi sol sortir perdent.
Quan una persona deixa l'empresa per la incertesa del que pot passar, de fet està protegint el seu futur. Normalment les persones que marxen són aquelles amb capacitat per trobar un lloc de feina, i que troben que un procés de reestructuració, tipus expedient de regulació, ho pot deixar al carrer, i això implica que valdrà menys al mercat de treball, ja que normalment és cotitza molt més un treballador en actiu que un que estigui a l'atur.Davant això els treballadors més capaços poden veure's temptats a anar cercan feines amb millors perspectives i deixar a les empreses que es fusionen amb la gent que precisament no voldrien retenir.
En el nostre cas particular tenc la sensació d'estar davant d'un canvi de cicle, tant de l'empresa com potser a nivell personal. Un canvi que s'ha visualitzat amb la marxa de l'empresa de una de les persones més vàlides que m'he trobat mai: el seu director financer. Tampoc és cosa que me posi aquí a especular damunt el que pot haver passat o no, però el cert és que davant el proper procés de fusió tenc la impressió de que ha guanyat el sector del "sortir en la foto".
Particularment em sap greu, he fet feina amb aquesta persona durant anys i el conec bé, ant com per considerar-ho un amic. És d'aquell tipus de gent de la que cada dia pots aprendre coses, íntegre, directe, una capacitat de feina impressionant i amb profunds coneixements de la seva feina. Crec que l'empresa ha perdut capital humà en els moments en que més falta farà, i em deixa força intranquil pel precedent que representa.
Aquest tipus de coses i una ample anecdotari de peticions del tipus "volem imprimir pdfs pel navegador sense que el client tengui que tenir instal·lat cap lector de pdfs" fan que darrerament em plantegi si no estaré treballant dins d'una tira de Dilbert.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: General
Trac i clearsilver
Escrit per Aaloy a 20 de August , 2007 a les 9:07 p.m.
El clearsilver és una llibreria de plantilles que abans feia servir el Trac i que s'està substituint a favor de Genshi, una altra llibreria que segons la gent de Trac els causa molt menys problemes.
La cosa està, però, en que no es lleven les dependències fins a la versió 0.11 no s'eliminen les dependències de clearsilver i fins i tot en aquesta versió es mantindran les estructures necessàries per a que els plugins segueixin funcionant.
He pogut comprovar de primera mà el que es diu a la web de Trac, "clearsilver sucks", ja que amb Ubuntu i la versió 2.5 de Python no fa sino donar problemes, que sospit han acabat per tomar el servidor Apache 2 que tenim al webhosting virtual. En un primer moment he pensat que se'ns hauria tornat a oblidar el pagament, però no, tots els serveis eren vius llevat de l'Apache i als logs he vist un bon munt d'errors del tipus
/usr/lib/python2.5/site-packages/trac/web/clearsilver.py:128: RuntimeWarning:No ha costat molt trobar referències tant al Trac com a Ubuntu d'aquest error i de com solucionar-ho. Aquesta és la recepta que m'ha servit a mi:Python C API version mismatch for module neo_cgi: This Python has API version 1013, module neo_cgi has version 1012.
- Davallam el codi font: wget http://www.clearsilver.net/downloads/clearsilver-0.10.4.tar.gz
- Modificam els arxius config i config.in, cercam les línees que diuen python_version i i afegint la versió 2.5 al davant.
- Descomprimim el fitxer tar xvzf clearsilver-0.10.4.tar
- Davallam paquets adicionals però aquesta vegada per apt-get
- sudo apt-get install zlib1g-dev
- sudo apt-get install autoconf
- sudo apt-get install python-dev
- Feim el configure: ./configure --disable-wdb --disable-compression --disable-perl --with-python=/usr/bin/python2.5
- I per acabar el sudo make install
- Com que la instal·lació no acaba d'anar fina convé copiar la llibreria generada sudo cp -i neo_cgi.so /usr/lib/python2.5/site-packages/neo_cgi.so per acabar de substituir la referència que hi havia de la llibreria anterior o fer un ellaç simbòlic cap a la nova instal·lació de clearsilver: sudo ln -s ./clearsilver-0.10.4-py2.5-linux-i686.egg/neo_cgi.so neo_cgi.so
Referències:
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica Python
Llibres agost-2007
Escrit per Aaloy a 17 de August , 2007 a les 8:59 p.m.
Això de que a l'estiu les coses van més a poc a poc és veritat en la majoria de coses, però no en l'enviament de llibres. El dimarts vaig rebre l'avís de que ja podia anar a recollir a correus els llibres d'Amazon que havia comanat no feia ni deu dies i que se suposava que havien d'arribar damunt el vint-i-quatre d'aquest més.
Els dijous ja les tenia, després de l'obligat pas per correus. No sé com s'ho fan els de correus del meu poble, però la cosa és que quan es tracta d'entregar llibres mai ens hi troben, ni tan sols quan l'adreça és la de la meva sogra, que normalment sempre és a casa.
Però bé, la cosa és que hem començat a fer una ullada a les noves adquisicions i la cosa pinta bé:
Facts and Fallacies of Sofware Engineering Robert L. Glass Ed. Addison-Wesley ISBN 0-321-11742-5
Software Estimation Steve McConnell Microsoft Press ISBN 978-0-7356-0535-0
wxPython in Action Noel Rappin & Robin Dunn Manning ISBN 1-932394-62-1
El primer el vaig comprar per les contínues referències que hi veia a altres llibres d'enginyeria de programari. Pel que duc llegit fins ara crec que no serà el darrer llibre que compri d'aquest autor. 55 fets i 5+5 fal·làcies que tracten gairebé tots els aspectes de l'enginyeria de programari. El llibre sols mostra fets i ens fa reflexionar i fins i tot ens anima a no estar d'acord amb l'autor. Ara per ara sols duc llegides una trentena de pàgines, però si la qualitat de tot el llibre és com el que he vist fins ara trob que disfrutaré molt llegint-ho.
El sofware estimation de McConnell no sabia si comprar-lo o no, després de la mala experiència amb el llibre anterior de McConnell, però al final vaig decidir donar-li una altra oportunitat. La primera impressió és positiva: bona edició i maquetació, espaiat correcte i ple de gràfics, taules i alguna que altra fórmula que ja era present al Rapid Development. Serà el següent després del de Glass.
El wxPython in Action l'he comprat com una manera de contribuir al programari lliure. Robin Dunn és un dels principals mantenidors de la llibreria wxPython, i el llibre és una manera com un altra de reconeixement a la feina feta. A més, pel que estic vegint el llibre és molt complet i toca tots temes de la programació d'interfícies gràfiques amb aquesta llibreria. Un dia d'aquests m'agradaria poder fer el mateix amb PyQt4.x A més de la contribució a ben segur que li acabaré traient profit.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
Va d’ERPs
Escrit per Aaloy a 15 de August , 2007 a les 7:55 p.m.
Des del blog de Ricardo Galli me n'assabent de dos articles [1] molt interessants damunt els ERP, a més obviament del seu(s) propis escrits.
Particularment el ERPs em fan molta grima, tant perquè la majoria són programes tancats que fermen als seus usuaris, per la manera que es comercialitzen i perquè representen una manera de fer programes allunyada del que es consideraria bones pràctiques de programació.
D'ERPs conec l'Oracle Financial, Navision i SAP, encara que aquest darrer molt de passada i tots ells tenen un problema fonamental: és l'empresa la que s'ha d'apatar a l'ERP. Si no es fa així els costs d'adaptacions són tan grans que ben bé l'empresa podria haver-se permès crear els seu programari a mida.
Però clar, la manera de comercialitzar un ERP és dir que el programa fa tot el que necessita l'empresa i més, que té tots el mòduls i que en tot cas sempre es podran fer adaptacions.
La realitat però, és que una vegada s'ha convençut a les altes esferes de la bondat de l'ERP i ja s'ha desembutxacat una quantitat més que considerable en llicències de l'ERP i la base de dades i comença la fase d'implantació i adaptació l'empresa ja està agafada. Si vol seguir fent feina de la manera que sap fer i que és el seu factor competitiu, haurà de fer mils d'adaptacions a l'ERP, adaptacions que es cobren a preu de canari jove i que poden doblar o triplicar el cost en llicències de l'ERP. La història de que la gent de l'empresa podrà fer adaptacions sense problemes no és més que això, una història. La realitat és que l'ERP és tan complexe que els propis consultors reconeixen que tenen gent especialitzada en un mòdul concret del producte.
I després venen les actualitzacions de versions. Actualitzar torna a ser com a una implantació. En vaig viure una indirectament i sols veies gent de la consultora anar i venir, fent hores i més hores. El cost: prohibitiu! I sols va ser un canvi de versió!
Els ERPs són el fast-food del programari de gestió. Prometen una solució ràpida, però després resulta que has de fer coa per a que t'atenguin i si en menges molt tens assegurada una indigestió. Els ERPs també prometen una solució immediata a les necessitats d'informatització d'una empresa, però es cuide'n molt de parlar-te dels temps d'implantació que s'aniran allargant, dels riscs de la implantació i del que et costaran les futures actualitzacions.
Si parlam d'enginyeria de programari hem de parlar del costs de desenvolupament dels projectes i de la quantitat d'errors i del cost del maquinar. Es ben conegut que un programa de 100.000 línies no té un cost 10 vegades major que un de 10.000 línies, sinó que el cost és sensiblement major, i quan es desenvolupa programari per un ERP estan agafant tant les complexitats del programa que desenvolupam més les complexitats del propi ERP.
Els ERPs tenen desenes de milions de línies de codi, i per tant les possibilitats que hi hagi errors en el codi augmenten en la mesura que augmenta el nombre de línies. Si tenim un programa de 10.000 línies i una taxa d'errors de 5 errors per KLOC podem estimar que tenim uns 50 errors pendents de detectar quan el programa passa a producció. Com que segons Putnam-Myers el nombre de defectes per línies de codi és lineal, podem esperar que l'ERP tengui una taxa d'errors en la mateixa proporció o major, ja que el distribuidor es cuidarà molt de dir-nos quin és el ratio d'errors del programa o el temps necessari per la seva actualització. I si el nostre negoci depèn de fer adaptacions a programari que tindrà errors, que haurem de corregir mantenir i que possiblement perdrem en la propera actualització costossísima de l'ERP, doncs la cosa fa por, molta por. Però encara hi ha més, tothom pareix estar d'acord amb que els ERPs són complexos, molt complexos, i amb això la linealitat del nombre de defectes per KLOC no es manté, sinó que creix de manera exponencial, i això malhauradament no afecta sols a les línies de codi de l'ERP sinó a les modificacions i adaptacions que se facin, que hereten aquesta complexitat. Què vol dir això? Doncs adaptacions més cares, més males de mantenir i depurar.
Així que la cosa està clara, davant la opció de desenvolupar un conjunt d'aplicacions a mida per la nostra empresa o tirar d'un ERP hi ha que valorar no sols el cost d'implantació de cada solució, sinó els costs dels anys que vindran i com afectarà la implantació de l'ERP als nostres processos de negoci, ja que en lloc d'adaptar el programari al negoci haurem de fer les coses com l'ERP millor li vagi per gestionar-les.
Respecte a l'arquitectura orientada a serveis (SOA) he de dir que sí que ho veig com a una manera de guanyar independència de distintes capes de programari i augmentar la reutilització de codi, en forma de programes. Si se fa bé, tendrem serveis petits, molt orientats a una tasca, controlables. Podrem controlar la complexitat de cada servei i mantenir la seva taxa d'errors molt baixa.
Això implica no caure en la trampa que volen els fabricants d'ERPs actualment: tot serà un servei i ho podràs fer servir sempre que facis servir el nostre BPEL o el component X que te proporcionen. La idea és seguir-te tenint fermat.
El serveis ens poden ajudar a anar independitzant capes de l'ERP i anar fent millores sense tenir que llevar tot l'ERP de cop. Per exemple, podem fer un mòdul de facturació en forma de servei que al final deixi les línees de facturació en la manera que les vol l'ERP de torn. Si feim una aplicació de facturació que faci servir el servei, estam aïllant-la de l'ERP i si demà decidim anar cap a un altra ERP lliure o cap a aplicacions sofisticades i separades el cost d'adaptació serà molt menor.
Les empreses no necessiten que tot sigui un servei, necessiten que tot el que es pugui reutilitzar pugui ser un servei, i que els programadors puguin fer servir aquests serveix per anar montant les aplicacions. La metàfora del Tente no és aplicable, no es tracta de sols ajuntar peces, es tracta per una part de montar una arquitectura de serveis i aprofitar-la per crear aplicacions que aprofitin els serveis com si fossin llibreries, però això està molt lluny de joc d'anar encaixant peces.
Particularment és una idea que cada cop m'agrada més, però entesa d'aquesta manera. Per exemple, amb Java i llibreries com XFire o Axis és prou senzill publicar serveis Soap, però els serveis interns no tenen per què ser precisament SOAP, podem tirar de protocols més lleugers com l'XML-RPC per exemple i fer-los servir per augmentar la velocitat de comunicació entre els serveis i la nostra aplicació.
Aplicació, per cert, que no té perquè estar escrita en Java, la capa de presentació en Java, ja sigui Swing o web és feixuga i amb una velocitat de desenvolupament i instal·lació poc àgil. Podem tirar de llenguatges d'script per fer la capa de presentació i tenir el millor dels dos mons: la facilitat de creació d'interfícies d'usuari dels llenguatges d'script i la facilitat de crear serveis que tenen els bastiments de Java.
Tot i això, no crec que a curt plaç els ERPs desapareguin, hi ha massa inversió feta. Seria el mateix que dir que els programes fets en COBOL desapareixeran d'aquí no res. Canviar un ERP és molt costós, i a més hem de tenir en compte que potser l'empresa encara està amortitzant la darrera actualització.
[1] http://evora.mit.edu/smr/issue/2007/fall/01/ http://www.roughtype.com/archives/2007/08/erps_troubled_l.php
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Software project survival guide
Escrit per Aaloy a 14 de August , 2007 a les 8:26 p.m.
Titol: Software project survival guide Autor: Steve McConnell Editorial: Microsoft Press ISBN-13: 978-1-57231-621-8 Pàgines: 288
Sofware project survival guide és un llibre damunt la gestió de projectes en general, no entra a explicar cap metodologia concreta, sinó que és un conjunt de consells i llistes de coses a comprovar en els projectes, però sense mullar-se ni anar al detall.
Al contrari d'altres llibres de McConnell he de dir que aquest no està a l'alçada, pareix més un llibre d'aquells que es fan per pagar factures i que s'aprofita de la fama dels que l'han precedit.
Tot i això he ha coses aprofitables: alguns "survival checks", una mena de llistat de coses a tenir en compte o a fer per dur endavant el projecte, i és un recordatori del cicle de vida d'un projecte.
L'estil tampoc és el que acostuma McConnell, molt més amè de llegir. Aquest m'ha costat acabar-ho, ja que li passaven per davant tots els altres llibres que he anat comprant aquesta temporada.
En el que fa a l'edició, el llibre té una edició amb una tipografia de cos dotze amb molt de marge per tot i amb un doble espai generós. Amb una altra tipus d'edició el llibre no passaria del centenar de pàgines.
En definitiva, si us ho regalen o el trobau de segona ma agafeu-lo, però no val la trentena d'euros que costà.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes
Filtres de selecció de personal
Escrit per Aaloy a 13 de August , 2007 a les 10:12 p.m.
Trobar bona gent és difícil i trobar-la que a més es pugui integrar en un equip ja format encara ho és més. A les respostes d'anuncis de feina s'hi pot presentar molta gent i en poques preguntes sovint s'ha d'intentar esbrinar si la persona que tens al davant serà bona tècnicament i a la vegada la seva manera d'entendre la feina serà per l'estil de la que hi a al grup.
Encara que soni molt a tòpic hi ha una sèrie de regles heurístiques que quan parlam de programació web ajuden a fer-se una idea d'ambdues coses:
- Adreça de correu amb domini propi : suma un punt. Per mi vol dir que al manco hi ha una preocupació per cercar-se la vida i potser haver donat d'alta un domini. Tenir un domini implica que també es pot cotorrejar abans de la selecció i veure quins temes preocupen al possible candidat o candidata.
- Adreça de correu amb Hotmail: resta dos punts. Sovint també vol dir que estàs engantxa al messenger i/o que no ets capaç de diferenciar el tenir un correu per usos lúdics d'un per usos professionals. Serveix per a diferenciar la gent que el primer que intentarà fer és posar-se el Messenger.
- Edició d'HTML. Si el sols es sap fer servir el Dreamweaver resta de cop 2 punts. Implica que d'entrada es tendran problemes quan es tracti de modificar planes webs fetes a troços, pràctica habitual en la programació web. Si utilitza un editor amb resaltat de sintaxi suma un, si a més sap fer servi el vi/vim suma dos punts. Si no ha fet mai una plana web resta cinc punts de cop.
- Coneixements de CSS. Si ha maquetat pàgines amb CSS i sap perquè ho ha fet suma 2 punts. Si no sap perquè ho ha fet sols en suma un. Si no sap què és resta un punt. Tenir coneixements de CSS ajuda a saber el que es podrà fer en la pàgina.
- Coneixements de Javascript. Si els sap fer servir mitjanament suma un punt, si a més coneix alguna llibreries de les típiques suma un altre punt. Si sols coneix el que posa el Dreamweaver lleva un punt. Tot es pot aprendre, però si un ja té experiència en Javascript vol dir que realment ha programat per la web. Si a més abans ha dit que utilitzava un editor "per programadors" començarà a agradar-me força.
- Si sap què és l'arbre DOM suma un punt. Si no ho sap i ha dit que ha manejat força Javascript ens haurem de plantejar sèriament si ha està decorant el currículum.
- Si sap què són els estàndards W3C suma un punt.
- Si sap que és un sistema de control de versions suma un punt, si a més l'ha fet servir suma un punt més.
- Utilitzar Linux suma dos punts. Per una part vol dir que encaixarà millor en el grup, però objectivament vol dir que serà capaç de modificar una plana que no està al servidor local, estarà acostumant a que els noms dels arxius són diferents en majúscules i en minúscules, sabrà què és l'UTF-8, etc. I sobretot demostra ganes de fer coses i de no conformar-se amb el que fa la gran majoria.
- Utilitzar Firefox com a eina de desenvolupament. Suma un punt. En suma un altre si coneix dos plugins indispensables per al desenvolupament web.
- Conèixer un llenguatge de programació d'script suma un punt. Si aquest es Python o Perl en suma un altra. PHP o Ruby no puntuen més. Un perquè a un que fa programació web se li suposa un mínim coneixement de PHP i Ruby perquè no es pot distingir de si es fa per moda o per convenciment.
- Conèixer el patró MVC i saber-ho explicar suma un punt. El patró MVC s'ha convertit en omnipresent per la web i conèixer-lo i fer-ho servir indica que es una formació en programar pensant en la separació entre capes.
- Conèixer SQL suma un punt. No fer-ho en resta un. No puc concebre que algú faci webs dinàmiques i no tengui idea d'SQL.
- Conèixer els bastiments i llibreries utilitzades a l'empresa suma dos punts.
- Ser membre actiu de Bulma o algun LUG suma un punt. Indica que el candidat s'implica en el que fa i contribueix amb les seves aportacions.
Hem de dir que d'entrada el possible candidat ha de conèixer el bàsic que se li demana, és a dir, si l'oferta és per programador Java-J2ee, si ja no es sap cap de les dues coses doncs el més probable és que el seu currículum ja no passi pel filtre de RRHH. Si ho fa llavors ens trobam davant un currículum que pot ser vàlid o estar especialment decorat per l'ocasió.
Un currículum amb una puntuació d'entre 17 i 20 és algú que s'ho paga entrevistar amb més profunditat. Entre 13 i 16 convé fer-hi una ullada però no hi ha massa possibilitats així d'entrada, i si és menys que aquest valor doncs potser és millor no perdre-hi més temps.
Tant les opcions com les valoracions són elegides ad-hoc sabent d'entrada el tipus de gent que m'agrada i que potser encaixarà bé en el grup, empreses i grups distints poden tenir valoracions distintes. Segurament una persona amb una puntuació de 20 no encaixarà en un ambient poc dinàmic i que no tengui capacitat d'innovació.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Gestió de projectes Informàtica Java
Canvi de hostingaire
Escrit per Aaloy a 07 de August , 2007 a les 8:01 p.m.
Bona part d'aquest diumenge passat Trespams i el seu correu associat no ha estat accessible i la cosa ha estat tan greu que ha requerit un canvi de hostingaire. Anteriorment aquest blog estava hostejat a un VPS de Bitfolk. La configuració de l'VPS era la mínima permesa i la relació qualitat preu no era dolenta. Un poc lent per a dur el Wordpress i el correu i caigudes de unes poques hores de tant en tant, però sense tenir que plantejar-se canviar a un altre servei.
Diumenge però ens trobàrem que no es podia accedir al servidor. Al principi vàrem sospitar que era una caiguda com les altres i vaig reportar l'incidència. Però no, resulta que hi havia hagut un malentés en el pagament i ens havia tallat el servei.
La reacció típica és un poc entre comprensió i indignació. Comprensió perquè si un no paga no pot esperar servei, però a la vegada indignació perquè si fins aleshores els pagaments han arribat sense problemes i el lloc està actiu doncs cabria pensar que el hostingaire demanaria abans de fer una cosa així.
Res, que pagàrem la quota (del 6 juliol al 6 d'agost) i vàrem sol·licitar que es restablís el servei, amb la queixa de que "home això s'avisa!" en pitinglish. Idò no, ara per restablir el servei el senyor de Bitfolk diu que vol ara 3 mesos per avançat. Això en la meva terra se li diu xantatge asquerós. Li diem que perfecte, que com que ja hem pagat que ens restablesqui el servei i després ja discutirem el tema dels tres mesos, però que mentres el servidor ha de tornar a ser "viu".
En el e-mail final el tipus ens diu que no està d'acord en que les coses es tenguin que fer així i que no ens vol com a clients i que no ens restaura el servei ni tan sols els dies que ens queden i que hem pagat (tard, això sí, però pagat).
El més divertit de tot és que ens diu que per 8 lliures si ens pensam que paga a un enginyer el diumenge. Cony, vol dir que per aturar el servei no era també ell un "skilled engineer" fent feina el diumenge? I que es pensa que feim nosaltres? El seu temps és més valuós que el nostre?
Després d'enrecordar-nos del bona part de la seva parentela, es va procedir a passar tot el que teníem a Bitfolk cap a un nou servidor VPS, a BudgetDedicated per més senyes. Una feinada, fonamentalment de Bernat, però que gràcies a les còpies de seguretat i a la rapidesa del servei de Bugdget va fer que el canvi fos molt més suau del que potser es pensava el de Bitfolk.
Bon vent i barca nova Bifolk! Per cert, el servidor és sols una mica més car, però va més del doble de ràpid.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Texts matemàtics per la web amb jsMath
Escrit per Aaloy a 19 de July , 2007 a les 1:05 a.m.
Un dels problemes que té el manteniment de una plana web dedicada a la física, matemàtiques o altres ciències, és com escriure i mantenir les fórmules i que quedi bé la cosa.
Per escriure fórmules res com el TEX o el LaTeX, que encara que hi hagi gent que digui que fent clic amb el ratolí va millor, quan un ha d'escriure moltes fórmules, numerar-les i mantenir-les no hi ha res com el poder teclejar. La gent d'OpenOffice manté un editor de fórmules per línia de comandes i curiosament els seus detractors diuen que és una mancança. Jo ho veig com un avantatge i una utilitat per gent que realment pica moltes fórmules o fórmules complexes dins el document.
Quan parlam de texts amb un fort component matemàtic i de fórmules a les planes web la cosa encara es complica més. Tradicionalment per representar fórmules complicades s'optava per scripts de conversió de TEX cap a imatges, amb una qualitat que la majoria de vegades era molt pobre i amb una integració amb la plana no massa encertada.
Hi ha però una alternativa molt bona, el jsMath que utiltizant javascript ens permet mostrar dins les nostres planes HTML fórmules amb qualitat professional.
He estat mirant els exemples i jugant amb l'editor interactiu de jsMath:
És una imatge i la qualitat no és ni la meitat de bona que la que s'aconsegueix amb el javascript, com podreu comprovar si anau al la plana de jsMath i en visualitzau els exemples.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Creant un tag per Django
Escrit per Aaloy a 14 de July , 2007 a les 9:33 p.m.
Una de les coses que fa Django potent com a bastiment és la seva extensibilitat, és força senzill extendre el llenguatge de plantilles amb nous filtres i nous tags.
Avui tenia la necessitat de generar un nombre aleatori, semblant a l'exemple d'Ajax d'un post anterior, pero aquesta vegada volia que no fos necessari cridar a cap vista.
Això seria molt senzill de fer passant el valor com a paràmetre, però pot servir com un exemple més de com crear els nostres propis tags.
Crear un tag en Django requereix de dues passes: crear la funció de compilació i crear la classe que renderitzarà el trag mostrant el text que volem.
Una vegada fet això basta registrar el tag i per això el mateix Django ja ens facilita un decorador.
La randomCode és la que agafa el tag i els paràmetres del tag i en far el parseig. En aquest punt hem de caçar els errors de sintaxi del tag i informar a l'usuari de com es fa server.
La classe randomCodeNode agafa el valor que li passa la funció anterior i fa les operacions necessàries per a tonar-nos una cadena de text presentable en una plana web.
L'esquelet ens pot servir com a base de tags molt més complexos, per exemple tags que incloguin automàticament llibreries javascript , o que facin més senzilla la seva utilització, ...
Per fer servir aquest tag n'haurem de carregar l'arxiu dins la nostra plantilla, com en el cas del filtres això se fa amb un {% load arx %} on arx és el nom de l'arxiu que conté el tag que acabam de crear.
from django import template import string import random CODE_CHARS = string.ascii_uppercase+string.digitsregister = template.Library()@register.tag(name="randomCode")
def randomCode(parser, token): try: # split_contents() knows not to split quoted strings. tag_name, num = token.split_contents() except ValueError: raise template.TemplateSyntaxError, "%r tag requires an integer as a single argument" % token.contents.split()[0] if not (num[0] == num[-1] and num[0] in ('"', "'")): raise template.TemplateSyntaxError, "%r tag's argument should be in quotes and be a positive integer" % tag_name try: value = int(num[1:-1]) if value <0: raise template.TemplateSyntaxError, "%r tag's argument must be a positive integer" except: raise template.TemplateSyntaxError, "%r tag's argument must be a positive integer" % tag_name return randomCodeNode(value)
class randomCodeNode(template.Node): def init(self, num): self.num = num def render(self, context): try: codi = random.sample(CODE_CHARS,self.num) except ValueError, e: raise template.TemplateSyntaxError, "tag's argument must be a lower than %i" % len(CODE_CHARS) s = '' return s.join(codi)
El Wordpress no és gaire bo amb el codi, podeu trobar-ho millor colorejat a Djangosnippets
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python Django
Programar per menjar
Escrit per Aaloy a 12 de July , 2007 a les 10:22 p.m.
N'Enrique Dans es demana a un article ¿Alguien ha visto un programador? i en Ricardo Gali li diu que yo he vistos unos pocos. Particularment he de dir que jo sí que n'he vists de programadors i de bons, però com tot el que és excepcional un bé escàs i en el cas dels programadors he d'afegir que és un bé poc valorat.
A l'article d'Enrique Dans ens diu que el desenvolupament tecnològic d'Espanya s'està alentint perquè no hi ha bons programadors de PHP, Java, Python, Perl o RoR per a dur a terme els projectes d'Internet. Ho sento, no hi puc estar d'acord, els projectes d'Internet a més de pels programes i els programadors tenen un factor limitador que és el cost del hosting i de l'ampla de banda. Si comparam el que costa hostejar un projecte ambiciós a Espanya i ho comparam amb el que costa fer-ho a altres indrets veurem que el programador Espanyol ja no es planteja desenvolupar perquè tanmateix ja sap que les seves possibilitats de créixer són molt limitades, ja que ben aviat els costs pujaran per damunt dels guanys.
L'ampla de banda de les connexions domèstiques tampoc ajuda, la velocitat de pujada de les connexions ADSL fa rialles i el cost de més velocitat és prohibitiu. Sempre ens queda la solució de fer el hosting a països més barats, però això ja està penalitzant la velocitat d'accés si el negoci ho vols fer per començar al mercat Espanyol i perds el control que te donaria tenir els programes al teu propi datacenter, encara que aquest pugui ser tan petit com un servidor o dos col·locat al destpatx de casa. En aquest moments i amb les connexions actuals l'inversió necessària per tenir un grapat de servidors dedicats amb prou ampla de banda a Espanya, fa que els costs fixes siguin tan alts que cal pensar-s'ho molt a l'hora de montar un negoci tecnològic a l'estil del que ens tenen acostumats emprenedors americans.
Així doncs, l'endarreriment en noves tecnologies no és tant per l'absència de bons programadors, sinó que tot el teixit tecnològic que hi ha a la nostra societat o l'absència del mateix, fa que encara que aquests hi siguin, no es donin les condicions per a que prosperin. Empreses poc donades a la innovació, departaments d'I+D+I inexistents, costs de les comunicacions prohibitius, empreses que donen més importància a les aparences, a l'estar que al fer i una gran mancança de cultura informàtica en el que fa al desenvolupament de programari i a la gestió d'equips tècnics són tant o més responsables de l'endarreriment que patim.
Per una altra banda quan parlam de noves tecnologies al perfil del bon programador, del tècnic se li ha d'afegir la de la capacitat de treball en equip. Avui en dia i en projectes d'Internet és impensable dur a terme alguna cosa mitjanament grossa sense la col·laboració de programadors, dissenyadors i tècnics de sistemes. Trobar perfils compatibles ajuda moltíssim (de 3 a 10 vegades) al projecte i augmenta les possibilitat d'èxit, i això xoca amb processos de selecció basats en la força bruta, és a dir, en un "pongame aquí 20 tios que ...", el nombre no és tan important com la capacitat d'autocoordinació, la iniciativa i la capacitat tant individual com del conjunt.
Potser falten bons programadors, però també falten i molt empreses que vulguin bons programadors, fins i tot empreses que vulguin un equip de bons programadors i que entenguin el perquè una vegada un equip s'ha format i funciona s'ha d'intentar mantenir i evolucionar.
La tecnologia i el programari s'ha convertit en una part fonamental de les empreses, però la figura del programador enlloc d'estar cuidada està denostada. Els cursos per fascicles de "programar es fácil" no han ajudat gens a la valoració de la professió. La capacitat de fer mals programes és infinita, la capacitat de fer-los bé està sols a l'abast de la gent amb passió per la seva professió, una passió que el motiva i que el duu cada dia a superar-se, a fer millor les coses, a aprendre.
Sovint però el que trobam és el programador que programa per menjar. És l'antítesi del tipus de gent que fa que les tecnologies de la informació passin de les idees als fets. Programar per menjar implica dedicar-se a programar sols perquè és una feina on no et banyes quan plou, on un fa el que toca i fins a on li han dit i res més, sense plantejar-se si se podria fer millor, sense cercar avançar sinó tot el contrari, procurant que la feina que fa duri molt per tal de no haver d'aprendre coses noves.
Els programadors dels que parlen Enrique i Ricardo no programen per menjar, programen per viure. L'aspecte econòmic és important per viure però encara que tinguéssin que dedicar-se a altres feines per subsistir programarien.
Un bon programador ha de ser també inconformista, crític i perquè no un tant freaky. Crec que tot va lligat, l'inconformisme ens duu a cercar altres maneres de fer les coses, a pensar alternatives. El pensament crític ens ajuda a millorar i el freakisme ens fa part d'un club selecte, forma lligams i fa equip.
Bons programadors? En conec un grapat, però on són les empreses que tenen les condicions per a que aquests desenvolupin tot el seu potencial?
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Gestió de projectes
10 milions!
Escrit per Aaloy a 10 de July , 2007 a les 8:44 p.m.
Bé, no són exactament 10, però si 9.800.000 llargs de registres que hi tenim a una taula d'una base de dades Postgresql que en el seu conjunt pot tenir fàcilment quatre o cinc vegades aquesta quantitat de registres. I el motor de BD ho mou tot sense despentinar-se, sense requerir complicats tunnings de bases de dades i amb uns temps de resposta a les consultes que es mesuren en milisegons.
No vull ni imaginar el maquinari, el cost en llicències i en administració que requeriria moure això fent servir bases de dades privatives.
La millor manera de desfer FUD és veure que a ca un altre funciona.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Introduction to Abject-Oriented programming
Escrit per Aaloy a 09 de July , 2007 a les 12:21 a.m.
Seguint la línia d'assajos com "How to write unmaintainable code" o el refuctoring, ens arriba un assaig que revolucionarà la vostra manera d'entendre la programació: l'abject-oriented programming.
En el seu assaig Greg Jorgensen introdueix novetosos conceptes que sovint ens hem trobat en el codi, com les fragile base class, aquella classe o mòdul, que fa molt de temps que està a l'aplicació i que qualsevol canvi que s'hi faci romprà tota l'aplicació.
Interessantíssima també la seva recomanació pel control de versions, encara que he de dir que hi ha molt "previous art", l'he vista aplicada nombroses vegades en tota mena de documents word i fulles de càlcul.
En definitiva, un entreteniment estiuenc per passar l'estona.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Conyes marineres
svn:ignore
Escrit per Aaloy a 01 de July , 2007 a les 1:08 p.m.
A casa faig servir el Kdevelop, vi o Kate per programar amb Python. L'Eclipse per PPC em dona massa problemes i va massa lent com per a ser una eina pràctica, així que m'he avesat a fer moltes coses que faig amb l'Eclipse de manera menys integrada, és a dir, a maneta i amb línia de comandes.
Una d'aquestes coses és el subversion. Encara que hi ha força clients gràfics per subversions cap s'atraca als que proporcionen els plugins d'Eclipse, així que m'he acostumat a fer les operacions habituals en línia de comandes aprofitant la shell que tenen tant Kate, com Kdevelop. Les comandes més habituals que faig servir són:
- svn ci Em permet pujar els canvis
- svn update Baixar-me els canvis que han fet els companys
- svn add <arxiu> Afegeix un arxiu al control de versions
- svn status em permet veure es canvis pendents
La cosa està en que el subversion no suposa res respecte als arxius amb els qui fas feina. Per defecte no posa l'arxiu sota control de versions a no ser que tu li diguis. Així la combinacióde svn status i svn add és força habitual quan es tracta de pujar els canvis que hem fet. Amb svn status podem veure el que s'ha modificat i al llistat que ens proporciona marca amb interrogants aquells arxius que encara no s'han afegit al control de versions, per exemple:
? apslweb/www/__init__.pyc ? apslweb/www/logger.pyc ? apslweb/www/models.pyc M apslweb/db
Com que els arxius de compilació no ens interessa posar-los a subversions resulta que la comanda svn status ens està mostrant molt de renou, per a evitar-ho subversion ens permet ignorar els arxius que nosaltres li diguem d'un directori, en el nostre cas, desde apslweb si feim
svn propedit svn:ignore www
Ens apareixerà un editor (el vim en el meu cas) que ens permetrà afegir-hi els arxius que volem que no apareguin al llistat de l'status, afegint *.pyc ja ho tenim.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
No pensis!
Escrit per Aaloy a 24 de June , 2007 a les 11:26 a.m.
Alguns professionals de les TI no deixen de sorprende'm, són capaços de contradir-se una frase després de l'anterior, intentant justificar l'injustificable.
L'altra dia algú es queixava del complexe i costós que resulta fer les actualitzacions dels productes d'Oracle, que si has de fer venir una múnia de consultors, que si les dependències entre productes són tan complexes que quan actualitzes un producte has d'anar molt alerta amb com afecta a la resta de productes de la companyia, etc.
Aquí a mi no me queda més remei que fer paleses les contradiccions: si és tan complexe de gestionar, si te ferma tant al proveïdor, com és que hi ha gent que encara s'entesta en fer nous desenvolupaments en una tecnologia que te ferma de manera que les simples actualitzacions de versions són un maldecap i amb un costs que són difícils de predir.
L'excusa de que el denvolupament amb Forms i PLs és més ràpid s'enfonsen ràpidament davant mètriques que ens diuen que el nombre de línies per punt funció són comparables en Forms o en Html (42 i 43 línees de codi per punt funció respectivament) i per la part presentació, de 46 de PL/SQL als 35 de llenguatges de l'estil d'Smalltalk (Python per exemple). [1] i això sense considerar aspectes que afecten a la productivitat com la facilitat de depurar el codi, de fer feina en grup, o de fer tests d'unitat.
Davant això, pareix que la raó fonamental de triar productes d'una companyia concreta com els d'Oracle, no són de menor cost o major facilitat de desenvolupament, sinó que pareix que són que així el responsable del projecte no té que pensar. No hi ha possibilitat d'equivocar-se a l'hora de triar l'arquitectura o els components perquè no hi ha arquitectura o components per elegir. Sols tenim el que els senyors d'Oracle han decidit que podem tenir, independentment de les necessitats reals que podem tenir. Això se diu com a FUD davant les eines i bastiments de programari lliure, on abans de començar el projecte s'ha de definir l'arquitectura que es farà servir i triar els components més adients per la feina.
A mi que algú em digui que elegeix una eina o una altra perquè així no té que pensar em dóna angúnia. La responsabilitat del cap de projecte en primer terme i del responsable de IT en darrer terme és assegurar-se que té el millor equip i la millor tecnologia a l'abast del negoci, de manera que es puguin respondre a les necessitats del negoci amb rapidesa. S'ha d'estar pendent tant de l'evolució del negoci com de les tecnologies informàtiques que poden fer que la resposta del departament d'IT pugui seguir l'empresa.
Que hi pugui haver gent a una empresa que en senti còmoda amb una solució que a mig o llarg plaç sabem que donarà problemes, que té molts costs ocults d'actualització i administració, que se senti còmoda amb el no pienses, nosotros pensamos por ti explica perquè empreses més petites, però amb gent que no té por a pensar cada cop més s'estan enduent més negoci o posant en marxa negocis innovadors. En el moment que els negocis comencin a adonar-se que necessiten innovació per avançar, quan comencis a mirar el perquè negocis més petits tenen més clients i fan més caixa amb un costs menors i se n'adonin de que el no pensar no és una alternativa podem viure un vertader d'altabaix a alguns departaments informàtics.
Comencem a pensar, comencem a voler pensar, demà pot ser massa tard.
[1] Font: http://www.qsm.com/FPGearing.html
Traducciones/Translations by apertium
5 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Anar a la feina
Escrit per Aaloy a 15 de June , 2007 a les 10:04 p.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: General
Suro project management
Escrit per Aaloy a 01 de June , 2007 a les 10:33 p.m.
- Si la prioritat d'un ticket és molt alta el nombre de forats pot impedir la seva legibilitat. Una vegada més reiteram la importància de fer servir xinxetes certificades.
- El suroserver s'ha d'instal·lar a un lloc sense vent. S'ha demostrat que les condicions de vent o pluja intensa afecten negativament al suroserver fent desapareixer aleatòriament els tickets o fent-ne malbé els continguts.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Conyes marineres
Experiments amb Flickr
Escrit per Aaloy a 01 de June , 2007 a les 9:34 p.m.
$ from flickr import *
$ fotos = photos_search(user_id='8564577@N07')
$ for foto in fotos:
... foto.getURL(urlType='source')
...
u'http://farm1.static.flickr.com/238/523531137_7c873aaa03.jpg'
u'http://farm1.static.flickr.com/232/523531135_7b87f0b889.jpg'
u'http://farm1.static.flickr.com/219/523531129_112401e1b9.jpg'
u'http://farm1.static.flickr.com/248/523531125_25c972c4c9.jpg'
u'http://farm1.static.flickr.com/241/523531123_a7a97bf6e9.jpg'
u'http://farm1.static.flickr.com/249/520338908_b58c519f0d.jpg'
$
on user_id és el vostre (en aquest cas meu) codi d'usuari.
L'API té possibilitat de pujar fotografies, posar-hi comentaris, titol, descripció, etc. I recuperar-ho és també força fàcil, en el nostre exemple:
$ calla = fotos[5]
$ print calla.title
calla
$ print calla.description
fent callar
Serà divertit!Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
PL/SQL vs Java
Escrit per Aaloy a 26 de May , 2007 a les 8:01 p.m.
- PL/SQL és més ràpid perquè està més proper a la BD. Fals. No ens ho hem de creure, el que hem de fer és mesurar-ho. Segons Lott una de les causes de Java pugui ser més ràpid que el PL és que la màquina virtual Java pot fer optimitzacions al vol (JIT) cosa que PL no pot fer.
- PL/SQL vs JDBC.El PL/SQL és molt bo quan sols hem de fer transaccions bàsiques CRUD, però quan l'algoritme té altra tipus de lògica l'avantatge s'esvaeix.
- Escalabilitat. Java és molt més escalable a un cost menor. Amb GNU/Linux traient partit dels processadors moderns multi-nucli afegir més nivells de concurrència a les nostres aplicacions és relativament barat.
- No tenc recursos Java o presupost per comprar més màquines, però ja he pagat per la BD i tenc gent que sap PL/SQL. Si la direcció d'IT diu que (1) el rendiment és important i (2) no es volen fer mesures de rendiment (benchmarchs) llavors tenim un problema important d'esquizofrènia. Si al responsable d'IT no li importa el rendiment, llavors per què fer proves de rendiment per començar? Si el rendiment no importa PL/SQL està bé. És lleig i mal de mantenir, però és una decisió del responsable d'IT. Bàsicament ve a dir, que si el responsable de programació selecciona un llenguatge no basant-se en el rendiment i la mantenibilitat sinó en altres consideracions, llavors està fotut, no hi ha res a fer: PL/SQL.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
De palles i hombres
Escrit per Aaloy a 26 de May , 2007 a les 9:07 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Canvi de servidor
Escrit per Aaloy a 25 de May , 2007 a les 2 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Escalabilitat
Escrit per Aaloy a 19 de May , 2007 a les 4:22 p.m.
Escalabilidad: En telecomunicaciones y en ingeniería informática, la escalabilidad es la propiedad deseable de un sistema, una red o un proceso, que indica su habilidad para, o bien manejar el crecimiento continuo de trabajo de manera fluida, o bien para estar preparado para hacerse más grande sin perder calidad en los servicios ofrecidos.Quan hom posa en marxa un negoci o una aplicació on-line l'escalabilitat és un dels principals factors a tenir en compte. El creixement pot ser molt ràpid si tenim èxit, i el poder créixer al mateix ritme que ho fan els nostres clients o visitants és fonamental. L'escalabilitat, però es sol entendre com que afegint més màquines i més ampla de banda ja està tot arreglat. No és així, a més de l'escalabilitat del ferro, hem de parlar de l'escalabilitat econòmica, determinar abans de triar una solució si a més de ser escalable en hardware és escalable econòmicament. L'escalabilitat econòmica ve determinada per les restriccions que tengui l'aplicatiu. Algunes empreses ens venen aplicacions amb un nivell d'entrada molt baix, però amb versions ultra-mega-enterprise a les que hem de passar una vegada necessitem un nombre major de processadors, d'usuaris, de volum de dades, etc. En altres casos la limitació ve donada per afegitons al producte, indispensables per una organització en creixement, i que per a funcionar necessiten de la versió enterprise del producte. Si aquesta pràctica ja era greu quan parlàvem d'aplicacions de gestió clàssiques, on més o manco es pot controlar el creixement, és un punt crític a considerar en aplicacions orientades a Internet. D'un dia a l'altra ens podem trobar presoners del nostre proveïdor: bé perquè els servidors nous ja duen més cores i la llicència va per processador, bé perquè el nombre d'usuaris ha anat augmentant considerablemente, però amb un volum de vendes que no compensa passar a la versió enterprise de cap de les maneres. Així doncs, quan consideran l'escalabilitat econòmica, la projecció de la despesa futura, a més de tan sols la possibilitat d'escalar posant més màquines, veurem que el programari privatiu poques vegades és realment escalable. Tenir autèntica escalabilitat significa sols haver-se de preocupar de posar més màquines i algú que les administri i no haver-se d'hipotecar el futur, el programari lliure hi té molt amb dir a això: podem triar distribucions GNU/Linux per exemple que ens permetran ser realment escalables, ja que el cost sols vindrà determinat pel que val el servei i el ferro. Suposem però que estam fent una aplicació per la nostra empresa, o que ens dedicam a la programació d'aplicacions. En aquest cas hem de mirar també l'escalabilitat del desenvolupament. És a dir, la possibilitat de que el rendiment cresqui de manera gairebé lineal amb el creixemnt de l'equip de programació. En aquest cas són les eines de desenvolupament les que ens han de permetre ser escalables i fer que sigui possible que el treball es pugui distribuir fàcilment entre els components de l'equip. L'arquitectura en capes: sistemes, capa de presentació, negoci, persistència, base de dades ens permet distribuir la feina en equips especialitzats sempre que les eines de desenvolupament ens ho permetin, tant des de el punt de vista econòmic com des del punt de vista funcional. Per exemple, de la capa de presentació normalment se n'encarregarà un equip de disseny, això vol dir que el llenguatge de plantilles que tengui la nostra aplicació de desenvolupament ha de permetre als dissenyadors fer la seva feina sense preocupar-se massa del llenguatge de programació, o millor i tot, sense haver de programar. Per la resta de capes hem de tenir mecanismes de control de versions que ens permetin gestionar fàcilment els conflictes, però sobretot, hem de permetre que aquests conflictes puguin existir. Si algú pot bloquejar l'edició d'un arxiu per fer un canvi mínim, és temps que es perd quan potser hi ha tota la reste de l'equip aturat per aquest canvi. Una altra vegada més, la capacitat de tenir un entorn de desenvolupament escalable ens ve donada per defecte en moltes eines de programació i bastiments que trobam al programari lliure, precisament perquè les eines han estat concebudes per encabir-hi un gran volum de gent fent feina a l'hora i evitar que una sola persona pugui bloquejar la feina dels altres. Així doncs, la propera vegada que algú ens parli de l'escalabilitat de la seva aplicació, podem demanar-li en quin sentit és escalable, quan ens diguin que l'eina de programació permet treball en grup investiguem si compleix els requisits bàsics del desenvolupament escalable. Les solucions privatives gairebé mai són realment escalables, part del seu negoci es basa precisament en que no ho siguin.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Jo també hi era
Escrit per Aaloy a 16 de May , 2007 a les 5:17 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
RWAD
Escrit per Aaloy a 14 de May , 2007 a les 12:33 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
IBM SDK for Java Version 6 Early Release Program
Escrit per Aaloy a 11 de May , 2007 a les 4:51 a.m.
Doncs això, que m'he baixat la darrera versió del JDK de ca'n IBM. Encara pareix que és una Beta, però amb un poc de sort esper que arregli alguns problemes que hi ha amb PPC, sobretot en el que fa referència a la velocitat d'execució.
He vist que hi havia la versió PPC 64 bits, però com les altres vegades hi ha que conformar-se amb la versió de 32.
Quan surt una nova versió de la màquina virtual sempre tenc la tendència a provar-la a casa amb el PPC, l'Eclipse és un entorn de desenvolupament pesat com ell sol, però es fantàstic com a IDE i la integració amb Python amb el PyDev és molt bona. El problema que m'he trobat fins ara és que l'Eclipse damunt el PPC falla, i falla mot, es tanca, i això fa que es perdi feina feta que no compensa les facilitats de l'IDE.
Per coses particular he optat per programar amb Django, un bastiment de programació web de gran qualitat, que té com una de les seves grans virtuts que la informació que dóna damunt els errors és molt exhaustiva. Això fa que si l'IDE peta, els avantatges de tenir depurador i control de versions integrat es perden davant la fiabilitat d'un Kdevelop i la línea de comandes del subversion.
El Kdevelop en teoria integra un plugin de subversion, però és mooolt dolent i té poca funcionalitat. El gran avantatge del plugin per Eclipse que faig servir, el subversive, és que és molt complet, està molt integrat a l'IDE i a l'hora de resoldre conflictes entre versions pot cridar automàticament al comparador gràfic de fitxers.
Li donaré una altra oportunitat a l'Eclipse, l'he estat fent servir durant més de 15 minuts seguits i encara no s'ha tancat inesperadament, tot un èxit!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
Traducció de conceptes empresarials a tècnics
Escrit per Aaloy a 06 de May , 2007 a les 5:04 p.m.
Un dels problemes que tenim els tècnics és que no estam acostumats a negociar, a parlar en públic ni a guanyar-nos la vida endolçant conceptes i fent metàfores empresarials. Per això sovint ens trobam amb que hem acceptat plaços d'entrega impossibles, treball extra per un programa que no estava pressupostat, etc. Davant gent que està acostumada a negociar per guanyar-se la vida, sempre partim en desavantatge i cal saber-ho. Si un sap o estan les seves debilitats i les fortaleses de l'altra pot orientar millor la seva estratègia de negociació per tal de no veure's sorprès pel poder de convicció de l'altra part.
Arrel d'una presentació d'estratègia que ens varen fer fa poc, vaig tenir la idea d'anar recollint algunes frases que allà s'havien dit i d'altres que he anat escoltant al llarg de la meva carrera professional i intentar explicar-ne el sentit:
- Falta profesionalidad. La culpa del que passa no és de la direcció sinó dels altres. Aquesta expressió sempre exclou al qui la diu i és el que més és pareix a dir, en un llenguatge políticament correcte, que tothom és un inútil llevat del qui diu la frase, que està per damunt del bé i del mal.
- Espero que seais profesionales. S'espera que es treballi més hores, amb menys recursos i sense cap tipus de compensació. Fixem-nos que el concepte és diferent quan ho diu un futbolista quan se'n va a un altre club, que diu que és un profesional, va allà on paguen més i que farà la feina el millor que pot i sap.
- Habrá que hacer un sobreesfuerzo. Vol dir que l'empresa vol que faceu més hores extres però que no les pensa pagar. Si les volgués pagar o compensar aquesta frase s'acaba amb un "que será debidamente compensado". En aquest cas la contesta ha d'anar en termes de "jo sóc un professional i no puc fer feina gratis". O en termes semblants que indiquin que un sols fa feina gratis per ONGs i organitzacions semblants que ho necessiten.
- La fusión implica aprovechar las sinergias entre las dos empresas. Implica que sobrarà gent a curt i mig plaç, però no es pot dir en clar no sigui cosa de que la gent s'ho vegi venir. Hi ha que estar amb l'orella posada i interpretar les accions dels propers dies a partir del significat real de la frase.
- Hay que salir bien en la foto. Traducció: el més important no és l'empresa sinó salvar el meu propi cul, així que faré tots els esforços possibles per fer punts davant els qui comanden.
- Esto es crítico para el negocio. Si és crític avui vol dir que no se va fer una bona planificació ahir. S'intenta arreglar la cagada posant pressió damunt altres bandes per tal que quan algú demani responsabilitats es pugui dir que la culpa és d'un altre.
- Es un término de escuela de negocio. Dit a una presentació es tradueix en un "he cursat un master a una escola de negoci i vosaltres no", però també té altres implicacions, "he cursat un master i vosaltres no, al master jo tampoc vaig entendre què volia dir, així que no ho sé explicar, però en tot cas la frase queda molt bé a la presentació i per això l'he posada".
- Los del departamento X son todos unos inútiles. Dit per algú que té responsabilitat damunt el departament X i del departament del qui escolta, implica un intent fer fer-se "el coleguilla" i mantenir a la gent dividida, de manera que uns no parlin amb els altres, no sia cosa que posant les notes en comú és descobresqui qui és el vertader inútil. Convé informar-se per altres vies del funcionament de l'altra departament. La primera aproximació s'ha de fer a través d'un tercer, ja que el més normal que aquesta mateixa persona hagi fet la mateixa afirmació damunt nosaltres al departament X.
- Nos hemos comprometido a tener X en Y días. He venut la moto a algú, dient que tenim llesta una cosa que no tenim i ara he de salvar la cara, però ara ja és cosa que ho faci un altre. Sol anar junt amb la frase de "es crítico para el negocio" i no anar acompanyat d'un pla de negoci ni de xifres que indiquin que el que s'està demanant sigui factible o econòmicament rendible. Sol ser una conseqüència de l'estratègia de "salir en la foto". En aquest cas la contesta ha de ser per escrit i amb la planificació de quan pot ser possible. La resposta de que "ens hi posam ara mateix" s'ha d'evitar. Millor un "deixa-m'ho pensar i te diré per quan ho podem tenir" seguit d'un petit estudi del que es demana.
- Dejadlo todo y ... També conseqüència de l'estratègia de sortir a la foto. Se tradueix en que la feina que se demanarà a continuació s'ha de fer de manera immediata prioritzant-la damunt la resta, i que després se demanaran responsabilitats per no haver fet l'altra feina. Hi ha que anar especialment alerta si qui ho diu no ho vol posar per escrit, ja que les possibilitats de que aquesta frase amagui un "brown traspassing" augmenten exponencialment amb el nombre de negatives a posar la petició per escrit.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
El preu d’un “bocata”
Escrit per Aaloy a 01 de May , 2007 a les 1:51 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Lectures d’aeroport: de mides i estimació de projectes
Escrit per Aaloy a 28 de April , 2007 a les 7:26 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Pagament on-line amb Sermepa
Escrit per Aaloy a 19 de April , 2007 a les 11:39 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Apliacions de gestió en html
Escrit per Aaloy a 15 de April , 2007 a les 5:38 p.m.
- A una aplicació web podem mesclar fàcilment els conceptes d'escriptori i el millor que ens dona la navegabilitat de la web. Fer enllaços, drill-down, mostrar informació contextual és inherent a les aplicacions web i en canvi duen força treball en les aplicacions d'escriptori.
- La tecnologia de Forms és tancada i antiga, avançarà quan Oracle vulgui. La tecnologia web és fonamentalment oberta i ets tu quan tries que vols canviar. I el millor de tot, a la capa de presentació no hi ha més que html i javascript, per la qual cosa pots anar adaptant-te a la tecnologia segons te vagi millor sense afectar a l'usuari.
- El control de versions. Per mi és fonamental poder tenir gent que pugui fer feina si cal en el mateix troç de codi, en el mateix paquet i dur un control estricte del que s'ha canviat i de qui ho ha canviat. Això és molt mal de fer quan hom programa en Forms i PL.
- El factor humà. No dubt de la qualitat d'algú que avui en dia tengui com a màxima aspiració fer feina en Forms, però potser no és el tipus de gent que està oberta a canvis, que és capaç de trobar solucions imaginatives. En un entorn canviant les empreses han d'anar construint els seus equips de desenvolupament a partir de gent de pugui adaptar-se als canvis. Demà el negoci requerirà coses noves i haurem de ser capaços d'adaptar-nos. El factor humà és el que determina que l'èxit d'un projecte. La motivació i la qualificació dels programadors són un factor de primer ordre, el llenguatge de programació triat és un factor de segon ordre, i tots ens coneixem, és molt més motivant estar fent feina en tecnologies que tal com va el mercat informàtic poden queder sols per manteniments correctius i evolutius.
- El manteniment. Afegir nova funcionalitat a una aplicació web sol ser cosa de programar-ho o trobar les llibreries necessàries, o potser pensar "la manera web" de fer les coses. Fins i tot si desenvolupam en llenguatges d'script (php, ruby, django) una actualització que no afecti a base de dades pot ser tan simple com fer un update de subversion.
[1] Permeteu-me que classifiqui a Forms com a aplicació d'escriptori clàssica encara que s'executi mitjançant un navegador per diferenciar-la de les aplicacions que sols necessiten el navegador, sense jinitiator ni més històries. [2] En aquest cas el jinitiator pot ser un mal son. [3] El Firefox home!
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Tractament de cadenes en Python
Escrit per Aaloy a 15 de April , 2007 a les 11:33 a.m.
>>> a = "hola" >>> b = ' món' >>> print a+b hola mónCom podem veure no import si feim servir cometes dobles o simples, i la concatenació de cadenes és simplement una suma. Tot i això hem de saber que les cadenes són també objectes i un dir ens dirà el que hi podem fer
>>> dir(a) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__','capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition','rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']Per exeple un help(a.zfill) ens dirà què fa aquesta funció
Help on built-in function zfill:zfill(...) S.zfill(width) -> string Pad a numeric string S with zeros on the left, to fill a field of the specified width. The string S is never truncated. (END)És a dir, afegeix zeros a l'esquerra fins a l'emplada que volguem:
>>> a.zfill(10)
'000000hola'
Juguem un poc més amb les cadenes, què us imaginau que passarà si multiplicam una cadena per un sencer?
>> a*2 'holahola'Bastant previsible, no? Python té aquestes coses, que pots preveure què passarà sense tenir-ne massa idea del llenguatge. Suposem ara que volem agafar trossos d'una cadena, python tracta les cadenes com a matrius de caràcters i per tant és possible fer coses com aquestes:
>>> test = "hola món què 'passa' per aquí" >>> print test[0] 'h' >>> print test[0:4] hola >>> print test[:4] hola >>> print test[9:] què 'passa' per aquí >>> print test[9:22] què 'passa' >>> print test[9:-9] què 'passa'Fixem-nos en el darrer exemple, hem fet servir valors negatius per a referir-nos al final de la cadena. També podem fer coeses com un recorregut pels caràcters de la cadena amb
>>> for char in test: ... if char == "'": ... print "cometa" ... cometa cometa
>>> [x for x in test if x > 'h'] ['o', 'l', 'm', 'xc3', 'xb3', 'n', 'q', 'u', 'xc3', 'xa8', 'p', 's', 's', 'p', 'r', 'q', 'u', 'xc3', 'xad']Però de llarg la meva preferida és la possibilitat de crear plantilles, a l'estil del printf de C o de les que darrerament ha incorporat Java 5, que ja era hora!
>>> missatge="hola %s, avui vindré a les %i"
>>> print missatge % ('Maria', 10)
hola Maria, avui vindré a les 10
O fins i tot fer servir diccionaris per això:
>>> missatge="hola %(nom)s, avui vindré a les %(hora)i"
>>> params = {'nom':'Catalina', 'hora':8}
>>> print missatge % params
hola Catalina, avui vindré a les 8
Me deix tota la part de funcions, expressions regulars i altres, això és sols per obrir boca, i potser ajudar a entendre a alguna gent del perquè el Python m'agrada tant.
Us deix algunes referències:
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Refuctoring
Escrit per Aaloy a 09 de April , 2007 a les 8:59 a.m.
- Codi ple de defectes: com assegurar-se els ingressos mitjançant contractes de manteniment.
- Pair Managing: Dos managers per programador.
- Com fer anar l'outsourcing: un programador per continent
- WUP: The Waterfall Unified Procés
- Introducció a la programació dogmàtica. L'index de la presentació és fantàstic i la introducció no es queda enrere: conjunt de tècniques que alguna vegada funcionaren a algú i per tant poden funcionar-te pel teu proper projecte i pels propers projectes. Excuses creatives, o el no pensis, reacciona són part de l'index del taller.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Programari de monitorització
Escrit per Aaloy a 04 de April , 2007 a les 7:51 a.m.
- Opennms. D'aquest en puc donar fe de la seva capacitat de configuració. És capaç de gestionar-ho gairebé tot. Fet amb Java (J2EE) pareix que es prepara una nova versió que en millorarà molt l'arquitectura i la configuració. Hi ha un tutorial de com configurar-ho a howtoforge.
- Cacti. Gràfiques de moltíssima qualitat per tenir un control del què està passant als nostres servidors, xarxa, discs... No té el sistema d'avisos d'Opennms però n'és un complement molt interessant.
- Monit. Pel que he llegit és molt senzill. Hi ha també un tutorial a howtoforge.
- Zabbix. Un seriós competidor pel Opennms, també amb el seus corresponent tutorial.
- Zenoss. Un dels nousvinguts en el negoci de la monitorització, però que està pegant molt fort. Amb una presentació mot cuidada i programació basada en Zope i Python. També amb el seu tutorial d'instal·lació.
- Munin. Escrit en Perl no té la vistositat dels altres entorns, però per monitoritzar el bàsic dels nostres servidors també pot servir.
- Nagios. Tot un clàssic. Tant que l'havia deixat fora de la llista.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Estimació de projectes mitjançant casos d’ús
Escrit per Aaloy a 03 de April , 2007 a les 4:39 p.m.
Fa uns dies que estic de vacances i estic aprofitant per tancar algunes coses que tenia a mig començar. Una d'elles era la publicació d'un article damunt l'estimació de projectes de programari fent servir una tècnica que es basa en els casos d'ús que es fan a l'etapa inicial del projecte.
Aquesta tècnica és molt senzilla de fer anar i resulta sorprenentment acurada una vegada hem ajustat alguns paràmetres que depenen de la nostra organització.
Per fer-la anar basta un escriure els casos d´ús, cosa que tanmateix hem de fer si volem fer una estimació real de qualsevol projecte que es desenvolupi en programació orientada a objectes, i a partir d'aquí aplicar les regles d'estimació dins un petit full de càlcul.
Per projectes petits (de més de 10.000 línies de codi, però) i mitjans les estimacions obtingudes són tan bones com les d'un estimador expert i comparables a les que s'obtenen amb programari tancat i privatiu d'estimació de projectes.
L'article de Bulma és el 2376. Pos els enllaços directes al pdf amb l'article i les plantilles.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Ajax, jQuery i Django
Escrit per Aaloy a 01 de April , 2007 a les 2:15 p.m.
(r'^ajax_get_codi/$','ajax_get_codi'),
escriure el codi que ens tornarà la informació que volem , això es fa dins views.py i pot ser una cosa tan simple com
def ajax_get_codi(request):
"Torna un codi aleatori de vui caràcters alfanumèrics."
import string
import random
llista = string.ascii_uppercase+string.digits
codi = random.sample(llista,8)
s = ''
s.join(codi)
return HttpResponse(codi, "text/html")
Hi ha tantes maneres d'escriure aquest codi com programadors, sols notar que el que estam fent és que en lloc de tornar el control cap a una plantilla de Django retornam directament text amb el codi que volem presentar.
La part javascript:
$(document).ready(function(){
/* codi anterior ... */
{% if not codi %}
/*Si estam en mode insercio permet crear un codi
fent doble click */
$("#id_referencia").dblclick(function () {
$.ajax({
url: "/agencia/ajax_get_codi/",
success: function (msg) {
$("#id_referencia")[0].value = msg;
}
});
});
{% endif %}
});
Aquest javascript està dins una plantilla que hereta, sí heu llegit bé, hereta, d'una plantilla base que conté els includes comuns a tota l'aplicació. Un d'aquests includes és el jQuery. La resta és limita a que quan el formulari esta en mode insercio, la plantilla "pinta" la funció javascript i la lliga al control de text.Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Linux per infants
Escrit per Aaloy a 25 de March , 2007 a les 5:11 p.m.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Fusions
Escrit per Aaloy a 23 de March , 2007 a les 11:39 p.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Aprendre a programar
Escrit per Aaloy a 18 de March , 2007 a les 5:27 p.m.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Estàndards: sí però …
Escrit per Aaloy a 11 de March , 2007 a les 5:46 p.m.
[1] Per exemple, els EJBs no són intrínsecament dolents, sinó que a força d'exemles massa senzills es va transmetre la idea de que aquella era la única manera com toca de fer aplicacions J2EE, fins i tot quan no importava.[2] On pareix que també hi ha Oracle, segons la pròpia gent d'Oracle.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Alfresco: el DMS
Escrit per Aaloy a 09 de March , 2007 a les 2:35 a.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
De fira en fira…
Escrit per Aaloy a 08 de March , 2007 a les 7 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Una de llistats!
Escrit per Aaloy a 04 de March , 2007 a les 9:36 p.m.
- GNU/Linux. Se'm fa molt difícil pensar en programció web i no pensar en el GNU/Linux. No ja per les eines que incorpora cada distribució, sinó per que comporta d'entorn de desenvolupament. Sovint hem de veure logs, canviar configuracions, anar a servidors remots a veure què està passant. Linux ens ho posa fàcil.
- Firebug En els temps de la web 2.0 i el javascript a totes les pàgines Firebug s'ha convertit en una "killer application" que converteix el nostre Firefox en un complet entorn de depuració de pàgines web. Podem depurar javascri
- pt, css, veure l'arbre DOM, canviar els estils... És una eina feta per gent que fa webs.
- Webdeveloper. Ve a complementar el Firebug on aquest queda un poc coix. Eines de validació, per omplir formularis, netejar cookies i un llarg etcètera.
- ssh + vim. Veure logs, edicions ràpides de configuracions o pàgines al servidor. Tot això és fa fàcil quan tenim un servidor Linux i eines remotes per accedir-hi. La gent de Windows segurament dirà que això també ho poden fer ells, és veritat, però no tant fàcil, net i amb un consum tan minso de recursos.
- Kate. Un dels meus editors preferits. Resaltat de sintaxis per pràcticament qualsevol llenguatge de programació conegut. Amb això i el vim tenim pràcticament cobertes les nostres necessitats d'edició.
- Kdevelop. Pels sibarites. Va un poc més enllà de Kate i integra navegació per l'arbre de directoris, ctags, integració amb svn,etc.
- Subversion. Sols des de la més absoluta inconsciència algú es pot plantejar fer programació seriosa i no mantenir un control de versions. Subversion és del milloret que hi ha.
- Trac. Una integració gairebé perfecte de ticketing, documentació i client de subversion.
- Eclipse. Un IDE fantàstic, possiblement tan bo com feixug de fer anar. És un devorador de memòria i recursos de màquina, però si aquest no és el nostre problema junt amb el plugins adequats pot convertir-se en el nostre entorn de desenvolupament per defecte. Especialment recomanants els plugins de Subversive i els del nostre llenguatge preferit
- jquery. Jquery entra dins el segon tipus de llibreries. Permet tractar molt fàcilment amb el Javascript i compta amb nombroses opcions per a afegir vistositat a les nostres aplicacions web: efectes de disseny, Ajax, ... Tot això guarnit amb un bon conjunt de tutorials i plugins.
- YUI. La llibreria de Yahoo entra dins la classificació de mixtes, ja que per una part té tot un conjunt de widgets i extensions per emular una interfície d'usuari de tipus desktop i per l'altra té un control d'events i layouts molt bó que simplifiquen moltissim la vida al programador, sense necessitat de tenir que optar per la part gràfica de la llibreria. A més s'ha creat una comunitat extensa al voltant de la llibreria i la documentació existent és molt bona.
- Dojo. Amb el temps pareix que Dojo es convertirà amb una de les llibreries de referència perJavascript. Ara per ara és una llibreria molt vistosa però que té una gran mancança: la documentació.
- Qooxdoo Té molt bona pinta pel backoffice, però li falta documentació.
- Rialto Té molt bona pinta. La interfície és molt agradable, però encara està força verd com per arriscar-nos a fer un desenvolupament complexe en aquesta llibreria.
- Zimbra Un altra d'aquestes llibreries pensades per fer-les anar sols en xarxa local o en connexions que no siguin les que ens acostumen els operadores espanyols.
- Tibco Un altre framework alliberat fa poc. És per sí mateix un complet entorn de desenvolupament. Feixug, però amb molta documentació.
- Plex Te bona pinta. Molt xml per fer interfícies i encar pocs widgets.
- ZK. Si algún dia he de fer una aplicació de backoffice per LAN ZK serà una de les meves primeres opcions. En poc temps el bastimet ha avolucionat molt i ja té una massa critica d'usuaris prou gran com per a poder-ho considerar un producte estable. El problema que té encara és el gran consum de recursos que té.
- Java. Estable i prou provat. Elegit per la majoria de desenvolupaments web empresarials. Sun pareix que finalment s'ha deixat de mitges tintes i va cap al codi obert. Quan anam cap a aquesta opció apareixen nous jugadors: Spring, Hibernate, EhCache, Jasper Reports, DWR... Una de les feines inicials del projecte és triar quins components es faran servir.
- Python + Django. És una combinació divertida de fer anar i molt productiva. Fa servir un model MVT i una arquitectura que fa que les aplicacions siguin molt escalables.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Openoffice Math
Escrit per Aaloy a 27 de February , 2007 a les 8:23 p.m.
L'OpenOffice duu un complet editor d'equacions matemàtiques, motl útil quan volem escriure fórmules complexes dins el nostre document.
L'editor segueix un poc la filosofia de LaTex, és a dir, encara que té ajudes gràfiques es suposa que està pensat per gent que escriu moltes fórmules, i per tant, la interfície d'entrada és el text.
Com que a mi m'agrada molt LaTex per escriure documents llargs (tenguin o no tenguin fórmules) trob aquesta manera d'allò més natural, però com que no escric fórmules cada dia, doncs a vegades no record massa bé com es feia alguna cosa.
En concret sempre he d'anar a cercar com es fa per posar una sola clau a un sistema d'equacions. Cercant per Google, he trobat aquest enllaç que esper que també pugui ser d'utilitat als asidus de l'OpenOffice Math:
http://es.tldp.org/Manuales-LuCAS/doc-manual-OOMath/Math.pdf
Una fantàstica traducció del manual en format pdf i que des de ja figura dins els meus pdf preferits, junt amb la traducció de "In the Beginning was the Command Line" de Neal Stephenson
http://biblioweb.sindominio.net/telematica/command_es/command_es.pdf
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Contraintuïció
Escrit per Aaloy a 24 de February , 2007 a les 12:01 a.m.
Fan un anunci per la tele, apareix un home netejant una façana, apareix algú que es fa neta la boca amb un elixir bucal. L'elixir és molt potent, se veu, quan ho deixa anar per les canonades d'aigua bruta es veu com va baixant com una bomba,... Després una canonada d'aigua neta explota com per l'efecte de l'elixir i acaba de fer neta la façana. Tot molt gràfic, tot molt normal, llevat que no és correcte. Si explota la canonada hauria de ser la d'aigua bruta i l'home de la neteja no crec que estigués molt content com un sortidor d'aigua fecal pega per la façana.
Sorprenentment veim l'anunci i ho trobam d'allò més normal. Exagerat, potser, però és cosa de la publicitat. Llevat d'això tot ens pareix correcta, la nostra intuïció ens ha fallat.
Si això ens passa en coses que suposadament dominam, que vivim cada dia, quan ens situam en un entorn menys habitual, com el món del programari i la programació, la intuïció encara ens poc jugar més males passades. La intuïció ens diu que posar més gent a un projecte ha de fer que el projecte vaig més ràpid, però la realitat és que pot fer que el projecte no avanci amb la velocitat esperada. Això es deu a que afegir gent al projecte no implica un augment lineal de la productivitat, sinó que hi pot haver casos en que la productivitat fins i tot disminueixi.
Un projecte amb molta gent necessita de més planificació, d'una comunicació fluïda entre els seus components, i aquesta comunicació i coordinació fa que sigui necessari dedicar-hi recurssos que d'altra manera es dedicarien integrament al projecte, ja que en un equip més petit tendríem menys necessitat de comunicació formal.
Un altre dels factors que influeix és el que s'anomena tendència a la mitja. Si l'equip és petit, entre 3 i 10 persones és probable que puguem tenir un equip d'elit, però si augmenta el nombre de gent la tendència a la mitja suposa que sols podrem completar l'equip amb gent prou bona, però potser no tan productiva com la d'un equip especialment seleccionat. En aquest casos, la intuïció que ens diria que s'ha de fer més via també ens ha fallat, podem arribar anar més a poc a poc. Això no vol dir, però que no hi hagi avanç a mig termini, sinó que a curt termini podem esperar un retràs considerable, mentre les vies de comunicació es consoliden i tots els components es van adaptant, i tot i així, l'augment de components de l'equip no serà lineal: comunicació, formalització més acurada de procediments, més necessitat de control fi coordinació espenyen aquesta linealitat. I quan consideram l'equip del projecte no hem de pensar sols en programació, hem de pensar en tota la gent implicada: testers, managers, usuaris avançats. Quanta més gent més probabilitats que la tendència a la mitja jugui en la nostra contra.
Tot el que té a veure amb la tecnologia ha avançat molt ràpid, si amb conses que ja coneixem les nostres suposicions són incorrectes, hem d'estar previnguts de que en tot allò que fa referència amb la tecnologia encar ho poden ser més: escriure programes no és el mateix que escriure una carta, un ordinador no és una màquina d'escriure, una pantalla no és una fulla de paper, les webs no són equivalents a una publicació de paper, el que nosaltres considerem bo no te per què ser-ho pels nostres usuaris, d'aquí que es tenguin que fer proves d'usabilitat. Si es pot mesurar mesurem-ho, potser la nostra intuïció ens està fallant.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
El tamany sí importa
Escrit per Aaloy a 18 de February , 2007 a les 3:27 p.m.
En moltes empreses per procediment es canvien tots els ordenadors cada quatre anys, quan el valor de l'equip s'ha amortitzat totalment.
Aquesta no és una mala pràctica pels equips d'oficina, però el café para todos és molt perjudicial en entorns de desenvolupament, on es vol aconseguir un ratio de productivitat màxima.
Anem a pams, suposarem que el cost d'un equip nou de trinca és de 600 € + IVA, en aquests moments estaríem parlant d'un Core Duo 2,13 GHz amb 2 Gb de RAM, és a dir una màquina prou potent com per poder fer feina amb entorns devoradors de màquina com la combinació Eclipse+Java.
Ens plantejam quan hem de renovar aquestes máquines, hem d'esperar als quatre anys o convé renovar-les abans? Podem fer una sèrie d'estimacions bàsiques que ens ajudaran a respondre a aquesta pregunta.
La feina d'un programador té un cicle d'escriptura de codi, compilació, proves i depuració. Si feim servir llenguatges interpretats de l'estil de Python, Ruby o PHP aquest cicle canvia, però per ara centrem-nos en lleguatges més clàssics com .Net, Java o C++. Aquest cicle, i per exemple el desplegament de l'aplicació en un servidor d'aplicacions local com Tomcat o JBoss, implica que per a cada prova que es fa es perdren entre 3 i 6 minuts per prova (compilació o generació dels bytecodes, còpia al servidor, desplegament de l'aplicació, inici del navegador i començament de les proves).
Suposem també un sou brut d'un programador de 24.000 Eur anuals, i que hi ha 223 dies efectius de fiena, és a dir, el cost per diar de programador sols en sous és de 107,62 Eur.
Considerarem vàlida la llei de Moore i considerarem que als 18 mesos de fer la nostra compra, podem comprar un nou ordinador, més o manco pel mateix preu que dobla les capacitats de procés del nostre ordinador actual, amb la qual cosa el temps d'arrancada és pot reduïr a la meitat. Serem conservadors i donarem un marge de 2 anys.
Amb això tendríem:
- Valor pendent d'amortitzar: 300 Eur
- Temps mort per prova 3 - 6 minuts
- Nombre de proves per dia : 10
- Sou per dia del programador: 107,62 Eur
- Dies útils de programació : 223
Ara ens plantejam canviar la màquina, està clar que la màquina als dos anys no està amortitzada, tot i això, ens podem plantejar donar de baixa la màquina i que l'operació encara sigui molt rentable per l'empresa.
Si consideram una pèrdua de 3 minuts per prova tindríem que el temps anual en hores perdut és de 111,5 hores, és a dir 13,94 dies. Si anam als 6 minuts per prova, resulta que pràcticament un mes de feina es perd esperant a que la màquina estigui a punt per provar.
Canviant la màquina per reduïr el temps d'espera suposa un estalvi d'entre 1.500 Eur i 3.000 Eur l'any per programador si suposam que podem col·locar la màquina antiga o d'entre 450 Eur i 1.200 Eur si directament la regalam.
És a dir, canviar d'equip cada 2 anys per disminuir el temps d'espera entre compilació i proves, pels temps que estam manejant és justifica completament.
A més, però tenim un altra benefici tangible: augmenten les hores dedicades al projecte i disminueix la frustració que suposa tenir que esperar un parell de minuts entre que vols començar les proves i aquestes comencen.
Si no canviam màquines, el que tenim són directament pèrdues, per una part perquè deixam de tenir l'estalvi produït per la inversió que no hem fet, però a més, hem de tenir en compte que amb els anys les aplicacions tendeixen a fer-se més grans, més complexes i per tant ens podem trobar sempre en l'escala superior de temps d'espera.
Una manera de lluitar amb aquest efecte és anar cap a llenguatges i entorns que no tenguin aquests teps d'espera, és a dir, desenvolupar amb llenguatges dinàmics com Python, PHP o Ruby. En aquests casos el temp d'espera es redueix pràcticament a zero, i tendriem ja d'entrada tot l'estalvi, és a dir, el pas de desenvolupar en Java cap a Python, per exemple, suposa un estalvi sols en temps d'espera d'entre 1.500 i 3.000 Eur anuals per programador, deixant a banda la diferència de productivitat en termes de línees de codi entre un i altre llenguatge.
Un altre factor d'estalvi, encara que no tan important com el del llenguatge com el processador, ho podem trobar en les pantalles. Tenir una pantalla gran o dues pantalles pel desenvolupament, fa que el programador no té que anar canviant de finestra o que els canvis que fa són mínims. Un estalvi de 2 minuts al dia per aquest concepte implica un estalvi de 100 Eur anuals, si tenim en compte que l'amortització d'una pantalla de 20" és també d'uns 100 Eur anuals, tendriem que arribam a la partiat, al break event, però millorant sobremanera l'entorn de desenvolupament del nostre personal, i per tant la satisfacció en que es fa la feina, i la satisfacció i motivació del personal, són efectes de primer ordre en la productivitat.
En poques paraules, equips més grans, més potents, pantalles amb més resolució, tenen un impacte quantificable en el desenvolupament web. Canviar equips abans de que estiguin amortitzats pot tenir un impacte significatiu en la compta de resultats d'un departament informàtic, tant amb el que suposa d'hores de feina estalviades, com per l'augment de motivació del personal que hi fa feina.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Metodologia ASDM o 3UI
Escrit per Aaloy a 07 de February , 2007 a les 10:05 p.m.
[1] A Salt De Mata o ui-ui-ui, interjecció emprada pels programadors quan veuen el que se'ls hi ve damunt[2] El qui paga [3] I dic projecte per dir alguna cosa
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Trespams caigut
Escrit per Aaloy a 06 de February , 2007 a les 11:49 p.m.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: General
Fitur 2007
Escrit per Aaloy a 31 de January , 2007 a les 8:14 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Depurar una aplicació Django
Escrit per Aaloy a 23 de January , 2007 a les 1:27 a.m.
De tant en tant faig algun apunt per tenir una referència posterior, a manera de documentació per tal de no oblidar-me de com se fa una cosa, d'una referència o procediment. Avui és un d'aquests apunts.
Com he comentat en altres apunts darrerament estic fent molta cosa amb Python i Django com a bastiment MVT web. En un món ideal el meu G5 funcionaria de conya amb l'Eclipse i tendria un depurador de Python integrat a l'IDE, però com que no tot pot ser tan meravellós com la combinació de Python i Django, doncs vaig tenir que cercar alternatives. Una prou bona és el Kdevelop, així que al G5 per programar utilitz les següents eines:
- Kdevelop com a Editor principal. Ben bé es podria fer amb Kate, però m'agrada la funcionalitat extra que aporta.
- Vim, no pot faltar mai!
- svn per interactuar amb el repositori subversion. També feia server kdesvn però al final m'és més còmode la línea de comandaments.
- kdiff3. Que la comparació visual està molt bé, tú!
- Firefox amb les extensions de webdeveloper tools i firebug
- Eclipse. Quan la gestió dels canvis se me complica i puc mantenir-ho estable el temps suficient per fer els canvis.
El problema d'això és si no es fa servir l'Eclipse no disposam de depurador integrat a l'IDE. [1]. Això per mi és un problema, menor, sí, perquè Python és prou net i elegant i la informació de depuració de Django prou extensa com per anyorar-ho poc, però què voleu, m'agrada al manco tenir l'opció de poder seguir la traça d'un programa sense tenir que tirar de logs i prints. [2].
Doncs mirant un poc pels fòrums de Django i un poc per Google, he arribat a la següent recepta:
- Executam el servidor de Django amb l'opció de noreload:
python manage.py --noreload runserver - Al fitxer el codi del qual volem depurar feim
from settings import DEBUG if DEBUG: import pdb - Per acabar al lloc on voguem posar el punt de ruptura escriurem:
pdb.set_trace()
L'important aquí és l'import, l'altre codi sols és per assegurar-nos que si ens deixam el codi de depuració en producció "petarà".
Això fa que en arribar a al punt hom hem establer la traça, la consola del servidor de Django ens mostri el símbol de depuració.
-> user = request.user
(Pdb)
A partir d'aquí ja hem entrat en mode de depuració i basta llegir-se un poc la documentació del depurador integrat de Python per anar tirant. Recordem que no estam sols davant d'un simple depurador, sinó que tenim tota la potència de Python al depurador mateix. Un tutorial força senzill per començar és Debugging in Python.
Una vegada acabeu de depurar hem de recordar llevar o comentar el pbd.set_trace(). Possiblement hi haurà maneres més potents de fer això, com la depuració remota, però aquesta és prou senzilla de fer anar. [1] Eric en duu un de depurador integrat, però darrerament no hi ha manera de posar-hi accents a l'editor i no es cosa sols del G5, així que l'he descartat de moment com a IDE.
[2] He vist gent no fer servir el depurador integrat de l'Eclipse programant en Java, però me'n reservaré l'opinió.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Python Django
Hem guanyat el segon premi!
Escrit per Aaloy a 15 de January , 2007 a les 10:54 p.m.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Parlar massa tècnic
Escrit per Aaloy a 15 de January , 2007 a les 4:18 a.m.
Traducciones/Translations by apertium
4 comentaris, 1 trackback (URL) , Tags: Informàtica
FUDs als CMS
Escrit per Aaloy a 07 de January , 2007 a les 6:17 p.m.
Estic subscrit a un lloc d'aquests de comunitats virtuals anomenat XING, no és cap cosa de l'altra món, però té una interfície que està prou bé. El seu model de negoci es basa en serveis de pagament opcionals i alguns d'ells l'invaliden un poc com a comunitat vitual, especialment si no et deixa estar en contacte amb la gent per e-mail si no pagues, però té de positiu que pràcticament no hi ha spam.
El sistema té un sistema de fòrums que es poden crear prèvia aprovació d'algun administrador de XING. Un dels fòrums de recent creació és el "Foro de gestión de contenidos Web". Com que és un tema que m'interessa professionalment hi vaig anar a fer una ullada.
Tot just després del missatge de presentació hi ha un e-mail que demana parer damunt CMS i donant la seva opinió l'autor de l'e-mail diu que per el Joomla és el millor CMS, i aquí el moderador/creador del Fòrum perd els papers i és dedica al FUD en lloc de discutir les bondats o no dels CMS.
Web21 es infinitamente más seguro que Joomla, por una razón muy sencilla, Joomla es código abierto, web21 no lo es. Joomla es un sistema que yo recomiendo para un sitio web personal, pero no para uno profesional.
I se queda tan ample. Em permet citar la discusió del fòrum perquè tanmateix és un copiar i aferrar del que posa a la pàgina web del Web21.
És a dir, seguretat per l'ocultació de codi. Això ja ens dona una idea del poc segur que deu ser el Web21 que han d'amagar com està fet per a que no els desmontin el xiringuito. A més paraules con "infinitamente" sols estan expressant que no s'ha quantificat gens el nivell de seguretat, no és dues o deu vegades més segur perquè s'han detectat i corregit tants de forats de seguretat o perquè el temps de resposta és millor. La raó és perquè ningú veu el codi. I encara hi haurà gent que s'ho cregui a això...
[..] Lo malo de estos CMS [referint-se als CMS de codi obert] se puede englobar en tres aspectos: - El código abierto siempre está expuesto a ataques por parte de hackers, una página web elaborada con un CMS de código abierto SIEMPRE estará expuesta a ataques de hackers inexpertos que sólo tienen ganas de fastidiar destrozando cosas. Los hackers profesionales NUNCA intentarán hackear nuestras páginas webs, van a por sistemas más importantes.[...]
Com els sistemes de codi obert suposo? :) És a dir, no t'atacaran perquè el teu CMS sols ho fan servir clients que són tan poc importants que no mereixien ni l'atenció dels hackers més inexperts. Sí senyor, d'això se'n diu fer-se bon marketing. És a dir, si jo vull que el meu lloc web arribi a ser important millor que ja no comeni posant el cms de web21, ja que no està pensat per a llocs webs importants. Segueix: El sitio web es seguro. Web21 es de desarrollo propio y su código no es accesible para el público en general. - Los módulos de adecuan perfectamente a la página y están testeados a conciencia. Es muy raro detectar algún fallo en los módulos, y si lo hay es mínimo.
Raro?, com n'és de raro?, quí ho testeja?. Es tècnics de web21 són més o millors que tota la comunitat que hi ha darrera els principals cms de codi obert? Quins són els errors mínims que hi ha? És molt fàcil dir que no hi ha errors quan no es pot auditar el codi. El problema amb les solucions tancades és que quan es detecta un error un no el pot corregir, sinó que ha d'esperar que l'empresa ho faci i perdem un temps molt valuós de resposta davant possibles atacs.
Nuestro CMS es seguro. El CMS de Web21 es de desarrollo propio y su código no es accesible para el público en general.
I segueixen, eh? Qui seria l'inconscient confiaria en un CMS que diu que és de desenvolupament propi del qual no se'n té accés al codi font i que diu que és segur perquè amaguen el codi, no perquè facin les coses bé?. Fer ús d'un cms tancat implica estar lligat al proveïdor, els teus continguts ja no són teus, són del proveïdor qui te tindrà fermat sols per la feinada que te duria canviar de gestior de continguts. Després de tot, per molts cms de codi obert hi ha camins de migració d'un a l'altra, per un CMS tancat com aquest no.
La veritat és que feia estona que no reia tant amb un FUD. Obviament el grup de CMS de Xing no serà un asidu de les meves visites llevat que vulgui riure un poc. La persona que va dir que per ell Joomla era el millor davant això ja s'ha despuntat del grup. Jo no m'hi he arribat a subscriure, sols hi he deixat un comentari de l'estil que escric al bloc.
Parlant de manera seriosa: el codi obert està en línia amb una de les pràctiques d'enginyeria de programari per garantir la qualitat del codi, la inspecció del codi. I en línia amb una altra recomanació com és la propietat compartida de codi. Aquestes són pràctiques recomanades per a desenvolupar programari de qualitat, i el codi obert ho duu a l'extrem quan tothom pot ser revisor de codi i tothom pot modificar el programa i millorar-lo.
A més hi ha un efecte psicològic important: quan programes i fas coses per a que les vegi un altre que potser ni tant sols coneixes, hi ha una pressió molt gran per fer-ho bé, per a no cometre errors, i això fa que el codi sigui millor. Si ningú ho ha de mirar normalment s'acaba amb codi d'anar per casa, i els problemes comencen quan es posa en producció i comencen a sortir el primers errors.
Per a una empresa un CMS de codi obert amb una bona comunitat d'usuaris suposa que té una mínima garantia de qualitat, de suport i de temps de resposta davant incidències de seguretat. El que no hem de confondre, com fa el FUD és codi obert en codi gratuït, el codi t'ho pots davallar, però no saps configurar-ho hauràs de contractar algú per a que ho faci i t'ho deixi com tu vols, just el mateix que es fa quan es contracta un consultora per a instal·lar un cms propietari, sols que en aquest darrer cas pagues tant el producte com la instal·lació i personalització, i en el cas del codi obert sols pagues pel servei que et proporcionen.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
D’hores-home i E-Factor
Escrit per Aaloy a 05 de January , 2007 a les 11:27 p.m.
En la literatura de gestió de projectes és habitual trobar-nos amb el concepte d'hores-home per expressar la unitat de mesura de projectres, com a una unitat que expressa el temps necessari per a desenvolupar un projecte. Així 100 hores-home indica que el cost de projecte seria equivalent al de 100 hores d'un sol programador.
El problema de les hores-home és que es presten a confusió quan el nombre d'hores-home passa cap a gent no tècnica, que té que aprovar un pressupost o dir en quant de temps s'ha de fer un projecte.
a) Pot donar a entendre que les hores de programació són intercanviables. Es a dir, 100 hores-home per fer un programa poden ser fetes per 100 programadors treballant una hora, com per 10 programadors treballant deu hores, com per dos únics programadors que s'hi dediquen 50 hores.
b) Suposa que totes les hores de treball són efectives. És a dir, suposa que un programador és capaç de ser productiu des de el mateix segon que es posa a pensar en el programa.
Per evitar el primer problema el nombre d'hores-home ha d'anar acompanyat amb temps mínim de realització i el temps més probable, de manera que es pugui veure que l'augment del nombre de programdors a l'equip no implica necessàriament que es reduexi el temps necessari per entregar el projecte, és a dir, que quedi molt clar que hi ha un temps mínim per sota del qual no és possible entregar el projecte.
Molt més problemàtic és explicar el tema de la no intercanviabilitat de la gent. El més normal és explicar-ho en termes de coses que el nostre interlocutor ja conegui, indicant que hi ha gent especialista en cada cosa i que no es pot substituir fàcilment una gent per una altra. Comparar programadors amb metges és força efectiu, podem explicar que quan et fa mal un queixal no vas al proctòleg sinó al dentista. Els dos poden ser metges i molt qualificats, però cada un té la seva especialitat.
Atacar el segon supòsit implica no presentar la valoració del project en termes d'hores-home, convé anar cercant una altra unitat de mesura que ens permeti expressar millor el que és una hora de programació efectiva.
El concepte d'hores efectives està tractat molt bé al Peopleware, on es dedica tot un capítol complet al tema de les hores de treball ininterromput vers les hores de permanència a l'oficina. És el que anomena E-Factor, i ens dona una idea del treball que es perd per no tenir un ambient de feina que permeti tenir prou hores sense interrupcions.
Quan feim una estimació en termes d'hores-home poques vegades es considera la correcció que ve de l'E-Factor, de fet potser ni tan sols se'ns sap el valor, ja que ningú s'ho ha plantejat mai, sols se sap que els projectes es retràssen i no se sap ben bé perquè.
Per una altra banda, la metodologia de l'Extreme Programing proposa que les valoracions de les tasques es facin en termes d'Ideal Engineering Hours (IEH). És a dir, que les valoracions s'expressin en termes de temps sense interrupcions necessari per a completar dita tasca.
Particularment m'agrada molt la idea de tenir una unitat per expressar la dedicació necessària per fer un programa que implícitament té en compte que la feina es pot allargar més o menys en funció de les condicions laborals i de les interrupcions que es tinguin.
Fent servir les IEH com a unitat de valoració en lloc de les habituals d'hores-home estam transmetent la idea de que el desenvolupament de programari és una tasca on les interrupcions tenen un impacte molt gran en la productivitat dels programadors i per tant en el cost del projecte.
De retruc potser algú es demanarà el perquè d'aquest canvi i tal volta es plantegi poder calcular l'E-Factor.
Amb tot això ara quedaria discutir quina és la validesa de les estimacions de programari, és a dir, s'han de realitzar estimacions per saber el cost aproximat del projecte, però ens queda per saber com n'és de bona aquesta estimació o si ha d'anar lligada a que hi hagi una especificació completa del projecte, com si de fer un edifici es tractàs. Quan parlam de programari la comparança amb la construcció d'un edifici ens enfonsa la metàfora, però bé, això són figues d'un altre paner i ja miraré de parlar-ne més endavant.
Ara per ara potser alguns ja us estigueu plantejant presentar les vostres properes estimacions en termes d'IEH o anar calculant el vostre E-Factor particular, si ho feis m'agradaria conèixer quin és, que els estudis de productivitat en programari són més aviat rars en aquestes contrades i potser entre tots puguem treure'n alguna conclusió.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Gestió de projectes
Programació àgil
Escrit per Aaloy a 11 de December , 2006 a les 11:44 p.m.
- Comparació entre Django i Rails. Molt ben feta i molt ben documentada. Surt del tractament clàssic i fa una comparativa poc partidista i posa de relleu les fortaleses i mancances de cada llenguatge.
- Per què usar Django. Petit article amb 10 punts que ens poden donar llum de perquè triar Django davant altres bastiments.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Baleart
Escrit per Aaloy a 10 de December , 2006 a les 9:59 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Lectura per Nadal 2006
Escrit per Aaloy a 29 de November , 2006 a les 8:16 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Publicitat creativa
Escrit per Aaloy a 12 de November , 2006 a les 11:59 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Economia freaky
Escrit per Aaloy a 10 de November , 2006 a les 10:24 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Tornant a la normalitat
Escrit per Aaloy a 05 de November , 2006 a les 2:45 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Actualitzat!
Escrit per Aaloy a 29 de October , 2006 a les 9:26 p.m.
Un conjunt d'aferratines de PostgreSQL en Japonés. M'ha fet molta gràcia! Ja ocupa un lloc destacat al suro, junt amb el cartell de les darreres jornades de Bulma i els dibuixos dels meus menuts.Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Death March II
Escrit per Aaloy a 19 de October , 2006 a les 8:37 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
La finestra trencada
Escrit per Aaloy a 04 de October , 2006 a les 12:33 a.m.
La teoria de la finestra trencada data de 1995, i es pot trobar un bon resum aquesta referència. Bàsicamen ve a dir que la degradació d'un barri, d'una casa, d'un cotxe,.. comença per petites coses que se van acumulant fins que la degradació arriba a un punt on és ja difícil la recuperació.
La idea és atacar donçs les petites mostres de degradació abans de que es facin més grans. En una barriada procurar mantenir els carrers nets, recullir les escombreries, mantenir els jardins i els parcs. La idea és que quan una cosa està en bon estat, quan encara no s'ha començat a degradar, és molt més difícil donar el primer pas que un cop la degradació ja ha començat.
Si no hi ha escombreries al terra és menys probable que algú les hi deixi. Si ja n'hi ha, el més probable és que n'hi acabi haguent més. Tanmateix ja n'hi ha una, un parell, un munt, fins que tot és bassura.
Passa el mateix amb els cotxes avariats. Poden passar dies a la carretera o al carrer sense que passi res, però una vegada s'ha trencat el primer vidre la degradació és molt ràpida, en un parell de dies ja no hi haurà rodes, peces interiors, etc.
Aquesta teoria també és aplicable al mon del programari. Quan es té un programa ben estructurat, definit, amb un estil de programació clar és molt més probable que la persona que ho tengui que mantenir ho faci seguint el mateix estil. Al contrari, si ja des de l'inici el nostre codi és descuidat, sense comentaris ni estructura, el més probable és que la cosa vagi a pitjor. Tanmateix, es pot pensar, no vindrà d'aquí. D'aquí que en la posterior evolució del programa ens poguem trobar amb un conjunt de pegats mal fets, codi que no té sentit, una arquitectura inexistent... L'efecte de la finestra trencada fa que una vegada que ha començat la degradació sigui molt més probable que aquesta continui.
Sovint, però, en el món del programari, no queda més remei fer pegats ràpids per corregir un error de funcionalitat de seguretat o del que sigui. No hi ha cap mal amb això, sempre que tenguem en compte que ha de ser l'excepció i no la regla. La idea és que una vegada s'ha solucionada la crisi, s'ha de dedicar temps a fer les coses bé. En cas contrari ens trobarem amb la primera finestra trencada, i és molt més probable que el nostre programa evolucioni cap a un engendre mal de mantenir.
Fitxem-nos però que l'evitar l'efecte finestra trencada no vol dir que tenguem que passar-nos la vida perfeccionant un programa fins a deixar-ho perfecte. La perfecció malhauradament en programació no existeix: sempre podríem fer el codi millor, més ràpid, sempre podríem posar més funcionalitats, fer que el programa fes el que volem de la manera més òptima. No hem de perdre el concepte de "prou bo", és a dir, hem de saber també quan aturar.
Si seguim amb l'exemple de la barriada, vol dir que no fa falta que al barri totes les cases siguin palaus. Sovint basta que siguin vivendes dignes, amb les façanes pintades i els interior cuidats. Cases que tenen un cost que la gent es pot permetre i fetes de tal manera que el cost de manteniment també sigui baix.
Una vegada hem conseguit que el nostre programa sigui prou bo, es tracta de mantenir-ho així, d'evitar ser el primer en trencar la finestra i que si algú altra la trenca, arreglar-ho i posar el vidre el més aviat possible, ja que si no és així, acabarem amb l'equivalent en programari a una casa apuntalada i que amenaça caure.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Death March - Me too!
Escrit per Aaloy a 02 de October , 2006 a les 9:48 p.m.
En una entrada anterior parlava dels projectes Death March i de la classificació que en fa n'Edward Yourdon al seu llibre Death March. Ara escric això alegrant-me d'haver comprat i llegit el llibre: estam enbarcats en un death march project.
Quan un s'embarca en un projecte d'aquests, el primer que ha de saber és en quin tipus de projecte s'està embarcant i quina és la companyia. Jo aquest, i segons la classificació de Yourdon, ho classificaria com un projecte de "Missió impossible", és a dir, es compta amb un equip altament motivat i capaç, però els riscs que poden fer fracassar el projecte són motls i variats.
Si als projectes normals ja s'ha de dur molta cura amb la gestió, als death march encara és molt més crític. Es pot pensar que en un projecte on les premures de temps són important no s'hauria de dedicar temps a la planificació, control d'errors, de versions, al la comunicació, res més allunyat de la realitat. Les estratègies de "codifica com un boig" [1], potser estan bé per fer veure ques es fa molta feina, el problema però, es que sovint aquesta feina és poc productiva i no garanteix que el projecte arribi a bon port.
La planificació i el control en aquests tipus de projectes és doncs tant important o més que en els projectes "més tranquilets", el que potser haurem de fer és no entrar a tant nivell de detall en alguns aspectes, si està un 80% bé ja és suficient, el 20% restant, que marcaria l'excel·lència en un altre projecte, és massa costós en termes de temps i cal evitar-ho si volem tenir èxit. Per exemple, tant fa si l'anàlisi de casos d'ús està fet amb la darrera eina de disseny UML, amb tots els colorins del món i enquadernat a tapa dura, potser amb un troç de paper que exmplique el que es vol fer és suficient. La cosa és que hi ha d'haver aquest troç de paper i hi ha d'haver una estratègia de feina orientada no a fer moltes hores i molta feina, sinó a fer feina efectiva.
Tanmateix, algunes vegades ni tota l'estratègia i planificació del món salvarà el projecte, senzillament està condemnat al fracàs: el temps és massa curt, el recursos insuficients, el que s'ha de fer no està clar, els riscs del projectes són massa o qualsevol combinació de les anteriors. El problema és que normalment un no sap que passaran coses d'aquestes fins que ja ha començat el projecte. Davant això, la planificació i la comunicació són importants. No serveix de res dir allò de "està al 90% acabat" quan sabem positivament que el 10% restant és el bessó del projecte. Val més ser realistes i dir les coses clares. Tanmateix si la continuïtat de la feina depén de l'èxit del projecte i aquest no té cap possibilitat d'acabar bé, al manco n'haurem informat a temps i es podrà, si es vol, reaccionar.
Quan un projecte s'ha de fer en un temps molt curt, per mi, el més important és disposar d'un bon equip de gent. I per "bon equip" no vull dir un equip gran de gent, sinó un equip de gent molt qualificada, acostumada a fer feina plenada i molt motivada. Això i moltes hores extres, clar. El problema és que un ritme de 10 o 12 hores diàries, difícilment es pot mantenir durant més que un parell de mesos, així que a partir d'una certa durada del projecte convé començar a fer comptes i veure si posar més gent al projecte compensa el retràssos que implica tenir que formar al personal nou i la complexitat adicional de comunicació que hi ha quan l'equip de feina es fa més gran
Per projectes de curta durada, entre un i tres mesos, és molt més eficient un equip petit, tirant d'hores extres fetes amb seny, que un equip amb el doble de gent. La durada del projecte sovint marca també el nombre de tasques que s'han de fer i el grau de paralel·lització que es difícil que arribir a ser l'òptim [2]. A vegades es pot aconseguir que el projecte faci més via si malbaratam recursos, és a dir, si tenim gent sense fer res, esperant a que li toqui fer el seu trocet. Sigui com sigui, ens duu sempre al mateix, s'ha de planificar, s'ha de saber l'abast del projecte i s'ha de dissenyar una estratègia amb probabilitats d'èxit. D'altra manera no sabríem mai si amb més recursos s'hagués pogut arribar a temps o al contrari, si s'hagués tingut que tirar de treball extra per acabar el projecte
Tornant al nostre projecte, crec que serà complicat, els riscs són grans, però l'equip és molt bó. Les meves estimacions diuen que en condicions normals podem doblar o triplicar la productivitat estandard. Tot aquest optimisme sempre cal estar atents als riscs, al seu control i a la seva minimització. Controlar els riscs és costós, s'hi han de dedicar temps i recursos, però no fer-ho pot suposar que un projecte de "Missió impossible" es convertesqui en un projecte suicida. Yourdon diu que les estadístiques estan al nostre favor [4], i si Yourdon ho diu ho haurem de creure.
Ja sent la musiqueta: tan-tan-tan-tan-tant-ta ta ta ta, tiruriii [3]
[1] Code like hell
[2] Quin mal que han fet aquí les eines com M$Project que suposen que qualsevol recurs és intercanviable!
[3] La música mai ha estat e meu fort. Deduïu el nom de la cançò pel context. I no, no hi ha premi pel qui ho adivini. :)
[4] Els death march projects que tenen més probabilitat d'èxit són aquells on el projecte és de curta durada i l'equip és petit i està molt motivat. En aquests tipus de projectes és molt més bo de fer que la gent pugui "aparcar la seva vida" durant el temps de durada del projecte. En projectes amb molta gent o de durada molt més gran, hi ha tan dificultats per a que tothom "doni el call", pels motius que siguin o que pugui deixar-ho tot durant tant de temps (el més normal). Això per no parlar de l'esgotament físic i mental o de que en casos així molts dels integrants del projete s'estima que deixaran l'empresa dins el proper any, amb la qual cosa l'empresa es pot trobar amb un projecte fracassat i amb el capital humà perdut.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
No me duc bé amb els mòbils
Escrit per Aaloy a 23 de September , 2006 a les 4:02 p.m.
Sovint en el nostre tracte amb usuaris de programes i ordinadors, ens trobam amb gent que diu no dur-se bé amb la tecnologia, que tenen la impresió que el món informàtic se'ls hi gira en contra. Sovint són els mateixos que juren i perjuren que l'ordinador o el programa fallava abans de que arribàs el tècnic. He de dir, que encara tenc un fort grau d'empatia amb aquesta gent, jo me duc molt malament amb els mòbils.
He de dir que no tenc mòbil propi, tampoc ho necessit. Tenc mòbil de feina per necessitat, però la veritat és que m'estim més la comunicació per correu electrònic, trob que interfereix menys en la vida del personal i està desprovista de la urgència que implica tenir que atendre a un aparell que està donant la murga amb els sons més insospitats.
Potser per aquesta raó els mòbils no se porten bé amb mí, jo no els aprecio i el sentit poètic de la vida fa que pugui dir-se em retornen aquets menypreu. I és que me n'ha passat de tot un poc amb distints models de mòbil. Vaig tenir un Nokia que es desbloquejava tot sol quan el duia dins la butxaca. En una ocasió vaig omplir tota la bústia de veu d'un conegut quan el mòbil es va desbloquejar i va cridar-ho (tota una combinació de coniciències, no?). Vaig tenir un Blackberry que es quedava penjat. Puc dir que fan servir Java perquè n'he vist els errors que dóna. Un Siemes també es bloquejava de mala manera, funcionava, podia fer cridades, però no les rebia. El Nokia que tenc ara té el costum de queixar-se de que els arxius de so estan corruptes si no l'apag de tant en tant, amb la qual cosa, quan me n'adono, la gent es queixa de que no atenc les cridades, cony! si no las sent! Aquest Nokia, però pareix que ja s'ha cansat de mi, ahir al sopar a la fresca va decidir que la meva tarja, la tarja de l'empresa, no era del seu agrat, i als voltants de les deu i mitja va decidir que volia una altra tarjeta que no fos la meva. D'això en dic posar-se de vaga!
Tampoc és que els tracti malament, els faig servir poc i no sóc gens amic de personalitzacions, policoses i demés mandangues. Potser per això es deuen estimar algú que els tracti millor, que estigui per ells, que els tracti com a una extensió de la seva persona, com fan la quitxalla i mobifílics varis.
Quan m'invaeix la vena científica pens que potser el meu camp electromagnètic i el dels mòbils no són compatibles, que s'espatllen perquè estic sempre envoltat d'ordinadors i interferències electromagnètices, o perqué simplement un any o dos és el temps entre fallades mig que tenen els mòbils actuals. Sí, potser, però a mi m'agrada més l'explicació poètica: els mòbils es reblen davant un usuari que sols els fa servir l'imprescindible, que s'estima més el correu electrònic i escriure al blog que parlar per telèfon i protesten per aquest us. No volen ser mòbils objecte, és la rebelió de les màquines!
Nota: Escrit després d'un excel·lent sopar de fideus de vermar fet per mestre Miquel (Es Pobler) de Binissalem. Coents, sabrosos i amb una carn d'allò més tendre. La sobretaula amenitzada pel meu cunya-pot-ser qui més que un repertori té tota una discoteca, i el showman i sabater Paco.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
D’enveges i males llengües
Escrit per Aaloy a 13 de September , 2006 a les 11:16 a.m.
A la revista Arròs amb Salseta, la revista local de Binissalem, surt aquest mes un article d'opinió d'allò més sucós. Es tracta de d'un tal Toni Servera, "es guixaire", que fa saber públicament que encara que s'ha separat de l'al·lota i que tot i que tenien el pis a mitges, avisa de que la rumorologia que corre de que li prendran el pis es falsa, i que "Gràcies a Déu, mail li han faltat doblers per pagar res".
Particularment m'ha sorprés l'anunci. És ben curiós veure una cosa així a una revista, encara que sigui de poble. Ara també he de dir, que aquestes coses sols poden passar a un poble, on un sector de la població tendeix a "fer els comptes" a la gent. No em puc imaginar com n'ha arribat a ser de molest per aqeust home que n'hagi tengut que fer un comunicat públic a la revista. Les xafarderies als pobles sempre han estat a l'ordre del dia, rumorologia a més estil "reallity show". Potser ara amb tots els serials que hi ha la cosa s'ha apaivagat un poc, però a molts pobles encara ens podem trobar amb els envejosos/es que aprofiten qualsevol cosa per fer safreig.
Bé, als pobles i a la blogocosa. Des de que Ricardo i companyia van posar en marxa el menéame, ja no sé quantes vegades ha tingut que sortir al pas d'acusacions de tota mena, algunes personals, algunes atacant la feina feta. La majoria sense cap justificació o amb justificacions peregrines, fruit de l'imaginari esquizofrènic del qui les fa, i sense més fonament els xafarders que han fet que mestre Toni Servera publicàs el seu escrit a l'Arròs amb Salseta.
No puc entendre fins a quin punt arriba l'enveja d'alguns i més amb una cosa com el Menéame, que té el codi font a disposició de qui el vulgui, i que per tant, si no t'agrada sempre pots montar-ne el teu propi xiringuito. Però clar, no és cosa de que t'agradi o no, pareix que la cosa és que com que el que hi ha funciona, el que s'ha de procurar és desacreditar-ho, bé com a concepte bé mitjançant atacs personals. Tan difícil és alegrar-se de que una cosa funcioni? Per què hi ha gent que no està contenta quan els altres tenen una bona idea? Per alguns la idea de blog, de participació, és més aviat la de la peixeteria/perruqueria/forn del poble, és a dir, com a fòrums on deixar anar tota la seva mala llet, això sí sempre disfressada de un "no és que vulgui criticar, però ...".
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Dell no vol que li compri
Escrit per Aaloy a 30 de August , 2006 a les 8:49 p.m.
ActiveXObject is not defined. Aquí hom ja pot veure que si posa ActiveXObject això sols funcionarà a un Windows. No ho entenc!Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
No diguis dois
Escrit per Aaloy a 25 de August , 2006 a les 8:48 p.m.
No diguis dois és el grup on toca el baix habitualment el meu cuyat-pot-ser que és una altra manera de dir que és el tipus que surt amb la meva germana, i al qual tenc amb molt d'apreci.
El dijous vàren tocar a Binissalem, al casal de Ca'n Sabater. Encara que l'apunt soni a nepotisme, m'he decit a fer-ho perquè em va fer molta gràcia la frescura del grup, i com se'n desferen davant un públic l'edat mitjana del qual estava al voltant dels 70 anys.
Tocàren cançons del seu repertori i algunes de manllevades, davant un públic que no té el rock català a un de les seus referents musicals. Personalment he de dir que em va agradar, no els havia sentit cap vegada en directe i m'atreviria a dir que vaig veure alguna de les senyores de la tercera edat moguent els peus. També n'hi hagué alguna que es dormí, tot i la contundència de les guiterres de No diguis dois.
Em sorpreneren dues coses: la frescura del grup, fent acudits a la concurrència i fent honor al seu nom, i que el públic fos majoritàriament de la tercera edat. Aquest públic demostra ser poc selectiu (pel que es veu cada dijous compareixen) i a la vegada demostra que es mobilitzen molt i molt millor que la gent jove. Estan molt més enterats dels saraus que hi ha al poble que la gent a la que suposadament va dirigit el sarau, i a més s'apunten a tot!.
No diguis dois estigueren bé, molt bé. Feren tot el possible per animar al públic, però hem d'entendre que a les padrines tampoc era cosa de treure-les a la pista a fer voltes a ritme de rock. El concert va transcorre durant prop d'hora i mitja i es va animar força quan començaren les improvitzacions: la més celebrada va ser un pas doble d'Osifar, que mesclava ritmes coneguts per la concurrència amb lletres gruixudes i bones d'entendre, seguida per un tango molt pujat de to de Tomeu Penya, i és que el sexe ven a totes les edats! :)
Enhorabona al·lots! Vàreu demostrar el vostre saber fer davant un públic difícil. Esperem que la propera vegada el públic estigui més en consonància amb la vostra música.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
El món de la programació s’enfonsa: RoR té un forat de seguretat!
Escrit per Aaloy a 13 de August , 2006 a les 10:54 a.m.
Arrel de l'anunci d'un forat de seguretat a Rails aquests dies podem llegir a força blogs comentaris del tipus ja sabia jo que això no podia ser tan bo, o que comparat amb Java encara li queda un llarg camí, que si ja ho deia jo, ...
No hi ha cap bastiment de programació o llenguatge que pugui assegurar que està lliure de forats de seguretat, sols és questió de temps el que es trobin. El que és important és com es tracten aquests forats, en quant de temps es resolen les fallades i com n'és de complexe l'actualització.
El que RoR tengui una forat més o menys greu de seguretat és anecdòtic i esperable en un producte tan tendre, potser haurà decebut a la gent que veia en aquest bastiment "la bala de plata" que solucionaria tots els seus problemes i la fam del món, però això és el seu problema i no el de RoR o de qualsevol altra bastiment de programació. La gent que té tendència a autoenganar-se, a confiar cegament en qualsevol cosa i després sentir-se absoluta i totalment decebuts a les primeres de canvi fa més que mostrar la seva immaduresa.
El que sí ha demostrat aquest fet és que a RoR no hi havia una política de seguretat clara, no tant en el que fa a que els errors es resolguin ràpid, sinó en com es comuniquen aquests errors i de com se'n fa difusió. Això ha servit per a què altres projectes facin introspecció i es demanin si els podria passar també a ells. Django per exemple
ha publicat al seu lloc com es tractaran els assumptes relacionats amb la seguretat. Així doncs, el problema de RoR ha servit perquè altres es demanin si els podria passar a ells i prenguin mesures per a tenir-ho controlat quan passi.
Del que he llegit darrerament damunt el tema l'apunt de TheServerSide és un dels més interessants, ja no pel que diu sinó perquè veus la postura de la gent que està aprofitant aquesta fallada de seguretat per fer-hi sang. I un post molt interessant fet al grup de Django a partir de la fallada de seguretat de RoR intenta explicar el perquè Rails té l'èxit que té encara que no sigui especialment millor que altres bastiments que hi pot haver. Per mi que és un post força inspirat.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Django
Death March, d’Edward Yourdon
Escrit per Aaloy a 06 de August , 2006 a les 9:35 p.m.
Un projecte es pot classificar com a Death March quan un dels seus paràmeteres excedeix la norma en com a mínim un 50%, ja sigui en termes de temps, personal o pressupost (50% per davall de la norma en aquest cas) o en funcionalitat (doblant la funcionalitat típica). O amb una altra definició, són projectes on la possibilitat de que falli i no es compleixin els objectius és major que el 50%.
En el llibre Yourdon ens descriu què són aquest tipus de projectes, per què hi ha empreses que s'hi fiquen [1] i per què hi ha caps de projectes disposats a liderar projectes d'aquestes característiques.
Una vegada s'ha assumit que ens hem embarcat en una marxa cap a la mort, Yourdon ens dóna una sèrie de consells per a intentar sobreviure a l'experiència: estratègies de negociació, de com recompensar l'equip, de la importància de no abusar de les hores extres no remunerades, fins i tot de com en aquests tipus de projectes és convenient botar-se la burocràcia inherent a certes empreses si es vol tenir una mínima possibilitat d'èxit.
Yourdon classifica aquests projectes en quatre grans categories, agrupades en quatre quadrants.
En el primer quadrant tenim els projectes Kamikaze. Projects condemnats al fracàs des del principi, però on tothom hi vol participar ja que creu que encara que es fracassi l'experiència pot ser gloriosa.
En el segon quadrant hi situa els projectes que anomena de Missió impossible: projectes on els membres de l'equip estan altament motivats i tenen gran capacitat i han de lluitar contra les forces adverses que volen fer fracassar el projecte.
En el tercer quadrant trobam els projectes Ugly, que podríem traduïr per marró, porqueria o qualsevol lindesa semblant. Són projectes on els membres de l'equip es consideren carn de canó, xais sacrificables per tal d'aconseguir el propòsit (no m'agradaria estar en aquest tipus de projectes).
I en el quart quadrant les projectes suicides, on tothom està condemnat i tothom és miserable, on la gent hi fa feina perquè l'alternativa és ser despatxats, encara que saben que no hi ha cap oportunitat per l'èxit.
Si ens trobam en un projecte Death March és important ser-ne conscients, i quan més aviat millor intentar classificar-ho dins alguna d'aquestes categories. Tots els membres de l'equip convé que siguin conscients de amb quin tipus de projecte s'han embarcat, fer feina en un projecte Kamikaze o de Missió impossible pot ser divertit i potser tindrem possibilitat d'èxit, les altres alternatives sols servixen per guanyar temps i anar actualitzant el currículum.
Yourdon introdueix alguns conceptes que m'han interessat especialment: el concepte de prou bo, que ja apareix en Surviving Object-Oriented Projects d'Alistair Cockburn i que Yourdon desenvolupa al capítol cinc i seguents. El concepte de triage, que podríem traduïr per triatge o priorització, la gestió de l'equip i els diferents perfils que hi podem tenir i fa quatre pinzellades damunt la dinàmica de processos [2] aplicada al desenvolupament de programari, per acabar amb tècniques de priorització del temps i gestió del risc, però en aquest darrer cas sense entrar-hi massa.
El llibre és bastant complet, encara que en alguns temes te deixa en ganes de saber-ne més. La bibliografia i les referències que acompanyen a cada capítol també són molt completes i hi ha un parell de referències que es repeteixen al llarg del llibre: PeopleWare, The Mythical Man-Month i Rise and Resurrection of the American Programmer.
No m'ha agradat, en canvi, el que fa molts capítols: Yourdon fa referència a e-mails que ha rebut dels seuls colegues en resposta a preguntes que ha fet a l'hora d'escriure alguns capítols, fins aquí bé, el que no m'agrada és que al final del capítol escriut tot l'e-mail rebut i moltes vegades és paraula per paraula el que ha dit al capítol. Està molt bé això de donar crèdit a qui ha proporcionat la idea, però ho podria fer en forma de reconeixement, nota al peu de pàgina i amb el text complet de l'e-mail a una plana web i no com a transcripció literal al llibre. Dóna la impresió de que sols està allà per omplir i fer embalum a un llibre que si no fos per això no arribaria a les 180 pàgines. La veritat és que a mi tant em fa si el llibre té 180 o 220 pàgines, l'interés del llibre no es pot midar en pàgines sinó en la qualitat del contingut i crec que en aquest cas es prou bo per no tenr-ho que inflar artificialment.
En llegir aquests tipus de llibres, però, me queda un cert regustet amarg, veig que aquestes tècniques, aquests estudis i classificacions estan molt més extesos als Estats Units que a les nostres contrades. Dels llibres es dedueix que existeix una vertadera especialització en la gestió de projectes i un interés en aprendre'n, en formar equips que funcionin, en entendre les dinàmiques del desenvolupament de projectes de programari. Me pareix que tenc tema per un altre apunt...
[1] Politics, politics, politics
[2] Fa ganes de saber-ne més d'això. Pareix prou interessant.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
El teu llenguatge de programació pot fer això?
Escrit per Aaloy a 03 de August , 2006 a les 12:26 a.m.
Aquesta és la pregunta que fa Joel Spolsky al seu blog. Aquesta pregunta li serveix a Joel per introduïr-nos en la programació funcional.
A més de provocar-nos Joel ens anima a aprendre més coses de la programació funcional, d'aquesta capa d'abstracció addicional que ens permet fer les coses d'una altra manera. En Joel diu que si no fos per aquest tipus d'abstracció Google no seria el que és i aprofita per tonar-se a queixar de les escoles de pensament únic, on sols s'ensenya un llenguatge de programació.
Amb això, com en tantes altres coses, no put estar més d'acord amb Joel. Un sol llenguatge no basta, ens limita a pensar sols en el llenguatge que sabem i no ens permet pensar en termes del problema que volem resoldre. El curs de Ruby al que anàrem fa uns dies anava un poc en aquesta línea: veure com altres llenguatges resolen problemes comuns, veure altres maneres de fer coses ...
En aquests moments el meus dos llenguatges de programació principals són Java i Python. Java ho faig servir per guanyar-me les sopes, Python per divertir-me, per la mateixa raó que escric aquest blog. Així que la contestació a la pregunta de Joel, és sí, Python pot fer això! Si el que diu de Google és cert, i no tenc cap motiu per dubtar-ho, no m'extranya gens que aquesta gent hagi contractat al creador de Python, Guido Van Rossum, ja que des dels començaments la programació funcional ha estat una part important del llenguatge.
#!/usr/bin/python
def alert (s):
print s
print "pas 1"
alert ("I'd like some Spaggetti!")
alert ("I'd like some Chocolate Moose!")
def SwedishCheff(food):
alert ("I'd like some %s !" % food)
print "pas 2"
SwedishCheff("Spaghetti")
SwedishCheff("Chocolate Moose")
print "pas 3"
def PutInPot(s):
alert ("pot "+s)
def BoomBoom(s):
alert ("boom "+s)
def Cook (i1, i2, f):
alert ("get the "+ i1)
f(i1)
f(i2)
Cook ("lobster", "water", PutInPot)
Cook ("chicken", "coconut", BoomBoom)
print "pas 4"
#Aquí del que es tracat de de definr la funció en línea.
#Tiram de lambda per això. lamda ens permet definir funcions anònimes
#sempre que el cos sigui una sola expressió.
#El codi javascrip de Joel:
# Cook( "lobster",
# "water",
# function(x) { alert("pot " + x); } );
# Cook( "chicken",
# "coconut",
# function(x) { alert("boom " + x); } );
Cook ("lobster", "water", lambda x: alert("pot "+x))
Cook ("chicken", "coconut", lambda x: alert("boom "+x))
print "pas 5 n-----"
# Aquí Joel defineix la funició map. És una construcció
# pròpia de Python. Així que no necessitam ni fer-la
# la sintaxi és map(funcio, llista)
a = [1,2,3]
a= map (lambda x: x*2, a)
map (alert, a)
# Finalment el reduce tampoc no fa falta definir-la ja
# que també és part del llenguatge.
# de fet podriem fer
suma = lambda x : reduce (lambda i,j : i+j, x)
alert ( suma(a))
b=['a1','b2','c3']
alert( suma(b))
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Què me costarà…?
Escrit per Aaloy a 25 de July , 2006 a les 8:55 p.m.
A la gent que ens dedicam a la programació i a la gestió de projectes és habitual que ens ens demanin que estimem què costa un projecte en termes d'hores de feina. Cada un pot fer servir el mètode d'estimació que millor li vagi: el dit a l'aire, punts funció, Mark II, estimació per casos d'ús, etc.
Aquests mètodes acaben donant un nombre de mesos home, que hi ha que tenir en compte que segons el que demani el client poc te a veure amb el que costarà realment el projecte.
És a dir, per anar bé, el que hem de donar a més del cost calculat en hores de desenvolupament és el cost del projecte en funció de la gent que hi volguem dedicar i de l'aviat que el client vulgui el projecte.
Hi ha tot un conjunt de taules per fer això, les més útils que he vist són les de McConnell, però a vegades no les tenim a mà. Una opció és anar a aquesta web i consultar-les, però en cas de que tampoc poguem fer-ho, perquè estam davant el client i no es cosa de dir-li, "deixa'm un ordenador i ho miro", convé tenir a mà un petit xul·letari que ens ajudi a sortir del pas, sempre diguent, però, que és una estimació subjecte a una valoració més fina.
Partim de l'estimació hen mesos-home que hem fet, suposem per exemple que li deim al nostre client que el cost de desenvolupament del projecte és de 80 mesos-home, el següent que ens demanarà el client és que quan ho podem tenir. Aquí comença la diversió.
Com a opció inicial li podem presentar la opció de desenvolupament òptim. Aquesta opció ve donada per la fórmula
temps = 3 * (estimació) ^(1/3)
Que el factor multiplicador 3 pot variar segons el coneixement que tinguem de la nostra empresa i de l'equip de desenvolupament. Es recomana que el factor estigui entre 2 i 4.
Així doncs la primera aproximació que li donaríem al client és: 13 mesos amb un equip d'entre 6 i 7 desenvolupadors (80/13). Això vol dir que ja hem estat capaços de donar-li una primera xifra: tant de quan seria òptim tenir el projecte acabat, com de quants desenvolupadors necessitarem per tenir-ho a temps. D'aquí ja es dedueix un cost del projecte, ja que basta multiplicar desenvolupadors pel cost de cada un. Suposem a 2000 Eur per més, tendríem un cost de 14.000 Eur mensuals, és a dir, 182.000 Eur [1]. És a dir, el cost de cada mes home és de 2.275 Eur.
Les coses però no solen funcionar així, els 13 mesos proposats potser són massa pel client, ens demana que ho hauríem de tenir en 8 mesos. El cost en aquest cas no és el mateix, ens estan demanant una compressió dels plaços d'entrega, i això vol dir posar més gent al projecte. El primer que hem de fer és calcular el nou esforç
nou esforç = esforç inicial / factor compressió
En el nostre cas
nou esforç = 80 / (8/13) = 130 homes-mes amb un factor de compressió de 0,615.
Aquí ja tenim un petit problema ja que el factor de compressió més gran que es considera factible està entre 0,75 i 0,80. Siem optimistes i suposem un factor de 0,75, ja que tenim un equip molt bo. Això vol dir que la data d'entrega més optimista que podem donar és de 9,75 mesos, 10 mesos per no anar massa estrets. Si hem fet bé el càlcul de dedicació una data més curta implica anar cap a un "Death March project" i hem de dedicar els nostres millors esforços a fer-ho entendre al client.
Suposem doncs que accepta la nova data, l'eforç que li hem de presentar és ara
nou esforç = 80 / 0,75 = 106,7 mesos-home ~ 107
amb un equip d'onze programadors. Això vol dir pujar el cost del projecte fins als 220.000 Eur.
Són sols quatre números però que ens ajuden a veure com un desenvolupament que s'allunyi d'unes dates d'entrega òptimes s'encareix, bé en termes de cost real o bé en termes de cost en personal, obligat hores extres no renumerades, que es vulgui reconèixer o no a la llarga passa factura a l'empresa. Els pressuposts tancats, doncs s'han de fer no tan sols en termes d'hores calculades, sinó també tenint en compte el cost addicional que hi ha quan escurçam el temps d'entrega.
Així que a la pregunta de què costarà un projecte, hem de demanar a més de les especificacions per poder-ne fer la valoració, el temps en que el client ho vol tenir, i si més no, donar-li l'alternativa d'allargar el desenvolupament i disminuir-ne el cost.
--
[1] Les xifres són redones i inventades, no cal dir-ho supòs.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Lectura a la fresca
Escrit per Aaloy a 23 de July , 2006 a les 10:26 p.m.
L'estiu és una bona èpica per llegir, el dia s'allarga i els vespres fa ganes estar una estoneta més a la fresca llegint, sempre i quant els moscarts no ho impedeixin.
Aquest cap de setmana he acabat de llegir el llibre de Joel on Sofware. He de dir que no m'ha decebut. Hi ha alguns capítols fluixets i algunes contradiccions (sobretot quan parla de llenguatges de programació i .Net) però en definitiva el llibre és molt aprofitable. Potser tècnicament no arriba al nivell d'autors com De Marco o McConnell, però té un llenguatge molt proper i entenidor.
Són especialment bons els capítols dedicatas a la gestió de projectes, al test de Joel, del que ja n'he parlat a aquest blog i els consells que dóna referents a la gestió de projectes i desenvolupadors.
Al llarg del llibre Joel posa molt a Microsoft com a exemple de bones pràctiques, de quan ell hi era, diu, però tampoc se n'està de criticar-ho quan fa falta. És força interessant l'anàlisi que fa al capítol 42 quan diu que Microsoft ha perdut la guerra de les APIs. També és molt interessant el capítol que dedica a la microeconomia, és molt de l'estil d'una conferència que va fer Ricardo Galli a les primeres jornades de Bulma a campos. He de dir que tot i que Joel ho explica molt bé la d'En Ricardo era encara millor. No sé si La té publicada a Bulma. En Pau que està en tot m'ha passat l'enllaç
En definitiva, un llibre per tenir-ho aprop i anar rellegint de tant en tant capítols seleccionats. Potser no en treurem moltes dades ni estadístiques del llibre, però segur que raons per fer les coses "com toca".
Com que l'altra dia els d'Amazon es portaren i m'entegaren les comandes força aviat puc seguir amb el mateix tipus de lectura estiuenca. Ara li toca el torn a Walzing with Bears dels autors de Peopleware. L'he començat a fullejar i per ara pinta molt bé. El llibre va de gestió de projectes i concretament de la gestió del risc en els projectes. Una de les primeres idees que hi ha és que si un projecte no té risc no val la pena fer-ho. Qui no s'arrisca no pispa! :)
La veritat és que no sabia si seguir amb Walzing with Bears o amb Death March d'Edward Yourdon. Gestió del risc o com sobreviure a projectes condemnats? He optat per l'optimisme moderat i anar cap a la gestió del risc, la lectura de Death March potser ara mateix encara no me fa falta. Esper que no ho necessiti! :)
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Curs de Ruby
Escrit per Aaloy a 18 de July , 2006 a les 1:08 a.m.
Avui hem començat el curs de Ruby organitzat per la CAEB. Per ara la cosa pinta bé. He estat llegint coses del Ruby, especialment des de que hi va haver el boom del Ruby on Rails (RoR pels amics), i un curset de 20 hores com aquest pot ajudar bastant a aclarir coses. Encara que hi ha força informació a la xarxa és molt més interessant i productiu que t'ho conti algú com en Guillem que anar-te cercant la vida tu mateix.
Aquests darrers dies han aparegut algunes compartives interesants damunt els bastiments de persistència basats en el model MVC que han sorgit recentment:
- http://wiki.rubyonrails.com/rails/pages/Framework+Performance
- http://www.cms.rk.edu.pl/benchmark.html
La primera compara Django, RoR i un bastiment MVC per PHP anomenat Symfony. La segona compara Django amb una altra bastiment molt més 'a la Rails' però fet amb Python com és Pylons.
Personalment he de dir que m'agrada molt la claritat que té Django i me n'alegra comprovar que és el bastiment que surt més ben parat de les comparatives. Tot i això en totes podem veure que qualsevol dels bastiments aguanta prou bé una càrrega que ja la voldria qualsevol pel seu web. A més la quantitat de peticions que és capaç d'aguantar el bastiment depén també de la màquina, amb la qual cosa tenim que podem augmentar moltíssim el nombre de peticions que podem aguantar sols fent una inversió major en la màquina.
En Joel Spolsky apunta al seu blog una presentació feta per Sean Kelly de la NASA comparant Django, Rails, Zope, TurboGears i J2EE i ens avisa als programadors de J2EE que després de veure la presentació mai més voldrem saber res de J2EE per fer aplicacions web.
Bé, ara per ara encara m'estic devallant la presentació (ONO no m'ha volgut/pogut posar la connexió a casa i encara estic amb una ADSL, però això és un altra tema), però amb el que ja conec d'aquests bastiments i el que conec de J2EE no crec que me n'endugui cap sorpresa. Per moltes aplicacions la complexitat que suposa el J2EE no és necessària, més quan la suposada escalabilitat que ens dona el J2EE es veu superada amb una mínima inversió en màquina i fent servir un d'aquests bastiments.
Sovint el problema és convèncer a uns i altres de que la solució basada en lleguatges dinàmiques és més adeqüada per aquell problema que la basada en J2EE, però clar, tenim el problema de la uniformitat i dels consultors. La uniformitat en tant en quant pareix que els programadors sols han de ser especialistes en un sol llenguatge i els consultors que defugen de recomanar qualsevol cosa que no soni a J2EE i que són els mateixos que fa un grapat d'anys lloaven les meravelles dels EJBs.
Estam anant al curs de Rails perquè encara que no sé si el farem servir a l'Empresa, segur que no ens farà gens de mal conèixer un nou llenguatge, sempre se n'aprenen coses i pots agafar moltes idees. Si sols conèixes un llenguatge la teva programació es veu massa condicionada pel que es pot fer en aquell llenguatge i deixes d'explorar altres alternatives potser més adients. Personalment crec que hi haurà certes aplicacions, especialment les que han de connectar amb bases de dades existents que són més senzilles de fer anar amb tecnologia J2EE de cotenidor fi (Hibernate+Spring+Jsp damunt Tomcat) i que d'altres és molt millor desenvolupar-les amb qualsevol dels bastiments de les comparacions anteriors.
La falta d'uniformitat no és un inconvenient, és un avantatge competitiu en aquests casos, ara sols falta convèncer als consultors ...
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Joel On Sofware: El llibre
Escrit per Aaloy a 07 de July , 2006 a les 5:09 p.m.
L'altra dia vaig rebre del llibre de Joen on Sofware via Amazon. El llibre, publicat per l'editorial Apress recull bona part dels articles publicats per Joel Spolsky al seu blog. [3]
Tot i que els articles es poden llegir directament per la web, tenir un recull així en format llibre és molt interessant, més aquests dies d'estiu, on tenir un llibre i llegir-ho a la fresca és molt més còmode que tenir l'escalforeta del portàtil (per que en tengui).
L'estic fullejant i me pareix que disfrutaré molt de la lectura. Aquest home és un gran comunicador, amb unes idees força interessants [1]. Per exemple, a un dels articles que he anat per atzar, tracta de l'inutilitat de gestionar un projecte amb un sistema Microsoft Project. Que el programa sigui de Microsoft o sigui el project tant fa, la idea és que un gestor de projectes d'aquest estil encaixa molt malament amb el desenvolupament de programari. Hi estic totalment d'acord. Darrerament sols faig servir el Planner o el DotProject per poder fer el dibuixet inicial, després la gestió del projecte és molt més senzilla de seguir amb eines com Trac o directament amb un sistema de ticketing.
Els de Debian supòs també són de la mateixa opinió, ja que pel que explicà n'Amaya i n'Adeodato a les Jornades de Bulma, tot allà es fa mitjançant un ticket al Bugzilla.
Com deia, el bo que té aquest autor és la claretat amb que s'expressa. En aquest tema, per exemple, justifica que no fa falta cap project perquè la gent, els programadors, no sóm intercanviables. Que corregir un error duu molt més temps a algú que no ha fet el codi que a l'autor, que un expert en web services [2] no és fàcilment substituïble per algú que fins el moment s'ha estat encarregant de la capa de persistència. Així doncs un dels punts forts d'aquests programes de gestió, com és l'assignació de recursos resulta que no es pot fer servir.
L'altra punt fort dels programes de gestió de projectes és el de les dependències. Poder canviar i gestionar dependències es ven com un gran avanç. Tal com diu Joel a l'article en programació les dependències solen ser tan obvies que gairebé no fa falta ni tenir-ne cura del seguiment. Complilareu el programa si encara no l'heu codificat? Els gestors de projectes animen a posar una dependència en aquestes fases, però es tan obvi que resulta un poc còmic.
Supòs que hi haurà gent que dirà que els projectes de programació sí que es poden controlar perfectament amb un Project, però m'agradaria saber el nombre de projectes que se'ls han retrassat, o com poden controlar la feina que fa cada programador sense tenir que anar cada matí a fer la ronda.
El sistemes com Trac o la gestió de projectes mitjançant sistemes de Ticketing permeten conèixer l'estat del projecte veient la feina que s'ha fet cada dia, els tickets que s'han tancat, els tickets que queden, si han aparegut nous errors. Està clar que això implica més feina, s'ha de ser curós a l'hora d'entrar-ho tot com a ticket, però a canvi tenin um projecte molt més controlat i no un sols dibuixet amb barretes de colorins.
--------------
[1] I va fer feina per Microsoft!
[2] Està més de moda que els sockets que fa servir Joel a l'article :)
[3] Les gràcies novament a Juan Moreno per passar-me l'enllaç.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Garrigues
Escrit per Aaloy a 27 de June , 2006 a les 8:07 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Jo no vull ser malpensat, però…
Escrit per Aaloy a 26 de June , 2006 a les 9:06 p.m.
Matas compra un palacio de más de 800 millones de pesetas, l'enllaç l'he trobat via menéame. Segur segur, que hi ha una explicació ben lògica per a tot això. El sou de ministre i el de president de la Comunitat ben invertits i amb una política d'estalvi auster i bones inversions fan miracles. O potser una hipoteca a 40 anys?
No estaria de més que si la notícia és veritat el President ens explicàs la seva recepta per l'èxit. D'aquí no res de ministre d'economia. Espera, aquest home no era ítim de Zaplana, aquell que va dir que estava en política per enriquir-se?
Res, que això del reportatge de TV3 m'ha deixat molt tocat. Ja desconfio fins i tot d'aquests dos bons prohomes.
Al proper apunt ....Parlarem d'informàtica!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: General
30′ dedicat a Eivissa
Escrit per Aaloy a 25 de June , 2006 a les 11:52 p.m.
Traducciones/Translations by apertium
3 comentaris, 0 trackbacks (URL) , Tags: General
Programari lliure - Es pot dir més fort però no més clar
Escrit per Aaloy a 25 de June , 2006 a les 7:50 p.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Tancar tickets amb Trac a partir de comentaris al subversion
Escrit per Aaloy a 22 de June , 2006 a les 7:49 p.m.
- Cercam l'arxiu trac-post-commit-hook.gz . A debian el tenc a /usr/share/doc/trac/contrib. El descomprimirem al directori que més ens agradi i a l'unic arxiu que conté trac-post-commit-hook li dorarem el mateixos permisos d'execució que tengui l'usuari http.
- Anam al repositori subversion, ens situam al repositori del nostre projecte i anam al directori hooks. Reanomenarem el fitxer post-commit.tmpl com a post-commit i li donam també permisos d'execució per l'usuari de subversion.
- Editam aquest arxiu, de manera que després dels comentaris quedi:
REPOS="$1" REV="$2" LOG=`/usr/bin/svnlook log -r $REV $REPOS` AUTHOR=`/usr/bin/svnlook author -r $REV $REPOS` TRAC_ENV='/somewhere/trac/project/' TRAC_URL='http://trac.mysite.com/project/' /usr/bin/python /usr/local/src/trac/contrib/trac-post-commit-hook -p "$TRAC_ENV" -r "$REV" -u "$AUTHOR" -m "$LOG" -s "$TRAC_URL"
/usr/local/src/trac/contrib/trac-post-commit-hookescriurem la ruta allà on hem posat l'arxiu.Això és tot. Que ho disfruteu!
Traducciones/Translations by apertium
2 comentaris, 1 trackback (URL) , Tags: Informàtica
¿QUIERES SER UN INGENIERO DE DESARROLLO JAVA?
Escrit per Aaloy a 17 de June , 2006 a les 11:30 a.m.
Amb aquest títol comença una oferta de feina de l'empresa IN2 apareguda a Infojobs els 16-06-06. Aquesta gent cerca 15 titulats o gent a punt de titular-se, amb un bon expedient acadèmic i amb prou coneixements de Java, J2EE, J2SE i BBDD relacionals com per poder seguir un curs avançat de programació de 250 hores.
Així com avança l'anunci la cosa es comença a desbaratar:
Primer faran una preselecció per veure qui pot anar al curs i qui no. Això no és cap mala cosa en sí mateixa. Si es cerca gent que pugui seguir el curs, es lògic que vulguin garantir-se de que ja es té un cert nivell i que el curs podrà avançar amb prou rapidesa.
La cosa està en que el curs va, pareix, del 15 de septembre al 30 d'octubre. Mala cosa per la gent que estigui al darrer curs de carrera, ja que segurament es perdrà el començament del curs. El pitjor però és que es tracta d'un curs gratuito y no remunerado. I que després de superar l'examen final, als millors se'ls contractarà per un any a l'empresa amb un sou, segons diu a l'oferta, de 12.000 € bruts a l'any. És a dir, que una vegada descomptem imposts no quaran uns 800 euros nets al més (en 14 pagues).
Donat que hi ha un procés de selecció previ, se suposa que el curs hauria d'entrar ja dins el període de prova de l'empresa i per tant hauria de ser remunerat. És el més normal, ja que d'aquesta manera volen estalviar-se els sous que haurien de pagar si ja contractàssin el personal que superàs la primera selecció. La contractació inicial granteix a més que la majoria dels que segueixin el curs quedaran a l'empresa (al manco en aquest país) i fent que el període de prova coincideixi amb el curs, suposa que l'empresa no tindria despeses per acomiadar la gent que no cumplís les espectatives.
El que fan amb aquesta oferta és dir que necessiten gent, però que no volen pagar-la, y que no tenen un depertament de selecció prou bo, per poder destriar la gent que els interessa a la prova inicial. No sé si és això el que volien transmetre, però així ho interpret jo.
També puc fer-ne una altra interpretació: necessiten gent, però no saben exactament quanta, el client no s'acaba de decidir, però si es decideix no tindran mans per assumir el projecte. Això vol dir fer una inversió mínima, i aquesta passa per tenir ja la gent seleccionada i formada i després ja veurem. Sempre se'ls pot dir que no han passat l'examen final i la inversió s'haurà limitat a les hores del formador. Un risc controla. Bo per l'empresa però no tant pel treballador.
L'altra cosa que us podeu imaginar que m'ha sobtat és el sou que volen pagar. Volen gent mig formada, amb bon expedient, que vulgui invertir dos mesos de la seva vida en un curs per veure si després pot guanyar 800 Eur al més. No sé què pensareu vosaltres, però una cosa i l'altra no lliguen massa. La gent formada i ben preparada és prou capaç de trobar feines de més de 800 Eur al més el primer any, i més en les tecnologies que demanen. El perfil de gent que demana IN2 correspon també a gent prou bona per ser capaç si cal d'autoformar-se en les tecnologies que demana IN2. La veritat és que m'ha sobtat el poc que valoren els seus futurs empleats, i més quan l'empresa es defineix com "una Ingeniería de Desarrollo de Software, Formada por Ingenieros para dar soluciones de Ingeniería."
IN2 com a empresa privada que és pot fer el que vol, pot oferir el que vulgui com a sou, i potser hi haurà gent que hi anirà a veure què tal, però personalment si hagués de contractar la gent que ha acceptat la feina m'ho pensaria molt. Em preocupa que una persona capaç i ben formada es valori tan poc a sí mateixa, em dona a entendre que hi ha alguna cosa que no acaba de funcionar, que no lliga.
Ei! Si voleu fer un curs gratuït, potser us interessarà! Personalment jo ja no invertiria massa en Struts, convé conéixer-lo i dedicar-hi unes setmanes, però després ja aniria cap a Spring i el seu MVC. La potència i flexibilitat que dona és molt superior a Struts. És un bastiment que agafant la filosofia del primer ha intentat (i al meu veure ha aconseguit) eliminar els majors emperons d'Struts.
Vosaltres mateixos...
Via meneame he vist aquest post que fa referència al que cobren les consultores.
Traducciones/Translations by apertium
5 comentaris, 1 trackback (URL) , Tags: Informàtica Java
Comparació
Escrit per Aaloy a 15 de June , 2006 a les 6:35 p.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Allibequè?
Escrit per Aaloy a 05 de June , 2006 a les 1:30 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Model de components per la web
Escrit per Aaloy a 04 de June , 2006 a les 6:29 p.m.
- Davant les noves tecnologies, els nous corrents de pensament en pogramació, quin hem de triar?
- La programació web s'ha d'assemblar cada cop més a la programació de client gruixat, on hi ha components que ho encapsulen tot? Es a dir, encapsular HTML+css+javascript+connexió al servidor és el futur?
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Sorprés pel programari lliure?!
Escrit per Aaloy a 02 de June , 2006 a les 10:16 p.m.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
wxPython in Action
Escrit per Aaloy a 23 de May , 2006 a les 12:59 a.m.
Per la llista de Python, concretament a pun apunt del Dr. Dobb's Python-URL! m'he assabentat de l'existència del llibre wxPython in Action i de la possibilitat de fullejar un dels seus capítols a la web pythontrheads.
Això són bones notícies, ja que vol dir que a partir d'ara tindrem més documentació d'aquesta excel·lent llibreria gràfica. Pels qui no la coneguin wxPython és un embolcall (binding) per Python de les llibreries wxWidgets, abans conegudes com wxWindows. Aquestes llibreries són portables, potents i no gaire pesades. L'emperò és que la seva gestió d'events no és tan neta com el mètode signal/slot de les Qt.
Com a avantatge tenim els nombrosos exemples que hi ha per fer gairebé de tot el que se'ns acudi en termes d'interfície gràfica i dissenyadors d'interfícies d'usuari com les wxGlade, o un IDE com el Boa Constructor .
Les wxPython són una opció a tenir en compte si ens plantejam fer una interfície d'usuari que sigui lleugera i portable, i m'atreviré a afegir dues característiques més: mantenible gràcies a la claretat i senzillesa de Python i divertida de programar.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica Python
El meu malson té nom, o millor dit número
Escrit per Aaloy a 22 de May , 2006 a les 10:19 p.m.
Fa poc vaig comprar per correu una Epson multifució, una Epson Stylus Photo RX640, esperant que com la RX630 està ben soportada per Linux aquesta també ho estaria. Error! O millor dit, error a mitges, ja que la impressora potser funcionaria, si no fos que pocs dies abans m'havia actualitzat a la nova beta d'Ubuntu per PPC. Mal fet? Depén, hom ja sap el que es pot esperar de les betas, el que no m'esperava és que tengués un error tan greu.
He de dir, però, quen no pareix ser un error sols de la Ubuntu, sino que hi ha més gent queixant-se del mateix, no ja de la compatiblitat de la impressora, sinó del missatge d'error. El problema de fons és que l'error fa que no es detecti bé el port usb al qual està connectat la impresora i per tant ja no és quelcom relacionat amb la compatibilitat o no d'un model, sinó un error molt més de fons.
Així un printconf amolla un desesperant
*** glibc detected *** free(): invalid next size (normal): 0x1013f178 ***
Unable to read printer database.
Please ensure the "foomatic-db" package is installed properly. </code>
fotuda i ben fotuda!
Ara a esperar que es resolgui l'error, segurament relacionat amb el que està produïnt aquest missatge a la sortida del dmesg
[121680.002506] drivers/usb/class/usblp.c: v0.13: USB Printer Device Class
driver
[121680.037076] ioctl32(hald-probe-prin:404): Unknown cmd fd(4)
cmd(44005001){04} arg(ffac4518) on /dev/usblp0 </code>
Pel que es veu és una errada de programació, que té a veure amb la conversió del codi de 32 bits a codi de 64 bits. El que em té amb la mosca darrera l'orella, però és que a la gent que està amb paquets per i386 també els passa.
Cercant-ho per debian bugs m'he trobat que aquest error ja té un número el 366254 i que ja duu unes quantes setmanes pendent. Ara sols queda esperar i anant vigilant les actualitzacions. Una bona manera d'estalviar paper i tinta :)
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Moviments al sector hoteler de Mallorca? (II)
Escrit per Aaloy a 14 de May , 2006 a les 5:48 p.m.
| [1] | Stallman diu que la vertadera llibertat no és la d'elegir amo, sinó la de no tenir amo, però per ara ens quedarem amb el mal menor. |
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Actualitzat a Drapper Beta 7
Escrit per Aaloy a 08 de May , 2006 a les 11:45 p.m.
gksudo "update-manager -d"La instrucció màgica que m'ha permés l'actualització :) Això s'hi, s'ha descarregat 900 Mb d'arxius i han estat un bon grapat d'hores entre la descàrrega i la pròpia actualització de programes. He de dir que s'ho val. L'aspecte gràfic està molt més cuidat que a l'anterior versió, hi ha pràcticament les darreres versions de tots el principals programes, i el que és més important, se nota una millora apreciable del rendiment. Pareix que lo de que tindríen molts més programes compilats a 64 bits anava ben en sèrio. Amb el que ho he notat més és amb l'Evolution, ara la càrrega és pràcticament instantànea, així com l'aplicació dels filtres de correu. La càrrega de tot l'escriptori també és molt més ràpida que abans, i aplicacions tan pesades com l'OpenOffice també se'n veuen beneficiades d'aquesta actualització. Per la part d'escriptori a casa faig servir Gnome, a la feina KDE. En ambdós escriptoris hi tenc instalades les aplicacions que més m'agraden de cada un. La llibertat del GNULinux és també la llibertat de poder-te configurar el teu entorn de treball (o de diversió) de la manera que vulguis.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Moviments al sector hoteler de Mallorca?
Escrit per Aaloy a 06 de May , 2006 a les 9:56 a.m.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Django. Integració de la branca M-R
Escrit per Aaloy a 03 de May , 2006 a les 12:10 a.m.
El primer de maig es produï la integració de la branca M-R, per magic removal, dins la línea de desenvolupament principal, el trunk dels projectes subversion. Aquesta integració marca una fita important en el que és el desenvolupament d'aquest bastiment de programació.
El M-R, ara integrat a trunk, proporciona un espai de noms molt més clar, sense la "màgia" de la versió anterior. Ara per fer servir un model la importació és pràcticament directa, lògica, més de l'estil dels objectes de Python.
La integració també implica nombrosos canvis a l'espai de nom, a la nomelclatura de les plantilles, a l'API de base de dades, en definitiva, una millora llargament esperada que farà encara més atractiu aquest bastiment de programació i que esper signifiqui la seva empenta definitiva.
Fins ara molts projectes nous anaven a mig gas esperant que se produïs aquesta integració, ja que sols els més agoserats s'atrevien a fer servir la branca M-R davant una branca principal força estable i els que començaven nous projectes no sabien ben bé per on tirar. La integració d'aquesta branca esvaeix molts dubtes i de ben segur implicarà que veurem grans coses amb fetes amb Django durant els propers mesos.
L'anunci oficial de la integració és a http://www.djangoproject.com/weblog/2006/may/01/magicremoval/
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
La “oficina española de patentes y marcas” sols per IE
Escrit per Aaloy a 28 de April , 2006 a les 10:31 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Gestió integrada de projectes de programari
Escrit per Aaloy a 26 de April , 2006 a les 10:24 p.m.
- Integració amb subversion
- Wiki per la documentació.
- Gestió de tickets amb capacitat de personalització dels elements.
- Gestió de projectes basada en fites.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Resaltat de sintaxi per les plantilles de Django
Escrit per Aaloy a 17 de April , 2006 a les 10:16 p.m.
La Comunitat del programari lliure no deixa de donar-nos sorpreses i alegries. De la llista de Django m'ha arribat un enllà a un arixu de resaltat de sintaxi per les plantilles de Django http://www.vim.org/scripts/script.php?script_id=1487 d'un tal Dave Hodder.
Aquest home supòs que deu estar utilitzan Django pels seus desenvolupaments i fent servir Vim com a editor. Com que li era útil doncs ha creat la utilitat i l'ha posada a disposició de la comunitat per a que tothom se'n pugui beneficiar. És l'esperit del programari lliure!
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Full de càlcul com a base de dades
Escrit per Aaloy a 14 de April , 2006 a les 8:36 p.m.
- Informació duplicada, no mantinguda i repartida per infinitats de fulls de càlculs, repartis a la seva vegada per tots els ordinadors de la companyia.
- Dificulta pel saber qui té dades personal amagatzemades dins un full de càlcul. Això a la llarga pot comportar un problema importat davant l'agència de protecció de dades, ja que són fitxer de dades i com a tal s'haurien de tenir controlats. Imaginem per exemple que algú d'un gabinet mèdic duu la llista de les seves visites dins el full de càlcul. Com podrem garantir que tengui les "mesures de seguretat suficients"?. Si als cinc minuts de cercar per internet podem trobar com botar-nos l'encriptació d'un Excel. I no parlem ja de les còpies de seguretat ni registre dels acessos al sistema. Les fulles de càlcul no són per això!
- Dificultat per compartir i mantenir les dades. Les fulles de càlcul no són multiusuari, compartir les dades implica sols deixar-les en un directori comparti i sovint vol dir que s'envia per correu tota la fulla de càlcul. Què passa quan tenim les oficines connectades per una WAN? Doncs que hi ha tendència a compartir directoris sols per poder accedir a dades amagatzemades dins fulles de càlcul.
- Incapacitat de créixer. La quantitat de files que pot manejar un full de càlcul és molt limitat si ho comparam amb el que pot manegar un gestor de BD mitjà.
- Rendiment. He vist gent amb fulls de càlcul de fins a 30 MB de dades queixant-se perquè del lent que carregava l'aplicatiu. :(
- Seguretat. L'accés a la informació no està restringit de la manera com ho està una base de dades. És molt més bo de fer perdre informació, o que s'enviïn per correu electrònic les dades de l'empresa.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
The Development Abstraction Layer
Escrit per Aaloy a 13 de April , 2006 a les 1:46 p.m.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica
The Design of everyday things
Escrit per Aaloy a 13 de April , 2006 a les 1:32 p.m.
Traducciones/Translations by apertium
4 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
Jornades Bulmeres (3)
Escrit per Aaloy a 09 de April , 2006 a les 7:39 p.m.
Traducciones/Translations by apertium
5 comentaris, 3 trackbacks (URL) , Tags: Informàtica
Jornades Bulmeres (2)
Escrit per Aaloy a 07 de April , 2006 a les 12:42 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Les III Jornades Bulmeres
Escrit per Aaloy a 06 de April , 2006 a les 12:08 a.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Django i utilitats Javascript
Escrit per Aaloy a 05 de March , 2006 a les 10:23 p.m.
Aquest cap de setmana m'he dedicat a fer quatre coses amb Django. Cada cop m'agrada més aquest bastiment. A cada actualització milloren la potència de les plantilles i la funcionalitat del bastiment.
Esper que d'aquí poc la branca anomenada "magic removal" s'integri a la branca principal. Això serà que el bastiment sigui molt més pitònic i expressions que ara patinen un poc deixin de fer-ho. A més esper que arreglin els avisos d'error que dóna el pylint quan no troba una funció que Django defineix en temps d'execució.
He provat què tal se comportaven les plantilles amb le javascrip, i la veritat que molt bé per ara. L'herència de plantilles, tot i que no és molt potent, sí que és molt funcional i fent un bon us dels blocks podem tenir distintes llibreries de javascript segons en convengui a cada pàgina.
Parlant de llibreries i utlitats javascript, n'he trobades dues que van força bé:
- http://www.workingwith.me.uk/articles/scripting/standardista_table_sorting. Javascript per l'ordenació de taules. Va força bé. Sols hi ha que tenir la precaució de que no hi hagi espais en els nombres, ja que en cas contrari els tracta i ordena com a texte.
- qtip És una petita utilita per a mostrar un texte d'ajuda associat a qualsevol tag html.
Me pareix que a partir d'ara aquestes llibreries formaran part del meu repositori d'eines. Les he provades tant amb Mozilla com amb Konqueror i no donen cap problema, la seva utilització és molt fàcil i pesen poc.
També que quedat molt sorprés de la facilitat per exentendre les plantilles i els filtres que té Django. Necessitava un formatejador de nombres per passar un float a una cadena en format moneda, també necessitava l'equivalent a pessetes de la quantitat. Com que això no és lògica de negoci ni res, consider que està bé fer-ho a la capa de presentació, així que he seguit les indicacions que hi havia a un comentari de la documentació de django i la cosa ha anat així:
- Cream un paquet templatetags dins la nostra aplicació.
- Cream l'arxiu __init__.py
- Cream l'arxiu que contindrà els filtres
- Important el paquet amb els filtres a l'arxiu de vistes
- Importam i utilitzam el nou filtre dins la plantilla
La conversió de flotant a cadena no és meva, la vaig trobar a un recull de receptes de Python i l'he adaptada
Així:
filtre.py
"""Filtre per convertir un numero expresat en euros
a pessetes"""
def eurtoptas(value):
value = value * 166.386
return moneyfmt(value, places=2)
register.filter(eurtoptas)
def moneyfmt(value, places=2, curr='', sep='.', dp=',',
pos='', neg='-', trailneg=''):
"""Convert Decimal to a money formatted string.
places: required number of places after the decimal point
curr: optional currency symbol before the sign (may be blank)
sep: optional grouping separator (comma, period, space, or blank)
dp: decimal point indicator (comma or period)
only specify as blank when places is zero
pos: optional sign for positive numbers: '+', space or blank
neg: optional sign for negative numbers: '-', '(', space or blank
trailneg:optional trailing minus indicator: '-', ')', space or blank
>>> d = Decimal('-1234567.8901')
>>> moneyfmt(d, curr='$')
'-$1,234,567.89'
>>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')
'1.234.568-'
>>> moneyfmt(d, curr='$', neg='(', trailneg=')')
'($1,234,567.89)'
>>> moneyfmt(Decimal(123456789), sep=' ')
'123 456 789.00'
>>> moneyfmt(Decimal('-0.02'), neg='< ', trailneg='>')
'< .02>'
"""
value = Decimal(str(value))
q = Decimal((0, (1,), -places)) # 2 places --> '0.01'
sign, digits, exp = value.quantize(q).as_tuple()
assert exp == -places
result = []
digits = map(str, digits)
build, next = result.append, digits.pop
if sign:
build(trailneg)
for i in range(places):
if digits:
build(next())
else:
build('0')
build(dp)
i = 0
while digits:
build(next())
i += 1
if i == 3 and digits:
i = 0
build(sep)
build(curr)
if sign:
build(neg)
else:
build(pos)
result.reverse()
return ''.join(result)
register.filter(moneyfmt)
a views.py he afegit
from aplicacio.apps.modul.templatetags import filtre
i a la plantilla
{% load filtre %}
i per fer-ho servir per exemple:
{{item.preu|eurtoptas}}
Això lligat al qtip implica que he pogut posar fàcilment el preu amb euros i després aplical el filtre dins l'ajuda per a mostrar la conversió a pessetes. Jo ho he trobat força elegant, però clar, m'agrada Python :)
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Coneixement compartit
Escrit per Aaloy a 24 de February , 2006 a les 12:44 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
En el principio fue la línea de comandos
Escrit per Aaloy a 23 de February , 2006 a les 8:49 p.m.
Traducciones/Translations by apertium
0 comentaris, 1 trackback (URL) , Tags: Informàtica
Una de llibres
Escrit per Aaloy a 17 de February , 2006 a les 12:37 a.m.
- Mundo anillo de Larry Niven. Editat per La Factoria de Ideas. Aquest llibre el vaig llegir ja fa molts anys, en prèstec de la biblioteca d'Alcúdia (Mai agrariré prou a les Joanes que possàssin tanta cura en la compra de novel·les de ciència ficció) junt alguns que completen la saga. Em va agradar molt i tenc ganes de tornar a llegir-ho.
- Estación de tránsito. De Clifford D. Simak. Editat per minotauro. D'aquesta novel·la n'havia sentit a parlar molt però no havia tingut el plaer de llegir-la. És un dels clàssics de la ciència ficció, no té tanta fama com Mundo anillo, però he de dir que em va agradar força. La novel·la ens situa en la pell del guardià d'una estació de trànsit pels viatges estelars. Un guardià preocupat per entendre les diverses cultures que el visiten, sense perjudicis. Molt recomanable!
- WIN WIN de George Fuller. Editat per Gestión 2000.com. D'aquest llibre també n'havia sentit parlar força i per ara m'està agradant, l'edició no és gaire bona però el contingut està be. Explica com afrontar situacions quotidianes a la feina on la capacitat de negociació i empatia són necessàries per a la resolució de conflictes. Com el seu nom indica no es tracta d'imposar-se a l'altra, sinó d'arribar a situacions on tothom hi guanyi.
- Gestión de proyectos de Gregory M. Horine. Editat per Anaya. D'aquest encar no puc dir massa cosa. Tan just he començat a llegir-ho. Ho vaig comprar per tenir un altre referent en la gestió de projectes, un referent no tant lligat a la informàtica i sí a la gestió de projectes genèrica. Per la gestió de projectes informàtics Mc Connel, De Marco, Cockburn, Beck i Brooks són bàsicament les meves fonts, sense oblidar en Joel, que té alguns articles força bons.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica Llibres i revistes
Aquest blog Wordpress ja està en català
Escrit per Aaloy a 14 de February , 2006 a les 8:44 p.m.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
BlocCat
Escrit per Aaloy a 11 de February , 2006 a les 7:51 p.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: General
TrimPath
Escrit per Aaloy a 10 de February , 2006 a les 9:20 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Borland, .cat i sentit de l’humor
Escrit per Aaloy a 09 de February , 2006 a les 11 p.m.
- Massa lligada a estratègies comercials. Actualitzacions cada cop més cares i una estratègia de Borland cap a les bases de dades obertes poc clara.
- L'estratègia Linux com en el tema de les BD per mi també va ser un fracàs i una decepció. Esperava que Borland alliberàs Delphi per Linux i es dedicàs a vendre serveis (que es el que acabarà fent si no la compra algú). Si ho hagués fet potser ara no hauria de malvendre.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Alliberat PyDev 1.0
Escrit per Aaloy a 06 de February , 2006 a les 10:53 p.m.
PyDev els plugins per a desenvolupar aplicacions Python per a Eclipse han arribat a la versió 1.0. A aquests plugins els hi faltava molt poquet per arribar a la maduresa i crec sincerament que ho han aconseguit amb aquesta versió.
A la potència de l'IDE d'Eclipse s'afegeix la capacitat de crear projectes Python, d'utilitzar el bastiment de depuració integrat en Eclipse, resaltat de sintaxi, plantilles, etc. Si a aixo ho afegim al que ja ens dona l'Eclipse de sèrie tenim un entorn de desenvolupament dels més potents que hi ha.
Més informació a PyDev
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Els blogs arriben a la UOC
Escrit per Aaloy a 05 de February , 2006 a les 9:21 p.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Actualitzat a Wordpress 2.0.1
Escrit per Aaloy a 03 de February , 2006 a les 10:48 p.m.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Paquets debian per Ubuntu breezy PPC 64
Escrit per Aaloy a 03 de February , 2006 a les 1:56 a.m.
Traducciones/Translations by apertium
1 comentari, 0 trackbacks (URL) , Tags: Informàtica
Cada llibre té el seu moment
Escrit per Aaloy a 02 de February , 2006 a les 12:59 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Els enginyers informàtics han de saber programar
Escrit per Aaloy a 28 de January , 2006 a les 9:23 p.m.
Traducciones/Translations by apertium
2 comentaris, 0 trackbacks (URL) , Tags: Informàtica
Apencitis
Escrit per Aaloy a 22 de January , 2006 a les 8 p.m.
- Comercials Són aquests consultors que van a comisió damunt les vendes que fan. Conèixen un parell de productes i aquí s'acaba tot. La seva visió està limitada per les comisions que tenen de cada producte i sovint no recomanan el millor pel client, sinó el millor per les seves butxaques. Desgraciadament són la majoria.
- Consultors independents. No estan lligats a cada empresa. Conèixens molts productes diferents i tenen un coneixment ample del sector informàtic i del sector on es mou el client. Estant contínuament temptats pel costat fosc i corren el risc de convertir-se en consultors de tipus comercial, però els que no cauen en les temptacions són capaços de fer una recomanació no basada en marques sinó en tecnologies i necessitats.
- Experts.Tenen un coneixement profund d'un producte o d'un grup de productes i sovint són els implantadors de les solucions que han donat els dos anteriors. Si la recomanació és d'un consultor comercial sovint formen part de la seva empresa.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Django: la potència de les plantilles
Escrit per Aaloy a 08 de January , 2006 a les 3:35 p.m.
Podria definir la nostra plantilla base. Suposem que a la nostra aplicació li hem donat el nom de test i a la plantilla anterior el nom be base. Una plantilla filla, anomenada per exemple index, que tingués el seu propi contingut seria tan simple com
{% extends "test/base" %}
{% block title %}Pàgina d'inici %}
{% block contingut %}
I aquí podem posar contingut i/o definir nous blocs.
{%endblock %}
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Python i Eclipse
Escrit per Aaloy a 05 de January , 2006 a les 11:31 p.m.
Aquests dies estic aprenent a fer anar el Django i he esta provant quins dels entorns de desenvolupament s'adapten millor per a aconseguir el que vull, a saber:
- Possibilitat d'establir variables d'entorn. Django les necessita per les utilitats d'administració.
- Possibilitat de canviar el PYTHONPATH
- Resaltat de sintaxis per Python
- Autocompletat per Python
- CVS o subversion integrat
- Integració del depurador de Python
Encara que no hem de predre mai de vista que un IDE sols ens deixa fer el que està preparat per fer, i per això cal no oblidar-se de les eines especialitzades de consola (cvs, diff, vim, grep, bash,...) quan l'ocasió ho requereix, sí que es veritat que per un tant per cent molt elevat d'ocasions un bon IDE marca la diferència entre un desenvolupador que fa feina "a gust" i un altre que no ho fa. I fer feina a gust vol dir sovint ser més productiu, ja ho sabeu!
En la meva recerca he trobat i provat alguns entorns que estan molt bé:
Sense oblidar quelcom més senzill com vim o kate, que encara que no estan tan especialitzats com els altres en les tasques pròpies de la programació tenen els avantantges de la seva ubiqüitat el primer i de la combinació de potència d'edició i plugins del segon.
El nostre estil de feina o la configuració de la nostra màquina ens determinarà l'IDE de desenvolupament. Per màquines amb relativament poca potència o memòria la millor opció per desenvolupar amb Python és l'Eric o bé el vim. L'Eric ens proporciona una bona gestió de projectes, un editor avançat basat amb Scintilla, eines de control de versions (no massa intuitives, tot hi ha que dir-ho) i depurador integrat a l'IDE. Està més orientat a fer aplicacions gràfiques basades amb les Qt que aplicacions de consola o web, però es pot utilitzar perfectament per aquestes tasques.
Els altres possible candidats per màquines amb poc recursos són drpython i spe. El primer és un editor especialitzat amb Python i poc més. El segón va un poc més enllà i duu integrades un grapat d'eines relacionades amb la programació d'interfícies gràfiques per les Wx així com un depurador, llistes de tasques, etc. Cap dels dos integra control de versions ni gestió de projectes.
Per màquines amb molta potència de processador i memòria la meva recomanació és anar cap a Eclipse amb el plugin PyDev. Amb aquesta combinació tenim un editor potent, refactorització de codi (fa servir les mateixes llibreries que Eric), control de errors (pylint), resaltat de sintaxi, depurador integrat, autocompletat de codi que funciona! i a més aprofita la potència d'Eclipse per tasques com la gestió de projectes i el control de versions. Li falta la creació d'un mode de perspectiva propi que amagui les opcions sols aplicables a Java, creació directe d'arxius i projectes Python (no està massa enfora, però), integració de la consola Python i un equivalent a la consola de javadoc per Python. A part d'això i creieu-me que es pot viure perfectament sense, la combinació és excel·lent. A més com Eclipse té un mòdul per afegir eines externes molt potent, que permet definir variables d'entorn, passar paràmetres basats en els projectes actius i executar tasques en segon pla.
Amb Eclipse i PyDev he pogut crear tasques per les accions més comuns d'un projecte Django, el que m'evita tenir que anar a la consola i configurar les variables d'entorn. Encara que les poguem posar al .bashrc és un incordi quan tenim més d'un projecte en marxa. Les eines externes d'Eclipse permeten definir les variables d'entorn de Django referides al projecte i això fa que la feina sigui molt més senzilla. A més l'execució de tasques en segon pla fa que poguem executar el servidor de desenvolupament per Django directament des de l'IDE i veure'n els logs. Es pot demanar més?
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Teletreball, una utopia?
Escrit per Aaloy a 02 de January , 2006 a les 10:24 p.m.
- Una connexió de banda ampla
- Un o dos ordinadors per programar. A mi m'agrada fer feina amb dos equips, de manera que el que sempre en tenc un completament dedicat a l'entorn de programació i no malbaratant recursos en altres coses.
- Una impresora.
- Taula, cadira
- Equip d'aire condicionat
- Electricitat. Uns 12 Kw-h diaris. Posem un 300 Kw-h mensuals per fer números redons
- ADSL/Teléfon: 80 Eur mensuals
- Mòbil: 20 Eur mensuals
- Material d'oficina: paper, toner, etc. Uns 6 Eur mensuals.
- Neteja: 60 Eur/mensuals
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
I ja som a un nou any!
Escrit per Aaloy a 01 de January , 2006 a les 12:30 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Configurant el WordPress
Escrit per Aaloy a 28 de December , 2005 a les 2:43 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
El Viajero de John Twelve Hawks
Escrit per Aaloy a 27 de December , 2005 a les 5:34 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Programari tancat a les administracions públiques
Escrit per Aaloy a 27 de December , 2005 a les 5:17 p.m.
/**************************************************
DESARROLLADO CON at4 picoCMS
GRACIAS POR REVISAR NUESTRO CÓDIGO, PUEDES
APRENDER MÁS EN:
http://www.hotwired.com/webmonkey/
http://www.developer.com/
http://www.webcoder.com/
http://www.webreview.com/
**************************************************/
Molt lleig, befós, impropi! Realment saben els nostres ajuntaments que se l'estan jugant amb una empresa que no comprén els principis més bàsics que hi ha darrera Internet, que no comprenen que allò que fa la web és el compartir coneixements i no el fer befa de la gent que cerca saber-ne més?
El més tritst però és que a la mateix pàgina he trobat més comentaris:
/**************************************************************************/
/* : : : Bloc "El Temps als Països Catalans" : : : */
/* =================================== */
/* */
/* Copyright (c) 2003 de Kove (kove@mixmail.com) */
/* http://www.phpnuke-catala.org */
/* */
/* Aquest programa és software lliure. Pots redistribuir-lo i/o */
/* modificar-lo respectant els termes de la GNU (General Public License) */
/* com es publica en la Fundació de Software Lliure; */
/**************************************************************************/
Ara sí que ja no entenc res! Befa per un costat, codi tancat i per una altra ens aprofitam de codi GNU?
Diu una vella dita que és millor no atribuïr a la maltat allò que es pot atribuïr a l'estupidesa.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Demà és la grossa
Escrit per Aaloy a 22 de December , 2005 a les 1:11 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Quartz - un gestor de treballs per Java
Escrit per Aaloy a 22 de December , 2005 a les 12:58 a.m.
Quartz és un gestor de treballs (job scheduling system) per Java de codi obert que es distribueix baix la llicència Apache 2.0. Segons la seva documentació s'integra perfectament tant amb aplicacións J2EE com amb aplicacions J2SE.
A la web de Quartz hi ha un bon grapat d'exemples per a la seva integració, però el que fa Quartz realment fàcil de fer anar és el bastiment Spring. Hi ha una secció de la documentació d'Spring dedicada a la integració de Quartz amb les nostres aplicacions Spring. La simplificació feta per aquest bastiment és fantàstica, i en pocs minuts podem tenir un completíssim cron a l'abast de la nostra aplicació web i executant les funcions Java que volguem.
Quartz és una d'aquestes coses que convé saber que existeixen i no tenir que anar reinventant la roda o fer pegats per tal de fer que la nostra aplicació realitzi tasques periòdiques. Per cert, s'ho paga llegir-se el tutorial de la sintaxi de cron que hi ha a la web. Clar i ben explicat.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
Django: desenvolupament RAD per Python
Escrit per Aaloy a 20 de December , 2005 a les 1:33 a.m.
Un dels bastiments per Python que estic provant (gràcies Morenosan per fer-m'hi caure) per al desenvolupament RAD d'aplicacions web és el Django. Aquest bastiment presenta una sèrie de característiques que el fan preferible per davant d'altres projectes semblants:
- Està molt ben documentat
- El tutorial es molt bó. T'engantxa tot d'una amb la potència del bastiment.
- La capa de persistència està molt cuidada i es pot fer anar independentment del bastiment web, amb la qual cosa s'agilita el testeig.
La part d'Ajax (un dels punts forts de Ruby on Rails) encara està molt verda, però si en fitxam en el ritme en que avança el projecte no m'extranyaria que en un parell de mesos ja tenguin quelcom funcional i a bon nivell.
M'ha impresionat com amb poquíssimes línees de codi (35) per ser exactes, tenc una aplicació funcionant amb dos manteniments del tipus mestre-detall, amb control d'accés, cerques, filtres i ordenació. A més m'ha permés definir l'estructura de les taules de la base de dades a partir d'objectes Python de manera que amb una sola comanda he pogut crear la base de dades.
Encara no he acabat el tutorial, vaig per la meitat de la tercera part i la feina feta representaria setmanes de treball de no comptar amb aquest bastiment. Hi veig un munt de possibilitats, tant per un producte final com per prototipat d'aplicacions.
Amb Django podem crear les interfíces per als manteniments de les nostres aplicacions web en qüestió d'hores i donar-les als usuaris per a que vagin fent. El problema ho tindrem a l'hora d'explicar-los el perquè una cosa tan potent no és la versió definitiva de l'aplicació. Ei! I per què no? :)
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Metodologies de programació
Escrit per Aaloy a 17 de December , 2005 a les 8:01 p.m.
- Els problemes de comunicació són mínims si podem situar els nostres programadors en un entorn adequat i pròxims entre si.
- Podem seleccionar millor els nostres programadors. Això vol dir que és més senzill trobar gent per damunt de la mitjana
- Podem aplicar tècniques basades en la regla del 20%. Es a dir, sols farà falta un 20% de la documentació que necessitariem en un projecte gran.
- Podem introduïr abans millores tecnològiques. No és el mateix formar a 50 persones que a 5.
- La consolidació de l'equip es crítica, però a la vegada també és més senzilla de fer.
- Es poden detectar abans els "egos problemàtics"
- Es pot establir una estructura de feina informal on es potencii l'iniciativa personal i la meritocràcia sense que hi hagi problemes de pèrdua de informació o de cohesió en el projecte.
- És molt més bo de fer conèixer a cada integrant del grup i saber-ne els seus punts febles i les seves mancances
- El grau de confiança entre la gent pot ser molt més gran. Més confiança implica millor ambient de feina, millor ambient implica millor productivitat.
- Lloga la millor gent que puguis pagar. Està demostrat que els bons programadors/es poden rendir fina a 10 vegades més de mitjana i el seu sou no és deu vegades superior
- La feina i l'ambient de feina ha de ser motivador i divertit. Als programadors ens agraden les coses noves. És molt avorrit programar sense innovar i l'avorriment mata la productivitat.
- És important disposar d'un bon equip i això s'ha de compatibilitzar amb el primer punt. La productivitat d'un equip pot ser fins a tres vegades superior a la de la suma dels individuos que el formen.
- La paperassa ha de ser la justa i necessària per l'envergadura del projecte i la gent que hi ha implicada. No hi ha perquè fer un model UML totalment detallat, tots els diagrames de seqüència, etc quan amb un diagrama de les classes de negoci i un parell de reunions formals n'hi ha prou.
- La utilització del CVS i un control d'errors per mi és fonamental. Ara per ara em seria molt difícil concebre un model de programació en grup sense un control de versions.
- La informació del projecte ha de ser pública i a l'abast dels programadors. Tant a nivell d'anàlisi, de les tasques que s'han de fer com dels plaços d'entrega
- S'ha d'establir un sistema de control d'error compartit. Els error s'han de registar per a que cada un pugui aprendre dels errors dels altres
- El codi és comú i la responsabilitat és compartida. Si ho romps ho arregles, però si no hi ets ho faig jo.
- La idea del Feature Driven Development en que que fa a la manera d'organitzar la feina és l'adequada per projectes on el client no sap massa bé el que vol o que hom prevegi que hi haurà força canvis. Dóna l'oportunitat de sempre tenir quelcom que funciona.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Designed for Microsoft Windows
Escrit per Aaloy a 11 de December , 2005 a les 9:58 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Jugant amb Click
Escrit per Aaloy a 18 de November , 2005 a les 12:41 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Hibernate tools 3.1 beta
Escrit per Aaloy a 31 de October , 2005 a les 11:14 p.m.
Hibernate Tools 3.1 Beta és un afegit per Eclipse 3.1 que ens permet entre altres coses mapejar les taules de la nostra base de dades a fitxer xml utilitzats pel bastimet Hibernate, generar els POJOs
que mapegen aquests xml cap a classes Java i a més amb una utilitat que ens permet fer consultes HQL directament.
Així dit no sé si algú que no estigui una mica enterat del tema m'haurà entés res. Miraré d'explicar-ho: Un dels maldecaps més importants quan es fa servir programació orientada objectes en programes de gestió és que més tard o més d'hora hom ha d'acabar passant aquests objectes (normalment les seves propietats) cap a una base de dades i aquí comences els problemes, ja que s'han de fer un seguit de transformacions per passar dels objectes a les tuples de la base de dades. Podem trobar-nos que el gramatge dels objectes i les tuples de la base de dades sigui diferent, ens trobam que els conceptes de navegabilitat que tenim als objectes no es corresponen amb la BD, etc. El pas invers també és complexe, ja que es tracta de recuperar tuples d'una base de dades i transformar-les amb objectes.
Hibernate eś un bastiment que intenta que aquests maldecaps siguin els menors possibles. Ens permet definir una sèrie d'arxius xml que diuen com es mapegen els objectes (els POJOs) a la base de dades. Per exemple, ens permet definir com es passa d'una jerarquia d'herència a la base de dades, permetent establir diferents estratègies per aquest traspàs.
A més Hibernate ens independitza l'aplicació de la base de dades que estiguem utilitzant. Per això el que fa és definir els seu propi llenguatge de consultes, l'HQL, on es fan consultes en notació d'objectes i es retornen objectes.
Actualment la tendència és fugir com de la pesta (o la grip aviar) dels EJB i els seus mecanismes de persitència, ja que impliquen escriure molt de codi, resulten aplicacions molt pesades i difícils de mantenir. A les estimacions que tenc, una aplicació EJB respecta una feta amb una tecnologia "lleugera" hi pot haver fins a un factor 10 en termes de cost de desenvolupament.
Bastiments com a Hibernate han permés que les tecnologies no basades en EJBs s'estiguin imposant i eines com les Hibernate Tools fan que el desenvolupament sigui encara més ràpid, ja que permeten generar el codi java i els xmls de mapeig automàticament. Aquesta nova versió a més incorpora tot un seguit de millores que ajuden a la programació: conversió de HQL a codi SQL i la possibilitat d'afegir paràmetres a les consultes són les més interessants.
Encara queda molt de marge per la millora de les Hibernate Tools, els mapeig és cada cop millor i l'editor per configurar la part d'enginyeria inversa de les bases de dades ha donat un salt important en aquesta darrera beta. Tot i això és molt millorable la manera de presentar els resultats o els codis d'error que ens van donant quan es posa la resposta. En el que fa referència a l'editor HQL trob a faltar la possiblitat d'arrossegar un cap des de l'arbre de mapeig cap a l'editor o que a l'hora de fer la consulta et demani el màxim de resultats que vols mostrar.
Tal com està avançant Hibernate i les Hibernate Tools esper que vegem una eina molt més completa per quan la beta esdevingui ja la versió definitiva.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
PHP, Java i a veure qui la té més llarga
Escrit per Aaloy a 25 de October , 2005 a les 1 a.m.
La referència de l'article de JavaHispano es aquí i comenta una conferència de Marc Andreessen, el fundador de Netscape. Segons aquest bon home PHP serà més popular que Java en el futur. En el futur? No ho sé, però a mi em sembla que actualment el PHP és tan o més popular de Java per a fer webs. Que PHP pugui batre a Java en el món de la web ja no és cosa tant de llenguatge com de l'ús que se'n faci, es a dir, de la capacitació professional dels seus desenvolupadors.
Una aplicació tant web o a qualsevol altra no és bona o és dolenta per estar feta en un o altre llenguatge. Podem trobar aplicacions molt bones i autèntics xurros fets en gairebé qualsevol llenguatge de programació existent. És a dir, que la bondat d'un desenvolupament la marca el desenvolupador i no el llenguatge en sí.
Hi ha llenguatges que per las seva construcció forcen a desenvolpar d'una determinada manera, que fa que sigui més facil de llegir, menys propensa als errors de programació, que s'hagin d'escriure menys línees de codi, que ens permeti un control absolu de la nostra aplicació ... Segur que tots reconeixerem els nostre llenguatge preferit en aquestes frases. Uns hi veuran el Python, altres PHP, altres Java, altres ADA, C, C++ i la llista segueix. Un equip de programació amb una bona metodologia, un bon conexiement del llenguatge de programació que fa servir ben capacitat, pot anar més enllà de les limitacions del llenguatge de programació. Pot establir pràctiques que facin que el mantenimient sigui més senzill, que la divisió del codi entre els programadors sigui més fàcil, en definitiva, aprofitar els punts forts del llenguatge de programació en el seu benefici i obviar els punts febles.
Quan parlam de programació per la web, però, a més del propi llenguatge de programació en sí, interevenen també factors externs que influexien en la popularització d'un llenguatge de programació o un altre. Està clar que un d'aquests factors és la facilitat amb que es pot aprendre el llenguatge, i està clar que el PHP permet fer els primers programes en molt poc temps. Potser massa poc temps ;) i això fa que fins i tot gent sense cap formació en programació s'atrevesquin a programar en PHP. Això contribueix a la popularització del llenguatge, segur, però també és segur que no contribueix a la qualitat del programari que es fa.
L'altre factor que intervé en la popularització d'un llenguatge per la Web és la seva disponibilitat en els ISP. No és gens habitual que la gent tengui els coneixements o tengui els doblers per permetre's tenir el seu propi servidor dedicat en el que hi pugui instal·lar el que vulgui i tenir una ampla de banda suficient com per posar-ho a Internet. Per això s'ha de dependre d'ISP externs que donen una configuració preestablerta. Així, sovint hom no tria el llenguatge de programació que farà servir per una aplicació Web, sinó que es veu limitat pel que pot pagar o pel que té l'ISP de torn. Aquests ISP al que van és a tenir el màxim nombre de dominis hostejats en una mateixa màquina i per tant fugen com del dimoni de configuracions que no permetin maximitzar el benefici.
Així doncs, en la popularitat del PHP hi juguen dos factors: la facilitat d'entrada en el llenguatge per part de gent no programadora, i la maximització de rendiment que poden treure els ISP donat que aquest llenguatge consumeix molts menys recursos de màquina que altres i per tant els permet tenir més gent hostatjada. És força difícil avui per avui trobar un ISP que ens permeti tenir accés a un entorn J2EE a un preu semblant al que tendriem per PHP, o fins i tot trobar-nos amb algun que ens doni accés a Zope/Plone del món Python i ja no parlem d'altres eines com Ruby i el bastiment Rubi on Rails, que encara que s'ha posat molt de moda per la seva potència pocs ISP l'incorporen i si ho fan amb uns peus que són de lluny més cars que una configuració semblant basada en PHP.
És en el moment en que la llibertat d'elecció del llenguatge de programació adient per un projecte es veu limitada per l'ISP on la comparació d'un llenguatge de programació amb un altra pert tot el sentit, si és que l'ha tingut mai. Sovint s'haurà de programar amb el llenguatge que té l'ISP instal·lat per defecte, o disposar-nos a pagar preus difícilment assumibles per aplicacions modestes.
Si ens situam a l'ambit empresarial la cosa és semblant però per una altre costat. Així es té tendència a triar Java o .Net perquè el consultor de torn ha dit que és el més potent que hi ha, perquè és l'standard i perquè així justificarà la seva minuta ;) però segurament estan davant un antipatró conegut com el del martell d'or, resumit en aquella frase de que quan sols es té un martell tot s'acaba paresquent a un clau. Sovint ens podriem trobar que la solució més adient per una aplicació empresarial per la web sigui quelcom fet en PHP, o en Python i no necessàriament en Java o en .Net, però per poder arribar a dita conclusió s'ha de tenir el bagatge de coneixements necessari per poder adonar-se de quina és la tecnologia que millor d'adapta al projecte en concret i en departaments de programació que tendeixen a homgeneitzar fins extrems absurds tant els llenguatges (o millor dit llenguatge) de programació com les tecnologies utilitzades, això difícilment se dóna.
No hi ha solucions màgines, no hi ha bala de plata, no hi ha llenguatges de programació millors o pitjors. Hi ha llenguatges de programació que s'adapten millor a alguns tipus de problemes i programadors que s'adapten millor segons quins llenguatges de programació. Com sempre el truc està en no limitar-se, en tenir la ment oberta i un conjunt d'eines al nostre abast que ens permetin fer l'elecció més adient pel problema que volguem resoldre.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
De cachés, peresa i febre
Escrit per Aaloy a 24 de October , 2005 a les 12:58 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
JDK 1.5 per PPC?
Escrit per Aaloy a 18 de October , 2005 a les 10:15 p.m.
En els moments d'escriure això m'estic devallant la beta de JDK 5 per pSeries, tant la versió de 32 bits com la versió de 64 bits, a veure si hi ha sort i funciona amb el PowerPC del G5. La versió 1.4.2 de 32 bits sí que funciona i és la que estic utilitzant en aquests moments, però la veritat és que em preocupa un poc no poder fer ús de tota la potència dels 64 bits, i encara més, tenir-me que quedar ancorat a la versió 1.4.2 de Java.
Està clar que encara hi ha moltes empreses que fan feina amb la 1.3 i que la 1.4.x és l'estandard "de facto" en quant a màquines virtuals, però a poc a poc els desenvolupadors i les eines de desenvolupament van forçant a poc a poc el canvi cap a la 5.0.
Vagi com vaig segur que tindrem 1.4 pels llocs durant molt de temps. De fet en la majoria de desenvolupaments web no és molt important el tema de la màquina virtual, i tant fa si es la 1.4 o la 5, ja que la tecnologia funciona en qualsevol de les dues versions, potser amb diferències de rendiment, però poca cosa més.
A més de l'anunci de la notícia a The ServerSide és interessant llegir-se els comentaris que hi ha damunt l'anunci mateix i l'ús de la tecnologia Java en Mainframes.
I en el temps d'acabar-ho de dir he acabat de devallar-ho i descomprimir-ho :)
La versió per 32 bits funciona bé, però no així la versió de 64 bits, em dona un error Error en carregar: libstdc++.so.5: cannot open shared object file: No such file or directory i no sé massa bé el motiu. És el mateix tipus d'error que tenia a la versió anterior del JDK. Si algú aconsegueix fer funcionar la JDK5 de 64 bits en un G5 estaria molt agraït de que m'ho faci saber.
Ara estic provant el Netbeans amb la nova màquina virtual. He provat d'arrancar el Tomcat 5 i ha passat dels 13 segons (amb aplicacions i tot) als 9.8 segons de la nova màquina virtual, pareix poca cosa però al manco es nota l'augment de velocitat, i encara no he tocat cap paràmetre per optimitzar el rendiment de la màquina virtual. Se suposa que aquesta versió ha de permetre fer més optimitzacions que l'anterior, serà cosa de llegir...
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
Ubuntu Breezy - Segona part
Escrit per Aaloy a 17 de October , 2005 a les 12:27 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Ubuntu Breezy
Escrit per Aaloy a 15 de October , 2005 a les 10:24 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Salvar el culo
Escrit per Aaloy a 11 de October , 2005 a les 8:56 p.m.
- Obtenir una llista de requisits que ha de tenir l'aplicació, els requeriments.
- Cercar programes que puguin complir els requeriments
- Avaluar els programes contra la llista de requeriments
- Avaluar la relació cost/benefici de cada programa
- Presentar una recomanació.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Feina feta!
Escrit per Aaloy a 15 de September , 2005 a les 6:59 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Peopleware. Productive Projects and Teams
Escrit per Aaloy a 11 de September , 2005 a les 8:26 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Peopleware i Code Complete
Escrit per Aaloy a 31 de August , 2005 a les 10:48 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Programant amb la WEB
Escrit per Aaloy a 27 de August , 2005 a les 10:07 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Oracle? No gràcies, estic servit!
Escrit per Aaloy a 25 de August , 2005 a les 12:30 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Tornant a la feina
Escrit per Aaloy a 17 de August , 2005 a les 11:17 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
10 anys ja!
Escrit per Aaloy a 12 de August , 2005 a les 5:34 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
AjaxTags 1.0 alliberat
Escrit per Aaloy a 11 de August , 2005 a les 10:47 p.m.
- AjaxTags
- Dynamic HTML and XML: The XMLHttpRequest Object
- How to Develop Web Applications with Ajax, Pt. 1
- DWR - Easy AJAX for Java
- AjaxTags
- AJAX Matters - Asynchronous JavaScript and XML and XMLHTTP development information
- Asynchronous JavaScript Technology and XML (AJAX) With Java 2
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Dissenyant una comptabilitat
Escrit per Aaloy a 08 de August , 2005 a les 6:59 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Joel on Software
Escrit per Aaloy a 07 de August , 2005 a les 8:06 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
El regal de la comunicació
Escrit per Aaloy a 07 de August , 2005 a les 6:46 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Wilt s’ha perdut
Escrit per Aaloy a 05 de August , 2005 a les 9:43 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
IoC
Escrit per Aaloy a 04 de August , 2005 a les 6:38 p.m.
Aquests dies estat llegint damunt un patró de disseny anomenat Inversió del Control o com l'ha rebatejat Martin Fowler injecció de dependència.
Fowler diu al seu article Inversion of Control Containers and the Dependency Injection pattern que el terme d'inversió de control està mal triat i que la moda dels bastiments de dir que implementen IoC és una obvietat.
Anant d'enllaç a enllat he trobat també altres articles interessants:
- A beginners guide to Dependency Injection
- Definició de IoC que fa Paul Hammant
- Definició de la Wikipèdia
De tot això n'he tret una idea del que és el patró i quan es pot fer servir. No he arribat encara a cap implementació concreta o com integrar-la amb els meus propis desenvolupaments, encara que pel que he estat llegint tant Hivemind com Spring són bons candidats, l'elecció d'un o l'altra dependria de l'arquitectura utilitzada en el projecte i de com es de bona la integració de cada bastiment amb aquesta tecnologia.
Tal com jo ho veig si feim projectes de codi obert trobarem que en molts de casos aquest patró no té massa avantatges damunt un patró Factory, un bon ús de les interfícies i una bona documentació. Té molt de sentit si el que volem és crear una aplicatiu que agafa components de tercers i/o volem crear una aplicació extensible mitjançant pluggins.
Així el concepte de IoC aniria un pas més enllà dels pluggins i de patró Factory, es tracta de que la decisió de com s'implementa una caractarística no la controli directament l'aplicació sinó que es controli en temps d'execució. Això és el que fa, per exemple, Hibernate quan et deixa triar el sistema de caché que vols fer servir tan sols canviant els paràmetres de configuració de l'xml. L'Hivemind o Spring pel que veig segueixen la línea de fer servir arxius de configuració en xml on s'enllacen els serveis i la seva implementació. El PicoContainer fa l'enllaç per codi i per mi perd un poc la gràcia i l'esperit del patró.
Amb les aplicacions que he estat fent darrerament se me n'acud un possible ús d'aqeust patró:
Suposem una aplicació típica on l'usuari s'ha d'autentificar per poden entrar. L'aplicació passa el nom de l'usuari, la clau i el sistema d'autentificació ens diu si l'usuari és vàlid i retorna un conjunt d'informació damunt dit usuari. Aquest sistema d'autentificació és un ferme cantidat a figurar en els arixus de un contenidor d'Injecció de dependència, ja que per exemple podem fer l'autentificació fent servir LDAP, una Base de Dades, consultant a un arxiu de text o bé en les etapes inicial de desenvolupament fent servir un objecte mock per a l'autentificació.
En el tema de l'autentificació existeix el risc que ens n'anodem que hem deixat codificat el sistema d'autentificació incorrecte per l'entorn de producció. Si tenim l'autentificació implementada com a servei bastaria canviar el mapeig del servei i l'aplicatiu estaria ja llest per funcionar.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Arg! Java i PPC Linux
Escrit per Aaloy a 31 de July , 2005 a les 11:11 p.m.
Doncs això, avegades és desesperant. Se suposa que tenc una maquinota i va molt més lent que la màquina que tenc a la feina. A més l'Eclipse es mor a la mínima. Quan vaig comprar el PPC la veritat és que m'esperava més rendiment i m'esta defraudant.
M'estic plantejant sèriament comprar una màquina nova per al desenvolupament Java i destinar el G5 a tasques no relacionades amb la programació amb Eclipse i Java. La veritat és que va molt bé com a servidor, he fet algunes proves amb Postgres i tira molt bé, el problema és no poder desenvolupar en condicions... No és que desenvolupi a casa, però m'agrada investigar i provar coses que a la feina no tenc temps de provar i és desmoralitzant veure que no puc avançar al ritme que m'agradaria per mor del maquinari.
Les màquines de nucli dual de Dell estan molt bé de preu, o els de Miró, que tenen Compaq AMD Duron, en ambdos casos amb pantalla TFT de 17" inclosa per menys de 1200 Eur IVA inclòs. Estaria bé poder fer una comprarativa de rendiment d'aquestes màquines. La versión 5 del JDK té port per AMD 64 bits i també en tenen moltes de les distribucions Linux, en concret Debian i Ubuntu, així que no em faria res poder provar aquestes maquinetes. Ara tot és saber d'on treure 1200 Eur :O
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
Velocity
Escrit per Aaloy a 31 de July , 2005 a les 10:45 p.m.
Ahir vaig estar llegint-me la documentació de Velocity un sistema de plantilles fet en Java i que es pot integrar dins aplicacions clàssiques o web. La integració dins una aplicació de consola ha estat trivial, sols seguir l'exemple de la documentació. L'únic entrebanc que m'he trobat ha estat amb la part del loggin. Velocity fa servir per defecte el logger del projecte Avalon, projecte que està tancat. Així que m'he disposat a canviar de logger pel més habitual Log4j i aquí han començat els problemes, ja que Velocity està prepart per fer servir Category com a mecanisme per establir el tipus de log (info, debug, warn, ...) i les noves versions de Log4j han abandonat aquesta via i sols utilitzen el logger. Això ha fet que m'estigués barrallant una bona estona amb tot això, primer per descobrir que em faltava el l'Avalon LogKit i després per substituïr-ho per Log4j. Finalment l'exemple ha quedat així:
/*
- Copyright 2000-2001,2004 The Apache Software Foundation.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
*/ import org.apache.velocity.app.Velocity; import org.apache.velocity.VelocityContext; import org.apache.velocity.Template; import org.apache.log4j.; import org.apache.log4j.Logger; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import java.io.; import java.util.ArrayList;
/
- This class is a simple demonstration of how the Velocity Template Engine
- can be used in a standalone application.
- Fent servir log4j com a logger. *
- @author Jason van Zyl
- @author Geir Magnusson Jr.
- @author aaloy
- @version $Id: Example.java,v 1.4.8.1 2004/03/04 00:18:29 geirm Exp $ */
public class Example
{ static Category logger = Logger.getLogger(Example.class.getName()); public Example(String templateFile) { BasicConfigurator.configure(); // Now set its priority. logger.info("Proves ...."); logger.debug("Iniciant"); try { /* * setup / logger.debug("Carregant les propietats"); Velocity.init("velocity.properties"); logger.debug("Propietats carregades"); //Velocity.init(); / * Make a context object and populate with the data. This * is where the Velocity engine gets the data to resolve the * references (ex. $list) in the template */
logger.debug("Carregam el contexte");
VelocityContext context = new VelocityContext();
logger.debug("Contexte carregat");
context.put("list", getNames());
/*
* get the Template object. This is the parsed version of your
* template input file. Note that getTemplate() can throw
* ResourceNotFoundException : if it doesn't find the template
* ParseErrorException : if there is something wrong with the VTL
* Exception : if something else goes wrong (this is generally
* indicative of as serious problem...)
*/
Template template = null;
try
{
template = Velocity.getTemplate(templateFile);
}
catch( ResourceNotFoundException rnfe )
{
logger.debug("Example : error : cannot find template " + templateFile );
}
catch( ParseErrorException pee )
{
logger.debug("Example : Syntax error in template " + templateFile + ":" + pee );
}
/*
* Now have the template engine process your template using the
* data placed into the context. Think of it as a 'merge'
* of the template and the data to produce the output stream.
*/
BufferedWriter writer = writer = new BufferedWriter(
new OutputStreamWriter(System.out));
if ( template != null)
template.merge(context, writer);
/*
* flush and cleanup
*/
writer.flush();
writer.close();
}
catch( Exception e )
{
System.out.println(e);
}
}
public ArrayList getNames()
{
ArrayList list = new ArrayList();
list.add("ArrayList element 1");
list.add("ArrayList element 2");
list.add("ArrayList element 3");
list.add("ArrayList element 4");
return list;
}
public static void main(String[] args)
{
//Log myLog;
Example t;
Example.logger.info("Arrancant");
//myLog = LogFactory.getLog(Example.class);
//myLog.info("Iniciant");
t = new Example("example.vm");
//myLog.info("Acabat");
}
}
El arxiu de plantilla està agafat directament de l'exemple de velocity així que m'estalvio de posar-ho.
Els arxius de configuració que he fet servir són
log4j.properties
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%p [%t] [%c] %C{1}.%M(%L) | %m%n
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
velocity.properties
runtime.log = velocity_example.log
runtime.log.logsystem.class=org.apache.velocity.runtime.log.SimpleLog4JLogSystem
log4j.logger.org.apache.velocity.runtime.log.SimpleLog4JLogSystem=DEBUG
Pel rootLogger he anat a sac, però s'ha d'anar alerta si feim servir aquesta configuració en un altre tipus d'entorn, una aplicació J2EE per exemple, la quantitat d'informació que surt enlenteix molt la posada en marxa de l'aplicatiu.
Amb tot això ja tenc mig enllestit el primer projecte que em permetrà tenir la base de futurs desenvolupaments: Struts, Velocity, JSP2 i Hibernate ja funcionen plegats i sols falta que l'aplicatiu faci alguna cosa de profit, com escriure a la base de dades quelcom interessant, però encara no he decidit quina miniaplicació fer.
Em falta ara integrar una parell de d'utilitats d'interfície d'usuari (ja tenc el calendari i l'editor de texts), menús i posar un mini-exemple d'Ajax. A l'inici tot això duu una feinada, costa molt lligar-ho tot i fer un mini projecte així, però una vegada fet servirà de base a futurs desenvolupaments. Esper poder-ho penjar per aquí aviat.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
De vacances
Escrit per Aaloy a 29 de July , 2005 a les 1:12 a.m.
- Professional Java Development with the Spring Framework
- Ant: The Definitive Guide, 2nd Edition
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Desenvolupant amb Java
Escrit per Aaloy a 10 de July , 2005 a les 3:45 a.m.
L'anada a Londres va ser productiva. És bo poder parlar d'informàtica i programari lliure amb gent de la teva mateixa empresa, encara que sigui de països diferents. L'estada a Londres va coincidir amb la proclamació d'aquesta ciutat com a seu dels jocs olímpics del 2010, no ho vaig notar gaire de totes maneres, si no fos perquè ho posava els diaris ni ho hagués notat.
Em va anar d'unes hores no trobar-me amb l'embolic de l'atemptat. Vaig passar per una de les estacions afectades damunt les cinc de la tarda. Està clar que estadísticament això no és significatiu, ja que com jo milers de persones hi passaren el dia anterior, però fa pensar que davant una situació com aquestes tothom és una víctima indefensa. No arribaré a entendre mai el perquè d'aquestes barbàries i menys que es faci en nom d'un Deu. Això em referma amb el meu agnosticisme.
Aquests dies he estat jugant amb l'entorn Java i el G5. Pareix que la única alternativa viable per ara és fer servir el Netbeans 4.1. A l'Eclipse no hi ha manera de tenir un resaltat de sintaxi decent per jsp i molt menys l'ajuda i completat. Els pluggins no acaben de funcionar, ni JBooss ni Lomboz ni tampoc el de Sysdeo per fer anar el Tomcat des de l'entorn.
Al final he optat pel Netbeans que encara que no té un depurador tan potent com el de l'Eclipse ni tants de pluggins al manco funcina en el 90% de coses que vull fer: programació de POJOs, JSP i configuració d'arxius XML.
El que sí he notat és que ni Eclipse ni Netbeans es duen gaire bé amb el Tomcat 5.5. No sé si és la configuració especial que tinc o què, però la veritat és que el Tomcat 5.0.30 és molt més ràpid a l'hora de carregar i recarregar una aplicació que la versió 5.5, i no estam parlant de dècimes de segons, la diferència pot ser de varis minuts :O
Així que per ara desenvoluparé amb Netbeans i Tomcat 5. He configurat l'entorn per a que ho admeti, així que ara per ara ja sols em quedarà configurar el tema del JNDI i Hibernate. Ja tenc enllestida la part d'Struts i EL. En la part d'EL és curiós veure que els assistents de Netbeans encara venen amb la versió anterior de JSP i hi ha que personaltizar la capçalera de l'arxiu web.xml per a tenir accés a l'especificació JSP 2.0.
Per mi és important tenir activa la opció del Expression Languaje, ja que fa que no sigui necessàri posar codi java dins la capa de presentació. Amb això i el Velocity, la propera llibreria que vull mirar me crec que ja tendré la part de presentació llesta.
Una altra cosa que he notat per ara és que l'entorn de desenvolupament Java no està pensat per a PowerPC, o al manco no per als Macs que funcionen amb Linux. No sé si és la Fedora que està carregant molt la màquina o què, però la veritat és que hi trob molta diferència entre la màquina que faig servir a la feina, un Dell a 3 GHz i 1 Gb de RAM i el meu G5 de doble processador a 2 GHz. Guanya de molt la màquina Dell i a més puc fer servir el darrer JSDK. Pel que vull fer a casa el PPC ja em va bé, però si tingués que desenvolupar aplicacions Java a casa per viure tendria que passar a màquina AMD o Intel. Això sí la pantalla d'Apple no la canvio per la TFT que tenc a la feina, està clar que els preus no són comparables ;)
De totes maneres crec que en alguns departaments de programació encara es fa feina amb màquines velles o pantalles CRT de 17". No ho acab d'entendre jo a això: un programador que fa feina amb pocs recursos vol dir que perd molt del temps esperant a a que acabi una compilació, moguent una finestra d'aquí cap allà perquè no té espai per veure el depurador i el codi a la vegada, etc. Suposem que es perd mitja hora diaria amb això, i suposem que el cost mig és de 30 Eur/hora, els càlculs són molts bons de fer i surten al voltant dels 3600 Eur de pèrdua anual per l'empresai.
Si aquesta perdua d'invertís en bon material, que suposem que anam canviant cada dos anys, tindriem un guany adicional de 5200 Eur, més i tot en funció del que es pugui treure per l'equip antic. Ara multipliquem-ho per 10 programadors: 52.000 Eur!!! Divertit, veritat?
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Java
G5 amb Fedora Core 4
Escrit per Aaloy a 05 de July , 2005 a les 10:17 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Una jugueta
Escrit per Aaloy a 11 de June , 2005 a les 11:52 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Cap a Hannover
Escrit per Aaloy a 08 de June , 2005 a les 12:58 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Temps de canvis
Escrit per Aaloy a 04 de June , 2005 a les 12:21 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Un Hibernate per Python.
Escrit per Aaloy a 23 de May , 2005 a les 11:16 p.m.
Fa estona que tenc ganes de fer una aplicació de gestió amb Python, així com a prova de concepte i per passar-m'ho bé programant.
Una de les coses que més m'aturen és el tema de la persistència. Ja sabeu, al final les aplicacions de gestió han de volcar les seves dades a una base de dades i això fa que es tengui que escriure i mantenir força codi SQL.
Darrerament he estat llegint molt damunt Java i hi estic començant a fer feina professionalment. Quan estàvem montant l'arquitectura que faríem servir per les aplicacions també va sorgir el problema de la persistència. Llavors una de les opcions que més m'agradaren per la seva potència i simplicitat va ser l'Hibernate.. Aquest bastiment de persistència m'agrada molt i fa que una de les tasques més propenses a errors i més tocacollons com és el d'escriure i mantenir codi SQL estigui molt més controlada.
Per Python estava cercant quelcom semblant i no l'acabava de trobar. Avui se m'ha acudit cercar servidors web per Python i he anat a topar amb SunkWeb. Pel que he estat llegint fins ara pot ser la resposta, cap dels bastiments de persistència que havia vist per Python tenen la bona pinta que té aquest. Si és tan potent com pareix aviat podré tenir alguna cosa feta.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
Un matemático invierte en la Bolsa
Escrit per Aaloy a 14 de May , 2005 a les 8:06 p.m.
L'altre dia em vaig rompre les ulleres i vaig anar a una coneguda tenda prop d'uns també molt coneguts grans magatzems de Ciutat per a que me posassin un vidre nou. Vaig aprofitar per comprar-ne unes de recanvi, és la segona vegada que me passa això de fotre un vidre i sempre quan més falta em fa.
La cosa és que ahir vaig anar a recollir les noves ulleres i vaig aparcar als grans magatzems. A la secció de novetats vaig trovar Un matemático inverte en la bolsa de John Allen Paulos.
Conec aquest autor perquè una amiga, Na Mercè Barreno, matemàtica per més senyes, m'ho va recomenar a temps. Em va deixar Un matemàtico lee el periódico i vaig quedar encantat per l'estil d'aquest home. Em recorda a alguns assaigs d'Assimov, exposa les coses d'una manera molt entenedora i a la vegada fa que les coses et semblin d'allò més obvies. És molt mal d'aconseguir això quan parlam de ciència i si a més hi mesclam pel mig la Probabilitat la cosa encara té més mèrit.
En aquest llibre Allen ens fa partíceps de les seves experiències, nefastes per cert, en el món bursàtil. Fa us de la probabilitat i la psicologia per explicar alguns dels comportaments humans relacionats amb els mercats i va explicant de pas algunes idees matemàtiques com el de la mitja mòbil o la raó aùrea. Tot això ben amanit amb comentaris personals, anècdotes, acudits, paradoxes, un arguinyano de les matemàtiques en podriem dir.
Així que si estau interessats en la borsa, en les matemàtiques o senzillament teniu un esperit crític no deixeu de llegir algun dels llibres d'aquest home.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Llibres i revistes
He vist l’anunci
Escrit per Aaloy a 07 de May , 2005 a les 6:30 p.m.
Aquest darrers dies sou molts les que m'heu comentat que a l'empresa on faig feina havien posat un anunci per un lloc idèntic al que estic ocupant actualment.
Bé, primer de tot he dir que gràcies per l'interés :)
El món turístic a mi m'agrada molt, gairebé tant com la informàtica, i això crec que es deu a que és un món canviant, que es va adaptant a les noves necessitats dels usuaris i dels clients.
Quan hom fa feina a una empresa que es dedica fonamentalment al negoci turístic, es lògic que de tant en tant hi hagi canvis, en aquest cas concret un dels canvis m'afecta a mi.
Encara no us puc dir què faré o com acabarà la cosa, però ja us dic que no me lleva la son. Des de fa ja uns anys l'empresa per la que faig feina s'està reinventant a ella mateixa, adaptant-se a un nou tipus de client turístic i això és bo, ja que tant en el turisme com en la informàtica no moure's vol dir estar condemnat a desaparèixer.
La feina que he fet fins ara ha estat molt interessant i estic molt content de l'equip de gent amb qui he fet feina. No es pot demanar res més!
Tot d'una que sàpiga com acaba aquesta història us ho contaré, el que si que tenc ben clar és que l'acabament d'una etapa implica el començament d'una nova i a mi m'agraden els canvis :)
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: General
De mudances
Escrit per Aaloy a 25 de March , 2005 a les 11:55 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
El programari lliure fa por?
Escrit per Aaloy a 03 de March , 2005 a les 1:16 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Una de Python
Escrit per Aaloy a 31 de December , 2004 a les 12:05 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Trobada d’antics companys de San Francesc d’Inca
Escrit per Aaloy a 21 de November , 2004 a les 1:18 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Scribus
Escrit per Aaloy a 16 de October , 2004 a les 11:15 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Més que un costipat
Escrit per Aaloy a 23 de September , 2004 a les 12:52 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
El Contaplus.
Escrit per Aaloy a 08 de September , 2004 a les 2:20 a.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
Encara queda estiu
Escrit per Aaloy a 05 de September , 2004 a les 6:46 p.m.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL)
The Daily Python-URL
Escrit per Aaloy a 30 de August , 2004 a les 2:50 p.m.
Pels qui encara no el conegueu i us agrada el llenguatge Python trobareu força interessant aquesta pàgina .
En ella es fa un resum de les notícies i novetats més interessants relacionades amb el món de Python. Molt recomanable si no us voleu perdre res.
Traducciones/Translations by apertium
0 comentaris, 0 trackbacks (URL) , Tags: Python
