domingo, 31 de octubre de 2010

Inglés: Pasado de los verbos regulares

Jeje, ésta entrada nada que ver con la computación, pero lo pongo porque siempre se me olvidan estas reglas del inglés.

¿Cómo se forma el pasado de los verbos regulares?

1) Los verbos que terminan en vocal "e", agregan "d":

     live   ==>  lived
    date  ==>  dated
    hate  ==>  hated

2) Los verbos que terminan en consonante seguida de "y", convierten la "y" en "i" y agregan "ed":

    try      ==>  tried
    dry     ==> dried
    cry     ==> cried

3) Los verbos que terminan en vocal seguida de consonante que no sea "w" o "y", doblan la consonante y agregan "ed":

    plan        ==>  planned
    commit   ==>  committed
    shop       ==>  shopped

4) El resto de verbos incluyendo los que terminan con "w", agregan "ed":

    fill      ==>   filled
    serve  ==>  served
    smell  ==>  smelled
    show  ==>  showed


Pronunciación:

1) Todos los verbos regulares que terminan con: p – k – s – ch – sh – f – x – h, pronuncian ED como “T”. Ejemplos de verbos que suenan con "T" al final: asked, baked, fixed, joked

2) Todos los verbos regulares que terminan con: l – v – n – m – r – b – v – g – w – y – z, y sonido vocal, pronuncian la "ED" como "D".Ejemplos: allowed, agreed, appeared, believed, cried, moved, shared.

3) Todos los verbos regualres que terminan en "T" o "D", pronuncian el "ED" como "ID". Ejemplos: accepted, afforded, ended, invited, painted, planted.


Referencias:
Reglas Verbos Regulares
Pronunciación de verbos regulares
Lista de verbos regulares

sábado, 30 de octubre de 2010

ASP .NET: iTextSharp no funciona en sitios web en producción

iTextSharp es un ensamblado OpenSource para .Net, que permite crear archivos en formato PDF. Muy útil cuando queremos convertir archivos HTML a PDF. Sin embargo existe un problema con la dll en producción.

El problema es que después de instalar en el servidor de producción, obtenemos el sisguiente error: "That assembly does not allow partially trusted callers"

La solución es modificar el código fuente de iTextSharp, para que permita ensamblados en modo "Partially Trusted Callers" en lugar de full trust.

Lo único que se debe hacer es modificar el archivo AssemblyInfo.cs, establecediendo las siguientes líneas de código:

using System.Security;
using System.Security.Permissions;

[assembly: AllowPartiallyTrustedCallers]

Referencia: www.techparadise.gr

jueves, 14 de octubre de 2010

domingo, 26 de septiembre de 2010

Linq: Usar operadores de Linq en lugar de un foreach

Éste es un caso en el que quería llenar un DropDownList utilizando el CascadingDropDown. En el método del WebService, quise usar el método AddRange, y así evitar tener que implementar un foreach para iterar por la colección de filas de un DataTable.

Por ejemplo, tengo un método que se llama Clientes.Listar(), el cual devuelve la lista de filas en un objeto DataTable, entonces para llenar al DropDownList tengo que usar un foreach para recuperar el valor que se va a mostrar en el DropDown y el valor llave que se utilizaría para saber cuál item se seleccionó. Utilizando el método AddRange del tipo List y las técnicas de Linq, tenemos el siguiente código de ejemplo:

--------------------
List valores = new List();
Clientes clientes = new Clientes();

valores.AddRange
(
    from fila in clientes.Listar().AsEnumerable()
    select new CascadingDropDownNameValue(fila["NOMBRE"].ToString(), fila["CODIGO"].ToString())
);
return values.ToArray();

--------------------
Otra alternativa de Linq pero expresada en secuencia de operadores de Linq sería de la siguiente forma:

--------------------
values.AddRange(clientes.Listar().AsEnumerable().Select(
fila => new CascadingDropDownNameValue
(
    fila["NOMBRE"].ToString(),
    fila["CODIGO"].ToString()
)));
--------------------

Cualquiera de los dos casos anteriores sirven para reemplazar el siguiente código:

foreach (DataRow fila in clientes.Listar().Rows)
{
     values.Add(new CascadingDropDownNameValue(fila["NOMBRE"].ToString(),   
     fila["CODIGO"].ToString()));
}

La diferencia, entre éste foreach y el uso de Linq es que Linq me permite hacer muchas cosas en una sola línea de código, en el peor de los casos tengo que agregar otras líneas, pero con las técnicas tradicionales, en lo personal, el código se vuelve para mí muy tedioso y en ocasiones dificil de entender.

Algunos dicen que Linq es más rápido, otros dicen que no siempre es el más rápido, independientemente de la eficiencia con que resuelva Linq el problema, prefiero Linq porque me permite codificar mejor casos difíciles donde tengo que dar tratamiento a por ejemplo muchos campos de una tabla o muchos datos de un arreglo, etc.

domingo, 12 de septiembre de 2010

Asp.Net: Valor enviado desde servidor no se actualiza con Javascript

Existe un caso especial en el que deseamos actualizar un valor, por ejemplo un contador de filas de un GridView, el cual está dentro de un UpdatePanel. Para actualizar el valor, se decide registrar una variable dinámica la cual se asocia al objeto window.document, quedando en la página del cliente de la siguiente forma:

<script type="text/javascript">//<![CDATA[
document.TotalRows='5';//]]>
</script>


Para registrar una variable al objeto document de Javascript desde el Code-Behind con C#, se hace de la siguiente forma:

