Secciones

jueves, 19 de mayo de 2016

StoryTelling y como crear tu propia aventura online



https://c1.staticflickr.com/3/2930/14134388517_b65d0cae99_b.jpg

Se conoce como Story telling al acto de transmitir una historia o relatos de longitud variable. Puede usar cualquier medio de comunicación, puede ser un breve escrito con palabras e imagenes, una improvisación contada sobre un escenario, o incluso relatos web interactivos.

Tradicionalmente se han usado fábulas, cuentos, anécdotas y otras narraciones para tratar de educar, entretener, y transmitir la cultura de unos individuos a otros, siempre desde el respeto y la tolerancia a los puntos de vista de los demás. Pero No por esto se van a transmitir relatos "políticamente correctos" que no puedan molestar a posibles receptores. Hay que aprender a que no siempre vas a estar de acuerdo con lo que oyes o lees y que si algo no te gusta, o lo ignoras, o lo discutes. De hecho, cerrarte solo a los que opinan puede ser muy negativo ya que puede provocar ideas sectarias o falta de tolerancia.

http://www.martinarmenta.com/wp-content/uploads/2014/12/El-Viaje-del-H%C3%A9roe-4.png


Normalmente un relato cuenta con un argumento, personajes y punto de vista narrativo. Se puede, por tanto, usar técnicas tradicionales, como el punto de vista de el viaje del héroe, o usar tu propio punto de vista y estilo.

Las nuevas tecnologias nos han cambiado la forma de hacer historias, aunque el transfondo sea el mismo. Una muy querida amiga, estudió sobre esto y realizo su proyecto fin de master haciendo una herramienta de autor en la que desde una web, cualquiera que quiera hacer un breve relato siguiendo el camino del héroe puede hacerlo, solo tienes que acceder a su sitio web.

Por otro lado, existen alternativas OpenSource para hacer tus propia como twinery, donde usando una web y sencillos grafos, podrás crear tu propia historia y generar una web para disfrutarlo.

Como curiosidad, quiero hacerte notar que hay muchas formas de expresar sentimientos y transmitir historias, como la poesia callejera, por poner un ejemplo:
Subi al arbol mas alto
que tiene la alameda
y vi miles de ojos
dentro de mis tinieblas
Famoso verso de Lorca, citado en la canción Puta de Extremoduro, que desconocía hasta que me lo chivó un ángel. Cualquiera, sea informático, cantante, o poeta, puede aportar su granito de arena cultural, ahora más fácil, gracias a la tecnología.

lunes, 16 de mayo de 2016

Instalar un servidor de Minecraft en una Raspberry pi 2 modelo B

Hoy os voy a resumir como instalar, configurar, y utilizar un servidor de Minecraft. Para ello vamos a utilizar una imagen ya preconfigurada que encontramos en el foro de Raspberri Pi. Aunque me basaré en este post más actualizado y con la última versión.

Necesitaremos:
- 1 Raspberri Pi 2 Modelo B.
- Alimentación por USB, ya sea por enchufe o por un puerto que de corriente.
- Tarjeta SD de al menos 4 Gbs.
- Cable ethernet a un router

Usaremos la versión 2 de raspberri pi simplemente porque es más potente y tiene un Gb de RAM. Los modelos anteriores limitaban mucho el número de jugadores y tenían LAG a causa de la poca RAM que se podida dedicar al servidor. La imagen viene preparada para NO iniciar el cliente gráfico, ya que perderiamos rendimiento. Además está overclockeada para aprovechar mejor el Hardware.

Pasos para la instalación:
1º  Descargar la versión de la imagen MinecraftPIV3.0

2º La descomprimimos y volcaremos a la tarjeta SD con Win32DiskImage si usas Windows o con el comando dd si estamos en Linux:

sudo dd if=raspberripiv3.img of=/dev/sdX

Con X el identificador de la tarjeta. Alternativamente podemos usar usb-imagewriter que está en los repositorios oficiales.

3º Introducimos la tarjeta SD y enchufamos la tarjeta.

4º Nos conectamos remotamente a la raspberri pi. Si tienes una pantalla fisicamente conectada puedes ver su IP directamente, sino, basta con ver los clientes conectados al router y buscar el que se llame MineCraftPi. Por comodida, si sabes la MAC de la raspberri, puedes asignarle una IP fija para conectarte por SSH siempre a la misma.

5º Nos logueamos con el nombre de usuario pi y el password raspberri . Si usas ssh, por ejemplo PUTTY en Windows o el comando ssh en Linux, usa la ip y el puerto 22.

6º Cambiamos el usuario y ejecutamos build tools para compilar el servidor y tomate un café en los 55 minutos que tarda.

