mayo 2018

Operador o símbolo de flecha gorda en PHP

Introducción

Hoy veremos lo que es el operador flecha gorda en PHP. Dicho operador puede ser leído o entendido como:

  • Operador de flecha
  • Flecha gorda
  • Igual y mayor que
  • =>

Veamos qué usos tiene.

Para declarar elementos (clave y valor) de un arreglo.

Si queremos definir un arreglo de clave y valor en PHP lo hacemos así:

<?php
$personaje = [
    "nombre" => "Leon",
    "apellidos" => "Scott Kennedy",
    "edad" => 30
];
?>

Esto es un equivalente a definir un objeto en Javascript.

Para iterar en un arreglo

Si utilizamos el ciclo foreach, podemos utilizar este operador para utilizar la clave y el valor. Para ilustrar, vamos a definir un arreglo de personajes:

<?php
$personajes = [
    [
        "nombre" => "Leon",
        "apellidos" => "Scott Kennedy",
        "edad" => 30
    ],
    [
        "nombre" => "Ada",
        "apellidos" => "Wong",
        "edad" => 25
    ],
    [
        "nombre" => "Chris",
        "apellidos" => "Redfield ",
        "edad" => 30
    ],
];
?>

Una vez hecho esto, ahora sí iteraremos con foreach:

<?php
$personajes = [
    [
        "nombre" => "Leon",
        "apellidos" => "Scott Kennedy",
        "edad" => 30,
    ],
    [
        "nombre" => "Ada",
        "apellidos" => "Wong",
        "edad" => 25,
    ],
    [
        "nombre" => "Chris",
        "apellidos" => "Redfield ",
        "edad" => 30,
    ],
];
foreach ($personajes as $indice => $personaje) {
    echo "Estamos en el indice $indice. El nombre del personaje es " . $personaje['nombre'] . PHP_EOL;
}

La salida es esta:

Estamos en el indice 0. El nombre del personaje es Leon
Estamos en el indice 1. El nombre del personaje es Ada
Estamos en el indice 2. El nombre del personaje es Chris

Cabe mencionar que si no necesitamos el índice, podemos utilizar la versión corta de foreach:

<?php
$personajes = [
    [
        "nombre" => "Leon",
        "apellidos" => "Scott Kennedy",
        "edad" => 30,
    ],
    [
        "nombre" => "Ada",
        "apellidos" => "Wong",
        "edad" => 25,
    ],
    [
        "nombre" => "Chris",
        "apellidos" => "Redfield ",
        "edad" => 30,
    ],
];
foreach ($personajes as $personaje) {
    echo "El nombre del personaje es " . $personaje['nombre'] . PHP_EOL;
}

En este caso no estamos obteniendo el índice, pero si lo necesitamos podemos utilizar el operador =>.

Ejercicios resueltos con Cisco: VTP y VLAN

Introducción

Hoy veremos un poco de VTP y configuración de VLANs. VTP propaga configuraciones en switches que pertenezcan al mismo dominio.

Nota: las contraseñas son cisco y class

Distribución de la red

Configurar el S1 como servidor VTP, asignar dominio y contraseña

Abrimos la CLI del S1 y ejecutamos:

enable
configure terminal
vtp mode server

Para el dominio, ahí mismo hacemos:

vtp domain CCNA

Y finalmente para la contraseña:

vtp password cisco

Con eso ya llevamos 7 %. Aquí la imagen de la CLI:

Configurar S2 y S3 como clientes, con mismo nombre de dominio y contraseña que S1

Lo mismo, sólo cambia el modo VTP  de server a client. Para el S2:

Los comandos son:

enable
conf t
vtp mode client
vtp domain CCNA
vtp password cisco

Ahora hacemos lo mismo en el S3:

Debemos llevar 30 % de la actividad.

Configurar VLAN en S1

Hora de crear las VLAN. Los comandos son:

enable
conf t
vlan 10
name Faculty/Staff
vlan 20
name Students
vlan 30
name Guest(Default)
vlan 99
name Management&Native

Aquí la imagen:

Se supone que este switch propagará las VLAN, así que no tenemos que crear las mismas VLAN en los demás switches.

El avance hasta ahora debe ser de 46 %.

Configurar los enlaces troncales en S1, S2 y S3

VLAN nativa y enlaces troncales de S1

Ejecutamos en el S1:

