[Xamarin] Implementando un simple ListViewAdapter

Cuando empecé a trabajar con listas en Android, en casi todos los ejemplos vi que se creaban clases que extendían de BaseAdapter y que estas se creaban para cada Adapter (cuando solo cambiaba la clase y no la plantilla de datos o incluso cuando solo se usaba una sola vez). Así que ante esta particular situación sumado el hecho de los pocos ejemplos de filtrado que encontraba eran con ArrayAdapter y sin usar plantillas personalizadas decidí hacer este post.

Empecemos

Entity.cs

User.cs

UserDataTemplate.axml

ListViewAdapter.cs

Main.axml

MainActivity.cs -> GetUsers()

Caso 1. Queremos listar usando una única plantilla de datos y sin filtrar

MainActivity.cs

Caso 2. Queremos listar usando una única plantilla de datos y filtrar

MainActivity.cs

Caso 3. Queremos listar usando diferentes plantillas de datos c/s filtrar

OldUserDataTemplate.axml 

MainActivity.cs

[.NET] C# 6.0 – Visual Studio 2015 CTP 6

C# 6.0 se incluye con Visual Studio 2015 y viene con varias novedades, en este post compartiré un resumen de las nuevas características de este lenguaje.

Sintaxis using static

En versiones previas de C#, cuando queríamos trabajar, por ejemplo, con la clase estática System.Console teníamos que definir using System y de esa manera tener la posibilidad de usar todas las clases que se encuentran en el espacio de nombres System (no había forma de usar solo la clase System.Console).

using System;

namespace CSharp6.CTP6
{
internal class Program
{
private static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("¡Hola XAML Development!");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("¡Viva C# 6.0!");
}
}
}

Ahora con C# 6.0, tu puedes agregar using static para poder utilizar los métodos y propiedades de la única clase estática o el enumerado a la cual haces referencia:

using static System.Console;
using static System.ConsoleColor;

namespace CSharp6.CTP6
{
internal class Program
{
private static void Main(string[] args)
{
ForegroundColor = Cyan;
WriteLine("¡Hola XAML Development!");
ForegroundColor = Green;
WriteLine("¡Viva C# 6.0!");
}
}
}

nameof

Muchas veces hemos usado literales de cadena para hacer referencia el nombre de una variable.

public static void Foo(string code)
{
if (code== null) throw new Exception("code");
//...
}

En C # 6.0, hay un nuevo operador llamado nameof que nos permitirá refactorizar nuestro código y deshacernos de muchos de esos literales de cadena. Ahora podremos tener un código más limpio y seguro cuando se trate de obtener el nombre de nuestras variables.

public static void Foo(string code)
{
if (code== null) throw new Exception(nameof(code));
//...
}

Filtros de Excepciones

Los filtros de excepciones no son nuevos en Visual Basic, pero sí en C#. La keyword when te permite especificar una condición para un bloque catch.

            try
{
throw new System.Exception("Error");
}
catch (System.Exception ex) when (ex.Message == "ReallyBadError")
{
// :(
}
catch (System.Exception ex) when (ex.Message == "Error")
{
WriteLine("Boom!");
}

await desde un bloque catch y finally

Esta nueva característica no requiere mucha explicación. Que bueno que por fin este con nosotros ya que es muy útil.

        public static async void BoomAsync()
{
try
{
throw new Exception("Boom!");
}
catch
{
await Task.Delay(5000);
WriteLine("Esperaste 5 segundos");
}
finally
{
await Task.Delay(3000);
WriteLine("Esperaste 3 segundos");
}
}

Interpolación de cadenas

Ahora podemos poner expresiones directamente en la cadena literal para mostrar los valores de una manera sencilla. En C # 6.0 podemos especificar fácilmente varios formatos en nuestros valores.

            //C# < 6.0                
string txt1 = "Hola" + "Mundo";
string txt2 = string.Format("{0} {1}", "Hola", "Mundo");

//C# >= 6.0
string txt3 = "Mundo";
int habitantes = 8000;
Console.WriteLine($"En el {txt3}. Hay aproximadamente {habitantes + 1} millones de habitantes. {DateTime.Now:dd-MM-yyyy}");

Operador de condicional nulo

¿Quien no se ha topado con un NullReferenceException?. Esta excepción que nos salta cuando olvidamos validar si es que un valor no es nulo antes de usarlo. Ahora gracias a C# 6.0 el trabajo con algunas de las validaciones será menos complicado. En el siguiente código, si nuestra variable es null la función devolverá null en vez de caerse.

        public static string NullConditional(object obj)
{
return obj?.ToString();
}

Inicializadores de Diccionarios

No podemos negar que el siguiente formato para la creación de diccionarios es confuso :

            Dictionary<string, string> data = new Dictionary<string, string>()
{
{ "Fruta", "Mandarina" },
{ "Disciplina", "Parkour" },
{ "Profesion", "Developer" }
};

En C# 6.0 esto se extendió y ahora también se puede hacer de la siguiente manera, la cual es más fácil de entender:

            Dictionary<string, string> data = new Dictionary<string, string>()
{
["Fruta"] = "Mandarina",
["Disciplina"] = "Parkour",
["Profesion"] = "Developer"
};

Inicializadores Auto-Property

En el pasado teníamos que hacer lo siguiente para inicializar nuestras propiedades:

    public class Usuario
{
public Usuario()
{
this.Id = Guid.NewGuid();
}

public Guid Id { get; set; }

public readonly int code = 3;

public int Code
{
get { return code; }
}
}
Ahora es suficiente hacer lo siguiente:
    public class Usuario
{
public Guid Id { get; set; } = Guid.NewGuid();

public int Code { get; } = 3;
}

Conclusión

Desde que empezó su desarrollo, C# 6.0 ha ido tomando una mejor forma. Me agradan bastante las nuevas características, pero ahora debemos ser conscientes que cualquier cosa aquí esta sujeto a cambios, esto se puede deducir tomando en cuenta que tanto Visual Studio 2015 como C# 6.0 siguen en preview. Aconsejo mantenerse enganchado a los siguientes sitios:

http://msdn.microsoft.com/
http://channel9.msdn.com/

[.NET] Myo Armband & MyoSharp .ft HackSpacePeru

Enlaces

CodePlex

Código fuente disponible en: CSharp -> MyoHackNighter

[Azure App Service] ¿Cómo depurar mis Sitios web de Azure usando Visual Studio?

Hoy aprenderemos lo sencillo que es depurar nuestros Sitios web de Azure desde Visual Studio. Para ello empecemos creando un proyecto web.

Como elegí un proyecto ASP.NET MVC Vacío lo único que haremos es agregar un Controller llamado Home, definir un punto de interrupción dentro del método Index y crear la vista para el Index.

Una vez hecho esto ya podemos empezar a publicar nuestro sitio web. Si ya contamos con algún perfil de publicación lo podemos importar, sino también podemos crear un nuevo sitio web desde Visual Studio luego de iniciar sesión en Microsoft Azure.

Si queremos depurar nuestro Sitio Web, en configuración debemos asegurarnos que este seleccionado Debug y no Release.

Luego de publicar exitosamente nuestro sitio, ubiquemos el sitio en el Server Explorer y seleccionemos View Settings.

Activemos la opción Remote Dubugging ya que por defecto esta desactivado y guardemos los cambios.

También podemos hacerlo desde el Portal de Microsoft Azure.

Finalmente seleccionemos la opción Attach Debugger

Y terminamos..

[.NET] ¿Cómo saber si un número es primo?

Hoy compartiré un simple algoritmo que nos permitirá saber si algún número es primo o no.

C#

using System;

namespace PrimeNumber.WindowsConsole
{
internal class Program
{
private static void Main(string[] args)
{
for (var i = 1; i <= 50; i++)
{
if (!IsPrimeNumber(i)) continue;

Console.WriteLine();
Console.WriteLine(string.Format("TABLA DEL {0}", i));
for (var j = 1; j <= 12; j++)
Console.WriteLine(string.Format("{0} x {1} = {2}", i, j, i * j));
}

Console.Read();
}

private static bool IsPrimeNumber(int number)
{
var root = Math.Sqrt(number);
if (root % 1 == 0)
return false;

var limit = Math.Ceiling(root);
for (int i = 2; i <= limit; i++)
if (number % i == 0 && number != 2)
return false;

return true;
}
}
}

CodePlex

Código fuente disponible en: CSharp -> PrimeNumber.WindowsConsole

[.NET] ¿Cómo almacenar palabras en un archivo de texto?

Hoy aprenderemos algo muy sencillo, algo que nos puede ser útil cuando queramos guardar logs por ejemplo.

C#

using System;
using System.IO;

namespace ConsoleTextWriter
{
public class Program
{
private const string _path = "frases.txt";

private static void Main(string[] args)
{
if (File.Exists(_path))
Console.Write(File.ReadAllText(_path));

ReadAndSaveConsoleLine();
}

private static void ReadAndSaveConsoleLine()
{
var line = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(line))
{
using (var streamWriter = new StreamWriter(_path, true))
streamWriter.WriteLine(line);
ReadAndSaveConsoleLine();
}
}
}
}

CodePlex

Código fuente disponible en: CSharp -> ConsoleTextWriter

[WPF] ¿Como generar un Código QR y exportarlo en PNG?

En la presente publicación ejemplificaré como lograr estos objetivos ayudándonos de una librería llamada QrCode.Net la cual esta disponible para WinForms (no lo he probado) y WPF. Para este post he usado la versión 0.3 porque la 0.4 es Pre-release.

Con esta librería hay un par de formas de hacer esto: usando el control QrCodeControl o la clase QrEncoder.

QrCodeControl

Lo único que hay que hacer acá es dibujarlo correctamente en el XAML e ir actualizando su propiedad Text.

<Window x:Class="GenerateQR.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:qr="clr-namespace:Gma.QrCodeNet.Encoding.Windows.WPF;assembly=Gma.QrCodeNet.Encoding"
Title="[C#] ¿Cómo generar un Código QR y exportarlo en PNG?" Height="350" Width="525">
<Grid Margin="6">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtCode" Margin="6" TextChanged="txtCode_TextChanged"/>
<Button x:Name="btnExport" Grid.Column="2" Content="Exportar PNG" Margin="6" Click="btnExport_Click"/>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<qr:QrCodeImgControl Grid.Column="0" Margin="6" x:Name="qrControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="Auto" Width="Auto" />
<Image Grid.Column="1" x:Name="imgQR" />
</Grid>
</Grid>
</Window>
        private void txtCode_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(txtCode.Text)) return;

//QrCodeImgControl
qrControl.Text = txtCode.Text;
}

QrEncoder

Para usar esta clase primero tenemos agregar las referencias a System.Drawing, PresentationCore y WindowsBase. Una vez agregadas las referencias continuamos:

        private Bitmap GetQRBitmap(string content)
{
var qrEncoder = new QrEncoder();
var code = qrEncoder.Encode(content);
var bitmapImage = new Bitmap(code.Matrix.Width, code.Matrix.Height);

for (int j = 0; j < code.Matrix.Height; j++)
for (int i = 0; i < code.Matrix.Width; i++)
bitmapImage.SetPixel(i, j, code.Matrix[i, j] ? System.Drawing.Color.Black : System.Drawing.Color.White);

return bitmapImage;
}

private BitmapImage BitmapToImageSource(Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Png);
memory.Position = 0;
BitmapImage bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.EndInit();

return bitmapimage;
}
}

private void txtCode_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
if (string.IsNullOrWhiteSpace(txtCode.Text)) return;

//Image
var imageSource = BitmapToImageSource(GetQRBitmap(txtCode.Text));
this.imgQR.Width = imageSource.PixelWidth;
this.imgQR.Height = imageSource.PixelHeight;
this.imgQR.Source = imageSource;
this.imgQR.UpdateLayout();
}

Exportando el PNG

Aquí nos valemos de la clase PngBitmapEncoder y en este ejemplo estoy exportando el archivo en la misma carpeta del ejecutable para ser simples.

        private void btnExport_Click(object sender, RoutedEventArgs e)
{
string path = Guid.NewGuid().ToString() + ".png";

using (FileStream fileStream = new FileStream(path, FileMode.Create))
{
PngBitmapEncoder pngBitmapEncoder = new PngBitmapEncoder();
pngBitmapEncoder.Frames.Add(BitmapFrame.Create((WriteableBitmap)qrControl.Source));
pngBitmapEncoder.Save(fileStream);
fileStream.Close();
}
}

CodePlex

Código fuente disponible en: CSharp -> GenerateQR

[.NET] ¿Cómo usar Enterprise Library 6 Data Access Application Block usando solo código?

En una publicación pasada mostré como usar EntLibDAAB configurándola usando el .config. En esta ocasión enseñaré como usar este componente usando solo C#.

Para esta demostración usé cualquier procedimiento almacenado que devuelva datos (en este caso dbo.uspGetEmployeeManagers) de una base de datos muy conocida llamada Adventure Works y un proyecto WPF con la siguiente class y DataGrid para mostrar los datos.

SqlDatabase

La primera forma de trabajar con EntLib6DAAB y SQL Server es usando directamente Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase y pasándole como argumento la cadena de conexión.

DatabaseSettings

Si queremos tener un mayor control sobre la configuración podemos usar Microsoft.Practices.EnterpriseLibrary.Data.Configuration.DatabaseSettings


Si queremos usar alguna otra base de datos con EntLib como Oracle o MySQL tenemos que agregar nuevas entradas a ProviderMappings o si queremos establecer alguna base de datos por defecto no olvidemos hacer lo siguiente:

CodePlex

Código fuente disponible en: CSharp -> EntLib6DAABInCode

[Xamarin] ¿Cómo usar recursos de colores Drawing en Xamarin.Android?

En esta publicación mostraré como usar un recurso de color del tipo Drawing de dos formas distintas. La primera forma responde a como usarlo desde otro XML y la segunda a como usarlo desde Código.

themes.xml

Para este ejemplo empezemos definiendo nuestro recurso en un nuevo archivo: ResourcesvaluesThemes.xml.

main.axml

En otro XML hacemos referencia a los recursos que definimos en Themes.xml con ayuda de @drawable. Si tienen algun error asegurence que Themes.xml tenga como Build action AndroidResource. Adicionalmente hay otros 2 TextView los cuales actualizaremos desde el código.

MainActivity.cs

Por último para usarlos desde código solo tenemos que hacer lo siguiente, aparte de agregar el using Android.Graphics.Drawables;