git config --global --unset core.autocrlf
sudo java -jar /opt/MineCraft/BuildTools.jar
 

Si te da un error del tipo java : Exception in thread "main" org.eclipse.jgit.api.errors.JGitInternalException: Invalid ref origin/master 

6.1º  Borra el contenido de la carpeta:

sudo rm -fr /opt/MineCraft/*

6.2º Baja de nuevo BuildTools

sudo wget https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar

6.3º Tomate un café en los 60 minutos que le costará descargarlo y compilarlo.

6.4º Vuelve a ejecutar BuildTools

sudo java -jar /opt/MineCraft/BuildTools.jar

7º Ejecuta por primera vez el servidor con el comando:

sudo java -Xms400M -Xmx915M -jar ~/work/minecraft_server.1.8.8.jar

8º Espera hasta que genere las propiedades y el eula.txt y se cierre automáticamente

9º Edita el eula para poner a true la variable

sudo nano ~/eula.txt

Con estos pasos podreis lanzar un servidor de Minecraft. Solamente tendreis que configurar el mundo por los métodos habituales.

NOTA: La raspberri anda justa de RAM, así que si no haceis que el mundo sea más pequeño de lo standard, puede que no funcione bien la IA de los NPCs y monstruos.

  


sábado, 30 de abril de 2016

Como hacer una copia de seguridad de Windows 10 y restaurarla correctamente

Antiguamente lo más cómodo para hacer copias de seguridad era simplemente usar una de las varias opciones que había para hacer una copia, y al restaurarla en otro ordenador normalmente no daba ningún tipo de problemas. Desde que Se introdujo el sistema UEFI, particiones GPT, y ha ido evolucionando la seguridad en Windows, cada vez es más complicado y menos intuitivo hacerlo correctamente.

Para hacerlo de forma sencilla me he basado en 2 aplicaciones gratuitas:
- AOMEI Backupper standard
- AOMEI Partition Assistance

Para hacer la copia de seguridad hacemos lo siguiente:
- Abrir AOMEI Backupper standard
- Pulsar en la pestaña de Backup
- Elegir la opción deseada, en mi caso prefiero hacer particiones, así que elijo Partition Backup
- Step1; Elegir la partición para usar.
- Step2; Elegir en donde la vamos a guardar, por ejemplo un disco secundario de datos.
- Dale a aceptar y esperar a que termine. Si es muy grande la partición tardará varias horas.

Problema: Al restaurarla en otro disco, la partición no arranca porque no tenemos el sistema de boot.

Para solventar esto, los pasos a seguir son:
- Abrir AOMEI Partition Assistant Standard
- Borrar la partición con Delete partition.
- Crear un nuevo disco que sea Basic MBR.
- Aplicar los cambios, y tendremos el disco listo.

Para restaurar la copia de seguridad hacemos lo siguiente:

- Abrir AOMEI Backupper standard
- Darle a Restore, eligiendo el backup a restaurar del paso siguiente.
- Elegir donde restaurarlo, eligiendo el disco que hemos preparado como Basic MBR
- Darle a Next, y esperar a que termine el proceso. Seguramente querreis expandir el disco para ocupar todo en el de destino.
- Abrir AOMEI Partition Assistant Standard
- En el disco destino, boton derecho rebuild MBR
- Ahora al arrancar, saldría un error del tipo: status-0xc000000e

Arreglar el boot a mano:
- Usar un disco de Windows 7/8/10 y arrancarlo desde el DVD o el USB bootable
- Elegir opciones avanzadas y abrir un terminal.
- Usar el comando diskpart
- Ver las particiones: list vol
- Seleccionar la del disco que queremos arreglar (En mi caso la 2): sel vol 2
- Poner una letra, temporalmente uso la M: assign letter=M:
- Salir de diskpart: exit
- Comprobar el estado del bcd con: bcdedit
- El campo device y el osdevice seguramente salgan en blanco, es lo que debemos editar.
- Comando: bcdedit /set {default} device partition=M:
- Comando: bcdedit /set {default} psdevice partition=M:
- Comprobar que está correcto con bcdedit
- Reiniciar eligiendo el nuevo disco, et voila!

Espero que haya sido útil.


jueves, 25 de febrero de 2016

Enfoque nativo en el desarrollo de aplicaciones móviles

Alternativamente podríamos titular esta entrada como hacer aplicaciones móviles multiplataforma y no morir en el intento.

Introducción


A la hora de hacer aplicaciones, el 90% de los dispositivos Android usan solo Java, y la mayoría de iOS usa Objective-C/Swift frente al uso de código C++ en ambas. Este sistema puede servir para muchos casos, pero implica en tener que codificar en 2 plataformas distintas. Por otro lado, si se separa el diseño en un SDK en C++ que contenga la lógica, y se usa un modelo vista – controlador, delegando el aspecto y la interacción a la parte móvil, conseguimos programar la lógica solo una vez, en C++, y tener separadas las interfaces en en cada plataforma. Se puede dar una vuelta de rosca más, y usar una web o framework que genere la misma interfaz para Android e iOS, aunque por el momento no hay una herramienta lo suficientemente potente o consolidada que ofrezca unos resultados de calidad.

Este enfoque no llama nada la atención si alguna vez has utilizado QT para hacer la interfaz de tu librería, en lugar de usar directamente ventanas de OpenGL o interfaces a tu S.O de escritorio. Incluso, puede usarse QT para hacer aplicaciones Android e iOS, pero aun no veo maduro el tema. Y por supuesto este diseño sirve para estos casos tradicionales en escritorio, hay muchas formas de afrontar esta problemática, pero voy a centrarme más en el caso concreto de los sistemas móviles.

Dropbox por ejemplo, utiliza este sistema porque creen que tiene muchas ventajas, puedes leer más sobre como hacen sus diseños en esta entrada.

Diseño


El diseño separa 2 grandes partes:
  • Por un lado, a nivel de aplicación, la interfaz o capa de presentación y el front-end, encargado de la comunicación al usuario con la librería encargada de la lógica.
  • Por otro lado, a nivel de motor, el back-end que procesa la entrada desde front-end para recibir y enviar todos los datos necesarios para el correcto funcionamiento a la capa de aplicación. 

Como se puede ver en la ilustración, la App Android y la App de iOS pueden diferir en lógica y elementos. Al ser 2 S.O distintos cada uno tiene sus peculiaridades, aunque ya he dicho antes que hay frameworks que pueden facilitar este desarrollo y podría ser delegada esta tarea en ellos.

Los front-end serán las capas encargadas de “traducir” el lenguaje de aplicación al nativo. En el caso de Android consistirá en una interfaz JNI que cambie funciones y valores de Java a C++ y viceversa, haciendo un uso correcto del back-end. En el caso de iOS la interfaz será entre Objective-C/Swift y C++. Aunque tengan diferente sintaxis o diferentes patrones de diseño, es deseable que sean calcados, para tener un conocimiento homogeneo del funcionamiento para todas las plataformas.

Añadir que en la parte de front-end, además de hacer llamadas a nativo, es deseable poder recibirlas. De esta forma se pueden hacer callbacks o llamadas asíncronas que notifiquen eventos en la capa de presentación. La forma más sencilla de hacer esto es proveer al inicio de la aplicación de un puntero a función, o callback que sea llamado de forma asíncrona y la aplicación pueda procesar esas peticiones usando threads o hilos coordinados.

Habitualmente uso la siguiente terminología:
  • Front-end de Android, InterfaceFromCJNI para llamadas de C++ a Java, e InterfaceToCJNI para las llamadas de Java a C++
  • Front-end de iOS, InterfaceFromONI para llamadas de C++ a Objective-C e InterfaceToCONI para el otro sentido. Usando un singleton y delegates tan comunes en iOS, se pueden unir en una sola clase.
  • Back-end, es conjunto, en C++ y lo suelo colocar como un Facade con llamadas estáticas por su versatilidad y flexibilidad si se rediseña el SDK.
  • Core o lógica serán todas las llamadas encargadas de la gestión lógica de la aplicación deseada. Algunas directamente llamadas desde la fachada, pero no tienen porque estar todas. De esta forma puedes hacer distintas fachadas en función de las configuraciones al exterior.

Diferencias


Pros:

  • Ahorras el programar la lógica en distintos lenguajes 2 veces.
  • Más fácil reciclar el código para usar también en escritorio y otros S.O
  • Separación lógica de diferentes comportamientos.
  • Con algo de código extra puedes adaptar un mismo core para aprovecharlo en distintos proyectos.
  • Permite la gestión externa de errores mediante logs y variables.

Contras:

  • Back-end vs core puede ser redundante.
  • Toda la lógica tiene que tener un puente hasta el core, muchas veces código repetitivo.
  • No es común el perfil de programador


Logs a bajo y alto nivel

 

Aunque hoy en día cualquier programa se puede debugear con muchas herramientas, gdb, eclipse, Visual Studio, Xcode... No hay que subestimar el uso de logs estratégicamente colocados en nuestro código. Por varias razones:
  • Dan información util.
  • Ayudan a aislar errores de forma rápida.
  • Son rápidos, no necesitas parar la ejecución.
  • En Release también funcionan.
Por ejemplo, podemos conseguir que los logs de warnings comenten que esperaban algún dato o estado y que se ha seguido ejecutando a pesar de ello. Se puede informar errores producidos en la ejecución, y se puede terminar o no con ella. O simplemente se puede informar de que se pasan por diversos Checkpoints o zonas, para saber que partes se han ejecutado y que otras partes no.

Los logs toman una especial importancia en plataformas móviles, porque son más dificiles de debuguear que los ejecutables normales, cuesta más tiempo hacerlo, y a veces es un verdadero quebradero de cabeza.

Por supuesto esta información no sustituye el uso de debuggers, pero es complementaria y muy útil si son colocados de forma estratégica. Además, si usas alguna macro, se pueden mostrar o dejar de mostrar según interese con el cambio de alguna definición. Una de mis headers favoritos para logs es este.


Peculiaridades de Android

 

Android es una de las plataformas móviles más extendida actualmente. Por desgracia, el ecosistema Android cambia constantemente y las herramientas de desarrollo se han ido adaptando a lo largo del tiempo. Además, hay una gran fragmentación de dispositivos, no es algo intrínsicamente malo, pero seo hace que haya que testear muchos dispositivos diferentes y el diseño de interfaz tiene ciertas peculiaridades. Por cierto, aunque lioso al principio, una vez comprendido es fácil de usar y potente, en el caso de iOS no es así, porque al principio contaban solo con 1 tipo de dispositivo, y el número ha ido creciendo a lo largo del tiempo, y los parches para adaptarse a todos ellos con el diseño de una interfaz son un desastre.

Cosas que debes saber antes de desarrollar en Android
  • Normalmente necesitas saber Java, usar C++ es complicado y engorroso al principio.
  • Para manejar una librería C++ necesitas usar JNI, es decir, traducir llamadas y variables de java a C++
  • En Java tienes que cargar la librería dinámica (*.so) de C++, Ejemplo 
  • Para realizar llamadas de C++ a Java puedes usar un puntero a función y recoger mensajes, como podeis ver aquí.
  • El verdadero reto es crear las llamadas desde C++ usando JNI
  • Una buena estrategia puede ser usar todo librerías estáticas, y crear una librería dinámica forzando al compilador que meta todo el código para evitar problemas con factorias. Para GNU en Cmake deberías TARGET_LINK_LIBRARIES(cmakeproject -Wl,--whole-archive yourcpplibrary -Wl,--no-whole-archive)
Para sabes más sobre JNI mira la documentación oficial, o busca tutoriales.


Peculiaridades de iOS

 
iOS es otra de las plataformas más extendidas. Es más dificil publicar aplicaciones en la store que en Android, debido a sus multiples restricciones en los procesos de validación. Normalmente los dispositivos son más caros, y sus usuarios están más dispuestos a pagar. Hace unos años era más fácil hacer interfaces, porque no había variedad de tamaños, pero ultimamente han salido diversos modelos, y se han sacado de la manga los constrains y auto-layouts para lidiar con diversos dispositivos. Habiendo usado los de Android e iOS, me quedo sin duda con Android. El sistema de APPLE no está nada pulido, da muchos comportamientos imprevistos, y la teoría no se corresponde para nada con la práctica. En Android no es tan complicado.

Cosas que debes saber antes de desarrollar en iOS.
  • Objective-C es una variante de C/C++, su integración es sencilla y no necesitas un JNI.
  • El standard de ficheros de *.m, pero si lo renombras a *.mm aceptará código C.
  • Solo se puede linkar librerías estáticas, por temas de seguridad (según ellos)
  • El ejecutable final debe tener por tanto todas las librerias, y su configuración es totalmente manual.
  • Es recomensable usar variables user-defined en el proyecto, combinadas con $(SRCROOT) y paths relativos puede tener proyectos multiusuario sin tener que cambiar la configuración de forma manual entre ordenadores.
Con toda esta información espero que os podais hacer una idea de como hacer unos diseños eficientes. Para cualquier sugerencia o retoque, aportación de información y bibliografía, poneos en contacto conmigo.

viernes, 19 de febrero de 2016

Conexión SSH con vuestro NAS Synology

Introducción: 

Para realizar una conexión por SSH a vuestro NAS synology, hay una serie de aspectos que debereis tener en cuenta y que describo a continuación.

Como habilitar el servicio:

Para activar el servicio SSH solo teneis que ir a:
  • Control panel > Terminal & SNMP > Enable SSH at port 22
No te recomiendo usar telnet, ya que la conexión no está protegida como el caso de ssh.

Como utilizar servicio:

Para utilizar el servicio, teneis que conectaros obligatoriamente con el usuario admin. Este usuario tendrá la contraseña del usuario administrador del NAS. Aunque no te podrás conectar con este.

Comando
ssh admin@IPtoNAS
Ejemplo usando un DDNS habilitado
ssh admin@vgonisanz.synology.me
Alternativamente puedes usar un cliente como putty o fireSSH

¿Por que no cambiar el puerto 22 por defecto?

Muchas personas, están tentadas de cambiar el puerto por defecto para "despistar" a atacantes que llaman a ips al azar y tratan de loguearse con contraseñas por defecto. Yo lo intenté cuando el NAS me avisaba de la cantidad de IPS que bloquea que intentan entrar. ¿Es efectivo? En realidad no.

La razón es que aunque el puerto por defecto sea el 22, los atacantes probaran con varios puertos, no solo con 1. Así que aunque no todos, seguirán llegando. No se pueden abrir puertos por debajo del 1024. La razón es que estos están reservados solo a conexiones de administradores de sistemas.Es decir, usando el puerto 22, solo se podrá abrir el puerto con acceso root, si está en el puerto 9999, se podrá abrir sin serlo. En este caso, con un simple script que imite ssh escuchando el puerto 9999, se podría robar tus contraseñas.

Si quieres sabes más del tema te recomiendo consultar este post.

¿Cómo proteger para evitar ataques?

Por defecto, synology viene configurado para bloquear N intentos fallidos en un periodo de tiempo T. Lo encontraras en:
  •  Control Panel > Security > Auto-block
Además, puedes poner IPs que no se bloqueen, por si a veces olvidas la contraseña y no tienes acceso físico al NAS. Es efectiva, fácil de activar (de hecho viene por defecto), y dificilmente entrarán en el sistema con unos pocos intentos a menos que hayas puesto tu admin con un password del tipo "1234", "qwer", "password".... No deberías usar ninguna de este articulo. Puedes hacerlo de forma "casera" como recomiendo la fundación Mozilla, o puedes usar un gestor de contraseñas.
Menu de auto bloqueo

Una solución algo peor, de la que hablo en el punto anterior, es cambiar el puerto, por ejemplo, al 9999. Aunque disminuyen, porque no todos prueban varios puertos, el sistema persistirá.

Una solución más elegante, es el bloqueo de regiones. Normalmente no te vas a teletransportar, ni viajar a paises como China, o Zimbabwe. Puedes hacer reglas en el firewall de forma sencilla que permitan solo acceder de tu pais, o denegar de ciertos paises.

  • Control Panel > Security > Firewall > Create...
Ahora no se podrá acceder desde China, a menos que usen proxys
 Y bueno, la solución más compleja es utilizar Port Knocking, descrito en este tutorial. Básicamente se configuran las tablas de sistema para aceptar solo conexiones que sigan un patrón. Dista de ser un método trivial, pero si te animas a implementarlo aquí tienes un tutorial que lo explica paso a paso.

Espero que todo esto te sirva para manejar como un profesional tu NAS a distancia.

lunes, 15 de febrero de 2016

Ajustando las mirillas del CSGO

Introducción:

En este tutorial de juegos vamos a enseñaros a como personalizar a vuestro gusto las mirillas en el CSGO usando comandos de consola. Es importante tener configurada una mirilla con la que nos sintamos cómodos y nos ayude a jugar mejor. Existen varios parámetros ajustables, tamaño, grosor, estática, que varíe… ¡Comenzamos!

Creador de parámetros de mirillas ONLINE:

En esta web podrás ajustar los parámetros de tu mirilla de manera automática, y podemos ver el resultado en la pantalla. Tiene una imagen con distintos contrastes para que podamos valorar como se va a ver nuestra mirilla en zonas brillantes, oscuras, y encima de los distintos modelos de CT y T del CSGO. Es muy útil para que puedas buscar la que más se adapta a tus necesidades.
Una vez creada tu mirilla, basta con que copies el comando de la zona inferior a la derecha en la consola. Recuerda que para usar la consola tiene que activarla en las opciones, y pulsar la tecla º para mostrarla. Si no consigues verla, añade el parámetro -console a las opciones de lanzamiento del CSGO.

Ejemplos:
  • Para una mirilla únicamente un punto:
cl_crosshairsize “0”;cl_crosshairdot “1”;cl_crosshairthickness “0.7”
  • Mirilla minimalista (Tipo Half Life):
cl_crosshairalpha “209”;cl_crosshaircolor “5”;cl_crosshaircolor_b “125”;cl_crosshaircolor_r “124”;cl_crosshaircolor_g “255”;cl_crosshairdot “0”;cl_crosshairgap “-1”;cl_crosshairsize “1”;cl_crosshairstyle “4”;cl_crosshairusealpha “1”;cl_crosshairthickness “0.5”;cl_fixedcrosshairgap “-1”;cl_crosshair_outlinethickness “0”;cl_crosshair_drawoutline “0”;
  • Mirilla variable y grande:
cl_crosshairalpha “164”;cl_crosshaircolor “5”;cl_crosshaircolor_b “50”;cl_crosshaircolor_r “50”;cl_crosshaircolor_g “207”;cl_crosshairdot “1”;cl_crosshairgap “0”;cl_crosshairsize “4”;cl_crosshairstyle “3”;cl_crosshairusealpha “1”;cl_crosshairthickness “1”;cl_fixedcrosshairgap “0”;cl_crosshair_outlinethickness “0”;cl_crosshair_drawoutline “0”;
  • Mirilla alto contraste no dinámica:
cl_crosshairalpha “201”;cl_crosshaircolor “5”;cl_crosshaircolor_b “182”;cl_crosshaircolor_r “153”;cl_crosshaircolor_g “74”;cl_crosshairdot “0”;cl_crosshairgap “-2”;cl_crosshairsize “2”;cl_crosshairstyle “4”;cl_crosshairusealpha “1”;cl_crosshairthickness “0.5”;cl_fixedcrosshairgap “-2”;cl_crosshair_outlinethickness “0”;cl_crosshair_drawoutline “0”;
  • Versión dinámica:
cl_crosshairalpha “201”;cl_crosshaircolor “5”;cl_crosshaircolor_b “182”;cl_crosshaircolor_r “153”;cl_crosshaircolor_g “74”;cl_crosshairdot “1”;cl_crosshairgap “-2”;cl_crosshairsize “1”;cl_crosshairstyle “3”;cl_crosshairusealpha “1”;cl_crosshairthickness “1”;cl_fixedcrosshairgap “-2”;cl_crosshair_outlinethickness “0”;cl_crosshair_drawoutline “0”;

Y mi favorita:

cl_crosshairstyle "4";

cl_crosshairdot "0";

cl_crosshairgap "-2";

cl_crosshairsize "1.5";

cl_crosshairthickness "0.25";

cl_crosshairalpha "255";

cl_crosshairusealpha "1";

cl_crosshaircolor "5";

cl_crosshaircolor_r "255";

cl_crosshaircolor_g "255";

cl_crosshaircolor_b "255";

cl_crosshair_drawoutline "1";

cl_crosshair_outlinethickness "0.25"
Espero que les haya resultado útil este tutorial. Un saludo.

Licenciando tu código

Usar licencias en nuestro código nos ayuda en muchos aspectos. Impide que otro se apropie de tu trabajo indebidamente, y nos da crédito, de cara a buscar un trabajo o poder desarrollar un rol como diseñador/programador en el futuro. Por eso, es importante colocar en las cabeceras, que tipo de licencia rige el código fuente, para que los demás puedan utilizarlo y respetarlo al mismo tiempo (si es permisiva claro).

Hay muchos tipos de licencia, me inclino especialmente por las de código abierto, ya que respetan las 4 libertades de los usuarios definidas por Richard Stallman. Es más,la página de GNU ofrece un completo listado e información útil sobre licencias, clasificandolas compatibles, incompatibles con GPL, y licencias no libres. Si tienes dudas, mira sus recomendaciones.

Libertades del software libre
Tipos de licencia más comunes actualmente (2016):
A chart illustrating compatibility relationships between different free software licenses.  For details, see the FSF's license list page.
Evolución

 En la parte final de los enlaces, tienes un ejemplo de que lineas poner en los headers para asignar a tu código la licencia, por ejemplo, apache:

/**
* Copyright [2016] [vgoni]
*
*   Licensed under the Apache License, Version 2.0 (the "License");
*   you may not use this file except in compliance with the License.
*   You may obtain a copy of the License at
*
*         http://www.apache.org/licenses/LICENSE-2.0
*
*   Unless required by applicable law or agreed to in writing, software
*   distributed under the License is distributed on an "AS IS" BASIS,
*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*   See the License for the specific language governing permissions and
*   limitations under the License.
**/

Que puedo hacer y que no cuando uso software libre:

En función de tus dependencias, podrás licenciar tu código de una u otra manera, como este suele ser un tema lioso, trato de resumirlo con un sencillo ejemplo. Supongamos que crear un proyecto A, que no sabes como licenciar, y tiene una dependencia B+ΔB con otra licencia, siendo ΔB los cambios que hayas realizado en la dependencia (pueden ser nulos).

  • Si B tiene una licencia GPL, entonces A y ΔB debe ser GPL obligatoriamente.
  • Si B tiene una licencia LGPL, entonces tu A puede ser cualquier otra, incluso software privativo, y ΔB debe ser liberado como LGPL.
  • Si B tiene una licencia MIT o Apache, entonces tu A y tu ΔB puede ser cualquier otra, incluso software privativo.

Espero que todas estas indicaciones te ayuden a elegir sabiamente la licencia que más se adecue a tu código. Todas tienen pros y contras, si quieres que algo se expanda si y solo si como software libre, derivados incluidos, GPL, si quieres lo contrario, MIT/Apache, intermedio, LGPL. Elige bien pequeño padawan.



jueves, 28 de enero de 2016

Effect Games en Javascript

Buscando un poco como está el panorama de motores sencillos de juegos en Javascript, tropecé con Effect Games. En esta web, sus autores, Min & Joe, liberan en GITHUB con licencia MIT (Puedes usarla para lo que quieras) el motor completo en Javascript y tienen programado el back-end en Perl.



También tienen otras demos como un juego de mario bros 1, de naves, y de pompas. Al parecer montaron GoldCartridge.com pero parece que lleva años sin dueño el dominio.

Effect Games en Javascript

Buscando un poco como está el panorama de motores sencillos de juegos en Javascript, tropecé con Effect Games. En esta web, sus autores, Min & Joe, liberan en GITHUB con licencia MIT (Puedes usarla para lo que quieras) el motor completo en Javascript y tienen programado el back-end en Perl.



También tienen otras demos como un juego de mario bros 1, de naves, y de pompas. Al parecer montaron GoldCartridge.com pero parece que lleva años sin dueño el dominio.

miércoles, 27 de enero de 2016

Macros predefinidas oficiales para C/C++ que te pueden salvar la vida.

Si programais en C/C++, deberíais saber que existen sintaxis para tratar partes del código antes de ser usado, esta herramienta es llamada el preprocesador de C/C++ y es el primer programa invocado por el compilador.

Sintaxis:
  • #include "filename.h", se utiliza para hacer referencias a cabeceras de código, que contienen la descripción de variables y funciones a usar. Ya sea de la propia librería o de otra.
  • #define __VAR__ ARG_OPTIONAL, se utiliza para crear una variable, puede verse si existe con #ifdef o #if (defined(__VAR__)), o ser sustituido por el ARG_OPTIONAL
  • #if, #elif, #else, se utiliza como un if normal
  • #ifdef, #ifndef,#elif, #else, se utiliza para comprobar si se ha definido cierta variable
  • defined(__VAR__), devuelve 1 si existe un define previo de la __VAR__
  • #warning "message", se utiliza para informar de errores SIN parar la compilación, visual studio no la soporta, puede usar #pragma "message" como alternativa.
  • #error "message", se utiliza para informar de errores Y parar la compilación

Macros predefinidas:

Viene bien tener la referencia a las macros de GCC y de MVS. No todas tienen porque ser soportadas por otros compiladores, que o bien las ignorarán, o bien fallarán y tendrás que anidarlas en el típico #ifndef(_MSC_VER). Gracias a esto puedes controlar el tipo y la versión del compilador, para alertar de funcionalidades o fallos y hacer la vida más fácil a otros desarrolladores que usen tu código.


¿Realmente son tan importantes?

Mirar siempre los includes que usas es realmente importante para entender que cosas está teniendo en cuenta el código antes de compilarlo. De esta forma se puede diferenciar distintas plataformas, arquitecturas, tamaños de vectores y datos en función de la capacidad de la máquina para la que se compila.

Me encontré este problema por olvidarme al pasar de un proyecto a otro código preprocesado, al no estar definidas ciertas cosas y usar unos no oficiales confundía código de Android y Ipad, con efectos desastrosos en la imagen. Obviamente cuando se ve azul en lugar de correcto sabes que algo va mal, pero es cuestión de habilidad y experiencia encontrar rápidamente la fuente del error. Mi fallo fué omitir en todo el proyecto, en dispositivos __APPLE__ el include de C con los defines:
#include "TargetConditionals.h"
Este include de apple define muchas variables de preprocesado muy útiles a la hora de distinguir iOS de MAC y otras plataformas.

Otros ejemplos:

- Gracias a ayuda de ciertos usuarios en StackOverFlow pude desarrollar un logger multiplataforma para ofrecer información útil ordenada en distintos dispositivos. No es thread-safe.

- Básico, si usas mi logger.h puedes usar este código para printear info en cualquier cpp:

#include "logger.h"
#define LOG_TAG "MyCpp"


#pragma "Let's check our arch"

#ifdef __linux__
    // All linux arch
#elif _WIN32
    // Windows 32 and 64
#elif __APPLE__
#  include "TargetConditionals.h"
#  ifdef TARGET_OS_IOS
    // including iPhone and iPad
#  elif TARGET_IPHONE_SIMULATOR
    // iOS Simulator
#  elif TARGET_OS_MAC
    // Other kinds of Mac OS
#  else
     // Unsupported platform
#  endif
#elif __ANDROID__
    // Android all versions
#else
    // Unsupported architecture
#    error "I don't know the arch"
#endif

#if defined(LOG_TAG)
    #pragma "Log tag is defined in this cpp"
#endif

jueves, 7 de enero de 2016

Usando NoScript

Logo

Si has instalado esta extensión en Firefox, la primera semana te volverás loco intentando navegar por internet, todo bloqueado. Conforme vayas añadiendo las web que uses y en las que confies, se acabarán los problemas.

 Te pongo las primeras que vas a encontrar:
  • Options > Allow global. Permite todo javascript, usar excepcionalmente si hay prisa y no va algo importante, no recomendado.
  • Options > Untrusted > Dominio. Lista de dominios no deseados
  • Options > Temporal Allow > Dominio. Permitir esta sesión
  • Options > Allow > Dominio. Permitir siempre hasta que se diga lo contrario
Ejemplo en FinoFilipino, esta página carga muchas cosas innecesarias, ojo.
Algunas páginas aceptables:
  • http://vgoni.blogspot.com.es/ este blog, si, si te fias de blogspot y de mi
  • www.google.es navegador web, preferible usar duckduckgo, aunque no es tan bueno ni de lejos
  • www.tumblr.com, famosa mezcla de red social y contenido compartiro
  • www.wikia.com, wikis.
Redes sociales, gestores de contenido (CDN), tu verás si las dejas o no, acepta si las usas, ten en cuenta que ganan dinero con tus datos.
  • www.nocookie.net Gestor contenido de imagenes y ficheros, para wikis.
  • www.googleusercontent.com Gestor contenido de google
  • *.cloudfront.net Gestor de contenido mutiples sitios (Trello)
  • www.facebook.com Facebook
  • www.facebookcdn.com Contenido de facebook
  • ytimg.com servidor visitas miniatura de Youtube.
  • https://www.cloudflare.com/ proxy gratuito que usan webs para ofrecer contenido.
  • http://ytimg.com/ imagenes de youtube
  • www.twimg.com, imagenes de twitter
  • www.twitter.com, red social.
  • www.txmblr.com contenido extra de tumblr
  • www.youtube.com, contenido de videos.
  • vine.co para reproducir videos de esa web
  • zappinternet.com, mas videos.
  • www.disqus.com, sistema de comentarios.
  • *.amazonaws.com, servicio de datos en la nube, necesario para contenido multimedia.
  • jwpcdn.com, más contenido.
