marzo 2018

Equivalente a Date.now() de Javascript para obtener milisegundos en PHP

Introducción

Con Javascript, podemos obtener los milisegundos transcurridos desde la fecha Unix utilizando el método estático now de la clase Date. Así:

let milisegundos = Date.now();

Si venimos de ese lenguaje, y nos cambiamos a otro, es probable que extrañemos dicha función. Por lo que hoy veremos cómo obtener los milisegundos transcurridos desde la fecha Unix en PHP, o  un equivalente a Date.now() de Javascript.

La solución se encuentra al final del post, por si vienes sólo por ella. En caso de que no, puedes leer la explicación y el funcionamiento.

Obtener milisegundos transcurridos con PHP

Existe una función llamada microtime, que devuelve la fecha Unix actual con microsegundos. Al llamarla, obtenemos una cadena como respuesta.

Por ejemplo, si llamamos a la función sin argumentos, como se ve en el código:

Produce los siguientes resultados (al menos al momento de ejecutarse mientras escribo esto):

0.90539000 1522338122
0.90561100 1522338122
0.90561800 1522338122
0.90562000 1522338122
0.90562100 1522338122
0.90562200 1522338122
0.90562400 1522338122
0.90562500 1522338122
0.90562600 1522338122
0.90562700 1522338122
0.90562900 1522338122
0.90563000 1522338122
0.90563100 1522338122
0.90563200 1522338122
0.90563400 1522338122
0.90563500 1522338122
0.90563600 1522338122
0.90563700 1522338122
0.90563800 1522338122
0.90563900 1522338122

Como vemos, devuelve aparte los microsegundos y por otro lado los segundos. Nosotros no queremos eso. Veamos cómo obtenerlo como un valor flotante.

Llamando con argumento

Esta función acepta un argumento booleano para indicar si queremos que nos devuelva los resultados como un flotante. Eso es lo que queremos. Vamos a modificar el código:

Y ahora produce los siguientes resultados:

1522338439.1894
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896
1522338439.1896

Ahora devuelve los segundos, y su parte decimal indica los microsegundos transcurridos desde dicho segundo. Vamos a hacer algunas operaciones.

Convirtiendo microsegundos a milisegundos

Nosotros necesitamos milisegundos, pero esa cosa devuelve segundos con una parte fraccionaria que indica los microsegundos. Así que necesitamos mover el punto decimal 3 lugares a la derecha, lo que podemos lograr multiplicando el valor por 1000:

Resultando en esto:

1522338626654.5
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7
1522338626654.7

Ahora sí ya tenemos milisegundos, pero tienen una parte fraccionaria que necesitamos remover. ¿Por qué tienen una parte fraccionaria? recordemos que devuelve microsegundos, y nosotros queremos sólo milisegundos. Entonces necesitamos remover esa parte fraccionaria, redondeando el valor.

Redondeando y obteniendo milisegundos

Modifiquemos el código así:

Con esta salida:

1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381
1522338818381

Esos resultados son el tiempo en milisegundos.

Solución final

Así que toda la explicación de arriba se reduce a lo siguiente:

Y listo. Con eso obtenemos lo mismo que obtendríamos al llamar a Date.now() de JS.

Unir dos o más documentos PDF con Python y PyPDF2

Introducción

Seguimos con los posts acerca de trabajar con documentos PDF. En este caso vamos a ver cómo unir 2, 3 o muchos documentos PDF en uno solo, utilizando el poderoso lenguaje Python y una librería llamada PyPDF2. Vamos allá.

Requisitos

Python 3 y pip. Podemos instalarlo como se ve aquí.

¿Cómo unir documentos PDF en Python?

Vamos a ver que es fácil hacerlo.

Paso 1: instalar librería PyPDF2

En nuestra línea de comandos escribimos:

pip install pypdf2

Presionamos enter, y esperamos a que el paquete se descargue.

Descargar e instalar PyPDF2 para unir PDF's

Descargar e instalar PyPDF2 para unir PDF’s

Paso 2: documentos PDF de ejemplo

Para ilustrar bien este ejemplo, utilizaré 2 documentos PDF. Son estos:

Documento 1: PdfFileWriter

Documento 2: RectangleObject

Por el momento no importa el nombre ni el contenido de cada documento (son de alguna página de documentación de Python), lo que importa es cómo vamos a unirlos, y también el resultado.

Dichos ficheros estarán en el mismo directorio en donde ejecutaré el script.

Directorio en donde ejecutaremos el script

Directorio en donde ejecutaremos el script

Vamos allá.

