Tag: Windows

Instalar drivers ADB para Jiayu G4

Si eres propietario de un Jiayu G4 o alguna de sus variantes G4A, G4B, G4C, G4T o G4S, habrás notado que el ADB (Android Debug Bridge) en Windows no reconoce el dispositivo. Esto es debido a que ADB no es capaz de reconocer driver del dispositivo.

jiayu-g4

 

Para solucionarlo es necesario instalar en el sistema un driver que permita que el ADB opere con el dispositivo. Para ello basta con instalar la aplicación PDAnet en cualquiera de sus dos versiones de 32 o 64 bits:

PDAnet es un conjunto de utilidades que permite operar con tu dispositivo, ya sea transferir archivos, recibir llamadas y notificaciones... pero lo más interesante es que nos instala el driver que nos hace falta para poder operar con el ADB. Basta con seguir las instrucciones de instalación para instalarlo.

Una vez hayas instalado PDAnet puedes desinstalarlo si sólo necesitabas el driver. En Windows todos los drivers se copian a la carpeta "System32/drivers"  dentro de la carpeta "Windows", por lo que no es necesario mantener PDAnet instalado.

Ahora con la opción activada de "Depuración USB" en "Opciones de desarrollo" de tu dispositivo, podrás desplegar aplicaciones de Android en tu dispositivo y hacer debug de su funcionamiento.

wpid-screenshot_2015-10-06-22-30-58.png

jiayu-g4c-android_device_chooser

Este procedimiento está testado para modelos Jiayu G4 y sus variantes, pero es posible que funcione para más modelos. Si alguno lo prueba, lo puede dejar indicado en la zona de comentarios para orientar a otros posibles usuarios.

El veterano eMule vuelve a la carga tras años de inactividad

eMule el programa más conocido de intercambio de ficheros iniciado el 13 de mayo de 2002 por Hendrik Breitkreuz (Merkur), y que hacía uso de la filosofía P2P en su diseño, vuelve aparentemente a la carga con una la versión 0.50b. El comunicado ha sido publicado en el foro de la comunidad de eMule:

http://forum.emule-project.net/index.php?showtopic=159790

Las mejoras que se incluirán en esta versión 0.50b son las siguientes:

  • Revisión del código de subida
  • Mejor manejo en la IO (Entrada y Salida)
  • Optimización del manejo interno de hashes AICH
  • Sustituido Filedonkey Search por ContentDB
  • Actualización de librerías (como la librería miniupnpc haciendo compatible UPnP con más routers)
  • Cambios y correciones menores

Estas mejoras principalmente aumentan la eficiencia en el uso de ancho de banda de las conexiones, pudiendo usar completamente la capacidad de subida. Esto quiere decir que otros usuarios descargarán más rápido. Una puesta apunto que le vendrá muy bien.

eMule fue el sistema P2P más extendido en su momento hasta que poco a poco fue desplazado por BitTorrent. A pesar de ello tiene una extensa base de usuarios activos y existen muchos archivos compartidos en sus redes.

Descargar la versión beta desde los siguientes enlaces:

v0.50b BETA1 - Installer

v0.50b BETA1 - Binary

v0.50b BETA1 - Sources

Puedes reportar errores si los detectas en el foro de eMule.

eMule_matrix

Corrección de colores en Windows para Juegos Abandonware

El tiempo pasa y la tecnología cambia mejorándose y haciéndose más cómoda y rápida. Los sistemas operativos cómo núcleo y base para la ejecución de programas no son ajenos a ello, y lejos de solamente evolucionar, tienen la difícil tarea de mantener la compatibilidad con lo ya existente.

En el caso concreto de Windows, el cual cumplirá 35 años el próximo 20 de Noviembre, existe multitud de software que ha sido desarrollado. De manera nativa Windows ha intentado ofrecer compatibilidad con el software desarrollado para sistemas anteriores, ya sea de manera implícita sin que el usuario tuviese que hacer nada o explícita, permitiendo que el usuario elija la compatibilidad de manera manual desde propiedades del archivo.

Propiedades-Compatibilidad

Por norma general estas opciones suelen bastar para hacer funcionar buena parte del software antiguo o también denominado Abandonware.

En el caso particular de los juegos suelen ser especialmente útiles estas opciones, permitiendo correr juegos que se diseñaron para sistemas operativos anteriores. En la práctica, y para la gran parte de los casos, las opciones facilitadas por las versiones de Windows más actuales, nos resuelven la papeleta para poder correr dichos juegos.

En casos particulares esto a veces no es suficiente y los juegos a pesar de funcionar, contienen errores gráficos que afectan a la interpretación de los colores originales del juego. Un caso en el que se comprueba fácilmente estos fallos, es el juego de "Age of Empires 2" si se ejecuta, por ejemplo, en un Windows 7.

age_of_empires_color errors

El fallo en la interpretación de los colores es causado por la corrupción de la paleta de colores. El causante de que se corrompan los colores es el proceso "explorer.exe" que se ejecuta en todo momento en el sistema, encargado de gestionar toda la interacción que hay en el escritorio (iconos del escritorio, barra de navegación...).

