viernes, 28 de diciembre de 2007

Jugando con un DataGridView

Tengan un buen día, primeramente mil disculpas porque no he posteado hace ya 1 mes, pero bueno. He estado en un proyecto, y gracias a eso, he aprendido bastante (aprendí desde 0 a la fuerza) acerca de ADO.NET, ya que antes, al trabajar con acceso a datos, lo hacía de manera manual, es decir, creando la consulta, ejecutándola en la DB, guardando los resultados en un array y luego dándoles formato para mostrarlos como texto plano (en PHP aun lo hago asi XDD ) pero en .NET existe algo llamado ADO.NET que básicamente es un conjunto de librerias y clases del .NET Framework encargadas de la manipulación de datos (mas simple, el conjunto de clases que usamos para trabajar con datos de una fuente de datos, sea una DB, un XML, etc.), lo que nos permite trabajar de manera más facil con datos, ya sea realizando cambios en una DB, insertando datos, presentando datos al usuario, etc. Para ello contamos con muchos objetos que nos facilitan esto, y uno de ellos (de los mas importantes a mi parecer, y el cual ha sufrido varias transformaciones desde que salió) es el ahora conocido (desde .NET Framework 2.0) DataGridView, que básicamente es una rejilla o tabla donde podemos presentar datos de una o varias tablas o columnas de una fuente de datos, así como también posibilidad de modificar dichos datos en esa tabla y luego hacer efectivas dichas modificaciones en la fuente de dtos, eliminar o insertar registros o incluso, facilitar dicha edición o modificación de datos mediante la inserción de otros controles en el DataGridView como combobox, checkbox, etc.

En fin, esto es para los que ya tenemos una noción de lo que es ADO.NET. A lo que quiero llegar es que podemos hacer un sinfin de cosas con un datagridview, como:

Cambiar el texto del encabezado de la columna: Para esto utilizas la propiedad siguiente:

DataGridView.Columns[i].HeaderText = "";

Ocultar una columna (ojo, ocultar no eliminar):

DataGridView.Columns[i].Visible = True/false;

Les traigo mas en otro post.

viernes, 23 de noviembre de 2007

Regions en C#


Tengan un buen día. Me encuentro algo ocupado trabajando en un sistema de control de pólizas para una aseguradora, un sistema en C# 2005 con MySQL, y en equipo con un amigo mío. Este sistema es de gran complejidad, y muchas veces es tan tedioso ver una gran cantidad de líneas de código, que quisieras ocultarlas por un momento, pero en Visual Studio puedes ocultar los cuerpos de los métodos, pero que pasa si quieres ocultar un gran bloque de código? Para ello amig@s mios tenemos lo que es el uso de #region y #endregion, dos "palabras" que técnicamente son conocidas como directivas de preprocesamiento, el objetivo de estas directivas especificamente es el de rotular y poder expandir o colapsar X líneas de código fuente (esto último es posible si usamos Visual Studio o algún otro IDE que soporte esta característica) lo cual es bastante útil ya que nos permite contraer o colapsar código cuando no necesitamos leerlo, o para identificar un cierto bloque de código que haga una determinada función por ejemplo. Luego de tanta palabrería, veamos un ejemplo. Tenemos la siguiente clase:


using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System.Collections;
using System.Data;

namespace demo2
{
class agregarAseg : conexiones.conexion
{
public string agregarReg(SortedList datosNewAseg)
{
this.datosNewAseg = datosNewAseg;
addRegistro();
return numAseguradora;
}

MySqlCommand comandito; MySqlDataReader lectorId;
string numAseguradora;
SortedList datosNewAseg = new SortedList();

private void addRegistro()
{
string strInsercion = "INSERT INTO aseguradora VALUES (null,'" + datosNewAseg["nombre"] + "','" + datosNewAseg["ubicacion"] + "','" +
datosNewAseg["numRegFiscal"] + "','" + datosNewAseg["telefono"] + "','" + datosNewAseg["fax"] +
"','" + datosNewAseg["fechaFundacion"] + "','" + datosNewAseg["numAgenda"] +
"','" + datosNewAseg["sitioWeb"] + "','" + datosNewAseg["telAsistencia"] +
"');";
comandito = new MySqlCommand(strInsercion, enlace);
conectarme();
comandito.ExecuteNonQuery();
strInsercion = "SELECT MAX(id) FROM aseguradora;";
comandito = new MySqlCommand(strInsercion, enlace);
lectorId = comandito.ExecuteReader(); lectorId.Read(); numAseguradora = lectorId.GetInt32("MAX(id)").ToString();
desconectarme();
}
}
}


Y por ejemplo, no queremos estar viendo ese sector de código donde declaramos unas variables, este sector para ser mas exactos:



MySqlCommand comandito; MySqlDataReader lectorId;
string numAseguradora;
SortedList datosNewAseg = new SortedList();


Entonces creamos una región, en la cual también vamos a poner una descripcion de ese bloque de código, lo que se hace colocando #region al principio del bloque, seguido por la descripción, y al final del bloque poner #endregion. Al final la clase queda de la siguiente manera:



using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System.Collections;
using System.Data;

