Conviértete en Pro de PHP – Late Static Binding

Atendiendo a lo que tradicionalmente conocemos como herencia, esperaríamos que si yo redefino una función o una constante en una clase hija, esta se va a sobreescribir. En PHP esto no sucede así dependiendo de como hagamos la llamada.

En este vídeo explico con varios ejemplos como funciona el Late Static Binding, que es la formal de solucionar este comportamiento inesperado.

El mejor lenguaje de programación según Genbeta

Estaba leyendo este artículo de Genbeta y aunque lo escriben gente reconocida en la industria yo personalmente no entiendo muy bien sus conclusiones.

Debo vivir en un mundo paralelo pero aunque hay puntos en los que estoy muy de acuerdo como por ejemplo que Javascript hoy en día es una gran apuesta tanto en el front como en el back, lo de que Java y .Net sean buenas apuestas para los que saben programar no lo entiendo muy bien y lo de que ni se nombre a PHP cuando medio internet está hecho con él tampoco.

.Net como se comenta es una buena apuesta para los juegos porque por lo que tengo entendido (no es mi sector) los motores y frameworks principales están basados en él.

Java y .Net a nivel empresarial es eso, un nicho. Se utiliza sobre todo Java porque es un lenguaje robusto con muchos años y muchos frameworks a sus espaldas y que ha funcionado bien en este sector, principalmente en banca. Algunas veces se le ha llamado el nuevo Cobol y puede que a día de hoy una vez tenemos Kotlin como alternativa moderna y que también funciona sobre la jvm sea la mejor comparación que podemos utilizar para describir a Java. Y eso a pesar de las mejoras sustanciales que ha tenido Java en los últimos años y aún con eso entre Java y Kotlin en términos generales (hay casos y casos) yo apostaría por Kotlin.


Utilizar .Net o Java a nivel empresarial es similar a lo de utilizar Oracle como base de datos relacional a nivel empresarial. Funcionan bien, cumplen su cometido pero por costes y posibilidades creo que hay otras opciones más baratas y al menos igual de interesantes. Casi todas las ofertas que he visto de .Net, que tampoco quiero decir que sean pocas, son de empresas que se han atado a todas las tecnologías de Microsoft. Si ese tipo de proyectos te resultan atractivos pues adelante.

En cuanto a Python, es verdad que en cuanto a analítica de datos y IA (Inteligencia artíficial basada en Machine learning) Python ha resurgido como un lenguaje interesante. Y digo resurgido porque como se comenta en el artículo Python tiene más de 30 años y no ha sido hasta los últimos años con la versión 3 y gracias a ser un lenguaje fácil de aprender y elegante en muchos sentidos (es un lenguaje molón la verdad), cuando realmente ha despuntado. Pero de ahí a decir que está creciendo en el back… yo personalmente no lo veo ya que Python siempre ha tenido la desventaja de no ser especialmente rápido y teniendo opciones para este cometido como Javascript o PHP no veo esa supuesta proyección como lenguaje de back.

Y llegamos a PHP, al inombrable por ellos porque durante un tiempo se fué granjeando mala fama por algunas cuestiones. Y resulta que PHP desde hace tiempo ha tenido fama de lenguaje desesctructurado, con carencias y con poca evolución sobre todo en la versión 5. Esa mala fama algunas veces tenía cierto sentido. Como dice su propio creador Rasmus Lerdorf, esas cositas como que en una función los parámetros tenían un orden y en otra función con la misma estructura de parámetros tenían otro oooo, que en una se pasaba un tipo de dato y en otro similar se se pasaba otro tipo diferente (lo mismo para las devoluciones)… Esto generaba un poco de caso pero muchas veces venía derivado de las funciones de C (en el que está escrito PHP) sobre las que se les estaba haciendo un wrap.

A esto hay que añadirle que desde la versión 7 se mejoró sustancialmente el rendimiento y que ha ido mejorando versión tras versión en rendimiento y funcionalidades. Todo esto desde mi punto de vista le siguen colocando como uno de los lenguajes más interesantes para la web. Ya no es tan feo, sigue siendo igual de fácil de programar y su rendimiento es más que aceptable.

