Adrian Hands, el impresionante ejemplo de un programador que usaba el Morse para escribir código


Adrian Hands usando su dispositivo de escritura de código mediante MorseAdrian Hands usando su dispositivo de escritura de código mediante Morse

Para muchos, colaborar con el Software Libre es un gesto de altruismo: dedicas tu tiempo libre a realizar un trabajo no remunerado y probablemente nada sencillo sólo para que otros puedan disfrutar de nuevas funcionalidades en su PC o en su móvil. Vía Espacio Linux he conocido la historia de un programador que llevó más allá el concepto de altruismo.
Adrian Hands era un programador y aficionado al ciclismo estadounidense, al que en 2005 le diagnosticaron Esclerosis Lateral Amiotrófica (ELA, enfermedad de Lou Gehrig o mal de Charcot), unaenfermedad neurodegenerativa muy agresiva que va paralizando progresivamente los músculos hasta producir la muerte. A pesar de ello, Adrian siguió pedaleando, ya con una bicicleta reclinable, hasta 2007, y colaboró con el Software Libre hasta cuatro días antes de morir, el 3 de febrero de 2010.
Lo más increíble es cómo se las tuvo que arreglar para programar tras haber perdido la fuerza en los brazos por culpa de la ELA. Mediante un dispositivo llamado Darci USB (en honor a Darci, una niña sin manos para la que se construyó en primera instancia), Adrian consiguió comunicarse con su ordenador y dictarle en Morse el código que quería programar.
Darci USB, el dispositivo utilizado por AdrianDarci USB, el dispositivo utilizado por Adrian

No fue una tarea fácil en absoluto: además de regular la sensibilidad y la posición del mando para que Adrian pudiese utilizarlo correctamente, cuando la parálisis aumentó y no tenía fuerza suficiente para usar sus brazos, su hijo Ian le construyó una caja con interruptores para poder usarlo con sus piernas.
Así, el 30 de enero de 2010, Adrian consiguió enviar un interesante parche para Gnome, que permitía copiar al portapapeles bien una imagen o bien su ruta desde el menú contextual:
Created an attachment (id=177268) mod to add 2 new menu items: copy image (to clipboard) and copy path. added both to both the Edit menu and the right-click menu.
El parche fue aceptado y cinco días más tarde su hijo Ian escribió en el hilo del parche para agradecer la acogida a la comunidad de Gnome y para informarles de que su padre acababa de fallecer en India, donde recibía tratamiento para paliar la ELA.
Además, Ian compartió con la comunidad la foto de su padre programando que preside este artículo, y el último e-mail que le envió para compartir con su hijo la alegría por haber podido colaborar:
> ACCEPTed
> COMMITed
> RESOLVEd
> BOO-YAH!
>
> commit 0b209b1ff16e863e60a1d86413aa57c5fbde76b0
> Author: Adrian Hands 
> Date:   Fri Dec 31 14:34:58 2010 +0100
>
>    Add Copy Image and Copy Path to clipboard functionality
>
>    Fixes bug 78514.
>
>  data/eog-ui.xml  |    9 +++++++
>  src/eog-window.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 72 insertions(+), 0 deletions(-)
El esfuerzo de Adrian Hands fue una prueba infalible de que lo que a veces puede parecernos una tontería, para otros supone un mundo; y que en lugar de menospreciar el Software Libre por no tener tal o cual funcionalidad, deberíamos agradecer a la gente que ha dedicado su tiempo para desarrollar todas las funcionalidades que sí que tiene.
Así, en la edición de 2010 de los Free Software Awards, Richard Stallman y el resto de la FSF hicieron un reconocimiento a la labor de Hands, por su dedicación en servicio de la comunidad incluso en las más difíciles circunstancias. Reconocimiento que desde SQLeros queremos secundar para difundir la historia de este entusiasta de la programación y de la vida.
Vía | Espacio Linux
Blog de Adrian Hands | blog.ahands.org
Última colaboración de Adrian para Gnome | bugzilla.gnome.org
Dispositivo Morse utilizado | Darci USB
Imagen principal | Álbum de Adrian Hands en Picassa

Ejemplo Oracle Entity Framework

En este post podremos ver un ejemplo practico de como funciona Entity Framework con Oracle, los objetivos a tratar serán:
  1. Crear un store Procedure en Oracle
  2. Configurar el Entity Framework
  3. Consumir una tabla de Oracle
  4. Consumir un store procedure de Oracle

Antes que nada debemos instalar el cliente de Oracle y las herramientas ODAC el cual podemos descargar del siguiente link:
http://www.oracle.com/technetwork/topics/dotnet/downloads/index.html


1.) En este paso vamos  crear las tablas con la que realizaremos el ejemplo , en este link podrán encontrar los script necesarios:
http://www.cjorellana.net/p/scriptoracle.html


2.) Crear un proyecto en Visual Studio .Net
    3.1) Archivo - Create web site






4.) Configurando Entity Framework
         4.1) Clic derecho sobre el solución explorer - add new item


         4.2) Seleccione Entity framework y deje el nombre predeterminado.


         4.3) El la primera pantalla del asistente debe seleccione "Generate from database"

         4.4) Presioné clic en el botón new Connection y configure su conexión a oracle.




         4.3) Ahora mostrara la pantalla seleccione la conexión que acaba de configurar, seleccione "yes" en incluir password.


         4.3) Ahora mostrara la pantalla para que seleccione los objetos a utilizar, seleccione la tabla Products y por ultimo presión clic en finish.
5.) Abra la pagina Default que fue creada automáticamente y agregue un Gridview y botón.



<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

        <asp:Button ID="Button1" runat="server" Text="Button" /> 
        <asp:GridView ID="GridView1" runat="server"> 
        </asp:GridView> 
     
    </div> 
    </form> 
</body> 
</html> 





6.) Ahora realizaremos una consulta a la base de datos, presioné doble clic en el botón que acaba de crear.

protected void Button1_Click(object sender, EventArgs e)
    { 
        Model.Entitiesdbo db = new Model.Entitiesdbo(); 
        var query = from p in db.PRODUCTS 
                    select new { p.PRODUCTID, p.PRODUCTNAME, p.UNITPRICE };

        GridView1.DataSource = query; 
        GridView1.DataBind(); 
    }


El resultado sera:




Ahora vamos hacer la consulta por medio de un Store Procedure que retorne un conjunto de datos.


El primer paso es crear el store procedure:


7.) Como ustedes ya sabes, los store procedure en oracle son muy rápidos, por lo que es un importante utilizar un  Store procedure que obtenga una conjunto de resultados. en este paso vamos crear un store procedure:

7.1.) Vamos a crear un Store Procedure que retorne un conjunto de datos, abra cualquier cliente oracle y ejecute lo siguiente.

CREATE OR replace PROCEDURE ObtenerCat(tabla OUT SYS_REFCURSOR)
IS
BEGIN
  OPEN tabla FOR
    SELECT categoryid,
           categoryname,
           description
    FROM   dbo.categories;
END;

/ 

7.1) Ahora tenemos que configurar nuestro web Config para que entity framework pueda crear su tabla, esta es la parte fea de este cliente oracle ya que tenemos que configurar como se llama el store procedure y cada valor que retorne con su respectivo tipo de datos, 


7.1.1) Abra su web config y agregue esto.


<oracle.dataaccess.client> 
    <settings> 
      <add name="DBO.obtenercat.RefCursor.tabla" value="implicitRefCursor bindinfo='mode=Output'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.0" value="implicitRefCursor metadata='ColumnName=CATEGORYID;BaseColumnName=CATEGORYID;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=NUMBER;ProviderType=decimal'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.1" value="implicitRefCursor metadata='ColumnName=CATEGORYNAME;BaseColumnName=CATEGORYNAME;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" /> 
      <add name="DBO.obtenercat.RefCursorMetaData.tabla.Column.2" value="implicitRefCursor metadata='ColumnName=DESCRIPTION;BaseColumnName=DESCRIPTION;BaseSchemaName=DBO;BaseTableName=categories;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />       
    </settings> 
  </oracle.dataaccess.client>






8.) Abramos en Model del entity Framework para llamar a nuestro store procedure
8.1) Precie clic derecho "update Model from DataBase"




9.) En la pantalla el asistente, bajo Store Procedure seleccione el store procedure




10.) Tenemos que crear una función para poder usar el store procedure.
       10.1) Presione clic derecho sobre Model y Add y por ultimo "Funtion Import..." llene con la siguiente información.




       10.2) En la pantalla de importación, podrá notar que no hay ningún Complex, presione clic "Get Column Information"  para que genere la información con los datos del Store Procedure, luego precione Crete New Complex Type, por ultimo OK.








11.) Ahora vamos Agregar a nuestra pagina un Dropdown List para jugar con nuestro store procedure, este de debe agregar antes del Boton.


<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"> 
        </asp:DropDownList> 
        <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> 
        <asp:GridView ID="GridView1" runat="server"> 
        </asp:GridView> 
     
    </div> 
    </form> 
</body> 
</html> 
12.a) Llenaremos nuestro dropdown list en el load de la pagina, precione clic derecho view code y agregue el siguiente código:
 protected void Page_Load(object sender, EventArgs e)
    { 
        if (!Page.IsPostBack) 
        { 
            Model.Entitiesdbo db = new Model.Entitiesdbo(); 
            var query = db.OBTENERCAT(); 
            DropDownList1.DataSource = query; 
            DropDownList1.DataTextField = "CATEGORYNAME"; 
            DropDownList1.DataValueField = "CATEGORYID"; 
            DropDownList1.DataBind(); 
        } 
    } 


13.) Por ultimo vamos a cambiar el código de nuestro botón para el gridview1 se filtre en base al drowdownlist.
 protected void Button1_Click(object sender, EventArgs e)
    { 
        Model.Entitiesdbo db = new Model.Entitiesdbo(); 

        decimal codigo = Convert.ToDecimal(DropDownList1.SelectedValue);
        var query = from p in db.PRODUCTS 
                    where p.CATEGORYID== codigo 
                    select new { p.PRODUCTID, p.PRODUCTNAME, p.UNITPRICE };

        GridView1.DataSource = query; 
        GridView1.DataBind(); 
    }


EL RESULTADO FINAL SERA ASI: