Framework Ajax: jQuery

Posted in Programación with tags , , , on 1 julio, 2009 by febrer

Según la Wikipedia:

jQuery es una biblioteca o framework de Javascript, creada inicialmente por John Resig, que permite simplificar la manera de interactuar con los documentos HTML, manipular el árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con la tecnología AJAX a páginas web.

Actualmente, jQuery es el framework Ajax más utilizado en la red. Permite de la creación de aplicaciones Ajax de una forma rápida y sencilla.

Como componente adicional, jQuery dispone de una biblioteca para la generación de interfaces de usuario, jQuery UI. Básicamente dispone de los siguientes elementos (Widgets): Accordion, Datepicker, Dialog, Progressbar, Slider, Tabs.

Estos widgets, junto con la posibilidad de utilizar efectos (Blind, Bounce, Clip, Drop, Explode, Fold, Highlight, Puff, Pulsate, Scale, Shake, Size, Slide, Transfer) e interaciones (Drag,Drop,Resize,Select,Sort) hacen de esta biblioteca una potente herramienta para el desarrollo de aplicaciones AJAX.

A continuación os dejo un ejemplo de como implementear ‘jQuery UI Tabs’ en nuestro código HTML:

<!doctype html>
<html lang="es">
<head>
 <title>jQuery UI Tabs</title>
 <link type="text/css" href="../../themes/start/ui.all.css" rel="stylesheet" />
 <script type="text/javascript" src="../../jquery-1.3.2.js"></script>   <!-- framework jQuery -->
 <script type="text/javascript" src="../../ui/ui.core.js"></script>  <!-- librería base jQuery-UI para desarrollo de interfaces -->
 <script type="text/javascript" src="../../ui/ui.tabs.js"></script>  <!-- librería para el control tabs -->
 <script type="text/javascript">
 $(function() {
  $("#tabs").tabs(); //activamos las pestañas
 });
 </script>
</head>
<body>
 
<div id="tabs">
 <ul>
  <li><a href="#tabs-1">Pestaña 1</a></li>
  <li><a href="#tabs-2">Pestaña 2</a></li>
  <li><a href="#tabs-3">Pestaña 3</a></li>
 </ul>
 <div id="tabs-1">
  <p>Contenido pestaña 1.</p>
 </div>
 <div id="tabs-2">
  <p>Contenido pestaña 2.</p>
 </div>
 <div id="tabs-3">
  <p>Contenido pestaña 3.</p>
 </div>
</div>
</body>
</html> 

 

Verdaderamente recomendable 🙂

Enlaces de interes:

240 plugins para utilizar con jQuery: http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/     
Framework base: http://jquery.com/  
Framework para la creación de interfaces de usuario:  http://jqueryui.com/

Google Charts – Generando gráficos de forma dinámica

Posted in Programación with tags , , , on 29 junio, 2009 by febrer

La librería de Google Charts, nos permite generar gráficos de una manera muy simple, sin tener que instalar nada en nuestro servidor, ni realizar complejos desarrollos.
El mayor problema que veo en este tipo de servicios, es la total dependencia de los servidores de Google, el día que no les interese dar este tipo de servicios gratuitamente, no habrá más remedio que pasar por caja.
Hay que andar con ojo, y no abusar de este tipo de servicios gratuitos.

Link a la documentación de la API: http://code.google.com/intl/es/apis/chart/

Gráfico de tarta: http://chart.apis.google.com/chart?cht=p3&chd=t:60,40,12,2,2,3,4,5,12,34,60,23&chs=500×200&chl=Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic

 

Ejemplo de gráfico QR: http://chart.apis.google.com/chart?cht=qr&chs=100×100&chl=FebrerSoftware

 

Ejemplo de mapa: http://chart.apis.google.com/chart?cht=t&chs=400×200&chtm=europe

Cambiar clave de instalación de Microsoft Office

Posted in Microsoft with tags , , on 20 junio, 2009 by febrer