En cuanto a las ofertas de PHP pues hay mucha demanda porque como ya se ha dicho es ampliamente usado. Ahora bien, depende de a que herramienta, framework o app te orientes resultará más interesante o no, y mejor o peor pagado. Por ejemplo las ofertas de wordpress a mi no me atraen porque se pagan mal y programar en wordpress es lo que es. Pero si te especializas en cosas más de nicho como los e-commerce y especialmente Magento se está pagando muy bien. También los backend con Laravel o Symfony, así que todo depende de tu experiencia y tu especialización.

Y aunque nos hemos dejado a muchos otros en el tintero, así es como veo yo hoy en día el mercado centrándome sobre todo en el backend. Cómo lo veis vosotros?

Simulando un archivador con HTML y CSS

En este vídeo explico como simular la forma de un archivador con HTML5 y CSS con la intención de listar un directorio de elementos (en este caso de profesionales). En la explicación vemos todo el proceso de desarrollo y analizo los diferentes problemas a los que me enfrento.

Contraseñas seguras en PHP

Guardar las contraseñas de forma segura en base de datos es uno de los procesos más habituales y más importante de cualquier aplicación con usuarios. En PHP es muy sencillo hacerlo, pero antes vamos a explicar cuales son los problemas y las soluciones para generar y guardar contraseñas seguras.

Lo primero y más importante es que nunca debemos guardar en plano las contraseñas en la base de datos. El motivo es que si nuestra base de datos se ve comprometida el nombre de usuario y la contraseña puede ser usado en otras webs ya que la mayoría de la gente los reutiliza. Que levante la mano quien no tenga la misma contraseña en decenas de webs.

Entonces, ¿cómo las guardamos?. Podríamos hacerlo utilizando alguno de los algoritmos de hash más comunes como son md5 o sha1 pero por una parte estos algoritmos llevan rotos desde hace años y por otra se podrían utilizan tablas arcoíris (rainbow tables) que no son ni más ni menos que tablas de contraseñas con el hash ya generado de forma que es mucho más sencillo realizar un ataque de fuerza bruta.

Para evitar este tipo de ataques utilizaremos Salt. Pero ¿qué es Salt? Esta técnica consiste en añadir una cadena aleatoria a la contraseña antes de que se utilice para generar el hash. Pongamos un ejemplo sencillo para que se entienda, digamos que la contraseña es la palabra «hola», lo que vamos a hacer es generar una cadena aleatoria que deberemos guardar en base de datos para poder regenerar el hash de nuevo. Ahora lo que hacemos es por ejemplo concatenar la contraseña con la cadena aleatoria y sobre el resultado de la concatenación generamos el hash. Vendría a ser algo así:

hash(«hola» . «A%$bcJeL»)

La función hash podría ser cualquier función hash segura, el resultado de la cual es lo que guardaremos en base de datos como contraseña y como ya habíamos mencionado también guardaremos el Salt «A%$bcJeL» en el ejemplo para en algún momento poder regenerar el hash y así poder comprobar la contraseña. Para comprobarla lo que haríamos es recuperar el hash y el Salt de base de datos, regenerar el hash con la contraseña que introduzca el usuario en el formulario correspondiente y comparar. Sería algo así:

hash($campoFormulario . $saltDeBaseDeDatos) == $contrasenyaDeBaseDeDatos

Ahora la tabla arcoíris ya no sirve porque los hashes resultantes al tener Salt serán completamente diferentes.

Una vez hemos entendido todo esto ¿cual es la forma correcta de hacerlo en PHP? Pues usar las funciones password_hash y password_verify. La primera genera un hash con Salt de forma automática, nosotros lo único que tenemos que darle es la contraseña en plano y el algoritmo seguro a utilizar para generar el hash. Actualmente se recomienda el algoritmo CRYPT_BLOWFISH pero si le indicamos PASSWORD_DEFAULT como algoritmo entonces la función utilizará el aceptado como más seguro en ese momento de forma que si sale uno mejor será ese el que se empiece a utilizar.

password_hash ( string $password , integer $algo [, array $options ] ) : string

En el ejemplo sería:

password_hash(«hola», PASSWORD_BCRYPT)

Esto nos generar un hash con este formato:


