viernes, 16 de agosto de 2019

Laravel distinct() with pagination()

Me encontré con esta inusual situación al tratar de usar paginate luego de hacer un distinct, el total de registros y la paginación no coindician con los obtenidos en la consulta, entonces investigando en Internet encontré muchas soluciones pero ninguna de ellas me fue útil.

Decidí encontrar una solución, para ello busque el concepto de distinct y su funcionalidad, luego de saber que la función distinct lo que hace es eliminar los duplicados de una consulta, ejemplo, si selecciono una columna 'text' y si más de un registro en mi base de datos tiene el mismo valor, aunque el id sea distinto, usando distinct solo me va a mostrar una sola descripción, esto aplica para todos los campos seleccionados en mi consulta, es decir, distinct elimina los duplicados de las columnas que seleccione en mi consulta.

Laravel no le otorga a paginate soporte para distinct, luego entonces la función más parecida a distinct es group by que realiza algo más o menos similar, así que para lograr el mismo efecto que tendría un distinct en nuestra consulta es necesario indicar todas las columnas que seleccionamos en nuestra consulta.

Ejemplo:

DB::select('descripcion', 'nombre')->distinct()->paginate(10);

Obtiene los registros de manera correcta, eliminando los duplicados, pero el total de registros y la paginación son incorrectas ya que se eliminan los duplicados.

DB::select('descripcion', 'nombre')->groupBy('descripcion', 'nombre')->paginate(10);

Esta última sería la forma correcta, "simula" distinct, pero el total de registros y la paginación coinciden con los resultados obtenidos

jueves, 4 de abril de 2019

style.cls.php line 1280: A non-numeric value encountered

Mientras programaba un proyecto para un Cliente en Laravel me tope con este inusual error que me arrojaba el dompdf, librería para crear PDF al vuelo, y después de mucho buscar y no encontrar una solución, analice el código y encontré que las siguientes variables no tenían valor alguno asignado.

$d["border_bottom_left_radius"] = "";
$d["border_bottom_right_radius"] = "";
$d["border_top_left_radius"] = "";
$d["border_top_right_radius"] = "";

Sólo tuve que establecer todos los valores a 0 y ¡eureka! la función que estaba utilizando esta librería imprimió exitosamente el documento PDF.

$d["border_bottom_left_radius"] = "0";
$d["border_bottom_right_radius"] = "0";
$d["border_top_left_radius"] = "0";
$d["border_top_right_radius"] = "0";

Espero le pueda ayudar a más de uno a ahorrar tiempo, ya que estos pequeños inconvenientes nos absorben tiempo que bien podemos ocupar en codear cosas más relevantes en nuestros proyectos.

viernes, 27 de julio de 2018

Heroku: Anotaciones rápidas

Para instalar heroku CLI en nuestro equipo (Si trabajamos con GNU Linux, claro) primero debemos instalar la herramienta y esto se hace con el siguiente comando

sudo apt-get install snapd

Luego de haber instalado snapd ahora podemos instalar heroku CLI de la siguiente manera

sudo snap install heroku --classic

Y para poder ejecutar comandos de heroku se necesita el siguiente comando

sudo snap run heroku comando-a-ejecutar

Para poder instalar algunos heroku:addons necesitas introducir los datos de tu tarjeta de crédito o débito, algunas addons tienen una opción libre de pago pero es requisito en heroku para poder utilizarlos

martes, 22 de agosto de 2017

Bookmarklets para Google Calendar

Si usas Google Calendar usualmente te resultara a veces incomodo tener tan poco espacio, es por ello que me dí a la tarea de hacer tres bookmarklets que te permite ocultar/mostrar las barras del calendario y así tener un poco más de espacio al momento de organizar tu agenda en este calendario, generalmente si usas la vista por semana, dos semanas o un mes.

Para poder utilizar los bookmarklets sólo hace falta que arrastres los enlaces a tu barra de favoritos, y dar click sobre ellos cuando quieras usarlos n_n.

Google Calendar Top Toggle
Este bookmarklet oculta/muestra la barra superior en el calendario


Google Calendar Nav Toggle
Este bookmarklet oculta/muestra la barra lateral izquierda


Google Calendar Gadget Cell Toggle
Este bookmarklet oculta/muestra la barra lateral derecha


Aquí un screen con todas las barras ocultas


miércoles, 26 de julio de 2017

Angular JS checkboxes - Errores comúnes

Hay un par de errores que debes evitar cometer para asegurarte de un buen funcionamiento de los checkboxes en angularjs

El primero es asignar directamente el valor de true o false a una variable, y que esta no se encuentre dentro de un objeto, es decir, siempre debemos crear un objeto para que cada propiedad de este sea el que contenga el valor del checkbox y no asignarlo directamente a una variable.

