miércoles, 31 de julio de 2019

216. Cognitive Services (V)

Ya hemos creado una persona dentro del grupo, pero siempre existe la duda, si la persona que creamos realmente existe, o ¿Cuántas personas tenemos en el servicio?, ¿Quiénes son?, toda esta información la podemos obtener mediante una llamada al API que nos muestra el listado de las personas que hemos dado de alta.

Para ello se usa el siguiente código:

private async void ListaDePersonas()
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request headers
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

            // Request parameters
            queryString["start"] = "0";
            queryString["top"] = "1000";
            var uri = "https://southcentralus.api.cognitive.microsoft.com/face/v1.0/persongroups/[Grupo]/persons?" + queryString;

            var response = await client.GetAsync(uri);
            string contenido = await response.Content.ReadAsStringAsync();


        }


¿Qué debemos cambiar?

Debemos cambiar la suscripción, ya que es nuestra llave para entrar al servicio, los parámetros start y stop, ya que con eso limitamos la lista, el servidor al que nos encontramos trabajando y el grupo al que pertenecen estos usuarios.

Al leer el contenido de Json tendremos lo siguiente:


[{"personId":"3853a3d1-f528-4da9-8877-88d69cf58c13","persistedFaceIds":[],"name":"11","userData":"."},{"personId":"5c556926-600e-4166-ad16-5b2aa36f519d","persistedFaceIds":[],"name":"12","userData":"."},{"personId":"87117a66-37b0-46c8-bc5b-e940b227ac6b","persistedFaceIds":[],"name":"14","userData":"."},{"personId":"e2884956-8837-4f8f-b1e8-ce4919056098","persistedFaceIds":[],"name":"1","userData":"Carlos."},{"personId":"f65c88ec-8008-4fab-9977-26561fed5669","persistedFaceIds":[],"name":"13","userData":"."}]

Felices lineas

martes, 30 de julio de 2019

215. Cognitive Services (IV)

El siguiente paso es crear un grupo persona, este será el grupo en el que agregaremos las imágenes, para que sean tomadas por el modelo, mientras mas imágenes tengamos de la persona será mejor la identificación.

 static async void crearpersona()
        {
            //Cargando imagen'
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
            string uri = "https://southcentralus.api.cognitive.microsoft.com/face/v1.0/persongroups/[grupo]/persons?" + queryString;

            HttpResponseMessage response;
            // Request body
            byte[] byteData = Encoding.UTF8.GetBytes("{\"name\": \"1\",\"userData\": \"Carlos.\"}");

            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                response = await client.PostAsync(uri, content);
            }

        }

Las partes mostradas en naranja son las que debemos modificar, en grupo pondremos el grupo que generamos en el paso III de este tutorial, en nombre, será el identificador de la persona, y en userdata, una descripción de la persona.

Felices Lineas


jueves, 25 de julio de 2019

214. Xamarin Error 'Resource.Id' does not contain a definition for 'id'

Este error es muy común que ocurra al estar trabajando con Xamarin en Visual Studio, tanto en su versión de MAC como en su versión de PC, este error se puede dar por 2 causas:

1. El archivo Resource.designer.cs no se esta regenerando correctamente, en este caso el proceso de solución es:

Respaldamos el archivo.
Borramos su contenido

2. En caso de que el problema continúe, y el control que estamos buscando si aparezca en el archivo, el problema es que no se esta actualizando dicho archivo en la carpeta obj para ello la solución es:

Respaldamos las carpetas bin y obj
Borramos ambas carpetas


En muchas ocasiones limpiar la solución basta, pero en algunos casos visual studio no borra todos los archivos de bin y obj al limpiar la solución, es por esto por lo que los errores continúan.


Felices lineas

martes, 23 de julio de 2019

213. Xamarin - Android Barra de herramientas encabezado


Una barra de herramientas que sustituya el encabezado que entrega por default Android es muy útil cuando se quiere agregar funcionalidad y un mejor aspecto a nuestra aplicación, para hacer esto, es necesario que dentro de nuestro layout creemos un toolbar, como se muestra en el siguiente código.


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:background="@drawable/encabezadoblanco"
        android:layout_height="?attr/actionBarSize"
        android:contentInsetLeft="0dp"
        android:gravity="top|start"
        android:contentInsetStart="0dp"
        android:contentInsetRight="0dp"
        android:contentInsetEnd="0dp"
        android:layout_width="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:text=""
            android:layout_gravity="center"
            android:id="@+id/tvActionBarTitle"
            android:layout_height="wrap_content" />
        <ImageButton
            android:id="@+id/ibNofication"
            android:layout_gravity="right"
            android:background="@drawable/menutoolengrane"
            android:layout_width="30dp"
            android:padding="9dp"
            android:layout_marginRight="6dp"
            android:layout_height="30dp" />
    </android.support.v7.widget.Toolbar>



