viernes, mayo 08, 2009

WebServices en .NET - curso .net (III)

Ayer estuvimos trasteando con los webservices.
Supersencillo! Pero bueno... como todas las cosas... que todo va bien mientras va bien.

Te creas un projecto del tipo servicio web, y ya VS (Visual Studio) te crea una template, con ya una operación 'hola mundo'. Lo adaptas y ya tienes tu propio servicio. Los métodos que son servicios (puedes tener en la clase, métodos que no lo sean) están etiquetados.

Posteriormente te creas otro proyecto (que puede ser una aplicación windows normal) y estableces la referencia web con el servicio y eso es todoo.

El servicio llegará un momento en que tendrás que desplegarlo en un IIS, pero VS te monta un servidor en local, donde corre el servicio.

Las dos cosas que me llamaron la atención fueron:
  • Si usas clases en el servicio, en él puedes usarlas normalmente, pero desde fuera de el sólo puedes acceder a atributos y propiedades públicos (y el único constructor válido es el de por defecto; que lógicamente tendrá que tener).
  • No vi ningun fichero XSD por ningún lado. Con ASP.NET, se genera un fichero .asmx, que de hecho si acceder a él en el servidor, te da información sobre los diferentes servicios y el formato de los datos intercambiados. Hay otro tipo de archivo, que se mencionó en el curso, el .aspx, que se corresponderían con los WebForms. El .wsdl ((guisdel) si que se genera. En contraposición, cuando he manejado webservices sobre java, aparte del wsdl se generaba el xsd.

miércoles, mayo 06, 2009

Curso de .net (II)

Tengo pendiente algun post sobre el tema de .net. Pero antes va un minipost.

Hoy tenemos una minipractica. Va a ser interesante el volver a diseñar una miniapp con windows. Desde los tiempos en que estaba en Meta4 y desarrollabamos con VB no habia vuelto a tocar los forms de windows.

Hacer apps con C# en windows está tirado la verdad. Con la ventaja de que C# es un lenguaje muchisimo mejor que el VB que usabamos entonces...
Lo que no puedo comparar es el entorno de M$ con los de Java, ya que no he desarrollado aplicaciones gráficas en Java.

Otra cosilla que quería comentar es que con C# se puede ser muy productivo. No ya por el lenguaje. En este caso la productividad te la da el entorno.
Python es un lenguaje muy productivo por el mismo. C# puede serlo menos, pero el entorno que tienes de desarrollo hace que realmente puedas serlo.
Habría que ver cuanto mas podrías mejorar en la productividad con python con un buen entorno. No lo se, ya que no lo he hecho. Estoy acostumbrado a hacer las cosas a manubrio. Todavía aro mis campos con burro :p.

Pensando sobre lo que hizo M$ con .net, está claro que la jugada fue realmente buena. Imaginaros que no hubieran creado C# y .net... ¿Que seguirían, con VC++ y VB? Estaba claro que tenían que sacar algo... y como no pudieron adaptar Java [autonota: indagar mas esto], tuvieron que crear su propio entorno y crearon un nuevo lenguaje.

Lo único triste de todo esto es que quien esté detras sea M$, y no le interese abrir mas las cosas, y si quieres desarrollar en .Net y C# tengas que hacerlo sólo (practicamente) para Windows.
Yo ni me plantearía desarrollar para Mono, hoy por hoy.
Pero M$ no puede tener otra postura que la que tiene; de otra forma Linux le comería mas pastel.
Lo que si que gana ahora con .net es una mayor compatibilidad entre versiones de windows. Es lo que tiene el programar contra una maquina virtual.

Nota: el profe al final ya no se fue tanto por las ramas... mejor! cuando se iba la liaba parda!

Corrigiendo nif/cif/nie en django

Abrí un ticket sobre este tema, pero me lo marcaron como dup, ya que existía otro, el 10204.
El 10204 tiene un parche, pero es erroneo. Como estoy metido en estos fregaos y la corrección es trivial he subido otro parche.

Ha sido mas coñazo montarse el tema para corregirlo que realmente hacer la corrección.
Para ello hay que bajarse el código del repositorio.

Como las pruebas las voy a lanzar con los tests de regresión es necesario preparar para ello el entorno. Aquí de dicen como.
Como fichero de settings, me hice una copia de .../conf/global_settings.py modificandolo según indican aquí (usé la primera entrada).

Una vez creado el fichero, me creé las siguientes variables de entorno:

export PYTHONPATH = $HOME/.../django/trunk
export DJANGO_SETTINGS_MODULE=tests.cesar_settings

Según lo anterior, el fichero cesar_settings.py lo metí en .../django/trunk/tests.

Para ejecutar los tests de mi interés hice:

runtests.py -v 2 forms

Que ejecuta muchos tests, a pesar de que a mi sólo me interesaba trunk/tests/regressiontests/forms/localflavor/es.py.
Tengo que indagar como ejecutar sólo eso si es que se puede....

Ya para acabar, indicar que algo mas de curro se puede hacer sobre lo que hay en django/contrib/localflavor/es.

martes, mayo 05, 2009

Validación nif/nie y cif

Tenía que implementar un algoritmo para localizar nif/nie y cifs en texto, y de paso comprobar que eran validos.
Como tengo costumbre pasaba de reinventar la rueda, pero la única implementación que encontré era erronea.
Pregunté en la lista de python-es.
En el hilo podeis ver una implementación que hice, y lo que me pasó Jesus y la implementación de django.
Tanto la implementación de Jesus como la de django son mas pythoneras que la mia, pero la mia funciona :p.

En django actualmente hay un ticket abierto para corregir la implementacion, el 10204.

En la wikipedia está muy bien cubierto el tema. Lo único que no comentan es sobre el caso de un NIE que empiza con la letra T. Lo único que he encontrado es:

"La ley establece que el NIF, en caso de personas físicas extranjeras con documentación del pais de origen podrá sustituirse por el número de identidad válido en su país de origen, precedido por una T. Por tanto y de cara a la validación: TODO NIF QUE COMIENCE POR T ES VÁLIDO, dado que el resto del NIF se rige de acuerdo a la legislación propia de cada país"

Se podría considerar que un NIE que empieza con T podría ser valido si sus 8 caracteres siguientes están en el set [A-Z0-9], pero no lo podriamos validar, ya que el algoritmo de validación lo desconoceriamos. No creo que esto ahora mismo se use...
Yo no los aceptaría, en principio, a no ser que realmente hoy en dia, todavía se de el caso.

Una implementación que he visto muy copiada es la de bulma. Lo mas interesante de la misma es la codificación del valor de retorno. Si el valor es <=0 estamos ante un cif/nif/nie invalido.
En caso contrario es válido y ademas nos indica ante cual de ellos estamos por el valor (0,1 o 2).