martes, marzo 17, 2009

Web 2.0 Coffee Camp TJ

El Sábado 7 de marzo de 2009 nos reunimos en el Café D’Volada de Otay Constituyentes para discutir que es el Web 2.0. Fue una reunión que duro aproximadamente 2 horas. Lo que aprendí de la reunión es que para que una aplicación se pueda considerar como WEB 2.0 debe de cumplir con algunas (no todas) características:

Característica Social

Los usuarios participan activamente en el contenido de la misma. El contenido son opiniones o expresiones personales y no simplemente datos, es decir el contenido es mas subjetivo que objetivo por lo tanto esta abierto a discusión y comentarios. En estos casos podemos encontrar sitios como YouTube, Wikipedia (contenido objetivo, pero abierto a discusión), flickr, twitter.

 

Característica Tecnológica

El sitio utiliza Ajax, tiene un API para ser consumido por clientes desarrollados por terceros. Y pueden o no utilizar RIAS. Esta es una característica no obligatoria. En lo personal al inicio del termino Web 2.0 consideraba esta característica mas importante que la social (tal vez por que soy desarrollador).

 

Característica Visual

Comentaron en la reunión (en lo personal no me ha tocado por que no soy diseñador) que algunas personas relacionan el termino web 2.0 con el aspecto visual de la aplicación. En lo general estuvimos de acuerdo en que esto no basta para que la aplicación sea considerada como WEB 2.0 (tómese en cuenta que a la reunión asistimos desarrolladores y diseñadores). Sin embargo eso me hizo pensar que si preguntamos en la calle a la mayoría de la gente tal vez para ellos web 2.0 requiere esta otra característica que para nosotros (desarrolladores y diseñadores) no es necesaria. Si para los que pagan los desarrollos y los diseños, el web 2.0 se refiere a lo visual y los efectos (muchas veces como resultado de la característica tecnológica) quizás esto deba ser considerado como una característica valida (aunque no me guste la idea).

 

Solo discutieron aplicaciones publicas en el Internet, parece que una aplicación privada que corre dentro de una intranet no es considerada como Web 2.0 aunque la mayoría del contenido de estas aplicaciones es generados por los mismos usuarios de la empresa y pudiera utilizar Ajax. Tal vez si el contenido es social, es decir de opinión de los empleados y no datos generados por el negocio, si se considere Web 2.0 (Creo que es algo que debí preguntar)

 

Algunas de las conclusiones personales de la reunión fueron que: siendo Web 2.0 un termino subjetivo, lo que para unos es web 2.0 para otros no lo es (generalmente depende de la perspectiva). Aunque creo que en lo que todos estuvimos de acuerdo es que: twitter si es Web 2.0. por su característica social.

 

Me quedó pendiente una pregunta...Si los comentarios de mi blog no son filtrados y cualquiera puede opinar ¿Los comentarios de mi blog son Web 2.0?

 

Puedes escuchar la reunión en:

http://www.dev3cast.com/

miércoles, marzo 04, 2009

Podcasts

Esta una lista de los podcasts que actualmente escucho

.Net Rocks
Ya un clasico de los podcasts, tiene la mejor calidad de audio y muy buenos invitados y temas sobre .Net

Deep Fried Bytes
Hablan principalmente sobre desarrollo en .net

Hanselminutes
Scott Hanselman web developer y ahora empleado de Microsoft trata varios temas

Polymorphic Podcast
Arquitectura y programación orientada a objetos en .Net (Ya tiene tiempo que no salen nuevos episodios)

The Poscast @ Delphi.org
podcast sobre Delphi

RunAs Radio
Para profesionales de IT, no es desarrollo pero es bueno conocer sobre IT

The Startup Success Podcast
Podcast para Startups o MicroISVs varios consejos para iniciar tu propio negocio de software

stackoverflow
Tratan temas sobre desarrollo y administración de equipos de desarrollo, principalmente hablan del sitio stackoverflow.com

The Thirsty Developer
Este de los mas recientes en mi lista, hablan principalmente de como se esta usando la tecnología.

dev3cast
Podcast de la comunidad .Net en Tijuana

Software Engineering radio
Ingeniería de software tratan temas que aplican a todas las plataforma y lenguages

miércoles, febrero 25, 2009

Reunión 27 de la comunidad TJ.NET

Hoy será la reunión 27 de la comunidad TJ.NET donde estaré presentando el tema de XML Literals en Visual Basic.

Mostrare como carga un archivo XML y con los datos crear un objeto del dominio y a partir de un objeto del dominio del problema crear un archivo XML. Ademas de mostrar como realizar una búsqueda en el documento XML utilizando LinqToXml.

Debido al poco tiempo sera una presentacion sencilla sin entrar mucho a detalle. Espero que los asistentes tengan preguntas, para hacerlo mas interesante.

domingo, febrero 01, 2009

Iniciando con Test Driven Development (TDD)

Al iniciar con TDD , en algunos proyectos, note que esto ha hecho que cambie mi manera de programar. Ya que al tratar de escribir código de manera que sea testeable, termino escribiendo código mas desacoplado y con mas clases que hacen un trabajo mas especifico y con un poco de dependency injection. también he notado que ahora escribo mucho mas código y el resultado a veces es el mismo que antes (con la desventaja que me tarde mas). Aunque muchas veces los tests me han ayudado a encontrar errores mas rápido y me siento mas seguro de que el código que escribo funciona correctamente.

Por el momento estoy utilizando NUnit y NMock para mis unit test en .Net. Para mi gusto estos frameworks están bien para el tipo de tests que realizo.

Por ejemplo, supongamos que estamos construyendo un registro para usuarios. Y queremos que (cuando un usuario nuevo se registre) se validen los datos del usuario, se inserte a la base de datos y se envié correo de bienvenida.

Al escribir el test para el método de registro, debemos de evitar que este tengan dependencias en otras partes del sistema ya que solo queremos validar que se realicen las reglas de negocio y no tanto como se implementa cada tarea (para cada tarea se realizarán sus propias pruebas unitarias) esto me hace escribir mas clases de tal forma que pueda hacer mock objects para las dependencias.

Entonces en lugar de una sola clase para el registro (RegistrationService) que se encargue de validar, insertar y enviar correo, tendremos varias clases que colaboran para realizar el registro. Como pueden ser: RegistrationService, RegistrationValidator, EmailService y RegistrationDAL. Así podemos probar que el RegistrationService realice la regla de negocio y por separado probar cada una de las tareas. Ademas, si por alguna razón cambia la manera de validar el registro, solo tendríamos que modificar la clase RegistrationValidator y no tenemos que cambiar el resto del proceso de registro. Como ven esto implica realizar mas código, pero se supone que a la larga es mejor, Ahora tenemos código que valida nuestro código.

En mi caso realizar unit tests si me ha ayudado a encontrar errores y a estar seguro de que el código hace lo que tiene que hacer. Aunque debo admitir que hay veces que quisiera no tener que escribir tantas clases y pruebas para cada una de estas clases. En fin todo es cosa de saber que no todo requiere unit test y encontrar el balance entre lo que lo requiere y lo que no.

Firebird 2.1 List Function

The List function in Firebird 2.1.

This is an aggregate function that returns a string with the field values concatenated using a delimiter. the default delimiter is the comma. So it's similar to the SUM function, but instead of adding numbers, this function concatenate strings. if some of the values is null then the function returns null.

So suppose I have 2 tables, projects and resources, and I know that a project will have a few resources assigned. Now I need to write a report of projects showing their resources assigned.

CREATE TABLE projects(
project_id INTEGER,
name string
);

CREATE TABLE resources(
project_id integer,
user_name string
);



Without the LIST function I have to write this query

SELECT
p.project_id as id,
p.name,
r.user_name
FROM
projects p INNER JOIN
resources r ON p.project_id = r.project_id

my result will be like this

id name user_name
-------------------------
1 Project_1 Steve
1 Project_1 John
2 Project_2 Jim
2 Project_2 Ed

Then in the report I will need to group the records with the same project_id so I don't show duplicate projects for each resource assigned.

Now with Firebird 2.1 I can write the query using the LIST function

SELECT
p.project_id AS id,
p.name,
LIST(r.user_name, ', ') AS resources
FROM
projects p INNER JOIN
resources r ON p.project_id = r.project_id
GROUP BY
p.project_id,
p.name


my result will be like this

id name resources
-----------------------------
1 Project_1 Steve, John
2 Project_2 Jim, Ed


then in my report I only need to show the results of my query, I don't need to create groups.

