Definir variable de entorno en PHP

Queremos definir una variable de entorno en PHP, a la que poder acceder en cualquier momento desde la aplicación, y que la podamos definir en un archivo de configuración, pudiendo cambiar su valor según el entorno en el cual ejecutamos la aplicación, sin necesidad de hacer cambios en el código.

Definir variable en .conf

Editamos httpd.conf, añadiendo el include hacia un nuevo fichero de configuracion que crearemos, donde haremos las definiciones de variables que queramos, y que llamaremos occidentalValley.conf.

Añadimos lo siguiente a httpd.conf (normalmente hay un apartado de Includes en httpd.conf, no está de más mantener el order y hacerlo allí…):

En la misma carpeta donde tenemos a httpd.conf, creamos el nuevo archivo de configuración propio, al que llamamos occidentalValley.conf, con las definiciones de variables que queramos, en nuestro caso, este será el contenido:

Esto será todo, ahora desde nuestra aplicación podremos acceder al valor de la variable BASE_PATH, y obtener su resultado, de la siguiente forma:

Con esto terminamos nuestra definición de la variable de entorno en PHP, que nos permitirá definir valores de variables que puedan depender del entorno de ejecución, manteniendo el mismo código.

MySQL GROUP_CONCAT no devuelve toda la información

Nos encontramos con el caso que en una query de MySQL nos damos cuenta que el GROUP_CONCAT que estamos haciendo de un campo no nos está devolviendo todos los valores que esperaríamos.

Después de investigar un poco, nos damos cuenta que está cortando el texto de salida a 1024 carácteres.

Solución: GROUP_CONCAT_MAX_LEN

Existe una variable de MySQL que justamente limita a un número de carácteres determinado la salida de un GROUP_CONCAT. Se trata de la variable: group_concat_max_len.

Como saber qué valor tiene en nuestro entorno

Para saber el valor de la variable group_concat_max_len en nuestro propio caso, haremos lo siguiente:

Como modificar el valor de esta variable

Entonces, lo que debemos hacer es aumentar el valor de esa variable para que no nos limite la salida:

o si queremos cambiarlo solo para nuestra sesión actual:

Si ha funcionado correctamente, nuestra variable de sistema habrá cambiado su valor al nuevo que hemos especificado.

Tenemos que tener en cuenta que este valor va a perderse cuando el servidor se reinicie. Por lo tanto, si nos interesa persistir este valor de forma indefinida en el servidor, tendremos que editar el fichero de configuración de MySQL y hacer la modificación de la variable group_concat_max_len desde allí, de modo que ante cualquier reinicio, el valor especificado será cargado como valor por defecto.

#1227 – Access denied; you need the SUPER privilege for this operation

Al intentar modificar este valor, puede ser que nos aparezca este mensaje de error. Algo bastante habitual si lo estamos intentando hacer en un servidor compartido. Esto pasa porque nuestro usuario no tiene suficientes privilegios para hacer tal cambio en el servicio de MySQL.

Si tienes posibilidad de ejecutarlo con un usuario con permisos, vuelve a intentarlo de esta forma. Sino, tendrás que hablar con el administrador del sistema para que hagan ellos el cambio. Y sino, no te queda otra que buscar un método alternativo en tus queries.

Merge de GRanges

Al trabajar con la librería Genomic Ranges de R, y sus listas de objetos de tipo GRanges, nos puede interesar de juntar listas de GRanges.

A priori, al parecer un formato tipo data.frame o arrays, uno intenta usar cbind() y rbind() pero vemos que R nos da un error porque no se pueden usar esas funciones para objetos GRanges.

Pues resulta, que al final una lista de objetos GRanges no es más que un vector. Por lo que para unir listas de GRanges tenemos que hacerlo con la función c() de R.

Para añadir la lista que tenemos en grReduced a la lista resultados, habríamos:

Desbloquear cuenta Drupal

Otra de las bondades de Drupal… Mensaje de error a la hora de autenticarte como usuario:

Pasar de un data.frame a GRanges

La librería GenomicRanges ofrece una función para convertir un data.frame en un objeto de tipo GRanges, de forma rápida y sencilla: makeGRangesFromDataFrame()

Tenemos un dataFrame, en este caso con una lista de genes, por lo tanto, representando rangos de datos:

A partir de este objeto vamos a crear un objeto GRanges para poder trabajar de forma más cómoda sobre esta lista de genes, aprovechando funcionalidades de la librería GenomicRanges.

La sintaxis es sencilla:

Vemos que le pasamos en el parámetro df el objeto data.frame que contiene la información que queremos convertir en GRanges.

Los siguientes campos son para indicar cromosoma, inicio de rango, final de rango, tipo  (en caso que no nos interese, podemos obviarlo, y añadir el parámetro ignore.strand=TRUE), y el último parámetro, keep.extra.columns lo ponemos a TRUE para que nos mantenga el resto de información asociada a cada uno de los rangos.

 

Modificar librería de R

Si nos bajamos un paquete de R, veremos que el código fuente está formado por distintos archivos. Lo más habitual serán archivos con extensión .R, donde estarán definidas las funciones de R que nos aporta esa librería.

Modificar código R de una librería de R

Hacer cambios a esa librería será tan sencillo como modificar el fichero .R, hacer pruebas usando la función source(), y reinstalar la librería  (como veremos más adelante) cuando queramos hacer definitivos esos cambios.

Modificar código C de una librería de R

En otros casos, los paquetes de R tienen parte programada en otros lenguajes, como por ejemplo en C.

Vamos a ver cuál sería la forma de trabajar con ese código en C para modificarlo según nuestras necesidades.

Mientras estamos modificándolo, nos interesará hacerlo de una forma sencilla y rápida, que no nos obligue a reinstalar la librería a cada cambio que queramos hacer en el código en C.

Para hacer eso, R dispone de CMD SHLIB, que nos permite compilar ese código de C, generando un archivo que podemos cargar instantáneamente sobre R, desde donde podremos llamar a las funciones modificadas de C.

Vemos como usamos CMD SHLIB:

Esto nos generará un fichero con extensión .so (en mi caso, qADM.so).

Una vez tenemos el fichero .SO, podemos cargarlo directamente al R, para tener acceso a esas funciones de C. La forma de hacerlo es usando la función dyn.load(), desde la propia consola de R:

Una vez hecho esto, en nuestra sesión de R tendremos disponibles las funciones definidas en qADM3.c, con los cambios que hayamos aplicado.

Reinstalar librería para aplicar cambios

Una vez hemos hecho cambios en el código de la librería, ya sean en R o en C, y ya los hemos probado usando dyn.load(), tendremos que volver a instalar la librería para que estos cambios queden aplicados de forma definitiva sobre la librería.

Vamos a instalar un paquete que tenemos en una carpeta llamada qADM:

Una vez hecho esto, si ya tenemos una sesión de R abierta, y con la librería cargada (en su versión anterior), tendremos que volver a cargarla para actualizar así a la última versión instalada. Si no lo hacemos, seguiremos usando la versión anterior.

El usuario importa!

Recuerda que el usuario con que se ejecutan estos comandos importa, ya que R instalará esa librería en el repositorio por defecto de ese usuario.

En mi caso yo lo he hecho como root, y no con mi usuario. En el caso del root, se instala en el repositorio general del sistema. Por lo tanto, si te interesa que cualquier usuario del sistema pueda hacer uso de esa librería, tienes que hacer la instalación del paquete con el usuario root.

En mi caso, de hacerlo con mi propio usuario, el lugar donde instala el paquete es en  ~/R/i486-pc-linux-gnu-library/3.1/qADM/libs.

 

Añadir librería SWC a Maven

Tenemos una librería SWC que queremos añadir a nuestro repositorio de Maven para poder añadir dependencias a este desde un proyecto Maven.

Con esto ya tenemos instalado el SWC a Maven.

Piensa que los valores que hemos usado en mvn install:install-file del id de grupo, id del artefacto o versión, son a nuestro criterio. Simplemente tendremos que tenerlos en cuenta cuando vayamos a crear una dependencia hacia esa librería.

