Our Blogs
English
Español
Skip Navigation Links
News
Our Team
Mentoring
Javier Loría
Go to home page
Go Search

 
Other Blogs
There are no items in this list.
Links
There are no items in this list.

Our Blogs > Español > Javier Loría
Herramientas de Silverlight para VS 2008

En el sitio d Microsoft ya están disponibles las herramientas para Silverlight para Visual Studio 2008. NO es necesario bajar el SDK para Silverligth ya que las herramientas ya lo traen incorporado.

http://www.microsoft.com/downloads/details.aspx?familyid=C22D6A7B-546F-4407-8EF6-D60C8EE221ED&displaylang=en

 

SQLBulkCopy

Como parte de un proyecto de importación de datos tuve que trabajar con un proveedor de ODBC que no permitía la extracción con SSIS, por lo que investigue como hacer una carga de datos desde .NET usando un BULK INSERT. EL siguiente código explica cómo hacer dicha esta operación en C#:

DataSet ds = new DataSet();

using (OdbcDataAdapter da = new OdbcDataAdapter("SELECT * FROM MiTabla"

, "dsn=MiDSN;"))

{

da.Fill(ds);

 

}

SqlBulkCopy bc = new SqlBulkCopy("Data Source=Servidor;Initial Catalog=BaseDatos;Integrated Security=True"

, SqlBulkCopyOptions.TableLock);

bc.DestinationTableName = "MiTabla";

bc.WriteToServer(ds.Tables[0]);

 

Este código tiene deliberadamente eliminado los TRY-CATCH para enfocarse únicamente en la parte funcional.

Controles de Windows en XAML

Trabajar con Controles de Windows, en proyectos de WPF desde Visual Studio es un incomodo porque todas las propiedades deben fijarse directamente en el XML, y no hay ayuda de IDE o de asistentes. En mi caso estoy trabajando con controles de Dundas de .NET que tienen clientes o miles de propiedades.

En cambio Expression Blend 2.0 si ve las propiedades y construye adecuadamente el XAML. Lo único que hay que hacer es seleccionar el control WindowsFormsControlHost y las propiedades, en misceláneos,en la propiedad Child, el control de Windows agregado. Por ejemplo la siguiente pantalla es la configuración del ChartArea del control de Dundas.

Pero esto solo sirve la primera vez, ya que una vez configurado el control cuando uno presiona OK, configura correctamente el XAML, pero la ventana principal no puede interpretar correctamente el contenido generado, que a pesar de estar bueno genera error:

Específicamente:

"The specified value cannot be assigned to the collection. The following type was expected: "String".

Más adelante buscare si hay forma de evitar el error. O si es el caso a que MS lo repare.

En todo caso finalmente pude configurar el primer grafico y se ve bastante bien:

O

Vinculando Propiedades y Controles

Estoy trabajando en un proyecto de visualización de BI-geográfica para la empresa Dole, y como se requiere animaciones estoy haciendo mis primeros pasos "serios" con XAML. Una frustración que he tenido es que me ha tomado mucho tiempo poder vincular (Bind) una propiedad de una página con un control. He aquí el paso a paso de cómo lo hice:

  1. Nombre la pagina en el XAML. Para poder referenciar la pagina, debe nombrarla en la pagina debe agregar x:Name="objGeoKPI".
  2. Luego al control que se va a vincular debe asociarlo a la propiedad: Text="{Binding KPIName, ElementName=objGeoKPI, Mode=OneWay}" .En mi caso la propiedad va a ser de lectura (ReadOnly) y el usuario no va a interactuar con ella, por eso el modo es una vía. En mi caso en nombre de la propiedad KPIName.
  3. En el código debes agregar la propiedad, en mi caso es muy simple solo retorna un valor como una cadena de caracteres string), si fuere lectura y escritura debería agregarse también el set:

public string KPIName

