NGINX + PHP serve API from different root folder

I have started working on a spaguetti PHP code. I am not going to complaint or whatever, but I was asked to put some order into this chaotic project.

The first think it comes to mind is to start building an API and start build models for the most important entities of the project.

In the main file structure I need to create a new root folder for the API project.

public/api/index.php is the main file of the API.

To serve API calls like:

http://HOST/api/customers/{id}

you need to configure nginx accordingly

Add to the configuration file, normally named /etc/nginx/sites-availiable/default

change the location / {..} with the following:

location = / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

# API Folder
location /api/ {
try_files $uri $uri/ =404;
}

You need a special ‘=’ modifier for the root location to work as expected.

Must have plugins: WP Rollback

It can happen to anybody. Actually it will happen to anybody that uses WordPress long enough and has half a dozen plugins installed and a nice WP theme to drive his site.

Upgrades come on a daily basis and more often than not if your are administrator of the sie you will find the urge to Upgrade all just because it makes sense to have the last version of all your components that make your site.

And yes at some point it breaks and the only think that comes up is Internar server error 500. The less informative error of all. Just like saying,

“Something is up, can’t really tell you what.”

The worse thing that can happen is the WP panel is returning 500 too. Oh NO!! I cannot even access the tool that can help me fix what I broke.

Well this is why it is a good idea to have a Hosting Panel like Plesk or such.

I did break a WP site recently after a theme upgrade. Everything was returning a 500 error.

Plesk to the rescue

Plesk will give the basic functionality needed to sanitize your WP instance. In the worse case scenario you may need to deactivate all plugins and fallback to a basic default theme.

You can fiddle with the most basic configuration, like activate/deactivate plugins and themes until the page comes back to life.

Rollback to a working version

Rolling back manually can be a cumbersome task full o pits and falls. Although it is fairly easy when you have detected the component that failed, being a plugin or your theme, you can download the version before the break and install it like with the normal procedure.

WP Rollback will do that smoothly and in an easy-point-and-clicky way which can save a lot o time and pain.

Check it out in the WordPress official site.

WordPress customize returns internal server error 500

Well sometimes things do not work as intended.

I have been setting a wordpress site for a local consumers cooperative www.kidekoop.org . The development was done an a localhost LAMP stack where everything worked fine. When the moment has come to upload the site I decided to do it with the WP-all-in-one Migration plugin to overwrite the old one.

Everything went smooth but… accessing the customize section of the theme throwned a internal server error 500.

the error log in the cPanel of the hosting company screemed :


Got error 'PHP message: PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 122880 bytes) in ...

I searched the net for a solution and the one that worked for me was adding this line in the wp-config.php


define('WP_MEMORY_LIMIT', '256M');

Happy bloggin and eat your vegetables!

Javascript: Validate action before redirection from html link

A straightforward way to inform the user about something before using an html link is using the `confirm` javascript function. This function is a browser element that will print a simple text message giving two posibilities ‘Cancel’ an ‘OK’. The way it is rendered depends on the browser client used as well as the language used in the response buttons.

If we want to inform the user about something before sending him to the url we can do it like this.

Imagine an html link


<a href="url_to_redirect" onclick='confirm("Are you sure about this?")'>Anchor text</a>

Replace the content of the onclick attribute with any JS script.

MySQL and UTF-8

It seems that in the era of smart and conected devices we would have figured out how to do simple tasks such as rendering correctly human readable characters in a computer screen.

I have to admit that today in 2018 I still face problems of character enconding in various programs, programming interfaces and such. Just as I did 20 years ago when I first bought a PC.

Being a non-native english speaker with a different alphabet believe me I struggle every time I see broken characters.

I know it is probably because of my ignorance of what ASCII and UTF8 actually means or how to configure these things but anyway I decided long ago that I am not interested in learning them.

So I just wanted to share a MySQL hint for all those who have touble printing a unicode character from a MySQL database.


CONVERT (`column or data` USING utf8)

Link side scroll of two elements with jQuery()

This is a nice jQuery trick when you need to scroll the same way on one or several elements at the same time.

$('#divId1').on('scroll', function () {
$('#divId2').scrollLeft($(this).scrollLeft());
});

 

I find it especially usefull for large responsive tables where I make use of some sticky header feature.

I wanted to scroll left and right the same way in the body of the table and the sticky header div.

 

Pivot Tables con Awk (bash)

Pivot tables es una funcionalidad que suelen ofrecer los programas de hojas de calculo (MS Excel, LibreOffice Calc, etc.)

Es una herramienta para resumir datos (data summarization) desde una base de datos. Resulta muy cómodo para contar lineas en una hoja de calculo donde hay un patrón similar o para sumar números que pertenecen en una categoría.

Un ejemplo se puede ver en la entrada de wikipedia sobre los pivot tables.

AWK

Awk es un programa que permitir procesar texto. Nos permite acceder linea por linea cualquier archivo de texto y hacer operaciones sobre ellas. Es una herramienta algo mas complicada, ya que se utiliza a través de la linea de comandos. Entiende un lenguaje basado en bash y C++. Para entender la posibilidades que nos ofrece a la hora de procesar archivos de textos, podemos mirar la documentacion completa del programa awk

Los datos que estoy trabajando actualmente son gastos que hacen distintos departamentos de ayuntamientos españoles.

Se trata de un archivo TSV que tiene la siguiente forma

Actividad | centro | dni | quien | importe | date

Actividad : el concepto de contratos que hizo el ayuntamiento con una entidad

centro : El departamiento del ayuntamiento que realizo la actividad

dni : El DNI de la empresa o professional que realizo el contrato

quien : nombre de la empresa o professional o entidad que realizo el contrato

importe : importe en miles de euros

date : La fecha del contrato

Para el proyecto de visualización de datos en que estoy colaborando necesitamos resumir unos datos, como por ejemplo:

  1. El total de contratos realizados por la misma empresa
  2. El total del importe por cada empresa
  3. Los distintos centros de gasto
  4. resumen del tipo de actividad

Estos datos se guardan en tres archivos complementarios : thinglist.tsv, centroslist.tsv, viplist.tsv.

Estamos utilizando los pivot tables para generar estos resúmenes que luego integramos a nuestro gráfico que se puede ver aqui.

Ahora existe la intención de utilizar esa manera de visualizar los datos como una herramienta mas versatil que podria servir para visualizar cualquier cantidad en el tiempo. Faltan muchas cosas para definir si queremos darle forma de un programa de visualizacion de datos.

En esa direccion he pensado que tenemos que quitar la dependencia de programas externos (como Libreoffice Calc) que actualmente utilizamos para “preparar los datos” antes de lanzar la visualización. Utilizar awk en vez de Calc podria evitar hacer el trabajo manual que se esta haciendo cuando necesitamos visualizar unos datos.

He seguido un tutorial que explica como hacer pivot tables con awk y lo he adaptado para los datos de contratos menores.

Vamos a ver paso a paso como podemos generar los pivot tables.

Empezamos solo imprimiendo linea por linea el documento que contiene los datos

awk -F $'\t' ' {print}' data_val2015.tsv

 

aquí con el flag -F estamos diciendo a awk que las columnas de nuestro archivo esta separadas con tabulaciones $’\t’

En seguida podemos elegir imprimir solo unas columnas y no todas.

awk -F $'\t' ' {print $3, $5}' data_val2015.tsv

despues del print hemos precizado que queremos que devuelva solo la columna 3 y 5.

Luego para que podamos hacer operaciones matematicas necesitamos saltar la primera linea que contiene la descripcion de las columnas.

awk -F $'\t' ' NR>1 {print $3, $5}' data_val2015.tsv

Eso se hace con  NR>1 (Number of Rows)

ahora las cosas empezaran a ser un poco mas complicadas.

awk -F $'\t' ' NR>1 {a[$4]++;} END {for (i in a) {printf ("%s\t%i\n"),i, a[i]}}' data_val2015.tsv

Primero nos fijamos que nuestro programa tiene dos mas pequeños, cada uno entre corchetes{} y separados con la palabra END.

Esto resulta que la ejecución linea por linea sera todo lo que encontramos entre los primeros corchetes y una vez finalizado el documento (es decir END) ejecute el otro programa que se encuentra entre corchetes.

En la primera parte un array a[] con índice el campo $4 (nombre de la empresa) estará contando las veces que se encuentra cada empresa. Una vez hecho, la repetitiva for() se encargara de imprimir una por una las empresas que están en los índices i, y al lado la cantidad guardada en el array a[].

Finalmente vamos a hacer una tabla con las siguientes columnas

empresa | num_contratos | total_importe | DNI

awk -F $'\t' ' NR>1 {a[$4]++; b[$4]+=$5; c[$4]=$3} END {for (i in a) {printf ("%s\t%i\t%i\t%s\n"),i, a[i], b[i], c[i]}}' data_val2015.tsv

Igual que en el ejemplo anterior tres arrays a[], b[] y c[] estaran guardan respectivamente la suma de contratos con ++, la suma de importe con +=$5 y el DNI de la empresa que esta siempre en la columna 3.

La repetitiva for va a recorer todas las empresas y la printf se encarga de dar forma a los datos que vamos a imprimir. El sintaxis del printf es al estilo de C++.

 

Mejora de interactividad y rendimiento para un proyecto de visualización de datos

Llevo desde principios de Junio 2017 colaborando en un proyecto de visualizaciones de datos llevado por numeroteca.org

Contratos menores es un manera de visualizar los contratos de varios ayuntamientos españoles de forma interactiva. El proyecto esta ya en punto avanzado y en el momento que me he incorporado al proyecto se pueden ver en un gráfico de barras los contratos de varias empresas. Como se puede ver en la imagen, la persona que esta visualizando los datos puede ver los contratos que van a una sola empresa ó los que se hacen desde un centro del ayuntamiento ó que tengan una descripción concreta p.ej. limpieza.

Mi colaboración con el proyecto tiene ya marcados unos objetivos.

  1. Solapar los filtros ya existentes (empresa, centro de gasto, descripción)
  2. Mejorar el tiempo de carga sobre todo para ayuntamientos con muchos datos
  3. Añadir maneras de interactuar con los datos.

Propuesta 1

Crear filtros compuestos de tipo empresa+centro+descripción daría una funcionalidad añadida a la hora de ver a donde y como se gasta el dinero en un ayuntamiento.

Propuesta 2

La carga de las paginas puede ser muy lenta, en algunos casos como las facturas de Zaragoza, puede tardar hasta 10 o 15 segundos. Eso e principalmente debido a que los archivos de los datos en algunos casos son muy grandes y su descarga e importación puede durar mucho.

Propuesta3

Ofrecer nuevas formas de visualizar los datos. Hasta ahora, el gráfico proporciona la mayor parte de información relacionada con los contratos. Presentar totales y medias por empresa o centro o por algunas combinaciones de ellas seria un manera de aumentar la información.

En ese blog se podrá seguir el trabajo técnico y conceptual de esa colaboración.