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