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.
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.
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.
Desde hace unos meses adquirí un NAS DS215j de la marca Synology. La cual sorprende por la cantidad de aplicaciones que pueden instalarse con un par de clicks:
Una de las utilidades que pueden ser instaladas es Git Server, permitiendo crear un servidor Git propio en el que alojar tus proyectos.
Lo primero que necesitamos es habilitar el acceso por ssh a nuestro servidor desde Panel de control > Terminal. Es conveniente que no uses el puerto 22 y uses otro de tu elección, para mejorar la seguridad de tu NAS al no usar los puertos por defecto.
Lo segundo es instalar el paquete que nos proporciona el Servidor Git. Una vez instalado nos permitirá dar acceso a los usuarios que queramos:
Los usuarios de Git quedarán restringidos a realizar actividades relacionadas con Git con una herramienta shell llamada git-shell. Esta shell de inicio de sesión se aplicará a los usuarios de Git para garantizar que las cuentas se utilicen únicamente para operaciones Git. El resultado es que los usuarios de Git solo pueden utilizar la conexión SSH para introducir y extraer repositorios Git, y no tendrán acceso completo a DSM.
Debido a la limitación citada, sólo el usuario "admin" del NAS puede crear los repositorios. Una vez creados los repositorios, cualquier usuario al que demos acceso desde la app del Servidor Git, podrá usar los repositorios.
Para crear el repositorio podemos hacerlo desde un cliente ssh como Putty. Usando la dirección DDNS de nuestro NAS (Panel de control > Acceso Externo > DDNS) y el puerto que definimos para acceder por ssh (Panel de control > Terminal), nos conectamos con las credenciales de acceso del usuario "admin". Una vez dentro creamos el repositorio con los siguientes comandos:
cd /volumeX #Donde X es el número del volumen
mkdir GIT #Crear la carpeta
cd GIT
git init --bare --shared mi-repositorio.git
Con el repositorio creado, podremos acceder un clone usando la dirección:
Google Code nació en 2006 como un plataforma para que los desarrolladores pudiesen compartir y gestionar sus proyectos de manera fiable con la comunidad. En su momento fue la primera plataforma de este tipo y no tuvo competencia hasta el año 2008 en el que aparecieron Github y Bitbucket.
La falta de evolución de la plataforma Google Code le ha llevado a quedarse bastante atrás respecto a sus alternativas. En los último años ha habido una gran migración de proyecto alojados en Google Code, hacia Github y Bitbucket, siendo Github preferido en el caso de respositorios para proyectos públicos y Bitbucket para repositorios de carácter privado. Esto le ha llevado a Google al anuncio del cierre de la plataforma para el próximo 26 de Enero de 2016.
Desde el 12 de Marzo del 2015, Google ya no permite la creación de nuevos proyectos y partir del 24 de Agosto de 2015 el sitio será de sólo lectura hasta el 26 de Enero de 2016. No obstante, Google permitirá la descarga del código fuente de los proyectos durante todo el 2016.
Google no cerrará el servicio para todos los proyectos, ya que mantendrá los proyecto como Android y Chrome. También seguirá manteniendo los mirrors de proyectos como Eclipse, Kernel.org y otros.
Para el resto de proyectos que no son los citados, Google a proporcionado herramientas para portar los proyectos a Github, Bitbucket, SourceForge o Gitlab. Adicionalmente Google ha integrado en Google Code una herramienta para migrar a Github los proyectos.
Google se desprende así de lo que fue su precursor en este tipo de herramientas, seguramente para centrarse en Cloud Source Respositories que actualmente se encuentra en estado beta.
A pesar del diplomático cierre de Google Code por parte de Google, la plataforma tiene multitud de proyectos, muchos de ellos alojados en exclusiva en Google Code. Esto quiere decir que si no se migran, los proyectos serán borrados. Lo ideal es que los desarrolladores de cada proyecto migren los proyectos, pero es posible que muchos proyectos estén abandonados por sus desarrolladores o que hayan caído en el olvido y solo se distribuyan los binarios. No obstante, con la herramienta de migración de proyecto a Github, cualquier usuario puede perpetuar un repositorio de Google Code en Github.
Por eso animo a que todos aquellos proyectos de Google Code que tengas como favoritos, conozcas o hayas consultado alguna vez, los exportes a un respositorio público de Github, si no lo están ya en Github u otra plataforma de las citadas. Entre todos podemos perpetuar el ecosistema de código abierto que inició Google Code.
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 X, Windows, 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.
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: