lunes, 31 de diciembre de 2018

173. Instalar apache en linux

Instalar apache como servidor web es muy sencillo, solo es nacesaria la ejecucion de un estos comandos

1. sudo apt update
2. sudo apt install apache2

ahora el servicio se puede manipular con

sudo systemctl stop apache2.service
sudo systemctl start apache2.service
sudo systemctl enable apache2.service

para probar el servicio solo es necesario llamarlo como localhost desde el navegador

La mano invisible controla el mundo

172. Actualización de privilegios de MySQL

Una vez instalado MySQL es necesario actualizar los privilegios de la aplicación, esto para que se pueda iniciar correctamente y para que sea posible generar el password de root.

Para ello, hay que seguir la siguiente secuencia:

1. sudo chown mysql:adm /var/log/mysql/error.log
2. sudo chown mysql:adm /var/log/mysql
3. sudo chown root:syslog /var/log
4. sudo chown root:root /var
5. sudo chmod 0640 /var/log/mysql/error.log
6. sudo chmod 0750 /var/log/mysql
7. sudo chmod 0775 /var/log
8. sudo chmod 0755 /var
9. sudo mkdir -p /var/run/mysqld
10. sudo chown mysql:mysql /var/run/mysqld


La mano invisible domina el mundo

171. Hacer un ping a todas las direcciones IP de una red local, desde Windows

Algunas veces es necesario buscar que direcciones ip están contestando en una red local, para ello emplearemos el siguiente comando.

Lo que efectúa el comando es un ciclo hacia el rango de IP que indiquemos, dejando el resultado en un archivo de texto.

Es muy util para saber que equipos se encuentran en una red local

for /L %i in (0,1,255) do ping -n 1 -w 250 192.168.1.%i >>ip.txt


La mano invisible domina el mundo

170. Reiniciar un Servidor Linux

La nube nos abre muchas posibilidades, una de ellas es el uso de servidores windows y linux de manera simultánea, dejando a cada sistema operativo sus aplicaciones y las que son mejores en cada uno, por ello es necesario que manejemos ambos.

La serie Linux, incluirá un conjunto de comandos, para poder administrar el servidor y aplicativos

Para poder efectuar el reinicio de un servidor la instrucción es:

shutdown -r +1 "El servidor se reiniciara en un minuto"

-r indica que sera un reinicio

+1 indica en cuanto tiempo se ejecutara la instrucción




La mano invisible gobierna el mundo 

domingo, 30 de diciembre de 2018

169. Instalar MySQL en Linux

El trabajo de un verdadero arquitecto, consisten en conocer toda la estructura del sistema de una organización, el es el director de orquesta, por esto mismo se deben tener conocimientos que abarquen los sistemas con los que trabaja una institución.

Los pasos para poder instalar MySQL en Linux son:

se deben ejecutar los siguientes comandos:

sudo apt-get update

sudo apt-get install mysql-server

ahora es necesario abrir el firewall para poder acceder a mysql desde un equipo externo para ello ejecutamos:

sudo ufw allow mysql

ahora es necesario iniciar el servicio para ello ejecutamos el siguiente comando

systemctl start mysql

de esta forma mysql inicia de manera manual, pero también es necesario que este inicie junto con el equipo, esta configuración se efectúa con el siguiente comando:

systemctl enable mysql

La mano invisible controla el mundo

viernes, 28 de diciembre de 2018

168. Land Attack

Local Area Network Denial Attack es un tipo de ataque que consiste en enviar un paquete falsificado a la computadora atacada, causando una caída de la misma.

Se envía un paquete de tipo TCP SYN sin embargo este paquete tiene la misma fuente y destino, esto hace que el equipo envíe este paquete sin cesar provocando una saturación del mismo.

Este tipo de ataque tenia su origen en una implementación del protocolo TCP, en equipos actuales este tipo de ataque ya no es posible.

La mano invisible controla el mundo

167. SYN flood

Este es otro tipo de ataque de denegacion de servicio, en este tipo de ataque el atacante envía una sucesión de solicitudes SYN al sistema blanco del ataque, la finalidad es consumir los recursos del servidor para que este no responda a peticiones reales.

Una SYN Request o petición SYN es una petición sobre TCP, en paquete contiene una bandera SYN que hace que el servidor responda al cliente con un paquete con la bandera SYN-ACK activa

La mano invisible controla el mundo

miércoles, 26 de diciembre de 2018

166. Smurf Attack

Este es un tipo de ataque de denegación de servicio, en este ataque se enviá una gran cantidad de paquetes ICMP a la dirección broadcast, todo los paquetes tienen una dirección de origen diferente, esto genera que se produzca un echo request en los broadcast, que se multiplica en cada una de las subredes.

Este ataque se controla por medio de la configuración del router. Por lo que un atacante pueda hacer daño a una organización por este medio, depende de la configuración de los routes de la organización.


La mano invisible controla el mundo


viernes, 21 de diciembre de 2018

165. Tear Drop Attack

So blanco es el protocolo TCP/IP se envían una serie de paquetes fragmentados, estos tienen gran tamaño y se encuentran traslapados, de tal forma que el servidor al momento de intentar reconstruir el paquete no sea capaz.