Especial atención, pagos por internet:
  • www.stripe.com, API para pagar por internet, autorizar solo si necesitais.
  • www.intercom.io, API para comunicar webs con clientes, solo si sabes lo que haces.
No aceptables, estadística, cookies y seguimiento:
  • www.amung.us, estadísticas.
  • www.cedexis-radar.net, estadísticas en tiempo real, no necesario
  • www.googletagmanager.com servicio de google para webmasters que etiqueta el contenido. No es necesario y hace seguimientos
  • www.google-syndication.com servio
  • www.quantserver.com Crea web beacons y cookies, evitar
  • wikia-beacon.com Beacons de las web derivados de wikia.com
  • www.statcounter.com Contadores y perfiles de cookies
No aceptables, anuncios, premios dudosos:
  • www.smartadserver.com, anuncios malos.
  • www.adm-vids.info, anuncios en videos
  • www.scorecardresearch.com, evitar, estadística, premios, y cosas raras
  • www.doubleclick.net gestores de publicidad
Estos son algunos ejemplos, depende de donde navegues te encontrarás unos u otros. Tras meses ya usando este add on en firefox, he notado mucha diferencia cargando páginas. De hecho, al tener que ejecutar menos javascript, se gana en velocidad de carga, aunque como ya he comentado, muchas páginas fallarán ciertos servicios como compras, búsquedas, si no habilitamos correctamente los javascripts a ejecutar. Al principio parecerá que estamos desactivando bombas.

En general, la carga se hace de forma más rápida, y ayuda en parte a mantener nuestra privacidad y hábitos. Aunque claro, no te hace anónimo, para conseguir esto habría que usar Tor, y seguir un comportamiento donde no usemos nuestros avatares y perfiles oficiales en cuentas de redes sociales, DNI electrónico, y cualquier otra web en la que puedan relacionarnos... pero eso es ya otro asunto. En microsiervos se hacen eco hoy de este asunto.

Si todo esto te parece engorroso, puedes usar Ghostery , que no te va a proteger contra la ejecución de Javascript, pero vas a navegar sin dar 100 clicks dejando cada cosa funcionar. Puedes evitar mucho rastreo de forma cómoda y fácil.