{

get { return mKPIID.ToString(); }

}

  1. Luego en el código debe registrarse la dependencia de la propiedad y el control. En el código aparece el nombre de la propiedad (KPIName), el tipo (string), el tipo de la ventana (GeoKPI) y el valor default (KPI):

public static readonly DependencyProperty KPIIDStrProperty

= DependencyProperty.Register("KPIName", typeof(string), typeof(GEOKpi)

, new PropertyMetadata("KPI"));

  1. Finalmente cada vez que cambies el valor de la propiedad, debe notificarse a los clientes que "refresquen" el valor. En mi caso:

SetValue(KPIIDStrProperty, value.ToString());

mKPIID = value;

Habilitar y Deshabilitar Hibernación en Vista

Recientemente he tenido problemas con la memoria de computador, que reconoce y des-reconoce 1 GB de memoria. Si esto no es suficientemente malo, cuando la pongo en hibernación la configuración del archivo no es la apropiada y por supuesto queda del tamaño incorrecto. En algún momento tuve que aprender como configurar y desconfigurar la hibernación del sistema en vista, ya que no existen la opción en el control panel. Para hacerlo debe abrirse una consola como administrador y ejecutar:

powercfg /hibernate off

Obviamente para configurarlo de vuelta:

powercfg /hibernate on

Antes de Huff

Desde hace poco menos de unos 6 meses estoy trabajando con un modelo que permite predecir o estimar las ventas de una tienda, agencia o centro comercial (Mall). Este proyecto es una prueba de concepto que de SQL 2008, realizamos en México, para una empresa financiera: Nacional Monte de Piedad. Quiero escribir de algunos resultados de este ejercicio, pero me pareció apropiado poner algo de contexto académico previo, y esta entrada va en este sentido.

A continuación siguen los fundamentos teóricos e historia de los modelos de teorías gravitacionales, pero antes es interesante entender el problema que resuelve. Piense porque en un centro comercial (Mall), los restaurantes del "Food Court" venden grandes volúmenes cada uno y que locales del mismo tamaño fuera del "Food Court" venderían muchísimo menos; ¿porque en casi todas las ciudades hay una calle que tiene una gran cantidad de casas de empeño muy cercanas una de la otra?, ¿no venderían mas si no estuvieran justo a la par de la competencia?; o ¿porque las zapaterías pequeñas con frecuencia venden más cuando están unas junto a otras?. La respuesta es la ley gravitación J

Los modelos de predicción de ventas al detalle se inician con la "Ley gravitacional del comercio al Detalle de Reilly" que estima el área de influencia de diferentes ciudades. La hipótesis original del modelo es que las ciudades tienen un comportamiento equivalente a la ley de la gravedad. Si abrimos los viejos libros del colegio, podemos recordar que la ley gravitacional universal de de Newton dice:

La fuerza de la gravedad es la fuerza que de atracción que mutuamente ejercen entre sí dos objetos y es directamente proporcional al producto de las masas e inversamente proporcional al cuadrado de la distancia que las separa. Llamamos G a una constante gravitatoria universal que es igual a 6.67 x 10-11Nm2/Kg2.

Aplicando este tipo de pensamiento al área de influencia (o sea al área que realiza sus compras en una ciudad determinada), William Reilly, estableció que partiendo de la formula de la fuerza de gravedad, podemos calcular la relación que tiene la fuerza de atracción de 2 ciudades (A y B) respecto a una población ubicada cerca de ellas. Iniciando con la ley de la fuerza de la gravedad y simplificando, esta puede expresarse como:

Esto puede interpretarse como que la relación entre la atracción de una ciudad A y una ciudad B sobre una población puede expresarse como directamente proporcional a la relación sus masas e inversamente proporcional al cuadrado de la relación de las distancias que separan a la población de las ciudades. Numéricamente hablando, si vivo a 20 Km de una ciudad de 300,000 habitantes (Ciudad A) y a 5 Km de una ciudad de 40,000 habitantes (Ciudad B), entonces la relación es: 0.4687. O sea por cada dólar que gastó en la ciudad B, gastaré 46 centavos en la ciudad A. Un elemento interesante a evaluar es el impacto que la distancia que es más que proporcional. O sea si la ciudad B está a 10 Km, en lugar de 5 Km, la relación cambia a: 1.875, que debe interpretarse como que por cada dólar que gasto en la ciudad B, gastaré dólar ochenta y siete en la ciudad A, un cambio más que proporcional.

Sobre este modelo, se elaboro uno adicional (Curtis), que en lugar de buscar la proporción asume que la decisión es "absoluta". Compró en una ciudad o en otra, por lo que debemos buscar la distancia que logre que la relación sea 1, que es el punto de "equilibrio". Debe interpretarse que para distancias más cercanas voy siempre a la ciudad B, para distancias más lejanas siempre ira a A. La fórmula del punto de equilibro para la ciudad B es:

En nuestro caso si las dos ciudades de (300,000 y 40,000 habitantes respectivamente) están a 25 km (20 +5) una de otra el punto de equilibrio seria: 6.687 Km, que debe interpretarse como si vivo a menos de esta distancia de B, compro en B, sino vivo más largo compró en A. Más adelante seguiremos con el Modelo de Huff…

Sorpresa Geográfica

Por más de un ano he estado trabajando con lo que finalmente es SQL 2008, y por los últimos 6 meses con información geo-referenciada. Pero no es hasta el fin de semana pasado que instale la versión RTM de SQL 2008. Como conocía bien el producto, no hice un esfuerzo adicional por ver qué cosas nuevas trae. Esto fue un error, ya que en mi primera demo, sorpresa geográfica!!!. Pueden verla en la siguiente gráfica:

Parece que el equipo de desarrollo al final pudo incorporar una opción para incluir un visualizador grafico de la información geográfica en SSMS, y la verdad les quedo muy bien. No tiene muchas opciones, y está limitado a 5000 filas, pero es una excelente herramienta para el DBA o el desarrollador.

 

Columnas Persisted

Con la intención de hacer más frecuentes mis posteos voy a empezar a copia aquí respuestas a las preguntas que algunos amigos y clientes me hacen por correo. Algunos nombres han sido cambiados para proteger la identidad de los inocentesJ.

Estimado Javier:
¿Es conveniente marcar la columna PERSISTED y definir un índice sobre esta?, Si no es recomendado que la columna sea PERSISTED=yes, ¿La columna puede estar definida de esa forma sin el índice?

DERNORMALIZADOR COMPULSIVO

Estimado DERNORMALIZADOR:

Como dice la canción de Jarabe de Palo: Depende. … ¿De qué depende? … Del cristal con que se mire todo depende…
Una columna calculada, convierte a una tabla en una mezcla de vista y tabla. En mi opinión, que no comparten todos los DBAs, es una excelente forma de des-normalizar. Esto es de poner una columna que depende de las otras columnas de la tabla, y al mismo tiempo garantizar que los datos son consistentes. Antes para hacer esto había que usar una vista independiente, ahora la misma tabla puede hacerlo. Esto es diseño lógico de la Base de Datos y se hace para facilitar el trabajo de desarrollador.
En la parte de diseño físico, tenemos 3 opciones:
1) Dejarla como calculada únicamente: esta suele ser la mejor opción casi siempre. En este caso el servidor cada vez que se consulta la tabla vuelve a calcular el valor. En contra de lo que la mayoría de los desarrolladores piensan esto suele ser más rápido que almacenar la columna, y la razón es simple: los discos duros son lentos, y el CPU y memoria rápidos. Para el servidor multiplicar 2 columnas suele ser más rápido que leer el cálculo previamente almacenado en el disco, esto sin contar con que adicionalmente se evita el costo de INSERT y UPDATE.
2) Ponerla como PERSISTED: Cuando los cálculos son pesados (complejos, ejemplo los que se basan en XML, u otros) y la columna no se actualiza con frecuencia, PERSISTED puede ayudar al desempeño. PERSISTED lo único que nos indica es que la columna se materializa en la tabla, esto es que en el momento de hacer INSERT u UPDATE se calcula y se almacena el valor, luego cuando se consulta se usa. Esto es nuevo en SQL 2005, antes de esto para persistir o materializar una columna había que crear un índice.
3) Se puede indizar: Esta es independiente de la opción de PERSISTED. Una columna indizada puede ayudar los SELECT cuando se usan con frecuencia en WHERE o en JOINs y lo más importante cuando sea SELECTIVA.

En SQL 2005 y SQL 2008 puede ser parte de la llave o solo incluirse a nivel de detalle usando el INCLUDE.

Saludos….

 

Libro de Mejores Prácticas de Sharepoint

Como parte de una colaboración como MCT a MS-Press, recientemente leí el libro: Microsoft Office SharePoint Server 2007 Best Practices http://www.amazon.com/Microsoft-Office-SharePoint-Server-Practices/dp/0735625387/ref=sr_1_1?ie=UTF8&s=books&qid=1219844841&sr=1-1 y la verdad me dejo muy impresionado la calidad y profundidad del mismo. El libro no es un libro de desarrollo es un libro de arquitectura. Mis comentarios en el sitio de Amazon en ingles fueron:

My review may be biased, because I really enjoyed this book.
This book is well written and instead of directly heading to the technical aspects of Sharepoint, it goes and starts with the problems that are most likely to kill a project: change resistance, politics and conflict management. However it doesn't stop there. The book digs deep into every aspect of a SharePoint project lifecycle from envisioning to deployment. This book is a must read for software architects.
PROS:
1)    Full of effective recommendations on how to get the most of SharePoint.
2)    Solid advice on how to manage SharePoint projects.
CON:
1)    It may be overwhelming to new SharePoint players. If you are new to SharePoint consider reading the chapters relevant in each phase of the project.
2)    If you are looking for technical depth and how to practices, you won't find them here.

 

 

 

Como firmar y autorizar assemblies

Paso 1: Para crear la llave: sn -k MiLLave.snk

Un archivo es suficiente para una organización de desarrollo. No se requiere 1 llave por aplicación.

Paso 2: Agregar la referencia al assembly (Ejecutable, DLL o Sitio Web) en el archivo Assembly Info.

[assembly:AssemblyKeyFile(@"c:\Llave\MiLLave.snk")]

Paso 3: Agregar una política que permita la ejecución de assemblies con esa llave y asignarle los permisos adecuados.

Esto se hace en Administrative tools .NET Framework 2.0 Configuration,

                a) Navegar al Runtime Security Policy y con clic derecho sobre Runtime Security Policy escoger Trust Assembly.

                b) Escoger donde se harán los cambios  (maquina)

                c) Escoger la ruta del assembly firmado.

                d) Cambiar la opción para que sean All Assemblies with the same assembly public key.

                e) Definir el nivel de acceso mínimo requerido por la aplicación.

                f) Finish

Paso 4: Ponerle nombre al grupo de código.

El wizard genera un grupo de código llamado Wizard_0 que queda en Machine, Code Groups. Con clic derecho renombrarlo (Gilgal). También puede moverse a debajo de otra de los códigos de grupo, por ejemplo moverlo debajo de LocalIntranet con drag and drop.

Paso 5: Validar que la aplicación corre. Con estos permisos.

Paso 6: Crear instalador

Hacer clic derecho sobre RunTime security Policy y escoger Create Deployment Package

                a) Seleccionar Machine.

                b) Seleccionar una ruta y escribir un nombre de archivo MSI.

                c) Next

                d) Finish

Paso 7: Ejecutar el MSI donde sea necesario.

1 - 10 Next

 ‭(Hidden)‬ Admin Links