Este código esta mal escrito

<input type="checkbox" ng-model="variable">

El resultado en este ejemplo siempre será false

Este código esta bien escrito

<input type="checkbox" ng-model="objeto.variable">

Aquí el resultado será true o false de acuerdo al estado del checkbox

Otro error que no debes cometer y debes evitar es asignar atributos a un input checkbox con attr, en mi caso el error fue muy específico y tampoco me dejaba que los valores del checkbox se obtuvieran exitosamente, para evitarlo usa la funcion prop en su lugar

Código incorrecto

$('.clase').attr('disabled', '');

Código correcto

$('.clase').prop('disabled', true);

Para quitar el atributo en este caso utilizaríamos $('.clase').removeProp('disabled');

sábado, 5 de noviembre de 2016

Activar Wireless en Linux Deepin

Recién acabo de instalar Linux Deepin en mi computador, pero encontré un problema con la tarjeta wireless broadcom, la cual es BCM4313 y es que el sistema no la detectaba, algo raro por que cuando inicié Linux Deepin para instalarlo desde el pendrive si tuve acceso a internet, estuve googleando un poco la solución a este problema sin encontrarla, entonces volví a introducir el pendrive, reinicie mi equipo e inicie Linux Deepin desde el pendrive para encontrar la solución, y la encontré, resulta que por defecto Deepin instala el controlador privativo (El cuál no funciona con algunos modelos de broadcom, además de que muchos usuarios se quejan de que es lento).

La solución es simple desinstalar el controlador privativo, esto se logra abriendo la consola y escribiendo lo siguiente:

sudo apt-get remove bcmwl-kernel-source

Después de ejecutar este comando reinicias tu equipo y tendrás activado el wireless

lunes, 5 de octubre de 2015

Windows 10

Recientemente actualice mi equipo, pase de tener Windows 7 a tener Windows 10, y aquí describo las cosas positivas y las cosas negativas que he podido encontrar en mi corto tiempo de usar este Sistema Operativo.

Cosas positivas:

Multiescritorio. Esta es una característica nueva en este sistema operativo, y ya se habían tardado en meterla al sistema, es una característica común en GNU Linux.

Barra de tareas multiescritorio. Esta característica en lo particular me gusto mucho porque al trabajar con muchos monitores es práctico tener la barra en todos ellos para poder acceder a las aplicaciones de una manera sencilla y rápida.

Aplicaciones de la Windows Store. Esto me parece muy bueno, y es algo en lo que viene trabajando mucho canonical con ubuntu, tener un sistema operativo tanto para PC como para dispositivos móviles, así podemos instalar aplicaciones de manera rápida y sencilla, directamente desde internet, sin tener que llenar nuestra casa con CD's.

Controladores de Hardware. Windows 10 ya trae la mayoría de los controladores de nuestra PC's o portátil por defecto, es decir, nos ahorra el trabajo de estar buscando estos por Internet (Aunque debe de existir uno que otro componente al que si debamos instalarle su controlador para windows 10).

Deshacer la instalación de Windows 10. Esta característica me parece fantástica, ya que si actualizaste tu versión de Windows 7/8 a 10 y tienes algún problema con el (no detecta tu hardware correctamente, no puedes iniciar alguna aplicación que previamente ya tenías instalada, etc...) con un clic te permite desinstalar la actualización y volver a tu Windows 7/8. Lo malo. Sólo te permite volver a tu versión anterior de Windows dentro de los 30 días posteriores a la actualización a Windows 10.

Cosas negativas:

Adobe Flash Player. Aunque un poco obsoleto existen sitios que siguen usando este programa para permitirte realizar grabaciones tanto de video como de audio y es aquí donde tengo problemas porque no he conseguido instalar una versión, de momento, que me deje grabar audio correctamente. Si no vas a usar este programa para hacer grabaciones la reproducción sobre Windows 10 va perfecta.

Controladores. Aunque en las cosas positivas escribí que muchos de los controladores los encuentra Windows 10 de manera automática, yo tuve que desinstalar mis controladores de Windows 7 para que Windows 10 hiciera el trabajo de instalar los suyos, y este es el punto malo, que Windows 10 no se encarga de desinstalar o avisarte de algún modo que cambies o borres los controladores anteriores.

Carga del sistema. En mi opinión y experiencia Windows 10 carga mucho más lento que Windows 7.

Modo Hibernar. Simplemente en Windows 10 no existe este modo (y si alguien sabe como activarlo le agradecería mucho me dijera como activarlo).



Recomendación. Desde mi punto de vista vale la pena darle una oportunidad a Windows 10, a fin de cuentas, si no te gusta, puedes volver a tu versión de Windows anterior.