domingo, 1 de diciembre de 2019

228. Permitir cerrar finder en una MAC

Me preguntaran, ¿Para que puedo querer cerrar esta aplicación del sistema operativo?, bueno es sencillo, para algunos exámenes y estudios en linea, muchas veces se requiere una validación de que en los equipos no se esta efectuando ningún tipo de trampa, al emplear aplicaciones externas.

Finder no permite cerrar la aplicación de manera natural, por lo que se debe ejecutar en la ventana de comando de la MAC la siguiente instrucción:

defaults write com.apple.finder QuitMenuItem - bool YES



felices lineas

viernes, 29 de noviembre de 2019

227. Unir pdfs

En algunas ocasiones necesitamos manipular pdfs como desarrolladores en este caso una de las herramientas que mas nos ayuda es itextsharp, y es la que emplearemos en este caso.

El caso que presento yo tengo pdf, y estos se deben unir en un solo pdf mayor, para ello vamos ha hacer lo siguiente, primero, vamos a agregar la referencia a nuestro proyecto.




Ahora lo que vamos ha hacer es lo siguiente:

1. Vamos a crear un nuevo pdf
2. Vamos a abrir los pdf y a copiar su contenido el nuevo pdf
3. Cerramos el pdf

Así de sencillo.

Les dejo el código para hacer esto

using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UnirPdf
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> pdf = new List<string>();
            pdf.Add(@"C:\f\A.pdf");
            pdf.Add(@"C:\f\B.pdf");
            UnirPdf(pdf, @"C:\f\C.pdf");
        }

        public static void UnirPdf(List<string> archivos, string salida)
        {
            Document document = new Document();
            using (FileStream newFileStream = new FileStream(salida, FileMode.Create))
            {
                PdfCopy writer = new PdfCopy(document, newFileStream);
                if (writer == null)
                {
                    return;
                }
                document.Open();

                foreach (string archivo in archivos)
                {
                    PdfReader reader = new PdfReader(archivo);
                    reader.ConsolidateNamedDestinations();
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        PdfImportedPage page = writer.GetImportedPage(reader, i);
                        writer.AddPage(page);
                    }

                    PRAcroForm form = reader.AcroForm;
                    if (form != null)
                    {
                        writer.CopyDocumentFields(reader);
                    }

                    reader.Close();
                }
                writer.Close();
                document.Close();
            }
        }

    }
}


Felices lineas

miércoles, 27 de noviembre de 2019

226. Running Totals SQL Server

Existen casos en los que se requiere obtener la información de SQL pero en que la información del renglón actual depende del anterior, por ejemplo el caso de las entradas y salidas de un inventario, en el que no tengo el registro de existencia de manera permanente.

Veamos un ejemplo, tengo la siguiente tabla



Como se puede ver no tengo un total de existencia, para poder obtener este total vamos a usar un concepto que se llama running totals, para ello es muy importante que tengamos un campo que le de un orden a nuestra informacion, en este caso es el id, pero puede ser también una fecha.

El query que emplearemos es el siguiente:

  SELECT Entrada, Salida,
  SUM(Entrada - Salida) OVER(ORDER BY Id
     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
          AS RunningTotal
  FROM suma

¿Qué es lo que hace? Ejecuta la suma pero tomando en cuenta el valor del renglón precedente.

si ejecutamos el query obtenemos



En donde se ve que el nuevo valor nos muestra el total de nuestro inventario


Felices lineas

miércoles, 13 de noviembre de 2019

225. Xamarin Toolbar (II)


Continuemos con la construcción de nuestra barra de acciones, esta vez es momento de agregar botones (para eso queremos el menu) y acciones a estos.

El proceso es realmente sencillo:

1. Agreguemos un nuevo recurso, de tipo xml en la carpeta llamada menu


2. Ahora establezcamos que es lo que contendrá el menu, en mi caso yo coloque lo siguiente:


<?xml version="1.0" encoding="UTF-8" ?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">

<item
android:id="@+id/Informacion"
android:icon="@drawable/ic_launcher"
app:showAsAction="ifRoom"
android:title="Info"/>

<item
android:id="@+id/menuof1"
app:showAsAction="never"
android:title="Menu 1"/>

<item
android:id="@+id/menuof2"
app:showAsAction="never"
android:title="Menu 2"/>

    <item
android:id="@+id/menuof3"
app:showAsAction="never"
android:title="Menu 3"/>

</menu>

¿Que hace?

<item
android:id="@+id/Informacion"
android:icon="@drawable/ic_launcher"
app:showAsAction="ifRoom"
android:title="Info"/>

Establece un icono, de acceso a una acción, aquí es muy importante el indicar la propiedad que se encuentra en negrita, eso nos permite que siempre se muestre en la barra.

<item
android:id="@+id/menuof1"
app:showAsAction="never"
android:title="Menu 1"/>

<item
android:id="@+id/menuof2"
app:showAsAction="never"
android:title="Menu 2"/>

    <item
android:id="@+id/menuof3"
app:showAsAction="never"
android:title="Menu 3"/>

Crea un conjunto de menus, dentro del menu con los tres puntos.

3. Ahora es necesario que este menu se muestre dentro del layout, para ello vamos a agregar a nuestro activity el siguiente código:

        public override bool OnCreateOptionsMenu(IMenu menu)
        {
            MenuInflater.Inflate(Resource.Menu.menutool, menu);
            return base.OnCreateOptionsMenu(menu);
        }

4. Por ultimo tenemos que asignar una acción a cada uno de los botones

        public override bool OnOptionsItemSelected(IMenuItem item)
        {
            string textToShow;

            if(item.ItemId == Resource.Id.Informacion)
            {
                textToShow = "Informacion";
            }
            else
            {
                textToShow = "Menu XX";
            }

            Android.Widget.Toast.MakeText(this, item.TitleFormatted + ":" + textToShow,
                Android.Widget.ToastLength.Long).Show();

            return base.OnOptionsItemSelected(item);
        }
   
Al probar en el emulador





Felices lineas

El Alien de México

224. Xamarin ToolBar (I)

Haremos un breve tutorial de Xamarin para Android, la mision poner una barra de actividades en la parte superior, otra en la parte inferior, y que estas puedan activar el menu.

Para hacer eso, debemos hacer lo siguiente:

Primero vamos a sustituir la barra de actividades, por una que tenga mucho mayor funcionalidad para esto es necesario que instalemos el siguiente paquete de nuget.



Vamos a agregar un nuevo estilo


Abrimos el archivo, y agregamos lo siguiente:

    <style name="AppBarra" parent="Theme.AppCompat">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="colorPrimary">#F6F6AA</item>
    </style>

Con esto vamos a quitar el Action Bar predeterminado, y podremos colocar el nuestro,

Ahora vamos a crear nuestro layout


Y agregaremos lo siguiente


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/actionBarSize"
    android:background="?android:attr/colorPrimary"
    android:elevation="4dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>
</LinearLayout>

Con esto estamos agregando el nuevo toolbar

Ahora creemos el Activity que le dará vida a nuestro toolbar

Agregemos el siguiente código:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.App;
using Android.Views;
using Android.Widget;

namespace MenuTool
{
    [Activity(Label = "Menuly", MainLauncher = true, Theme = "@style/AppBarra")]
    public class Menuly : AppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.Menuly);

            var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            SetSupportActionBar(toolbar);
            SupportActionBar.Title = "Titulo!!!";

            // Create your application here
        }
    }
}

El código, aplica un tema, y busca la nueva toolbar, para poder comenzar a manipularla, si ejecutamos nuestro código tendremos lo siguiente:






El Alien de México



lunes, 21 de octubre de 2019

223. RMySQL (Mac)

En el post anterior vimos como poder instalar RMySQL en R para windows, sin embargo para el caso de MAC las cosas cambian un poco, esto debido a que el autor de RMySQL no incluye el compilado para MAC, por lo que es necesario compilarlo dentro de R.

¿Cuál es el inconveniente?, necesitamos tener instalado MySQL de manera local, ya que tendremos que usar algunas librerías del mismo.

para ello haremos lo siguiente, desde una consola, ejecutamos:


ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"


con esto intalamos homebrew que nos ayudara a instalar mysql


brew install mysql


Con esto instalamos mySQL

Ahora desde RStudio damos de alta 2 rutas de bibliotecas

y posteriormente, instalar el paquete, observemos que este se instala como source, por que se compilara


a partir de este punto, se emplea igual que en el post anterior


Felices lineas

222. RMySQL (Windows)