enable
conf t
int f0/1
switchport mode trunk
switchport trunk native vlan 99
int f0/3
switchport mode trunk
switchport trunk native vlan 99

Switch 2

Casi los mismos comandos, pero la nativa sólo va en la f0/1:

enable
conf t
int f0/1
switchport mode trunk
switchport trunk native vlan 99

Switch 3

Lo mismo que arriba pero en la f0/3 y en el switch 3:

enable
conf t
int f0/3
switchport mode trunk
switchport trunk native vlan 99

Con esto llevamos 76 % de la actividad.

Asignar VLAN a los puertos

Finalmente asignaremos los puertos del switch 2 y 3. Para ello…

Switch 2

enable
conf t
int f0/11
switchport mode access
switchport access vlan 10
int f0/18
switchport mode access
switchport access vlan 20
int f0/6
switchport mode access
switchport access vlan 30

Justo como se ve en la imagen:

Switch 3

Para terminar, hagamos lo mismo en el s3:

enable
conf t
int f0/11
switchport mode access
switchport access vlan 10
int f0/18
switchport mode access
switchport access vlan 20
int f0/6
switchport mode access
switchport access vlan 30

Como se ve en esta imagen:

Con esto ya estamos al 100 %.

Conclusión

Aquí la imagen comprobando los resultados:

Te invito a leer:

Mostrar toast en Fragment y en Activity de Android

Introducción

Mostrar un toast en una actividad (o activity) y en un fragmento (fragment) son dos cosas distintas. Como primer argumento para llamar a makeText debemos pasar el contexto.

Hoy veremos cómo hacerlo desde una Activity y desde un Fragment.

Mostrar toast en Activity

Para hacer esto, podemos usar esto:

Toast.makeText(getApplicationContext(), "Hola", Toast.LENGTH_SHORT).show();

O esto:

Toast.makeText(NombreDeTuActividad.this, "Hola", Toast.LENGTH_SHORT).show();

Mostrar toast en Fragment

Igual de sencillo, sólo que ahora llamamos a getActivity así:

Toast.makeText(getActivity(), "Hola", Toast.LENGTH_SHORT).show();

Conclusión

Recuerda que puedes modificar la duración y puede ser Toast.LENGTH_SHORT o Toast.LENGTH_LONG. Y no olvides llamar al método show.

Quitar archivos de Git que ya hemos agregado antes

Introducción

A veces se nos pasa y por equivocación no ignoramos un archivo en el momento de crearlo. Entonces guardamos cambios y dicho archivo se queda guardado en el repositorio.

Si después lo ignoramos en el archivo .gitignore no surtirá efecto. Veamos cómo hacer para ignorarlo incluso después de haberlo agregado.

Ignorar o remover archivo de Git

Esto es fácil. Nos situamos en la carpeta de nuestro proyecto y ejecutamos:

git update-index --assume-unchanged ruta/a/tu/archivo.extension

Por ejemplo, yo tenía unos archivos de una base de datos. Están dentro de la carpeta api, y el nombre de uno de ellos es tiendas.db-shm

Para removerlo, hago esto:

git update-index --assume-unchanged ./api/tiendas.db-shm

Ahora tengo otro que se llama tiendas.db-wal. Lo mismo:

git update-index --assume-unchanged ./api/tiendas.db-wal

Justo como se puede apreciar en la imagen:

Si queremos remover todo un directorio podemos ejecutar este comando:

git update-index --assume-unchanged tu/directorio/

Recordemos que esto sólo hace que Git ya no vigile los archivos, pero no los elimina de nuestro disco duro 😉

Referencias

git svn – Ignore modified (but not committed) files in git? – Stack Overflow

Programar y depurar apps en Android Studio sin cable USB

Introducción

Todavía recuerdo aquellos años en los que mi cable USB no funcionaba correctamente. Para programar en Android y cargar la apk, depurar y esas cosas, tenía que tener mucho cuidado de no moverlo.

Afortunadamente las cosas han cambiado, y ahora podemos probar nuestras apps sin cables USB. Para ello necesitamos estar conectados a la misma LAN.

Es decir, nuestra PC con Android Studio debe estar en la misma LAN que nuestro dispositivo Android.

ADB

Para que esto funcione debemos hacer algunas cosas sencillas. Primero tenemos que ubicar en dónde se encuentra el archivo adb.exe.

Normalmente se encuentra en C:\Users\tu_usuario\AppData\Local\Android\sdk\platform-tools\adb.exe.

