Al invocar un servicio web (REST) desde una aplicación móvil (ioniccordova/phonegap), me aparecía el siguiente error:

XMLHttpRequest cannot load http://localhost:8080/equinox/catalogos/distritos. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin http://localhost:8100 is therefore not allowed access.

El servidor se está ejecutando mediante mvn jetty:run (localhost:8080) mientras que el cliente está ejecutandose mediante grunt serve (localhost:8100). Siendo dominios diferentes, el navegador bloquea la invocación del servicio por cuestiones de seguridad.

La solución es permitir el acceso CORS. El servicio web esta hecho con Spring, así que para permitir esto necesitamos crear y configurar un filtro.

SimpleCORSFilter.java

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {}

    public void destroy() {}

}

y para configurarlo

web.xml

...
<filter>
        <filter-name>SimpleCORSFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetBeanName</param-name>
            <param-value>simpleCorsFilter</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>SimpleCORSFilter</filter-name>
        <url-pattern>*</url-pattern>
    </filter-mapping>
...

applicationContext.xml

...
<bean class="mx.gob.tribunalqro.equinox.filters.SimpleCORSFilter" name="simpleCorsFilter"></bean>
...

Nota:
Esta es una implementación muy sencilla y que además agrega el encabezado a todas las peticiones, no sólo a los servicios web. Para ello, necesitamos colocar nuestros servicios en una url como api/v1/resource y mapear el filtro a esas url’s

Fuentes:

Anuncios

Necesitaba hacer un reporte con un tipo de letra que no viene instalado en Ubuntu por default, así que investigando un poco encontré que hay varias ubicaciones donde puedes copiar el archivo de la fuente. Estas ubicaciones están definidas en el archivo /etc/fonts/fonts.conf. Por default incluye /usr/share/fonts, /usr/local/share/fonts y /home//.fonts (dónde es tu nombre de usuario).

Lo más fácil es crear la carpeta .fonts, si no existe, en tu carpeta de usuario.

mkdir ~/.fonts

Luego copia ahí las fuentes que deseas instalar.

Finalmente ejecuta el comando

sudo fc-cache -f -v

para actualizar la lista de fuentes disponibles, luego cierra y abre los programas dónde deseas utilizar la fuente o reinicia tu máquina y listo!

Fuentes:
https://wiki.ubuntu.com/Fonts#Manually

Normalmente utilizo Evernote para almacenar notas rápidas sobre cualquier cosa que considere importante: una idea para un software, un número de reporte de alguna compañía, fotografías y precios de productos para comparar, etc.
Pues existe un plugin llamado Web Clipper que te permite agregar fácilmente contenido web a una nota. Por ejemplo, la imágen de un producto o el texto de algún sitio.
La primer duda que tenía sobre su uso, era ¿cómo agregar “clips” a una nota existente? Al parecer, esta funcionalidad no ha sido implementada, así que cada clip que quieras guardar irá a una nueva nota. Para obtener el mismo efecto podemos crear un libreta específica para el contenido que queremos guardar. Por ejemplo, si quieres remodelar tu sala de TV podrías crear una libreta llamada “remodelación de sala de TV” e ir guardando las imágenes o productos relacionados mediante Web Clipper, de esta forma, tendrías todas las notas en la misma libreta.

Si quieres imprimir la libreta donde guardaste las notas, primero tendrás que combinar las notas. Ve a la libreta y selecciona las notas mediante CTRL+Click y te aparecerá la opción de combinar. Una vez hecho esto, imprime la nota resultante 😉

Necesitaba agregar un encabezado a un servicio REST de acuerdo a un parámetro. Para poder hacer esto, necesitas tener acceso a un objeto javax.ws.rs.core.Response de la siguiente manera

    @GET
    @Path("descarga")
    public Response getContenidoDocumento(@QueryParam("documento")String idDocumento,@QueryParam("formato")String formato){
        try {
            if (formato == null)
                formato = "pdf";
            Documento documento = Documento.getDocumento(idDocumento);
                if (formato.equals("pdf")) {
                        return Response.ok(documento.getPDF(),"application/pdf").header("Content-Disposition",
                                "attachment;filename=documento.pdf").build();
                } else if (formato.equals("rtf")) {
                        return Response.ok(documento.getRTF(),"application/rtf").header("Content-Disposition",
                                "attachment;filename=documentos.rtf").build();
                }
                return Response.status(Status.BAD_REQUEST).build();
        } catch (Exception exc) {
            throw new WebApplicationException(exc, Status.INTERNAL_SERVER_ERROR);
        }
    }

Recientemente he tratado de utilizar Google Chrome como navegador predeterminado (debido a la rápidez que ofrece) a pesar de que no tiene funciones que a mi me son de mucha utilidad -p. ej. CTRL+TAB para intercambiar pestañas de forma MRU, no puedes poner etiquetas a tus favoritos, etc.- Además de estos problemas, al utilizar scribefire y querer agregar mi blog de worpdress jamás logra completar el proceso de autorización (esto puede ser por un error en scribefire pero en firefox no sucede así).

Entonces para agregar un blog de wordpress a scribefire en Google Crhome necesitas hacerlo manualmente, es decir, llenar todos los campos a la hora de agregar el blog de la siguiente manera

Asegurate que el campo API URL quede http://tublog.wordpress.com/xmlrpc.php

Listo! Con eso ya podrías agregar tu blog de wordpress a scribefire 😀

Para poder sincronizar mi iPhone o actualizarlo, necesito hacerlo en una máquina virtual.

Creo que desde que actualice a la versión 11.10 de Ubuntu no había necesitado conectar mi iPhone a iTunes en Windows pero el día llegó y, al conectarlo, Virtulabox no me mostró el iPhone en la lista de dispositivos USB. Fui a la configuración de los dispositivos USB e inmediatamente me mostró el siguiente error:

entonces era claro que lo que necesitaba hacer era agregar mi usuario al grupo “vboxusers”, fácil, no? pues no, resulta que no lo podemos hacer en la configuración de usuarios en Ubuntu 11.10, tenemos que hacerlo desde la consola 🙂

Primero necesitamos ver si el grupo “vboxusers” existe, para ello ejecuta el comando “groupmod <TAB><TAB>” y te mostrará la lista de grupos que existen en tu sistema. Si no existe lo creamos mediante “groupadd vboxusers”.
Ahora hay que agregar tu usuario al grupo. Ejecuta el comando “sudo usermod -a -G vboxusers cirovladimir”, poniendo tu usuario obviamente 😛

Reinicia tu sesión y vuelve a intentar entrar en la configuración de los dispositivos USB. Ya no debería mostrarte el error y al ejectuar la máquina debería mostrarte los dispositivos USB.

Fuentes:
http://www.liberiangeek.net/2011/10/add-users-to-existing-groups-in-ubuntu-11-10-oneiric-ocelot-2/

Para agregar un lanzador personalizado -por ejemplo, si tienes una copia de Eclipse en tu directorio personal- al menú de aplicaciones lo más sencillo es hacerlo a través de la applicación “alacarte“. Se encuentra en los repositorios oficiales de Fedora y la instalas a través del administrador de software que trae Fedora.
La solución la encontré aquí.