R es una herramienta muy usada para el analisis de datos, en muchas ocaciones estos datos no los tenemos en otras bases como es el caso de MySQL, para poder usar una base de MySQL desde R, es necesario hacer lo siguiente:

1. Instalar el paquete RMySQL


2. Cargar la libreria RMySQL


3. Utilizarla

Para conectarnos a la base de datos se emplea la siguiente instrucción:

mydb = dbConnect(MySQL(),user='[ususario]',password='[password]',dbname='[Base]',host='[Ip]')

¿que podemos hacer?

dbListTables(mydb)

Nos lista las tablas de la base de datos

dbListFields(mydb,"[tabla]")

Obtenemos los campos de la base de datos

> rs = dbSendQuery(mydb,"select * from [Tabla]")
> data = fetch(rs,n=-1)

Cargamos la información para poder emplearla


Felices lineas




domingo, 13 de octubre de 2019

221. Importar csv a mysql

Si bien existen herramientas que permiten importar datos, la forma mas sencilla de hacer esta carga es hacerla desde el mismo servidor con la siguiente intrucción:



 LOAD DATA LOW_PRIORITY LOCAL INFILE '[ruta].csv' REPLACE INTO TABLE [tabla] CHARACTER SET latin1 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;

Es importante tener en cuenta que la tabla debe existir previo a la inserción de datos.

Es importante que el archivo csv se encuentre en la misma ruta del servidor para que esta carga sea lo mas rápido posible


Felices lineas

220. 7zip en Linux

7zip ha probado ser una de las mejores herramientas para compresión de archivos, ¿Cómo descomprimo un archivo de 7zip en linux?

El proceso es sencillo, primero necesitamos instalar 7 zip en linux para esto seguimos la siguiente instrucción:

sudo apt-get install p7zip-full p7zip-rar

¿Como comprimimos?

 7z a [archivo_salida] [Ruta_archivos]

¿Como descomprimimos?

7z e [Ruta_archivo_comprimido]


Felices lineas

domingo, 6 de octubre de 2019

219. 2019-10-06T23:17:14.967072Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

El error


2019-10-06T23:17:14.967072Z mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists.

Al iniciar MySQL en modo seguro

sudo mysqld_safe --skip-grant-tables &


se soluciona creando la ruta que solicita el sistema de forma manual

sudo mkdir -p /var/run/mysqld

sudo chown mysql:mysql /var/run/mysqld

218. World-writable config file '/etc/mysql/docker-default.d/my.cnf' is ignored

Este error ocurre al estar trabajando con mySQL en Linux, al iniciar mySQL, se obtiene este error

World-writable config file '/etc/mysql/docker-default.d/my.cnf' is ignored

el error se debe a que el archivo no cuenta con los permisos adecuados, por lo que en la ruta

/etc/mysql

se debe ejecutar:

chmod 0444 my.cnf


Felices lineas

jueves, 1 de agosto de 2019

217. Convertir JSON a las clases correspondientes en C#

Json.Net se ha convertido en una biblioteca muy útil para poder hacer uso de JSON, entre las funciones de la biblioteca se encuentra el hecho de serializar y deserializar clases.

En este ejemplo vamos a suponer que tenemos un JSON y queremos serializarlo para poder manipularlo, ¿Cómo haremos esto? es sencillo, consideremos el siguiente JSON

[{"faceId":"bbb1c3d3-7e0b-4d03-826e-b5cef7afc660","faceRectangle":{"top":241,"left":271,"width":187,"height":187},"faceAttributes":{"smile":0.0,"headPose":{"pitch":-0.4,"roll":-2.2,"yaw":7.7},"gender":"male","age":40.0,"facialHair":{"moustache":0.6,"beard":0.4,"sideburns":0.1},"glasses":"ReadingGlasses","emotion":{"anger":0.0,"contempt":0.001,"disgust":0.0,"fear":0.0,"happiness":0.0,"neutral":0.984,"sadness":0.015,"surprise":0.0},"blur":{"blurLevel":"low","value":0.24},"exposure":{"exposureLevel":"goodExposure","value":0.66},"noise":{"noiseLevel":"low","value":0.01},"makeup":{"eyeMakeup":false,"lipMakeup":true},"accessories":[{"type":"glasses","confidence":0.99}],"occlusion":{"foreheadOccluded":false,"eyeOccluded":false,"mouthOccluded":false},"hair":{"bald":0.17,"invisible":false,"hairColor":[{"color":"brown","confidence":0.99},{"color":"black","confidence":0.81},{"color":"gray","confidence":0.31},{"color":"blond","confidence":0.25},{"color":"red","confidence":0.13},{"color":"other","confidence":0.09}]}}}]