El proceso provoca fallos en el servidor, que eventualmente pueden provocar un reinicio del sistema.


La mano invisible controla el mundo

164.ICMP Flood o Inundación de ICMP

Este es el ataque mas comun y basico de denegacion de servicio, consiste en enviar de forma continua un gran numero de paquetes ICMP de gran tamaño de forma que al responder el servidor, este provoque una sobrecarga en la red de la victima.

Todos los servidores tienen un limite para poder contestar a peticiones, el objetivo de este ataque es superar ese limite, para que aquellos usuarios que realmente tengan acceso al servidor no puedan hacer uso de los servicios.

La mano invisible controla al mundo

163. Denegación de Servicio (dos)

Este tipo de ataque busca que los usuarios legítimos de un servicio no puedan hacer uso del mismo.

Este ataque es un ataque por fuerza bruta, ya que en su forma mas común, llena la red de peticiones lo que hace el el servidor no sea capaz de contestar a todas las peticiones, y deje a los usuarios reales fuera del servicio a consumir, sin embargo este no es el único tipo de ataque de denegación de servicio, podemos mencionar los siguientes tipos de ataque:


  1. ICMP Flood Attack
  2. Tear Drop Attack
  3. Smurf Attack
  4. Syn Flood
  5. Land Attack
  6. Jolt Dos Attack
  7. Fraggle Dos Attack

La mano invisible controla el mundo





jueves, 20 de diciembre de 2018

162. Virus

Los virus informáticos pueden ser la forma de malware mas conocidas, por un lado por la serie de leyendas que giran alrededor de ellos, leyendas que les llegan a dar propiedades fantásticas, por otro por la excesiva publicidad que existe de las medidas de control contra los mismos.

Todo lo que es programado siempre esta abierto a tener errores, y esas vulnerabilidades son las que explotan los creadores de virus.

Los virus nacieron como una travesura de los primeros informáticos, programas capaces de modificar a otros y hacer una broma al usuario, poco a poco estos se convirtieron en herramientas para crear caos cuya unica finalidad es destruir el sistema en el que se ejecutan.

El virus añade su código al programa infectado, y desde ahí se ejecutan, los virus no son capaces de replicarse a si mismos.

El virus puede continuar ejecutándose aun cuando el programa que lo contenía ya no este en ejecución


La mano invisible gobierna el mundo

161. Gusano

Un gusano es un Malware muy peligroso, dado que tiene la posibilidad de replicarse a si mismo, los gusanos tienen la capacidad de distribuirse rápidamente de una computadora a otra por medio de una red de computo.

Un equipo infectado puede infectar rápidamente a miles de equipos.

Los gusanos se almacenan en memoria, y emplean procesos del sistema operativo para replicarse, en caso de que no logren infectar otros equipos, los gusanos tienden a acabar con el ancho de banda de la red de computo en la que esta el equipo infectado.

Los firewall son la mejor defensa contra los gusanos.

La mano invisible gobierna el mundo

160. Troyanos

Un troyano es un programa que aparenta ser otro, un programa que se muestra como un programa que el usuario conoce, pero que por dentro ejecuta actividades a espaldas del usuario.

Estos fueron creados para hacer el mayor daño posible, dado que pueden ejecutarse incluso con privilegios de administrador, privilegios que el propio usuario entrega.

Los troyanos, tienen varias aplicaciones, como son software espía, software de control, ejecución de procesos, instalación de programas, borrado de información, etc.

La forma mas común de infectarse es al instalar software de dudosa procedencia.


La mano invisible gobierna el mundo

159. Spyware

Seguimos con la lista de ataques a los que estamos expuestos, no todo en la vida es un virus.

Spyware, Es un programa espía, su finalidad es recopilar información sobre el sistema, sobre el usuario, asi como enviar esta información a los creadores del mismo que se encuentran fuera de sistema.

Los Spyware pueden ser silenciosos al no mostrar su parecencia, o no silenciosos al mostrarse por medio de pantallas emergentes o de cambios en la configuración del sistema


La mano invisible controla el mismo

jueves, 13 de diciembre de 2018

158. Adware

Adware es un tipo de Malware publicitario, muestra publicidad no deseada, el malware puede venir acompañado de software útil.

Este también es un tipo de software espía, ya que ademas analiza y obtiene los hábitos de consumo del usuario.

Algunos tipos de malware forzan el uso de algún tipo de aplicativo, como aquellos que cambian la pagina de inicio de un navegador o forzan a que se ocupe un motor de búsqueda en especifico


La mano invisible controla el mundo

157. Ransomware

Este tipo de ataques ha estado muy de moda últimamente, estos destacan sobre otros por que atacan no solo a grandes corporaciones, sino a pequeños usuarios.

El ataque consiste en secuestrar la PC y pedir un rescate por ella.

El usuario se ve imposibilitado a acceder a su información, en muchas ocasiones esta queda encriptada, y la clave de des encripcion esta en manos del atacante, quien amenaza que si no se hace el pago borrara la información.

Ejemplos de Ransomware son: WannaCry, Petya, Cerber, Cryptolocker

La forma mas común de contaminarse es por medio de correo electrónico



La mano invisible controla el mundo

miércoles, 5 de diciembre de 2018

156. Malware

Es el tipo de ataque mas conocido, ¿Por que?, por que los virus son parte de este ataque, para detenerlos, es necesario tener una cultura de la seguridad informática, entrar a sitios seguros, no abrir enlaces desconocidos, no conectar dispositivos externos dudosos.

Desde el inicio de la era de la informática ha existido malware, y pese a la existencia de cajas de arena (espacios aislados en el sistema para evitar la distribución y ejecución de malware), ningun sistema es infalible, al ser programado siempre puede tener errores, y por ahi entrar el malware.

Existen varios tipos de malware, entre estos tenemos:

  • Virus
  • Gusanos
  • Troyanos
  • Spyware
  • Adware
  • Ransomware
La mano invisible gobierna al mundo

martes, 4 de diciembre de 2018

155. Escalonamiento de privilegios

Una vez dentro del sistema, si este se encuentra protegido, no se puede hacer nada, en estos casos el atacante busca obtener privilegios mayores en el sistema para poder convertirse en el administrador del mismo.

Para esto se analizan vulnerabilidades previamente conocidas, algunas veces estos privilegios se pueden obtener de los sitios web, ya que existe la mala practica de no encriptar los datos sensibles en los archivos de configuración.

La mano invisible gobierna al mundo.

154. Ingeniería social

En este tipo de ataque somos responsables todos los que tenemos acceso a un sistema, la ingeniería social en engañar a los usuarios legítimos para obtener acceso al sistema o datos para acceder al mismo.

Existen muchas técnicas para obtener información valiosa, estas pueden ser desde fingir ser otra persona, un cliente, un empleado, un gerente, que requiere acceso al sistema, llamando a soporte o a alguien que puede dar los accesos.

Investigar las redes sociales con el fin de obtener respuestas a las preguntas secretas, o dar información creíble al contactar al usuario.

Phising: envió de correos apócrifos, en los que se solicita información.

Vishing: llamadas telefónicas en forma de encuestas.

Baiting: dejar un dispositivo en un lugar de fácil acceso para que el usuario lo conecte a su pc, ejemplo usb.

Quid pro quo: llamar a números aleatorios de la empresa fingiendo ser soporte técnico, hasta encontrar una persona que requiera el soporte, y por este medio obtener los accesos al sistema.

Como verán en este ataque son vulnerables todos los usuarios de la empresa.


La mano invisible gobierna el mundo

.

153. Backdoor

Las puertas traseras, puede ser un ataque, puede ser un error de seguridad o puede ser un acceso al sistema que fue dejado apropósito.

Una puerta trasera, es como un camino secreto de entrada, que solo el desarrollador o un conjunto de ellos conoce, esta puerta da control del sistema, la mayoría de las veces saltando la seguridad del mismo.

La puerta puede ser instalada en el sistema por medio de un troyano, este se recibe en un correo electrónico por ejemplo, su labor es instalar una puerta que permita el acceso al equipo o a algun programa.

En algunos casos un error de programación, deja partes del programa sin proteger el acceso, permitiendo mediante alguna dirección ingresar al sistema sin autenticarse.

Una mala practica que usan los programadores es dejar puertas abiertas, para efectuar monitoreos o mantenimiento, si bien estas pueden ser útiles y debidamente protegidas pueden ser valiosas, muchos las dejan abiertas para hacer mas fácil el proceso de mantenimiento, olvidando la posibilidad de que pueden permitir el acceso completo al sistema.

Es muy importante desarrollar pensando en la seguridad, para no construir o dejar puertas traceras



La mano invisible gobierna el mundo

lunes, 3 de diciembre de 2018

152. Obtener script de un objeto de base de datos

Desde SQL no es posible hacer esto desde SQL Management Studio, pero si es posible hacerlo desde c#, para ello es necesario hacer lo siguiente:

1. Agregar el paquete de nuget llamado Microsoft.SqlServer.Scripting

Una vez que se agreso esto es necesario importar lo siguiente:

using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
using System;
using System.Collections.Generic;
using System.Linq;

y para obtener el script se ejecuta la siguiente linea

List<string> strloop = new Server(new ServerConnection(server, user, password))
                .Databases[database]
                .Tables[table, schema]
                .Script(new ScriptingOptions
                {
                    SchemaQualify = true,
                    DriAll = true
                })
                .Cast<string>()
                .Select(s => s + "\n" + "GO")
                .ToList();

La mano invisible gobierna el mundo

miércoles, 14 de noviembre de 2018

151. Envenenamiento de Cache - Ataques

En este tipo de ataque no tenemos que ver directamente como desarrolladores, y digo no directamente, por que una aplicación que presente vulnerabilidad puede ser la puerta para que se efectué este tipo de ataque.

El ataque se da cuando un código malicioso cambia la tabla de nombres de dominio de un servidor de Internet, remplazandolas por otro, de tal forma que las direcciones legales dejan de serlo, y las solicitudes se redirigen a sitios falsos, con el fin de extraer o dañar la información.

Comúnmente para poder efectuar el ataque, se requiere la ejecución de algún proceso externo en el servidor, este puede entrar por un banner, un correo, o un programa mal desarrollado.


felices lineas

150. CSV INJECTION - Ataques

Platiquemos de este tipo de ataque, los archivos CSV son un tipo de archivos muy común, los cuales se emplean para compartir información entre diversos sistemas de manera sencilla, este formato es empleado por varias aplicaciones tanto comerciales como propias de una empresa.

Existen algunos programas comerciales, como Excel, open office etc, que permiten interpretar la información con algunas formulas ( en algunos casos un desarrollador llega a buscar interpretar campos de un CSV para poder obtener ciertos datos o ejecutar ciertos procesos)

La inyección de CSV, consiste en aprovechar esta capacidad, y en vez de enviar un dato, enviar una formula, esperando que el servidor sea capaz de interpretarla, comúnmente se emplea el signo = y posteriormente se escribe la formula.

Ahora me preguntaran ¿Que daño puede hacer?, realmente puede hacer mucho daño, se puede poner un hyperlink, ejecutar un comando externo un comando externo nos puede dar acceso a un servidor etc.

En muchas ocasiones el tomar una funcionalidad que existe para dar mucha flexibilidad a nuestros aplicativos, abre una puerta para poder causar daños mayores, vean que puertas abren, aprendan a construir sus barreras.

Felices lineas

149. Ataques

Platicando con un amigo surgió un tema en la conversación, la seguridad en nuestras aplicaciones, ¿creamos aplicaciones seguras?, ¿Realmente es muy difícil encontrar una aplicación verdaderamente segura?

Por desgracia la respuesta es no, no creamos aplicaciones seguras hoy en día, hemos caído en un problema muy grabe, en que sistemas es fácil de aprender, y en que desarrollamos para funcionalidad, no para seguridad. Y aunque nos duela los de .net estamos mucho mas lejos todavía de una programación segura, entonces me dirán, pero ejecuto las reglas básicas de seguridad que vienen en Visual Studio, ejecuto los análisis de código, eso ayuda, pero eso no es un diseño en el que se pueda validar la seguridad.

Entonces deberíamos hablar de los diseños y la seguridad, pero no, no voy ha hablar de eso, ¿por que?, por algo sencillo, para poder diseñar la contención, primero es necesario sabe como es un ataque.

Entonces te pregunto ¿Cuantos tipos de ataques conoces?, ¿Has intentado romper tus propios sistemas con ellos?, no estoy pidiendo nada raro, ni complejo, solo ejecuta ataques a tu sistema y veamos que pasa.... Instala un Kali linux y prueba algunos ataques genéricos... cualquier sistema debería poder resistirlos.

Pero volvemos a lo mismo, como construimos una muralla, si yo no se como es el ejercito que me va a a tacar.

Construyo una pared para un ataque por aire?, ¿como debo diseñar mi software?

La respuesta es para poder armar tu defensa conoce al atacante.

Necesitamos aprender ¿Que tipos de ataque existen? ¿Como hacerlos? y ¿Como detenerlos?, y esto debemos tenerlo en mente desde el momento en el que construimos nuestra aplicación.

En próximas entradas pondré una breve descripción de diferentes tipos de ataque, primero quiero que los conozcas, después veremos como hacerlos y controlarlos, no estoy diciendo que ataque un sistema que no es tuyo, estoy diciendo que sepas como defenderte.

felices lineas

martes, 13 de noviembre de 2018

148. Linq Join

Pues seguimos con esta serie de post de lynq, así como en algún momento lo maneje lynq nos ayuda a hacer mas sencillo el manejo de datos, por ello lo que vamos ha hacer esta vez es enlazar 2 tablas mediante lynq.

Bueno realmente hacer esto es muy sencillo, veamos un código y platiquemos sobre el:

namespace union
{
    class Program
    {
        public class  Alumno
        {
            public string nombre { getset; }
            public int Lista { getset; }
        }
 
        public class Calificacion
        {
            public string materia { getset; }
            public int Lista { getset; }
            public int calificacion { getset; }
        }
 
        static void Main(string[] args)
        {
            List<Alumno> Alumnos = new List<Alumno>();
            Alumnos.Add(new Alumno() { nombre="Carlos", Lista=1 });
            Alumnos.Add(new Alumno() { nombre = "Miguel", Lista = 2 });
            Alumnos.Add(new Alumno() { nombre = "Juan", Lista = 3 });
            Alumnos.Add(new Alumno() { nombre = "Raquel", Lista = 4 });
            Alumnos.Add(new Alumno() { nombre = "Irma", Lista = 5 });
 
            List<Calificacion> calificaciones = new List<Calificacion>();
            calificaciones.Add(new Calificacion() 
                        { Lista=1, calificacion=8, materia="1" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 1, calificacion = 8, materia = "2" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 1, calificacion = 9, materia = "3" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 1, calificacion = 10, materia = "4" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 2, calificacion = 8, materia = "1" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 3, calificacion = 8, materia = "2" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 4, calificacion = 9, materia = "3" });
            calificaciones.Add(new Calificacion() 
                        { Lista = 2, calificacion = 10, materia = "4" });
 
            var x = from a in Alumnos join b in calificaciones 
                    on a.Lista equals b.Lista 
                    select new { nombre = a.nombre, calificacion = b.calificacion };
 
            foreach(var loop in x)
            {
                Console.WriteLine(loop.nombre + " - " + loop.calificacion);
            }
 
            Console.ReadLine();
        }
    }
}

