Socket.io: tipos de llamadas socket

Para trabajar con socket.io una de las cosas más importantes es saber qué estamos enviando y a quién. Esta micro-entrada presenta las diversas llamadas para saber a qué socket estamos enviando:

Envío a todos los sockets abiertos

  • socket.emit() – envía de vuelta al cliente que ha enviado la petición (cliente A a cliente A)
  • socket.broadcast.emit() – envía a todos los clientes menos al que ha enviado la petición (cliente A a todos menos a cliente A)
  • io.sockets.emit() – envía a todos los clientes incluido el que ha enviado la petición (cliente A a todos incluido cleinte A)
  • io.sockets.socket(socketid).emit() – envia a un cliente específico mediante su socket id (cliente A a cliente específico)

Envíop a sockets en rooms específicas

  • socket.broadcast.to(‘nombrederoom’).emit() – envía a todos los clientes de nombrederoom menos al que ha enviado la petición (cliente A a todos los clientes en nombrederoom menos a cliente A)
  • io.sockets.in(‘nombrederoom’).emit() – envía a todos los clientes de nombrederoom incluido el que ha enviado la petición (cliente A a todos los clientes en nombrederoom incluido cliente A)
Web Socket

Web Socket

 

 

¿Qué es cosymantecbfw?

A veces nos encontramos con errores de layout o diseño en páginas que dábamos por buenas, y si examinamos el código nos encontramos con un objeto embebido con el id cosymantecbfw. ¿Qué es esto?

La respuesta es sencilla: se trata de un objeto inoculado por la extensión Norton Identity Protection del antivirus Norton Symantec, para control de la seguridad de las páginas y de nuestros perfiles y contraseñas, y que en ciertas versiones adquiere volumen al reducirse la resolución del navegador (por ejemplo en modo teléfono).

Tenemos dos soluciones:

 

Cordova Error: please install android target 17 (the Android 4.2 sdk)

Este error surge cuando preparamos nuestro proyecto Cordova desde consola y no tenemos las APIs de Android que requiere nuestro proyecto. En el caso de nuestro micro-tutorial es el 4.2 (API 17, es decir android target 17), pero podría ser cualquiera.

Para solucionarlo debemos poner android en la misma consola y nos saldrá el Android SDK Manager (que encontraréis también en la instalación). Desde allí podremos instalar lo que nos haga falta.

Android SDK Tools

Android SDK Tools

Recordad que el Android SDK y el proyecto Cordova de Apache no son lo mismo, de manera que configurar una cosa no significa que la otra reaccione.

 

No me encuentra un comando que he incluido en el path

Este micro-tutorial está pensado para evitar algunos quebraderos de cabeza. A veces configuro el path de Windows con la ruta para un comando específico (léase node, o java) y resulta que no funciona. Miro y remiro el path, y ahí está la ruta, pero no funciona.

La última vez me pasó con la instalación de node.js. La instalación me la puso al final del path. El problema viene cuando hay alguna instalación antigua en el path, o equivalente. El sistema lee el path desde el principio al final, y se para si encuentra lo que busca. De manera que una mala instalación o una instalación antigua puede invalidar la última instalación, ya que normalmente el programa las pone al final.

¿Solución? Poner la ruta en cuestión al principio. Creedme, muchas veces éste es el problema.

Configuración del path

Configuración del path – Poned siempre la ruta al principio

Moraleja: al configurar un path, es una buena idea poner siempre la ruta al principio.

 

Un error común en la instalación de PhoneGap / Cordova

Si algo ha ido mal en la instalación y configuración de PhoenGap, puede que os salga una pantalla como esta:

Consola - el error más común
Consola – el error más común

 

Este error es el que aparece cuando una o más de las configuraciones creadas anteriormente (Java, Ant, Android SDK) no responde. Si os fijáis, el comando create es un .bat en la carpeta android\bin que contiene lo siguiente:

@ECHO OFF
IF NOT DEFINED JAVA_HOME GOTO MISSING
FOR %%X in (java.exe javac.exe ant.bat android.bat) do (
SET FOUND=%%~$PATH:X
IF NOT DEFINED FOUND GOTO MISSING
)
cscript “%~dp0\create.js” %*
GOTO END
:MISSING
ECHO Missing one of the following:
ECHO JDK: http://java.oracle.com
ECHO Android SDK: http://developer.android.com
ECHO Apache ant: http://ant.apache.org
EXIT /B 1
:END

Fijaos bien que está buscando la ejecución de los comandos java.exe, javac.exe, ant.bat y android.bat. En la consola id al directorio \android\bin y allí ejecutad uno a uno estos comandos; así podréis detectar donde está el error. Incluso si no aparece error, puede que haya algún paso que os habéis saltado. A veces puede haber alguna complicación extraordinaria.

 

Hibernate 4: una introducción y un ejemplo básico

Introducción

Hibernate es un Framework de persistencia de Java. En esencia, la persistencia es la pervivencia de información en memoria para trabajar con ella o para traspasarla a otro lugar.

En el caso de la programación orientada a objetos, los frameworks de persistencia como Hibernate abren una sesión para trabajar con ellos y o bien utilizarlos durante la ejecución del programa o bien pasarlos a base de datos. Hablamos, entonces, de que un objeto está persistido cuando éste está en la sesión de Hibernate.

En los frameworks de persistencia existe otro concepto clave: el de transacción. En la sesión de Hibernate se abre también normalmente una transacción, que es la que controla todos los pasos que hay que dar con los objetos y, caso de que exista un error o fallo en medio del proceso, hace rollback, es decir, deshace lo hecho para evitar que nada quede a medias. El entorno de sesión y la transacción hacen de los frameworks de persistencia algo muy útil para trabajar con objetos y bases de datos.

Ejemplo básico – introducción con Eclipse e Hibernate Tools

En este ejemplo vamos a utilizar Eclipse Kepler for Java EE Developer (se recomienda Kepler por su integración con Maven aquí tenéis una excelente introducción a Maven) y una de las varias herramientas de Hibernate para ayudarnos a trabajar con Eclipse: Hibernate Tools for Indigo. Esta herramienta nos ayudará a crear el archivo de configuración, el fichero reveng.xml, la consola, los hbm.xml a partir de la base de datos, etc.

Para trabajar con Hibernate necesitamos:

  • un archivo de configuración (hibernate.cfg.xml) con los datos de conexión a la base de datos y el mapeo de los archivos *.hbm.xml (los ficheros de mapeo entre las clases y la base de datos). También se pueden usar annotations, aunque nosotores usaremos mapeo XML
  • los pojos y su correspondientes archivos hmb.xml, donde mapeamos los objetos con la base de datos y establecemos las relaciones.
  • una (opcional) clase con la que generar sesiones y controlar transacciones. Si no la creamos, podemos generar sesiones y transacciones en el mismo DAO. Estableciendo una clase creamos un constructor estático que nos permite crear la conexión y hacer un singleton con una instancia única de la conexión.

El flujo de trabajo es el siguiente:

  • Hibernate espera recibir un objeto y sus objetos relacionados para efectuar una acción sobre él.
  • Una vez lo recibe, abre una sesión (generada por la sessionFactory y como singleton, se llena de los datos del fichero de configuración de Hibernate y genera las conexiones dinámicamente para cada transacción) con la información que contiene el fichero de configuración hibernate.cfg.xml (lee el fichero, carga la información y crea el método getSessionFactory, que crea una sesión en memoria RAM y la retorna; en la sesión se traen los objetos mapeados a la memoria RAM; cuando hago un select o un get los objetos van a parar a la sesión de hibernate (son persistidos)).
  • Inicia la transacción, hace lo que tenga que hacer con ese objeto, cierra la transacción y cierra la sesión.
  • Si la operación es compleja e implica a muchos objetos relacionados, si hay un error o fallo en el proceso se establece un rollback para eliminar cualquier acción efectuada durante la sesión.

Ejemplo básico – pasos

1)    Creamos un poryecto Maven con el siguiente pom.xml

2)    Creamos la base de datos con el siguiente script.sql

3)    Si no las tenemos, instalamos las Hibernate Tools (Help -> Eclipse Marketplace -> Hibernate Tools for Indigo)

4)    Creamos el fichero de configuración hibernate.cfg.xml. Para ello nos situamos en nuestro proyecto y con el botón derecho New -> Other -> Hibernate -> Hibernate Configuration File (cfg.xml). Escogemos su situación (normalmente en resources, siguiendo la lógica de Maven) y ponemos los datos de la conexión a la base de datos.

5)    Creamos la consola de configuración de Hibernate (que le servirá al plugin entre otras cosas para generar código) (No veremos que Eclipse haya añadido nada, ya que se trata de una herramienta interna del plugin de Hibernate Tools)

6)    Creamos el fichero reveng.xml, que nos permitirá la ingeniería inversa) New -> Other -> Hibernate -> Hibernate Reverse Engineering File (reveng.xml). Nos situamos sobre el directorio resorces, ratificamos y en la página de configuración escogemos la consola que yahemos creado, le damos a Refresh para ver las bbdd e incluimos las tablas a mapear.

7)    Generamos el código poniéndonos sobre el iconos de las Hibernate Tools y seleccionamos Hibernate Code Generations Configurations…

8)    Llenamos los datos e indicamos qué queremos generar. Es buena idea volver a generar el fichero de configuración, pues en él se incluirá el mapeo de los ficheros hmb.xml.

9)    Si creamos las clases nosotros, sí podemos crear los hmb.xml mediante las Hibernate Tools y luego cambiar algunas cosillas. Para ello New -> Other -> Hibernate -> Hibernate Mapping file (hbm.xml), añadimos el package donde hemos creado las clases, nos aseguramos de que so las clases crradas, y las generamos. Es buena idea tenerlas en el directorio resources, junto con los otros ficheros de configuración y mapeo.

10) Tendremos que hacer, quizás, algunos cambios. Por ejemplo en mi caso:

  • No pilla la relación n-n, de manera que en el fichero cliente.hbm.xml:
<set name="productos" table="PRODUCTO" inverse="false" lazy="true">
    <key>
        <column name="IDCLIENTE" />
    </key>
    <one-to-many class="com.hibernate.model.Producto" />
</set>

Pasa a ser:

<set name="productos" table="CLIENTEPRODUCTO" inverse="false" lazy="true">
    <key>
        <column name="IDCLIENTE" />
    </key>
    <many-to-many class="com.hibernate.model.Producto" />
</set>

También ponemos:

<list-index column="idCliente"></list-index>
  • En el fichero Correoelectronico.hbm.xml:
<many-to-one name="cliente" class="com.hibernate.model.Cliente" fetch="join">
    <column name="CLIENTE" />
</many-to-one>

Pasa a ser:

<many-to-one name="cliente" class="com.hibernate.model.Cliente" fetch="join">
    <column name="IDCLIENTE" />
</many-to-one>
  • En el fichero Producto.hbm.xml:
<set name="clientes" table="CLIENTE" inverse="false" lazy="true">
    <key>
        <column name="IDPRODUCTO" />
    </key>
    <one-to-many class="com.hibernate.model.Cliente" />
</set>

Pasa a ser:

<set name="clientes" table="CLIENTEPRODUCTO" inverse="false" lazy="true">
    <key>
        <column name="IDPRODUCTO" />
    </key>
    <many-to-many class="com.hibernate.model.Cliente" />
</set>

11) Añadamos también cascade=”all” en los set de cliente.hbm.cfg para evitar el error object references an unsaved transient instance – save the transient instance before flushing

12) IMPORTANTE: en correoelectronico, cliente, identity:

<generator class="assigned" />

Pasa a ser

<generator class="identity" />

para evitar problemas con las foreign keys.

13) En dirección pasa a ser

<generator class="foreign">
    <param name="property">cliente</param>
</generator>

14) Como hemos dicho, la sesión y las transacciones las controlaremos desde una clase específica del DAO. Creamos un package q contenga los dao y añadimos el siguiente archivo HibernateHelper.java, que ya analizaremos convenientenmenet. Basicamente lo que ahce es inicializar una favctor´ñia de sesiones si no está ya incializada, y alrecibir la orden de guardar coge una sesión nueva, abre una transacción, ejecuta el sabe del objeto que se la ha enviado y cierra la transacción y la sesión.

15) Para probarlo podríamos hacerlo mediante JUnit, como haremos con las sesiones, pero vamos a crear un main, que tenéis en main.java.

 

 

Crear juegos para móvil con HTML5: Construct 2

Hoy en día decir ‘móvil’ en el mundo de las nuevas tecnologías es decir ‘negocio’ y ‘oportunidades’. Una de las maneras más interesante de empezar es con el estándar HTML5.

En este tutorial os presentamos Construct 2, una herramienta para construir muy fácilmente juegos sobre el canvas de HTML5 (en w3schools tenéis una muy buena introducción al Canvas). Si bien no es la única opción, en nuestra opinión es una de las mejores para iniciarse en el mundo del diseño de juegos.

Este tutorial se basa en nuestra experiencia personal. Hemos trabajado bastante con este programa y, si bien tiene algunas limitaciones, es muy recomendable y nos ha dado bastante ventajas con una curva de aprendizaje muy corta.

 

Construct 2

Construct 2

 

Cuánto cuesta

Hay una versión gratuita con algunas limitaciones (pero suficiente para hacer juegos relativamente complejos) y una de pago con todas las funcionalidades, ideal para juegos de gran complejidad. Nosotros finalmente tuvimos que ir a la de pago, pero pudimos hacer bastante con la gratuita.

Cómo empezar

En la página de tutoriales de Construct 2 encontraréis varios tutoriales de iniciación que os permitirán, en muy poco tiempo, crear un juego clásico de disparos y uno de plataforma.

Tutorial de iniciación

Tutorial de iniciación

 

Cómo funciona

Construct 2 genera un Canvas muy complejo, pero su uso es sencillo: se trata de escoger objetos, arrastrarlos al área de juego, y otorgarles, en el área de comandos, comportamientos, variables, tiempo, física, efectos, comportamientos, interacción con mouse, tacto o teclado, y un largo, largo etc.

Área de gráficos

Área de gráficos

El área de comandos es también muy sencilla de usar, dado que todas las opciones están convenientemente explicadas y listadas. Simplemente hay que saber qué queremos hacer y buscar la opción correspondiente.

Área de comandos

Área de comandos

Qué hago con mi juego

Constuct 2 os da la posibilidad de publicar vuestro canvas en varias plataformas, entre ellas iOS, Android o Facebook, ya sea mediante una siomple exportación o mediante precisas instrucciones.

Plataformas

Plataformas

 

Problemas

Como decíamos en la introducción, este programa no está exento de errores o problemas. El principal es que no siempre respeta una lógica aplastante. Al generar javascript, algunas veces puede traerproblemas con la asincronía, de manera que hay que hacer diversas comprobaciones antes de estar seguro que se respetará el orden de los eventos que hemos marcado. Si bien esto se ha solventado en parte en una actualización reciente mediante el uso de funciones, siguen habiendo problemas. Otro porblema es la incapacidad casi total de interactuar con el códigogenerado, dada su complejdiad. En definitiva, es un programa que a los programadores con experiencia puede llegar a irritar bastante.

Actualizaciones y comunidad

Dos puntos a favor: las actualizaciones son muy diversas y se generan a menudo, con incidencia casi nula en los proyectos en marcha. Por otra parte, la comunidad que crea con este programa es muy activa en la creación de plugins y en la participación en foros y creación de tutoriales.

 

WordPress – Poner un anuncio entre el primer y segundo post