El primer paso es obtener las clases correspondientes a el, esto lo podemos hacer de forma manual o entrar en la pagina:

http://json2csharp.com/

Y en esta pagina vamos a colocar el JSON generándonos las clases necesarias

public class FaceRectangle
{
    public int top { get; set; }
    public int left { get; set; }
    public int width { get; set; }
    public int height { get; set; }
}

public class HeadPose
{
    public double pitch { get; set; }
    public double roll { get; set; }
    public double yaw { get; set; }
}

public class FacialHair
{
    public double moustache { get; set; }
    public double beard { get; set; }
    public double sideburns { get; set; }
}

public class Emotion
{
    public double anger { get; set; }
    public double contempt { get; set; }
    public double disgust { get; set; }
    public double fear { get; set; }
    public double happiness { get; set; }
    public double neutral { get; set; }
    public double sadness { get; set; }
    public double surprise { get; set; }
}

public class Blur
{
    public string blurLevel { get; set; }
    public double value { get; set; }
}

public class Exposure
{
    public string exposureLevel { get; set; }
    public double value { get; set; }
}

public class Noise
{
    public string noiseLevel { get; set; }
    public double value { get; set; }
}

public class Makeup
{
    public bool eyeMakeup { get; set; }
    public bool lipMakeup { get; set; }
}

public class Occlusion
{
    public bool foreheadOccluded { get; set; }
    public bool eyeOccluded { get; set; }
    public bool mouthOccluded { get; set; }
}

public class HairColor
{
    public string color { get; set; }
    public double confidence { get; set; }
}

public class Hair
{
    public double bald { get; set; }
    public bool invisible { get; set; }
    public List<HairColor> hairColor { get; set; }
}

public class FaceAttributes
{
    public double smile { get; set; }
    public HeadPose headPose { get; set; }
    public string gender { get; set; }
    public double age { get; set; }
    public FacialHair facialHair { get; set; }
    public string glasses { get; set; }
    public Emotion emotion { get; set; }
    public Blur blur { get; set; }
    public Exposure exposure { get; set; }
    public Noise noise { get; set; }
    public Makeup makeup { get; set; }
    public List<object> accessories { get; set; }
    public Occlusion occlusion { get; set; }
    public Hair hair { get; set; }
}

public class RootObject
{
    public string faceId { get; set; }
    public FaceRectangle faceRectangle { get; set; }
    public FaceAttributes faceAttributes { get; set; }
}


Estas clases las agregamos a nuestro proyecto.

Ahora únicamente efectuamos esta llamada

List<RootObject> caras= JsonConvert.DeserializeObject<List<RootObject>>(contentString);


Felices lineas

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

viernes, 28 de junio de 2019

208. Cognitive Services (II)

Este post no es realmente cognitive services, pero es de algo que es necesario para poder usar cognitive services visión, es el uso de la web cam, en la PC, para ello el proceso es el siguiente:

1. Para poder usar la cámara web vamos a usar una librería de nuget llamada OpenCvSharp3-AnyCPU.


2. Una vez que se seleccione, vamos a agregar los controles de visualización y reporduccion


3. Agregaremos el siguiente metodo, este se encarga dibujar la imagen en el control

VideoCapture capture;
 Mat frame;
 Bitmap image;
 private Thread camera;

 private void CaptureCameraCallback()
        {
            frame = new Mat();
            capture = new VideoCapture(0);
            capture.Open(0);
            if (capture.IsOpened())
            {
                while (isCameraRunning)
                {
                    capture.Read(frame);
                    image = BitmapConverter.ToBitmap(frame);
                    if (pictureBox1.Image != null)
                    {
                        pictureBox1.Image.Dispose();
                    }
                    pictureBox1.Image = image;
                }
            }
        }

4. Se hace una llamada para iniciar la captura

private void CaptureCamera()
        {
            camera = new Thread(new ThreadStart(CaptureCameraCallback));
            camera.Start();
        }



Con esto ya tenemos el insumo necesario para poder iniciar la captura

Felices Lineas

miércoles, 26 de junio de 2019

207. Cognitive Services (I)

Hola, hoy vamos a aprender a crear un servicio en Azure para poder utilizar Cognitive Services, para ello necesitamos hacer lo siguiente:

1. Abrir el portal de Azure

2. En el Market Place buscar cognitive services


3. Presione el botón crear


4. Nos pedirá los siguientes datos

Nombre : El nombre que llevara nuestro servicio
Suscripción : El tipo de suscripción que emplearemos para el servicio
Ubicación : Cual será el datacenter en el que pondremos el servicio
Plan tarifa : El tipo de plan (equipo - peticiones ) sobre la que pondremos nuestro servicio
Grupo de recursos : El grupo en el que agruparemos este recurso en Azure

Aceptamos las condiciones del servicio

5. Presionamos el botón crear.

6. El servicio se habrá cargado satisfactoriamente
7. Verificamos el servicio


Por hoy eso es todo, hasta el próximo numero

y recuerden La mano invisible domina al mundo.








miércoles, 5 de junio de 2019

206. Obtener el audio de un video C#


El siguiente código es muy útil ya que nos permite extraer el sonido de un video, una gota mas de código para este acordeon.


        static void Main(string[] args)
        {

            var inputFile = new MediaFile { Filename = args[0] };
            var outputFile = new MediaFile { Filename = args[1] };

            using (var engine = new Engine())
            {
                engine.GetMetadata(inputFile);

                engine.Convert(inputFile, outputFile);
            }
        }



Felices líneas

martes, 4 de junio de 2019

205. Escaneo de puertos

Esta es una técnica de reconocimiento, cuando un programa va a conectarse con otro, debe abrir un puerto, por este puerto la información va a entrar y salir.

Ahora bien, existe una serie de puertos que ya se encuentran ligados a servicios.

Aprovechando la comunicación en los puertos, un atacante puede enviar ciertos comandos a los puertos, cuando se conoce el programa que lo usa esto es mas fácil.

Entonces una vez que se tiene un puerto abierto, se puede explotar el acceso y si este no esta protegido o no tiene la seguridad adecuada se puede hacer que se ejecuten actividades no esperadas dentro del equipo de computo.

Entre la lista de los puertos mas comunes se encuentran

HTTP: puerto 80;
HTTPS: puerto 443;
FTP: puerto 21;
FTPS/SSH: puerto 22;
POP3: puerto 110
POP3 SSL: puerto 995
IMAP: puerto 143
IMAP SSL: puerto 993
SMTP: puerto 25 (alternativas: puerto 26 / puerto 2525)
SMTP SSL: puerto 587
MySQL: puerto 3306
CPanel: puerto 2082
CPanel SSL: puerto 2083
WHM (Webhost Manager): puerto 2086
WHM (Webhost Manager) SSL: puerto 2087
Webmail: puerto 2095
Webmail SSL: puerto 2096
WebDAV/WebDisk: puerto 2077
WebDAV/WebDisk SSL: puerto 2078



Felices lineas

204. DDos Distributed Denial of Service

Ya tenia un tiempo que no tocaba este tema, pero como lo mencione en su momento, si no conocemos los tipos de ataques informáticos que existen, no tenemos defensa contra ellos.

Y si no sabemos ejecutarlos, no podemos contrarrestarlos.

Hoy vamos a platicar de DDos, este es un tipo de ataque de denegación de servicio, con este el atacante usa vulnerabilidades en computadoras que se encuentran en una red para tomar el control de ellas, una vez que el atacante tiene el control de varias computadoras, el atacante envía grandes cantidades de información desde todos los equipos que ya controla a un sitio web, o envía una gran cantidad de correos electrónicos a un servidor.

El ataque puede ser complicado de detener ya que la información corrupta puede venir de equipos que se consideran seguros.

Para detenerlo, podemos aplicar filtros al router, bloquear direcciones IP, política de control de contraseñas, antivirus.



Felices lineas

203. Descargar un video de youtube con C#

Este codigo es muy sencillo, pero muy útil cuando se requiere conservar una serie de videos que se encuentran en la plataforma YouTube.

Para poder descargar un video primero debemos instalar el paquete nuget llamado

VideoLibrary

Una vez que tenemos instalado el paquete, escribiremos el siguiente codigo

 static void Main(string[] args)
        {
            Console.WriteLine("Este programa emplea un parametros, la ruta del video ");

            var videodescarga= YouTube.Default;
            var videodescargado= videodescarga.GetVideo(args[0]);
            File.WriteAllBytes(videodescargado.FullName, vid.GetBytes());
        }


Como pueden observar el código es muy sencillo, ya que establece primero la fuente de donde obtendremos el video

var videodescarga= YouTube.Default;

Obtiene el video

var videodescargado= videodescarga.GetVideo(args[0]);

y escribe el video en una ruta

File.WriteAllBytes(videodescargado.FullName, vid.GetBytes());



La mano invisible controla el mundo

miércoles, 29 de mayo de 2019

202. Modo Dios Windows 10

Para activar el modo dios en Windows 10, es necesario crear una carpeta nueva, y esta carpeta debe tener el siguiente nombre

GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}

Con  esto esa carpeta tendrá acceso a todas las opciones de configuracion


La mano invisible controla el mundo

sábado, 4 de mayo de 2019

201. Buscar todas las direcciones ip de una red desde una mac

Para obtener todos los dispositivos que se encuentran en es necesario abrir una terminal y ejecutar el siguiente comando

arp -a

Para poder determinar cual es el la dirección ip de una mac, la instruccion es

ifconfig

la mano invisible controla el mundo

jueves, 2 de mayo de 2019

200. Licencias

Hola:

El video de esta semana en youtube es sobre licencias opensource les dejo el link


https://www.youtube.com/watch?v=BatrNsN8i5g

Por cierto llegamos al post 200 de este Blog !!!!!!!!

Felices lineas

miércoles, 1 de mayo de 2019

199. Derivar e integrar con R

Derivar una expresión con R, es muy sencillo, para ello debemos hacer lo siguiente:

La expresión a derivar debe almacenarse en una variable de tipo expression

> n<-expression(x^2)

la función x^2 será la que se derive

la instrucción para derivar es D

> D(n,"x")



En esta linea se indica que la expresión que se encuentra en n se derivara con respecto a x.

La expresión a derivar debe almacenarse en una variable de tipo funtion

> x1<-function(x) x^2

Para integrar

> integrate(x1,0,100)

donde x1 es la función, 0 el limite inferior y 100 el superior


Felices lineas


martes, 30 de abril de 2019

198. Obtener la lista de mis maquinas virtuales desde Azure Cloud Shell

En el post anterior vimos como crear una maquina virtual en Azure, esta vez vamos a ver desde la linea de comando de Azure Cloud Shell, como saber que maquinas virtuales tenemos.

Para ello emplearemos el siguiente comando

az vm list --output table

el parámetro output es importante, por que nos ayuda a visualizar la información, este comando nos muestra las maquinas virtuales que tenemos en azure y la ubicación de las mismas



Felices lineas

197. Crear una maquina virtual de azure por medio de Azure Cloud Shell

Una de las características que posee Azure, es la capacidad de crear infraestructura como servicio, el servicio mas basico que se puede crear en Azure es una maquina virtual, vamos a crear una maquina virtual, pero desde linea de comandos.

¿Por que hacerla desde linea de comandos?

La principal razón, la maquina siempre se crea igual ademas de que de una manera sencilla se puede crear un nuevo ambiente

Para hacer esto se emplea la siguiente instrucción

az vm create
  --name [Nombre_de_la_Maquina_Virtual]
  --resource-group [Grupo_al_que_pertenece]
  --image [Imagen_de_azure]
  --size [Tamaño]
  --location [Ubicacion_cluster]
  --admin-username [UsuarioAdministrador]
  --admin-password [Password]

ejemplo

az vm create \
  --name MaquinaVirtual \
  --resource-group XXXXXXXXXX \
  --image Win2016Datacenter \
  --size Standard_DS2_v2 \
  --location eastus \
  --admin-username usuario \
  --admin-password aabbcc22


Felices lineas

196. Open SSL Password

Los passwords hoy en día son uno de los puntos más débiles en la seguridad informática, dado que estos, se encuentran influenciados por el usuario que los crea.

Una forma de crear estos es por medio de openssl, este da la herramienta para poder generarlos de una manera aleatoria, para ello empleamos la siguiente instrucción:

openssl rand base64 [cantidad_de_caracteres]

Ejemplo


La mano invisible controla al mundo