namespace demo2
{
class agregarAseg : conexiones.conexion
{
public string agregarReg(SortedList datosNewAseg)
{
this.datosNewAseg = datosNewAseg;
addRegistro();
return numAseguradora;
}
#region Aqui va el DataReader para leer los datos de la consulta, un string con la consulta y un SortedList
MySqlCommand comandito; MySqlDataReader lectorId;
string numAseguradora;
SortedList datosNewAseg = new SortedList();
#endregion

private void addRegistro()
{
string strInsercion = "INSERT INTO aseguradora VALUES (null,'" + datosNewAseg["nombre"] + "','" + datosNewAseg["ubicacion"] + "','" +
datosNewAseg["numRegFiscal"] + "','" + datosNewAseg["telefono"] + "','" + datosNewAseg["fax"] +
"','" + datosNewAseg["fechaFundacion"] + "','" + datosNewAseg["numAgenda"] +
"','" + datosNewAseg["sitioWeb"] + "','" + datosNewAseg["telAsistencia"] +
"');";
comandito = new MySqlCommand(strInsercion, enlace);
conectarme();
comandito.ExecuteNonQuery();
strInsercion = "SELECT MAX(id) FROM aseguradora;";
comandito = new MySqlCommand(strInsercion, enlace);
lectorId = comandito.ExecuteReader(); lectorId.Read(); numAseguradora = lectorId.GetInt32("MAX(id)").ToString();
desconectarme();
}
}
}





De esta manera, rotulamos el código donde declaramos las variables y al trabajar en un IDE que soporte la expansion y colapsamiento podremos ocultar ese código y ver unicamente la descripción de dicho bloque, y si queremos volver a expandirlo, veanlo en la imagen de abajo (Haga click para verla mas grande)



Espero que les sirva tanto como a mi.

viernes, 19 de octubre de 2007

Conectarme a MySQL desde aplicación .NET

Tengan un buen día. Debido a un proyecto de desarrollo de un sistema en el que me encuentro con un amigo, el cual consiste en un sistema desarrollado en C# 2005 y utilizando una DB MySQL me vi en la necesidad (y entretenimiento) de investigar como conectarme a MySQL desde una aplicación desarrollada en la plataforma .NET y luego de revisar unas cuantas, encontré una alternativa excelente llamada MySQL Connector/Net que es Open Source (ustedes pueden elegir entre descargar el instalador de la librería, la librería como tal o el proyecto para poder editar el código fuente) que además sigue el modelo de estructura que siguen las librerías de los proveedores que ya trae el .NET Framework como SQLClient (SQL Server), OLEDB (Access y otras DB), etc. En este post vamos a aprender a utilizar esta librería de forma básica haciendo un simple INSERT para dejarlos con esas ganas de seguir investigando y haciendo cosas más complejas.

Empezaré considerando que ya manejan lo que es el servidor de DB MySQL, que poseen conocimientos básicos de algún lenguaje .NET (el ejemplo está en C#) y que ya han trabajado de manera básica con DB.

Primeramente creemos una base de datos en MySQL llamada "test" con una tabla llamada "prueba" con un único campo llamado "estado" del tipo varChar(50) de la siguiente manera (yo estoy usando PHPMyAdmin pero si lo desean pueden usar el prompt window):

NOTA: Haz click en las imágenes para verlas a un tamaño adecuado.



Despues, para este ejemplo vamos a crear un usuario llamado "usuario" con el password "prueba" con privilegios sobre la DB "test" para poder ejecutar un INSERT al menos.

Luego de ello descargamos del siguiente sitio la librería nada más (la dll) de la siguiente dirección:

http://dev.mysql.com/downloads/connector/net/

Desgargamos el que dice "Binaries, no installer" y luego extraemos la dll que está en la carpeta bin y la colocamos en otro lugar, luego creamos un nuevo proyecto de Visual Studio (yo lo haré en C# pero pueden hacerlo en Visual Basic, tambien con C++) y lo que haremos será incluir la dll en nuestro proyecto, para ello nos vamos al explorador de la solución, luego click derecho en agregar referencia, luego nos saldrá un cuadro de diálogo, nos vamos a la pestaña Browse y ahi buscamos la dll en la ubicación en donde la tienen, y de ese modo se agregará al registro de Visual studio y estará ahi disponible para todos los proyectos.


Ahora estamos listos. Voy a comenzar con lo que es la lógica de la aplicación, para ello crearé una clase llamada conexion.cs que contendrá el siguiente código:


using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;

namespace mysqlconexion
{
class conexion
{

MySqlConnection enlace = new MySqlConnection("Address=localhost;Database=test;Username=usuario;PASSWORD=prueba");

public void insDatoPrueba(string commentary)
{
String strComando = "INSERT INTO prueba (estado) VALUES ('" + commentary + "');";
MySqlCommand comandito = new MySqlCommand(strComando, enlace);
enlace.Open();
comandito.ExecuteNonQuery();
enlace.Close();
}
}
}

Voy a explicar el siguiente código: Primeramente en la 4ta línea importo un namespace con la palabra "using" y el namespace es el de la librería de MySQL. Luego, en el cuerpo de la clase creo un objeto del tipo MySQLConnection el cual será el canal que se abrirá entre mi aplicación y el servidor MySQL permitiéndome realizar determinadas cosas dependiendo del usuario que la aplicación utilize (en nuestro caso, este usuario podrá ingresar únicamente a la DB test).
Para ello le pasamos ciertos parámetros utilizando el constructor (tambien podemos especificarlos en la propiedad connectionString del objeto) en forma de clave=valor, y podemos ver pares como Address=localhost; ya que estoy usando un servidor local, pero si utilizan un servidor remoto simplemente especifican ahí la URL, Database=test; que es la DB a la que nos conectaremos, Username=usuario;PASSWORD=prueba que son el usuario y contraseña que utilizará el objeto conexion para poder conectarse (valga la redundancia).
Hago un método público llamado insDatoPrueba con un parámetro llamado commentary que será el texto que vamos a insertar y que provendrá del textBox del formulario. Luego creamos lo que es la sentencia SQL que vamos a ejecutar en la DB test agregándole el texto obtenido del textBox. Despues creamos un objeto del tipo MySQLCommand el cual contiene la sentencia SQL que acabamos de crear y los métodos para poder ejecutarla, ya sea una sentencia de consulta o de alteración de datos.
Bueno, luego de llegar a esto, vemos que ya tenemos lo necesario, pero NO ESTAMOS CONECTADOS!!! XD para ello utilizamos el método open() el objeto conexión el cual toma los parámetros especificados en el constructor para intentar conectarse. Luego de esto, ejecutamos el método executeNonQuery() del objeto MySQLCommand el cual ejecuta la consulta que dicho objeto contiene, si esta consulta es INSERT, UPDATE o DELETE, ya que si es SELECT utilizamos una variable del tipo MySQLDataReader para ello, aunque eso se los dejo de tarea. Finalmente utilizamos el método close() del objeto conexion para cerrar el enlace, por cuestiones de seguridad debe ejecutarse siempre este método al finalizar.
Luego nos vamos a crear el formulario, para ello agregamos un botón y un textbox llamados btnInsertar y txtComentario respectivamente. Luego damos doble click al botón para agregar el código para que genere una instancia de la clase conexion y ejecute el método insDatoPrueba() pasándole como parámetro el texto escrito en el textBox, el cual es (este código va dentro del evento onClick de btnInsertar):

conexion obje = new conexion();
obje.insDatoPrueba(this.txtComentario.Text);

Finalmente, ejecuten la aplicación y verán el resultado. Aquí les dejo lo que hice, un archivo .rar el cual contiene el proyecto de Visual Studio, luego para que funcione deberán crear la DB tal como en este ejemplo, descargable >>AQUI<<. Cualquier pregunta no duden en hacerla mediante los comentarios al post.

sábado, 29 de septiembre de 2007

Visita del Sr. Erick Esquivel, Academic Developer Evangelist de Microsoft

Tengan todos un buen día. Las cosas parecen tener un buen panorama en el ámbito académico en El Salvador, y es debido a que tuvimos la visita de el nuevo Academic Developer Evangelist encargado de El Salvador, Guatemala y Honduras, el Sr. Erick Esquivel, con el propósito de continuar con las llamadas "Células Académicas Microsoft" en El Salvador, las cuales lamentablemente se han visto truncadas por acciones erróneas por parte de ciertos entes educativos.

Pero, afortunadamente la visita de este señor de origen guatemalteco nos motiva y nos permite continuar utilizando un nuevo enfoque de trabajo que va a permitir la integración de todas las universidades, por ahora, del área central del país, y, quien sabe, con el trabajo que se va a empezar a hacer podremos trabajar también con las personas de las universidades aledañas.

Esto, considero yo, que es muy importante tanto para mí como para los estudiantes de El Salvador, pues actualmente no tenemos movimientos académicos fuertes de este tipo y gracias al apoyo que nos estará brindando el Sr. Esquivel podremos comenzar con una nueva era de los grupos académicos de Microsoft, lo cual pienso que es algo de bastante trascendencia pues el hecho de trabajar en este tipo de cuestiones es lo que al final nos va a hacer sobresalir entre la gente común, no lo digo en forma de discriminación o por ser despectivo, sinó porque la mayoría de personas se conforman con lo normal, vivir una vida normal, hacer cosas normales, pero la verdad es que en este mundo, lo único que vamos a lograr siendo normales es ser cualquiera en un mundo que está liderado por personas que salen de los estandares de lo común, por lo que aprovecho para incentivar a todas las personas, no importa que sean unos adictos del desarrollo y de las tecnologías como yo o que tengan otras orientaciones tales como leyes, administración, economía, ciencias sociales, etc. Que tratemos de sobresalir, no nos conformemos a ser como cualquiera, participemos de actividades referentes a nuestros gustos, hagamos cosas que nadie hace con el propósito de ganar conocimiento, enfoquemonos en estudiar lo que nos interesa, y muchas otras cosas.

También, para toda la gente de mi tierra El Salvador que visita mi blog, y que deseen estar al tanto de esta nueva era de los grupos académicos, pueden estar al tanto visitando nuestro forouniversitario donde podrán ver información de futuros eventos a realizarse, concursos, etc. E incluso, para quienes compartan nuestra afición, podrian hasta formar parte de este grupo.





Algunos miembros del Core Group de las células Académicas Microsoft en El Salvador.




Al centro, el Sr. Erick Esquivel.

viernes, 7 de septiembre de 2007

Introducción a UML

Tengan un buen día. He notado que muchos de nosotros, como desarrolladores de software (de escritorio o web; en C++, Borland, ALGOL, Cobol, RPG, Simula, B, C, C#, etc.), obviamos muchas cosas en el amplio mundo del desarrollo, cosas de tipo teórico (metodologías, planeación, modelado, etc.) Que son bastante importantes pues nos ayudan a:

-Elaborar software de calidad

-Trabajar de manera adecuada dentro de un equipo de trabajo

-Organización en un equipo de trabajo

-Y muchas otras más

Para ello nos auxiliamos de metodologías tales como el análisis de sistemas, la ingeniería del software, etc. Pero a lo que me quiero enfocar es en una herramienta que ayuda en el desarrollo de un proyecto. No servirá de mucho si debemos desarrollar un proyecto de software pequeño, que podemos hacer nosotros solos en poco tiempo, para lo cual basta con planear el proyecto en una hoja de papel solo para ver “que va a llevar”. Pero este no es el caso cuando se está en un equipo de trabajo de desarrolladores con un proyecto de mediana-alta dificultad, de bastante tiempo de trabajo, en donde los diferentes inconvenientes son:

-Comunicar las ideas que se tienen de la arquitectura del software

-Designar adecuadamente y sin confusión alguna que va a hacer cada uno

Porque si estamos con un equipo de trabajo de desarrolladores y nos ha tocado la labor de de diseñar el sistema, no podemos hacer algo como ponernos a escribir en un trozo de papel lo que consideramos debe llevar el software, pues será informal, no entendible por todos y desorganizado.

Para ello está una herramienta, mejor dicho, un lenguaje, que es el UML (Unified Modeling Language ó Lenguaje de Modelado Unificado) el cual nos sirve para hacer una representación del sistema previa a su codificación y en la fase de análisis, ya que nos permite representar la funcionalidad del software, es decir, como el usuario va a interactuar con el software, que le devolverá el software, los procesos que van a realizarse, y también a nivel de código puede hacerse un diagrama del software determinando las clases que va a llevar, los métodos que contendrá cada clase, los módulos, etc. (para ello se debe aplicar la programación orientada a objetos) a fin de crear diagramas que representen de manera adecuada la arquitectura del software, que pueda ser entendida por todos los miembros de un equipo de trabajo y que facilite la asignación de responsabilidades.

Diagramas de caso (Case diagrams)

Cuando iniciamos un proyecto de desarrollo de software, el primer paso (y uno de los más importantes) es la determinación de requerimientos del usuario final, lo cual se logra mediante entrevistas, observación, revisión de documentación, etc. Y luego de ello, algo que deberíamos de hacer es mostrar al usuario como es que el va a trabajar con el software, es decir, presentar el software desde la perspectiva del usuario, esto lo logramos haciendo uso de los diagramas de caso, y un ejemplo es el siguiente:

Digamos que vamos a hacer un sitio web acerca de artículos de informática (programación, bases de datos, diseño gráfico, etc.) parecido a sitios como www.maestrosdelweb.com, www.data2max.com, etc. Ya sabemos que funcionalidad va a tener el sitio, y queremos representarla a, el gerente o algo asi, entonces utilizamos un diagrama de casos para representarlo como el que aparece a continuación.

NOTA: Haz click en las imagenes para verlas bien, pues como son algo grandes los diagramas, no los podia mostrar completamente aqui.





Tan sencillo, si, asi es un diagrama de casos. En este diagrama, al muñequito que representa al usuario, es llamado el actor, mientras que la acción encerrada en el óvalo es el caso.Pero, imaginémonos que deseamos ser mas específicos con las acciones que podrá realizar el usuario, pues simplemente detallamos mejor dichas acciones de la siguiente manera.






También sabemos que debe haber un administrador para el sitio web, y este también debe realizar otras acciones o casos tales como crear artículos, eliminar artículos, subir archivos al servidor, administrar el foro. Simplemente hacemos otro diagrama de caso expresando que el actor es el administrador.






También sabemos que el administrador debe realizar ciertas tareas administrativas que son las que permiten que solo el administrador (y no al usuario normal obviamente) pueda llevar a cabo los casos que están en el diagrama anterior, estas tareas son acciones independientes que deben realizarse previamente a las acciones administrativas, y estas acciones son llamadas en UML casos de uso administrativo, y se representan dentro del diagrama de igual modo que los casos normales, solo que se concatenan a los casos normales con una línea punteada y con la palabra include, de la siguiente manera.






Y, por último en esta introducción a UML, especificar que pueden incluirse varios actores en un diagrama de casos y que hay acciones o casos que pueden ser llevados a cabo por mas de un usuario de la siguiente manera.






Con esto finalizo lo que es una introducción a UML, debido a que hay más tipos de diagramas, los cuales voy a tratar en otro post.

domingo, 12 de agosto de 2007

Serialización normal y XML en .NET

Tengan un buen día, señoritas y señores. Aquí les traigo un artículo acerca de la serialización utilizando C#, para variar un poco y dejar descansar a AJAXito y PHPcito por un pequeñisimo instante. La serialización, es un proceso en el cual se guarda el estado de un objeto, es decir, una instancia de una clase, para guardar ese estado en un archivo con el propósito de poder utilizarlo después haciendo el proceso inverso el cual es llamado deserialización. Pero, explicado de manera más mundana, voy a plantear un ejemplo:

Digamos que en un proyecto hemos creado la clase Perro. La clase perro tiene las propiedades siguientes:

public string raza;
public int edad;
public string nombre;

Entonces, digamos que tenemos una aplicación en la cual el usuario especifica los datos de su perro, y para ello, en el código, la lógica es que creamos una instancia de la clase perro para guardar en ella los datos del perro del usuario, de la siguiente manera:

Perro canino = new Perro();
canino.raza = "ChowChow";
canino.edad = "3";
canino.nombre = "Dixo";

Y luego? si deseamos que, a partir de aquí, cada vez que el usuario abra la aplicación, se utilizen los datos que el ingresó de su perro la primera vez, ¿qué podemos hacer?

a)Guardar los datos en una base de datos y crear código para cargar dichos datos cada vez que el usuario abra la aplicación, lo que implicaría que la aplicación estaría atada a una base de datos y tendría que abrirse uan conexión solo para extraer esos datos.

b)Usar serialización para guardar la instancia de la clase Perro y y deserializando el objeto cuando se abra la aplicación.

La segunda opción es la más factible, pero, ¿como es la lógica?

1º Tenemos el objeto o instancia de la clase que deseamos serializar, en nuestro ejemplo, la instancia nombrada canino, que ya contiene datos para la raza, edad y nombre.

2º Creamos un objeto lector de archivos, de los cuales hay varios, como el StreamReader, el FileStream, etc. para poder ya sea abrir un archivo existente, de cualquier extensión, o crear un nuevo archivo, con el objetivo de guardar ahi la información serializada.

3º Creamos un objeto formateador, del cual hay varios tipos, pero el que utilizo es el formateador binario (BinaryFormatter) el cual va a serializar o deserializar el objeto deseado y dichos datos los va a guardar en un archivo de texto utilizando el objeto lector de archivos.

4º Se serializa/deserializa el archivo y LISTO!!

Serializar datos es una gran alternativa cuando se desea almacenar informacion pequeña que se utiliza a menudo, sin amarrar a la aplicacion a una base de datos.

La serialización/deserialización XML es parecida, obviamente es cuando se guarda el objeto serializado en un archivo XML, en este tipo de serialización se pueden trabajar el modo de serializar los datos, como por ejemplo si queremos que alguna propiedad del objeto sea guardada como un elemento o como un atributo de un elemento, ya que, si no especificamos nada para serializar un objeto en un archivo XML, la estructura de dicho XML es la siguiente:



Para entenderlo mejor, supongamos que serializamos el objeto de la clase Perro el cual está así:

Perro canino = new Perro();
canino.raza = "ChowChow";
canino.edad = "3";
canino.nombre = "Dixo";

Basandonos en la información, el documento XML quedaría de la siguiente manera:



Pero, nosotros podemos hacer varias cosas en el codigo de la clase, como por ejemplo si queremos determinar que una propiedad no sea serializada, se le antepone a la declaración de dicha propiedad lo siguiente:
[NonSerialized()] //Para no ser serializada de forma normal (binaria)
public int propiedad;

[XmlIgnore()] //Para no ser serializada de forma XML
public int propiead;

O si se desea que una propiedad sea un atributo de un elemento, se especifica cual será su nombre como atributo de la siguiente manera:
[XmlAttribute(AttributeName="nombre")]
public int propiedad;

Tambien una especificación más, y es que para que una propiedad sea serializable, esta debe ser pública o tener algun modificador de acceso, de lo contrario no se serializará.

Luego de toda esta teoría que puede parecerles aburrida pero necesaria de entender, les dejo un vínculo para descargar una aplicación en la cual se llevan a cabo la serialización/deserialización binaria y XML, que se encuentra bien documentada (ya que tengo el mal hábito de no documentar los codigos que escribo XD ) y no necesitarán más que haber leido esta teoría y la documentación para poder entender el código, pero si por si acaso tienen alguna duda pueden hacermela saber mediante los comentarios al artículo o pueden mandarme un correo a
osk-r_orlando@hotmail.com

Pueden descargar la aplicación
>>AQUI<<

Espero que les haya servido, tengan un buen día y sigan revisando el blog para proximos artículos acerca de C# o PHP, AJAX, MySQL, etc.

Felicitaciones a Jamaica!! Tercer lugar en la IC07!!!


Bueno, señoritas y señores, me complace anunciar que Jamaica, nuestro representante de la región de Centro américa y el Caribe, (ya que su servidor es de El Salvador) quedó en tercer lugar en la competencia más importante realizada por Microsoft, la Imagine Cup 2007 cuyas finales fueron realizadas en Corea hace unos días. Esto demuestra que la región centroamericana tiene un gran potencial, así que los exhorto, a todos los que lean esto, a que participen en la IC08 cuyas finales se realizarán en Francia, ya que, si nos esforzamos, de veras que se puede lograr.

Para más información acerca de Jamaica, pueden ir al blog siguiente:

http://channel8.msdn.com/Posts/142/

Bastante bueno, en donde pueden presenciar una entrevista con el equipo Jamaiquino ICAD en una entrevista en donde dan una explicacion y ciertos detalles acerca de su proyecto.

También, si desean conocer más información acerca del primer lugar o los ganadores de las demás categorías, pueden visitar el blog de Williams Molina http://caldoit.blogspot.com/ para más detalles, y también si desean registrarse u obtener información mas detallada acerca de la IC08 pueden visitar el sitio oficial que es www.imaginecup.com en donde pueden ver las diferentes categorías en las cuales pueden participar con sus requerimientos, especificaciones, así como también foros para resolución de dudas y ese tipo de cosas. Tengan un buen día.

sábado, 11 de agosto de 2007

Lista de coincidencias con AJAX

Tengan un buen día. Lamento la ausencia de posts durante estos días, pero gracias a Dios aquí les traigo otro de mis pininos en el mundo de AJAX. Y este es, acerca de como crear una lista de coincidencias, así como cuando, para los que tienen cuenta en gmail, cuando van a redactar un mensaje y están escribiendo la dirección de correo, les aparece un cuadro donde aparecen todos los correos que comparten un patrón de coincidencia con la el correo que usted está escribiendo. En ese caso, se utiliza la tectnología, o mejor dicho, el conjunto de tecnologías conocido como AJAX, y JavaScript, para hacer lo siguiente:

Digmamos que voy a mandar un correo a princesa_zkarleth@hotmail.com, entonces digito "prin" y en seguida en la parte de abajo del campo de texto aparece un cuadro con todos los correos electrónicos de nuestros contactos que empiezan con "prin", se selecciona el deseado y listo!! Bastante práctico, para no escribir tanto.

En este caso, al digitar texto, mediante el evento onKeyUp, se manda a llamar una función que usa AJAX para realizar la solicitud a la base de datos donde se guardan nuestros contactos para recopilar todos aquellos cuyos correos empiezen con la cadena que digitamos en el campo de texto, luego los devuelve a la página sin necesidad de haberse actualizado esta, luego justo abajo del campo de texto, usando javascript se crea un cuadro el cual se rellena de la "respuesta" que nos envia el servidor, que digamos, es un arreglo con los correos que coinciden, luego si el usuario da click a un elemento del cuadro, con un evento se activa una función que toma el valor que el usuario seleccionó y lo "pega" en el campo de texto y ahi está.



Y cuando ví esto, me dieron ganas de intentarlo, pero, francamente, no domino bien JavaScript, por lo que decidí hacerlo (bueno, incompleto, ya veran porque) pero no creando un cuadro con JavaScript, sino que creando un listbox dinámicamente y asíncronamente con las coincidencias. Para ello me auxilié del agradable lenguaje del lado del servidor PHP así como la base de datos MySQL, ya que les explicaré como funciona el script que hice:

Hay una página con un cuadro de texto, en el cual yo voy digitando un nombre, entonces cada vez que digito o borro un caracter, usando el evento onkeyUp, hago una llamada asíncrona con AJAX para llamar a un script PHP al que también le mando la cadena que he escrito en el cuadro de texto para que cree una consulta SQL para buscar todos los nombres que compartan un patrón con la cadena del cuadro de texto, y luego dicha consulta se hace a una base de datos MySQL para obtener todos los nombres coincidientes, luego con dicha lista de nombres, dinamicamente en el script PHP creo un listbox rellenandolo con dichos nombres, y finalmente el resultado del script, que es el listbox con las coincidencias, se carga en un div que hay en la pagina inicial que se manda en la respuesta a la petición AJAX.

Eso si, hay un pequeño inconveniente, y es lo que les dije que está incompleto, y es que en teoría, cuando aparezca el listbox, y yo de click en un nombre, automaticamente ese nombre se inserte en el cuadro de texto, pero, francamente no he podido aun, así que yo les doy el código y la db en mysql, pero lamentablemente no pude hacer eso, así que si alguien lo logra hacer le agradecería como favor que pudiera postearlo para compartirlo con todos los que visitan mo blog, pero ojo, utilizando el listbox, porque usando el metodo que les dije, creando un cuadro con JavaScript si he podido.

A continuación les pongo un video que grabé para mostrarles mas o menos como funciona, espero que se vea algo bien.





Y pueden descargar este paquetito que contiene:
-Base de datos MySQL usada en el ejemplo (NOTA: Solo necesitan ejecutar el archivo.sql en su servidor MySQL, ya que me tomé la molestia de agregarle el código para crear la base de datos, la tabla, los datos y tambien el usuario con permisos para esta base de datos que utiliza el script PHP para conectarse).
-Script PHP que crea el listbox
-Script JavaScript que contiene el código para la solicitud asíncrona (AJAX) XD
-Página html en donde se visualizan los resultados.
-Video que esta en youtube pero con mayor calidad.



Si acaso necesitan alguna pequeña explicación acerca de alguno de los scripts pueden solicitarla mediante los comentarios del blog para postear una expliacion de lo que necesiten. Por ahora, espero que les sirva de mucho.

jueves, 19 de julio de 2007

FTP mediante PHP

Señoritas y señores, tengan un buen día. He estado trabajando en un sitio web en PHP y en un momento me vi en la necesidad de crear un script para poder subir archivos via FTP a un hosting mediante PHP, y gracias a la información de sitios como Desarrollo web y mediante algunos libros, estuve estudiando lo que son un "set" de métodos para poder subir, bajar archivos y realizar otras operaciones usando el protocolo FTP mediante PHP, y aunque solo voy a cubrir algunas básicas, espero dar a entender la idea y sembrar en ustedes las semillita de curiosidad para poder seguir investigando y realizando cosas mas complejas de este tema. Bueno, asumo que tenemos conocimientos básicos acerca de FTP, pero si no, es un protocolo de transferencia de archivos, el cual, valga la redundancia permite subir archivos a un servidor FTP y tambien bajarlos del mismo. Para ello se utilizan comandos en el servidor, entonces lo que hacen estas funciones en PHP es, literamente, "escribir los comandos necesarios" para realizar una determinada operación como bajar un archivo o algo por el estilo.

En esta ocasión hice una clasesita en PHP que me permite hacer lo siguiente:subir un archivo de *.* permitiendo buscarlo en nuestra computadora, así como asignarle un nombre, que es el que tendrá en el servidor (ahi se puede especificar la extension del archivo en el servidor, que puede variar, lo cual es, digamos, un bugsito y no busque como solucionarlo, pero en otro post veremos eso XD ) asi como tambien visualizar los directorios que se encuentran en la carpeta raíz para seleccionar uno (en un listbox) el cual será el directorio en el cual queremos subir el archivo, luego de subirlo nos indica el vínculo para poder descargar el archivo. La clase la tengo a continuación:



class upFile
{

function inicializar()
{
define("ServerFTP","nombreDelServidor");
define("Puerto",puertoDelServidor);//El numero de puerto es un tipo int, asi que va sin comillas dobles o simples
define("Nombrecito","usuarioParaLogin");
define("Secretito","contrasenaParaLogin");
}

function conectarFTP()
{
$conexion = ftp_connect(ServerFTP,Puerto);
ftp_login($conexion,Nombrecito,Secretito);
ftp_pasv($conexion,true);
return $conexion;
}

function subirFile($rutaLocal, $nombreRem)
{
$this->inicializar();
$conexion = $this->conectarFTP();
ftp_put($conexion,$nombreRem,$rutaLocal,FTP_BINARY);
ftp_close($conexion);
}

function verDirs()
{
$this->inicializar();
$conexion = $this->conectarFTP();
$lista = array();
$lista = ftp_nlist($conexion,"/");
for($i = 0;$i<=count($lista);$i++)
{
if (strpos($lista[$i],'.') > 0)
{
unset($lista[$i]);
}
}
ftp_close($conexion);
return $lista;
}

}

?>




Y aqui lo que he hecho es básicamente lo siguiente:

conectarFTP() Iniciamente uso el método ftp_connect(servidor,puerto) para establecer una conexión, cuyo resultado se almacena en una variable que en esencia, es la conexion.

OJO: ¡¡¡Ahorita estamos conectados, pero aun no hemos accedido al servidor!!! Esto es, digamos, como que si "pusieramos" una pasarela entre nosotros y el servidor FTP al cual queremos entrar, pero aun no usamos la pasarela.

Luego, nos logueamos en el servidor para poder acceder a sus archivos y hacer con ellos lo que queramos (segun estén configurados los permisos del servidor) con la función ftp_login(conexion,usuario,contraseña) y luego se usa la función ftp_pasv(conexion,booleano) donde el booleano determinará si la conexión será activa (false) o pasiva (true).

NOTA:Para más información acerca del modo activo/pasivo de conexión FTP, puede ver la siguiente página http://www.ignside.net/man/ftp/pasivo.php.

Al final de la función conectarFTP() hecha por mí, retorno lo que es la conexión como tal para poder ser usada por cualquiera de los métodos que implemente en mi aplicación. Luego tenemos el método subirFile(rutaLocal, nombre) en donde solicito lo que es la ubicación del archivo y el nombre que se desea que el archivo tenga en el servidor. Primeramente, inicializo ciertas variables que contienen datos que ustedes no pueden ver como el nombre del servidor FTP al cual se pretende conectar, el usuario, la contraseña y el puerto en el cual está "escuchando" el servidor (por default 21). Despues de iniciarlizarlas, llamo a la función conectarFTP() para obtener una conexión FTP abierta al servidor, luego uso la función ftp_put(conexion,rutaArchivo,nombre,modo) en donde rutaArchivo es, bueno, ESO, la ruta del archivo, para ello usé un elemento de formulario de tipo file cuya propiedad value almacena la ruta del archivo que fué buscado, mientras que nombre es el nombre especificado que tendrá en el servidor, y finalmente modo que francamente no lo entiendo bien, pero puede ser ftp_ascii ó ftp_binary, y lo que hace esta función es subir el archivo que esta en la ruta especificada usando la conexión especificada y colocándole en el servidor el nombre especificado, usando el modo especificado. Finalmente cierro la conexión con ftp_close(conexion). Esto es lo básico de esta clasesita sencillisima a la cual le faltan cosas como controlar el tipo de archivos a subir, el tamaño de archivos a subir, los permisos que podemos tener sobre los diferentes directorios, etc. Lo cual puede hacerse con otras funciones en PHP del paquetito de funciones FTP que posee, que estan an una libreria que ya incorpora PHP por default.

Debido a razones de evitar abusos de la aplicacioncita o infiltraciones maldeseadas, no la puse activa en algun servidor, pero ustedes pueden descargar la aplicación >>AQUI<< que consta de la clase php, una página para seleccionar el archivo y un directorio y finalmente una página en la cual saldrá la confirmación de que el archivo fué subido así como su ruta para poder ser descargado, y lo que tienen que hacer es únicamente cambiar los valores del nombre del servidor, usuario y contraseña (si los tiene el servidor donde lo prueben) y el puerto por el cual el servidor escucha, en el método inicializar() de la clase. Espero que esto les sirva mucho y cualquier opinión o aporte al tema es bienvenido. Feliz día y ya les traigo más.

jueves, 12 de julio de 2007

Usando POST con AJAX

Tengan un buen día apreciables personas que visitan este foro, recientemente estuve trabajando en un proyectito de un mini-sitio y me auxilié de una tecnología bastante interesante y útil llamada AJAX, que hablando en términos "mundanos" lo que permite es que en una página web, al activarse un evento HTML como onClick, onLoad, onKeyPressed, etc. se "actualize un pedazo de la página", es decir, se haga una petición (request) al servidor diciéndole: "Servidor, nececito x página para actualizar únicamente un sector de la página actual" entonces el servidor, valga la redundancia, te "sirve" la página o script para que sea cargada en un sector de la página, sin hacer una petición de toda la página.

En este caso, sabemos que existen 2 métodos para mandar los datos en una petición al servidor, que son GET y POST, en el cual en el primero los datos se mandan seguidos de la URL y un signo de interrogación, de la siguiente manera:
http://www.data2max.com/?pagina=2&tema=sqlserver

NOTA: Recomiendo a todos los que concurran este pequeño blog que visiten el sitio www.data2max.com que está dedicado al desarrollo de temas referentes a bases de datos y también desarrollo.

Continuando, al contrario de GET, usando POST los datos no se mandan en la URL, sinó que dentro del cuerpo del request, más información de solicitudes al servidor >>AQUI<<. Bueno, a partir de aqui parto que los que estén leyendo este post tienen conocimientos básicos de AJAX, si no es así pero desean aprender, pueden revisar este otro post acerca de introducción a AJAX, veanlo >>AQUI<<. Para usar AJAX con el método GET, únicamente necesitan especificar que usarán GET al abrir el "canal" para realizar la solicitud asíncrona, y al mandar la solicitud usando el método send() del objeto XMLHTTPRequest no necesitan poner nada debido a que los datos que se mandan van en la URL, pero qué pasa si estamos usando POST con AJAX? En tal caso, debemos de especificar ciertas cosas como la codificación de los datos que vamos a mandar y otras cosas más en el método setRequestHeader() del mismo objeto, y luego en el método send() debemos colocar un string que lleve el par de datos (variable=valor[&variable2=valor]...) de la siguiente forma: objetoAjax.send(nombre="Aniceto"&apellido="Chilango") Bueno, perfecto, lo hacemos y ya. Pero, digamos que tenemos mi problema. Yo estaba haciendo un sitio web para un colegio en el cual tenia un buen número de formularios necesarios para inscribir alumnos, registrar profesores, realizar búsquedas personalizadas, etc. Y luego de rellenar los formularios, deseaba que "magicamente" apareciera ya sea una confirmación o algun resultado de enviar el formulario en un panel que estaba en la misma página sin que se actualizara el sitio y pense ¡¡¡AAAAAJAX!!!, pero luego, al hacer el código para mandar la información del formulario mediante POST (debido al valor de los datos) para un formulario, observé que eso solo me iba a servir para un solo form, entonces pensé en hacer un script que me sirviera para mandar cualquier formulario mediante post, y aqui está el script, y lo pongo a disposición de ustedes para que puedan usarlo.

function ajaxFunction()
{
var xmlHttp;
try
{
// Firefox, Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
return xmlHttp;
}
catch (e)
{
// Internet Explorer
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
return xmlHttp;
}
catch (e)
{
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
return xmlHttp;
}
catch (e)
{
alert("Your browser does not support AJAX!");
return false;
}
}
}
}
function mandarForm(url)
{
var ajax; var vinculo = url;

var largoForm = document.forms[0].length; var i = 0; var postr; larguito=largoForm-1;
while (i <= larguito)
{
if (i != 0)
{
postr += "&";
}
postr += document.forms[0].elements[i].name + "=";
postr += document.forms[0].elements[i].value; i++;
}


ajax=ajaxFunction();
ajax.open("POST",vinculo,true);
//ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.setRequestHeader("encoding", "utf8");


ajax.onreadystatechange=function()
{
if (ajax.readyState==4)
{
if (ajax.status==200)
{
document.getElementById('capaAjax').innerHTML = ajax.responseText;
}
}
}

ajax.send(postr);
}