Llevaba días con la “estrellita azul” de microsoft. Porque claro, ¿a quien no le a pasado alguna vez que ha instalado sin querer, un software pirata? Estas cosas pasan, hasta en las mejores familias.
Llevaba días con la intención de desinstalar, y volver a instalar, y al final, googleando, encontré un método más sencillo, simplemente hay que borrar una entrada del registro para que la aplicación al iniciar, vuelva a solicitarnos la clave de instalación.

En esta documentación de microsoft lo explican muy clarito: http://support.microsoft.com/kb/895456/es

Como borrar el registro de transacciones (Transaction Log) en SQL Server

Posted in Programación with tags , , , on 19 junio, 2009 by febrer

El procedimiento ‘normal’ para realizar el borrado del registro de transacciones, sería el siguiente:

BACKUP LOG [MIBASEDEDATOS] WITH TRUNCATE_ONLY
DBCC SHRINKFILE(NOMBRE_LOGICO_LOG, 1)

En el caso de que sigamos obteniendo un error del tipo:

Msg 9002, Level 17, State 4, Line 1
The transaction log for database ‘MIBASEDEDATOS’ is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

Deberemos tomar una solución más drástica, como borrar físicamente el fichero LOG en el disco. Para ello, lo primero que tenemos que hacer es ‘detachear’ o ‘Separar’ la base de datos. El procedimiento es el siguiente:

1 – Forzamos la escritura de las páginas en memoria con CHECKPOINT (repetimos varias veces este comando).
2 – Separamos la base de datos con sp_detach_db

USE [master]
GO
EXEC master.dbo.sp_detach_db @dbname = N’MIBASEDEDATOS’
GO

3 – Borrado del fichero .LDF físico existente en nuestro disco duro. Normalmente, su ubicación es:

C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MIBASEDEDATOS.LDF (ojo, no MDF, mdf es la base de datos)

4 – Una vez eliminado el fichero .LDF, procederemos a realizar de nuevo el ‘attach’ o ‘Adjuntar’ la base de datos, de esta manera:

USE [master]
GO
CREATE DATABASE [MIBASEDEDATOS] ON
( FILENAME = N’C:\Archivos de programa\Microsoft SQL Server\MSSQL.1\MSSQL\Data\MIBASEDEDATOS.MDF’ )
FOR ATTACH
GO

Sin indicarle el fichero LDF. Automáticamente SQL Server, genera un nuevo fichero LDF de transacciones.

Espero que este método pueda serte útil.

Haciendo Ping desde ASP.NET

Posted in Programación with tags , , on 10 junio, 2009 by febrer

Esta es una sencilla manera de realizar ping’s a equipos, indicando su ip o su nombre desde una página ASP.NET.

System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply pingreply = ping.Send("ip_o_nombre_equipo");
txtPing.Text += "Address: " + pingreply.Address.ToString();
txtPing.Text += "Roundtrip Time: " + pingreply.RoundtripTime;
txtPing.Text += "TTL (Time To Live): " + pingreply.Options.Ttl;
txtPing.Text += "Buffer Size: " + pingreply.Buffer.Length.ToString();

Recuperando elementos web con WebRequest a través de un proxy y validación básica en destino.

Posted in Programación with tags , , , on 10 junio, 2009 by febrer

Imaginate que quieres acceder a un gráfico (gif, bmp, etc …) alojado en un servidor externo a tu red local. En nuestro ejemplo son gráficos estadísticos que nos genera nuestro proveedor de internet, al cual hay que acceder mediante una validación. A parte, disponemos de un servidor proxy en nuestra empresa para acceder a internet, que tambien requiere validación.

En este escenario, la menera más sencilla (por supuesto utilizando .NET), es utilizar los objetos NetworkCredential, WebProxy y HttpWebResponse, para recuperar el gráfico deseado.

¿Como lo hacemos?

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
 