if (!ClientScript.IsClientScriptBlockRegistered("total"))
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "total",
"document.TotalDeFilas ='" + gridView.Rows.Count + "';", true);

En el caso que estaba resolviendo, el código anterior lo coloqué en el evento Page_Load() de una página *.aspx.

Ahora bien, cada vez que un usuario agregue un registro nuevo o elimine un registro, el valor debe cambiar en la página. Si utilizamos la siguiente línea de código, nos daremos cuenta que no va a funcionar, aunque la línea de código éste buena:

ClientScript.RegisterClientScriptBlock(this.GetType(), "total", "document.TotalDeFilas ='" + gridView.Rows.Count.ToString() + "';", true);

¿Por qué no se actualiza el valor en la página después de por ejemplo eliminar un registro?

Muy simple (aunque me tomo como tres horas darme cuenta, jaja!), eso ocurre porque el GridView está dentro del UpdatePanel. Entonces para solucionarlo; es decir, para actualizar el valor, hay que usar el objeto ScriptManager en lugar del objeto ClientScriptManager. La línea de código sería entonces:

ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "total", "document.TotalDeFilas ='" + GridView.Rows.Count + "';", true);

Lo que vale la pena tener en mente es que si uno desea actualizar valores de objetos que están dentro de un UpdatePanel usando javascript, lo mejor es usar ScriptManager en el CodeBehind.

lunes, 9 de agosto de 2010

LINQ: Excelente plug-in para VS 2008+

Encontré un excelente plug-in para instalar en Visual Studio 2008 el cual permite visualizar de una forma diferente la cadena que se envía a SQL Server una vez ejecutada la expresión o sentencia de LINQ.

Si bien en modo de depuración podemos ver la cadena que se envía al SQL Server, con el plugin es posible visualizar la cadena pero además se puede visualizar los datos que vienen de vuelta desde la base de datos.

Un ejemplo de la nueva ventana de dialogo es la siguiente:

Ventana de Linq Visualizer.

Si hacemos clic en "Execute", veremos el resultado que es devuelto desde la base de datos, por ejemplo:

Ventana con resultados.

El plugin se llama "Linq to Sql Visualizer" y se puede descargar desde la página del creador en linq-to-sql-debug-visualizer.
 

domingo, 4 de julio de 2010

Ubuntu 10.04: ¿Cómo posicionar los botones de la barra de título de la ventana?

Como es sabido, en Ubuntu 10.04, todas las ventanas muestran los botones de configuración de tamaño de la ventana en el lado izquierdo de la barra de título. Este cambio se me hace totalmente incómodo y por suerte la forma para restaurarlo es muy fácil!

Los pasos son los siguientes (forma para expertos):

1- Alt+F2 para abrir el cuadro de diálogo para ejecutar aplicaciones.
2- Digitar gconf-editor
3- Ir a /apps/metacity/general
4- En el lado derecho buscar button_layout
5- Modificar el valor de la cadena button_layout de la siguiente forma

:minimize,maximize,close
Notar que los dos puntos ahora se ponen en el lado izquierdo de la cadena y la palabra close se mueve al final de la cadena.


La otra alternativa pero mucho más fácil es utilizando la herramienta Ubuntu Tweak, y sinceramente es muy buena. Permite configurar infinidad de cosas y preferencias de Linux de forma fácil y que no son visibles para la mayoría de los usuarios. Por consiguiente el uso de comandos queda relegado! Además la aplicación permite la actualización o descarga de nuevos programas.

Para restaurar el posicionamiento de los botones de la barra de título, simplemente, en Ubuntu Tweak, vayan a la sección Escritorio y buscan Configuración de Gestor de Ventanas y en el lado derecho buscan Formato de botones en la barra de título de la ventana. Muestran las opciones Izquierdo - Derecho. Simplemente se escoge derecho y listo.

Ejemplo:

domingo, 16 de mayo de 2010

ASP .Net: No se ven las imágenes en ThunderBird

En las pruebas de envío de correos con ASP.NET y Visual Basic, ocurre que los mensajes se ven como se espera en GMail, Hotmail y Outlook; funciona perfectamente, sin embargo para ThunderBird el resultado es otro. Las imágenes no se observan y no es por configuración de las opciones de la aplicación.

Solución encontrada:
Había que especificar qué tipo de MIME se usa para cada imagen incrustada en el mensaje de correo con la siguiente línea de código:

Dim imageResource1 As LinkedResource = New System.Net.Mail.LinkedResource(Server.MapPath("imagenes/imagen1.jpg"), MediaTypeNames.Image.Jpeg)

Asp. Net: Tarda en llegar el mensaje de correo de GMail

Estuve averiguando por qué al enviar un mensaje de correo usando código Visual Basic .Net con ASP.Net y noté que al usar como servidor de correos una cuenta de GMail, resulta que éste ralentiza en gran medida la entrega del mensaje a su destinatario.

Y ya averigüé por qué ocurre!. El problema es que al incluir direcciones URL en el mensaje, parece que GMail analiza si esa URL existe y quién sabe qué más cosas hace; el punto es que al quitar la URL del mensaje, la entrega al destinatario se da en un tiempo muy bueno.

Asp .Net: Mantener la sessión de usuario activa.

¿Por qué se pierde la sesión de usuario y cómo lograr que permanezca todo el tiempo hasta que se cierre la sesión?

En el siguiente link encontrarán las respuestas. Sin embargo, yo implementé otra solución con ayuda de "Web Service" estático.

Más referencias:
Ésta es interesante porque lo resuelve con un HttpHandler
Ésta otra solución pero con JQuery