Pero, hay un pequeño problema, y es que si utilizo este script en un formulario, el primer campo del formulario (digamos un textbox) su valor no se manda al realizar la solicitud asíncrona, aun no se porqué y espero que si alguien conoce el porqué tengo ese problema, puede hacerlo saber en los comentarios. Así que lo que hago simplemente, para evadir el problema, creo un elemento del tipo hidden al principio del form, como primer elemento, para que solo su valor no sea mandado y todo el formulario sea mandado. Espero que les sirva. En otro post voy a poner una explicación del funcionamiento de este script. Tengan un buen día.

viernes, 6 de julio de 2007

Webcast de controles personalizados con SilverLight 1.1


Tengan un buen día gentes. Quiero anunciar un webcast que va a realizar Microsoft dentro de unas horas acerca de la elaboración y uso de controles personalizados eligiendo uno de los lenguajes de programación por excelencia en .NET (Visual Basic o C#) en SilverLight 1.1 Alpha, una especie de plug-in para navegadores creado por Microsoft el cual tiene soporte para lenguajes .NET, AJAX, Ruby, Phyton, etc. (Más información aquí).


Dicho webcast será dado por Roberto Hernández-Pou, quien tiene las ceritficaciones MCSD.NET, MCT, MCSE, MCDBA, MVP VisualStudio.NET Security, por lo que auguro que estará bastante interesante, los invito a verlo, el vínculo es el siguiente:

http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032344788&EventCategory=4&culture=es-SV&CountryCode=SV

miércoles, 4 de julio de 2007

Herramienta para depurar JavaScript, Ajax y más

Como primer artículo, quiero anunciar la existencia de una herramienta que me saca de aguas (de aprietos XD) cuando estoy haciendo algo web que involucre JavaScript, AJAX, CSS o algo así, pues tengo algo asi como un apego al modo de trabajo de Visual Studio y su depurador que tiene vistas de variables locales, de objetos, etc. mostrando además la línea exacta de error en algun trozo de código, y eso no se encuentra de forma en los lenguajes mencionados, ya que si tenemos un error en nuestro precioso código JavaScript únicamente vemos un ícono en la parte inferior izquierda que nos lo indica.

Pero ya no más.En mi búsqueda por un depurador con indicadores de error, me encontré con Firebug, un complemento para Mozilla Firefox que, analiza el código ya sea de HTML, CSS, JavaScript, AJAX y XML para encontrar algun error en tiempo de ejecución, señalando la línea del error junto a una pequeña descripción, y muchas cosas más, así que lo recomiendo para todos aquellos, como yo, que tienen problema para detectar errores en sus scripts.

El vínculo para el sitio oficial es http://www.getfirebug.com/. Disfrutenlo.

P.D.: Probablemente existan más herramientas de este tipo, así que si conocen de otras, pueden hacerlas saber en los comentarios, pues en mi caso es la primera que encontré.