namespace TestWebRequest
{
class Program
{
static void Main(string[] args)
{
WebRequest request = WebRequest.Create("http://url_a_nuestro_proveedor/fichero_a_recuperar");

// establecemos las credenciales para el servidor ISA SERVER
NetworkCredential credentials = new NetworkCredential("usuario", "password","dominio.com");
//creamos el objeto proxy que nos permitira acceder a internet
System.Net.WebProxy proxy = new System.Net.WebProxy("nuestro.servidorisa.com",8080);

proxy.Credentials = credentials; //asignamos las credenciales al objeto proxy

request.Proxy = proxy; //asignamos el proxy al objeto WebRequest.

// Credenciales para acceder a nuestro proveedor de internet
NetworkCredential reqCredentials = new NetworkCredential("usuario", "password");
request.Credentials = reqCredentials; // asignamos las credenciales.

WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(stream);

Console.Write(streamReader.ReadToEnd());

Console.Read();
}
}
}

Si nuestra aplicación es de tipo web, tambien podemos indicar el servidor Proxy en el fichero Web.Config de nuestra aplicación web, de esta manera:

<configuration>
  <system.net>
    <defaultProxy>
      <proxy usesystemdefault="True"
        proxyaddress="<a ref="http://nuestro_servidor_proxy:8080/">http://nuestro_servidor_proxy:8080</a>"
        bypassonlocal="True">
    </defaultProxy>
  </system.net>
</configuration>

Leyendo un fichero excel desde .NET con OLEDB

Posted in Programación with tags , , on 4 junio, 2009 by febrer

Este es un sencillo método para acceder a un fichero excel desde .NET utlizando OLEDB. Simplemente tenemos que indicar la ubicación del fichero en nuestro disco, y el nombre la la hoja a la cual queremos acceder. El paramentro HDR=NO, indica que la primera línea de la hoja excel no es el nombre de las columnas del datatable generado.

///
///
///
private DataTable GetExcel(string fileName, string sheetName)
{
OleDbConnection dbConn = null;
DataTable resultTable = new DataTable(sheetName);
// construimos la cadena de conexión.
string connString = “Provider=Microsoft.Jet.OLEDB.4.0;” +
“Data Source=” + fileName + “;Extended Properties=’Excel 8.0;HDR=NO;'”;

// creamos la conexión y la abrimos.
dbConn = new OleDbConnection(connString);
dbConn.Open();

if (!sheetName.EndsWith(“$”))
{
sheetName += ‘$’;
}
string query = string.Format(“SELECT * FROM [{0}]”, sheetName);
using (OleDbDataAdapter adapter = new OleDbDataAdapter(query, dbConn))
{
adapter.Fill(resultTable);
}

return resultTable;
}

Diferencias entre dos datatables

Posted in Programación with tags , , , on 10 febrero, 2009 by febrer

Este es un interesante script que devuelve la diferencia entre dos datatables. Su funcionamiento es similar a realizar un LEFT JOIN en Transact SQL. La diferencia es que en este método, utilizamos el objeto DataRelation de .NET. He tenido que utilizar este método ya que los origenes de los datatables, son de conexiones direferentes, por lo que la utilización de LEFT JOIN, no es posible.

