Sep 27
Es verdad que tenía un poco abandonado el blog, y puede parecer que Silverlight también. Lo primero es cierto, pero lo segundo todo lo contrario, ya que en este tiempo he estado asignado a varios proyectos Silverlight. Con un poco de suerte cuaja este nuevo cacharro de Microsoft y las empresas se toman en serio esta nueva tecnología.
Y ahora, cuando más de uno está destripando PRISM, como por ejemplo el compañero Braulio Diez, que por cierto ha sido nombrado recientemente MVP en Silverlight, llega el menda con un post de MVVM. Desde aquí, y antes de continuar, dar mi más sincera enhorabuena a Braulio por este reconocimiento – no sé realmente cuanta gente opta a estos premios, pero si estoy seguro que nadie se lo merecía más que él. Todo un lujo trabajar a su lado. Congratulations (es que se empeña en que escriba en ingles
).
MCV, MVP, y ahora MVVM, Model View ViewModel. Aunque ya se ha dicho y escrito mucho sobre este modelo, voy a intentar dar una visión más práctica, después de haber aplicado el modelo en diversas aplicaciones.
Leer el artículo completo »
Ago 16

Para que no digan que solo de Silverlight vive el hombre, aquí va una de Android.
Por diferentes razones seguro que a más de uno le gustaría cambiar la cuenta de gmail inicial con la que registó su Magic.
Pues bien, es posible cambiar la cuenta con la que hemos registrado nuestra Magic sin tener que volver al estado inicial y tener que reinstalar todas las aplicaciones que ya tuvieramos instaladas. Para ello lo que tenemos que hacer es ir a Ajustes / Aplicaciones / Administrar Aplicaciones y borrar los datos de Google Apps.
Despues de esto android nos volverá a pedir una nueva cuenta de gmail. Es posible que tengamos que ejecutar alguna aplicacion Google, como por ejemplo Google Talk, para que comience el proceso de registro.
May 01
Seguramente que a más de uno le resultarán obvios los puntos mencionados en este post para mejorar el performance de una aplicación web .Net, y reducir el peso de una página, pero nunca esta de mas recordarlos.El que escribe sin ir más lejos los tuvo que aplicar no hace mucho tiempo cuando un cliente solicitó el análisis de una aplicación para intentar disminuir los tiempos de carga.
Imaginemos el siguiente escenario:
Un formulario con un elevado número de componentes, entre ellos muchos dropdownlist anidados en un DataList. Los dropdownlist son cargados en el servidor, y tenemos varios tipos de combos en cada fila diferenciados por los valores que contienen, y estos se repiten en cada una de las filas del DataList.
Pues si por ejemplo, tenemos 4 combos distintos por fila y el Datalist contiene 20 filas, quiere decir que enviamos 20 veces el contenido de cada tipo de combos desde el servidor al cliente (20x4=80 contenidos repetidos). Además tenemos elementos en el formulario, simplemente para mostrar información, sin nunguna funcionalidad asociada.
Bueno con un escenario asi de simple podemos aplicar los siguientes trucos:
- Sustituir aquellos elementos que no tienen funcionalidad asociada por etiquetas que son los elementos más ligeros capaces de mostrar información. De esta manera eliminamos una sobrecarga del ViewState.
- No cargar los DropDownList en el lado del servidor. En vez de establecer los valores desde .Net, inyectar codigo javascript que defina variables que contengan arrays bidimensionales con la tupla valor y texto que definan cada una de las opciones del combo. Luego, desde cliente, en el onLoad del formulario, cargamos cada unos de los combos con los valores de las variables.
- Eliminar los espacios en blanco que se crean al generar el HTML de la página. Para ello, desde la misma página, podemos sobrescribir el método Render que es justo el último punto desde donde podemos modificar el HTML antes de enviarlo al cliente.
Ahora veamos un ejemplo de código que sobrescribe el método Render de una página.
C#:
-
protected override void Render(HtmlTextWriter writer)
-
{
-
HtmlTextWriter swHtmlText =
new HtmlTextWriter
(new System.
IO.
StringWriter());
-
-
base.Render(swHtmlText);
-
-
//Obtenemos el HTML de la pagina
-
string strHtml = swHtmlText.InnerWriter.ToString();
-
-
//Eliminamos todos los espacios en blanco que hay
-
//entre los controles
-
strHtml = Regex.Replace(strHtml, "^\\s+<", " <", RegexOptions.Multiline);
-
strHtml = Regex.Replace(strHtml, ">\\s+<", "> <", RegexOptions.Multiline);
-
-
//Escribimos el nuevo HTML limpio
-
writer.Write(strHtml.Trim());
-
-
}
Mar 21
Como complemento al articulo en el que explicabamos como generar / grabar un fichero en Silverlight, el uso del clipboard puede sernos también de utilidad. La solución, aunque no optima porque solo funciona en Internet Explorer, es simpe.
C#:
-
private void btnSetTo_Click(object sender, RoutedEventArgs e)
-
{
-
ScriptObject clipboard = (ScriptObject)HtmlPage.Window.GetProperty("clipboardData");
-
-
if (clipboard != null)
-
clipboard.Invoke("setData", "text", txtCaja.Text);
-
}
-
-
private void btnGetFrom_Click(object sender, RoutedEventArgs e)
-
{
-
ScriptObject clipboard = (ScriptObject)HtmlPage.Window.GetProperty("clipboardData");
-
-
if (clipboard != null)
-
txtCaja.Text = clipboard.Invoke("getData", "text").ToString();
-
}
-
Feb 28
Creo que este problema es algo frecuente. Intentamos cerrar una pestaña desde una aplicación .Net. Esto simplemente es un "window.close();" y todo funciona correctamente desde Internet explorer 6, pero si intentamos lo mismo en IE7 salta un popup para preguntarnos si realmente queremos cerrar la pestaña.
La solucion es sencilla. Desde la pagina que queremos cerrar redirigimos nuestra aplicación hacia una página nueva que simplente tendrá el siguiente script:
HTML:
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
-
-
</head>
-
-
-
<script language=javascript type="text/javascript">
-
window.open('', '_self');
-
window.close();
-
</script>
-
</body>
-
</html>
La explicación parece ser que es por motivos de seguridad. No se permite cerrar una pestaña desde Javascript que no ha sido abierta desde Javascript. Con este código simplemente engañamos al navegador haciendole creer que la pagina ha sido abierta desde cliente y luego la cerramos.
Un Bug?
Feb 27
Esto de Silverlight va tomando forma, y va cogiendo fondo. Forma porque hay muchas demostraciones en la web sobre lo que visualmente se puede hacer con Silverlight y fondo, por que ya son mucho los programadores que estan apostanto por esta tecnología y podemos encontrar numerosos desarrollos realizados integramente en Silverlight que muestran lo que se puede hacer mas allá de fuegos artificiales.
Como ejemplo de experto desarrollador en Silverlight tenemos a Brualio Diez y la aplicación que da titulo a este post, aplicación que tiene expuesta a todo el público DB Schema Editor.

DB Schema Editor, es una aplicación que nos permiter diseñar visualmente Esquemas de Bases de datos. Podemos añadir, borrar, arrastrar tablas y sus relaciones, Como característica principal podemos decir que una vez tengamos nuestro esquema finalizado podemos generar los Script de creación de la base de datos para distintos motores:
- SQL Server
- Oracle
- MySQL
- PostgreSQL
- SQLite
- FirdBird
No me creo que no encuetres la base de datos que necesites, están todas. Podemos grabar el esquema para posteriormente recuperalo, podemos compartirlo con otros usuarios de la aplicación y como punto extra podemos generar un Jpeg con el diagrama

.
La aplicación esta simplemente genial, es usable cien por cien, y cuando digo usable quiero decir que hace lo que esperas que haga. Y todo en Silverlight, y todo en C#.
Para usar la aplicación tienes que registrarte, es totalmente gratis y de esta manera usar todas las características, pero también tienes la opción de loguearte como invitado. Te recomiendo que te registres, es rápido y de esta manera podrás probar todas sus posibildades.
Con aplicaciones como estas Silverlight tiene un futuro prometedor.
Dic 14
Pongámonos en situación. El problema es simple: Necesitamos generar un fichero con resultados / Informe y guardarlo en la maquina cliente. Por motivos de seguridad esto no podemos hacerlo desde Silverlight, ya que no podemos acceder al sistema de archivos en el cliente.
Isolated Storage
Bueno esto no es del todo cierto, ya que sí se puede generar un fichero en el cliente pero solo en un sandbox que tiene Silverlight dedicado a tal efecto. El problema de generar un fichero en el Isolated Storage es el path destinado a ello:
Path del Isolated Storage en Vista
%:\Users\%\AppData\LocalLow\Microsoft\Silverlight\is
Path del Isolated Storage en Windows XP
%:\Documents and Settings\%\Local Settings\Application Data\Microsoft\Silverlight\is
Es ese path habrá una carpeta para cada una de las aplicaciones Siverlight a las que hallamos accedido y hayan hecho uso de esta funcionalidad.
Ventana 'Save File' en Silverlight
Esta ventana en Silverlight no existe, pero si podemos hacer que el usuario reciba un fichero y el decida donde guardalo. La solucion no es muy complicada. Vamos a añadir un nuevo formulario a la pagina sobre el cual generaremos un submit . El destino de este nuevo formulario será una nueva página cuyo único cometido será devolvernos un fichero.
HTML:
-
<form id="formGenerarFichero" action="GuardarFichero.aspx" method="post">
-
<input runat="server" type="hidden" id="contenidoFichero" />
-
<input runat="server" type="hidden" id="nombreFichero" />
-
</form>
[/HTML]
Desde la aplicación Silverlight solo tenemos que jugar un poquito con el DOM de este nuevo formulario, identificando los elementos, estableciendo valores y por último provocando un submit:
C#:
-
private void Button_Click(object sender, RoutedEventArgs e)
-
{
-
HtmlDocument doc = HtmlPage.Document;
-
HtmlElement contenidoFichero = doc.GetElementById("contenidoFichero");
-
contenidoFichero.SetAttribute("value", txtContenido.Text);
-
-
HtmlElement nombreFichero = doc.GetElementById("nombreFichero");
-
nombreFichero.SetAttribute("value", txtNombreFichero.Text);
-
doc.Submit("formGenerarFichero");
-
}
Solo queda cambiar el tipo de respuesta que vamos a recibir desde el nuevo formulario.
C#:
-
public partial class GuardarFichero : System.Web.UI.Page
-
{
-
protected void Page_Load(object sender, EventArgs e)
-
{
-
string data = Request.Form["ContenidoFichero"];
-
string fileName = Request.Form["NombreFichero"];
-
Response.Clear();
-
Response.ContentType = "application/octet-stream";
-
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
-
Response.Write(data);
-
Response.Flush();
-
Response.Close();
-
}
-
}
Nov 14
No sería la primera vez en que las perspectivas de tamaño con el que creamos una maquina virtual se quedan pequeñas, y el problema es que VirtualBox no nos permite redimensionar el tamaño de los discos. La solución la vamos a encontrar en otro programa, DriveImage XML.
Este programa, que podemos usar de forma gratuita siempre y cuando sea para uso personal, nos permite crear imagenes / backups de nuestros discos duros. Realmente lo que vamos a hacer es copiar la unidad que se ha quedado pequeña en otra de mayor tamaño.
Los pasos que debemos de llevar a cabo son los siguientes:
1. Crear un nuevo disco con el tamaño deseado, desde el administrador de discos Virtuales de VirtualBox.
2. Añadir la nueva unidad a la maquina virtual en la que tenemos el disco que se nos quedo pequeño.
3. Instalar el programa DriveImage XML en la maquina virtual.
4. Realizar un Drive to Drive.