Una de las preguntas que nos hacemos todos al empezar a jugar con Google AdSense es: ¿cómo lo hacen para poner anuncios entre el primer y segundo post en la página principal?

Hay varias opciones, desde plugins hasta la más sencilla, que es la que os propongo: añadirlo a pelo en el código:

 

1) En el área de administración id a Apariencia → Editor → Plantilla de la página principal (index.php).

Lugar en que insertar el código

Lugar en que insertar el código

2) Localizad la parte del código en que se generan los posts:

<?php while ( have_posts() ) : the_post(); ?>
    <?php get_template_part( 'content', get_post_format() ); ?>
<?php endwhile; ?>

3) Justo antes del  endwhile poned el código que necesitáis para vuestro anuncio de la siguiente manera:

<?php while ( have_posts() ) : the_post(); ?>
    <?php get_template_part( 'content', get_post_format() ); ?>
    
    <?php if ($count == 0) : ?>
          <script type="text/javascript">
          Tú código
          </script>
    <?php endif; $count++; ?>

<?php endwhile; ?>

 

¡Y ya está! ¡Fácil!

Recordad que es muy aconsejable no modificar la plantilla original, entre otras cosas porque si hay alguna actualización del tema que utilicéis, vuestros cambios se perderán. Lo mejor, por lo tanto, es seguir los consejos de WordPress acerca de la personalización de un tema mediante theme childs.

 

 

Abrir puertos en el Firewall de Windows 2008 Server R2

Para abrir los puertos de Windows 2008 Server R2 el primer paso (que no el único) es abrir los puertos en el Firewall. En el caso de que utilicéis el Firewall que Windows tiene instalado por defecto, estos son los pasos a seguir. No es difícil, pero algunos de sus detalles pueden resultar confusos.

1)    Abrid el Firewall de Windows con Seguridad Avanzada

Firewall de Windows con Seguridad Avanzada

Firewall de Windows con Seguridad Avanzada

 

2)    En la pantalla del Firewall, seleccionamos Reglas de Entrada. Por defecto los puertos están abiertos de salida y cerrados de entrada. En las reglas de entrada hay algunas reglas por defecto. Nosotros vamos a Añadir Nueva Regla.

Reglas de Entrada

Reglas de Entrada

 

3)    Podemos añadir diferentes tipos de reglas. Nosotros señalamos Puertos.

Puertos

Puertos

 

4)    Señalamos que se trata de una conexión TCP y señalamos el puerto específico que deseamos (o rango de puertos como señala el ejemplo).

TCP - Puerto o Rango de Puertos a abrir

TCP – Puerto o Rango de Puertos a abrir

 

5)    ¿Qué puede controlar la regla?

  • Permitir completamente la conexión
  • Permitir la conexión si es segura según parámetros específicos
  • Bloquear la conexión

Nosotros vamos a abrir el puerto, por lo tanto vamos a Permitir la conexión.

Permitir la conexión

Permitir la conexión

 

6)    Escogemos el entorno en el que esta regla se aplica. Si abrimos el puerto para una aplicación web, como Node, debemos marcar los tres.

Escogemos los tres entornos

Escogemos los tres entornos

 

7)    Ponemos un nombre y una descripción. Es una buena práctica poner una descripción para luego reconocer mejor nuestra regla entre todas.

Nombre y descripción

Nombre y descripción

 

8)    Nos aseguramos de que está en la lista y de que está activada (círculo verde).

Regla activa

Regla activa

 

Tenéis más información, cómo no, en Microsoft.

 

Interactuar con Worpdress: hooks, acciones y filtros

Hooks en WordPress

Los hooks (o ganchos) son la manera estándar de conectar (to hook) con WordPress desde un código propio. Con los hooks puedes ejecutar funciones en momentos específicos. Es la manera de hacer plugins o de interactuar con el Core de WordPress. Es importante mantener intacto el Core de WordPress, ya que, si no, en futuras actualizaciones podríamos perder toda nuestra funcionalidad.
Continue reading