Usar FFmpeg para la codificación de videos en Linux

¿Cansado de que tus amigos te pasen esa película tan especial, pero que pesa 3 GB y que la calidad sea peor que la pantalla de tu lavadora? En este artículo encontraste la solución a todos tus problemas al codificar videos, gracias a el espectacular programa FFmpeg. Convertir video de AVI a AVI con MPEG-4, convertir video de AVI a MP4, convertir video de AVI a OGG, convertir video de AVI a RM, etc. También are una pequeña comparativa poco fundamentada pero útil para saber elegir que formato elegir para sus diferentes usos.

Un pequeño resumen de lo que es FFmpeg (según Wikipedia)

FFmpeg es una colección de software libre que puede grabar, convertir y hace streaming de audio y vídeo. Incluye libavcodec, una biblioteca de códecs. FFmpeg está desarrollado en GNU/Linux, pero puede ser compilado en la mayoría de los sistemas operativos, incluyendo Windows.

Ahora vamos aprender a usar este fabuloso programa con una interfaz gráfica de la mas modernas. (linea de commandos)

Terminal Linux

El uso que le vamos a dar a FFmpeg en este mini artículo es el de Convertir videos a diferentes formatos con FFmpeg.

¡Al grano! Los usos mas simples y útiles son los siguientes:

Si nuestro problema es el peso de los archivos de video, que consideramos como excesivo para una calidad no tan espectacular y si quieres que el archivo conserve la calidad (sin perdidas), o simplemente quieres que pese menos. La mejor opción sin usar códecs privativos es (creo) usar el códec de video H264 o también conocido como MPEG-4 parte 10.

Lo veremos en el siguiente ejemplo, uso algunos argumentos:

-i  Indico el video que quiero convertir, o también se puede decir la entrada (in)

-ab Indico la taza de bits. En el siguiente ejemplo le indique 128k que es la misma que tiene el viedeo por codificar. ¿Y por que hice esto? por que predeterminadamente el programa elige una taza de bits de 64k . Lo que empeoraría la calidad del sonido, se nota un poco.

-vcodec Indico el códec de video, en el siguiente ejemplo elegí el códec H264 o MPEG-4 part 10 . Para saber que otros códec usar puedes usar el argumento -codecs , saldrán todos los códecs de audio y video que puedes usar o no, según los paquetes que tengas instalados en tu distribución Linux. En Windows deben venir los que hay predeterminadamente. El nombre ‘libx264’ (que es el códec h264) sale ahí.

¡Importante! El nombre de entrada tiene que ser diferente al nombre de salida, si el nombre especificado con el argumento -i es igual al de salida, el programa intentara remplazar el mismo archivo que estas codificando y por lo tanto se perderá.

¡Repositorios! si no tienes instalado lo repositorios adecuados para codificar, probablemente el programa lance un mensaje diciendo que no tienes los repositorios adecuados. Necesitas los repositorios de H264/AVC Encoder, H.264/MPEG-4 Encoder. Yo en OpenSuse 11.4 tengo h264enc, libx264-115, x264 .

ffmpeg -i 'in_miPelicula.avi'-ab 128k -vcodec libx264 'out_miPelicula.avi'

.

Si nuestro problema sigue siendo el peso del archivo pero esta vez quieres comprometer la calidad del archivo para compensar un tamaño mas reducido aún. Una buena opción es codificar tu video al formato ‘MP4’. Pero

-acodec Indico el códec de audio, esta vez le dejo el mismo códec de audio que venía en el video original. Voy a usear la palabra ‘copy‘ para indicar que copio el mismo códec que venía en el video. (a veces el códec cambia un poco). En mi caso cambió de ‘mp3’ a ‘libmp3lame’. Al usar la palabra ‘copy‘ de forma predeterminada se elige la misma taza de bits que tenía el audio del video a codificar. Si necesitas cambiar la taza de bits puedes usar el argumento -ab . A veces pasa que no se pueden usar algunos argumentos como copy, puede que sea los códecs, la versión, etc. Los programadores de FFMpeg actualmente son muy activos y están siempre resolviendo bugs, añadiendo funcionalidades y reparando algunas cosas. Para asegurarse que no va a haber ningún error al empezar la codificación, es mejor saber la taza de bits y indicarlo, con -ab .

¡Repositorios! creo que solo es el de ffmpeg, pero si se necesita otro, por favor, pueden avisar en los comentarios.

ffmpeg -i 'in_miPelicula.avi' -acodec copy 'out_miPelicula.mp4'

Convertir video de AVI a OGG.

ffmpeg -i 'in_miPelicula.avi' 'out_miPelicula.ogg'

