Pop

Curso .NET Core en C# - 7.Como servir fichero estáticos

7.Como servir fichero estáticos

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  •  En el vídeo veremos como nuestra aplicación ASP.NET Core podrá empezar a servir ficheros estáticos.Por defecto, una aplicación ASP.NET Core no servirá este tipo de archivos. El directorio predeterminado para archivos estáticos es wwwroot y este directorio debe estar en la carpeta del proyecto raíz.Como el proyecto no lo tiene lo creamos.
  • Una vez hecho esto copiamos una imagen y creamos un archivos html. Si probamos a ejecutar el programa todavía no  veo la imagen ni el html. Esto se debe a que, en este momento, nuestro proceso de procesamiento de solicitudes de aplicaciones no tiene el software intermedio requerido que puede servir archivos estáticos. El middleware que necesitamos es UseStaticFiles () middleware.
  • En el vídeo tenemos la explicación al completo:
  • Os dejo parte del código visto en el vídeo para poder navegar al documento  nodefault.html:

   public void Configure(IApplicationBuilder app, IHostingEnvironment env )
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            DefaultFilesOptions d = new DefaultFilesOptions();
            d.DefaultFileNames.Clear();
            d.DefaultFileNames.Add("nodefault.html");

            app.UseDefaultFiles(d);
            app.UseStaticFiles();
          
            app.Run(async (context) =>
            {
               await context.Response.WriteAsync(" Metodo run ");
            });

         
        }

Chatbot con inteligencia artifical en tensorflow (4/4)

4. Chatbot con inteligencia artifical  en tensorflow 

  • Hola a todos.En esta ocasión finalizamos con nuestro tutorial para crear y entrenar  nuestro propio chatbot  que se comportará con inteligencia artificial. Para crear un chatbot, o para hacer cualquier tipo de tarea de aprendizaje automático, el primer trabajo que tenemos que hacer es adquirir datos para el entrenamiento.Después  necesitamos  estructurarlos y prepararlos para que se formateen para "la entrada" y "la salida"para que un algoritmo de aprendizaje automático puede digerir. 
  • Una vez tenemos los ficheros necesarios para el entrenamiento, generados en el capítulo anterior. Estamos en disposición de entrenar nuestro modelo. Para entrenar el modelo hago uso del siguiente código alojado en github: https://github.com/daniel-kukiela/nmt-chatbot
  • En el siguiente vídeo podemos ver como configurar el fichero settings para entrenar nuestro modelo.Además podemos ver las primeras interacciones con nuestro chatbot ya entrenado:

  • Como ya habéis visto en el vídeo nuestro chatbot está ingles.Esto es debido al origen de datos que hemos utilizado para el entrenamiento. Además podemos mejorar la "inteligencia" de nuestro chatbot con mayor tiempo de entrenamiento. En mi caso solo entrene al modelo con un mes de todos los disponibles en nuestro origen de datos, que recuerdo fueron los mensajes en los foros de reddit.



Curso .NET Core en C# - 6.Conociendo el Middleware(2)

6.Conociendo el Middleware(2)

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • Después de ver la teoría sobre el funcionamiento del middleware.En este vídeo vamos a practicar un poco.Para ello nos vamos al método Configure, donde podemos configurar el camino que seguirán las diferentes peticiones que tenga la aplicación.
  • Ahora mismo en la clase startup las peticiones pueden seguir dos caminos:
    • UseDeveloperExceptionPage(): esta ruta responde con la página de excepciones para desarrolladores, si existe una excepción y si el entorno es Development
    •  Método Run(): Este es el middleware que responde a cada solicitud.
  • En el vídeo podéis ver como añadir otros posibles caminos:

  • Finalmente el método configure tendrá un aspecto similar a este:
  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILogger <Startup> logger )
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Use(async (context,next) =>
            {
                logger.LogInformation("xxxxxxxxx");
                await context.Response.WriteAsync(" Camino 1 ");
                await next();
            });

            app.Use(async (context, next) =>
            {
                logger.LogInformation("yyyyyyyyy");
                await context.Response.WriteAsync(" Camino 2 ");
                await next();
            });

            app.Run(async (context) =>
            {
                logger.LogInformation("zzzzzzzzzzzzzzz");
                await context.Response.WriteAsync(" Camino 3");
            });
        }

Curso .NET Core en C# - 5.Conociendo el Middleware