///
/// Devuelve un datatable con las diferencias entre los datatables de entrada
///
///
1er datatable ///
2o datatable ///
public static DataTable Difference(DataTable First, DataTable Second)
{
//creamos una tabla vacia
DataTable table = new DataTable(“Diferencias”);

//creamos un dataSet para poder utilizar el objeto DataRelation
using (DataSet ds = new DataSet())
{
//añadimos una copia de las tablas
ds.Tables.AddRange(new DataTable[] { First.Copy(), Second.Copy() });
//creamos un dataColumn con las columnas del datatable 1.
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for (int i = 0; i < firstcolumns.Length; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}

DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for (int i = 0; i < secondcolumns.Length; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//creamos la relación
DataRelation r = new DataRelation(string.Empty, firstcolumns, secondcolumns, false);
ds.Relations.Add(r);

//creamos las columnas en el datatable a devolver.
for (int i = 0; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
}

//si la primera fila no esta en la segunda tabla, la añadimos a la tabla.
table.BeginLoadData();
foreach (DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if (childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray, true);
}
table.EndLoadData();
}

return table;
}

Los 25 errores de programación más peligrosos

Posted in Tecnología with tags , , , on 14 enero, 2009 by febrer

Un grupo internacional de expertos (Instituto SANS) , ha publicado la lista de los 25 errores de programación más importantes. El grupo incluye, entre otros, al ministerio de seguridad interior de EEUU y NSA, la organización japonesa IPA y empresas privadas como Microsoft y Symantec.

Entre estos errores estan los relacionados con la validación de datos introducidos en formularios por el usuario, que llevan a los ataques vía SQL-Injection o Cross-Site Scripting.

Estos errores han sido los causantes de 1.5 millones de vulnerabilidades durante el 2008, que han posibilitado que muchas de los ordenadores utilizados para visitar los sitios afectados se conviertan en zombis.

Ésta es la lista de errores traducida por Andrés Panitsch: 
http://desdesarrollodesoftware.blogspot.com/2009/01/errores-de-programacin-los-25-ms.html

Fuente original: Instituto SANS, y detalle de vulnerabilidades.

Visifire 2.0 – ya funciona con WPF!!!

Posted in WPF with tags , , , on 2 diciembre, 2008 by febrer

Visifire es un producto para representar gráficos estadísticos completisímo. Es un producto gratuito “Open Source” de gran calidad.

En sus primeras versiones, este producto solo funcionaba con Silverlight, pero en esta versión, han dado el paso a WPF.

En el siguiente post hay más información al respecto:
http://www.visifire.com/blog/2008/11/21/visifire-20-beta-release/

Os dejo unas capturas del componente:

Urls amigables, “friendly urls”

Posted in Programación with tags , , , on 25 noviembre, 2008 by febrer

Ya no esta de moda el utilizar urls del tipo: http://www.miportal.com/pagina.aspx?id=345, ahora lo “cool” es: http://www.miportal.com/mi-titulo-de-pagina-amigable.aspx (lo ideal seria omitir .aspx).

Para realizar este tipo de redirección, utilizo el siguiente método (basado en proceso de la petición en el BeginRequest, de la página):

Dispongo de un portal (desarrollado por mi), llamado FSPortal, que básicamente, lo que hace es almacenar todas las páginas estáticas en base de datos. Esto me posibilita que mediante un editor online (FckEditor), pueda dar a mis clientes la posibilidad de editar sus páginas online. Entre otros muchos parámetros, se puede dar un título “amigable” a las páginas. Esto, a parte de otras muchas ventajas, me permite realizar búsquedas en el contenido.

Para realizar la redirección, lo que hago es utilizar este sencillo método: http://www.codeproject.com/KB/aspnet/urlrewriter.aspx

Creando una regla del tipo:

<rule>
<url>(.*).aspx</url>
<rewrite>procesar.aspx?tit=$1</rewrite>
</rule>

De esta manera, proceso todos los nombres de url amigables, con la pagina procesar.aspx, que básicamente lo que hace es buscar en la base de datos una página con dicho titulo, y mostrándola.

Uno de los mayores problemas que tiene este sistema, es que no permite la utilización de páginas sin extensión. En este post hablo de como utilizar la redirección con páginas sin extensión, pero no es muy recomendable.

También existen otras alternativas de terceros como por ejemplo:

http://www.urlrewriting.net

http://www.isapirewrite.com

La pega de estas opciones, es que debes tener control total del servidor IIS para instalar dichos componentes.

Páginas sin extensión en servidores compartidos

Posted in Programación with tags , , on 1 noviembre, 2008 by febrer

Un gran problema, que seguro a más de uno le ha pasado, es el no poder utilizar páginas sin extensión en su proyecto web. Normalmente los proveedores de Internet, supongo que para curarse en salud, no permiten el uso de este tipo de funcionalidades en sus servidores, ya que requiere de la instalación de software de terceros, o simplemente por tocar lo menos posible los servidores.

Generalmente, si necesitas este tipo de funcionalidades, lo que hacen es recomendarte contratar un producto superior, como servidores dedicados.

Un ejemplo sería, en vez de utilizar:

http://www.tuportal.com/pagina.aspx?id=240&sec=12

Utilizar:

http://tuportal.com/titulo-de-mi-pagina

La solución “temporal” que yo he encontrado, de momento (hasta encontrar una más elegante), es utilizar el evento Application_BeginRequest del global.asax y comprobar el QueryString del objeto Request.

Para ello, lo primero que tenemos que hacer es modificar el web.config para que utilize “customErrors”, de la siguiente forma:

<customErrors mode=”On” defaultRedirect=”nuestrapaginadeerror.aspx” />

De esta forma, cuando ocurra un error del tipo “Página no encontrada”, es nuestra aplicación la que gestiona dicho error.

Despues, lo que tenemos que hacer es modificar el evento Application_BeginRequest, para que determine si ha ocurrido un error 401.

        public void Application_BeginRequest(object Sender, EventArgs e)
        {
            string path = HttpContext.Current.Request.Path; // en path estará la página nuestrapaginadeerror.aspx
            string queryString = HttpContext.Current.Server.UrlDecode(HttpContext.Current.Request.QueryString.ToString());
            string webHttp = “http://&#8221; + HttpContext.Current.Request.ServerVariables[“SERVER_NAME”];

            // cuando ocurre un error 401, en ‘querystring’ tenemos: “401;http://servidor.com/lapaginasolicitada&#8221;
            if (queryString.IndexOf(‘;’) != -1)
            {
                path = queryString.Split(‘;’)[1];
                path = path.Replace(webHttp, “”);

                HttpContext.Current.RewritePath(path);
            }
        }

Este mecanismo tiene una importante pega. La barra de direcciones es cambiada por el link original, es decir, se puede acceder con http://miportal.com/titulo, pero en la barra de direcciones, aparecerá http://miportal.com/pagina.aspx?id=34

 Quizá este matando moscas a cañonazos, pero si conoces alguna forma mejor, será bienvenida (no me vale poner un default.aspx en una carpeta 🙂

Herramientas Ajax (Ajax Toolkit)

Posted in Programación with tags , on 16 octubre, 2008 by febrer

Llevo varios días buscando la manera de desarrollar un interface AJAX para mis desarrollos en ASP.NET. La respuesta directa sería ASP.NET AJAX …. pues no me convence. Es un gran producto, tiene una documentación genial, tutoriales, foros, etc, etc, pero hay dos cosas que no me gustan.

Primera, esta 100% pensado para desarrollos con los controles de ASP.NET. Es decir, si utilizas el grid de ASP.NET, genial, pero seguro que hay mas de uno que como yo, no utiliza los controles de ASP.NET, utiliza los suyos propios (generando el HTML manualmente).

La segunda pega es que el toolkit solo esta disponible para la versión 3.5 del framework. Este problema no es tan grave, ya que poco a poco, los proveedores de ISP, van actualizándose, pero el proveedor que yo utilizo, todavía no dispone de dicha versión.

Los productos que estoy barajando utilizar son:

Prototype
Dojo
Mochikit
Yahoo!
Google
JQuery

Dojo, es el producto que más me convence, ya que como Jquery, dispone de una programación basada en TAGS, que permiten añadir directamente nuevas funcionalidades a los controles HTML directamente. De esta manera la integración con mis desarrollos, debería ser muy rápida.

Este es un ejemplo de programación con Dojo (Grid):

    <table dojoType=”dojox.grid.DataGrid”
     region=”top” clientSort=”true” minSize=”20″ splitter=”true”
     jsId=”table”
     store=”mailStore” query=”{ type: ‘message’ }”
     onRowClick=”onMessageClick”
     style=”height: 150px; width: 100%;”>
     <thead>
      <tr>
       <th field=”sender” width=”10%”>Sender</th>
       <th field=”label” width=”80%”>Subject</th>
       <th field=”sent” width=”10%”>Date</th>
      </tr>
     </thead>
    </table>
    
    

Directamente al definir la tabla como “dojox.grid.DataGrid”, ya disponemos de un grid con ordenación de elementos, cambio de columnas, diseño, etc, etc.

Ejemplo de un desplegable (combo, con selección de elementos mientras escribes):

       <select dojoType=”dijit.form.ComboBox” id=”${id}_subject” hasDownArrow=”false” style=”width: 40em;”>
        <option></option>
        <option>progress meeting</option>
        <option>reports</option>
        <option>lunch</option>
        <option>vacation</option>
        <option>status meeting</option>
       </select>

 

Yahoo y Google, requieren un aprendizaje mucho mayor, y por lo que he visto no disponen de dicha funcionalidad. Evidentemente, utilizar productos de Google o Yahoo, ofrecen una mayor garantía, pero también valoro mucho la rápida integración. Lo que estoy buscando es no volverme loco con la programación en javascript.

Mi framework

Posted in Programación, Trabajos with tags , , on 9 octubre, 2008 by febrer

Bueno, al final me he decido a escribir algo. Tengo muy abandonado el blog, en este mes pasado solo he podido escribir un post. Desde que he empezado mi nueva etapa de trabajador por cuenta ajena, no tengo ni tiempo. Por supuesto tengo que seguir atendiendo a mis clientes, y eso también me lleva bastante tiempo. Mi mujer cualquier día me deja, y con razón.

En este post quería hablar del “mini” lenguaje que utilizo para la generación de portales. Este “mini” lenguaje, me permite crear páginas personales online, rápida y fácilmente.
Dispongo de unas 80 funciones que me permiten desde realizar operaciones matemáticas, acceso a base de datos, recuperación de variables globales, etc, etc.

Este es un fragmento del código que utilizo:

<!–
%frmInicio()%
%frmPaginacion(10)%
%frmTabla(productos,familia=%frmRequest(f)%)%
–>
<table>
 %frmRepetir()%
 <tr>
 <td>Nombre: </td> <td>%frmValor(nombre)%</td>
 <td>Categoría: </td> <td>%frmCombo(categoria)%</td>
 <td>Precio: </td> <td>%frmValor(precio)%</td>
 </tr>
 %finRepetir()%
</table>
%frmLinkAnterior()% / %frmLinkSiguiente()%

Con este código, lo que hago es crear una página con el contenido de la tabla “Productos”, con la condición de que los productos se selección en base a un parámetro pasado por GET. Se establece la paginación a 10 registros por página, y en el pie de página, se muestran los controles para paginar por las diferentes páginas.

Como todas las páginas de mis portales están almacenadas en base de datos, lo que hago es interpretar el contenido antes de mostrarlo en el navegador.

Como veréis, gracias a esta utilidad de mi framework, me permite la generación de aplicaciones rápidas y efectivas.

Se admiten sugerencias.

Emprende Web

Posted in Eventos with tags , on 4 septiembre, 2008 by febrer

Ya esta preparado el nuevo evento de Emprende Web!!!

Parece que Javier Jiménez y Asier Marqués, entán trabajado duro para preparar el nuevo evento de “Emprende Web”. La vez anterior asistí, y la verdad, me encanto.

Desde aquí te animo a tomar tranquilamente una cerveza en compañia de “gente profesional e interesante”.

La fecha inicial propuesta es el 18 de septiembre, de 20:00 en adelante … hasta que el cuerpo aguante, jeje.

Nos vemos.

Más info: http://emprendeweb.org/2008/09/03/preparando-el-proximo-emprende-web/