Convertir video de AVI a RM.
Solo le indico la taza de bits -ab para que conserve la calidad de sonido.

ffmpeg -i 'in_miPelicula.avi' -ab 128k 'out_miPelicula.rm'

Creo que las primeras dos formas de codificar los videos son buenas. Si están obsesionados con el peso de los archivos, y cual es mejor. Les dejo una imagen que muestra, la forma en que fueron codificados esos archivos y el peso.


Habría mucho mas que decir, todo esto de la codificación de videos, los contenedores (avi, mp3, ogg, mp4) y los códecs de audio o video, son un tema muy amplio. Es todo un universo. Al aprender un poco de esto me di cuenta que un video o audio no es una simple matriz de variable. Sino que todo esto tiene una gran complejidad y me asombra lo desapercibido que pasa el funcionamiento interno de los videos.

C Sharp (C#) – Usar Delegados – Parte 5

Usar delegados para facilitar el uso de eventos

En este artículo veremos como usar delegados para facilitar el uso de eventos, es un ejemplo de código. Es la tarea del artículo anterior (C Sharp (C#) – Usar Delegados – Parte 4). Como sugerencia trata de hacer el ejercicio anterior y luego ve este ejemplo de código. Trata de cumplir los objetivos que di en el artículo anterior. En este artículo mostraré el resultado del ejercicio, a lo que mas o menos tenías que llegar. Obviamente no todo escriben código igual, por eso se sugiere que se haga el ejercicio anterior.

Usar delegados para facilitar el uso de eventos.

Choque de coches

Acá va el ejemplo:


// Ejemplo copiado del libro "Pro C Sharp 2010 and the dotNet 4 Platform 5th
// Edition - Andrew Troelsen - Apress" página 405 del libro. Traducido, comentado,
// editado por Writkas
//
// Car--Ejemplo.cs : 	Ejemplo que muestra como usar delegados para facilitar el
//	uso de eventos. Este ejemplo no muestra como usar eventos, lo que trata de
//	mostrar, es un ejemplo en el que podría ser útil el uso de delegados, un
//	ejemplo más o menos real.
//	En resumen el ejemplo trata sobre un auto que va subiendo la velocidad y a
//	traves de notificaciones 'personalizadas' nos avisa del peligro, y estado del
//	auto. Al chocar el auto, suponemos que alguien ejecuta la caja negra del auto
//	y se dencadenan los mensajes (métodos) registrados.
//
// Compilar :			gmcs Car--Ejemplo.cs

using System;

public class Program
{
	public static void Main ()
	{
		Console.WriteLine ("***** Delegados para facilitar eventos *****\n");

	// Crear un objeto de la clase "Car".
		Car c1 = new Car (100, 10);

	// Hay que decirle al objeto "c1" cual es el método a llamar (OnCarEngineEvent)
	// cuando se nos envíe un mensaje o notificación. Debe cumplir con la firma.
		c1.RegisterWithCarEngine (new Car.CarEngineHandler (OnCarEngineEvent));

	// Subir velocidad (este es el punto de partida para luego recibir eventos o
	// mensajes). (el bucle for no tiene llaves por que tiene una sola linea de
	// código y se puede hacer eso)
		Console.WriteLine ("***** subir velocidad *****");
		for (int i = 0; i < 6; i++)
			c1.Accelerate (20);

		Console.ReadLine ();
	}

	// Este es nuestro método personalizado que le enviaremos a el objeto delegado.
	public static void OnCarEngineEvent (string msg)
	{
		Console.WriteLine ("\n****** mensaje desde el objeto c1 *****");
		Console.WriteLine ("=> {0}", msg);
		Console.WriteLine ("************************************\n");
	}
}

public class Car
{
	// 1) Definir un tipo delegado.
	public delegate void CarEngineHandler (string msgForCaller);
	// 2) Definir un objeto delegado miembro de esta clase.
	private CarEngineHandler listOfHandlers;
	// 3) Añadir una función registro para el llamador.
	// Se le envía un objeto delegado (el creado con new, anteriormente) y se copia
	// ese objeto delegado al del objeto delegado de esta clase.
	public void RegisterWithCarEngine (CarEngineHandler methodToCall)
		{ listOfHandlers = methodToCall;}

	// Estados de las variables internas
	public int CurrentSpeed {get; set;} // Velocidad común
	public int MaxSpeed {get; set;} // Velocidad máxima

	// El auto esta vivo?
	private bool carIsDead;

	// Constructores de la clasepe
	public Car () {MaxSpeed = 100; }
	public Car (int maxSp, int currSp)
	{
		CurrentSpeed = currSp;
		MaxSpeed = maxSp;
	}

	public void Accelerate (int delta)
	{
	// ¿Si, este auto esta muerto?, enviar el mensaje de que está muerto.
		if (carIsDead)
		{
	// ¿Si, el objeto delegado 'listOfHandlers' no tiene métodos y es null?
			if (listOfHandlers != null)
				listOfHandlers ("este auto esta muerto...");
		}

		else
		{
			CurrentSpeed += delta;

	// ¿Si, este auto está casi muerto?
			if (10 == (MaxSpeed - CurrentSpeed) && listOfHandlers != null)
				listOfHandlers ("¡cuidado! va a chocar");
	// ¿Si, este auto va a más velocidad del limite o igual velocidad?
			if (CurrentSpeed >= MaxSpeed)
				carIsDead = true;
			else
				Console.WriteLine ("CurrentSpeed = {0}", CurrentSpeed);
		}
	}
}

Compilar el ejemplo y ejecutar para ver el resultado, en Linux u parecidos, si no usas MonoDevelop.

writkas@linux-xag2:/home/writkas/> gmcs Car--Ejemplo.cs
writkas@linux-xag2:/home/writkas/> mono Car--Ejemplo.exe
***** Delegados para facilitar eventos *****

***** subir velocidad *****
CurrentSpeed = 30
CurrentSpeed = 50
CurrentSpeed = 70

****** mensaje desde el objeto c1 *****
=> ¡cuidado! va a chocar
************************************

CurrentSpeed = 90

****** mensaje desde el objeto c1 *****
=> este auto esta muerto...
************************************

writkas@linux-xag2:/home/writkas/>

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miebros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp

.

(parte 4: Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp) Artículo anterior | Artículo siguiente (parte 6: Manejar listas de métodos que referencian los objetos delegados)

C Sharp (C#) – Usar Delegados – Parte 4

Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp

En este artículo veremos el como acceder a varios métodos privados y estáticos, de un tipo delegado y objeto delegado, y también repasaremos lo de añadir y quitar métodos en un objeto delegado, y veremos unos atajos que se dieron en la versión 2.0 de el lenguaje C# y por último un ejercicio para entender los delegados en C Sharp . Para estudiar esto hice un pequeño ejemplo de código. Creo que si sigues desde el principio estos mini artículos, podrías entender bien el código.

// por Writkas, archivo sin derechos reservados.
//
// Delegados3.cs : Acceder a varios métodos estáticos y privados de la clase
//	principal (donde esta el main) y otras clases a través de un objeto delegado.
//	También repasamos el añadir y quitar métodos a un objeto delegado con los
//	operadores '=' y '+=' y los atajos que aparecieron en la versión 2.0 de C#.
//
// Compilar en Linux : gmcs Delegados3.cs

using System;

public class EstaClase
{
	public delegate void MiDelegado (int parámetro1, int parámetro2);

	public static void Main ()
	{
		Console.WriteLine ("Se inicia el programa");

	// Se crea una instancia de la clase 'OtraClase'
		OtraClase objOtraClase = new OtraClase ();

		Console.WriteLine ("Se añade al objeto delegado el método estático 'Método1DeOtraClase'");
	// Añadir a 'objDelegado' un método estático de 'OtraClase'
	// Para añadir un primer método a un objeto delegado, se usa el operador '=' .
	// Pero esto vale solo para el primer método a añadir al objeto delegado, el
	// resto de los métodos se añaden con el operador '+=' .
		Console.WriteLine ("Se crea una instancia de la clase 'OtraClase'");
		MiDelegado objDelegado = new MiDelegado (OtraClase.Método1DeOtraClase);

		Console.WriteLine ("Se añade al objeto delegado el método no estático 'Método2DeOtraClase'");
	// Se añade 'Método2DeOtraClase' que no es estático. Ahora usamos el operador
	//'+=' ya que no es el primer método a añadir.
		objDelegado += new MiDelegado (objOtraClase.Método2DeOtraClase);

		Console.WriteLine ("Se añade al objeto delegado el método estático 'Método1DeEstaClase'");
	// Se añade un método estático de esta clase. No hay para que referirse al nombre de esta
		objDelegado += new MiDelegado (Método1DeEstaClase);

		Console.WriteLine ("Se crea una instancia de la clase 'EstaClase'");
	// Crear una instancia de esta clase 'EstaClase'
		EstaClase objEstaClase = new EstaClase ();

		Console.WriteLine ("Se añade al objeto delegado el método no estático 'Método2DeEstaClase'");
	// Se añade un método publico de esta clase
		objDelegado += new MiDelegado (objEstaClase.Método2DeEstaClase);

		Console.WriteLine ("Se llama a objDelegado objDelegado (8, 3);");
	// Llamar a un método estático que se almacena en 'objDelegado'
		objDelegado (8, 3);

	// Ahora, llamamos a los métodos que están relacionados con los métodos de
	// 'objEstaClase' y los de 'objOtraClase'. Se vió que a 'objDelegado' al llamarlo no le
	// importa si los métodos a añadir son estáticos o públicos.

	// Ahora veremos algunos atajos para añadir métodos a un objeto delegado que se añadieron en la
	// versión 2.0 del lenguaje C# . Es importante tener en cuenta estos atajos para usarlos y también
	// leer código de otros programadores.
		objDelegado += objEstaClase.Método2DeEstaClase;
		objDelegado += OtraClase.Método1DeOtraClase;

	// Veamos si funciona
		objDelegado (10, 20);
	}

  public static void Método1DeEstaClase (int parámetro1, int parámetro2)
  {
    Console.WriteLine ("Se a llamado a un método estático 'Método1DeEstaClase' de esta clase");
    Console.WriteLine ("Muestra estos argumentos: {0} y {1}", parámetro1, parámetro2);
  }

  public void Método2DeEstaClase (int parámetro1, int parámetro2)
  {
    Console.WriteLine ("Se a llamado a 'Método2DeOtraClase' de esta clase");
    Console.WriteLine ("Muestra estos argumentos: {0} y {1}", parámetro1, parámetro2);
  }
}

public class OtraClase
{
  public static void Método1DeOtraClase (int parámetro1, int parámetro2)
  {
    Console.WriteLine ("Se a llamado a un método estático 'Método1DeOtraClase' de la clase 'OtraClase'");
    Console.WriteLine ("Muestra estos argumentos: {0} y {1}", parámetro1, parámetro2);
  }

  public void Método2DeOtraClase (int parámetro1, int parámetro2)
  {
    Console.WriteLine ("Se a llamado a 'Método2DeOtraClase' de un objeto de la clase OtraClase");
    Console.WriteLine ("Muestra estos argumentos: {0} y {1}", parámetro1, parámetro2);
  }
}

Ahora veamos la salida, en un terminal (monitor, linea de comandos, etc.) de Linux. Pero creo que es lo mismo que debería salir si lo compilamos compilamos con Visual Estudio. –>

Se inicia el programa
Se añade al objeto delegado el método estático 'Método1DeOtraClase'
Se crea una instancia de la clase 'OtraClase'
Se añade al objeto delegado el método no estático 'Método2DeOtraClase'
Se añade al objeto delegado el método estático 'Método1DeEstaClase'
Se crea una instancia de la clase 'EstaClase'
Se añade al objeto delegado el método no estático 'Método2DeEstaClase'
Se llama a objDelegado objDelegado (8, 3);
Se a llamado a un método estático 'Método1DeOtraClase' de la clase 'OtraClase'
Muestra estos argumentos: 8 y 3
Se a llamado a 'Método2DeOtraClase' de un objeto de la clase OtraClase
Muestra estos argumentos: 8 y 3
Se a llamado a un método estático 'Método1DeEstaClase' de esta clase
Muestra estos argumentos: 8 y 3
Se a llamado a 'Método2DeOtraClase' de esta clase
Muestra estos argumentos: 8 y 3
Se a llamado a un método estático 'Método1DeOtraClase' de la clase 'OtraClase'
Muestra estos argumentos: 10 y 20
Se a llamado a 'Método2DeOtraClase' de un objeto de la clase OtraClase
Muestra estos argumentos: 10 y 20
Se a llamado a un método estático 'Método1DeEstaClase' de esta clase
Muestra estos argumentos: 10 y 20
Se a llamado a 'Método2DeOtraClase' de esta clase
Muestra estos argumentos: 10 y 20
Se a llamado a 'Método2DeOtraClase' de esta clase
Muestra estos argumentos: 10 y 20
Se a llamado a un método estático 'Método1DeOtraClase' de la clase 'OtraClase'
Muestra estos argumentos: 10 y 20

Ahora voy a dejar una tarea, por que pasa que a veces creemos entender de que tratan estos contenidos de programación, pero al llegar a realizar algo se vuelve todo muy complicado.

La tarea también les servirá como ejemplo para entender mejor los delegados. Ya que hemos visto varios ejemplos simples que son muy teóricos pero no expresan el pare que se utilizan los delegados.

Ejercicio para entender los delegados en C#

Choque de coches

Primero, imaginemos un auto que va en una carretera acelerando cada ves más, va aumentando la velocidad. Y que cada vez que aumenta la velocidad el sistema del auto envía un mensaje a la caja negra del auto, para registrar la actividad del auto durante su vida útil. A medida que el auto va acelerando va perdiendo el control y a una cierta velocidad choca. Al final suponemos que alguien revisa el auto y ejecuta la caja negra, y ahí se desencadenan todos los mensajes que registro el auto en su vida.

.

Ahora la parte más técnica.

Objetivos del ejercicio para entender los delegados.

  1. Usar los delegados.
  2. Usar dos clases.
    1. Una para el método Main () y para hacer uso de la clase Car.
    2. Una clase Car, que tendrá todo el mecanismo del auto. Un método para acelerar, un delegado para manejar los métodos o lo que pase dentro del auto (la caja negra).
  3. Hacer que se muestre en el monitor lo principal que pasa en el programa. Que el auto va aumentando la velocidad en x, que el auto esta perdiendo el control a x velocidad, que el auto choca a x velocidad.
  4. Pasar un método personalizado al objeto delegado de la clase Car que contenga la forma en que el mensaje sera mostrado en el monitor (personalizado).

Sugerencias para el programa

En la clase que contiene el Main () tendremos el bucle que hace que el auto aumente la velocidad y el método personalizado, que le queremos pasar a objeto delegado de la clase Car . Nuestro método personalizado deberá contener la forma en que el mensaje será presentado a la supuesta persona que desencadene todos los eventos. Por ejemplo :

*** aumento 10 la velocidad ***

*** aumento 20 la velocidad ***

*** aumento etc la velocidad ***

Esa es la forma en que se mostrarán los eventos.

Queremos crear una clase Car, que contenga los siguientes miembros.

  • public delegate void CarEngineHandler (string msgForCaller); // Se usará para guardar o dejar referenciado a los métodos a asignar.
  • private CarEngineHandler listOfHandlers; // Objeto delegado de la clase Car
  • public void RegisterWithCarEngine (CarEngineHandler methodToCall) // Método que a través de el se le puede enviar un objeto delegado del tipo ‘CarEngineHandler‘ que proporciona esta clase. Para enviar los mensajes que incluye el objeto delegado.
  • public void Accelerate (int delta) // delta es la velocidad que va a aumentar.
  • Las variables internas y otros miembros que manejen todo el mecanismo.

.

Lo principal es cumplir los objetivos del ejercicio, lo demás es solo una sugerencia que es opcional.

Por favor las sugerencias o preguntas son bienvenidas, para hacer unos retoques al artículo por si no se entiendo el ejercicio. Pronto vendrá una solución al ejercicio.

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp

.

(parte 3: ¿Cuándo se ocupan los delegados en C Sharp?) Artículo anterior | Artículo siguiente (parte 5: Usar delegados para facilitar el uso de eventos)

[/sourcecode]

Sobre los profetas o el predecir

imagen de un profeta escribiendo en un papelLos profetas o el predecir se pueden interpretar de múltiples formas y también se pueden interpretarla de tal forma en que todos los hechos reales coincidan. PERO generalmente esos hechos coinciden después de que pasan los acontecimientos y nunca o casi nunca se predicen acontecimientos que van a pasar. Ejemplos de libros que predicen: Poesías, el libro de Notradamus, la Biblia, etc.

TAMBIÉN cuando los eventos supuestamente predecídos, son comparados con los eventos reales y coinciden. Generalmente es por azar o por ser sacados a la luz por alguien. Pero normalmente se ignoraran las predicciones que no tienen sentido (o un sentido no tan ambiguo)

Al final hay libros tan ambiguos que lo predicen todo 😉

¿Cuál es el problema de la especie humana?

Si nuestra mejor prioridad como especie fuera, sobrevivir, pensar en mejorar la vida de cada una de las personas para que su estancia en el planeta tierra sea mejor y organizarse de tal manera en que cada individuo conlleve un bien altruista hacia los demás. Si todos actuáramos de esta forma, de seguro la calidad de vida de todos los humanos del planeta mejoraría enormemente. Tal ves sea la mejor estrategia a largo plazo que podemos adoptar en este momento. Es el direccionar el altruismo de la sociedad hacia los problemas que nos afectan actualmente, de forma directa o indirectamente. Tal ves, no solo tenemos una respuesta evolutiva que tiende al altruismo al generar la empatía, sino que ahora podríamos justificar de forma consiente el por que ser altruistas. Si somos capases de pensar a largo plazo, como sociedad deberíamos proponernos promover esta especie de inteligencia altruista reciproca colectiva. Y así mejoraría enormemente nuestra eficiencia como sociedad.

La evolución pareció acertar en generar la empatía en muchas especies, algo que también la mayoría de los humanos sentimos y que no necesariamente tiene que ser siempre egoistamente reciproca, por que el cerebro no gasta su tiempo en calcular cada ves quién sale ganando en x situación, mas bien ignora mucho.

Y no me refiero a que toda la gente le interese lo primordial, sino que le interese lo importante en términos de sociedad y también que de verdad cada persona aporte con un granito de arena para una sociedad mejor.

El tema. Doy mi opinión sobre los principales problemas de la especie humana.

Pensamiento muy a corto plazo

Una de las grandes carencias de la especie humana cuyos efectos han marcado nuestra historia es sin duda nuestro pensamiento a muy corto plazo. Si seguimos pensado en obtener beneficios solo a corto plazo, la consecuencia -puede- ser la peor, la autodestrucción de la especie humana. Vivimos en un mundo que, prácticamente,  funciona a corto plazo.

Por ejemplo, seguimos extrayendo combustibles fósiles siendo que estos son limitados y muy dañinos  para el medio ambiente. Otro ejemplo, la política quere, entre otros, que la gente este bien, pero la gente suele conformarse con lo inmediato y no les interesa mucho las políticas de prevención y en general las políticas que funcionan a largo plazo siendo que pueden se mucho mas eficaces. El humano normalmente suele pensar, prácticamente, en muy pocas generaciones mas que la suya, a lo más 4 generaciones. Si lo vemos de un punto de vista más global, es algo que se debería evitar y no tiene un buen final.

Y no debemos creer que solo debemos aprender de nuestros errores, siendo que tenemos la capacidad de plantearnos situaciones hipotéticas y muchas veces predecir el futuro a base de conocimientos teóricos o empíricos. Por que se a visto a lo largo de nuestra historia como especie que aprendemos muy bien de nuestros errores y que pocos aprenden a predecir el futuro mas o menos bien.

Ejemplo, en la mayoría de los gobiernos donde hay abusos de poder y los ciudadanos se dan cuenta de esto, y empiezan a reclamar. El gobierno tiende a cambiar de estrategia en, creo, la mayoría de los casos.

No nos interesa lo que de verdad debería interesar

A la mayoría de la sociedad no le interesa lo importante, las supervivencia de nuestra especie a largo plazo y la mejora general de esta. La gente, prácticamente, poco o nada queren saber de lo que estén directamente involucrado o tal ves queran saber pero parece que no les interesa lo suficiente para tomar iniciativas propias. Y existe un ejemplo muy claro sobre esto actualmente y es la educación. La educación debería cambiar, en muchos países está cambiando pero de seguro que no lo suficiente. La educación, por lo menos en mi país (Chile), está orientada a aprender materias que muchas veces no tienen mucho sentido, parece que es simplemente es saber por saber, acumular conocimientos para diferenciar quien tiene el mejor cerebro (sin considerar la ciencia) y ignorar si ese conocimiento se pierde o es el más adecuado. Es como que los que organizan la educación del país pensaran cosas mas o menos así: “A mi me gusta la historia, entonces la incluiremos” (ridiculizando un poco). Si realmente los que organizan la educación pensaran algo parecido a esto, ¿por que no incluyen?: Odontología, Astronomía, Paleonotología, Agricultura, etc. Por que parece que así lo hicieran, eligen temas prácticamente al azar y ignoran todos los avances de la ciencia que servirían para la educación, para la vida de las personas. Ignoran los que nos sirve realmente, también ignoran que conocimientos son los que realmente sirven para el futuro laboral, social, emocional,  entre otros.

Pensamiento lineal

Nos cuesta tanto cambiar de opinión, aunque nos los pidan con buenos argumentos. Sostenemos muchos de nuestros argumentos con caprichos y emociones, que al fin y al cabo son muestra de una deficiencia mas de nuestra especie. Esta bien tomar nuestras decisiones simples con un pensamiento lineal, para no sufrir el estrés de analizar todo lo que encontremos. Pero en mi opinión las decisiones importantes si que se deben pensar, por que a nuestro cerebro no le interesa la verdad por que su prioridad es sobrevivir, muchas veces puede generar buenas respuestas y muy elaboradas por que en términos de rapidez la parte inconsciente de nuestro cerebro es mucho mas rápido que la parte consciente. A nuestro cerebro al parecer no se le da bien con proposiciones a largo plazo.

Fanatismo y la gestión de las emociones

Pienso que todas las creencias, incluyendo: religiones, políticas, seudo-ciencias, ideologías, etc. que produzcan fanatismo son en sentido práctico malas para la sociedad y pueden llevar a cosas muy peligrosas. Ejemplos, los tiempos de Hitler, los tiempos de la inquisición, tiempo de las cruzadas, etc.

El fanatismo es el principal autor de muchos de los delitos, pero también de causas altruistas. Y no las religiones y creencias, como muchos creyeron, por que la moral es prácticamente un producto de la evolución, la moral es en gran medida innata y todos los humanos poseemos una moral más o menos igual, pero cuando hay fanatismo puede haber una diferenciación peligrosa. Los humanos no somos los únicos que tenemos una cierta moral.

Si gestionamos bien las emociones no caeremos en ideologías tan fácilmente ya que nos anteponemos a situaciones hipotéticas en las cuales saldremos perjudicados u otras y de seguro seremos más lógicos. Debemos aprender cuando evadir los pensamientos y emociones más primitivas que están más cerca del centro del cerebro o cerebro primitivo, son las emociones básicas de nuestra especie.

¿sugerencias?, ¿opiniones?, ¿correcciones?, ¿insultos?

C Sharp (C#) – Usar Delegados – Parte 3

¿Cuándo se ocupan los delegados?

Los delegados pueden ser utilizados en distintas ocasiones, también pueden no ser utilizados como en el caso del lenguaje Java. Pero la idea de aprender a usar los delegados es para ser mas eficiente a la hora de programar y ahorrar lineas de código. Al principio usar palabras claves nuevas en un lenguaje de programación moderno puede ser difícil pero cuando ya lo aprendes será mas intuitivo y más eficiente.

Los delegados se pueden usar cuando:

  • Se llama a varios métodos con una sola llamada (Multidifución). A los objetos delegados se les puede asignar métodos y luego llamarlos todos de forma ordenada, con una sola llamada desde el objeto delegado.
  • Se pasan métodos como parámetros. Gracias a usar un tipo delegado como parámetro.
  • La ordenación de un conjunto de elementos. Por ejemplo, ordenar una secuencia de métodos.
  • Se utilice un modelo de diseño de eventos. Los eventos son como las propiedades, son una forma de acceder a los delegados. Dan una respuesta cuando se le asigna y/o quita un método a un evento que representa un objeto delegado (parecido a las propiedades representan a las variables).
  • Se prefiere a la hora de encapsular un método estático. Con llamar a un objeto delegado se puede acceder para llamar a métodos estáticos privados de otra clase (no la clase en la cual esta el autor de la llamada al objeto delegado), sin tener que llamarlos directamente (ya que no se puede llamar a miembros (métodos, variables, propiedades, etc)  privados de forma directa desde otra clase).
  • El autor de la llamada no tiene ninguna necesidad de obtener acceso a otras propiedades, métodos o interfaces de el objeto.
  • Una clase puede necesitar mas de una implementación (realización de una especificación técnica) de métodos.
  • Se desea conseguir una composición sencilla.
  • Para realizar devolución de llamadas asíncronas (en un hilo de ejecución a parte) y finalizar llamadas asíncronas.
  • Cambios en bases de datos. Por ejemplo, a partir de un cambio de ‘x’ tabla se genera una respuesta ‘y’.
  • Asociación de código a la carga y descarga de ensamblados.
  • Cambios en el sistema de archivos. Por ejemplo al borrar ‘x’ archivo se escribe un registro en otro archivo ‘y’, que contiene datos del archivo borrado.
  • Etc.

Si no quedaron muy claras algunas cosas, más adelante se verán. También veremos algunos ejemplos ilustrativos (para aprender a usar los delegados) y ejemplos en un contexto ‘más o menos real’ (ya que son solo ejemplos).

¿Dudas?, ¿sugerencias?, ¿opiniones?, ¿errores?, ¿insultos?

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp

.

(parte 2: Añadir y quitar métodos a un objeto delegado) Artículo anterior | Artículo siguiente (parte 4: Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp)

C Sharp (C#) – Usar Delegados – Parte 2

Añadir y quitar métodos a un objeto delegado

En realidad los delegados no son un tema corto, por lo que irán varios mini artículos mas. También, en el ejemplo del mini artículo anterior, se añadió un solo método a un objeto delegado, pero había dicho que también se pueden añadir uno o mas métodos a un objeto delegado y luego en el caso de ser varios métodos se podían ejecutar de forma ordenada a través del objeto delegado (también se puede ejecutar de otras formas pero, ya se vera eso mas adelante). En este mini artículo se verá como añadir y quitar métodos a un objeto delegado y ejecutarlos de forma ordenada.

Normalmente cuando se crea un objeto delegado, en la misma linea (o sentencia) se incluye el primer método que le asignamos. Pero ¿como añadimos más métodos a un objeto delegado? en el caso de que se quera añadir o quitar métodos a un objeto delegado, se usa los operadores ‘+=’ para añadir y ‘-=’ para quitar métodos. Estos son operadores sobrecargados para que el uso de los objetos delegados sean mas intuitivos.

Ejemplo de como añadir y quitar métodos a un objeto delegado

// por Writkas, archivo sin derechos reservados.
// Delegados2.cs : Añadir y quitar métodos a un objeto delegado

using System;

public class Programa
{
 // Se crea y define un tipo delegado, se puede definir también dentro de una clase.
 // Se define el tipo delegado, tipo de retorno, numero de parámetros y tipos de parámetros. Los
 // métodos a asignar al objeto delegado deben cumplir con esta definición, o si no dará error.
 public delegate void TipoDelegado ();

 public static void Main ()
 {
   Console.WriteLine ("Se inicia el programa");

 // Se crea una objeto de la clase Programa
   Programa objPrograma = new Programa ();

 // Se crea un objeto de el tipo delegado y se le añade un método. No importá si el método es de
 // un objeto de la propia clase
   TipoDelegado objDelegado = new TipoDelegado (objPrograma.Método1);

 // Se añade al objeto delegado un método, ahora el objeto delegado tendrá 2 métodos añadidos.
 // Al añadir un primer método a un delegado se puede usar el operador de asignación '=' pero
 // si quisiéramos añadir otro método se tiene que usar el operador '+=' , como lo siguiente.
   objDelegado += new TipoDelegado (objPrograma.Método2);

   Console.WriteLine ("Se llamará al objeto delegado con los métodos ya asignados");
   objDelegado ();

   Console.WriteLine ("Se llamará al objeto delegado después de quitar Método2");
 // Quitar el método 'Método2' y luego llamar al objeto delegado
   objDelegado -= new TipoDelegado (objPrograma.Método2);
   objDelegado ();

 // Se puede añadir el mismo método mas de una ves
   Console.WriteLine ("Se añade -de nuevo- Método1");
   objDelegado += new TipoDelegado (objPrograma.Método1);
   objDelegado ();
 }

 // Observa que los métodos cumplen con la definición del tipo delegado
 public void Método1 ()
 {
   Console.WriteLine ("Soy Método1");
 }

 public void Método2 ()
 {
   Console.WriteLine ("Soy Método2");
 }
}

El resultado es (en Linux usando Mono y el Terminal) ->

writkas@linux-e1ht:~/proyectos> mcs Delegados2.cs
writkas@linux-e1ht:~/proyectos> mono Delegados2.exe
Se inicia el programa
Se llamará al objeto delegado con los métodos ya asignados
Soy Método1
Soy Método2
Se llamará al objeto delegado después de quitar Método2
Soy Método1
Se añade -de nuevo- Método1
Soy Método1
Soy Método1
writkas@linux-e1ht:~/proyectos>

Enfatizo

  • Un tipo delegado se puede definir dentro de una clase, fuera de una clase, dentro de un namespace o fuera de un namespace.
  • Al inicializar un objeto delegado, se le puede asignar un método usando el operador ‘=’ , pero para asignar o quitar otros métodos al objeto delegado se tiene que usar los operadores ‘+=’ y ‘-=’.
  • Para añadir y quitar un método a un objeto delegado se utilizan los operadores ‘+=’ para añadir y ‘-=’ para quitar un método.
  • Al llamar al objeto delegado se ejecutan los métodos que almacena de forma ordenada, salen al mismo orden de como se añadieron. Osea, si se añade Método1 y luego Método2, al llamar al objeto delegado saldrán Método1 primero y luego Método2.
  • Un mismo método se puede añadir a un objeto delegado más de una ves.

Ya irán mas mini artículos sobre el tema sobre usar delegados en C Sharp. Puede que gente que sabe sobre este tema diga que estoy ignorando muchas cosas sobre este tema los delegados, pero eso estoy haciendo, para ir de forma ordenada y que se entienda mejor el tema.

.

Este artículo es una parte más de una serie de artículos que trata de explicar el como usar delegados. Hasta el momento estos son los artículos ->

  1. C Sharp (C#) – Usar delegados – Ejemplo mínimo sobre delegados
  2. C Sharp (C#) – Usar delegados – Añadir y quitar métodos a un objeto delegado
  3. C Sharp (C#) – Usar delegados – ¿Cuándo se ocupan los delegados?
  4. C Sharp (C#) – Usar delegados – Acceso a miembros de delegados, añadir y quitar métodos y un ejercicio para entender los delegados en C Sharp
  5. C Sharp (C#) – Usar delegados – Usar delegados para facilitar el uso de eventos

.

(Parte 1: Añadir y quitar métodos a un objeto delegado) Artículo anterior | Artículo siguiente (Parte 3: ¿Cuándo se usan los delegados?)