5.Conociendo el Middleware

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • El software intermedio es un software que se ensambla en una canalización de una aplicación para controlar las solicitudes y las respuestas. Cada componente puede hacer lo siguiente:
    • Elegir si se pasa la solicitud al siguiente componente de la canalización.
    • Realizar trabajos antes y después del siguiente componente de la canalización.
  • Los delegados de solicitudes se configuran con los métodos de extensión Run, Map y Use.  La canalización de solicitudes de ASP.NET Core consiste en una secuencia de delegados de solicitud a los que se llama de uno en uno. En el siguiente vídeo lo vemos:
  • Como resumen del vídeo podemos decir que:
    • RUN: La aplicación ASP.NET Core más sencilla posible configura un solo delegado de solicitudes que controla todas las solicitudes. 
    • USE:Podemos encadenar  delegados de solicitudes con Use. 
    • MAP: Las extensiones Map se usan como convenciones para la creación de ramas en la canalización

Chatbot con inteligencia artifical en tensorflow (3/4)

3. Chatbot con inteligencia artifical  en tensorflow 

  • Hola a todos.En esta ocasión continuamos con nuestro tutorial para crear y entrenar  nuestro propio chatbot  que se comportará con inteligencia artificial. Para crear un chatbot, o para hacer cualquier tipo de tarea de aprendizaje automático, el primer trabajo que tenemos que hacer es adquirir datos para el entrenamiento.Después  necesitamos  estructurarlos y prepararlos para que se formateen para "la entrada" y "la salida"para que un algoritmo de aprendizaje automático puede digerir. 
  • Una vez que tenemos la base datos preparada,según vimos en la entrada anterior. Podemos generar los ficheros necesarios para el entrenamiento de nuestro modelo. Crearemos dos archivos que tengan preguntas y respuestas. Para ello tomaremos los datos  de la base de datos y adjuntarlos en los archivos de entrenamiento respectivos.
  • En el siguiente vídeo explico el código necesario para hacer esto:
  • Os dejo el código visto en el vídeo:

import sqlite3
import pandas as pd

#En mi caso trabajo con un solo més.En este caso el marzo de 2015
timeframes = ['2015-03']


for timeframe in timeframes:
    connection = sqlite3.connect('{}.db'.format(timeframe))# conectamos a la base de datos
    c = connection.cursor()
    limit = 5000 #numero de registros que obtenemo de la base de datos en la consulta
    last_unix = 0
    cur_length = limit
    counter = 0 # contador para 
    test_done = False # boleano que nos indica cuando hemos  terminado

    while cur_length == limit:

        df = pd.read_sql("SELECT * FROM parent_reply WHERE unix > {} and parent NOT NULL and score > 0 ORDER BY unix ASC LIMIT {}".format(last_unix,limit),connection)
        last_unix = df.tail(1)['unix'].values[0]
        cur_length = len(df)

        if not test_done:
            with open('test.from','a', encoding='utf8') as f:
                for content in df['parent'].values:
                    f.write(content+'\n')

            with open('test.to','a', encoding='utf8') as f:
                for content in df['comment'].values:
                    f.write(str(content)+'\n')

            test_done = True

        else:
            with open('train.from','a', encoding='utf8') as f:
                for content in df['parent'].values:
                    f.write(content+'\n')

            with open('train.to','a', encoding='utf8') as f:
                for content in df['comment'].values:
                    f.write(str(content)+'\n')

        counter += 1
        if counter % 20 == 0:
            print(counter*limit,'rows completed so far')

Curso .NET Core en C# - 4.Analizamos los ficheros de configuración