Bien que hace el código, el código lo que hace es que carga 2 objetos y obtiene un tercer objeto anónimo poco resultado de ambos, y en donde esta la magia


 var x = from a in Alumnos join b in calificaciones 
                    on a.Lista equals b.Lista 
                    select new { nombre = a.nombre, calificacion = b.calificacion };


si observamos estas lineas es muy fácil de leer, estamos usando 2 objetos uno llamado alumnos y uno llamado calificaciones, le estamos indicando a lynq que el valor que se emplea para hacer la unión es el campo lista, que se encuentra en ambos objetos, ahora bien, en un post pasado vimos que podemos usar linq para hacer convenciones de datos entre objetos, bueno en este caso estamos creando un nuevo objeto
      
select new { nombre = a.nombre, calificacion = b.calificacion };

pero como pueden ver, no existe un objeto con estas características, estamos creando un objeto anónimo, que lo estamos utilizando en la siguiente linea.


            foreach(var loop in x)
            {
                Console.WriteLine(loop.nombre + " - " + loop.calificacion);
            }


Felices Lineas


147. @@error SQL

Dirán que toco muchos temas, pero el salto se da por un hecho, si realmente quieren orquestar lo que es el desarrollo de sistemas, deben tener conocimiento de varias cosas, toco mucho base de datos, es por un tema, los desarrolladores, o bueno un gran numero de ellos se encuentran peleados con la base de datos, solo conocen las operaciones básicas y se niegan a ver un poco mas allá, y bueno siguiendo con el espíritu de crear ayudas rápidas que den esa gota que hace falta para trabajar hablemos de @@error.

@@error es una instrucción para SQL server, que le indica al cliente que nos de el ultimo numero de error que se encuentre registrado.

es importante, si es muy importante, por que otra de las cosas con las que muchos desarrolladores están peleados, es el control de errores real, es decir, ¿Que se debe hacer si hay un error de un tipo especifico?, recordemos que try catch no es control de errores, eso es simplemente un paleativo para que el proceso no se detenga.

felices lineas

lunes, 12 de noviembre de 2018

146. Lynq transformar objetos

Lynq nos permite manipular datos de una manera ágil y sencilla, en este ejemplo lo que vamos a aprender es como copiar datos entre 2 objetos que tienen una estructura diferente.

El select que estamos haciendo desde lynq lo que nos permite es crear un nuevo objeto (el objeto se crea al efectuar el select) y se asigna a un nuevo objeto, de esta manera se deja que el compilador se encargue de establecer la mejor opción para la copia entre objetos, evitando establecer una lógica de forma manual.

Veamos el ejemplo

namespace CopiarDatos
{
 
    public class Primaria
    {
        public string Nombre { getset; }
        public string sexo { getset; }
        public int Numero { getset; }
        public Boolean paso { getset; }
    }
 
    public class Secundaria
    {
        public string Nombre { getset; }
        public string sexo { getset; }
        public int grupo { getset; }
        public int ubicacion { getset; }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            List<Primaria> primaria = new List<Primaria>();
            primaria.Add(new Primaria() { Nombre = "Juan Perez"
                             Numero = 15, sexo = "H",paso=true });
            primaria.Add(new Primaria() { Nombre = "Raquel Perez"
                             Numero = 17, sexo = "H", paso = true });
            primaria.Add(new Primaria() { Nombre = "Alejandra Perez"
                             Numero = 165, sexo = "H", paso = false });
            primaria.Add(new Primaria() { Nombre = "Miguel Perez"
                             Numero = 145, sexo = "H", paso = true });
            primaria.Add(new Primaria() { Nombre = "Raciel Perez"
                             Numero = 155, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Juana Perez"
                             Numero = 415, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Leonardo Perez"
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Miguel Perez"
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Angel Perez"
                             Numero = 135, sexo = "M", paso = false });
            primaria.Add(new Primaria() { Nombre = "Rafael Perez"
                             Numero = 115, sexo = "M", paso = false });
 
            List<Secundaria> x = (from a in primaria 
                 where a.paso == false select new Secundaria { 
                              Nombre = a.Nombre, sexo = a.sexo }).ToList();
 
            foreach(Secundaria objloop in x)
            {
                Console.WriteLine(objloop.Nombre + " - " + 
                                  objloop.grupo + " - " + 
                                  objloop.sexo + " - " + 
                                  objloop.ubicacion);                
            }
            Console.ReadLine();
        }
    }
}

¿Cual es la magia?

 List<Secundaria> x = (from a in primaria where a.paso == false 
       select new Secundaria { Nombre = a.Nombre, sexo = a.sexo }).ToList();

Esta linea es la magia, al momento de generar el select, indicamos que se cree un nuevo objeto y la asignación que tendrá de los valores


 select new Secundaria { Nombre = a.Nombre, sexo = a.sexo }).ToList();

Así llenamos los objetos de una manera eficiente, tanto para el compilador como para el programador.


Felices Lineas


jueves, 8 de noviembre de 2018

145. sp_monitor

La salud de un servidor es muy importante, nunca se deben resolver estos problemas solo incrementando la potencia del servidor, es muy importante que los sistemas se consideren como un todo.

Cuando un sistema tiene problemas de rendimiento, se debe observar ¿ Que elemento tiene el problema ?  pero también se debe localizar ¿ Cual es el elemento que es el que causa el problema?

Existen stores procedures que reportan información de la base de datos, monitores de rendimiento que muestran el estado de un servidor, o de un componente, todo esto debemos saber interpretarlo, por que nos permite generar mejores sistemas.

Un verdadero arquitecto no solo es responsable de sus programadores, es responsable de ese todo que forma el negocio, el arquitecto de sistemas es un director de orquesta, y como tal debe hacer funcionar ese todo

sp_monitor es uno de esos stores, este nos muestra el estado actual de nuestro servidor de SQL

¿Que información nos entrega?

last_run: Fecha en que el proceso fue ejecutado por ultima vez, es importante por que establece el punto desde el que se recolectaron los ultimos datos.

current_run: Fecha actual de ejecucion

seconds: Tiempo en que se tardo en recabar la informacion

cpu_busy: Numero de segundos que el CPU ha estado ocupado por el servidor de SQL

io_Busy: Numero de segundos que el servidor ha dedicado a procesos de entrada y salida

ide: Numero de segundos que el servidor ha estado ocupado

packets_received: Cantidad de paquetes recibidos

packets_sent: Cantidad de paquetes enviados

total_read: Numero de lecturas hechas por SQL Server

total_write: Numero de escrituras a SQL server

total_errors: Cantidad de errores que ocurrieron durante la lectura y escritura

connections: Cantidad de conexiones aceptadas por el servidor de SQL

Para que estos valores tengan sentido, es muy importante que se tome el tiempo que ha transcurrido entre la ejecución anterior y la ejecución actual del proceso, ademas de que es necesario siempre tener los valores de la ejecución anterior para tener valores de referencia

Felices lineas

viernes, 26 de octubre de 2018

143. HTML eliminar el marco de una imagen que se usa como liga

Nuevamente una ayuda rápida, la pregunta es Cuando uso una liga de html con una imagen ¿Como logro que no me aparezca el marco que me indica que ya visite el sitio?

por ejempo

se muestra un marco de color que no se desea, se debe cambiar en el estilo de la imagen el borde

<a href="Documento.aspx" target="_blank"><img src="../Imagenes/Ayuda.png" style="width:50px;height:50px;border:0" alt="Detalle Motivos FC" /></a> 
 
Felices Lineas 





miércoles, 24 de octubre de 2018

142. SQL INFORMATION_SCHEMA.COLUMNS

La manipulación y análisis de datos es una de las principales tareas en esta area, no se puede decir que hay un buen programador que no maneja una base de datos eficientemente, si el motor de datos falla, todo el proceso falla.

La base no solo es insertar, actualizar, buscar y borrar, se debe estructurar toda la información para no generar problemas de rendimiento.

Vamos a platicar de una tabla de sistema que es muy útil en el análisis de una base de datos, sobre todo cuando se requiere comprender el esquema de la misma desde el mismo código, esta tabla también permite en muchos casos crear consultas dinámicas, no recomiendo mucho que la usen para esto, pero es posible

select * from INFORMATION_SCHEMA.COLUMNS

Una vez que se ejecuto esta consulta, sql despliega la información campo por campo de todas las tablas y bases de datos en la instancia

Felices Lineas

martes, 23 de octubre de 2018

141. Lynq II

Vamos a seguir aprendiendo un poco de lynq, si ya se que tengo varias cosas abiertas pero también eso tiene su razón de ser, la de generar curiosidad, la programación se mueve por curiosidad.

En SQL nosotros podemos tomar un conjunto de registros, esto lo hacemos para reducir nuestro universo o por que nos interesa solo una parte de ellos, en sql usamos el argumento top, asi desde sql podemos seleccionar un conjunto de datos con una instrucción como:

select top 10 from la tabla

pero que pasa en Lynq, podemos hacer esto, la respuesta es si, y de una forma muy sencilla

var lista = (from c in lstAlumno where c.Edad > 15 select c).Take(1);

y si ademas quisieramos meter un orden

var lista = (from c in lstAlumno where c.Edad > 15 select c).OrderBy(c=>c.Edad).Take(1);

Como pueden ver empesamos ha hacer una combinacion de lynq y lamda

Continuaremos el dia de mañana

Felices lineas



lunes, 22 de octubre de 2018

140. Lamda I

Así como lo mencione en el post anterior, nuestra labor es manejar datos, comprender analizar, .net nos brinda gran apoyo al momento de describir las instrucciones que queremos emplear, pero debemos saber de que herramientas contamos.

Las expresiones Lamda, es una forma en que se puede describir una serie de instrucciones de una forma concisa, que facilita la lectura al momento de efectuar una operación, la expresión lamda simplifica la escritura del código, escribiendo en este mismo operaciones que antes requerían una mayor estructura (uso de delegados).

¿Como la construimos?

C# nos entrega funciones preparadas para el uso de expresiones lambda, la expresión lamda es sencilla, se requiere solo una invocación al objeto y después al elemento del mismo siguiendo la estructura de la función que invocamos.