Recomiendo añadir la ruta de la carpeta (C:\Users\tu_usuario\AppData\Local\Android\sdk\platform-tools) a la variable PATH de Windows como se detalla en este tutorial.

Una vez que hayamos añadido esa carpeta, podremos ejecutar ADB desde cualquier lugar.

Conectar nuestro dispositivo sin cable USB

Para esto necesitamos un cable USB. Suena ilógico pero sólo lo necesitamos la primera vez. Encendemos la depuración USB y lo conectamos.

Luego, ejecutamos:

adb devices

Y eso nos tiene que dar la lista de dispositivos conectados. En mi caso aparece esto:

Una vez que ya detectó nuestro dispositivo (es el que dice 017ef…, a ti te aparecerá algo distinto) vamos a ejecutar:

adb tcpip 5555

Si lo hacemos bien, Windows detectará que hemos conectado un dispositivo.

Ahora ya podemos desconectar el cable USB.

Lo que necesitamos ahora es la dirección IP de nuestro dispositivo. Para ello vamos a Ajustes > Acerca del teléfono > Estado. A mí me sale así:

Entonces su IP es 192.168.1.81.

Voy a mi consola de nuevo y ejecuto el comando de abajo. En tu caso tendrás que cambiar la IP.

adb connect 192.168.1.81:5555

Como se ve en la imagen:

adb me manda un mensaje diciendo que se ha conectado. Ya podemos comenzar a programar sin cables.

Si voy ahora a mi querido Android Studio y ejecuto mi app, se me preguntará en cuál dispositivo deseo probarla en la siguiente ventana.

En ella podemos ver que aparece mi teléfono:

Y no tuve que conectar nada.

Conectarnos de nuevo

Nuestro dispositivo se desconectará ya sea porque cambiamos de red o porque reiniciamos nuestra PC, cosas de esas.

Para volverlo a conectar sólo necesitamos ejecutar de nuevo el comando:

adb connect 192.168.1.81:5555

Recuerda cambiar la IP dependiendo de la que tenga tu dispositivo.

Conclusión

Gracias al autor de este post, que es de donde me guié en la mayoría del proceso.

Cabe mencionar que si reiniciamos nuestro teléfono, se deshabilitará la opción de depuración por Wi-Fi y tendremos que repetir el proceso (omitiendo lo de agregar adb.exe a la variable PATH).

Romper o salir de 2 o más ciclos anidados en PHP

Introducción

Romper un ciclo en cualquier lenguaje de programación viene de gran ayuda cuando, por ejemplo, estamos buscado un elemento en un arreglo.

De esa forma, evitamos seguir iterando sin necesidad de hacerlo. Para romper un ciclo (pero sólo el ciclo, no toda la ejecución) podemos utilizar break.

También podríamos utilizar return, pero eso detendría todo el flujo de nuestro código.

¿Pero qué pasa si queremos romper 2 o más ciclos anidados en PHP?

Romper dos o más ciclos en PHP

A diferencia de otros lenguajes en donde break rompe únicamente el ciclo más cercano, PHP permite romper un número de ciclos dado por nosotros.

Es decir, si utilizamos:

break;

Romperá el ciclo más cercano (o la sentencia switch) pero si utilizamos:

break 2;

Romperá las 2 sentencias de control más cercanas. Es decir, si tenemos 2 ciclos entonces con esto podemos detenerlos a ambos.

Ejemplo

Veamos algo tan fácil como 2 ciclos anidados que se repiten 5 veces cada uno. Esto es, 25 veces, pues si repetimos 5 veces dentro de uno que se repite 5 veces, nos da 25.

Romperemos la ejecución del segundo ciclo si su valor es 2.

<?php
$limite = 5;
$romperEn = 2;
for ($x = 0; $x < $limite; $x++) {
    echo "Primer ciclo. \$x vale $x\n";
    for ($y = 0; $y < $limite; $y++) {
        echo "Segundo ciclo. \$y vale $y \n";
        if ($y === $romperEn) {
            break;
        }
    }
}

Al ejecutar este código, sale lo esperado:

Romper o detener un ciclo

Romper o detener un ciclo

Como podemos ver, el valor de $y no superó nunca el número 2, pues salimos del ciclo siempre que se alcanzaba este valor. Pero el ciclo padre siguió su ejecución.

