Notas sobre instaladores

 

 

Me he visto en la necesidad de investigar un poco mas acerca de instaladores y todo el mundo complejo que involucra, aqui algunas de mis anotaciones mas importantes: 

Herramientas de Monitoreo de Instalacion/Desinstalacion 

 

  • Herramienta gratuita monitoreo de cambios en el disco duro y en el registro de windows: Spyme Tools (http://www.lcibrossolutions.com/spyme_tools.htm) Yo la utilice y sirve bastante sin embargo puede llegar a tener mucha informacion a revisar. 
  • Pagina que contiene diversas herramientas de monitoreo de cambios en el sistema, algunas ya no existen pero vale la pena revisarla: http://www.installsite.org/pages/en/tt_analyze.htm 
  • Herramienta comercial de desinstalacion. Su tecnologia Intalltracker es interesante, lo bueno de esta herramienta es que al momento de finalizar la desinstalacion reporta si han quedado cosas por quitar o remover, esto es muy util cuando se hace el desarrollo de los instaladores. Uninstall Tool 3 (http://www.crystalidea.com/uninstall-tool) 
  • Herramienta gratuita de desinstalacion ZSoft Unistaller, no la probe pero he escuchado buenos comentarios y tambien pueden ver que ha ganado varios premios: http://www.zsoft.dk/index/software 
  • Se acuerdan de regmon y filemon, pues Process Monitor es el que los combina a ambos y no es malo decir que he visto un par de hacktivistas usar esta herramienta para hacer de las suyas 🙂 http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx 

 

 

Herramientas de construccion de instaladores 

 

  • El proyecto de Deployment de Visual Studio, es simple y para instaladores que no hacen cosas “complejas” anda bien 
  • Wix, definitivamente la mas versatil de las herramientas, permite tener un control total de la base de datos MSI 🙂 y encima es software libre y tiene muchas personas que ya la usan.  
  • Installshield, el menos querido de mis recomendaciones, tiene caracteristicas interesantes, lo malo es que anda medio que liado con su Installscript un “lenguaje de programacion script” que es algo asi como un hibrido entre C, VB y pascal. 

 

Sitios Web 

 

  • Installsite.org, un sitio que reune mucha informacion acerca de los instaladores, esta comprometido con Installshield, lo que en algunos articulos lo hace muy parcializado. 

 

 

Libros 

 

  • Nuevamente Wix tiene mi mayor atencion, aquí el libro que recomiendo por su relacion con esa tecnologia y por ser tambien el mas reciente (2010): WiX- A Developer’s Guide to Windows Installer XML (en proceso de lectura…) 
  • Una guia mas general acerca de MSI, algo antiguo (2004) pero aun recomendado por algunos amigos: The Definitive Guide to Windows Installer  
  • Un libro vinculado a Installshield, mas antiguo que el resto (2002): Getting Started with InstallShield Developer and Windows Installer Setups  
  • Finalmente un conjunto de manuales a descargar del sitio de Flexera – Installshield son de la version 2010 (y bueno me toco esa version y luego migrar a Wix), el mas importante de esos manuales es: InstallShield 2010 InstallScript Language Reference Guide  

 

 

 

 

Como detectar internet en aplicaciones Windows y Web

Hoy en dia podemos concebir nuestra vida sin internet? Yo creo que no. Las aplicaciones que escribimos mas y mas asumen que estaremos conectados continuamente a Internet. Pero hay escenarios donde aun no podemos garantizar una conexion permanente a Internet: zonas rurales o caidas de la infraestructura de red de nuestro proveedor. En paises como el mio tambien el no tener internet puede considerarse bastante comun. En cualquier caso determinar si estoy conectado a internet es practicamente un requisito implicito para las aplicaciones que escribimos hoy y en muchos foros y listas de discusion se pregunta lo mismo y hay varias respuestas. Pero aqui les mostrare la respuesta oficial de Microsoft y mi propia implementacion Smile

La idea y el gran “secreto” es usar el NCSI de Microsoft (Network Connectivity Status Indicator) tal como se explica en este articulo.

En el articulo encontraran que la parte mas importante es esta (al menos para mi):

Type of Request that NCSI Sends What NCSI Expects to Receives if Connectivity Exists
A request for http://www.msftncsi.com/ncsi.txt

Page called ncsi.txt containing the following line of text with no terminating new line or other non-printing characters:

Microsoft NCSI

(Page headers disable caching.)

A request for DNS name resolution ofdns.msftncsi.com

Resolution of the DNS name to: 131.107.255.255

Bueno aqui mi implementacion, agregando una validacion adicional, que el/los adaptadores de red esten habilitados, probablemente es redundante pero….

1 public bool IsInternetConnected() 2 { 3 //Stopwatch clock = new Stopwatch(); 4 //clock.Start(); 5 6 var isNetworkAvailable = IsNetworkAvailable(); 7 if (!isNetworkAvailable) return false; 8 var ncsiRequest = IsNCSIConnected(); 9 var dnsLookupNCSIResolved = IsDnsLookupResolved(); 10 11 //clock.Stop(); 12 //Debug.WriteLine("Time elapsed " + clock.ElapsedMilliseconds + " milliseconds"); 13 //Console.WriteLine("Time elapsed " + clock.ElapsedMilliseconds + " milliseconds"); 14 //Debug.WriteLine("Time elapsed " + clock.ElapsedMilliseconds / 1000 + " seconds"); 15 //Console.WriteLine("Time elapsed " + clock.ElapsedMilliseconds / 1000 + " seconds"); 16 if (ncsiRequest || (!ncsiRequest && dnsLookupNCSIResolved)) return true; 17 return false; 18 }

El codigo comentado lo dejo ahi porque yo lo use para hacer mediciones de tiempos y tambien por si en algun momento ustedes necesitan hacerlas.

1 private bool IsNetworkAvailable(long minimumSpeed=0) 2 { 3 if (!NetworkInterface.GetIsNetworkAvailable()) 4 return false; 5 6 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 7 { 8 // se descartan los elementos por razones estandar 9 if ((ni.OperationalStatus != OperationalStatus.Up) || 10 (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) || 11 (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel)) 12 continue; 13 14 // Se filtran modems, puertos seriales y cosas por el estilo 15 // se utiliza 10000000 como un minimo de velocidad para la mayoria de los casos 16 if (ni.Speed < minimumSpeed) 17 continue; 18 19 // Se descarta nic virtuales (vmware, virtual box, virtual pc, etc.) 20 if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) || 21 (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)) 22 continue; 23 24 return true; 25 } 26 return false; 27 }

El metodo parece demasiado rebuscado pero tiene excelentes consideraciones.

1 public bool IsNCSIConnected() 2 { 3 try 4 { 5 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.msftncsi.com/ncsi.txt"); 6 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 7 return response.StatusCode == HttpStatusCode.OK; 8 } 9 catch (Exception) 10 { 11 return false; 12 } 13 }

El metodo valida que se haya obtenido un codigo 200 como respuesta, no recupero el contenido del archivo consultado.

Finalmente verifico que se este resolviendo correctamente el DNS, todo para seguir el algoritmo propuesto por Microsoft.

Espero que les sea de utilidad, en una siguiente entrada mostrare el metodo de detectar internet pero en Windows Phone.

Saludos.

Una estrella en xaml

Esta es una entrada ridiculamente simple y se debe a una necesidad propia y a multiples preguntas que me hicieron, solo es el codigo para una estrella en XAML, la utilice para el control de rating, en mi proxima aplicacion de Windows Phone:

1 <Canvas x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 2 <Path x:Name="star" 3 Canvas.Left="120" 4 Canvas.Top="120" 5 Stretch="Fill" 6 StrokeThickness="0" 7 StrokeLineJoin="Round" 8 Stroke="Yellow" 9 Fill="Yellow" 10 Width="30" 11 Height="30" 12 Data="F1 M 24,10.2671L 15.26,10.2048L 12.5,1.91182L 9.74,10.2048L 1,10.2671L 8.03423,15.4546L 5.39261,23.7861L 12.5,18.6992L 19.6074,23.7861L 16.9658,15.4546L 24,10.2671 Z "/> 13 </Canvas>

estrella

Saludos