Como veis tenemos todo lo necesario en un único hash. El tipo de algoritmo que en nuestro caso es CRYPT_BLOWFISH, las opciones del algoritmo si las hubiera, el Salt y el hash de la contraseña. Ahora tan solo necesitamos guardar este hash completo en la base de datos en lugar del hash y el Salt por separado.

Si queremos comprobar la contraseña usaremos la función password_verify a la que tan solo tendríamos que pasarle por un lado la contraseña y por otro el hash completo ya que ahí tiene todos los datos necesarios para la comprobación.

password_verify ( string $password , string $hash ) : bool

Esta función internamente hace algo parecido a lo que hacíamos nosotros en el ejemplo de comprobación con Salt devolviéndonos al final verdadero o falso dependiendo de si la contraseña coincide o no.

Con todo esto ya sabéis como generar un hash seguro y como comprobar la validez de vuestras contraseñas a partir del hash. Pero si tienes cualquier duda déjamela en un comentario.

Nos vemos.

Emular terminal desde PHP en Servidores Virtuales Gestionados (caso de Comvive)

Desde que trabajo en Pórtico Legal quería empezar a usar el sistema de control de versiones (yo siempre lo uso y aquí no tenían nada, una locura) y poder usarlo para los despliegues en preproducción y producción como solución intermedia hasta que tengamos algo más avanzado. Hasta la fecha se estaban haciendo mediante ftp con todos los problemas que eso supone, entre ellos los siguientes y sus posibles soluciones:

  • Mientras se ha subido un archivo y se está subiendo otro que depende de este la web se puede romper, lo más probable es que ocurra. Esto no se solventa completamente usando git sobre un único servidor pero se minimiza muchísimo.
  • Nunca se sabe que versión está en producción. En algunos momento se habían subido archivos por diferentes personas y una no sabía lo que había subido la otra.
  • Si se toca algo en el servidor un simple «git status» te lo va a chivar, y un simple «git checkout …» te va a solucionar la papeleta.
  • Se va a poder desplegar nuevas versiones simplemente etiquetando y haciendo un «git checkout tag«

 

Aquí el problema venía por parte del hosting de comvive que al ser un VPS gestionado no te dan cuenta de shell. Para solucionarlo al final utilicé un pequeño script php que ejecutaba la orden que le pasas como parámetro:

<?php

$command = $_GET[«command»];

$res = execute($command, __DIR__ . ‘/..’);
echo «<pre>»;
echo «\nCódigo de salida: » . $res[‘code’];
echo «\n» . $res[‘out’];
echo «\nSalida de error:\n» . $res[‘err’];
echo «</pre>»;

function execute($cmd, $workdir = null) {
if (is_null($workdir)) {
$workdir = __DIR__;
}

$descriptorspec = array(
0 => array(«pipe», «r»), // stdin
1 => array(«pipe», «w»), // stdout
2 => array(«pipe», «w»), // stderr
);

$process = proc_open($cmd, $descriptorspec, $pipes, $workdir, null);

$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);

$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);

return [
‘code’ => proc_close($process),
‘out’ => trim($stdout),
‘err’ => trim($stderr),
];
}

 

La etiqueta pre la utilizo para que la salida se vea bien si la llamamos desde un navegador. Pues bien, una vez subido podemos ejecutar cualquier orden como:

https://dominio/path/script.php?command=orden

Pero como estarás pensando esto no es seguro. Lo que hice yo es meterlo en un directorio y en este meter un .htaccess para que sólo yo tuviera acceso.

Al final lo único que quería era poder usar git, así que me creé un shell script con wget para llamar a esta url. El script es tal que así:

#!/bin/bash

domain=»»

command=»wget -qO – \»http://$domain/commands/command.php?command=git $*\» | sed ‘1d’ | sed ‘\$d'»
echo «Dominio: $domain»
echo «Parámetros: $*»
eval $command

 

Ahora sólo hay que darle permisos de escritura y en mi caso lo he llamado rgit y lo he puesto en el path por comodidad. Esta sería una salida de la orden «rgit status -s«, en este caso un status limpio:

Dominio: www.dominio.com
Parámetros: status -s
Código de salida: 0
Salida de error:

Lo suyo es que el directorio .git con todo el ínidice esté fuera del htdocs del servidor, para ello se puede usar el parámetro –work-tree de git. Si por algún motivo no puede estar fuera podéis utilizar de nuevo un .htaccess para que nadie pueda entrar:

 

deny from all

 

Y con esto he conseguido un rodeo para poder usar una «shell» remota a través de un script PHP. Espero que os sea de ayuda.

 

 

 

Freeguras, figuras de arcilla de mascotas del mundo del Software Libre

Estaba leyendo apuntes antiguos de Genbeta Dev y me ha aparecido una referencia a Freeguras y la verdad es que me ha gustado mucho. Pero ¿qué es Freeguras?, pues como ellos mismos dicen una freegura es una reproducción artesanal de algún personaje o mascota del mundo del Software Libre moldeada manualmente. Algunas de las figuras que tienen son el Ñu de Gnu, diversos modelos de Tux, el elefante de PHP, etc.Ñu con flauta

Tux Red Hat

Elefante PHP

 

 

 

 

 

 

 

 

 

 

 

 

 

Una de las cosas más interesantes es que el 10% de los beneficios van al proyecto de software libre que tú elijas, si no indicas ningún entonces los donarán a la Free Software Foundation. Yo ya voy a ver si me hago con algunas figuritas.

 

Cheli

Trabajando en Planeta Huerto

Hace ya un mes que trabajo en Planeta Huerto y este es el balance de la experiencia hasta ahora.

Planeta Huerto es un sistema de comercio electrónico alicantino de venta de productos de jardinería, ecológicos y bricolaje aunque a día de hoy venden muchas otras cosas. A mi me han contratado con el objetivo de mejorar los procesos internos de gestión, lo cual nos ha llevado a un rediseño del actual backoffice. Lo interesante del proyecto para mi es:

 

  • La empresa es muy joven, Planeta Huerto como tal acaba de cumplir 3 años y por lo tanto aún tiene mucho recorrido. Hay bastantes cosas por hacer y muchas de ellas son muy interesantes.
  • La empresa es muy joven, y ahora me refiero a los empleados. La media de edad posiblemente esté por debajo de los 30 años, aunque yo ya los he pasado hace algún tiempo jejejeje.
  • Los dueños tienen muy claro cual es su hoja de ruta y la enfocan claramente en el crecimiento y la mejora constante de su servicio.
  • Poco después de llegar yo abrieron la web de Portugal así que podríamos decir que ya es una empresa internacional.
  • El software está desarrollado en PHP y utiliza el framework Yii. Hacía mucho tiempo que no programaba en php y además no había utilizado este framework, de momento me ha gustado bastante además de ser muy sencillo de aprender y utilizar.
  • Estoy aprendiendo cosas. No había trabajado en una implantación tan grande de comercio electrónico con lo que no había analizado y pensado en ciertos problemas que hay que resolver para que todo funcione adecuadamente (mejorar el proceso de venta, posicionamiento, escalabilidad, etc). Aprender cosas nuevas siempre es enriquecedor.
  • Me hacen bastante caso, en ese sentido se dejan aconsejar aunque al final la última palabra la tiene el jefe jejejeje.
  • Utilizan la metodología Kanban. No es que sea mi metodología preferida pero se trabaja bien con ella, me siento cómodo.

 

De momento lo dejo aquí, ya os iré contando como me va. Si tenéis alguna pregunta sobre como está montado Planeta Huerto la podéis hacer en los comentarios y siempre que no sea algo comprometedor intentaré contestaros.

 

Cheli

Problemas con timezone y PHP 5.3.x

Después de actualizar PHP en mi servidor Centos empezaron a salirme advertencias de este estilo por todas partes.

 

Warning: date() [function.date]: It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier.

 

El problema reside en que a partir de PHP 5.1.0 es necesario definir el timezone, y desde la versión 5.3.0 se muestran estas advertencias. Tal y como nos advierte hay dos formas de solucionarlo, la primera es mediante código utilizando la función date_default_timezone_set(). La segunda consiste en definir la variable date.timezone en nuestro php.ini, en mi caso quedaría así.

 

date.timezone = «Europe/Madrid»

 

Con esto solucionamos el problema.

 

Listado de zonas.

 

Cheli