4.Analizamos nuestra primera aplicación

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • En este nuevo capítulo analizamos los ficheros de configuración launchsettings.json y el fichero appsettings.json. El fichero launchsettings está en la carpeta propiedades.Este archivo solo se utiliza en la máquina de desarrollo local. En el fichero appsettings guardaremos la configuración de la aplicación. En versiones anteriores de ASP.NET, almacenábamos los ajustes de configuración de la aplicación, como cadenas de conexión de base de datos en el archivo web.config. 
  • En el vídeo os explico con más detalles estos archivos de configuración:

  • Los ficheros de configuración de vuestras aplicaciones tendrán una apariencia similar a esto:
{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:51775",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Ejemplo1": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Curso .NET Core en C# - 3.Analizamos nuestra primera aplicación

3.Analizamos nuestra primera aplicación

  • Hola a todos. En este nuevo curso, analizaremos todos los conceptos básicos, intermedios y avanzados de ASP.NET Core que nos ayudan a crear aplicaciones web basadas en datos.Al final de este curso, podremos realizar todas las operaciones de un CRUD, es decir, crear, leer, actualizar y eliminar datos  utilizando SQL Server como nuestra base de datos.
  • Terminamos el anterior vídeo creando una aplicación web vacía. En este vamos a analizar el significado del método Main() en una aplicación Core de ASP.NET. Si tienes experiencia con versiones anteriores de .NET, una aplicación de consola tiene un método Main() y es el punto de entrada de esa aplicación de consola.El punto importante a tener en cuenta es que, inicialmente, una aplicación Core de  asp.net se inicia como una aplicación de consola.
  • En el siguiente vídeo explicamos el funcionamiento básico de las aplicaciones CORE de ASP.NET: 
  • Os dejo el código de un par de clases vistas en el vídeo:
    • Clase Program:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Ejemplo1
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    }
}

    • Clase Startup:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace Ejemplo1
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync(System.Diagnostics.Process.GetCurrentProcess().ProcessName);
            });
        }
    }
}

Chatbot con inteligencia artifical en tensorflow (2/4)

2. Chatbot con inteligencia artifical  en tensorflow 

  • Hola a todos.En esta ocasión continuamos con nuestro tutorial para crear y entrenar  nuestro propio chatbot  que se comportará con inteligencia artificial. Para crear un chatbot, o realmente hacer cualquier tipo de tarea de aprendizaje automático, el primer trabajo que tenemos que hacer es adquirir datos para el entrenamiento.Después  necesitamos  estructurarlos y prepararlos para que se formateen para "la entrada" y "la salida"para que un algoritmo de aprendizaje automático puede digerir. 
  • En esta entrada explicaremos el código necesario para volcar el contenido de los ficheros que descargamos en el capítulo anterior en una base datos. La idea es preparar la estructura de la  base de datos para poder generar posteriormente los ficheros necesarios para entrenar nuestro modelo.
  • En el siguiente vídeo explico el código que utilizamos para alcanzar nuestro propósito:
  • Os dejo el código visto en el vídeo:
#Cargamos librerias necesarias
import sqlite3
import json
from datetime import datetime
import time

#De todos los meses disponibles en los datos del torrent de de reddit elijo marzo de  2015
timeframe = '2015-03'
sql_transaction = []
start_row = 0
cleanup = 1000000

#vamos a almacenar los datos en un una BBDD sqlLite
connection = sqlite3.connect('{}.db'.format(timeframe))
c = connection.cursor()

#Nos creamos una función para crear la tabla donde guardamos los campos que nos interesan del #JSON. En este caso son:
def create_table():
    c.execute("CREATE TABLE IF NOT EXISTS parent_reply(parent_id TEXT PRIMARY KEY, comment_id TEXT UNIQUE, parent TEXT, comment TEXT, subreddit TEXT, unix INT, score INT)")

#Función para formatear los datos que vamos leyendo
def format_data(data):
    data = data.replace('\n',' newlinechar ').replace('\r',' newlinechar ').replace('"',"'")
    return data

# Esta función se utiliza para crear sentencias de inserción y confirmarlas en grupos
# en lugar de hacer que inserte uno a uno
def transaction_bldr(sql):
    global sql_transaction
    sql_transaction.append(sql)
    if len(sql_transaction) > 1000:
        c.execute('BEGIN TRANSACTION')
        for s in sql_transaction:
            try:
                c.execute(s)
            except:
                pass
        connection.commit()
        sql_transaction = []

#función que actualiza el comentarios en nuestra BBDD sqlLite
def sql_insert_replace_comment(commentid,parentid,parent,comment,subreddit,time,score):
    try:
        sql = """UPDATE parent_reply SET parent_id = ?, comment_id = ?, parent = ?, comment = ?, subreddit = ?, unix = ?, score = ? WHERE parent_id =?;""".format(parentid, commentid, parent, comment, subreddit, int(time), score, parentid)
        transaction_bldr(sql)
    except Exception as e:
        print('s0 insertion',str(e))

#Funcion que guarda en BBDD un comentario que tiene padre
def sql_insert_has_parent(commentid,parentid,parent,comment,subreddit,time,score):
    try:
        sql = """INSERT INTO parent_reply (parent_id, comment_id, parent, comment, subreddit, unix, score) VALUES ("{}","{}","{}","{}","{}",{},{});""".format(parentid, commentid, parent, comment, subreddit, int(time), score)
        transaction_bldr(sql)
    except Exception as e:
        print('s0 insertion',str(e))
        
#Funcion que guarda en BBDD un comentario que no tiene padre
def sql_insert_no_parent(commentid,parentid,comment,subreddit,time,score):
    try:
        sql = """INSERT INTO parent_reply (parent_id, comment_id, comment, subreddit, unix, score) VALUES ("{}","{}","{}","{}",{},{});""".format(parentid, commentid, comment, subreddit, int(time), score)
        transaction_bldr(sql)
    except Exception as e:
        print('s0 insertion',str(e))

#Solo guardamos los comentarios cuyo tamaño sea válido para el entrenamiento
def acceptable(data):
    if len(data.split(' ')) > 1000 or len(data) < 1:
        return False
    elif len(data) > 32000:
        return False
    elif data == '[deleted]':
        return False
    elif data == '[removed]':
        return False
    else:
        return True

#Función que encuentra el padre de un comentario dado
def find_parent(pid):
    try:
        sql = "SELECT comment FROM parent_reply WHERE comment_id = '{}' LIMIT 1".format(pid)
        c.execute(sql)
        result = c.fetchone()
        if result != None:
            return result[0]
        else: return False
    except Exception as e:
        #print(str(e))
        return False

#Función que nos da la puntuación de un comentario dado
def find_existing_score(pid):
    try:
        sql = "SELECT score FROM parent_reply WHERE parent_id = '{}' LIMIT 1".format(pid)
        c.execute(sql)
        result = c.fetchone()
        if result != None:
            return result[0]
        else: return False
    except Exception as e:
        #print(str(e))
        return False
    
if __name__ == '__main__':
    create_table() #Empezamos creando la tabla sobre la que almacenar los datos
    row_counter = 0 #Contador para ver en que parte del archivo estamos.Va contando las filas
    paired_rows = 0 #Contador que nos dice las filas que están emparejas.Pregunta con respuesta
    
#Abrimos la ubicación del archivo que nos iteresa y vamos lyendo filas
     with open('D:/reddit/RC_{}'.format(timeframe), buffering=1000) as f:
        for row in f:
            #print(row)
            #time.sleep(555)
            row_counter += 1
            #vamos obtiendo los datos quqe nos interesan de cada fila
            if row_counter > start_row:
                try:
                    row = json.loads(row)
                    parent_id = row['parent_id'].split('_')[1]
                    body = format_data(row['body'])
                    created_utc = row['created_utc']
                    score = row['score']
                    comment_id = row['id']
                    subreddit = row['subreddit']
    
                    #Todos los comentarios inicialmente no tendrán un padre. 
                    #Sin embargo, a medida que avanzamos en el documento, encontraremos 
                    #comentarios que tienen padres que tenemos en nuestra base de datos. 
                    #Cuando esto sucede, queremos agregar este comentario al padre existente. 
                    parent_data = find_parent(parent_id)
                    
                    existing_comment_score = find_existing_score(parent_id)
                    
                    #Si existe un comentario asociado al padre con mejor puntuación reemplazamos
                    #el comentario existente.
                    #En el caso que el comentario no tenga padre se inserta
                    if existing_comment_score:
                        if score > existing_comment_score:
                            if acceptable(body):#validamos el tamaño
                                sql_insert_replace_comment(comment_id,parent_id,parent_data,body,subreddit,created_utc,score)
                                
                    else:
                        if acceptable(body):
                            if parent_data:
                                if score >= 2:#solo tratamos comentarios con más de dos votos
                                    sql_insert_has_parent(comment_id,parent_id,parent_data,body,subreddit,created_utc,score)
                                    paired_rows += 1
                            else:
                                sql_insert_no_parent(comment_id,parent_id,body,subreddit,created_utc,score)
                except Exception as e:
                    print(str(e))
                    
            #Muestro por pantalla cada 100000 filas                
            if row_counter % 100000 == 0:
                print('Total Rows Read: {}, Paired Rows: {}, Time: {}'.format(row_counter, paired_rows, str(datetime.now())))
            
            #Finalmente borrmos los comentarios que no tengan padre cada 100000 lineas #procesadas
            if row_counter > start_row:
                if row_counter % cleanup == 0:
                    print("Cleanin up!")
                    sql = "DELETE FROM parent_reply WHERE parent IS NULL"
                    c.execute(sql)
                    connection.commit()
                    c.execute("VACUUM")
                    connection.commit()

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...