Ahora sí veamos cómo se pueden romper 2 ciclos. Vamos a romper a ambos cuando el segundo ciclo alcance el valor de 2, así que modificaríamos el código así:

<?php
$limite = 5;
$romperEn = 2;
for ($x = 0; $x < $limite; $x++) {
    echo "Primer ciclo. \$x vale $x\n";
    for ($y = 0; $y < $limite; $y++) {
        echo "Segundo ciclo. \$y vale $y \n";
        if ($y === $romperEn) {
            break 2;
        }
    }
}

Y en este caso, el ciclo padre también se rompe:

Romper o detener dos ciclos

Romper o detener dos ciclos

De esta manera podemos terminar, detener o salir de ciclos anidados. Si fueran 3, sería break 3, y así sucesivamente.

 

Formatear moneda o dinero en Golang

Introducción

Hoy veremos cómo formatear un número en Go de manera que se pueda representar como moneda o dinero.

En otras palabras, veremos cómo convertir un número (como 1523.625) en una cadena como $1, 523.62.

Si quieres saber cómo hacerlo con VueJS aquí dejo un tutorial para ver cómo filtrar moneda o dinero en VueJS.

Recuerda que debes tener instalado Go, aquí un tutorial.

Formatear dinero en Golang con Accounting

Para formatear los números como si de dinero se tratara, vamos a utilizar una librería inspirada en accounting.js (que es para Javascript) para Go.

Tenemos que instalarla, así que ejecutamos:

go get github.com/leekchan/accounting

Esperamos a que termine de instalar y proseguimos con el código de ejemplo.

Código de ejemplo

El repositorio en GitHub ya proporciona muchos ejemplos, pero aquí escribiré otro. En este caso formatearemos de tal manera que se represente como se hace en mi país (México).

El signo que utilizaremos será el $. De ahí, para separar miles utilizamos la coma y para separar decimales utilizamos el punto.

Vamos a formatear el número 2811.96.

package main

import (
	"fmt"

	"github.com/leekchan/accounting"
)

func main() {
	ac := accounting.Accounting{
		Symbol:    "$", //El símbolo
		Precision: 2,   // ¿Cuántos "centavos" queremos? (también llamado precisión)
		Thousand:  ",", //Separador de miles
		Decimal:   ".", //Separador de decimales

	}
	numero := 2811.96
	numeroComoDinero := ac.FormatMoney(numero)
	fmt.Printf("El número %f fue convertido a %s", numero, numeroComoDinero)
}

Como podemos ver, instanciamos a Accounting. Para crearlo, le pasamos algunas propiedades.

El código está comentado, así que no falta explicar otra cosa. Lo que sí hace falta mencionar es que Thousand y Decimal ya tienen la coma y el punto por defecto, lo puse de esta manera para ejemplificar, por lo que no es necesario que nosotros lo definamos si así estamos bien.

Al ejecutar el código, sale esto:

Una vez instanciado, podemos reutilizarlo para formatear todo lo que deseemos.

Veamos otro ejemplo en donde formateamos e imprimimos un arreglo de números.

El código queda así:

package main

import (
	"fmt"

	"github.com/leekchan/accounting"
)

func main() {
	ac := accounting.Accounting{
		Symbol:    "$", //El símbolo
		Precision: 2,   // ¿Cuántos "centavos" queremos? (también llamado precisión)
		Thousand:  ",", //Separador de miles
		Decimal:   ".", //Separador de decimales

	}
	numeros := []float64{500, 51.63, 0.36, 896.6945, 539853.6625}
	for _, numero := range numeros {
		numeroComoDinero := ac.FormatMoney(numero)
		fmt.Printf("El número %f fue convertido a %s\n", numero, numeroComoDinero)
	}
}

 

Con la siguiente salida:

Finalmente cabe mencionar que el autor de la librería recomienda no utilizar flotantes, y mejor usar big.Float.

Ejercicios resueltos con Cisco: VLAN y enlaces troncales

Ejercicios resueltos con Cisco Packet Tracer parte 2: VLAN y enlaces troncales

Introducción

Ya tiene tiempo que resolví algunos ejercicios en Cico Packet tracer sobre VLSM. Hoy toca ver cómo configurar algunas VLAN y enlaces troncales.

Objetivos

  • Configurar las VLAN en los switches.
  • Configurar enlaces troncales en los switches.
  • Verificar la conectividad de extremo a extremo.

topología y distribución de red

Así se ve la red:

Tarea 1: configurar los dispositivos y verificar conectividad

Configure cada switch con las siguientes configuraciones básicas.
• Nombre de host (Para Switch 0 S1 y Para Switch 1 S2)
• Contraseña secreta de enable (class)
• Configuraciones de la línea (cisco)

Configurar Switch 0 (cero)

Nombre de host

Abrimos la CLI del switch y le ponemos su nombre:

enable
configure terminal
hostname S1

Así como en la imagen:

Con esto ya llevamos 3 % de la actividad.

Contraseña secreta

Escribimos en la misma CLI:

enable secret class

En este caso, class es la contraseña. Con esto ya llevamos 7 %

Configuraciones de la línea

Finalmente vamos a escribir en la CLI:

line console 0
password cisco
login

Ya llevamos 11 % completado.

Configurar Switch 1

Sigue los mismos pasos que llevamos a cabo para el switch 0. Abajo dejo una imagen de los comandos aplicados.

Recuerda que el nombre para el switch es S2.

Los comandos, juntos, son:

enable
configure terminal
hostname S2
enable secret class
line console 0
password cisco
login

Con esto, si es que lo hicimos bien, ya llevamos 23 % según yo.

Tarea 2: configurar las VLAN en los switches

Aquí viene lo bueno. Es hora de configurar las VLAN en cada switch.

Paso 1: cree y asigne un nombre a las VLAN

En cada switch, asignar los siguientes nombres:

• VLAN 2, nombre = INFORMATICA
• Para la VLAN 3, nombre = SISTEMAS
• Y en VLAN 4, nombre = MECATRONICA

Notar por favor que se tienen que poner en cada switch.

Switch 1 (que antes de renombrar era el cero)

Abrimos la CLI, si nos pide contraseña es cisco. Luego ejecutamos los siguientes comandos:

enable
configure terminal
vlan 2
name INFORMATICA
vlan 3
name SISTEMAS
vlan 4
name MECATRONICA

Cuando ejecutemos enable, nos pedirá una contraseña. Es class.

Se ve así:

Con esto ya llevamos 34 % de avance.

Switch 2

Exactamente lo mismo de arriba, pero en la CLI del S2:

Ya llevamos 46 % de avance 🙂

Paso 2: Asigne puertos de acceso a las VLAN

Asigne los siguientes puertos de acceso de las PC a las VLAN: (Revisa los puertos en la Topologia)
• VLAN 2: PC1, 2 en S1 y PC7 Y 8 en S2
• Para VLAN 3: PC3, 4 en S1 y PC9 Y 10 en S2
• En VLAN 4: PC5, 6 en S1 y PC11 Y 12 en S2

Esto sí se me hizo complicado al inicio, porque no dice qué puertos. No sabía por dónde empezar. Pero si nos damos cuenta, cada PC está conectada a través de las interfaces Fa0/X en donde X es el número de PC.

Veamos esta imagen, la PC 1 está en la Fa0/1:

Entonces la PC2 está en la Fa0/2 y así hasta la PC6:

Lo mismo para el segundo switch:

Hora de configurar.

Switch 1

Abrimos de nuevo la CLI. Si pide contraseña, ya la sabemos (si no, vuelve a leer el tutorial porque no has puesto atención).

Recuerda que vamos a asignar, sólo para este switch, lo siguiente:

  • En VLAN 2 la PC 1 y 2
  • Para VLAN 3 la PC 3 y 4
  • Finalmente, en VLAN 4 la PC 5 y 6

Para asignar la PC 1, que está en f0/1 a la VLAN 2, hacemos esto:

interface f0/1
switchport mode access
switchport access vlan 2

Para la PC 2, que está en f0/2 a la VLAN 2, esto:

interface f0/2
switchport mode access
switchport access vlan 2

Y así hacemos para asignar las otras computadoras a las otras VLAN’s:

interface f0/3
switchport mode access
switchport access vlan 3

interface f0/4
switchport mode access
switchport access vlan 3

interface f0/5
switchport mode access
switchport access vlan 4

interface f0/6
switchport mode access
switchport access vlan 4

Aquí una imagen:

Con esto ya llevamos 69 % de la actividad.

Switch 2

Lo mismo de arriba, pero recordemos que las VLAN y las PC’s van así:

  • PC 7 y 8 en VLAN 2
  • Luego, PC 9 y 10 en VLAN 3
  • Finalmente, la PC 11 y 12 en VLAN 4

Los comandos son:

enable
configure terminal

interface f0/7
switchport mode access
switchport access vlan 2

interface f0/8
switchport mode access
switchport access vlan 2

interface f0/9
switchport mode access
switchport access vlan 3

interface f0/10
switchport mode access
switchport access vlan 3

interface f0/11
switchport mode access
switchport access vlan 4

interface f0/12
switchport mode access
switchport access vlan 4

Aquí la imagen:

Con esto ya llevamos 92 % de la práctica.

Verificar la implementación de la VLAN

Para ver que todo haya ido bien, podemos ejecutar:

exit
exit
show vlan brief

En cada switch.

En el caso del S2 se ve esto:

Ya casi terminamos, ya casi.

Paso 3: Configurar modo de puerto para ambos switches

No soy un experto en redes y no planeo serlo, así que no sé para qué se tiene que hacer esto pero tenemos que ejecutar algunos comandos finales en cada switch.

Al hacer la práctica y verificar los resultados, todo va bien excepto por lo que está en rojo:

Así que en la interfaz 0/24 de cada switch había algo malo. Y es en donde me di cuenta de que hay que configurar el modo de puerto.

Switch 1

Abrimos la CLI y ejecutamos:

enable
configure terminal
interface f0/24
switchport mode trunk

Aquí una imagen:

Switch 2

Lo mismo:

enable
configure terminal
interface f0/24
switchport mode trunk

Aquí la imagen:

Con esto hemos terminado.

Conclusión

Aquí la imagen que comprueba que hemos cumplido todo lo de la práctica y estamos al 100 % de la actividad:

 

Operador de fusión de null o Null coalesce en PHP

Introducción

PHP 7 trajo muchas cosas buenas, una de ellas es el operador de fusión null o null coalesce. Este operador es representado por dos signos de interrogación. Puedes llamarlo como…

  • Dos signos de interrogación
  • Doble signo de interrogación
  • Signos de interrogación
  • ??

Hoy vamos a explicar su uso y funcionamiento, verás que aumentará tu productividad. Por cierto, es una característica de PHP 7 así que, ¿qué esperas para actualizarte?

Explicación y ejemplos de null coalesce en PHP

Este operador viene a remplazar los if, isset y tal vez los operadores ternarios. Si conoces MySQL, te invito a leer este post explicando COALESCE, verás que es casi lo mismo 😉

Lo que hace este poderoso operador es devolver el primer valor que no sea nulo.

Pongamos el ejemplo básico de una API de usuarios. En dicha API nos mandan por medio de GET el límite de usuarios que queremos ver.

Si no mandan el límite, entonces asumimos un límite por defecto, que sería 10 (en este caso). Entonces lo haríamos así:

<?php
if(isset($_GET["limite"])){
  $limite = $_GET["limite"];
}else{
  $limite = 10;
}
hacerConsultaDeUsuariosConLimite($limite);

Si queremos ser un poco más elegantes, usamos el operador ternario y quedaría rescrito así:

<?php
$limite = isset($_GET["limite"]) ? $_GET["limite"] : 10;
hacerConsultaDeUsuariosConLimite($limite);

Pero igual no me gusta, mejor lo hacemos así:

<?php
$limite = $_GET["limite"] ?? 10;
hacerConsultaDeUsuariosConLimite($limite);

Así se ve mucho mejor. En este momento no se nota mucho la diferencia, pero sigue leyendo para que veas cuán útil es.

Más de dos operandos

Siguiendo el ejemplo de arriba, ahora supongamos que modificamos nuestra API y aceptamos el límite tanto por POST así como por GET.

Normalmente quedaría así:

<?php
if(isset($_GET["limite"])){
  $limite = $_GET["limite"];
}else if(isset($_POST["limite"])){
  $limite = $_POST["limite"];
}else{
  $limite = 10;
}
hacerConsultaDeUsuariosConLimite($limite);

Con el operador ternario, así:

<?php
$limite = isset($_GET["limite"]) ? $_GET["limite"] : isset($_POST["limite"]) ? $_POST["limite"] : 10;
hacerConsultaDeUsuariosConLimite($limite);

Finalmente, con este nuevo operador queda de la siguiente manera:

<?php
$limite = $_GET["limite"] ?? $_POST["limite"] ?? 10;
hacerConsultaDeUsuariosConLimite($limite);

Primero evalúa si hay algo en GET, luego en POST y finalmente, si ambos valores son nulos, se obtiene 10.

3, 4, 5 o más operandos

Se puede evaluar una lista infinita de operandos. Aquí un ejemplo:

<?php
$limite = null ?? null ?? null ?? 10 ?? 20 ?? 30;

En este caso, límite es 10, ya que es el primer valor que no es nulo y ahí deja de evaluar:

También trabaja bien con funciones:

<?php

function hola(){
  return "Hola mundo";
}

function adios(){
  return null;
}

$saludo = adios() ?? hola();

En este caso, saludo es “Hola mundo”:

Así como podemos llamar a funciones creadas por nosotros, podemos llamar a funciones nativas de PHP y claramente pasar argumentos.

Ejemplo final

Terminemos dando un ejemplo siguiendo nuestra API de usuarios en donde pueden mandar el límite por GET o POST.

Tendremos una función que devolverá los usuarios, pero que también puede devolver null. Y si devuelve null, devolvemos un arreglo vacío. Juntando todo…

<?php
hacerConsultaDeUsuariosConLimite($_GET["limite"] ?? $_POST["limite"] ?? 10) ?? [];

Llamamos a la función ya sea con lo que haya en GET, POST o con el número 10. Y si nos devuelve null, entonces devolvemos []; es decir, un arreglo vacío.

Conclusión

Básicamente este operador simplifica el uso de isset y el encadenamiento largo con el operador ternario.

Devuelve el primer argumento que no sea nulo, y podemos evaluar una lista infinita de operandos.

Imprimir o convertir a PDF código fuente con VSCode

Imprimir o convertir a PDF código fuente con VSCode

Introducción

Nuestro código fuente luce bien en nuestro editor, pero cuando lo queremos pasar a otro lugar como un documento de texto o un documento PDF, se le quitan los colores y las tabulaciones.

Hoy veremos cómo podemos convertir nuestro código a PDF, para poder imprimirlo, presentarlo, enviarlo o lo que sea.

Este tutorial se basa en una extensión para el maravilloso editor de texto VSCode.

Imprimir código fuente

Lo que tenemos que hacer es tener instalado VSCode. Después, instalamos la extensión llamada PrintCode.

Podemos ir al enlace que dejo arriba, o en nuestro editor buscar la extensión:

La instalamos y recargamos nuestro IDE.

Ahora abrimos un archivo que tengamos y que deseemos imprimir. Presionamos F1 o Ctrl + Shift + P y escribimos PrintCode:

Presionamos enter y automáticamente se abrirá una pestaña en nuestro navegador preferido…

Si utilizamos Chrome o uno de sus hermanos, podemos guardar como PDF. También podremos imprimir a una impresora física.

En caso de utilizar otro navegador, las opciones cambian, pero siempre hay opciones para imprimir a una impresora virtual o convertir el documento a XPS.

Finalmente aquí dejo el documento PDF generado. Se trata de unos ejercicios de MySQL resueltos.

Limpiar bases de datos de Electron

Limpiar bases de datos de Electron

Introducción

Electron puede ser combinado con muchas bases de datos, algunas de ellas pueden estar del lado del cliente. Por ejemplo, PouchDB es una excelente base de datos que trabaja como un encanto en el navegador.

A veces, ya sea para probar o porque no tenemos forma de eliminar los datos desde el código, necesitamos saber una forma de borrar o limpiar las bases de datos creadas con Electron.

Borrar bases de datos

Este tutorial es para Windows. Si tenemos bases de datos del lado del cliente, pueden estar en 2 lugares…

En modo de desarrollo

Cuando estamos probando nuestra app en modo de desarrollo, las bases de datos están en Appdata > Electron > databases.

Para acceder a esta carpeta puedes ir a C:\users\tu_usuario\AppData\Roaming\Electron\databases:

Ahí puedes eliminar todo lo que hay dentro de la carpeta. También debes eliminar todo lo que está en IndexedDB.

Modo producción

Si ya has publicado tu app y la has instalado, los datos están igualmente en AppData, pero ahora no será en la carpeta Electron, sino en una carpeta que llevará más o menos el nombre de tu proyecto.

En mi caso, recientemente hice un software llamado “adhuman” por lo que si voy a AppData lo puedo ver:

Y dentro de esa carpeta igualmente están las bases de datos en databases e IndexedDB:

 

¿Los lenguajes de programación compilados son mejores que los interpretados?

Introducción

Este post (que será muy breve) es sobre un pensamiento que he tenido desde hace algunos días. La mayor parte de mi vida (al menos el el campo laboral) he programado en PHP y Javascript.

Recientemente comencé a trabajar en un proyecto en donde utilizo Go o Golang y creo que me he dado cuenta de algo que afecta a la productividad de los programadores.

Compilados vs interpretados, hablando sobre productividad

Tomemos dos lenguajes de programación: Go y PHP. Ambos funcionan perfectamente en la web, pero hay algo que los diferencia, y es que Go es compilado y PHP es interpretado.

PHP

A lo que voy es que con PHP podemos relajarnos, e ir probando poco a poco. Escribir una línea de código, imprimir una variable e ir probando cosa por cosa.

Esto lo podemos hacer porque lo único que tenemos que hacer para ver nuestros nuevos cambios es presionar la tecla F5 o refrescar el navegador.

Así que podemos relajarnos más, ya que el tiempo para que se interprete casi no se nota. Escribes tu código, guardas y refrescas… y así puedes pasar todo el día.

Go

En go también puedes hacer lo mismo, pero hay una gran diferencia: tienes que compilar antes de ver tus cambios en tu navegador. Ya sea que lo ejecutes o que lo compiles y luego lo ejecutes, en ambos casos tardará mucho.

Lo que explico arriba me hace pensar que los lenguajes compilados hacen que avances mucho más, ya que el tiempo de espera para la compilación es mucho.

Así que no agregas una línea, guardas y ejecutas. Mejor añades un gran fragmento de código (si no es que todo lo que lleva el módulo), compilas y pruebas.

Pero no pierdes tiempo guardando y probando cada cambio.

Conclusión

Tal vez hablé pensando en que todos los programadores piensan como yo, pero he notado que dichos lenguajes se prestan a que hagamos eso.

Y no es que sea malo, pero afecta la productividad.

Ejecutar código PHP desde terminal o CMD

Ejecutar código PHP desde terminal o CMD

Introducción

PHP es un lenguaje que es utilizado en la web… visitamos un sitio y con este lenguaje se procesan muchas cosas.

Sin embargo, esto no limita a que sólo pueda ser ejecutado en la web.

También podemos utilizar PHP desde la línea de comandos, la CLI, el CMD, la terminal o como le llames.

Es muy fácil y sencillo, y no tenemos que cambiar nada de código (excepto para algunas operaciones muy particulares).

Continue reading…

Alternativa a var_dump en PHP para obtener detalles de una variable

Alternativa a var_dump en PHP para obtener detalles de una variable

Introducción

En PHP existe una función llamada var_dump que imprime toda una variable, sin importar el tipo de esta. Puede imprimir arreglos, objetos, cadenas, enteros, etcétera.

Esto va bien si queremos imprimirlo directamente como si hiciéramos un echo o un printf, pero ¿qué pasa si queremos guardar el contenido de una variable en lugar de imprimirla?

Por ejemplo, si queremos llevar un log para todas las variables, necesitamos guardarlas detalladamente, pero no imprimirlas.

var_export al rescate

PHP proporciona una función llamada var_export que funciona como var_dump pero en lugar de imprimirla directamente, da la opción de devolverla para que la podamos guardar o hacer lo que sea con ella.

Para utilizarla, su sintaxis es:

var_export($tu_variable, $devolverlaEnLugarDeImprimirla);

Por lo que para obtenerla, siempre la llamaremos con true en el segundo parámetro.

Ejemplo

Para obtener la representación de una variable, llamamos a var_export con la variable como primer argumento y true como segundo argumento.

<?php
$variable = [
    "nombre" => "Juan Pérez",
    "edad" => 40
];

$representacion = var_export($variable, true);
?>

Una vez hecho esto podemos guardar la representación si lo deseamos. En este caso la guardaré en un archivo:

<?php
$variable = [
    "nombre" => "Juan Pérez",
    "edad" => 40
];

$representacion = var_export($variable, true);
file_put_contents("representacion.txt", $representacion);
?>

Al ejecutar este código, el archivo de texto se ve así:

array (
  'nombre' => 'Juan Pérez',
  'edad' => 40,
)

Con ello podemos loguear y controlar representación de cualquier tipo de variable en PHP.