<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Binamedia.Net</title>
	<atom:link href="https://www.binamedia.net/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.binamedia.net</link>
	<description>Desarrollo en .Net</description>
	<lastBuildDate>Tue, 11 Jul 2023 23:56:55 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.6</generator>
	<item>
		<title>Instalando .Net Core 2.0 en Linux</title>
		<link>https://www.binamedia.net/2020/01/instalando-net-core-2-0-en-linux/</link>
					<comments>https://www.binamedia.net/2020/01/instalando-net-core-2-0-en-linux/#respond</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Tue, 21 Jan 2020 17:34:35 +0000</pubDate>
				<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[dotnetcore]]></category>
		<category><![CDATA[featured]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=667</guid>

					<description><![CDATA[Instalando .Net Core 2.0 en Linux]]></description>
										<content:encoded><![CDATA[
<p>Un video rapido en el que explico como instalar .Net Core 2.0 sobre Ubuntu.</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Como instalar .Net Core 2.1 en Linux" width="860" height="484" src="https://www.youtube.com/embed/SSiOcdW299Y?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2020/01/instalando-net-core-2-0-en-linux/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Delegados en C#: Expresiones Lambda</title>
		<link>https://www.binamedia.net/2018/05/delegados-en-csharp-expresiones-lambda/</link>
					<comments>https://www.binamedia.net/2018/05/delegados-en-csharp-expresiones-lambda/#respond</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Mon, 07 May 2018 16:35:00 +0000</pubDate>
				<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[delegados]]></category>
		<category><![CDATA[delegates]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[lambda]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=608</guid>

					<description><![CDATA[Esta es la ultima parte de esta serie veremos las ya muy conocidas Expresiones Lambda. Definición Una expresion lambda es: Una función anónima que se [...]]]></description>
										<content:encoded><![CDATA[<p>Esta es la ultima parte de esta serie veremos las ya muy conocidas <strong>Expresiones Lambda</strong>.</p>
<h2 id="definición"><a href="#definición" name="definición"></a>Definición</h2>
<p>Una <strong>expresion lambda</strong> es:</p>
<pre>Una función anónima que se usa para crear delegados.
</pre>
<p>Esto es importante resaltarlo ya que mucha gente desconoce la relación entre un delegado y una expresión lambda.</p>
<p>Su estructura es:</p>
<pre class="class:csharp">Parametros =&gt; Implementación
</pre>
<ul>
<li>Donde <strong>=&gt;</strong> es el símbolo lambda.</li>
</ul>
<h2 id="ejemplo"><a href="#ejemplo" name="ejemplo"></a>Ejemplo</h2>
<p>Tomemos nuestro ejemplo de <strong>Funcion Anónima</strong> usado en el <a href="/2016/02/delegados-en-c-funciones-anonimas/">post</a> del mismo nombre:</p>
<pre class="class:csharp">Add = delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };
</pre>
<p>Este seria reescrito como:</p>
<pre class="class:csharp">Add = (float elNumeroA, float elNumeroB) =&gt; elNumeroA + elNumeroB;
</pre>
<p>Donde <strong>float elNumeroA</strong> y <strong>float elNumeroB</strong> serÃ­an los parámetros de entrada y <strong>elNumeroA + elNumeroB</strong> serÃ­an nuestra implementación.</p>
<p>Algo que debemos tener presente con estas expresiones es que el <strong>TipoDeValorDevuelto</strong> se infiere o “adivina” dependiendo de la forma en que se escribe.</p>
<p>En este caso los tipos son <strong>float + float = float</strong> por lo que <strong>Add</strong> tendrá la firma <strong>&lt; float,float,float &gt;</strong>. (Recuerden leer el <a href="http://www.binamedia.net/2015/07/delegados-en-c-limpia-encera-limpia-encera/">post inicial de delegados</a> para ver lo que son las firmas)</p>
<h2 id="más-ejemplos"><a href="#más-ejemplos" name="más-ejemplos"></a>Más ejemplos</h2>
<p>Comencemos con un ejemplo usando una funcion anónima.</p>
<pre class="class:csharp">public class Algo
{
    // Definimos un tipo suma
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion mediante una funcion anonima
        Add = delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };
        //La usamos
        double res = Add(3.0f,5.0f)
    }
}
</pre>
<p>Reemplacemos el delegado con una expresión lambda.</p>
<pre class="class:csharp">public class Algo
{
    // Definimos un tipo suma
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Usamos la expresion lambda.
        Add = (float elNumeroA, float elNumeroB =&gt; elNumeroA + elNumeroB;
        //La usamos
        double res = Add(3.0f,5.0f)
    }
}
</pre>
<p>Ahora usemos el <strong>tipo Generico Func</strong> recordando que la firma de suma es &lt; float, float, float &gt;</p>
<pre class="class:csharp">public class Algo
{
    // Borramos el tipo

    public Algo(){
        // Creamos variable del tipo generico
        //TipoDeVariable         NombreDeVariable
        Func&lt;float,float,float&gt;        Add;
        //Usamos la expresion lambda.
        Add = (float elNumeroA, float elNumeroB) =&gt; elNumeroA + elNumeroB;
        //La usamos
        double res = Add(3.0f,5.0f)
    }
}
</pre>
<p><strong>Importante:</strong> si la firma de la expresion lambda no coincide con la firma esperada tendremos errores a la hora de compilar.</p>
<h2 id="delegados-como-parámetros"><a href="#delegados-como-parámetros" name="delegados-como-parámetros"></a>Delegados como parámetros</h2>
<p>En el siguiente ejemplo vamos a crear una función que reciba como parametros un delegado que tendra la implementacion de una operación matemática y dos numeros con los que se realizara la operación matemática.</p>
<pre class="class:csharp">public class Algo
{
    public double Ejecuta(Func&lt;float,float,float&gt; op, float numA, float numB){
        return op(numA, numB);
    }

    public Algo(){
        // Creamos variable del tipo generico
        //TipoDeVariable         NombreDeVariable
        Func&lt;float,float,float&gt;        Add;
        //Usamos la expresion lambda.
        Add = (float elNumeroA, float elNumeroB) =&gt; elNumeroA + elNumeroB;
        //La usamos
        double res = Ejecuta(Add, 3.0f, 5.0f);
    }
}
</pre>
<p>Y lo divertido es que podemos poner la expresion lambda directamente en la función <strong>Ejecuta</strong></p>
<pre class="class:csharp">public class Algo
{
    public double Ejecuta(Func&lt;float,float,float&gt; op, float numA, float numB){
        return op(numA, numB);
    }

    public Algo(){
        //La usamos
        double res = Ejecuta((elNumeroA, elNumeroB) =&gt; elNumeroA + elNumeroB, 3.0f, 5.0f);
    }
}
</pre>
<p>Como podrán ver escribimos la expresion lambda sin definir los tipos de los parametros, esto lo podemos hacer gracias a que el método <strong>Ejecuta</strong> ya define la firma del delegado por lo que el compilador infiere los tipos y valida que sean los correctos, si nosotros cambiaramos el <strong>3.0f</strong> o el <strong>5.0f</strong> por una cadena de texto el compilador marcaria un error.</p>
<p>Otro punto que se ve claramente es que ahora tenemos todo en una sola linea de código, el uso de lambdas nos ayuda a tener expresiones mas poderosas que optimizan el código.</p>
<h2 id="expresiones-lambda-sin-parametros"><a href="#expresiones-lambda-sin-parametros" name="expresiones-lambda-sin-parametros"></a>Expresiones Lambda sin parametros</h2>
<p>Para este caso se debe de seguir esta sintaxis:</p>
<pre class="class:csharp">() =&gt; Implementación
</pre>
<p>El paréntesis a la izquierda es solo para indicar que nuestro delegado no tendrá parametros. Un ejemplo práctico seria:</p>
<pre class="class:csharp">() =&gt; (3 * 6) - 10 ;
</pre>
<p>Este delegado es un método que regresa un 8 siempre.</p>
<h2 id="expresiones-lambda-con-bloques-de-código"><a href="#expresiones-lambda-con-bloques-de-código" name="expresiones-lambda-con-bloques-de-código"></a>Expresiones Lambda con bloques de código</h2>
<p>A veces necesitamos que la implementación de nuestro delegado sea algo mas complejo que una simple suma. Para esos casos podemos utilizar un bloque de codigo delimitado por un <strong>contexto</strong>.</p>
<p>Un <strong>contexto</strong> es definido por dos llaves, una que abre “<strong>{</strong>“ y otra que cierra “<strong>}</strong>“. Las usamos en todas partes y nos sirven para delimitar bloques.</p>
<p>En el caso de las expresiones lambda los <strong>contextos</strong> se usan para crear algo asi:</p>
<pre>(int numA, int numB, int numC) =&gt; { 
        int x = numA + numB; 
        return x / numC; 
}
</pre>
<p>Podemos notar que ya se usan los “<strong>;</strong>“ para separar las lÃ­neas y la palabra <strong>return</strong> para enviar el valor de retorno, esto es por que al agregar las llaves la implementacion se escribe como lo hariamos con cualquier método siguiendo las mismas reglas.</p>
<h2 id="notas-finales"><a href="#notas-finales" name="notas-finales"></a>Notas finales</h2>
<p>Lo mas recomendable es usar las lambdas para generar funciones anónimas y los tipos genericos Action y Func en caso que necesitemos usarlos como parametros.</p>
<p>Espero que estos posts ayuden a comprender mejor el uso y evolución de los delegados en la plataforma.net</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2018/05/delegados-en-csharp-expresiones-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Delegados en C#: Generics para delegados</title>
		<link>https://www.binamedia.net/2017/03/delegados-en-csharp-generics-para-delegados/</link>
					<comments>https://www.binamedia.net/2017/03/delegados-en-csharp-generics-para-delegados/#comments</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Mon, 27 Mar 2017 13:30:17 +0000</pubDate>
				<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[bases]]></category>
		<category><![CDATA[basics]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[delegados]]></category>
		<category><![CDATA[delegates]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[generics]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=568</guid>

					<description><![CDATA[En el post anterior descubrimos las funciones anónimas y como crear delegados para poder guardar su referencia y utilizarlas. Ahora vamos a utilizar un par [...]]]></description>
										<content:encoded><![CDATA[<p>En el post anterior descubrimos las <strong>funciones anónimas</strong> y como crear <strong>delegados</strong> para poder guardar su referencia y utilizarlas.</p>
<p>Ahora vamos a utilizar un par de tipos que nos facilitarán la vida.</p>
<p>Ya sabemos que un delegado lo podemos crear asÃ­:</p>
<pre class="decode:1 ">// Definimos el nuevo tipo
delegate double Suma ( float numeroA, float numeroB );

</pre>
<p>Pero resulta tedioso el estar creando delegados una y otra cuando tenemos muchas funciones con muchas diferentes firmas, por eso el .Net Framework tiene dos tipos de datos maravillosos que nos ayudaran a evitar realizar esa tarea.</p>
<h2>Action&lt;&gt; y Func&lt;&gt;</h2>
<p>Son dos tipos de datos <em>Genericos</em> dentro del namespace <strong>System.Collection.Generics</strong> que pueden almacenar funciones.</p>
<h3>Action &lt; T &gt;</h3>
<p>Este tipo puede guardar funciones que no regresen valores, por ejemplo tenemos esta función:</p>
<pre class="decode:1 ">void Operacion(string dato){
    Console.WriteLine(dato);
}
</pre>
<p>ahora la vamos a guardar en un tipo genérico <strong>Action</strong> de la siguiente forma</p>
<pre class="decode:1 ">Action&lt;string&gt; GuardarOperacion;

GuardarOperacion = Operacion;
</pre>
<p>Es importante remarcar que <strong>Action</strong> puede tener uno o mas tipos de datos declarados en su definición ( <strong>Action &lt; Tipo1, Tipo2, Tipo3, TipoEtc &gt;</strong> ) y deben de coincidir con los de la funcion por ejemplo:</p>
<pre class="decode:1 ">// Tenemos tres tipos en la firma del metodo
void OperacionMultiple(string data, int A, float B){
    // Hace algo ...
}

public static void Main(){
    // Creamos un Action con los tres tipos
    Action&lt;string,int,float&gt; GuardaOperacionMultiple;

    // Como la firma coincide podemos hacer operaciones
    GuardaOperacionMultiple = OperacionMultiple;
}
</pre>
<p>En este ejemplo vimos como un metodo con tres parametros de entrada con diferentes tipos puede ser referenciado por una variable de tipo Action con la misma firma.</p>
<p>¿Y qué sucede si necesito que mi funcion regrese un valor?</p>
<h3>Func &lt; T, TResult &gt;</h3>
<p>En ese caso utilizamos Func, tomemos el clásico ejemplo de la suma:</p>
<pre class="decode:1 ">float Suma(int a, int b){
    return a + b;
}
</pre>
<p>Esta función puede ser guardada en una variable de la siguiente manera:</p>
<pre class="decode:1 ">Func&lt;int,int,float&gt; GuardaSuma;

GuardaSuma = Suma;
</pre>
<p><strong>Nota:</strong> Es importante remarcar que el Ãºltimo tipo declarado en Func es el tipo del valor de retorno.</p>
<p>Otra punto a considerar es cuando tenemos una función que no recibe parametros y regresa un valor como:</p>
<pre class="decode:1 ">int Dato(){
    return 300;
}
</pre>
<p>En este caso nuestro genérico Func deberá ser declarado asi:</p>
<pre class="decode:1 ">Func&lt;int&gt; GuardaDato;

GuardaDato = Dato;
</pre>
<h2>Entran las funciones anónimas</h2>
<p>Conociendo Action y Func ahora podemos darnos vuelo con los delegados de una forma mas limpia, la primer idea que viene a mi mente es una serie de Fibonacci.</p>
<pre class="decode:1 ">using System;

public class Program
{
    public static void Main()
    {
        // Declaramos el Generic
        Func&lt;int,int,int&gt; Fibo = null;

        // Le asignamos la implementacion
        Fibo = delegate (int a, int b){
            Console.WriteLine(a);
            if (a &gt;= 144){
                return a;
            } else {
                // Nos volvemos locos y hacemos recursiidad.
                return Fibo(a + b, a);
            }
        };

        // Iniciamos la ejecucion.
        Fibo(0,1);
    }
}
</pre>
<p>En este pequeÃ±o ejemplo de Fibonacci creamos un <strong>Func</strong> y después le asignamos mediante un delegado la implementación y dentro de la misma implementacion hacemos que se mande llamar a si mismo.</p>
<p>Al final solo necesitamos iniciar el ciclo recursivo llamando <strong>Func</strong>.</p>
<p>En el siguiente post veremos que es una expresión lambda y como se usa en frameworks como LinQ.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2017/03/delegados-en-csharp-generics-para-delegados/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Delegados en C#: Funciones Anonimas</title>
		<link>https://www.binamedia.net/2016/02/delegados-en-csharp-funciones-anonimas/</link>
					<comments>https://www.binamedia.net/2016/02/delegados-en-csharp-funciones-anonimas/#comments</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Wed, 17 Feb 2016 16:59:14 +0000</pubDate>
				<category><![CDATA[CSharp]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[delegados]]></category>
		<category><![CDATA[delegates]]></category>
		<category><![CDATA[funciones anonimas]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=559</guid>

					<description><![CDATA[En el post anterior hablamos de los delegados, de la firma de una funcion y de como usarlos. Ahora veremos el concepto de funciones anonimas [...]]]></description>
										<content:encoded><![CDATA[<p>En el post <a href="http://www.binamedia.net/2015/07/delegados-en-c-limpia-encera-limpia-encera/">anterior</a> hablamos de los <strong>delegados</strong>, de la <strong>firma</strong> de una funcion y de como usarlos.</p>
<p>Ahora veremos el concepto de <strong>funciones anonimas</strong></p>
<h2>Funciones con nombre</h2>
<p>La vez anterior nos quedamos con el siguiente codigo:</p>
<pre class="class:csharp">public class Algo
{
    // Definimos el nuevo tipo
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion 
        Add = ImplementacionDeLaSuma;
        //La usamos
        double res = Add(3.0f,5.0f)
    }

    double ImplementacionDeLaSuma ( float elNumeroA, float elNumeroB ){
        return elNumeroA + elNumeroB;
    }
}
</pre>
<p>En este ejemplo creamos un delegado llamado <strong>Suma</strong> y con ese delegado creamos una &#8220;variable&#8221; llamada <strong>Add</strong>.<br />
Para poder utilizar nuestra variable <strong>Add</strong> le asignamos la funcion <strong>ImplementacionDeLaSuma</strong>, va a parecer redundante pero <strong>ImplementacionDeLaSuma</strong> es el nombre de una funcion, mediante ese nombre podemos hacer referencia a ella ya sea para mandarla llamar como funcion <em>ImplementacionDeLaSuma()</em> o utilizarla como &#8220;variable&#8221; y pasar la referencia de su implementacion a otra &#8220;variable&#8221; que tenga la misma <strong>firma</strong>.</p>
<p>Como vimos en el post anterior, el delegado y la función ImplementacionDeLaSuma comparten la misma <strong>firma</strong> lo que hace posible la igualacion (redundo por que es importante).</p>
<p>¿Y si pudieramos asignar la pura implementacion sin tener que crear una nueva función?</p>
<p>Eso es posible usando <strong>delegate</strong> de la siguiente forma:</p>
<p>delegate(<em>parametros</em>) { <em>implementacion</em> };</p>
<p><strong>Los parametros:</strong> Que como en cualquier función son las variables con las que vamos a trabajar.<br />
<strong>La implementacion:</strong> Es donde vamos a implementar, escribir, poner, el codigo a ejecutar.</p>
<p>Un ejemplo rápido seria el reescribir la funcion <strong>ImplementacionDeLaSuma</strong> con esta sintaxis de delegado, el resultado seria el siguiente.</p>
<pre class="class:csharp">delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };
</pre>
<p>Como veran en vez de darle un nombre a la funcion utilizamos la palabra reservada delegate como &#8220;nombre&#8221; de la funcion, y despues solo lo asignamos a nuestro delegado <strong>Add</strong>. A esto se le conoce como una.</p>
<h2>Funcion Anonima</h2>
<p>Una funcion anonima consiste en la pura implementacion sin un nombre con el cual se pueda hacer referencia a ella, es por eso que se asigna a una variable de tipo <strong>delegate</strong> para poder guardarla y utilizarla como vemos en el siguiente ejemplo.</p>
<pre class="class:csharp">Add = delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };
</pre>
<p>Esto hace cambiar nuestro ejemplo original y quedaria de la siguiente forma.</p>
<pre class="class:csharp">public class Algo
{
    // Definimos el nuevo tipo
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion mediante una funcion anonima
        Add = delegate(float elNumeroA, float elNumeroB) { return elNumeroA + elNumeroB };
        //La usamos
        double res = Add(3.0f,5.0f)
    }

    // ya no necesitamos el metodo ImplementacionDeLaSuma
}
</pre>
<p>Las funciones anónimas son bastante utiles y poderosas ya que nos permiten asignar implementaciones de una forma rápida y practica además de que es una caracteristica muy usada en Linq, Asyncronos y otras caracterÃ­sticas avanzadas de C#.</p>
<p>En el <a href="http://www.binamedia.net/2017/03/delegados-en-csharp-generics-para-delegados/">siguiente post</a> hablaremos de un par de tipos de dato <strong>generico</strong> que nos sera muy util manipular delegados y funciones anonimas.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2016/02/delegados-en-csharp-funciones-anonimas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Delegados en C#. Limpia, encera, limpia, encera.</title>
		<link>https://www.binamedia.net/2015/07/delegados-en-csharp-limpia-encera-limpia-encera/</link>
					<comments>https://www.binamedia.net/2015/07/delegados-en-csharp-limpia-encera-limpia-encera/#comments</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Mon, 13 Jul 2015 20:54:31 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=545</guid>

					<description><![CDATA[El delegado es uno de los tipos de dato mas incomprenidos de C# por lo que representan y por como se usan, he decidido aportar [...]]]></description>
										<content:encoded><![CDATA[<p>El delegado es uno de los tipos de dato mas incomprenidos de C# por lo que representan y por como se usan, he decidido aportar mi granito de arena al tema y explicar de la forma mas clara que pueda esta poderosa herramienta del lenguaje.</p>
<h2 id="¿que-es-un-delegado?"><a name="¿que-es-un-delegado?" href="#¿que-es-un-delegado?"></a>¿Que es un delegado?</h2>
<p>La respuesta mas sencilla para quien viene de C es</p>
<pre>Un delegado es un puntero a una función o método.
</pre>
<p>Una segunda definición ya basada en C# es</p>
<pre>Un Tipo de dato que hace referencia a una función o método.
</pre>
<p>Ambas definiciones son en escencia lo mismo pero vamos dividiendola en partes, tenemos dos elementos principales, el <strong>Tipo de dato</strong> y la <strong>Función o MÃ¨todo</strong>.</p>
<h3 id="función-o-mÃ¨todo"><a name="función-o-mÃ¨todo" href="#función-o-mÃ¨todo"></a>Función o MÃ¨todo</h3>
<p>Una función o método es un bloque de codigo que contiene una serie de sentencias, la hemos utilizado hasta el cansancio desde que aprendimos a programar y que es como esto:</p>
<pre class="class:csharp">double Suma(float numeroA, float numeroB){
    return numeroA + numeroB;
}
</pre>
<p>este método lo dividiria en dos partes, la <strong>declaración</strong> <mark>int Suma(int numeroA, int numeroB)</mark> y la <strong>implementación</strong> <mark>{ return numeroA + numeroB; }</mark>. En este momento lo que a nosotros nos importa es la declaración que se divide en tres partes:</p>
<p><strong>TipoDelValorDevuelto</strong><em>NombreDelMetodo</em> (<strong>Parametros</strong>);</p>
<p>Aqui voy a introducir un nuevo concepto llamado:<br />
Firma</p>
<p>La firma de un método es la combinación de los tipos de los parametros y el TipoDelValorDevuelto, en pocas palabras:</p>
<pre>Firma = Parametros + TipoDelValorDevuelto
</pre>
<p>Por ejemplo la firma de nuestro ejemplo anterior seria <mark>&lt; float, float, double &gt;</mark>. En casos donde la declaración sea:</p>
<pre class=" class:csharp" =""="">void HazAlgo(int numA, int numB);
</pre>
<p>La firma seria algo como <mark>&lt; int, int &gt;</mark> debido a que el <strong>TipoDeValorDevuelto</strong> es <mark>void</mark> y por lo tanto no hay.</p>
<p>La firma es <strong>bastante</strong> importante por que es la huella digital del método y es la caracteristica que hace compatible a un método con unos delegados e incompatible con otros.</p>
<h3 id=" tipo-de-dato" =""=""><a name="tipo-de-dato" href="#tipo-de-dato"></a>Tipo de dato</h3>
<p>Como ya sabemos, los tipos definen el tipo de dato que van a guardar las variables, tenemos tipos por valor como los son <mark>int, float, bool, byte</mark> y tipos por referencia como lo son la mayoria de las clases en .Net.</p>
<p>En .Net nosotros podemos definir nuevos tipos como usando <em>class</em> para crear clases, <em>enum</em> para crear enumeraciones, <em>struct</em> para estructuras entre otras; esto les sera muy familiar ya que despues de definir mediante estas palabras un nuevo tipo pueden crear una nueva variable, por ejemplo.</p>
<pre class="class:csharp">// Definimos el nuevo tipo
public class Prueba{
    public int Numero { get; set; }
}

public class Consumir{
    public Consumir(){
        // Creamos variable de tipo Prueba
        Prueba LaPrueba;
        // Le asignamos una instancia
        LaPrueba = new Prueba();
        // La usamos
        LaPrueba.Numero = 10;
    }
}
</pre>
<h2 id="volviendo-al-delegado"><a name="volviendo-al-delegado" href="#volviendo-al-delegado"></a>Volviendo al delegado</h2>
<p>Con los delegados pasa lo mismo como veremos a continuacion, tomemos la siguiente <strong>declaración</strong>:</p>
<pre class="csharp">delegate double Suma ( float numeroA, float numeroB );
</pre>
<p>Como podemos ver es muy parecido a lo que vimos anteriormente, las diferencias son dos, la primera es la palabra <strong>delegate</strong> al comienzo de la declaración y la segunda es el <strong>;</strong> al final lo que nos indica que no habra implementacion.</p>
<p>Lo que se ha hecho en este lugar es definir un nuevo <strong>Tipo</strong> para apuntar a métodos, cuyo nombre sera <strong>Suma</strong> y cuya firma sera <strong>&lt; float, float, double &gt;</strong> de acuerdo a las reglas que hemos estado viendo.</p>
<p>Esto me permite entonces crear una nueva variable usando el nuevo tipo de la siguiente forma:</p>
<pre class="class:csharp">public class Algo
{
    // Definimos el nuevo tipo
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
    }
}
</pre>
<p>Aqui podemos ver claramente que creamos una nueva variable de nombre <strong>Add</strong> del tipo <strong>Suma</strong>. Como es una variable por referencia, el valor de <mark>Add</mark> es <mark>null</mark> de la misma forma que cualquier otro tipo por referencia que no ha sido inicializado.</p>
<p>Ahora vamos a crear este método en nuestra clase:</p>
<pre class="class:csharp">double ImplementacionDeLaSuma ( float elNumeroA, float elNumeroB ){
    return elNumeroA + elNumeroB;
}
</pre>
<p>¿Pueden decir cual es la firma de este método? . . . .  si, es <strong>&lt; float, float, double &gt;</strong>.<br />
¿Es esta firma igual a la firma de nuestro delegado? . . . . . . si, son iguales.</p>
<p>Entonces aqui viene el truco de magia.</p>
<pre class="class:csharp">    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion 
        Add = ImplementacionDeLaSuma;
    }
</pre>
<p>Como el método tiene la misma forma que nuestro nuevo tipo, podemos a nuestra nueva variable Add asignarle la implementación de nuestro método debido a que podemos obtener la referencia del metodo mediante su <strong>NombreDelMetodo</strong> quitando los parametros.</p>
<p>A partir de este momento nosotros podemos utilizar nuestra variable <mark>Add</mark> como un método debido a que ya esta haciendo referencia al metodo <mark>ImplementacionDeLaSuma</mark> usandolo de la siguiente forma:</p>
<pre class="class:csharp">public class Algo
{
    // Definimos el nuevo tipo
    delegate double Suma ( float numeroA, float numeroB );

    public Algo(){
        // Creamos variable del tipo Suma
        //TipoDeVariable NombreDeVariable
        Suma              Add;
        //Le asignamos una implementacion 
        Add = ImplementacionDeLaSuma;
        //La usamos
        double res = Add(3.0f,5.0f)
    }

    double ImplementacionDeLaSuma ( float elNumeroA, float elNumeroB ){
        return elNumeroA + elNumeroB;
    }
}
</pre>
<p>Hasta este punto descubrimos lo que es crear delegados y usar <mark>Funciones con Nombre</mark> para interactuar con ellos tambien utilizamos la palabra reservada <mark>delegate</mark> para crear tipos, descubrimos que era la firma de un método, cual es su declaración y cual es su implementacion.</p>
<p>Para el siguiente post seguiremos con <mark><a href="http://www.binamedia.net/2016/02/delegados-en-c-funciones-anonimas/">Funciones Anonimas</a></mark> y las cosas se pondran divertidas.</p>
<p>Si tienen dudas preguntas o comentarios pueden dejarlos en los comentarios o buscarme por Twitter.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2015/07/delegados-en-csharp-limpia-encera-limpia-encera/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Pruebas automáticas de UI con Selenium y C#</title>
		<link>https://www.binamedia.net/2015/07/pruebas-automaticas-de-ui-con-selenium-y-csharp/</link>
					<comments>https://www.binamedia.net/2015/07/pruebas-automaticas-de-ui-con-selenium-y-csharp/#comments</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Thu, 09 Jul 2015 17:39:53 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Xamarin]]></category>
		<category><![CDATA[Selenium]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=519</guid>

					<description><![CDATA[Selenium es un framework de pruebas automaticas que nos permite grabar las tareas mas comunes y las no tan comunes que debe de realizar un [...]]]></description>
										<content:encoded><![CDATA[<p>Selenium es un framework de pruebas automaticas que nos permite grabar las tareas mas comunes y las no tan comunes que debe de realizar un sitio web, con este framework podemos hacer que la computadora pruebe ese login que te tomo horas crear.</p>
<p>La computadora lo hara cada vez que decidas correr la prueba o si tienes un <strong>Continuous Integration Server</strong> puedes agregar las pruebas para que cada que compiles te avise cuando lo rompas al estar reparando un bug o implementando otra funcionalidad.</p>
<p>Lo hermoso de esto es que es tan facil como hacer una macro de Excel:</p>
<ol>
<li>Grabas la “macro” con Selenium IDE.</li>
<li>La exportas a código C#.</li>
<li>La ejecutas como un TestUnit cada que te de la gana.</li>
</ol>
<p>Pero primero hay que configurar nuestro ambiente.</p>
<h3 id="instalando-selenium-server"><a name="instalando-selenium-server" href="#instalando-selenium-server"></a>Instalando Selenium Server</h3>
<p>Lo primero que hay que hacer es bajar del sitio de <a href="http://seleniumhg.org">Selenium</a> el servidor que podras encontrar en <a href="http://docs.seleniumhq.org/download/">su seccion de descargas</a> lo podras encontrar bajo el nombre de <strong>Selenium Standalone Server</strong>.</p>
<p>Despues tendras que decidir donde instalarlo y como es una aplicacion Java tendras que instalar el Java Runtime previamente, para fines practicos lo instalaremos en la misma maquina en la que vamos a desarrollar.</p>
<p><strong><em>Nota: Es recomendable en un equipo de desarrollo el correr el servidor Selenium en un servidor o maquina virtual con direccion ip fija (o una direccion en el DNS) que sea dedicado a pruebas solamente.</em></strong></p>
<p>Como siguiente hay que instalar los navegadores que usaremos para correr nuestras pruebas automaticas.</p>
<p><strong><em>Nota: Puedes tener diferentes maquinas virtuales con diferentes versiones de sistemas operativos y navegadores para ampliar tu capacidad de validar en diferentes configuraciones</em></strong></p>
<p>Ya que tenemos instalado el servidor y conocemos su ubicacion el siguiente paso es preparar un Firefox para grabar las pruebas cual macro de Excel, para eso utilizaremos un plugin llamado Selenium IDE que podemos descargar de la misma página en la que encontramos el server.</p>
<h3 id="configurando-xamarin-studio-(monodevelop)"><a name="configurando-xamarin-studio-(monodevelop)" href="#configurando-xamarin-studio-(monodevelop)"></a>Configurando Xamarin Studio (MonoDevelop)</h3>
<p>Vamos a crear una nueva solucion del tipo NUnit (<mark>New Solution -&gt; .Net -&gt; NUnit Library Project</mark>) y le pondremos <strong>SeleniumAuto.Test</strong>, después lo que tenemos que hacer es agregar mediante NuGet el assembly <strong>Selenium WebDriver</strong> y <strong>Selenium WebDriver Support Classes</strong>, esto lo podras realizar haciendo click derecho en Packages, Seleccionar <mark>Add Packages…</mark> y despues buscar <strong>Selenium WebDriver</strong>, repetir todo para <strong>Selenium WebDriver Support Classes</strong>.</p>
<p>Ahora estamos listos paraponer manos a la obra.</p>
<h2 id="1)-grabando-la-" macro"-con-selenium-ide"=""><a name="1)-grabando-la-" macro"-con-selenium-ide"="" href="#1)-grabando-la-"></a>1) Grabando la “macro” con Selenium IDE</h2>
<p>En Firefox nos iremos al menu <mark>Tools -&gt; Selenium IDE</mark> y debermos ver una nueva ventana como la imagen de abajo<br />
<img decoding="async" src="http://www.binamedia.net/wp-content/uploads/2015/07/SeleniumIDE.png" alt="Selenium IDE"><br />
Lo primero que hay que hacer es definir la <strong>Base Url</strong> en la parte de arriba que nos indicara desde donde se iniciara la prueba, despues tendremos que ir a Firefox, abrir una nueva pestaÃ±a y navegar hasta la url que definimos como base, en este punto estamos listos para grabar la prueba.</p>
<p>El siguiente paso es presionar el circulo rojo o boton de grabar a la derecha para iniciar a grabar y despues regresar a nuestra pestaÃ±a previamente preparada de Firefox para comenzar a realizar las acciones que vamos a automatizar, conforme vayamos realizandolas apareceran en el Selenium IDE.<br />
<img decoding="async" src="http://www.binamedia.net/wp-content/uploads/2015/07/SeleniumIDE1.png" alt="Selenium IDE grabando"><br />
Para terminar solo hay que volver a presionar el boton de grabar.</p>
<h2 id="2)-exportando-a-código-c#"><a name="2)-exportando-a-código-c#" href="#2)-exportando-a-código-c#"></a>2) Exportando a código C#</h2>
<p>Este paso es sencillo, solo volvemos al Selenium IDE y nos vamos al menu <mark>File -&gt; Export Test Case -&gt; C# / Nunit / WebDriver</mark> y guardaremos el archivo con la extension <mark>.cs</mark><br />
<img decoding="async" src="http://www.binamedia.net/wp-content/uploads/2015/07/SeleniumExport.png" alt="Exportar a WebDriver"><br />
Tenemos dos tipos diferentes a exportar, el <strong>WebDriver</strong> y el <strong>Remote Control</strong>, la recomendacion aqui es usar el <strong>WebDriver</strong> ya que es la version mas nueva mientras que el Remote Control es de versiones anteriores de Selenium.</p>
<p><strong><em>Nota: Como podran ver se puede exportar a diferentes lenguajes como Ruby, Python, Java y C#, esto se debe a que Selenium Server expone una API que puede ser consumida por diferentes clientes y que se puede crear un cliente en el lenguaje que tu quieras. </em></strong></p>
<p>Exportaremos el codigo como <strong>NewTest.cs</strong>.</p>
<h2 id="3)-ejecutando-el-código-como-un-testunit-cada-que-te-de-la-gana"><a name="3)-ejecutando-el-código-como-un-testunit-cada-que-te-de-la-gana" href="#3)-ejecutando-el-código-como-un-testunit-cada-que-te-de-la-gana"></a>3) Ejecutando el código como un TestUnit cada que te de la gana</h2>
<p>El siguiente paso es abrir nuestro proyecto Test en Xamarin Studio e importar el archivo que genero <mark>Selenium IDE</mark> y podremos ver un UnitTest ya programado como el de abajo.<br />
<img decoding="async" src="http://www.binamedia.net/wp-content/uploads/2015/07/XamSelIDE.png" alt="Xamarin Studio con Selenium Test"><br />
Para correr nuestra prueba tendremos que ir al menu <mark>View -&gt; Pads -&gt; Unit Test</mark> y en el panel que aparezca presionaremos <strong>Run All</strong></p>
<p>En este punto veremos que se abre una ventana de Firefox y comienza a correr la prueba de forma automatica, esto esta muy bien para crear el script pero cuando queremos hacerlo automatico necesitamos enviarlo al servidor con estos dos cambios:</p>
<p>1) Agregaremos el assembly OpenQA.Selenium.Remote; en los using<br />
2) Cambiaremos la linea</p>
<pre class="decode:1 " >csharp driver = new FirefoxDriver(); ==</pre>
<p>por</p>
<pre><pre class="class:csharp decode:1 " >DesiredCapabilities cap = DesiredCapabilities.Firefox ();
driver = RemoteWebDriver(new url("server",cap));
</pre>
<p>Donde DesiredCapabilities nos sirve para definir el browser sobre el que vamos a probar y RemoteWebDriver es la conexion con nuestro servidor previamente configurado donde <strong>server</strong> es la URL del server.</p>
<h3 id="notas-finales"><a name="notas-finales" href="#notas-finales"></a>Notas Finales</h3>
<p>Como pudimos ver no es estrictamente necesario el server para realizar las pruebas automaticas ya que las podemos correr desde nuestra IDE pero pensando en automatizar todo el proceso, un servidor sera necesario.</p>
<p>Si tienen dudas preguntas o comentarios pueden dejarlos en los comentarios o buscarme por Twitter.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2015/07/pruebas-automaticas-de-ui-con-selenium-y-csharp/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>ASP.Net vNext Alpha 3 &#8211; Agosto 2014</title>
		<link>https://www.binamedia.net/2014/08/asp-net-vnext-alpha-3-agosto-2014/</link>
					<comments>https://www.binamedia.net/2014/08/asp-net-vnext-alpha-3-agosto-2014/#respond</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Fri, 29 Aug 2014 14:38:14 +0000</pubDate>
				<category><![CDATA[Asp.Net]]></category>
		<category><![CDATA[Asp.Net MVC]]></category>
		<category><![CDATA[vNext]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=494</guid>

					<description><![CDATA[Si has estado ocupado en tus proyectos y este 2014 te ha pasado desapercibido, es bueno que te vayas enterando de lo que viene en [...]]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" style="vertical-align: baseline;" src="http://www.binamedia.net/wp-content/uploads/2014/08/aspnet-logo-180.png" alt="Asp.Net Logo" width="180" height="180" /></p>
<p>Si has estado ocupado en tus proyectos y este 2014 te ha pasado desapercibido, es bueno que te vayas enterando de lo que viene en el mundo del .Net y uno de los proyectos mas importantes que se encuentra actualmente en desarrollo es <strong>vNext</strong> que es la siguiente version de ASP.Net</p>
<p>Entre las nuevas caracterÃ­sticas se encuentran algunas como:</p>
<ul>
<li>Es <strong>Open Source</strong> y corre en Windows (.Net Framework), Mac y Linux (Mono Framework)</li>
<li>No compila, leÃ­ste bien <strong>NO COMPILA</strong>, todo esto gracias al nuevo compilador Open Source <a href="http://roslyn.codeplex.com/">Roslyn</a> que corre en memoria.</li>
<li>Optimización opcional para la nube gracias al <strong>CoreCLR</strong>(^1) que corre muy bien en Azure.</li>
<li>Puedes usar una <a href="https://www.youtube.com/watch?v=1g2I9SJZ5XI">Mac y Sublime</a> Text en vez de Windows y Visual Studio.</li>
<li><strong>Sin dependencias a System.Net</strong>(^2)<strong>.</strong></li>
<li><strong>Inyección de dependencias</strong> en todos lados.</li>
<li>Multiples runtimes corriendo lado a lado sin interferir uno con otro(^3).</li>
<li>Administrado por paquetes NuGet y un nuevo archivo de configuración estilo Node.js (o Ruby o Laravel) llamado project.json.</li>
</ul>
<p>Si deseas probar todas estas novedades lo puedes hacer con el Community Technology Preview de Visual Studio 14 (<a href="http://blogs.msdn.com/b/visualstudio/archive/2014/08/18/visual-studio-14-ctp-3-released.aspx">Visual Studio &#8220;14&#8221; CTP 3</a> para hacerlo corto) que ya incluye el intellisence para el Project.json y otras novedades.</p>
<p>Se que hay algunos términos y novedades que tal vez no conozcan por lo que aquÃ­ unas pequeÃ±as notas a pie de pagin&#8230; post.</p>
<p><strong>(^1) CoreCLR</strong> Como parte de las novedades en vNext Microsoft retomo el CoreCLR que es una selección de assemblies mÃ­nimos necesarios para realizar la mayor cantidad de tareas, en el caso de vNext se esta partiendo el .Net Framework en pedacitos optimizados para la nube, de esta forma mediante el archivo Project.json se podrán seleccionar los elementos del CLR que estrictamente se necesitan en la aplicación que estas desarrollando, esto permite que las aplicaciones sean más pequeÃ±as y consuman menos memoria, algo que para entornos de nube genera muchos beneficios.</p>
<p><strong>(^2) System.Net</strong> Uno de los problemas que Mono y la comunidad Open Source tuvieron y discutieron fue la dependencia de MVC y ASP.Net al assembly propietario de Microsoft System.Net, el problema raiz es que al ser propietaria, Microsoft podrÃ­a demandar a cualquiera que hiciera una implementación de la misma para ejecutarla en Mono. Lo divertido del asunto es que este assembly es ya tan complejo y tan dependiente de IIS que ni los encargados del .Net Framework han podido crear una version deslindada del IIS de allÃ­ un inicio desde cero open source libre de estos problemas.</p>
<p><strong>(^3) </strong>Normalmente cuando tienes un servidor IIS en el que ejecutas aplicaciones de Asp.Net tienes instalado el .Net Framework o varias versiones del .Net Framework, el problema reside en que todas tus aplicaciones que corren por ejemplo en el framework 4.0 serán afectadas por cualquier cambio en la configuración de ese framework. Con vNext podrás tener Frameworks modulares (gracias a CoreCLR y Project.json) que correrán en paralelo, asÃ­ podrás tener una app de framework 5.0(nombre no definitivo) corriendo junto a otra que corra el mismo framework y cada con sus propias configuraciones.</p>
<p>Se vienen cosas interesantes en el mundo del .Net y todavÃ­a es buen tiempo para seguir estas novedades.</p>
<p>Dudas preguntas y comentarios los pueden hacer aquÃ­ o por twitter en <a href="http://www.twitter.com/binamonk">@binamonk</a></p>
<p>&nbsp;</p>
<p>Visto, traducido y comentado del blog de <a href="http://www.hanselman.com/blog/ASPNETVNextAugust2014StatusRollup.aspx">Scott Hanselman</a>.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2014/08/asp-net-vnext-alpha-3-agosto-2014/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Office Dev Center &#8211; Extendiendo Office con el poder del HTML 5</title>
		<link>https://www.binamedia.net/2014/08/office-dev-center-extendiendo-office-con-el-poder-del-html-5/</link>
					<comments>https://www.binamedia.net/2014/08/office-dev-center-extendiendo-office-con-el-poder-del-html-5/#respond</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Tue, 26 Aug 2014 15:21:46 +0000</pubDate>
				<category><![CDATA[Office 365]]></category>
		<category><![CDATA[Productos Microsoft]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=489</guid>

					<description><![CDATA[Con la creación de Azure y la consolidación de la nube muchas cosas están cambiando en Microsoft, una de ellas es Office y su iniciativa [...]]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" style="vertical-align: baseline;" src="http://www.binamedia.net/wp-content/uploads/2014/08/Office-Dev-Center-home-page-1024x629.png" alt="Office Dev Center Home Page" width="417" height="256" /></p>
<p style="text-align: left;">Con la creación de Azure y la consolidación de la nube muchas cosas están cambiando en Microsoft, una de ellas es Office y su iniciativa Office 365 que es una subscripción para contar con varios servicios para oficina que va desde correo hasta toda la suite completa de Office.</p>
<p style="text-align: left;">Lo mas nuevo en Office 365 es su nuevo portal para desarrolladores en <a href="http://dev.office.com">Dev.Office.Com</a> donde podemos aprender com extender las capacidades de esta suite con nuestros propios desarrollos.</p>
<p><strong>¿Cómo hacerlo?</strong></p>
<p>Básicamente con HTML, CSS y Javascript ya que la API de Office 365 es web friendly y los plugins pueden ser creados con estos lenguajes y tu aplicación es un mini sitio que se conecta con office para generar el valor agregado que deseas.</p>
<p>Esta aplicación deberá ser hospedada en un Tenant (un tipo de instancia de servidor web en Azure) permitiendo escalar las instancias para mantener la app funcionando sin que la demanda de usuarios la mate.</p>
<p style="text-align: left;"><strong>¿Por qué desarrollar para office?</strong></p>
<ul>
<li>Por que puedes integrarlo a tu negocio.</li>
<li>Por que puedes integrarlo a negocios de terceros y vender la integración.</li>
<li>Por que puedes hacer una aplicación como lo hizo PayPal para ayudar a la gente a crear recibos con datos directos de su cuenta de PayPal</li>
<li>Por que corre en Office for Mobile Devices como iOS y Android.</li>
<li>Administración centralizada al ser una aplicación web.</li>
</ul>
<p>Es una opción interesante que puede funcionar en lugar de hacer macros con VBA o plugins que tienen que ser instalados.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2014/08/office-dev-center-extendiendo-office-con-el-poder-del-html-5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Building Cloud Apps with Microsoft Azure</title>
		<link>https://www.binamedia.net/2014/07/building-cloud-apps-with-microsoft-azure/</link>
					<comments>https://www.binamedia.net/2014/07/building-cloud-apps-with-microsoft-azure/#respond</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Thu, 31 Jul 2014 19:58:16 +0000</pubDate>
				<category><![CDATA[Azure]]></category>
		<category><![CDATA[Libros Gratis]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=485</guid>

					<description><![CDATA[La creación de aplicaciones en la nube es un tema que ha tomado mucha importancia a la hora de diseÃ±ar o modernizar aplicaciones web, para [...]]]></description>
										<content:encoded><![CDATA[<p><a href="http://click.email.microsoftemail.com/?qs=6ddcc12e9cb77eb1d6a62cf9118d6175d79b851a2d1a067218c7cbe291bf20c52f03f2ddd7b2e2fe"><img decoding="async" loading="lazy" class="alignnone size-full wp-image-486" src="http://www.binamedia.net/wp-content/uploads/2014/07/azure_book_thumb.jpg" alt="Building Cloud Apps with Microsoft Azure" width="197" height="240" /></a></p>
<p>La creación de aplicaciones en la nube es un tema que ha tomado mucha importancia a la hora de diseÃ±ar o modernizar aplicaciones web, para el caso de la plataforma .Net, Azure tiene una serie de servicios poderosos que necesitan de buen conocimiento para obtener de ellos los mejores beneficios.</p>
<p>Microsoft consciente de ello libero este libro de mejores practicas para mejorar nuestro arsenal de soluciones.</p>
<p>Pueden descargar este libro como PDF <a title="Building Cloud Apps with Microsoft Azure" href="http://click.email.microsoftemail.com/?qs=6ddcc12e9cb77eb1d6a62cf9118d6175d79b851a2d1a067218c7cbe291bf20c52f03f2ddd7b2e2fe" target="_blank">AQUI</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2014/07/building-cloud-apps-with-microsoft-azure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Bug en Sopitas para Windows Phone reparado</title>
		<link>https://www.binamedia.net/2013/06/bug-en-sopitas-para-windows-phone-reparado/</link>
					<comments>https://www.binamedia.net/2013/06/bug-en-sopitas-para-windows-phone-reparado/#respond</comments>
		
		<dc:creator><![CDATA[Dan]]></dc:creator>
		<pubDate>Thu, 06 Jun 2013 16:58:53 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://www.binamedia.net/?p=473</guid>

					<description><![CDATA[&#160; A partir de la tarde del 5 de Junio apareció un bug en la aplicación de Sopitas para Windows Phone que hace que se [...]]]></description>
										<content:encoded><![CDATA[<p><a href="http://www.binamedia.net/wp-content/uploads/2013/06/logo_sopitas.png"><img decoding="async" loading="lazy" class="alignnone  wp-image-474" alt="Logo Sopitas para Windows Phone" src="http://www.binamedia.net/wp-content/uploads/2013/06/logo_sopitas.png" width="162" height="162" srcset="https://www.binamedia.net/wp-content/uploads/2013/06/logo_sopitas.png 252w, https://www.binamedia.net/wp-content/uploads/2013/06/logo_sopitas-150x150.png 150w" sizes="(max-width: 162px) 100vw, 162px" /></a></p>
<p>&nbsp;</p>
<p>A partir de la tarde del 5 de Junio apareció un bug en la aplicación de Sopitas para Windows Phone que hace que se cierre de forma repentina sin dejar ver las noticias, afortunadamente ya fue reparado y se encuentra en camino el fix para que puedan seguir disfrutando de sus noticias favoritas.</p>
<p>La tienda de Windows tarda 5 dÃ­as en publicar las actualizaciones por lo que el proximo Miercoles 6 de Julio ya tendran lista la actualización con el fix.</p>
<p>Saludos</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.binamedia.net/2013/06/bug-en-sopitas-para-windows-phone-reparado/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
