mac os – como ajustar la fecha y hora EXIF de tus fotografías

25478_D5100_left

Tengo una cámara Nikon D5100 y nunca he podido establecer correctamente la fecha de la cámara, lo intenté algunas veces y siempre me daba una diferencia al ver las propiedades de la imagen en finder o en photos. No sé si por remover la batería, la zona horaria, horario de verano, al formatear la memoria o a que se deba.
Por ello, y debido a la importancia para el correcto ordenamiento en las aplicaciones de fotografía, necesitaba corregir las propiedades de las fotografías antes de importar los archivos a cualquier programa. Para ello existe una herramienta de línea de comandos (CLI) llamada ‘exiftool’. Para instalarla mediante brew simplemente ejecuta

brew install exiftool

después de ello posicionate en la carpeta donde tengas las fotografías y ejecuta el siguiente comando para corregir la hora de las fotografías (agregar 5 horas a la hora original, preservar las fechas de sistema y modificar directamente sin crear una copia)

cd /tmp/cancun
exiftool -alldates+=5 -P -overwrite_original_in_place *

nota: primero copie las fotografías de la memoria de la cámara a una carpeta temporal, por ello utilicé la opción -overwrite_original_in_place, si no estas seguro no la uses y por default creará un respaldo de las imágenes originales.

fuentes:

https://petapixel.com/2012/11/05/how-to-fix-your-timestamps-if-you-forgot-to-update-your-camera-for-daylight-savings/
https://sno.phy.queensu.ca/~phil/exiftool/faq.html#Q24

Anuncios

OSX – Editar la variable de ambiente PATH

Para ver las variables de ambiente utiliza el comando env. Para ver el valor de una variable de ambiente en específico puedes utilizar el comando echo $VARIABLE.

Para modificar el valor de una variable de ambiente, por ejemplo el PATH, necesitas editar el archivo ~/.bash_profile. Para ello puedes utilizar cualquier editor de archivos (vi, vim, nano, pico, TextEdit, TextMate, sublime, etc).

En lo personal, prefiero utilizar un editor simple como TextEdit, para ello puedes ejecutar el siguiente comando en la terminal

open -e ~/.bash_profile

Ten en cuenta que si vas a utilizar las comillas dobles para establecer el valor del PATH, por ejemplo

export PATH="$HOME/Applications/sdk/android/tools:$HOME/Applications/sdk/android/platform-tools:$PATH"

Necesitas modificar las preferencias del teclado para que no sustituya las comillas simples por caracteres no ASCII. Para ello ve a las preferencias del teclado y en la sección “Text” desactiva la opción “use smart quotes and dashes”.

Fuentes:
http://stackoverflow.com/questions/7501678/set-environment-variables-on-mac-os-x-lion
http://apple.stackexchange.com/questions/11745/reset-your-path-variable
http://apple.stackexchange.com/questions/120486/quotes-problem-in-mavericks-or-textedit

AngularJS – Invocar un servicio REST y adaptar la respuesta a nuestro modelo

Desarrollé un servicio web que regresa una respuesta al estilo de SmartGWT

{
"response": {
"status": 0,
"startRow": 0,
"endRow": 76,
"totalRows": 546,
"data": [
{"field1": "value", "field2": "value"},
{"field1": "value", "field2": "value"},
… 76 total records …
]
}
}

Queremos utilizar estos datos en nuestra plantilla

distritos.html

...
<label class="item item-input item-select">
                <div class="input-label">
                    Distrito
                </div>
                <select>
                    <option ng-repeat="distrito in distritos">
                        {{ distrito.descripcion }}
                    </option>
                </select>
            </label>
...

Hay dos formas para poder consumir esta respuesta en nuestra plantilla -a través de un servicio de AngularJS-

Una es utilizar una función transformResponse en la configuración del servicio de la siguiente manera

services.js