Paso 3: Unir documentos

Aquí el código fuente que utilizaremos:

Al ejecutarlo (en caso de que no haya errores) no imprime nada en la consola:

Ejecutar unión de documentos

Ejecutar unión de documentos

Naveguemos ahora al directorio en donde lo ejecutamos. Una vez que la ejecución haya terminado, habrá un documento nuevo con el nombre que indicamos.

Unión exitosa

Unión exitosa

Listo, se ha creado un nuevo documento: salida

Bonus: unir todos los documentos en el directorio actual

Puede que no deseemos cambiar la lista cada vez  que queremos unir diferentes documentos, podemos unir todos y cada uno de los documentos pdf que se encuentren en el directorio en donde se ejecuta nuestro script.

Al ejecutarlo, el resultado será el mismo; la diferencia es que no tuvimos que escribir el nombre de cada documento.

Conclusión

No sólo podemos unir 2 documentos, podemos unir los que sea, sólo tenemos que agregar sus nombres a la lista, o utilizar el segundo script para unir todos los que se encuentren en el directorio.

Te invito a ver cómo convertir imágenes a PDF, y también a darle una estrella al repositorio de la librería.

Créditos al autor de la respuesta que encontré en stackoverflow.

Descargar una imagen PNG, GIF y JPG con Python

Introducción

Hoy veremos cómo descargar una imagen de una URL utilizando Python. Dependiendo de dicha url crearemos un archivo en nuestro disco duro. En pocas palabras, descargaremos la imagen.

Requisitos

Necesitamos instalar requests utilizando pip. Si no lo tienes, aquí dejo un tutorial.

Instalar requests

Una vez que hayamos instalado Python, ejecutamos el siguiente comando:

pip install requests

Con ello habremos instalado la dependencia, una vez hecho esto, lo demás será más fácil.

Descargar imagen jpg con Python

En este caso descargaremos esta imagen: https://golang.org/doc/gopher/appenginegophercolor.jpg

La guardaremos con el nombre “go.jpg”. Nuestro código fuente de ejemplo se ve como a continuación:

Cuando ejecutemos nuestro programa, no aparecerá nada en la consola, pero sí en el directorio en donde lo hayamos ejecutado:

Descargar imagen jpg con Python

Descargar imagen jpg con Python

Descargar PNG con Python

Igualmente podemos descargar una imagen en formato PNG. Para ello, sólo cambiamos el archivo de salida y obviamente la url. Quedando así:

Descargar GIF con python

Curioso pero cierto. También podemos descargar una imagen GIF utilizando Python.

Conclusión

Ya vimos lo fácil que es descargar imágenes de una url con Python. Podemos llamarlas en un ciclo, indexar un sitio web, etcétera.

Generar PDF a partir de imágenes con Python 3 e img2pdf

Introducción

Debido a circunstancias que no tengo que explicar, me vi en la necesidad de convertir JPG a PDF, o en pocas palabras, convertir un montón de imágenes a un documento PDF.

Conozco una herramienta llamada ilovepdf, es en línea y muy cómoda. Pero pone un límite; y por otro lado mi internet no es el de la nasa.

Me puse a pensar, por lo tanto, cómo convertir mis imágenes a PDF. Y encontré la respuesta que vengo a exponer.

Además, será en Python, un lenguaje querido por todos.

Convertir imágenes JPG a PDF

Requisitos

Primero necesitamos tener instalado Python 3 y pip. Aquí un grandioso tutorial de cómo instalarlo en Windows 10.

Instalar img2pdf

Así se llama el paquete que nos permitirá convertir JPG a PDF. Lo instalamos con:

pip install img2pdf

En mi caso, sale esto al instalar:

Instalación exitosa de img2pdf

Instalación exitosa de img2pdf

Por favor ignoren la advertencia de que pip necesita actualizarse. Ya lo he dicho antes, con que diga “Successfully…” nos damos por bien servidos.

Carpeta de imágenes

Para este ejemplo, tengo una carpeta con imágenes. Se ve así:

Directorio con imágenes para convertir

Directorio con imágenes para convertir

Ahora vamos a partir esto en partes para entenderlo mejor.

Obtener lista de imágenes

Esto no tiene nada que ver con la conversión a PDF. Simplemente veremos cómo obtener una lista de archivos en determinado directorio, para que más tarde podamos convertirlas. El código para ver el contenido de un directorio es este:

Al ejecutarlo, se listarán todos los archivos que estén en el directorio en donde se ejecute el script.

