¿Somos tan especiales?

¿Nuestra especie es tan especial como creemos?, ¿Somos especiales?. Estamos en el centro de la zona habitable de nuestro sistema solar; en nuestro planeta se dieron las difíciles consecuencias necesarias para que los ‘mamíferos’ evolucionaran; el planeta júpiter nos protege atrayendo los meteoritos hacia el (pero también los puede impulsar hacia la tierra); tenemos una luna que cumple un papel fundamental para la estabilidad de la tierra ya que estabiliza el eje de la tierra; la luna también hace que nuestro clima sea estable; tenemos un cerebro especial y que posiblemente gracias a el somos la especie de mamíferos dominantes de el planeta (no somos la especie dominante porque nos ganan los adorables insectos); estamos en un universo estable dentro de la mayoría de los posibles universos inestables.

Todo esto suena muy bien. Debemos de ser muy afortunados al estar en un lugar así, en estar en el lugar, tiempo, indicado para que se dieran las condiciones necesarias para nuestra existencia. Pero nos podemos plantear una pregunta, ¿si -no- tuviésemos la capacidad de observar el universo, estaríamos aquí haciéndonos este tipo de preguntas?. La respuesta es no, es muy difícil que una piedra o cualquier otro tipo de material se haga este tipo de preguntas. Nosotros podemos hacer estas preguntas porque nuestro cerebro (nosotros) las desarrolla. Solo somos parte del universo que se observa a si mismo, somos la consecuencia de una infinidad de variables. Puede que existan otros universo donde no se dio la condición para que exista vida inteligente y por lo tanto en esos universos no pueden haber preguntas.

Algunos dicen, ¿Cómo el Big Bang o cualquier otra cosa o algo, va a ser tan inteligente como para crearnos a nosotros uno seres tan complejos?. Pero ¿Es necesario que exista algo con inteligencia para que seamos “creados”?. ¿No puede ser que seamos el resultado de una infinidad de variables que nos hacen existir, solamente?. Como una canica que cae de una escalera ¿Alguien diseño su trayectoria?

Con mi comentario no quiero quitarles la esperanza de ser algo especial dentro del universo, sino que trato de que nos bajemos del altar para poder pensar un poco más. Podemos ser como la trayectoria de una canica que cae de una escalera o algo mas “natural”, como la trayectoria de una piedra que cae de una montaña y que fue impulsada por el viento. Somo especiales porque podemos sentirnos especiales.

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

Manejar listas de métodos que referencian los objetos delegados.

En este artículo veremos:c# logo no oficial del lenguaje de programacion c sharp

  • Como manejar las listas de métodos que referencian los objetos delegados para saber sus métodos y su clase.
  • Combinar 2 objetos delegados (se combinan las listas de métodos que contienen los objetos delegados)
  • Ejecutar todos los métodos que referencia un objeto delegado.

.

El próximo código es un ejemplo puramente teórico que muestra los puntos anteriormente dichos.

// por Writkas, archivo sin derechos reservados.
//
// Delegados4_Comentado.cs : Ejemplo puramente teórico que muestra como manejar las listas
//	de métodos que referencian los objetos delegados para saber sus métodos y su
//	clase, combinar dos objetos delegados y ejecutar todos los métodos que referencia
//	un objeto delegado.
//
// Compilar en Linux con Mono:
//	gmcs Delegados4_Comentado.cs
//
// Ejecutar:
//	mono Delegados4_comentado.exe

using System;
using System.Reflection;

delegate int MiTipoDelegado (int Parámetro);

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

		OtraClase objOtraClase = new OtraClase ();

	//	Ya que la palabra clave 'delegate' representa una clase sellada
	//	'System.MulticastDelegate', sus intancias pueden ser inicializadas como cualquier
	//	otra clase.
	//	Entonces ->
	//	MiTipoDelegado miObjDelegado1 = new MiTipoDelegado (objOtraClase.Método1);
	//	Es lo mismo que -->
		MiTipoDelegado miObjDelegado1 = objOtraClase.Método1;

		miObjDelegado1 += objOtraClase.Método2;

		MiTipoDelegado miObjDelegado2 = objOtraClase.Método3;

	//	Este es el objeto delegado que contendra los métodos de 'miObjDelegado1'
	//	y también los de 'miObjDelegado2'. Es importante asignarle un valor nulo (null)
		MiTipoDelegado miObjDelegado3 = null;

	//	Información sobre los objetos delegados tratados gracias a la clase
	//	'TratarDelegados'
		Console.WriteLine ("Mostrar información de 'miObjDelegado1'");
		TratarDelegados.InformaciónObjDelegado (miObjDelegado1);
		Console.WriteLine ("\nMostrar información de 'miObjDelegado2'");
		TratarDelegados.InformaciónObjDelegado (miObjDelegado2);
		Console.WriteLine ("\nMostrar información de 'miObjDelegado3'");
		TratarDelegados.InformaciónObjDelegado (miObjDelegado3);

	//	Combinar los objetos delegados que contienen métodos, para que los contenga
	//	un solo objeto delegado. Y mostrar información de los objetos delegados.
		Console.WriteLine ("\nLuego de combinar los objetos delegados 'miObjDelegado1'");
		Console.WriteLine ("y 'miObjDelegado2' en 'miObjDelegado3'");
		miObjDelegado3 += miObjDelegado1 + miObjDelegado2;
		Console.WriteLine ("\nMostrar información de 'miObjDelegado3'");
		TratarDelegados.InformaciónObjDelegado (miObjDelegado3);

	//	Llamar a todos los métodos de 'miObjDelegado3'
		Console.WriteLine ("\nLlamar a los métodos de 'miObjDelegado3'");
		miObjDelegado3 (5);
	}
}

public class OtraClase
{
	public int Método1 (int a)
	{
		int retorno = a + 10;

		Console.WriteLine ("Soy Método1 y mi argumento es: {0} y retorno: {1}",
		  a, retorno);

		return retorno;
	}

	public int Método2 (int a)
	{
		int retorno = a + 20;

		Console.WriteLine ("Soy Método2 y mi argumento es: {0} y retorno: {1}",
		  a, retorno);

		return retorno;
	}

	public int Método3 (int a)
	{
		int retorno = a + 30;

		Console.WriteLine ("Soy Método3 y mi argumento es: {0} y retorno: {1}",
		  a, retorno);

		return retorno;
	}
}

public class TratarDelegados
{

	public static void InformaciónObjDelegado (Delegate objDel)
	{
		Console.WriteLine ("Información del objeto delegado");

		if (objDel == null) {
			Console.WriteLine ("\tEl objeto delegado no referencia a ningún método");
			return;
		}

		foreach (Delegate d in objDel.GetInvocationList ()) {
			Console.WriteLine ("\tNombre del método: {0}", d.Method);
			Console.WriteLine ("\tNombre de su clase: {0}", d.Target);
		}
	}
}

Ahora compilar y ejecutar –>

writkas@linux-xag2:~> gmcs Delegados4_Comentado.cs
writkas@linux-xag2:~> mono Delegados4_Comentado.exe
Se inicia el programa

Mostrar información de 'miObjDelegado1'
Información del objeto delegado
Nombre del método: Int32 Método1(Int32)
Nombre de su clase: OtraClase
Nombre del método: Int32 Método2(Int32)
Nombre de su clase: OtraClase

Mostrar información de 'miObjDelegado2'
Información del objeto delegado
Nombre del método: Int32 Método3(Int32)
Nombre de su clase: OtraClase

Mostrar información de 'miObjDelegado3'
Información del objeto delegado
El objeto delegado no referencia a ningún método

Luego de combinar los objetos delegados 'miObjDelegado1'
y 'miObjDelegado2' en 'miObjDelegado3'

Mostrar información de 'miObjDelegado3'
Información del objeto delegado
Nombre del método: Int32 Método1(Int32)
Nombre de su clase: OtraClase
Nombre del método: Int32 Método2(Int32)
Nombre de su clase: OtraClase
Nombre del método: Int32 Método3(Int32)
Nombre de su clase: OtraClase

Llamar a los métodos de 'miObjDelegado3'
Soy Método1 y mi argumento es: 5 y retorno: 15
Soy Método2 y mi argumento es: 5 y retorno: 25
Soy Método3 y mi argumento es: 5 y retorno: 35
writkas@linux-xag2:~>

Eso es, espero que les sirva. Si algo no entienden, por favor no duden en escribir un comentario para hacer algunos retoques al artículo

Aquí puedes descargar los ejemplos de los delegados en C Sharp que hemos visto hasta ahora

logo descargar

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
  6. C Sharp (C#) – Usar delegados – Manejar listas de métodos que referencian los objetos delegados

.

(Parte 5: Usar delegados para facilitar el uso de eventos) Artículo anterior | Artículo siguiente (Parte 7: —)

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.