hagamos un ejemplo:


La aplicación tiene exactamente el mismo comportamiento qe la que usamos en el post 139. la diferencia es la forma en la que escribimos en código, en este caso en ves de emplear una expresión de lynq usamos expresiones lamda

var lista =  lstAlumno.Where(c => c.Edad > 10);

si la comparamos contra la expresión de linq


var lista = from c in lstAlumno where c.Edad > 15 select c;


en este caso se ve mas sencilla la representación con lamda, pero conforme la complejidad se incrementa linq ofrece grandes ventajas, en próximos post incrementaremos la complejidad de las consultas para compararlas entre ellas.


Felices lineas

139. Linq I

Estamos en un mundo en el que la información cobra vida, nunca antes en la historia de la humanidad se había tenido tal acceso a la información, sin embargo, la información es tanta que ha perdido el orden, como desarrolladores debemos poder analizar esta información, día a día se nos dan mas herramientas para hacer este tipo de análisis.

Así pues revisemos que opciones tenemos para poder manipular eficientemente la información.

¿Que es Lynq? 

Es un componente de la plataforma .NET que permite agregar capacidades de consulta de manera nativa a los lenguajes de .NET

Lynq nos permite tener acceso a objetos de datos y explorarlos de una manera sencilla.

Si sabes SQL sabes Lynq

veamos un ejemplo::



Revisemos la consulta

var lista = from c in lstAlumno where c.Edad > 15 select c;

Que hace, crea un objeto c que toma los datos de lstAlumno, busca en ese todos aquellos que tengan una edad mayor a 15 años y genera el nuevo objeto

Si ejecutamos el programa:




Felices Lineas



martes, 16 de octubre de 2018

138. Abrir un documento en una ventana nueva aspx

Para poder abrir un documento en aspx en una nueva ventana del lado de back end se debe poder este codigo, en la pagina en la que se envia el llamdo esto para invocar a window.open del lado de javascript

        Dim url As String = "MuestraDocumento.aspx?Documento=thinkpython.pdf"
        Dim target As String = "'_blank'"
        Dim script As String = "window.open('" & url & "'," & target & "," & "'status=no, menubar=no, toolbar=no,location=no');"
        Page.ClientScript.RegisterStartupScript(Me.GetType, "someUniqueId", script, True)