Pero como vemos, no todo son imágenes. Están por ejemplo los scripts que estamos viendo justo ahora. Para omitirlos podemos hacer una comparación, e imprimir sólo los archivos .jpg:

Si lo ejecuto, ahora sólo muestra imágenes jpg.

Listar únicamente imágenes JPG

Listar únicamente imágenes JPG

Con eso ya tenemos la mitad de este tutorial.

Convertir imágenes a PDF

Para ello, primero filtramos los archivos del directorio actual de manera que sólo queden imágenes jpg en la lista. Con esa lista, llamamos a img2pdf y listo. Antes de ello abrimos el documento para escribir sobre él, esperamos un poco (dependiendo de cuántas imágenes sean) y se habrá generado nuestro archivo PDF.

 

Y con eso estamos listos. Por cierto, créditos a quien respondió la pregunta de este sitio. También dejo el enlace a la documentación oficial.

Ejemplos e introducción a los objetos y clases en Go

Introducción

Go, o Golang es un lenguaje de programación compilado. No tiene una forma de definir una clase (así como estamos acostumbrados por ejemplo en Java) pero sí podemos crear objetos.

¿Cómo declarar una clase en Go?

No declaramos una clase, declaramos un tipo. Por ejemplo, si yo quisiera declarar la clase Mascota, pondría esto:

Declaramos variables de distintos tipos dentro de nuestro tipo.

¿Cómo crear un objeto en Go?

Tomando el ejemplo de arriba, podemos crear un objeto de la siguiente forma:

Podemos imprimirlo, se verá esto:

Instanciar un objeto

Podemos instanciar o crear un objeto de 2 maneras. En la primera, mandamos en orden los valores del objeto. Así:

Pero no recomiendo esa forma, ya que no es expresiva y si el orden de los valores cambia dentro del tipo, tendremos que cambiar también las llamadas a la creación del mismo.

Recomiendo esto:

Ahí definimos cuál variable estamos pasando. Además, el orden no importa (en este caso las mandé en el mismo orden pero fue coincidencia)

Métodos dentro de una clase

También podemos declarar métodos o funciones. Programemos la función ladrar, en donde imprimimos un mensaje y accedemos a algunas propiedades de nuestra mascota.

Vemos claramente que no definimos la función dentro de nuestro tipo, sino que la adjuntamos a un apuntador del mismo. Si yo ejecuto el programa, sale esto:

Métodos de clases en Go

Métodos de clases en Go

 

Modificando y obteniendo propiedades

Podemos modificarlas directamente, como se ve a continuación:

Modificar variable en objeto

Modificar variable en objeto

Igualmente obtenerlas:

Con este resultado:

Obtener propiedad de un objeto

Obtener propiedad de un objeto

Pero no es recomendado obtenerlas así. Eso sería dejar nuestras variables públicas, y generaría  (en la mayoría de los casos) muchos errores.

Setters y getters

Podemos crear getters y setters para obtener y establecer propiedades. Veamos por ejemplo el setter y getter de edad.

Para establecer su edad definimos otra función, igualmente para obtenerla.

El resultado al ejecutarlo sigue siendo el mismo, pero ahora ya hemos implementado getters y setters.

Setter en Go

Setter en Go

Objetos dentro de otras clases

Para terminar el post y no hacerlo muy largo, veamos que podemos tener objetos dentro de objetos.

Pongamos a nuestra mascota un dueño. Un dueño es del tipo Persona.

Al ejecutar, el resultado es este:

Objetos dentro de objetos en Go

Objetos dentro de objetos en Go

Con eso terminamos por hoy.

Creando un buscador de artículos con API de Wikipedia y VueJS

Introducción

Ya expliqué cómo consumir la API de Wikipedia por separado. Hoy veremos un ejemplo de un buscador de Wikipedia.

Lo he hecho con mi framework Javascript favorito hasta el momento: VueJS. Encima de VueJS corre VuetifyJS que simplemente proporciona componentes con el estilo Material Design.

Vamos allá.

Probar app terminada

Ya ni sé por qué le decimos a cualquier cosa “app” pero no encuentro otro nombre para nombrar las cosas. En fin, si quieres ver el proyecto terminado aquí dejo un link a codepen. Igualmente lo dejo embebido:

See the Pen Wikipedia viewer by Luis Cabrera Benito (@parzibyte) on CodePen.

Construyendo un buscador de Wikipedia

Bueno, vamos a explicar cosa por cosa.

Herramientas utilizadas

  • VueJS, un framework de Javascript
  • API de Wikipedia
  • VuetifyJS, estilo Material design sobre VueJS
  • Lodash, sólo para no tener que escribir mi propio debounce
  • Material Icons, para los iconos

Interfaz

Quise hacerla como el buscador de Google pero al final salió otra cosa y, como me gustó, así la dejé. Puse una imagen de Wikipedia, abajo un campo para introducir texto, luego un botón para obtener un artículo aleatorio y finalmente un seleccionador de idiomas.

Traducciones

Si en la app cambiamos el idioma, veremos que la leyenda de Artículo aleatorio y Comienza a escribir cambian. Así se ve en español:

Visor de Wikipedia en español

Visor de Wikipedia en español

Así en inglés:

Visor de Wikipedia en inglés

Visor de Wikipedia en inglés

Lo mismo para otros idiomas. Cabe aclarar que saqué todo del traductor de Google jaja, así que puede que haya errores. En fin, eso no importa; lo que importa es cómo se cambia el texto.

Para ello, tenemos que remontarnos a los idiomas soportados. Puse estos:

Y entonces, en los valores calculados de la app puse estos métodos:

Por el momento fijémonos en los dos últimos. Dependiendo del idioma seleccionado, regresan un valor. Es decir, es un objeto y accedemos a una de sus propiedades. Dicha propiedad puede ser “es”, “en”, etcétera.

Lo mismo aplica para la URL de búsqueda. Podemos ver que utilizamos el poder de las backticks en Javascript para regresar una URL dependiendo del idioma seleccionado.

¿y en qué momento seleccionamos un idioma por defecto? en el método mounted del ciclo de vida de nuestra aplicación:

Seleccionamos el primer idioma que encontremos, ya después el usuario podrá elegir otro, y cuando eso pase, todo se refrescará automáticamente gracias a la reactividad de VueJS.

Búsqueda

La parte más importante de la aplicación. Detecta cuando empezamos a escribir y busca.

Detectar cambios

Con watch, vigilamos cuando cambie “busqueda”. En caso de que cambie y de que tenga un valor que no sea falso, buscaremos. Como vemos llamamos al método buscar.

Debounce

Ok. Una vez que detectamos los cambios, hacemos un debounce. Un debounce es algo así (al menos en js) como llamar a una función una única vez, en el intervalo dado. Para no complicarme las cosas utilicé lodash.

Explicando de mejor manera, si no hiciéramos un debounce, la función se llamaría el número de veces que el usuario escribiera. Si quería buscar “hola”, la función se llamaría con “h”, luego con “ho”, y así, 4 veces.

Al usuario no le importaba buscar “h” ni “ho” o “hol”, sino “hola”, pero sin querer llamó a la función 4 veces. Esto cargaría al servidor. Para ello, hacemos que sin importar cuántas veces se llame la función, sólo se llame después de medio segundo (500 milisegundos).

De esta manera, el usuario podrá buscar y su búsqueda regresará en 500 milisegundos; cosa que ni notará.

Buscar

Cuando buscamos, simplemente llamamos a la url de la api y le concatenamos el valor de la búsqueda. Esperamos a que hayan resultados y primeramente eliminamos las etiquetas HTML, luego hacemos un JSON.parse para decodificar la cadena en formato JSON y finalmente establecemos los resultados de la búsqueda a respuesta.query.search.

VueJS detectará el cambio y entonces mostrará la lista de resultados:

Resultados de la búsqueda | Consumiendo API de wikipedia

Resultados de la búsqueda | Consumiendo API de wikipedia

Cuando hacemos click, el objeto clickeado pasa a ser el valor de la variable resultadoSeleccionado.

Resultados

Como dijimos arriba, el resultado pasa a ser parte de nuestra app. Y para ello lo mostramos en la vista:

Utilizamos v-if para ocultarlo en caso de que no seleccionen nada. Mostramos el título y el snippet. También un botón que en realidad es un link, y que dirige al enlace que tenga la variable rutaArticulo. Esta variable ya fue vista anteriormente, allá arriba.

Artículo aleatorio

Igualmente sólo es un link-botón definido así:

Cuyo href es la variable rutaArticuloAleatorio que ya vimos más arriba.

Otras cosas

Sólo hace falta mencionar la equis que aparece en la barra de búsqueda, cuya función es limpiar el campo de texto. Viene por defecto en el componente, así que no hace falta explicarla.

Conclusión

Espero que haya explicado todo y que no queden dudas. De todos modos, puedes dejar un comentario si algo no quedó claro. Aquí dejo el código fuente, pues es la mejor manera de estudiar el funcionamiento. Nos vemos luego.

Backticks o plantillas de cadena en Javascript

Introducción

Javascript es un lenguaje que evoluciona rápidamente. Hace algunos años se introdujeron las backticks o template strings. Permiten concatenar y trabajar con cadenas de una mejor y sencilla manera.

Plantillas de cadena

Concatenar

¿Qué pasaba si queríamos un texto largo, legible en el código? podíamos hacer algo así:

En cambio, con las backticks podemos hacer esto:

¿Fabuloso, no?

Expresiones

Como vimos, con ${} podemos acceder a variables. Pero no es acceder a variables lo único que podemos hacer; de hecho podemos poner una expresión como cualquier otra.

Veamos por ejemplo cómo imprimir una tabla de multiplicar. Normalmente sería así:

Con resultados:

Tabla de multiplicar con ES5

Tabla de multiplicar con ES5

En cambio, con las template strings haríamos algo así:

El resultado sería el mismo:

Tabla de multiplicar con ES6

Tabla de multiplicar con ES6 

Comillas, saltos de línea y tabulaciones

Podemos escapar cualquier tipo de comillas. Los saltos de línea los ponemos incluyendo el salto de línea directamente en la plantilla, al igual que las tabulaciones. Aquí un ejemplo:

Con eso podemos poner mucho texto sin preocuparnos por escaparlo. El resultado es este:

Sin necesidad de escapar texto, tabulaciones, comillas o saltos de línea

Sin necesidad de escapar texto, tabulaciones, comillas o saltos de línea

Funciones

Para terminar de explicar, veremos que también podemos llamar a funciones, pasar parámetros y todo eso. De hecho, dentro de una función también usamos las backticks.

Al ejecutar el código, este es el resultado:

Funciones llamadas dentro de plantillas de texto

Funciones llamadas dentro de plantillas de texto

Conclusión

Recordemos que no todos los navegadores lo soportan, así que es mejor investigar antes de implementar. Por otro lado, podemos utilizar un compilador como Babel que convertiría las template strings en cadenas simples, concatenadas, respetando saltos de línea, llamadas a funciones y todo eso.

BabelJS para transformar backticks. A la derecha texto transformado.

BabelJS para transformar backticks. A la derecha texto transformado.

En este caso lo hice directamente desde el navegador, pero ya hay muchas herramientas que permiten compilarlo automáticamente.

Empaquetando scripts de Python en un .exe o ejecutable utilizando PyInstaller

Introducción

Python es un lenguaje multiplataforma muy poderoso. Sirve para miles de cosas, pero hay algo que dificulta su “distribución” a los usuarios finales.

Es decir, no podemos mandarle un script con extensión .py a un cliente y decirle que instale Python, lo ponga en la variable PATH y lo ejecute desde la terminal.

Además… ¿qué pasa si nuestro script tiene dependencias? o si son muchos scripts, o cosas de esas.

Debido a esto, necesitamos algo así como un creador de ejecutables de Python. Una cosa que empaque todo en un archivo .exe (o al menos en un .zip) y que, sin necesidad de que en la máquina del usuario exista Python, se pueda ejecutar.

Justamente hoy venimos a hablar de eso: cómo crear un ejecutable de archivos de Python, utilizando PyInstaller.

Continue reading…

¿Bug en WordPress al poner título php: // input?

Introducción

Ya van 2 veces que me pasa esto, pero no entiendo la razón. Lo que pasa es muy raro: escribo php://input en el título, y al dar click en vista previa me sale el error 403. Bueno, de hecho me sale el 404 pero es porque no encontró el 403.

Descripción del problema

Lo he probado en 2 sitios (es decir, 2 instalaciones de WordPress) que tengo en el mismo servidor. No sé si sea mi servidor o WordPress, pero esto pasa:

Agregar entrada con título que contiene php://input

Agregar entrada con título que contiene php://input

Ahí pongo el título tal y como se ve. Al hacer click en Vista previa, esto se muestra:

Error al cargar vista previa

Error al cargar vista previa

Ni idea de lo que pueda ser, pero lo documento aquí por si alguien algún día sabe la razón de esto. Yo supongo que no debe haber una razón específica, ya que el título debería ser validado y “curado” pero al menos saldría una advertencia, y esto hace que no salga nada.

Por cierto, cuando lo pongo separado de las dos diagonales, no pasa nada. Es decir…

php://input => malo

php // input => bueno

Acceder a php // input en PHP con CodeIgniter

Introducción

No sé si sólo yo lo hago, pero cuando es necesario mandar datos complejos (no simples formularios) podemos utilizar JSON para serializarlos y luego hacer el proceso inverso del otro lado.

Pero del otro lado no leeremos a $_POST sino al stream php://input. En php puro lo hacemos con file_get_contents, pero si estamos utilizando un framework, lo tenemos que hacer a su manera.

Hoy veremos cómo obtener datos del stream php://input en CodeIgniter.

Leer php://input con la propiedad raw_input_stream

Es muy, muy fácil. Simplemente accedemos a la propiedad raw_input_stream de input. Y con eso tenemos. Así se hace:

Con eso ya podemos des-serializarlos. En mi caso, utilizo JSON, así que llamaría a la función json_decode y listo, tendría los objetos/arreglos tal y como los mandé del lado del cliente.

La ventaja que ofrece este método es que, según la documentación, podemos leerlo en cualquier momento; ya que php://input sólo puede ser leído una vez.

Tomar foto de cámara con Python y guardarla en servidor con PHP

Introducción

Acabo de publicar cómo tomar una foto de la cámara web con Python. La vez pasada, vimos cómo tomar una foto con Javascript y guardarla en servidor con PHP. Lo hicimos porque con Javascript (al menos en el navegador, no con NodeJS) no podemos escribir archivos.

Ahora puede que nos preguntemos ¿por qué tomar una foto con Python y guardarla luego con PHP? y bueno, la respuesta varía; pero a mí se me ocurre que puede que tengamos un servidor en internet que hable PHP, y que ahí alojemos nuestras fotos. O, pensando mal, podemos tomar una foto del usuario (ya que esto no pide permiso) y mandarla a nuestro servidor.

En fin, las respuestas sobran, y aquí yo respondo a cómo hacerlo. De todos modos, es responsabilidad de cada usuario hacer lo que se le dé la gana.

Requisitos

  • Tener instalado Python y pip. Aquí hay un tutorial que escribí hace algún tiempo.
  • Contar con un servidor para pruebas. En este post veremos cómo hacerlo en modo local. Si no tienes PHP o Apache, te recomiendo ver: cómo instalar PHP en Windows.
  • También recomiendo leer la entrada anterior, pues así tendremos las bases. Además, recuerda instalar opencv.

Python

Comencemos viendo cómo programaremos a Python. Ya vimos que con opencv podemos tomar una foto y guardarla en nuestro disco duro. El código era este:

Realizaremos algunas modificaciones sólo al momento de guardar la imagen, ya que no quedará en la pc del usuario; sino que la mandaremos.

Para mandarla y evitar que se pierda información en el camino vamos a codificarla con la vieja confiable: base64. Ya que Python y PHP traen por defecto la codificación/decodificación con este algoritmo o lo que sea, será fácil implementar esto.

Entonces:

  • Tomamos la foto
  • La codificamos en base64
  • Enviamos la cadena a PHP

Así que, aquí el código:

Como vemos, requerimos de nuevas librerías para poder hacer las peticiones. No hay necesidad de instalar otra cosa, pues ya vienen incluidas por defecto.

Utilizamos imencode para poner la imagen en un buffer, y a ese buffer lo codificamos en base64. Finalmente, hacemos la petición y mandamos la imagen.

Aquí termina el código (del lado del cliente, ¿tal vez?) de Python. Vamos con PHP.

PHP

5 líneas (y podrían utilizarse menos) bastan para guardar la imagen. Simplemente escribimos un archivo png… su contenido será lo que venga en el índice foto del arreglo $_POST.

Pero no lo hacemos nomás así, sino que primero comprobamos si existe algo en esa posición. Para el nombre de la imagen usamos uniqid. Y listo.

He aquí el grandioso código.

Por cierto, al final hacemos un json_encode y mandamos los bytes que se escribieron. Esto no lo estamos capturando en Python, pero por si quisiéramos, podríamos hacerlo. Además, en este caso lo hago para ser educado y no quedar sin responder.

Importante: este archivo, en mi caso, está en mi servidor en una carpeta llamada “fotos_python“. Recuerda que si cambias la ruta o el nombre del archivo php, también debes cambiar la variable en Python.

Probando

Un post sin probar el resultado sería un post sin sentido. Voy a probarlo ahora mismo…

Tomar foto con Python y enviar a PHP

Tomar foto con Python y enviar a PHP

Ahí dice que ya se envió. Si visito mi disco duro en donde está la carpeta pública de mi servidor, veré esto:

Imagen almacenada en servidor correctamente

Imagen almacenada en servidor correctamente

Ahí está la foto. Y digo lo mismo que la vez pasada: tengo cubierta mi cámara, pero el script sirve como un encanto. Además, ¿a qué le tomaría foto para comprobarlo?