'use strict'
angular.module('Equinox.services', ['ngResource'])

    .factory('Distritos', ['$resource', function ($resource) {
        return $resource('http://localhost:8080/equinox/catalogos/distritos', {}, {
            'query': {method: 'GET', isArray: true, transformResponse: function(data){
                return angular.fromJson(data).response.data
            }}
        })
    }])

controllers.js

angular.module('Equinox.controllers', [])

    .controller('DistritosCtrl', ['$scope', 'Distritos', function ($scope, Distritos) {
        $scope.distritos = Distritos.query()

    }])

y la segunda forma es utilizar la respuesta tal y como viene del servidor

services.js

'use strict'
angular.module('Equinox.services', ['ngResource'])

    .factory('Distritos', ['$resource', function ($resource) {
        return $resource('http://localhost:8080/equinox/catalogos/distritos', {}, {
            'query': {method: 'GET', isArray: false}
        })
    }])

controllers.js

angular.module('Equinox.controllers', [])

    .controller('DistritosCtrl', ['$scope', 'Distritos', function ($scope, Distritos) {
        Distritos.query().$promise.then(function(data){
            $scope.distritos = data.response.data
        })
    }])

Fuentes:

Eclipse – Consulta dinámica en BIRT

Para modificar la consulta de un DataSet puedes utilizar la sección “Property Binding”

en mi caso necesitaba reemplazar en la conulta el valor de un parámetro.

Para reemplazar una cadena con otra lo puedes hacer en el “Expression Builder” de la siguiente manera



var q=new Packages.java.lang.String("SELECT COUNT(*) AS TOTAL \
FROM @OFICINA.EMPLEADOS A, @OFICINA.PUESTOS R, \
@OFICINA.SALARIOS D, @OFICINA.DEPTOS O \
WHERE A.NID_ACO_EXP= R.NID_ACO \
R.NID_DMD=D.NID_DMD AND R.NORDEN=O.NID_ORDEN \
AND TRUNC(R.FECHA) BETWEEN :INICIO AND :FIN");
q.replaceAll("@OFICINA",params["OFICINA"].value);

el código es javascript, pero podemos utilizar clases Java también. En este caso utilizamos la clase String de Java en vez de Javascript, porque el método de javascript no reemplaza todas las coincidencias.

Fuentes:
birt exchange

BIRT – Consulta dinámica en un dataset

Si necesitas modificar el query de un dataset, en tiempo de ejecución, por cualquier motivo. Puedes utilizar la sección “Property Binding” en el editor o modificar la consulta en el evento “beforeOpen” del DataSet. Recuerda que el código que utilices en BIRT es javascript.

Por ejemplo, podemos utilizar un esquema dinámico de la siguiente forma


var query="SELECT FRECEPCION  FROM @ESQUEMA.DOCUMENTOS WHERE ID = ?";

query.replace(/@ESQUEMA/g,params["Esquema"].value);

El esquema lo recibimos como parámetro. En la función “replace” utilizamos la forma global para que reemplace todas las ocurrencias de “@ESQUEMA”, de lo contrario sólo sustituiría la primera.

Fuentes:
http://vhspiceros.blogspot.mx/2008/12/replace-all-en-javascript.html
http://www.w3schools.com/jsref/jsref_replace.asp

JAX-RS – Modificar el encabezado de la respuesta

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);
        }
    }

Git – Renombrando archivos

Para renombrar archivos en git lo puedes hacer con el comando

git mv original nuevo

Si ya renombraste un archivo desde el explorador de archivos, no importa, git se dará cuenta del cambio que hiciste cuando hagas un commit. No importa que el comando git status muestre que se eliminó un archivo (original) y que hay otro pendiente de rastrear (nuevo). Para que te muestre correctamente que el archivo ha sido renombrado, intenta el siguiente comando

git commit –dry-run -a

Fuentes:
http://stackoverflow.com/questions/2641146/handling-file-renames-in-git