Android links recopilation

Pongo una recopilación de enlaces, sobre android:

1º SDK (sdk android)
http://developer.android.com/sdk/index.html

2ºEclipse Helio (para Java o Classic)
http://www.eclipse.org/downloads/

3º ADT 18 (plugin eclipse)
Según Google: http://developer.android.com/sdk/eclipse-adt.html
Según Mind the Robot: http://mindtherobot.com/blog/209/android-beginners-from-bare-windows-to-your-first-app/

4º NDK (c++ / NativeActivity)
Según Google: http://developer.android.com/sdk/ndk/index.html
Según Mind The Robot: http://mindtherobot.com/blog/452/android-beginners-ndk-setup-step-by-step/

Interesante:
Charla sobre NDK: http://www.youtube.com/watch?v=byFTAhXVF7k&feature=player_embedded#
Google I/O 2011: Bringing C and C++ Games to Android: http://www.youtube.com/watch?v=5yorhsSPFG4
NativeActivity: http://developer.android.com/reference/android/app/NativeActivity.html

Cursillo acelerado de Lua + Luabind

Buenas, tras 1000 años sin escribir, hago un paréntesis para pastear un post que he puesto en un foro privado que posiblemente caiga en el olvido, y sería una pena, ya que seguro que el tema le interesa a alguien. El post dice así:

Buenas:

Tras la conversación con Ardían, y gente que he visto en los foros que estáis interesados en aprender Lua/Scripting. Yo tengo bastante experiencia porque lo estoy usando intensivamente para el PFC.

No creo que haga falta evangelizar mucho los beneficios de Lua, se vende por si sólo, pero vamos:
– Es muy rápido. Si una llamada directa a un método hace 2 usos de la pila, haciéndola a través de Lua, puede que aumente a 4 o 6 usos.
– Es más rápido usar el lenguaje a pelo, esta claro, pero hardcodearte todo, es una práctica de programación bastante mala. El poder hacer desacoplamiento de la lógica a cambio de perder una microsegundos por llamada, vale la pena y bastante.
– Aceleras el desarrollo al no tener que necesitar compilar. Ya solo por este motivo, tendrías que usarlo.
– Existe un compilador que lo convierte en bytecode (como java) y supuestamente te acelera la carga inicial, aunque se suele usar más para proteger los scripts. (Yo nunca lo he usado).

Lua es para C, no permite nada de POO, y se basa mucho en la pila, es bastante jodido. Pero con Lua + LuaBind el bindeo del API es muy fácil, permite herencia simple y múltiple, polimorfismo, sobrecarga de operadores, etc, etc … Se usa muchísimo en videojuegos profesionales.

He hecho un código independiente y compilable con un montón de pruebas individuales que abarcan el 90% del día a día con luabind. Estudiaros el tema, porque si lo conocéis, no podréis dejar de vivir sin Lua+Luabind XDD

Os lo paso compilado para Linux, pero lo interesante es el código y los comentarios que he hecho deprisa y corriendo.

De todas formas para compilarlo en Ubuntu/Debian:
sudo apt-get install liblua5.1-0-dev libluabind-dev
make
./main

Un saludo. Ricardo

No se cuento durará el link, asi que lo pongo en pastebin:

main.cpp – http://pastebin.com/b2JBy17Q
test.lua – http://pastebin.com/5v6Dx2JC
Makefile – http://pastebin.com/0NPkQATN

Espero que os sea útil !

Linux: Limitación de Descarga y Subida a nivel de Kernel

Teoría:

Cuando alcanzamos los límites de nuestra conexión, ya sea en subida y/o en bajada, los tiempos de respuesta (latencia, ping) se disparan, debido a que se están formando colas en el router. Y en general, los routers domésticos, gestionan muy mal las colas (son sistemas embebidos con muy poca memoria).

Por ello, es mejor acumular las colas en nuestros potentes ordenadores, en lugar de nuestros tristes routers que regalan con las portabilidades.

Realmente, lo de acumular la cola en el host, solo sirve para la subida, ya que la subida solo depende de nosotros. La técnica para controlar el límite de bajada es el siguiente: nuestro ordenador recibe paquetes, y tiene capacidad para gestionar todo el flujo pero intencionadamente se descartan paquetes hasta conseguir el flujo deseado. El punto anterior en la traza hasta nosotros, se dará cuenta que estamos descartando paquetes. Todos los routers interpretan esto como congestión, aunque sea congestión simulada. El router emisor se relaja hasta que le aceptemos todos los paquetes, que será cuando alcanzemos el flujo de descarga deseado. El único problema, es que cíclicamente los emisores probarán suerte volviendo aumentar el flujo para ver si hemos superado la congestión, y necesariamente cíclicamente se descartarán paquetes. Esto no es grave, también pasa cuando descargamos algo, y llega al auténtico límite de nuestra conexión, pero es interesante comentarlo.

Todo esto de controlar la congestión mediante colas en el propio host para mantener las latencias se denomina QoS. Calidad de servicio.

Aunque algunos routers caseros han intentado implimentar el QoS, en si experiencia, dejan bastante que desear. Si queremos un QoS de calidad, la única opción es montar un host sobre Linux que hará la función de router, entre otras cosas gestionando todos los flujos con QoS y prácticamente capacidad para colas tan grandes como nuestra capacidad RAM.

Si nuestra LAN es pequeña, este esquema no es barato, tener que tener un pc 24 horas con la función principal de rutear (pero router de calidad empresarial eso sí.). Otra forma sería poner los límites en cada uno de los hosts.

Evidenetemente las restricciones las pondrá un root, para que no haya forma de saltarse los límites de descarga/subida. Esto en Linux en fácil, en Windows, por su mal diseño, te obliga a trabajar como administrador, y por tanto podrías cerrar procesos como NetLimiter que realizan tambien QoS, pero en Windows.

Linux utiliza el comando “tc” para controlar los flujos, pero su uso es realmente extenso, por ello existe un script cuya funcionalidad se limita a un caso de uso muy común (limitar todo el ancho de banda, bajada y subida sin diferenciar Web de Emule, etc …). El script en cuestión es wondershaper.

Bueno, pasamos a lo interesante xD.

Práctica:

Hacemos un test de velocidad, asegurate que nadie use internet, o desenchufa a todos en el switch xD. Necesitamos los datos de la conexión en Kbps (bits). Es decir para 6 Mb de bajada 1 Mb de subida son 6144Kbps / 1024Kbps teorícos pero por el over heat del TCP/IP será un 15-20% menos, supongamos 5100/750. Ese es el limite real, que sera lo que deevuelva un test de velocidad. A ese resultado reducirlo otra 20% más, como margen para permitir una ventana de concurrencia con los demás hosts, quedandose 4080 Kbps / 600 Kbps. Hemos puesto un colchon de un 20%, debeis probar varios valores, entre mayor sea el colchón más asegurado esta el ping. con un 20% debería no subir nunca el ping, pero si de por sí vuestro router es malo(puede repartir mal el tiempo entre bocas), por puede que necesiteis más colchón para asegurar la calidad del servicio. Ahora simplemente INSTALAR Y LIMITAR.

Instalamos el script: sudo apt-get install wondershaper
Con ifconfig miramos nuestro interfaz en uso: Por ejemplo, en mi caso eth0.
Limitramos la conexión: sudo wondershaper eth0 4080 600
Yo aparte me he puesto un alias en el .bash_aliases: alias limitar=’sudo wondershaper eth0′

Ahora hay que hacer pruebas, limitar todos los hosts, aumentar la concurrencia y en todo host debería tener unos tiempos mínimos de latencia. Si realmente necesitas un colchón muy grande, como un 60% o así, es que tienes un problema en tu red, probablemente exceso de colisiones, puede que uses un hub, o que la red sea muy grande y necesites separar los dominios de colisión con routers o puentes.

El script depende de iproute, en otras distribuciones tambien llamado iproute2, en ubuntu viene instalado, pero igual en otras distribuciones no viene.

Cuando ya tengais los valores correctos, para hacerlo definitivos:

1º Editamos: sudo gedit /etc/network/interfaces
2º Y lo dejáis así, pero con vuestros valores :D:

auto lo
iface lo inet loopback
up /usr/sbin/wondershaper eth0 4080 600
down /usr/sbin/wondershaper remove eth0

Existen otras formas, más dinámicas y válidas para cualquier adaptador con los script de if.up e if.down pero a mi me vale así.

Por último para eliminar el QoS (y se puede deducir del paste anterior) escribimos:
sudo wondershaper remove eth0

Ya puedo jugar el Counter Strike, mientras los demás están con el JDownloader, Emule, Torrent … !! :D

Multiprogramación en Linux

He estado programando en multiproceso, para aclarar algunos conceptos, ya que en C++ no tenía mucha experiencia …
He subido el programa a pastebin, por si le puede ser útil a alguien que este empezando:

http://pastebin.com/kkqtc5f1 Se compila sin nada raro: g++ multiproceso.cpp -o multiproceso.

Hago uso de fork(), semaforos compartidos, memoria compartida …

Lo protendo implementar, (mucho más elaborado, y en su sitio), en mi PFC, ya que actualmente tengo un grado de concurrencia, pero solo a nivel de hilos, (multihilo), y ya que estoy planteando el juego de forma muy distribuida, estoy llegando fácilmente a tener entre 500 a 1000 hilos. Con esas cifras, que evidentemente debo reducir, ya que corro el peligro de sufrir mucho overheating en el planificador.

Todavía tengo que hacer pruebas para ver si es viable, pero mi intención es poner en otro proceso la capa de IA al menos, y la capa de animaciones, y tal vez otro procesos más, solo para raycasting. La comunicación entre procesos, pretendo que sea algo parecido al pastebin, pero implimentandome un heap que gestione los huecos.

Eclipse instalando el plugin de Android (ADT) en Linux

Si habeis instalado Eclipse mediante el Centro de Software Ubuntu, puede que tengais problemas siguiendo el procediemiento que explica Google.

Por tanto, probar hacerlo mejor así:

  1. Se supone que ya teneis instalado el paquete eclipse, instalar además el paquete: sudo apt-get install eclipse-jdt eclipse-pde , tal y como explica el Bug #477944 (aunque esta un poco caótico).
  2. Ahora debeis ejecutar Eclipse y en Help -> Install new software, debeis añadir estos 2 sitios:
  3. Ahora simplemente instalais “Developers Tools”, que activará automaticmante “Android DDMS” y “Android Development Tools”. Tendreis que aceptar todas las licencias que corresponda.
  4. Fin, ya podemos crear un proyecto. Tengo pensado publicar un trabajo que estoy haciendo de Android y explicar un poco hacer un HolaMundo en cuanto tenga tiempo.

Espero que le sea útil a alguien. Un saludo

Fuentes:
http://developer.android.com/sdk/eclipse-adt.html
https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/482244
https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/477944

Habrá Steam para Linux

Hace unos días, Valve ha lanzado la versión de Mac de Steam por todo lo alto, acompañado de ofertas y regalando el Portal.

En un artículo en el Telegraph se ha dicho:
“Valve has also confirmed that it will make Steam available to Linux users in the coming months.”

Cada vez siento que estamos más cerca de un mercado multiplataforma … pero todavía falta mucho, lo que esta claro es que es un paso importante para el Gaming.

En cuanto al rendimeinto, si Valve ha llevado sus juegos a Mac, que es una plataforma prima respecto a Linux (pero con un rendimiento bastante menor que en Linux como se demuestra en esta benchmark). Tras esta confirmación, Linux ofrece un rendimiento muy ligeramente inferior a windows actualmente, (principalmente por la calidad de los drivers).

Todos estos temas se debaten en este articulo, y llegan a la conclusión de que esta noticia puede representar toda una revolución para el mercado de los videojuegos en Linux:
http://www.phoronix.com/scan.php?page=article&item=valve_steam_announcement&num=1

Ahora solo falta pedir que su cliente  se licencie como GPL, lo cual, conociendo a Valve es casi imposible. Un saludo.

P.D: Me gustaría escribir más, pero este año estoy concentrado en la uni y he abandonado más de lo que me gustaría el wiithon y el blog. ¡¡ Quiero terminar el cuatrimestre !!

Fuentes:
http://www.telegraph.co.uk/technology/apple/7715209/Steam-for-Mac-goes-live.html
http://www.muylinux.com/2010/05/12/ya-es-oficial-%C2%A1steam-estara-disponible-en-linux

Cliente VNC no refresca

Hoy me ha ocurrido un efecto curioso. Conectaba al portatil de mi casa por VNC y solo me mostraba el primer pantallazo inicial, no refrescaba nada …

Volví a casa y haciendo pruebas vi que me ocurre desde que active el compiz (solo lo utilizo por el scale). Entonces la solución aunque no es la mejor, es buena, desactivar el composite/compiz.

Por cierto si vais mal de subida, el visor de escritorio remoto va a Full Color y realmente se toma su tiempo cada frame. Instalar “xvnc4viewer”, y simplemente con “vncviewer xx.xx.xx.xx” conectamos en 8 bits, funciona muy fluido, y para administración es más que suficiente. No obstante si quereis 24 bits (Full Color) añadir el parametro “-FullColor”.