Conclusión

Así de fácil es esto. Me parece una combinación perfecta Python y PHP. Por cierto, podríamos loguear la IP del cliente, la hora, y esas cosas… pero ya cada quien lo puede modificar a su gusto.

Así es como terminamos hoy.

Tomar foto de webcam con Python

Introducción

Ya vimos cómo tomar una foto de la cámara web o de cualquier dispositivo utilizando Javascript. En aquel post, guardábamos la foto con PHP. Hoy veremos cómo tomar una foto con Python y guardarla en el sistema.

Nota: te invito a leer cómo tomar la foto y guardarla en PHP.

Requisitos

Tener instalado Python y pip. Aquí hay un tutorial para instalar Python 3.

Instalando OpenCV

Para poder acceder a la cámara del dispositivo, necesitamos el paquete de OpenCV. Para ello, ejecutamos lo siguiente en la línea de comandos:

pip install opencv-python

Voy a ejecutarlo en mi consola:

Si en tu caso no sale esto, no hay problema. La imagen se ve así porque ya lo había instalado previamente, pero lo desinstalé para efectos de este tutorial. Con que diga Successfully installed opencv-python… te puedes dar por satisfecho.

Accediendo a cámara

Muy bien, ahora sí podemos trabajar. El código es realmente sencillo. Accedemos a la cámara 0, vemos si se pudo abrir correctamente y si es así entonces escribimos el resultado en una imagen. En caso de que no se haya abierto la cámara, lo indicamos.

Código fuente

Aclaración sobre las cámaras

En este caso, accedemos a la cámara 0. Imaginemos que todas las cámaras del dispositivo son un arreglo. Los arreglos comienzan en 0. Si queremos acceder a la segunda cámara, utilizamos 1. Para la tercera, utilizamos 2. Y así sucesivamente, dependiendo del número de cámaras que tengamos.

Ejecutando código

Mi computadora sólo tiene una cámara, así que accedo el código que ejecuto es el mismo que puse allá arriba. Lo llamo desde mi computadora:

Tomar foto con Python y cámara web | Ejecución

Tomar foto con Python y cámara web | Ejecución

Lo ejecuté en D:\desarrollo_python, así que la foto se guardó ahí. En mis documentos iré a esa ubicación:

Foto guardada con éxito

Foto guardada con éxito

Y aquí dejo la foto que tomé:

No pienses que no funciona, simplemente mi cámara está cubierta. Pero si quieres, puedes seguir el tutorial y verás que no genera ningún problema.

Tomar foto con distinto nombre

Cada que llamamos al código de arriba, se sobrescribe la foto si ya existe. Si quisiéramos que tuviera un nombre distinto, podemos generar un id único utilizando uuid. La verdad no sé cómo funciona, sólo sé que genera un id que no se repite.

Por consecuencia, el código se modificaría así:

Y al ejecutarlo múltiples veces:

Fotos con distintos nombres

Fotos con distintos nombres

Por cierto, uuid ya viene incluido, no necesitamos utilizar pip para instalarlo.

Bonus

Luego de escribir esta entrada, me dije… ¿podemos guardar la foto en un servidor? la respuesta es sí, y aquí explico cómo hacerlo al menos con PHP.

Conclusión

Qué manera más fácil de tomar una foto. También podemos tomar vídeos, múltiples fotos, etcétera. De hecho, opencv sirve para muchas cosas más allá de tomar simples fotos. Aquí dejo el enlace a la documentación oficial.

Con esto terminamos por hoy.

Obtener último ID insertado en tabla con CodeIgniter

Introducción

Es muy probable que en nuestra base de datos (MySQL en mi caso) tengamos una tabla con un campo de auto incremento o AUTO_INCREMENT.

Si trabajamos con estos campos y con CodeIgniter, puede que nos preguntemos ¿Cómo obtener el último ID que ha sido insertado en nuestra tabla? Este ID nos sirve, por ejemplo, al hacer relaciones.

Supongamos que tenemos una tabla de productos vendidos y otra de ventas. Si en los productos vendidos guardamos el ID de venta, primero necesitamos hacer la venta, luego obtener el último ID de la base de datos y, ya con esto, guardar el Id de venta en la tabla de productos vendidos.

Obtener último ID insertado

CodeIgniter, un framework de PHP, provee esto en un método muy simple. Recordemos que para usar la base de datos ya sea en nuestro modelo o controlador, primero debemos cargarla.

El código para obtener el último ID guardado es este:

Ejemplo de obtener el último ID de la base de datos

Para poner un ejemplo, aquí dejo un modelo en donde lo he estado utilizando. Básicamente guarda la información de la persona en la base de datos y devuelve el último ID insertado.

Notemos por favor que en el constructor es en donde cargamos la base de datos.

Con eso terminamos el tutorial de hoy. Recuerda que en este caso fue de la tabla personas, pero funciona igual para todas las tablas.

Ejercicio resuelto con C: Refaccionaria SUV y filtros

Introducción

Hoy resolví un pequeño problema/algoritmo en C y ahora vengo a publicarlo por si le sirve a alguien. Principalmente veremos el ciclo while, la entrada de datos con scanf, toma de decisiones con switch y algunas operaciones aritméticas básicas.

Definición del problema

El problema dice más o menos así. Es copiado y pegado.

En la refaccionaria SUV se venden 5 tipos de filtros de gasolina.

FiltroPrecio
A$10.00
B$15.00
C$20.00
D$25.00
E$30.00

Elabore un programa que resuelva lo siguiente

  1. Determine la cantidad a pagar por el cliente (N clientes), dependiendo de:
    1. El tipo de Filtro
    2. Cantidad de Filtros
  2. Si el filtro es de tipo C se le hace un 5% de descuento en la compra
  3. Calcule el corte de caja del día.
  4. Contabilice el número de clientes atendidos.

Escribir y ejecutar el código en lenguaje de programación c.

Solución al problema

Explicación del algoritmo y solución

Vamos a analizar lo que se pide, paso a paso. Si quieres ir directo al código fuente, ve más abajo.

Variables

Comencemos leyendo que se desea contabilizar el total y el número de clientes. Para ello, vamos a definir 2 variables: una para contar los clientes, que iremos aumentando de uno en uno. Y otra, para el total de todo el día. En este caso, para contabilizar usamos numeroDeClientes y para el precio total, la variable precioTotal.

También necesitamos una variable para ir sumando el total de la compra del cliente, ya que un cliente puede comprar múltiples filtros. En este caso, la llamamos precioParaElCliente.

Cuando declaramos variables vemos a 2 de ellas de tipo char. Almacenaremos ahí la elección del usuario. Alojamos, más tarde, en eleccionFiltro cuál filtro quiere el cliente. Y en eleccionCliente almacenamos si se desea hacer otra venta.

Toma de decisiones

Dentro de los ciclos hacemos un switch comparando lo que el usuario ha elegido. Evaluamos si es A, B, C, D o E. Si es C, entonces aplicamos descuento.

Ciclos

Luego, hacemos un while dentro de otro while. El while padre se encarga de decir cuál cliente estamos atendiendo. Dentro de él, hacemos otro ciclo que se romperá sólo si el usuario escribe N como respuesta al filtro.

El ciclo while padre se rompe cuando el usuario elige N como respuesta a “¿Desea atender otro cliente?”.

Por cierto, pido disculpas por no escribir acentos o el signo de interrogación de apertura, pero lo que pasa es que no se ven bien en consola.

Cuando el ciclo padre se rompe, imprimimos el total vendido. Y también el total de clientes atendidos.

Quiero recalcar que en cada iteración del ciclo padre, la elección del filtro se pasa a su estado inicial, para evitar que se caiga en un ciclo infinito. Y cuando hacemos:

numeroDeClientes++

es como si hiciéramos:

numeroDeClientes = numeroDeClientes + 1;

Por otro lado, utilizamos toupper para cambiar el caracter de entrada a mayúsculas. Así, no importa si el usuario escribe ‘a’ o ‘A’ ya que al pasarlo a mayúsculas ambas letras serán ‘A’.

Código fuente

Aquí dejo el código fuente. Le faltan algunas optimizaciones; por ejemplo, podríamos ahorrarnos la impresión de “OK. Ha seleccionado…” en cada case; podríamos hacerlo simplemente al final.

Ejecución del programa

Así se ve al ejecutarse. Obviamente la salida es distinta dependiendo de lo que el usuario elija. Qué bonitos se ven los asteriscos.

Ejecución y salida del programa en C

Ejecución y salida del programa en C

Conclusión

C es un bueno y bonito lenguaje de programación. La mayoría de lenguajes de programación más populares hereda su sintaxis. Además, personalmente me gusta y lo respeto porque fue el primer lenguaje de programación que me enseñaron.

Y por cierto, luego de trabajar con tantas interfaces gráficas, páginas web y otras cosas, se siente bien regresar a hacer aplicaciones en consola.