Por marcos, hace 15 días

Aquellos maravillosos años...

... de cabinas y ordenadores sin lector de CD ROM :)

Llevaba yo un tiempo contento con mi IBM PS/2 286, con su flamante megabyte de RAM y sus 28MB de disco duro, convertidos en 40 y pico gracias a dblspace, un compresor de disco que venía con MSDOS6.1 o 6.2, no recuerdo :) Hasta que ví en una tienda de segunda mano, un IBM también, 486 con ya 16MB de RAM y 270MB de disco duro, un gran salto cualitativo. Un salto que valía 45.000 pelas.

Un dia llegó a casa el PC :)

Con su OS/2, PC-DOS, MS-DOS y Virus95. No conocía ni PCDOS ni OSDOS, tampoco GNU/Linux para podérselo instalar. Pero sí que sabía lo que era el PCFutbol y que mi primo lo tenía, así que pim pam pum, se lo instalo. Evidentemente tenía virus, creo que salió de fábrica con virus aquel juego xD

Pues bien, yo que sabía lo justo por aquel entonces, pues me fui para la tienda a decirle que... no iba aquello xD Acabaron formateándome el disco :(

Y el problema viene cuando digo, vale, sin lectora de CD, ¿cómo vuelvo a instalar el 95? Pues no podía, instalé 3.11. Hasta que se me ocurrió ir a casa de mi primo (sí el mismo que me dejó el PC Futbol xD) y compré diskets. Un montón. Exactamente 40. Cogimos el CD de Windows 95 y con el famoso ARJ, pasamos el CD a disquetes. Usamos 36 en total. Y aún los tengo, ¡los iba yo a tirar! ¡Ja!

Después de aquello uno empezó a pensar en comprar un lector de CD. Me voy a la tienda y suelto la pasta para una lectora. Todo contento me voy a casa, abro el PC voy a enchufar el CD y ... oh shit! No cabe el cable en el conector, WTF?! ¿Pero esto no es estándar? pensé yo... Bueno, calma, le llevo el ordenador al de la tienda y que se lo mire...

El tio ve el trasto y suelta: Ah, es que esto es escasi y yo uh... ¿lo qué? ¡Yo quiero un CD! Y el hombre me trajo una lectora SCSI, pero ... no iban los drivers. ¿Un CD lleva drivers? Ah bueno...

Y así en dos o tres tiendas más, hasta que uno me dijo: «Chaval, o te compras uno marca IBM o no vas a tener CD». Pues guay. Pido precios y ... casi me da infarto.

Pasó el tiempo y un dia de estos, después de clase que no sabes qué hacer, te vas a dar una vuelta por un Cash Converters, a chafardear. Y ahí estaban, 3, no una no, ¡3! lectoras de CD ROM SCSI marca IBM. ¡Por sólo 1500pts! Con su aureola alrededor y música angelical y todo llamándome. Joder, no sé si tuve una erección, pero no me extrañaría. Evidentemente, jovenzuelo yo, no llevaba ese dinero encima, sería 1º o 2º de ESO, y ya hace unos añitos jejeje.

Y aquí entra en acción la cabina. Salí a la calle a llamar a mi madre, que me trajese la pasta ipso facto, no podía dejar escapar esa oportunidad; aunque pensándolo bien, seguro que las otras dos, se quedarían ahí por los siglos de los siglos, porque no sé si mucha gente tendría un IBM SCSI... o sí, quién sabe.

Y colorín colorado, marc0s ya tenía CDROM instalado.

Para horfulus ;-)

Por marcos, hace 1 mes y 16 días

Época de cambios

So long no posting... Pues sí. Ya hace un mes y medio (o así :) ) que no escribía por aquí. Ocupado con diferentes historias no he tenido las ganas ni el tiempo, bueno, el tiempo quizá sí, pero lo invertiría en otra cosa.

Pues como bien apunta el título, estoy ahora mismo en época de cambios. Servidor se ha cambiado de trabajo como muchos ya sabréis; ahora trabajo en Girona con Edu, en GISCE Enginyeria, desarrollando una aplicación web de GIS para empresas eléctricas, bien conectadito a el ERP que también desarrollamos en la empresa. Y dicho cambio de curro lleva asociado un razonable cambio de residencia. Sí, sí, ¡Marquitos se va de casa!, jeje. El viernes pasado firmé la reserva de un pisito de alquiler, en Girona claro está. Desde que tomé este trabajo pensaba irme a vivir a Girona, pero a raíz del pequeño accidente de coche de hace un par de semanas, la búsqueda de piso se tornó más intensiva. Y ya está, ya tengo que empezar a pensar en la mudanza... Da pereza, ¡pero hay ganas!

Estáis invitados :)

Y en otro plano, el friki, comentar que el desarrollo del nuevo tkpholog ya está aquí, pero con muuuchos cambios. Incluso de nombre, lo que debería ser el tkpholog2 pasa a ser Djaflog. Los más ávidos habrán intuido que ya no usaré PHP sino Django :) Pues sí, cambiamos de PHP a Python (y Django), también de MySQL a PostgreSQL y, como de perdidos al río, de SVN como control de versiones al «nuevo» GIT. ¿Todo sea aprender cosas nuevas, no?

Podéis consultar el repositorio GIT si estáis interesados en el desarrollo.

Por marcos, hace 3 meses y 3 días

De como los gobiernos se venden al dinero y demás historias

Más o menos todos conocemos la historia de OOXML y de cómo Microsoft ha querido (y finalmente logrado) que éste fuese un estándar ISO documental. Su contrincante: ODT, un rival técnicamente superior en todos los aspectos y desde siempre abierto a quien quisiera consultarlo.

Pues bien, la aprobación de ODT (exactamente OASIS) como estándar ISO el 8 de mayo de 2006, fue un golpe bajo a Microsoft, pues las administraciones públicas (sobretodo europeas) empezaban ya a reclamar la documentación en un formato abierto para no discriminar a usuarios de plataformas no-MS. Y todos sabemos el gran mercado que supone la administración pública. A raíz de esta pérdida de mercado que les acechaba, la multinacional de Redmond, intentó aprobar por la vía rápida el formato OOXML como estándar. Por suerte, la vía rápida decidió que no. Evidentemente MS no cesó en su lucha y empezó el proceso de nuevo por la vía normal y sacando maletines de aquí y de allá para «hacer ver las bondades técnicas» de su estándar a gobiernos indecisos :)

Uno de los casos más notable ha sido el de Noruega, 19 votos en contra, 5 a favor. ¿Y que tiene eso de malo? ¡Que finalmente Noruega dijo sí a OOXML! Im-presionante, como diría aquél. Dicho quede, que la UE no descarta estudiar este hecho.

Y los casos así se suceden, no se entiende sinó, que un estándar incompleto, inválido, conflictivo, con errores conocidos y que supone la redundancia de estándares en el ámbito de la documentación (OASIS ya era estándar antes) sea finalmente aprobado como estándar internacional.

¿Y qué significa todo esto? Bajo mi punto de vista confirma que poderoso caballero es Don Dinero, que la economía está por encima de toda razón lógica, técnica y moral y que ya no nos gobiernan personas, sinó multinacionales que manejan el poder económico y las decisiones que nos afectan como ciudadanos.

Pues nada, a seguir poniendo el culo y a ver en qué acaba todo esto.

Una votación de la ISO ...

Por marcos, hace 3 meses y 5 días

Creando webservices con Python

Este post nace a raíz de las horas que he «perdido» en el curro intentando desplegar un servidor de webservices en Python, partiendo del descriptor (fichero WSDL). La causa de esas horas «perdidas» es el uso de tipos de datos complejos, es decir, no un simple String por ejemplo, sino una secuencia de éstos (vector de Strings) y el uso de la herramienta wsdl2py para generar la base de lo que será nuestro servidor.

La librería que usaremos es ZSI, que es actualmente la que tiene un desarrollo más activo y parece ser que se impone como la de referencia para desarrollar webservices usando Python. Por contra, la documentación disponible es escasa.

Entremos en materia.

Tenemos el siguiente descriptor que define el servicio que queremos ofrecer y las operaciones que tiene disponibles. Digamos que el servicio tiene que devolver una lista de pares (peso,Variable) para una petición de un String. Caso práctico: le pedimos al webservice la última lista de la compra que hizo Juan (el String «Juan» sería el input del servicio) en la frutería, nos devolverá una lista de parejas (kilos, fruta), por ejemplo :)

Veamos la parte relevante:

  1. <!-- types -->
  2. <wsdl:types>
  3. <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="Pares_NS">
  4. <complexType name="parPesoVariable">
  5. <sequence>
  6. <element name="peso" type="xsd:long" minOccurs="1" maxOccurs="1"/>
  7. <element name="variable" type="xsd:string" minOccurs="1" maxOccurs="1"/>
  8. </sequence>
  9. </complexType>
  10. <complexType name="parPesoVariableList">
  11. <sequence>
  12. <element name="par" type="dat:parPesoVariable" minOccurs="0" maxOccurs="unbounded"/>
  13. </sequence>
  14. </complexType>
  15. </schema>
  16. </wsdl:types>

  17. <!-- messages -->

  18. <wsdl:message name="getParesRequest">
  19. <wsdl:part name="input" type="xsd:string"/>
  20. </wsdl:message>
  21. <wsdl:message name="getParesResponse">
  22. <wsdl:part name="output" type="dat:parPesoVariableList"/>
  23. </wsdl:message>

El primer paso será generar la base de código Python que luego extenderemos para crear nuestro servicio. Para ello usamos el script python wsdl2py y su compañero de viaje wsdl2dispatch. Atención como hacemos uso de tipos de dato complejos (complexType), necesitamos pasarle a wsdl2py el argumento --complexType (o -b), sino, tendremos errores en la serialización de los objetos python y del XML cuando os habléis con vuestro servicio. Aquí me tiré yo horas por no hacer un --help :)

  1. $ wsdl2py --complexType --file Servicio.wsdl
  2. $ wsdl2dispatch --file Servicio.wsdl

Estos dos comandos nos crearán 3 ficheros .py:

  • Servicio_services.py
  • Servicio_services_server.py
  • Servicio_services_types.py

Para crear nuestro servidor, extenderemos Servicio_services_server en una nueva clase (myServer, por ejemplo).

  1. from ZSI import *
  2. class MyServicio(ServicioService):
  3. _wsdl = "".join(open("Servicio.wsdl").readlines()) # para devolver el WSDL a cliente que lo solicite

  4. def soap_getPares(self, ps, **kw):

  5. response = ServicioService.soap_getPares(self, ps, **kw)
  6. request = self.request
  7. return self.getPares(request)

  8. def getPares(self, req):

  9. db = DB.connect()
  10. pares = db.getListaCompra(req.get_element_input())
  11. return pares
  12. ...

  13. # y ahora un poco de OptionParser antes de ponerlo en marcha

  14. op = OptionParser(usage="%prog [options]")
  15. op.add_option("-l", "--loglevel", help="loglevel (DEBUG, WARN)",
  16. metavar="LOGLEVEL")
  17. op.add_option("-p", "--port", help="HTTP port",
  18. metavar="PORT", default=8080, type="int")
  19. options, args = op.parse_args()

  20. if options.loglevel:

  21. loglevel = eval(options.loglevel, logging.__dict__)
  22. logger = logging.getLogger("")
  23. logger.setLevel(loglevel)

  24. # Ejecutamos el servidor

  25. AsServer(port=options.port, services=[MyServicio(),])

Ahora ya sólo faltaría el cliente (y la base de datos, que lo puse ahí vilmente :) ). También, ya habréis visto, los tabuladores del código se los ha pasado el wordpress por el forro, así que no hagáis copypaste ;-)

El cliente, lo dejo como ejercicio al ávido lector (siempre lo había querido decir esto xDD), os dejo un enlace una buena guía por si os quedáis atascados.

Por marcos, hace 3 meses y 13 días

Pedrea! Pedrea!

Y esto no va del Chiki Chiki :)

Pedregada de hace unos minutos en Canet de Mar:

Pedregada

Más en mi cuenta flickr.

Por marcos, hace 3 meses y 13 días

Ens volen fer fora!

NO ENS TOQUEU LA FIBRA! AQUÍ ENS PLANTEM !

El 27 de Març a les 12.30h tenim judici i ens demanen 30.000 euros per poder defensar-nos.

Actualització:
Després de parlar amb la jutgesa, la caució ha estat rebaixada a 150€ i el judici ha passat a ser el dia 17 d'abril.

Fes alguna cosa, participa activament de les pròximes convocatòries, o encara millor organitza alguna acció de suport per petita que sigui.

Manifestació 29 de Març a les 17h. A la Plaça Gran, davant de La Drogueria.

Concentració
també, davant de La Fibra el dia del desallotjament a les 20h.

Por marcos, hace 3 meses y 19 días

Nueva clave GPG

Después de perder varios anillos de mi llave, con varias firmas de otros usuarios de GPG y de que me diese varios dolores de cabeza últimamente no dejándome cifrar mails... he decidido revocar mi clave actual. Cortando por lo sano.

Ya está el certificado de revocación subido a los servidores, así como mi nueva clave (0x01FF3A08).

Perdón a aquellos que ya tengan mi clave y les toque actualizar su llavero ;-)