El problema viene dado porque dicho proceso tiene problemas de funcionamiento para modos de vídeo con color de 16 bits sin aceleración gráfica. Puesto que el proceso explorer presenta dicho problema, el cierre del mismo antes de lanzar el juego, solucionará el problema de corrupción de la paleta de colores.

Un solución práctica consiste en cerrar el proceso explorer, lanzar el juego y volver a lanzar el proceso explorer cuando se cierre el juego. Para ello basta con crear un  archivo con extensión ".bat", por ejemplo "Lanzador.bat".

Dentro del fichero escribiremos las siguientes líneas:

taskkill /F /IM Explorer.exe
EJECUTABLE_DEL_JUEGO.EXE
start explorer.exe 

Este archivo Lanzador.bat es un script que nos lanza el ejecutable (.EXE) que queramos tras cerrar el proceso explorer mediante el comando "taskkill", y queda a la espera de que termine el ejecutable para poder volver a lanzarlo con el comando "start".

Esta solución simple y sencilla es válida para todos aquellos programas y juegos que presenten errores en la paleta de colores.

OpenCV – Mouse Event Handler (parte 1)

Para aquellos que os estáis introduciendo un poco en temas de visión artificial, seguramente ya habréis oído hablar de OpenCV, pero para los que no, os explico someramente lo que es.

OpenCV es una librería de visión artificial desarrollada originalmente por Intel y licenciada como BSD. OpenCV está escrito en C/C++ y es multiplataforma GNU/Linux, Mac OS XWindows, IOS y Android. El proyecto proporciona un entorno de programación fácil de utilizar, altamente eficiente y sin dependencias a librerías de terceros.

Una de las herramientas esenciales cuando se trabaja en visión es la visualización e interacción con los resultados (véase imagen). OpenCV cubre perfectamente este tipo de necesidades. Para ello voy a presentar un ejemplo sencillo de manejo de ventanas con eventos de ratón.

GMM-GC-segmentation

En el siguiente código se muestra una función que renderiza una ventana:

void showWindow()
{
  	//Create an autoresize window
	namedWindow("My Window", 1);

	//Set the callback function for any mouse event
	setMouseCallback("My Window", mouseEventHandler, NULL);

	//Show the image
	frame = cv::imread("0001_.jpg");
	imshow("My Window", frame);

	//Wait until user press some key
	waitKey(0);
}

El método "namedWindow" nos permite crear una ventana con un nombre que la identifique y que además se autodimensione dependiendo el contenido que muestre. Para cargar un fichero de imagen basta con usar "imread" especificando el nombre o path del fichero para cargarlo en un objeto Mat de OpenCV. La variable "frame" es del tipo Mat mencionado, que se ha definido como global fuera de la función. Por último "waitKey" nos permite tener renderizándose la ventana hasta que se presione alguna tecla o se cierre desde el aspa de cierre de la ventana.

Habréis apreciado que me he saltado el método "setMouseCallback", pero lo he hecho para enlazar con el siguiente fragmento de código. Dicho método, nos permite asociar un callback a una ventana usando su nombre de identificación(en nuestro caso "My Windows") y pudiendo pasar parámetros adicionales (en nuestro caso no se pasa ninguno y se pasa un NULL).

void mouseEventHandler(int event, int x, int y, int flags, void* param)
{
	if  ( event == EVENT_LBUTTONDOWN )
	{
		cout << "Left button of the mouse is clicked DOWN - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_LBUTTONUP )
	{
		cout << "Left button of the mouse is clicked UP - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_LBUTTONDBLCLK )
	{
		cout << "Left button of the mouse is double clicked - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_RBUTTONDOWN )
	{
		cout << "Right button of the mouse is clicked DOWN - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_RBUTTONUP )
	{
		cout << "Right button of the mouse is clicked UP - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_RBUTTONDBLCLK )
	{
		cout << "Right button of the mouse is double clicked - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_MBUTTONDOWN )
	{
		cout << "Middle button of the mouse is clicked DOWN - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_MBUTTONUP )
	{
		cout << "Middle button of the mouse is clicked UP - position (" << x << ", " << y << ")" << endl;
	}
	else if  ( event == EVENT_MBUTTONDBLCLK )
	{
		cout << "Middle button of the mouse is double clicked - position (" << x << ", " << y << ")" << endl;
	}
	else if ( event == EVENT_MOUSEMOVE )
	{
		cout << "Mouse move over the window - position (" << x << ", " << y << ")" << endl;
	}
}

Cada vez que se produzca alguno de los siguientes eventos:

  • EVENT_MOUSEMOVE
  • EVENT_LBUTTONDOWN
  • EVENT_RBUTTONDOWN
  • EVENT_MBUTTONDOWN
  • EVENT_LBUTTONUP
  • EVENT_RBUTTONUP
  • EVENT_MBUTTONUP
  • EVENT_LBUTTONDBLCLK
  • EVENT_RBUTTONDBLCLK
  • EVENT_MBUTTONDBLCLK

Se invocará a la función callback "mouseEventHandler". En el código se puede observar que la sucesión de los distintos "if" permite identificar el tipo de evento. En el caso concreto del movimiento del ratón, además se imprimen las coordenadas de la ventana a las que se ha desplazado el ratón, utilizando los parámetros "x" e "y" que recibe "mouseEventHandler".

A continuación dejo el código completo de la arquitectura básica para el manejo de eventos: