Búsqueda


Categorías

C# [15]
PHP [6]
Zend [1]
FileMaker [1]
.NET [6]
CVS [3]
General [9]
Javascript [2]
Paypal [1]
.NET Compact Framework [3]
C++ [1]
mysql [4]
Linux [1]

Últimos post

Dónde guardar los archivos de configuración en ClickOnce
phpinfo: Valores en error_reporting
Notes about Zend Server and Zend Studio setup
What's new in C# 4
Resolving a 'sticky tag is not a branch' error
Resumen del CodeCamp
CodeCamp Tarragona 2009
Acerca de la calidad del código
ClickOnce en Linux
Programando en PHP (y con CVS) en Visual Studio 2008

Sindicación

RSS 0.90
RSS 1.0
RSS 2.0
Atom 0.3

LoNetCamp: Visual Studio 2008 con la comunidad

ctg | 03 Julio, 2008 15:33

Marc Rubiño (coordinador del grupo de Usuarios de Tarragona), ha organizado un charla en la que, además de él, participará Hadi Hariri acerca de WCF, ASP.NET y Ajax.

Agenda y registro: LoNetCamp: Visual Studio 2008 con la comunidad

Publicado en .NET . Comentario: (0). Retroenlaces:(0). Enlace

Programar seguro

ctg | 07 Junio, 2008 14:16

Aprovechando que Microsoft ha lanzado Microsoft Source Analysis for C#, he creado este post para anotar algunas conductas que siempre recomiendo a la hora de escribir código. El principal objetivo es crear un código seguro, escalable, de fácil lectura y mantenimiento.

Como siempre, cualquier crítica es bienvenida y espero ir añadiendo más puntos en un futuro.

1) Comentarios y variables

En cada variable/método/función que se declara, utilizar nombres razonables y en las variables miembro de una clase, no esta de más poner un pequeño comentario (pero recordar, lo bueno si breve dos veces bueno) para saber su objetivo.

En Visual Studio.net se pueden utilizar las etiquetas <summary>, <param> ... que facilitan mucho la lectura de código. Además Intellisense hará uso de esas etiquetas y facilitaran la escritura de código. Incluso, las etiquetas se pueden utilizar para la creación de documentación.

2) Divide y vencerás

Evitar crear un ficheros de utilidades enormes. Por ejemplo, usar partial en C# que apareció en la versión 2.0 de .NET Framework. De esta forma es posible separar código en diferentes archivos para hacerlos más flexibles.

3) Utilizar excepciones en vez de retornar 0=OK, 1=ERROR ó HRESULT

Desde la aparición de las excepciones, la comprobación de los valores de retorno al llamar una función ha quedado obsoleta.

4) Utilizar ASSERT, TRACE

Cuando se está desarrollando utiliza todas las herramientas que el propio entorno y el mismo lenguaje proporcionan. En C#, el espacio de nombres System.Diagnostics se encuentra la clase Debug y Trace. En el artículo How to Trace and Debug in Visual C# aparecen ejemplos de su uso.

5) Cuidado con el  código "no seguro"

Al escribir código no seguro, debemos encargarnos nosotros mismos de realizar de liberar los recursos previamente utilizados. Utiliza código "no seguro" únicamente cuando seaestrictamente necesario.

6) Automatizar

Visual Studio incluye muchas formas de automatizar código. Desde la utilización de un asistente para generar el código de acceso a la base de datos, servicios web,etc...

Macros, snippets y programas que ayudan a la escritura y la automatización de código: MZ-Tools, Visual Assist, etc...

7) Utilizar todas las herramientas disponibles

Antes de Microsoft Source Analysis for C#, ya existían otros programas que ayudan a crear código mas seguro, FXCop es el más conocido, aunque realmente FXCop se centra más en los ensamblados. También existen otros analizadores como Code.It.Right

8) Atención a la entrada de datos

La entrada de datos es fuente de numerosos problemas. Algunos muy importantes, como los ataques de inyección SQL o problemas con la codificación de caracteres. Las expresiones regulares pueden ser una solución a este problema.

9) Realizar pruebas

Probar nuestro código en todos los sentidos. Introducir datos incorrectos, acciones que no estén soportadas para observar nuestros mensajes de error. Puede ser muy útil pedir a otra persona que comprueba nuestro programa y que realice una batería de pruebas para asegurar la calidad de nuestro código.

10) Ser modesto, todos nos equivocamos

Todos nos equivocamos y quizá no hay mejor forma de aprender que equivocarse. Resolver problemas y asumir nuestra responsabilidad nos ayudará a concentrarnos para escribir código más seguro.

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

Nuevo Amazon S3 (2008-05-02)

ctg | 06 Mayo, 2008 13:31

Amazon Simple Storage Service (Amazon S3), conocido como S3, es un servicio que proporciona amazon.com que permite almacenar y recuperar tus datos como un disco duro virtual se tratase, a un precio muy bajo. En nuestro trabajo llevamos un año aproximádamente utilizándolo para hacer copias de seguridad.

Además utiliza los standards SOAP y REST y por ello, se puede acceder desde cualquier lenguaje actual (C#, PHP, Java y alguno más). También hay un plug-in para Firefox que te permite acceder, S3 Organizer.

Pongo un pequeño ejemplo, en C# para crear un bucket y subir un fichero.

Primero crear un fichero, llamado S3Helper.cs. Esta pequeña clase es una utilidad para trabajar más cómodamente con S3.

using System;
using System.Text;
using System.Security.Cryptography;

/// <summary>
/// Summary description for S3Helper
/// </summary>
public class S3Helper
{
    public S3Helper()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    /// <summary>
    /// Formats the provided time as a string limited to millisecond precision
    /// </summary>
    /// <param name="myTime"></param>
    /// <returns></returns>
    public static string FormatTimeStamp(DateTime myTime)
    {
        DateTime myUniversalTime = myTime.ToUniversalTime();
        return myUniversalTime.ToString("yyyy-MM-dd\\THH:mm:ss.fff\\Z", System.Globalization.CultureInfo.InvariantCulture);
    }

    /// <summary>
    /// Returns a new DateTime object set to the provided time
    /// but with precision limited to milliseconds.
    /// </summary>
    /// <param name="myTime"></param>
    /// <returns></returns>
    public static DateTime GetTimeStamp(DateTime myTime)
    {
        DateTime myUniversalTime = myTime.ToUniversalTime();
        DateTime myNewTime = new DateTime(myUniversalTime.Year, myUniversalTime.Month, myUniversalTime.Day,
                                 myUniversalTime.Hour, myUniversalTime.Minute, myUniversalTime.Second,
                                 myUniversalTime.Millisecond);

        return myNewTime;

    }

    public static string GetSignature(string mySecretAccessKeyId, string strOperation, DateTime myTime)
    {
        Encoding myEncoding = new UTF8Encoding();

        // Create the source string which is used to create the digest
        string mySource = "AmazonS3" + strOperation + FormatTimeStamp(myTime);

        // Create a new Cryptography class using the
        // Secret Access Key as the key
        HMACSHA1 myCrypto = new HMACSHA1(myEncoding.GetBytes(mySecretAccessKeyId));

        // Convert the source string to an array of bytes
        char[] mySourceArray = mySource.ToCharArray();

        // Convert the source to a UTF8 encoded array of bytes
        byte[] myUTF8Bytes = myEncoding.GetBytes(mySourceArray);

        // Calculate the digest
        byte[] strDigest = myCrypto.ComputeHash(myUTF8Bytes);

        return Convert.ToBase64String(strDigest);
    }
}

 

Y a continuación, el código para crear un bucketname y subir un fichero:

 

// Add web reference http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.wsdl

using <yourappnamespace>.com.amazonaws.s3.doc;

try
{
    using (var s3 = new AmazonS3())
    {
        var s3 = new AmazonS3();
        var currentTime = DateTime.Now;
        const string myAWSAccessKeyId = <my S3 access key>;
        const string mySecretAccessKeyId = <my S3 secrect access key>;

        // Create a bucket
        CreateBucketResult myCreateResult = s3.CreateBucket(
            <bucket name>,
            null,
            myAWSAccessKeyId,
            S3Helper.GetTimeStamp(currentTime),
            true,
            S3Helper.GetSignature(mySecretAccessKeyId, "CreateBucket", currentTime)
            );
   
        // Get data to upload
        const string fileName = "fileName.ext";
        byte [] bytesToWrite = File.ReadAllBytes(fileName);
   
        // Finally upload the object
        PutObjectResult putObjectResult = s3.PutObjectInline(
            <bucket name>,
            fileName,
            null,
            bytesToWrite,
            bytesToWrite.Length,
            null,
            StorageClass.STANDARD,
            true,
            myAWSAccessKeyId,
            S3Helper.GetTimeStamp(currentTime),
            true,
            S3Helper.GetSignature(mySecretAccessKeyId, "PutObjectInline", currentTime),
            null
                    );
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

Presentaciones,vídeos y material del Microsoft Techday {The Evolution Show }

ctg | 24 Abril, 2008 15:18

Ya se ha subido todo el material del evento Microsoft Techday {The Evolution Show } y Visual Studio 2008 que se realizó en Madrid durante los días 27 y 27 de febrero. 

Microsoft Techday {The Evolution Show} y el Vistual Studio 2008 Tour

Publicado en .NET . Comentario: (0). Retroenlaces:(0). Enlace

Activesync no se maximiza

ctg | 23 Abril, 2008 00:03

Aunque Activesync tiene los días contados desde la aparición de Windows Mobile, en mi trabajo todavía lo seguimos utilizando.

Desde hace unos meses tenía un problema con Activesync. Cada vez que conectaba el dispositivo, Activesync no "saltaba" y se maximizaba. La ventana de Activesync se quedaba minimizada y parpadeando en la barra de tareas. No era posible maximizarla. De todo modos, Activesync funcionaba perfectamente. Únicamente utilizando Task Manager podía maximizarla, pero no podía volver a "restaurar" su estado original.

Hoy, he perdido un poco de tiempo investigando sobre ello, porque ahora tengo dos dispositivos que sincronizar y era un verdadero lío saber cual de los dos estaba utilizando.  La verdad es que la forma de arreglar es muy sencilla y a la vez muy curiosa :

1) Conecta el dispositivo. El icono de Activesync en el "tray" debe empezar a animarse.

2) Haz doble click sobre el icono para forzar a Activesync a maximizarse. Con ello, lo único que se consigue es que aparezca la ventana minimizada y parpadeando en la barra de tareas.

3) En la ventana minimizada y parpadeando, haz click derecho y seleccionar Mover. Después suelta el ratón y con las teclas del cursor, pulsa Izquierda y Arriba.

4) La ventana de Activesync aparecerá en algún lugar del escritorio. Muévela dónde más te interesa con los cursores. Cuando hayas encontrado la posición que más te interesa, coge el ratón y ciérrala de nuevo para comprobar que el problema se ha solucionado. 

Publicado en .NET Compact Framework . Comentario: (0). Retroenlaces:(0). Enlace

Microsoft Developer Day 2007 Material

ctg | 22 Abril, 2008 23:48

Este año, no he podido asistir a ningun evento de Microsoft Developer Day. Pero afortunadamente, las presentaciones ya estan disponibles en su web.

Estoy bastante intersado en conocer las novedades de Visual Studio 2008, ASP.NET 2.0 y SQL Server 2008 ... 

Publicado en General . Comentario: (0). Retroenlaces:(0). Enlace

Whirlwind

ctg | 18 Marzo, 2008 11:37

Whirlwind are a few videos, created by Stuart Celarier, about new features about C# 2.0 and 3.0. These videos are usually shorts and there are focus in one or two topics. As Stuart explains, a lot of new features are not C# related but are new .NET Framework.

You can find videos at: http://channel9.msdn.com/Showpost.aspx?postid=390556

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Comprobar la conectividad de un equipo

ctg | 27 Febrero, 2008 00:15

Hace ya tiempo, e incluso, en mi anterior trabajo, uno de los problemas principales era la conectividad del equipo a la red local y por ello, no era posible acceder a internet.

Nunca supimos porque y tampoco perdimos tiempo en averiguarlo. Lo único que haciamos era reintentar de nuevo pasado un cierto tiempo.

Hoy, me he encontrado con un problema parecido y he decidido investigar un poco y he encontrado unos post de Jose Manuel Alarcón que me han sido muy útiles. Como siempre, los dejo aquí por si alguna vez necesito consultarlos de nuevo.

Detectar si hay conectividad en el equipo (Metodo 1)

Detectar si hay conectividad en el equipo (Metodo 2)

Detectar si hay conectividad en el equipo (Metodo 3)

Detectar si hay conectividad en el equipo (Metodo 4 y 5)

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Instalador para Pocket PC

ctg | 19 Diciembre, 2007 00:54