The list function returns a BLOB data type, so if I need to display the result in a grid I often CAST the result to varchar. The delimiter parameter is not required (I added because I like to add a space after the comma). You can see more details of how to use the LIST function in the Firebird 2.1 Release Notes

This function is also useful in reports when you need details values in the same row as the master data like in reports headers or footers.

domingo, diciembre 07, 2008

Firebird 2.1 UPDATE OR INSERT

Another great feature that I like in Firebird 2.1 is the UPDATE OR INSERT statement. It's a really time saver and it makes the SQL cleaner.

For example suppose I have a products table like the one I use in my last post and an inventory table to store the product stock. Before Firebird 2.1 if I want to set the stock for a product I needed to check if a record for that product_id already exists; if the product_id already exists then I write an update. If not then I write an insert statement. So I ended up with something like this:


IF EXISTS(SELECT * FROM inventory WHERE product_id = :product_id ) THEN
UPDATE
inventory
SET
stock = :stock
WHERE
product_id = :product_id;
ELSE
INSERT INTO inventory
(product_id, stock)
VALUES
(:product_id, :stock);

In this example I only update one field but when I have to update a big table I ended up with a big chunk of code and thinking: "there should be another (better) way to do this".

Fortunately now with Firebird 2.1 there is a better way to do it, I only need to use the UPDATE OR INSERT statement and the engine will take care of checking if the record already exists, based on the primary key value. If the table does not have a primary key defined then I should use the MATCHING keyword with the columns I want to match. So in this example the sql can look like this:

--product_id is the primary key

UPDATE OR INSERT INTO inventory
(product_id, stock)
VALUES
(:product_id, :stock);

or like this

--product_id is not defined as the primary key

UPDATE OR INSERT INTO inventory
(product_id, stock)
VALUES
(:product_id, :stock)
MATCHING
(product_id);


This code looks much cleaner and does not need any comments to explain what is going on.

I really like this new feature.

martes, septiembre 02, 2008

Firebird 2.1 Domains in PSQL

I Often use this domains in my Firebird databases

CREATE DOMAIN STRING AS VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI; /* for Spanish text */
CREATE DOMAIN MONEY AS DECIMAL(15, 2);
CREATE DOMAIN BOOL AS SMALLINT CHECK VALUE = 0 OR VALUE = 1;

So I can use them in my tables definitions like this:

CREATE TABLE PRODUCTS(
ID INTEGER,
DESCRIPTION STRING,
PRICE MONEY,
ACTIVE BOOL
)
ALTER TABLE PRODUCTS ADD CONSTRAINT PK_PRODUCTOS PRIMARY KEY (ID);

Before Firebird 2.1 when I wanted to create a stored procedure I had to write the data type of the domain instead of the domain name, like in the table definition, so I had to check the domain definition and write the data type on the procedure definition, although IBExpert help with that, my Stored Proc definition end it up not using the domains like this:

CREATE PROCEDURE INSERT_PRODUCT(
DESCRIPTION VARCHAR(50),
PRICE DECIMAL(15, 2),
ACTIVE SMALLINT
)
BEGIN
...
END

Now with version 2.1 I can use domain in PSQL. I just need to type the domain name if i want to inheriting the check clause and the default value, or I can use the TYPE OF keyword if I just want the data type so I can define something like this:

CREATE PROCEDURE INSERT_PRODUCT(
DESCRIPTION STRING,
PRICE TYPE OF MONEY,
ACTIVE BOOL
)
BEGIN
...
END

This way it seems that there is more consistency on my data types.

jueves, agosto 28, 2008

Firebird 2.1 Autentificar con Windows

La mayoría de las aplicaciones que desarrollo que utilizan Firebird son de tipo Cliente/Servidor lo cual hace que el deba de guardar al usuario y contraseña en la cadena de conexión almacenada en la maquina cliente.

Ahora con Firebird 2.1 puedo usar los usuarios de windows como usuarios de la base de datos, de este modo no necesito almacenar el usuario y contraseña en la maquina cliente.

Utilizando Delphi o C++ Builder con DbExpress para conectarme a la base de datos puedo agregar el archivo dbConnections.ini y dejar en blanco los valores de user_name y password. El archivo quedaría similar a esto:

[MyFirebirdDatabase]
DriverName=INTERBASE
GETDRIVERFUNC=getSQLDriverINTERBASE
DATABASE=Server:Database
PASSWORD=
USER_NAME=
SQLDIALECT=3