y en la pagina que recibe la informacion

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        Response.ContentType = "application/pdf"
        Response.Clear()
        Response.TransmitFile("C:\Carlos\Libros\" + Request.QueryString("Documento"))
        Response.End()
    End Sub

Felices lineas

137. Abrir un pdf en asp.net en una nueva pestaña

Para poder abrir un pdf es necesario primero enviarlo, para ello seguimos el siguiente codigo

Response.ContentType = "application/pdf"
Response.Clear()
Response.TransmitFile("C:\Carlos\Libros\thinkpython.pdf")
Response.End()

Sin embargo esto no lo abre en una nueva pestaña, para ello es necesario al momento de llamar el boton del lado del cliente agregar lo siguiente:

OnClientClick="frmAyuda.target ='_blank';

por ejemplo


<asp:Button CssClass="btnAgregar" ID="btnAgregar" runat="server" Text="Agregar" OnClientClick="frmAyuda.target ='_blank';"/>

Felices lineas

136.Generar una cadena aleatoria de manera agil

Esta es una función rápida para generar una cadena alfanumérica aleatoria

 public string GeneraCadenaAleatoria(int longitud)
        {
            using (MD5 md5Hash = MD5.Create())
            {
                
                StringBuilder sb = new StringBuilder();
                while (sb.Length < longitud)
                {
                    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(Guid.NewGuid().ToString());
                    byte[] hash = md5Hash.ComputeHash(inputBytes);
                    sb.Append(Convert.ToBase64String(hash));
                }
                return sb.ToString().Substring(0, longitud);
            }
        }

Felices lineas

jueves, 11 de octubre de 2018

135. MVC - Cambiar la complejidad del password usando identity framework

MVC permite la construcción de paginas ágiles, y un gran control sobre la estructura de las mismas, Visual Studio cuenta con plantillas para poder iniciar una pagina con características mínimas para poder empezar a trabajar, MVC emplea identity para poder efectuar la administración de accesos y autorizaciones, por default, Identity tiene algunas características definidas para los paswords pero en algunas ocaciones es necesario aumentar o reducir la complejidad, para ello se debe hacer esto:

Debemos ir a la carpeta App_Start donde encontraremos un archivo llamado IdentityConfig.cs


Abrimos el archivo y buscamos la sección:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 

Dentro de esta encontraremos las características para definir el password

 // Configure la lógica de validación de contraseñas
            manager.PasswordValidator = new PasswordValidator
            {
                RequiredLength = 8,
                RequireNonLetterOrDigit = false,
                RequireDigit = false,
                RequireLowercase = false,
                RequireUppercase = false,
            };

Felices lineas

miércoles, 10 de octubre de 2018

134. Deep Freeze

Hoy quiero recomendar un software que permite la experimentación, convirtiendo la PC en un cajón de arena, de esta forma cualquier cosa que se haga en la PC se recupera con un simple reinicio, (cualquier cosa que afecte al sistema, esto no necesariamente tiene que ver con archivos de documentos), como desarrolladores siempre existe la curiosidad de jugar con partes internas del S.O. o modificar configuraciones, si bien existen las maquinas virtuales que nos permiten hacer esto libremente o maquinas en Azure, existen algunas veces, que es necesario hacer alguna modificación sobre algún equipo que no tiene estas características, principalmente por que se requiere que se cumpla con las características exactas de software y configuración.

Es en estos casos en que el producto es útil, ya que basta un reinicio para volver a la configuración original.

Les dejo la liga, para que lo analicen. https://www.faronics.com/es/products/deep-freeze/enterprise

Felices lineas

133. ¿Que esta haciendo mi servidor de SQL?

La salud de un servidor de SQL es muy importante, ya que una consulta muy pesada, un bloqueo, puede acabar con una aplicación completa, los contadores de performance de un servidor son una herramienta gratuita muy importante que nos permite ver prácticamente todo lo que hace un servidor, y estos pueden ser consultados por diversos métodos, vamos a revisar este tema mas adelante, si ya se que tengo varios temas abiertos pero es que sistemas es un mundo muy grande y si realmente quieren ser buenos arquitectos de sistemas deben conocer y ser expertos en todos los frentes, su labor es orquestar todos los recursos que tienen y aprovecharlos al maximo.

Hoy les dejo un query que les permite saber la actividad de su servidor de base de datos, para saber si un usuario esta abusando del servidor

SELECT es.session_id
    ,es.program_name
    ,es.login_name
    ,es.nt_user_name
    ,es.login_time
    ,es.host_name
    ,es.cpu_time
    ,es.total_scheduled_time
    ,es.total_elapsed_time
    ,es.memory_usage
    ,es.logical_reads
    ,es.reads
    ,es.writes
    ,st.text
FROM sys.dm_exec_sessions es
    LEFT JOIN sys.dm_exec_connections ec
        ON es.session_id = ec.session_id
    LEFT JOIN sys.dm_exec_requests er
        ON es.session_id = er.session_id
    OUTER APPLY sys.dm_exec_sql_text (er.sql_handle) st
WHERE es.session_id > 50   
ORDER BY es.cpu_time DESC

Que tengan felices lineas

lunes, 1 de octubre de 2018

132. Cambiar el esquema de un objeto en una base de datos

Para poder cambiar un objeto de una base de un esquema a otro se usa la instrucción

ALTER SCHEMA [Nuevo esquema] TRANSFER [Objeto];

para que sirve un esquema, un esquema es un agrupador, que nos permite organizar los objetos en la base de datos, de esta forma podemos saber el uso de los objetos, e implementar una seguridad por uso definiendo limites entre lo que puede ver o acceder cada grupo de usuarios



martes, 25 de septiembre de 2018

131. Buscar una columna en toda la base de datos

Les dejo este script que les permite encontrar una columa en una base de datos

DECLARE @StrValorBusqueda NVARCHAR(100)

SET @StrValorBusqueda = '[Columna]'

CREATE TABLE #Resultado (NombreColumna NVARCHAR(370))

SET NOCOUNT ON

DECLARE @NombreTabla NVARCHAR(256)
,@NombreColumna NVARCHAR(128)

SET @NombreTabla = ''

WHILE @NombreTabla IS NOT NULL
BEGIN
PRINT @NombreTabla

SET @NombreColumna = ''
SET @NombreTabla = (
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @NombreTabla
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
)

WHILE (@NombreTabla IS NOT NULL)
AND (@NombreColumna IS NOT NULL)
BEGIN
if @NombreColumna like ('%' + @StrValorBusqueda + '%')
Begin
insert into #Resultado values(@NombreTabla + '.' + @NombreColumna)
End
SET @NombreColumna = (
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@NombreTabla, 2)
AND TABLE_NAME = PARSENAME(@NombreTabla, 1)
AND DATA_TYPE IN (
'char'
,'varchar'
,'nchar'
,'nvarchar'
)
AND QUOTENAME(COLUMN_NAME) > @NombreColumna
)
END
END

SELECT NombreColumna
FROM #Resultado

lunes, 6 de agosto de 2018

130. Si una tabla existe SQL

El siguiente Query permite determinar si una tabla existe en SQL

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = [Esquema] 
                 AND  TABLE_NAME = [Tabla]))
BEGIN
    --Codigo
END

viernes, 27 de julio de 2018

129. Query para obtener la fracmentacion de los indices de una base de datos

La fracmentacion de los indices es algo que se debe evitar esto principalmente por que indices fracmentados no ayudan a que una base opere correctamente.

El siguiente query permite revisar el estado de los indices de una base de dato de SQL server

SELECT OBJECT_NAME(ind.OBJECT_ID) AS TableName,
ind.name AS IndexName, indexstats.index_type_desc AS IndexType,
indexstats.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats
INNER JOIN sys.indexes ind 
ON ind.object_id = indexstats.object_id
AND ind.index_id = indexstats.index_id
WHERE indexstats.avg_fragmentation_in_percent > 30
ORDER BY indexstats.avg_fragmentation_in_percent DESC