Hace ya un par de años que desarrollo programas para Pocket PC. Realizar programas para este tipo de dispositivos no es nada complicado utilizando .NET Compact Framework. Además, el auge de este tipo de dispositivos es más que evidente, por lo que siempre que puedo intento leer algún artículo al respecto.

De todos modos, existen varias formas de instalar programas. Incluso, en algunos dispositivos pueden ser diferentes la forma de "copiar" e "instalar" el mismo programa.

Actualmente en mi trabajo, tan sólo genero el .CAB, pues nuestro cliente es capaz de copiar (utilizando ActiveSync) este archivo y ejecutarlo en el dispositivo en cuestión.

Pero que ocurre si deseas realizar una aplicación más "comercial y profesional". Como dije en mi artículo Solo Progrmadores, el programa de instalación es el punto de entrada, es lo primero que el usuario ejecuta y a su mismo tiempo, que evalúa.

La acción más correcta en este tipo de dispositivos es generar un archivo ejecutable (.EXE ó .MSI) que copie automáticamente los archivos al dispositivo.

Un ejemplo de todo esto, lo puedes encontrar en este artículo: Create a Setup File for your Windows Mobile Application 

Publicado en .NET Compact Framework . Comentario: (0). Retroenlaces:(0). Enlace

Emtpy recyble bin in C#

ctg | 13 Noviembre, 2007 00:41

On 2006, I wrote a post to send a file to Recycle Bin. But, at the same, I need a code to empty recycle bin. Here is the code:

using System.Runtime.InteropServices;

enum RecycleFlags : uint
{
   SHERB_NOCONFIRMATION = 0x00000001,
   SHERB_NOPROGRESSUI   = 0x00000002,
   SHERB_NOSOUND        = 0x00000004
}
 
[DllImport("Shell32.dll", CharSet = CharSet.Unicode)]
static extern uint SHEmptyRecycleBin
    (IntPtr hwnd,
    string pszRootPath,
    RecycleFlags dwFlags);
   
public static void Main()
{
    uint result = SHEmptyRecycleBin (IntPtr.Zero, null, 0);
    Console.WriteLine ("Result: {0}", result);

}
 

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Frequently asked questions in C#

ctg | 23 Octubre, 2007 00:01

A good friend, sent me this link, Frequently asked questions in C#. Is a list with few frequently asked questions. For me, exist a couple tips so interesting like how calculate a MD5 and play default songs, useful when you code show a error message or important info.

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Revista MYGNET

ctg | 18 Octubre, 2007 00:31

MYGNET es una revista con una cantidad de artículos interesantes. He descargado unos cuantas revistas y de momento me ha sorprendido gratamente.

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Lo nuevo en C#

ctg | 03 Julio, 2007 23:36

La nueva versión de C#, la 3.0, esta a punto de salir al mercado de forma oficial. En este artículo se encuentran de forma resumida, C# Especificación de la versión 3.0

Lamentablemente, no dice ni una sola palabra de LINQ, que a mi mode de ver, será la "estrella"

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Expresiones regulares con C#

ctg | 12 Junio, 2007 23:29

Aunque siempre se ha dicho que cuando quieres resolver un problema con expresiones regulares, no tienes un problema, sino dos, pongo aquí un enlace al siguiente artículo Introducción a las expresiones regulares.

Aunque ya he hablado varias veces en sobre las expresiones regulares (sobre todo con PHP), este artículo tiene la particularidad de utilizar el objecto Regex de la plataforma .NET.

Publicado en C# . Comentario: (0). Retroenlaces:(0). Enlace

Ordenar con MySQL (II)

ctg | 15 Mayo, 2007 22:47

En el anterior post, puse unos ejemplos de cómo ordenar valores del tipo (+5.00, +7.50, -1.50...)

Pues bien, resulta que no es del todo correcto utilizar ORDER BY CAST (campo AS SIGNED).

Según he estado leyendo en algunos foros (gracias a Ed), y como siempre, después de que alguien se quejase diciendo que los valores no estaban ordenados, lo mejor en estos casos es utilizar la siguiente forma:

SELECT * FROM tabla WHERE cláusula ORDER BY 'campo'+0

Increible... pero funciona... ahora me voy a leer otra vez la documentación para saber exactamente el significado del '+0' ... bueno mejor otro día

Publicado en mysql . Comentario: (0). Retroenlaces:(0). Enlace