Por ejemplo, desde un proyecto en que estamos usando el repositorio de Maven, y queremos añadir una referencia hacia esa librería que acabamos de añadir, escribiríamos esto en el pom.xml:

 

Aplicación bloqueada por la seguridad de Java

Una aplicación bloqueada por la seguridad de Java? Has actualizado recientemente Java? Así lo he solucionado.

Actualizar Java

Actualizar la versión de Java instalada en un PC es garantía de problemas sí o sí. Ahora desde Oracle, los encargados de Java son especialistas en dar trabajo a los informáticos de sistemas (será para garantizarles que siempre tengan trabajo?)

El caso es que ayer actualicé la versión de Java (ERROR!) cansado ya de los avisos y de applets bloqueados en webs.

Actualización instalada de forma rápida, y aparentemente sin ningún problema! Parece que empiezan a mejorar algo…

Aplicación bloqueada por la seguridad de Java

Por la tarde tuve que ejecutar una aplicación importante que tenemos en producción en la empresa, y…

Su configuración de seguridad ha bloqueado la ejecución de una aplicación porque falta un atributo de manifesto “Permisos” en el jar principal.

Así que toca perder el tiempo (que no nos sobra precisamente…) para conseguir ejecutar la aplicación con la (mierda de) nueva versión de Java…

Error del atributo de Permisos

El error en cuestión que da Java para no ejecutar la aplicación, es porque no existe en el archivo de manifesto de la aplicación java, un atributo llamado Permisos. En este atributo es donde la aplicación solicita el nivel permisos que requiere para ejecutarse.

El hecho de que no esté especificado, es motivo para Java para bloquear la aplicación.

Desbloquear aplicación de Java

Si estamos en un entorno Windows, lo que tendremos que hacer es permitir que se ejecuten las apps de una dirección web concreta.

  1. Botón inicio, y buscamos “Configurar Java”.
  2. Seleccionamos la aplicación encontrada, donde tenemos los parámetros de administración de Java. Atención en hacerlo así, y NO desde el panel de control. En mi caso, al abrirlo desde el Panel de Control (que es lo que a uno se le ocurre directamente) la ventana de configuración que te abre es distinta, y por ejemplo en el apartado de Seguridad no te da las opciones que vamos a necesitar modificar. Se trata de configuraciones distintas:

    Administrar Java

    A la izquierda la que se nos abre desde el Panel de Control, a la derecha la ventana de “Administrar Java” escrita en el buscador del menú de inicio de Windows (la que nos interesa).

  3. Pestaña Seguridad, veremos abajo “Lista de excepciones de sitio“. Seleccionamos el botón del lado “Editar lista de sitios…
  4. Añadimos la dirección desde donde se ejecuta la app de java que se nos ha bloqueado, y aceptamos.PanelDeControlJava3
  5. Probamos de volver a ejecutar la App y ya no debería volver a tener problemas.

En mi caso la primera vez me ha salido una advertencia de seguridad que he aceptado, pero luego NO me ha abierto la app.

Captura Aunque al segundo intento de ejecutarla (y siguientes), me la ha abierto sin problemas, tal y como se había abierto siempre antes de la magnífica actualización de Java.

Por fin el funcionamiento vuelve a ser el habitual. Problema resuelto, hasta dentro de una semana que salga una nueva actualización de Java!

Redefinir comando en Latex

Cuando queremos definir un valor para un cierto comando de Latex, lo hacemos usando \newcommand{}{}.

\newcommand implementa la función primitiva \def de Tex, con ciertas funcionalidades adicionales. Una de ellas, es la comprovación que ese comando no haya sido definido previamente.

En caso de definir un comando que ya haya sido redefinido previamente, recibiremos un error de compilación. Algo que no pasaría usando la primitiva \def  porque como hemos dicho no hace esa comprovación.

Redefinir comando

De todas formas, usando las propias funcionalidades de Latex,  podemos redefinir el comando usando otra función: \renewcommand{}{}.

Por ejemplo, nos puede interesar redefinir la variable \today porque tenemos que dejar preparado un documento para esa fecha:

Más información en esta página.