Ahora si además queremos añadir funcionalidad para tener 2 botones uno a la izquierda y otro a la derecha, en nuestro activity escribimos lo siguiente



            _toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(_toolbar);
            SupportActionBar.SetDisplayHomeAsUpEnabled(true);
            SupportActionBar.SetDisplayShowTitleEnabled(false);
            SupportActionBar.SetHomeButtonEnabled(true);            
            SupportActionBar.SetHomeAsUpIndicator(Resource.Drawable.Menutoolregresa);
            _toolbar.SetPadding(0, 0, 0, 0);
            _toolbar.SetPadding(0, 0, 0, 0);
            _toolbar.SetContentInsetsAbsolute(0, 0);



Con esto obtenemos un menú como el siguiente:



La mano invisible controla el mundo




212. Xamarin - Android ¿Como poner un boton siempre en la parte de abajo de la pantalla?

El siguiente código, permite poner siempre un botón en la parte baja de la pantalla, este es muy útil para el diseño de android

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true">
        <Button
            android:id="@+id/btnButton"
            android:text="Hello"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" />
    </FrameLayout>
</FrameLayout>


Con esto obtenemos una distribución como la que se muestra a continuacion



Felices líneas

martes, 9 de julio de 2019

211. Obtener el certificado de firma en Xamarin Android

Este Certificado es oro puro, si lo pierden una aplicación no puede volver a actualizarse en la tienda de Android, por lo que es importante que estos 2 archivos los tengan resguardados en un lugar seguro, no necesariamente su maquina.

Los archivos que deben resguardar se encuentran en la siguiente ruta:


C:\Users\[Usuario]\AppData\Local\Xamarin\Mono for Android\Keystore


En esta carpeta van a encontrar una carpeta con el nombre del certificado que van a usar, y 2 archivos:

*.KeyInfo y *.KeyStore

Es importante guardar esos archivos por que si se dañan o se pierden su aplicación tendrá problemas


Felices Lineas

viernes, 5 de julio de 2019

210. Cognitive Services (III)

Para poder Identificar a una persona el primer paso es crear un grupo en el que se almacenara la información que será tomada por cognitive para efectuar esto.

Esto lo vamos ha hacer por medio del API, para ello usaremos el siguiente código.

Esta

        static async void CreaGrupo()
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);

            // Request headers
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

            var uri = "https://southcentralus.api.cognitive.microsoft.com/face/v1.0/persongroups/abc?" + queryString;
            HttpResponseMessage response;
            // Request body
            byte[] byteData = Encoding.UTF8.GetBytes("{\"name\": \"group1\",\"userData\": \"user -provided data attached to the person group.\",\"recognitionModel\": \"recognition_02\"}");
           // byte[] byteData = Encoding.UTF8.GetBytes("{body}");
            using (var content = new ByteArrayContent(byteData))
            {
                content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                response = await client.PutAsync(uri, content);
            }

        }

Felices líneas

miércoles, 3 de julio de 2019

209. Script para creacion de tablas de Identity en SQL

Si tenemos una base de datos que ya existe pero deseamos trabajar con Identity como modelo de Autenticación, podemos emplear el siguiente script para la generación de las tablas:

SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[AspNetRoles](
    [Id] [nvarchar](128) NOT NULL,
    [Name] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[AspNetUserClaims](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [UserId] [nvarchar](128) NOT NULL,
    [ClaimType] [nvarchar](max) NULL,
    [ClaimValue] [nvarchar](max) NULL,
CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO


SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[AspNetUserLogins](
    [LoginProvider] [nvarchar](128) NOT NULL,
    [ProviderKey] [nvarchar](128) NOT NULL,
    [UserId] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED
(
    [LoginProvider] ASC,
    [ProviderKey] ASC,
    [UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[AspNetUserRoles](
    [UserId] [nvarchar](128) NOT NULL,
    [RoleId] [nvarchar](128) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED
(
    [UserId] ASC,
    [RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[AspNetUsers](
    [Id] [nvarchar](128) NOT NULL,
    [Email] [nvarchar](256) NULL,
    [EmailConfirmed] [bit] NOT NULL,
    [PasswordHash] [nvarchar](max) NULL,
    [SecurityStamp] [nvarchar](max) NULL,
    [PhoneNumber] [nvarchar](max) NULL,
    [PhoneNumberConfirmed] [bit] NOT NULL,
    [TwoFactorEnabled] [bit] NOT NULL,
    [LockoutEndDateUtc] [datetime] NULL,
    [LockoutEnabled] [bit] NOT NULL,
    [AccessFailedCount] [int] NOT NULL,
    [UserName] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO


ALTER TABLE [dbo].[AspNetUserClaims]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO


ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]
GO


ALTER TABLE [dbo].[AspNetUserLogins]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO


ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]
GO


ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[AspNetRoles] ([Id])
ON DELETE CASCADE
GO


ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
GO


ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO


ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]
GO



Felices Lineas