Android-x86 4.0 RC1 Liberada!


Escritorio de Android 4.0 RC1 para x86
El proyecto Android-x86 ha publicado la primera versión candidata de Android-x86 4.0, que está basada en Android 4.0.3 Ice Cream Sandwich, habiendo añadido código específico para permitir el funcionamiento del sistema en plataformas x86, en especial tabletas y netbooks.
En la RC1 vamos a encontrar el Kernel 3.0.8 con KMS (Kernel Mode Setting) activado. Muchosnetbooks podrán funcionar con resolución nativa con esta versión. Los equipos con AMD Radeon ychipsets Intel podrán beneficiarse de aceleración por hardware de OpenGL.
Android-x86 4.0 RC1, settings

Características de Android-x86 4.0 RC1

Android-x86 4.0 RC1 ofrece soporte para pantallas táctiles, WiFi, audio, Bluetooth, sensor de movimiento y cámara. Se ha incorporado el motor Javascript v8, mucho más rápido que la versión precedente y capacidad de reproducción de streaming en Chrome a través de HTTP, así como soporte experimental para Renderscript.
El sistema simula una tarjeta SDCard mediante almacenamiento interno y los dispositivos externosUSB y SDCard se montan de manera automática al ser conectados en la ruta /mnt/USB. También ofrece soporte para imágenes ISO híbridas.
Android-x86 4.0 RC1 dispone de un asistente de instalación en modo texto y soporta los sistemas de archivos ext2, ext3, ntfs y fat32. Os recuerdo que existen imágenes optimizadas para diversas plataformas (ASUS Eee PC, Lenovo, etc.), por si queréis probar el invento en vuestro netbook.
Más información | Notas de versión
Web | Descarga

Crear un servicio WCF en 10 pasos


Para los que no conozcáis Windows Comunication Foundation (WCF para los amigos) os dejo unos cuantos enlaces muy recomendables:Visión Global de Arquitectura de Windows Communication Foundation

Artículos de Aaron Skonard en MSDN Magazine (aunque los veáis en inglés, redirecciona a los artículos en castellano)Artículos de Juval Lowy en MSDN Magazine (lo mismo que los de Skonnard)Fundamentals of WCF Security – Michele Leroux Bustamante (en inglés, pero merece el esfuerzo)Blog de Oskar Álvarez en Geeks.msEn este post me voy a centrar en la implementación de un servicio WCF muy básico y con pasos muy concretos (algunos mucho más fáciles que otros).

Empecemos, en Visual Studio creamos una solución en blanco (a mi me gusta trabajar así, cada cual con sus manías), a la que añadimos dos proyectos de consola (con C#): Host y Cliente.

Y ahora vamos por partes:

Proyecto Host

1. Agregar referencia al ensamblado System.ServiceModel.
2. Definir una interface con el atributo [ServiceContract] para indicar que es la que define el contrato de WCF. Los métodos de esta interface que se vayan a exponer en deben incluir el atributo [OperationContract].

  
  [ServiceContract]
  public interface IClase
  {
      [OperationContract]
      string Funcion1();

      [OperationContract]
      int Funcion2();

      // Este método no se expone porque no tiene el atributo
      //[OperationContract]
      void MetodonoImplementado();
  }


3. Definir una clase que implemente la interface IClase (en un futuro post explicaré cómo se implementa una interface con sólo dos clics).


    class Clase : IClase
    {
       string IClase.Funcion1() { return "Respuesta"; }
      
       int IClase.Funcion2(){ return 10; }

       void IClase.MetodonoImplementado(){ return; }
    }



4. Añadimos un fichero de configuración (app.config) al proyecto, para establecer las propiedades del servicio.


  <?xml version="1.0" encoding="utf-8" ?>
  <configuration>
  <system.serviceModel>
    <services>
    <!--Comportamiento se define un poco más abajo, en la sección BEHAVIORS-->
      <service name="Host.Clase" behaviorConfiguration="Comportamiento">
        <host>
   <!--Se establece la URL del servicio-->
           <baseAddresses>
             <add baseAddress="http://localhost:8000/WCF/"/>
          </baseAddresses>
        </host>
       <!--En el enpoint se define el ABC de los servicios WCF, Address, Binding y Contract-->
        <endpoint address="Clase"
                  binding="wsDualHttpBinding"
                  contract="Host.IClase"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Comportamiento">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    </system.serviceModel>
 </configuration>



5. En el método Main() iniciamos el servicio.



  class Program
  {
    static void Main(string[] args)
    {
       Type tipo = typeof(Clase);
       using (ServiceHost miHost = new ServiceHost(tipo))
       {
          miHost.Open();
          Console.WriteLine("Servicio en ejecución");
          Console.WriteLine("Pulse una tecla para salir...");
          Console.ReadKey();

          miHost.Close();
       }
  }



6. Ejecutamos únicamente el proyecto Host.

7. Desde la consola de Visual Studio * ejecutamos la herramienta svcutil.exe, que creará los ficheros que servirán de proxy entre el cliente y el servicio.


Se crean 2 ficheros:
- Clase.cs - definición del proxy.
- Output.config - fichero de configuración, que debe ser renombrado como
app.config para los proyectos Windows (web.config para proyectos Web)

* Consola de Visual Studio, la podemos encontrar en: Inicio - Todos los programas - Microsoft Visual Studio 2005 - Herramientas de Visual Studio


Paramos la ejecución y pasamos al otro proyecto.
Proyecto Cliente
8. Agregamos la referencia al ensamblado System.ServiceModel, igual que el paso 1 del proyecto Host.

9. Añadimos los ficheros que genera la herramienta svcutil.exe (paso 7 del proyecto Host), Clase.cs y app.config.

10. En el método Main() iniciamos el proxy y ejecutamos los métodos.


class Program
{
   static void Main(string[] args)
   {
     Console.WriteLine("Pulse cualquier tecla cuando el servicio esté iniciado...");
     Console.ReadKey();

     using (ClaseClient proxy = new ClaseClient(“WSDualHttpBinding_IClase”))
     {
        Console.WriteLine(proxy.Funcion1());
        Console.WriteLine(proxy.Funcion2().ToString());
        Console.WriteLine("Pulse cualquier tecla para salir...");
        Console.ReadKey();
        proxy.Close();
     }
   }
}


Ya lo tenemos todo listo, vamos a probarlo, para ello tenemos que ejecutar los dos proyectos al mismo tiempo, por lo que en las propiedades de la solución hay que establecer Proyectos de inicio múltiples y establecer la acción de ambos proyectos a Iniciar, y ejecutar (F5).

Por supuesto que WCF es mucho más complejo, pero como toma de contacto creo que está bien, en próximos post entraremos en profundidad en más características.


Así de rupestre como se ve, Saludos

Inspirado por Programando en .Net

Usando Mono con WebMatrix y ASP.Net MVC3

Bueno SQLeros, como ven el titulo del post vamos a hacer un pequeño ejercicio con WebMatrix, ASP.Net MVC3 y Mono. Usando un servidor ubuntu corriendo apache junto con mono 2.10. Para servir las páginas .cshtml, no perdamos tiempo y empezemos, lo primero que tenemos que hacer es crear un nuevo proyecto en WebMatrix como podemos observar en la imagen:



1. Seleccionamos la opción sitio a partir de plantilla




2. Seleccionamos la plantilla, sitio vació le escribimos un nombre y damos clic en aceptar.



3. Ya que nos presente la interfaz principal en la sección Archivos, damos clic derecho sobre la carpeta y seleccionamos la opción del menú desplegable Nuevo archivo...



4. Seleccionamos el tipo de archivo CSHTML, que es que nos interesa para este caso... :), hasta ahora muy fácil


5. En la linea número 2 vamos a agregar cierta lógica, es decir, lo que va a hacer nuestra página.

@{
    string frase = "";
    if(IsPost){
        frase = Request["frase"];
        frase = frase.Replace("a","afa").Replace("e","efe").Replace("i","ifi").Replace("o","ofo").Replace("u","ufu");
    }
}
6. ahora en la linea número 9 agregaremos un formulario, un fieldset, una label y dos inputs. Quedando el código html de la siguiente manera.
<form method="post">
    <fieldset>
        <label for="frase">Escribe una frase para traducirla a lenguaje F</label>
        <input type="text" id="frase" name="frase"/>
        <input type="submit" value="Enviar">
    </fieldset>
</form>
7. después de copiar el código agregaremos, las siguientes lineas de código de servidor, esto para terminar la lógica de la página.
8. ahora damos clic en ejecutar y vemos que efectivamente la aplicación corre sobre windows.

9. Llenamos el campo de texto, damos clic en enviar y lo que resulta es el procesamiento del texto. 
10. Para este caso funciona perfectamente, ahora vamos a hacer que funcione para GNU/Linux usando mono. =) ahora antes de configurar WebMatrix para usar un FTP y guardar los archivos en el servidor GNU/Linux. Necesitamos:
  • Instalar Mono 2.10 (Este enlace muestra una forma de instalación menos dolorosa, si pudiera dar un adjetivo diría huevona)
  • Instalar Apache y configurarlo para usarlo con mono... =)
Ya con estas herramientas configuradas y andando, configuraremos WebMatrix...
11. Ahora en la aplicación damos clic en publicar/configuración nos lanzara una pantalla similar a esta.
Donde configuramos los datos del FTP, para mi caso selecciono la opción FTP y lleno los datos que me pide.
Ingresamos los datos y validamos la configuración para ver si es correcta.
Como pueden apreciar no tengo archivos para esta carpeta que esta configurada en el FTP, aqui es donde WebMatrix pondrá los archivos para trabajar.
Cuando termina de checar los las configuraciones me dice que archivos son los que se van a mover a la carpeta del FTP ahora, para fines de practicidad y tiempo le decimos que si a todos... =)
Vamos a verificar si la publicación se realizo de manera correcta, vamos a probar el sitio web en el servidor que tenemos en GNU/Linux. Entrando a la url con el navegador. Ahora cuando entro a la url que le he dado la cual es: http://rammstein/Page.cshtml, salta un cuadro de dialogo de guardar... es decir el servidor web encuentra la página pero no la puede procesar, con el mono... Que lastima hasta aqui todo era muy fácil, pero no se preocupen.
Lo que tenemos que hacer es simplemente borrar del directorio bin/ el ensamblado llamado: "Microsoft.Web.Infraestructure.dll" usando el comando rm.
ya borrado este ensamblado. Como podemos apreciar en la siguiente imagen.

Ahora lo que nos resta es es simplemente ir a la url donde esta nuestra página o aplicación web. Y listo!
Así de rupestre! Espero les sirva este ejemplo. Les dejo el código acá, y también quedo al pendiente de los comentarios. Saludos, SQLeros!


Usar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...


En el proyecto en el que me encuentro, tenemos desarrollada una librería .NET para obtener informes en Excel mediante la llamada a una BAPI de SAP. Esta librería trabaja con el objeto COM de Excel y al mismo tiempo es consumida desde ASP.NET, sí, ya se que Microsoft no recomienda el uso de componentes Office en aplicaciones ASP.NET, "COM Interop with Microsoft Office products from an ASP.NET web page. Excel was not designed to be used inthis way" pero esto es un caso de fuerza mayor y no hay mas narices, puesto que son informes bastantes complejos que no basta con utilizar un DataGrid y rendereizar su contenido y lanzar una salida con Response.Write y poner el Response.ContentType = "application/vnd.ms-excel, como tantos ejemplos hay por ahí.
El problema con el que me he encontrado es el siguiente:
Todas las pruebas realizadas han funcionado a la perfección en las máquinas de desarrollo (Eso de ser Administrador de máquina...) pero... cuando lo he montado en el servidor de pruebas y he hecho la primera petición de un informe me he encontrado con esto:
Acceso Denegado
Juer, pues si que empezamos bien. La primera conclusión es evidente: Falta de Permisos, así que le he arrancado el Debugger de mi máquina y le he pedido a mi compañero que hiciera una petición de informe para ver donde casca:
ApplicationClass objExcel = new ApplicationClass();
Le he dado permisos de Administrador a mi compañero en mi máquina, ha vuelto a ejecutar la petición y ¡Vualá! todo funciona, porque estas llamadas a objetos COM necesitan para ejecución local/remota unos privilegios mínimos.
La configuración del sitio web tiene el acceso anónimo deshabilitado y la autenticación windows integrada (Estamos en una intranet) y en el Web.Config impersonate a true con autenticación Windows.
Soluciones que no piensas:
  • Dar permisos de Adminsitrador a la cuenta MACHINE\ASPNET
ESTO NI SE TE OCURRA
  • Impersonar el hilo de ejecución de la aplicación con un usuario Adminsitrador
La gente de sistemas nunca te lo dará y además no me parece una buena solución puesto que vulnera muchos principios de seguridad como en el primer caso.
  • Hacer una impersonación sólo cuando generas el Informe con una cuenta de usuario que sea Adminsitrador 
La gente de sistemas nunca te lo dará
Bueno, pues visto que esto va a ser que no, de repente, cacharreando con los Servicios de Componentes encuentro una cosita que se llamaConfiguración DCOM (Distributted Component Object Model) y al expandirlo me encuanto con esto:
Síííííí!!!! Aplicación Microsoft Excel, esto pinta bien y además tiene propiedades, así que pinchamos:
Juer y encima tiene una pestaña de Seguridad
Así que marcamos el check Personalizar de los Permisos de inicio y activación y pulsamos el botón Modificar para dar permisos al Usuario/Grupo que desamos:
Aceptamos todo y con esto hemos resuelto el maldito error. En mi caso hemos dados permisos a un Grupo que contiene a los usuarios que acceden a la aplicación. (Aunque la imagen corresponde al equipo mio de casa ;))
Por último y por cuestiones de performance en nuestra aplicación es necesario liberar todos los objetos COM que utilicemos, para que no se queden esos malditos procesos llamados EXCEL (Os lo digo por experiencia propia), que aperecen a porrillo en el Administrador de Tareas, y para ello os dejo este enlace del Support de Microsoft:
Con la solución que propone conseguí eliminar eso malditos procesos que parecían desaparecer con el oApp.Quit(); oApp = null; pero que en realidad no desaparecían y se estaban acumulando llevandose 36 Mb de memoria cada uno.
Bueno pues espero que os sirva y que no tengáis que romperos tanto el coco y os encontréis tantos probelmas como me he encontrado yo.

Menú para “Todos los usuarios” en Windows Vista, Windows 7 Windows 2008 y demás ediciones superiores


En las ediciones de Windows si queríamos agregar un elemento al Menú Inicio para todos los usuarios se podía ir al menú contextual del menú Inicio de Windows tal como se muestra en la imagen. Sin embargo en la ediciones de Windows Vista, Windows 7 Windows 2008 y demás ediciones superiores ese menú ha desaparecido.
Menú todos los usuarios Windows
El lugar donde ahora se encuentra la carpeta del Menú para todos los usuarios está en C:\ProgramData\Microsoft\Windows\Start Menu (Típicamente C: o la unidad donde esté instalado el sistema operativo). Aquí se pueden crear todos los accesos directos que se necesiten y estarán habilitados para todos los usuarios. Se puede ir directamente a esta carpeta, pero está oculta por defecto, así que sería necesario seleccionar la opción “Mostrar archivos, carpetas y unidades ocultos” de “Opciones de Carpeta y búsqueda” del menú organizar en el explorador de Windows.
Si se trata de acceder directamente a la carpeta “C:\Users\All Users\Start Menu”, se mostrará un mensaje de acceso denegado, porque a pesar del nombre, no es el lugar que se debería usar de todas formas. Para eso se usa la carpetaC:\ProgramData\Microsoft\Windows\Start Menu.

Crear un Site FTP en Windows 2008 R2

Esta guía os mostrará como en unos sencillos pasos podemos tener nuestro site FTP para compartir archivos dentro y fuera de nuestra red.
Lo primero que tenemos que hacer es añadir el ROL Ftp, lo podemos realizar a través de Server Manager.


Añadiremos un nuevo Rol FTP Server.


Una vez añadido el Rol nos aseguraremos que los servicios están activos.


El siguiente paso será instalar la consola de administración de nuestro IIS para poder administrar nuestro site FTP, para añadir la consola nos iremos a Server Manager y añadiremos el siguiente Rol :
Management Tools, IIS Management Console y Management Service.


Una vez instalada la consola ya podemos empezar a gestionar nuestro FTP

Desde esta página podremos configurar todos los detalles de nuestro Ftp como la Autentificación, podemos configurar la autentificación anónima o la básica, en este caso utilizaremos la anónima.

Podemos configurar los log de conexión, tamaño, directorio donde queremos que se guarden, codificación, etc.



Podemos configurar un saludo de bienvenida.


Restriciones de acceso, tanto por rangos Ip's como por dominios.


El siguiente paso será configurar nuestro Site Ftp, en primer lugar le daremos un nombre a nuestro Ftp y una ubicación, podemos ubicarla donde queramos.
Podemos realizarlo de dos maneras:
Desde Defaul Web Site



Tambien podemos crear un Site nuevo 


Tendremos que decidir la forma de acceso, puede ser por ip, por nombre de dominio. También podremos configurar la conexión SSL a través de un certificado.


En la siguiente pantalla tendremos que elegir los permisos y la forma de acceso que le vamos a dar a los usuarios que se conecten a nuestro Ftp


Con esto ya tendríamos configurado un acceso Ftp básico al cual podemos acceder por nuestro navegador.


Si os fijáis nos comenta el navegador si queremos ver el contenido del directorio, tendremos que ir a la pestaña page de nuestro navegador y seleccionar Open FTP Site in Windows Explorer

Y nos aparecerán los archivos o directorios que compartiremos en nuestro Site.


Espero que esta primera presentación pueda ser de ayuda.
Ahora os toca jugar a vosotros ;-)