Si uso .Net y el Firebird .Net Data Provider la cadena de conexión puede quedar algo asi:
Database=MyDatabase.fdb;DataSource=MyServer;Dialect=3;

Si el usuario es administrador entonces ingresará al servidor de firebird como el usuario SYSADMIN si no usara el usuario d windows actual.

Ahora solo debo de agregar los usuarios de windows a los usuarios de la base de datos y windows se encargará de autentificar.

Firebird Windows Authentication

Most of the applications I write that use Firebird are Client/Server applications storing the user name and password to access the database in the connection string in the client machine.

Now with Firebird 2.1 you can use windows authentication so the client will use the windows user to log on to the server. This way I don't need to store the user name and password on the connection string in the client.

MS SQL Server has this feature for long time now. but it's great to have it on Firebird too.

Using Delphi or C++ Builder with DbExpress to accesss firebird in the dbconnections.ini file I just leave blank the user_name and password values, so I could have something like this:

[MyFirebirdDatabase]
DriverName=INTERBASE
GETDRIVERFUNC=getSQLDriverINTERBASE
DATABASE=Server:Database
PASSWORD=
USER_NAME=
SQLDIALECT=3

Using the Firebird .Net Data Provider the connection string will end up like this:
Database=MyDatabase.fdb;DataSource=MyServer;Dialect=3;

If the windows user is an administrator it will log in to the server as the SYSADMIN user. if the user is not an admin then the user will log in as the windows user.

Now I only have to add the windows users as database users and Windows will take care of authenticate them.

miércoles, julio 02, 2008

Firebird 2.1

Estoy empezando a usar Firebird 2.1 y estoy contento con las nuevas características. Aun no he tenido de oportunidad de usar todo lo nuevo, aquí esta una lista de lo nuevo que he estado usando, espero escribir de cada una de ella con mas detalle en los próximos posts
  • Seguridad usando usuarios de Windows
  • Parámetros Opcionales en procedimientos almacenados
  • Dominios en los parámetros de los procedimientos
  • Natural Join
  • La función List
  • Sentencia Update or Insert
Hay mas características en la nueva versión, que aun no he tenido oportunidad de utilizar.

lunes, mayo 19, 2008

Abrir Documentos de MS Office 2007 con OpenOffice.org 2.4

Para abrir documentos con el formato de open Xml (.docx, xlsx, pptx) con openOffice.org estoy utilizando un convertidor http://katana.oooninja.com/w/odf-converter-integrator, este programa crea una copia del archivo a un formato que OpenOffice.org puede abrir. Hasta ahora todos los archivos que he probado han sido convertidos con calidad.

domingo, marzo 02, 2008

Firebird and DBX4

Although Firebird is not officially supported by the Interbase dbexpress driver it can be used without problems until the BSD 2006 (and the Turbo versions).

Now with Delphi 2007, RAD Studio and DBX4, firebird can still be use with Interbase driver, except if is used on Blobs fields; they allow reading but does not allow updating. This presents a problem when migrate applications to the latest version of Delphi and RAD Studio. This was reported in Quality Central but CodeGear closed the post arguing that Firebird is not Interbase, and the driver was written for Interbase, therefore it’s not a bug.

I suppose Firebird and Interbase will be separating each other more on future versions. I hope CodeGear will develop a driver for firebird because there are many applications made with Delphi and C++ Builder that are using Firebird.

Firebird DBX4 Blob Fields

Aunque Firebird no es oficialmente soportado por el driver de interbase para dbexpress, se puede utilizar sin problemas hasta la versión de BSD 2006 (incluyendo los Turbo).
Ahora con la versión 2007 y DBX4 se puede seguir utilizando el driver de interbase, excepto si se usa campos Blobs. Ya que estos solo pueden ser leídos, pero no pueden ser actualizados. Lo cual representa un problema al querer migrar aplicaciones a la nueva versión de delphi y/o RAD Studio.

"El Problema" fue reportado en Quality Central pero CodeGear cerró el post argumentando que Firebird no es Interbase y el driver fue escritó para Interbase, por lo tanto no es un bug.


Supongo que poco a poco se irán separando cada vez más la base de datos Firebird e Interbase. Ojala y CodeGear desarrolle un driver para firebird ya que muchas de las aplicaciones hechas en delphi y BCB utilizan este servidor SQL.