- Elegimos el Disco Origen. NEXT
- Elegimos el Disco Destino. NEXT
- Y Confirmar, Simple no?
5. Ahora tenemos que ir Administrador de discos de Windows y activar la unidad.

6. Por último solo nos queda apagar la maquina y volver al gestor de Discos Virtuales de VirtualBox, y seleccionar la nueva unidad de mayor tamaño como unidad Maestra.
Si todo ha ido bien tendremos una maquina virtual con una unidad de mayor tamaño. En este caso podremos borrar la unidad original si ya no la necesitamos.
Nov 02
Llevaba tiempo esperando poder reescribir el control Menu Contextual que hice hace ya tiempo, ya que este dejó de funcionar en la sucesivas versiones alfas, betas y gammas de Silverlight (y no más versiones preliminares porque se le acabarían las letras a Microsoft, menuda pifia por su parte). Bueno el caso, es que no me apatecía volver a escribir el control hasta que Silverlight 2 no fuera una cosa seria. Parece ser que ahora si tenemos una versión final.
El código de este ejemplo lo puedes descargar aquí.
La lógica y funcionamiento del control sigue siendo la misma y practicamente no ha cambiado nada. Lo cambios mas importantes han sido la forma de aplicar propiedades sobre los objetos, y además que en esta nueva versión del Control MenuContextual , el userControl MenuContextaul estará formado por objetos OpcionMenu, siendo estos los encargados de pintarse y modificar su estado cuando el raton entre y salga de ellos. El control de los eventos delegados seguirá estando en el control padre MenuContextual.
Enlaces Relacionados:
Oct 25
Y quien no iba estar de acuerdo con tal afirmación. Otra máxima, mas importante aun si cabe, "el entorno de desarrrollo debe ser lo más parecido, si no idéntico, al entorno de producción"- y quien no iba a estar de acuerdo con esta uútima?. El problema es que no siempre se puede disponer un entorno de desarrollo idéntico al que se dispone en producción, por muy diversos motivos, razones que no vamos a analizar en este post. Ultimamente estoy divirtiendome, y mucho con Oracle, por lo que será la version del Provider de Oracle para .Net el protagonista del artículo. Provider, ¿y esto que es?, definamoslo (para el objetivo del artículo) como una tubería por la que se envian y reciben datos entre una aplicación y la base de datos.
Bien, ahora veamos un entorno que simule nuestro ejemplo:

Leer el artículo completo »
Recent Comments