Categoría: Programacion
Soporte para emojis en el blog y utf8mb4 en MySQL
Es tan sólo un detalle menor pero para aquellos que, como yo, tienen un sitio web desde hace mucho tiempo una de las cosas más complejas es lograr que todo siga funcionando durante tanto tiempo y, además, soporte cosas nuevas o que habían quedado afuera en tu diseño original.
Aquí en el blog el soporte para emojis era... cómo decirlo... inviable pero me di cuenta dónde estaba el problema: era en la conexión a la base de datos.
Resulta que el UTF8 implementado en MySQL no es precisamente un UTF8 completo, por default es un utf8mb3 que sólo permite un set limitado de caracteres. Para una base de datos es mejor si la idea es manejar lenguajes de uso cotidiano y ahorrar bytes pero gracias a los Emoji uno necesita el set completo de posibilidades.
El cambio era sencillamente modificar las tablas y agregarle a cada campo soporte para utf8mb4. Pero eso no alcanzaba y me di cuenta recién hoy, primer día del año, cuando los Emojis ya son algo habitual (aunque a mi me importaran un bledo, claro), y como desde cualquier teléfono uno puede dejar un comentario con emojis el blog ya era hora que lo soportara
He aquí que no sólo había que cambiar las tablas sino la forma en la que el CMS se conecta a la base de datos, avisarle que no todo era UTF8 sino utf8mb4. En mi caso era avisarle que la conexión se hacía de esa forma
Y listo! ?♂️☝?? en fin, malditos emojis.
Mini Tip: X Forwarded For en HTTP
Es un pequeño detalle pero sucede muy a menudo cuando estás detrás de un servidor proxy en tu web server: no tenés idea qué IP tiene el cliente.
La razón de esto es que el proxy toma esa posición que resulta ser tu propio servidor, así que todos los clientes terminan entrando con el supuesto mismo IP o así lo asume el Apache.
En PHP la variable de servidor que toma mal este valor es REMOTE_ADDR y el problema es que si tenés algún filtro o método que requiere saber específicamente a qué cliente le estás afectando no podrías hacerlo.
Peero, existe una solución, una variable que se incluyó primero en Squid es HTTP_X_FORWARDED_FOR para que uno tenga forma de saber cual fue el origen verdadero. Si esta variable tiene valores significa que estamos detrás de un proxy, por ejemplo NGINX, y para conocer la IP real vamos a tener que reemplazar con estas pocas líneas de código:
if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
$http_x_headers = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );
$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
}
Y listo, ahora REMOTE_ADDR tiene el valor correcto.
Cómo es la inyección de código malicioso en un sitio
Hace unos días estábamos revisando sitios por mantenimiento y uno en particular tenía un tráfico excesivo, obviamente cuando eso sucede hay que prestar atención y no era para menos.
El sitio no tenía actualizaciones hacía más de dos años, un Wordpress, más allá de las versiones desactualizadas los sitios con plugins suelen tener huecos no tanto por el sitio en sí (WP se ha vuelto muy seguro los últimos años) sino por todos esos plugins de developers que no tienen tantos parámetros de seguridad.
A partir de estos huecos se inyectan pequeñas porciones de código para escalar permisos y modificar el sitio, éste es uno de esos tantos casos que podrían afectar tu sitio sin que te dieras cuenta...
Abuso vía Tor de la encuesta, diversión para nardos
Estas cosas me encantan, primero porque me ayudan a aprender más en un escenario que no es crítico, una encuesta en mi blog? Es genial porque podés testear algo con una masa crítica de usuarios relevante y cero problema con un cliente
Bueno, lo que pasó era algo que estaba tratando de provocar hace un tiempo y, tuve la suerte, se dio: alguien quiso fraguar los resultados de una encuesta en el blog como si fuere importante.
Aquí les cuento en detalle qué hizo y cómo se puede mitigar un "ataque" tan tonto como este.
Ajustar el tamaño de miles de imagenes en un servidor
Imaginen este escenario, durante X tiempo estuvieron almacenando imagenes de miles de sitios pero tan sólo querían tener una especie de thumbnail. Tomaron la foto default de cada página pero los tamaños no son precisamente lo que uno esperaba.
Te dejaste estar y ahora tenés una carpeta en el servidor con 1GB de fotos de las cuales sólo necesitabas unos pocos pixeles de cada una, un lindo lío de espacio en servidor ¿Cómo resolverlo?
Bajarlas todas y tirar un batch en Photoshop? esa sería la resolución más cabeza de termo posible, lo ideal es... hacerlo en el servidor!
Nightmode: cómo resolverlo con CSS y Javascript
El otro día les comenté que había agregado el BB Code y el Nightmode, hoy les quería mostrar cómo es que se implementa esto último, no es para nada difícil!
Así que también aprovecho otra cosa que le agregué al blog la posibilidad de mostrar código con colores un poco más amenos que un simple cambio de tipografía.
Lo único que utilicé en este caso es Javascript y CSS porque es tan sólo visual, es un cambio que en cualquier browser moderno se debería ver sin problemas y no tengo idea si se ve bien en alguno viejo pero... vamos, acaso alguno sigue usando IE6? lo tiraría a la hoguera
BB Code para los comentarios
Bueno, anoche programé algo que me habían pedido varios: agregué al blog la posibilidad de utilizar BB Code.
¿Qué es el BBCode? es el sistema que tienen los foros para poder agregar en un comentario tanto formato de texto como enlaces, imagenes y videos sin que se rompa todo. ¿Por qué el blog no permite comentar con HTML? Sencillo, cuando esa función estaba liberada en muchos sitios algunos pillos la usaron para inyectar Javascript o código que rompía el sitio así que, de alguna forma, había que limitarlo.
El blog tenía, ya de por sí, su propio sistema que todavía funciona (no se chocan) así que los viejos comentarios deberían funcionar pero ahora pueden usar BBCode para los nuevos. ¿Cómo se usa? A continuación les comento un poco, después veo de ponerlo de alguna forma más amena.
Obviamente los cambios en el blog no se terminan, por eso es que sigo armando cosas y tirando algunas líneas de código.
Mysql: Cómo recuperar una tabla con caracteres Latin1 mal pasados a UTF-8
Demasiado específico el post así que le dejé un título acorde cada tanto hago posteos de "trabajo" con tips que voy descubriendo, sino ni yo me acuerdo cómo se hacía
Más de una vez en un servidor alguien "rompe" todos los textos porque hace una mala conversión, en alguna importación pasan una base de datos que estaba en Latin1 y no la convierten en UTF-8, la mandan así directo.
Los caracteres con tildes o símbolos quedan todos mal:
á = á
é = é
Ã- = í
ó = ó
ñ = ñ
á = Á
Le pasó a un amigo hoy y se lo solucioné de la forma más sencilla que existe, un simple query:
UPDATE tabla SET texto =
CONVERT(BINARY CONVERT(texto USING latin1) USING utf8);
Me encanta cuando una solución tiene tan pocos caracteres, es genialmente elegante.
Ahora bien, salvedades, si hay contenido mixto, algunos en UTF-8 y otros en Latin1 pueden romper lo que ya estaba bien, así que úsenlo con un WHERE que separe una cosa de la otra. Obviamente hagan el debido backup antes de usar esto.
Y para aquellos que quieran soporte de Emojis en la tabla sí o sí recomiendo usar utf8mb4 como Collation porque utf8 a secas no lo soporta y te va a dar error si querés insertar uno
Una ayudita para dos errores comunes en XAMPP y otros

Para aquellos web developers que tienen que trabajar en PCs con Windows una solución muy común es instalar a mano todo o utilizar un paquete como XAMPP o WAMP o similar. Hay varios pero eso no es lo relevante, el problema es el manejo (o más bien, la falta de...) de certificados en la Windola.
A veces por más que queramos no podemos instalar un Linux (mi PC de laburo tiene 6GB de RAM, olvídense de virtualizar) y siempre desarrollar en local es lo mejor, así que vamos con dos tips para dos errores comunes, usualmente cuando usamos CURL y cómo resolverlos. Y si, se que muchos ya no usan PHP porque no es "cool", pero ellos tienen otros problemas (dale Node, dejá de descargar mil paquetes para un puto hola mundo), pero todavía hay millones de desarrollos en esta plataforma.
Lo común es encontrarse con el error:
Fatal error: Uncaught CurlException: 77: error setting certificate verify locations
o similares, si justo estan trabajando con la API de Facebook (y su SDK) seguro que se les da, otro también es:
SSL certificate error: unable to get local issuer certificate
Mismo problema pero con el certificado SSL, pues bien, lo ideal en estos casos es descargar un certificado válido (el famoso cacert.pem o ca-bundle.crt) e instalarlo de forma local y manual.
Primero que nada apaguen Apache, stop al servicio, y busquen dónde está PHP en su instalación. Si utilizan XAMPP seguro es bajo C:\xampp\php\
Descarguen uno de estos certificados, este o este y lo guardan en la misma carpeta.
Luego editan el archivo php.ini y buscan dos tags en particular: curl.cainfo y openssl.cafile y agregan la ruta al certificado:
curl.cainfo="C:/xampp/ca-bundle.crt"
openssl.cafile="C:/xampp/ca-bundle.crt"
Ahora pueden reiniciar el Apache (o Nginx, lo que usen) y listo, su app de prueba de facebook o google o lo que sea que necesite certificado va a funcionar (si tienen suerte

El problema del volumen de datos que nunca pudiste probar

Más de una vez programamos algo pensando que está funcionando ok, que la solución fue bien pensada, que está todo como debería. Lo probamos, "en local funciona", armamos el deploy y lo mandamos al servidor sin volver a pensar en él.
Pero siempre, siempre, hay un problema de performance, y les puedo contar mil y una historias de problemas semejantes. Nadie testea una puta mierda con volúmen, nadie le da importancia y todo empieza a fallar.
Como sabrán algunos este blog no utiliza Wordpress, lo programé todo de cero y todavía sobrevive porque lo hackeo constantemente, un cachito aquí, otro allá, y más o menos sobrevive al paso del tiempo. Pero para cuestiones laborales o de otros clientes siempre utilizo Wordpress y un clásico allí son los plugins.
No voy a meterme en detalles técnicos demasiado complejos pero me dan ganas de contar un poco cómo es este tema para aquellos que putean desde el otro lado y no entienden qué está sucediendo en realidad, es como un pequeño rant para programadores, implementadores y usuarios que putean a diario
