diciembre 2017

Obtener impresoras compartidas en Windows usando PHP

Introducción

Acabo de publicar una entrada sobre cómo obtener impresoras en Windows. Pues podemos modificar dicho comando para que diga si son o no compartidas, y dependiendo de eso incluirlas en un arreglo

Comando

El comando queda modificado así:

get-WmiObject -class Win32_printer |ft shared, name

Como vemos, en la otra entrada sólo obtenemos el nombre con name. En este caso también queremos ver si está compartida usando shared. Así es la salida:

Una vez que tenemos esto vamos a ir a PHP y parsear todo. Vamos a incluir sólo las que estén compartidas:

Con eso tenemos para obtener la lista de impresoras compartidas. Esto es útil por ejemplo cuando queremos imprimir un ticket en una impresora térmica, ya que la librería dice que dicha impresora debe estar compartida.

Obtener lista de impresoras en Windows usando PHP

Introducción

Puede que en algún momento necesitemos obtener qué impresoras se encuentran disponibles para, obviamente, imprimir.

En esta ocasión veremos cómo obtener dicha lista usando el maravilloso lenguaje PHP y el powershell de Windows. Tranquilo, que no es nada complicado.

Nota: obviamente esto sólo funciona en Windows, y sólo si es 7, 8 o 10. (por cierto, ¿Quién usa XP o Vista en pleno 2017?)

Comando

Primero tenemos que saber en dónde se encuentra el powershell. Normalmente está en c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe. Vamos a abrirlo entonces y ejecutar el siguiente comando:

get-WmiObject -class Win32_printer |ft name

La verdad, no sé cómo funciona internamente. Pero sí que lista las impresoras:

Hasta aquí todo bien, el problema es que con PHP no podemos hacer lo mismo que hacemos con nuestras manos. Así que necesitamos un comando de una sola línea que ejecute todo.

Para ello, powershell acepta un comando como argumento con la opción -c. Por lo que podemos llamarlo desde el cmd así:

c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -c "get-WmiObject -class Win32_printer |ft name"

No hay que confundirnos, simplemente indicamos la ruta de powershell, y le pasamos como argumento y entre comillas el comando que ejecutamos anteriormente. La salida es esta:

Es la misma de hace un momento, con la novedad de que la obtuvimos en un solo comando. Ahora sí estamos listos.

Llamando desde PHP

En PHP existe la función exec, que ejecuta un comando en la terminal del sistema. Así que básicamente tenemos que llamar a exec con el comando de arriba, parsear la salida, omitir “name” y los guiones que salen así como las líneas vacías, y finalmente mostrar el nombre de la impresora “limpio”.

Para ello he preparado un pequeño script:

Probando

¿Y funciona? claro que sí, tarda un poco, pero vale la pena. No puedo poner resultados en línea, pero aquí adjunto una captura de lo que aparece en mi sistema:

Y si voy al panel de control, son las mismas:

Si tú deseas probarlo, simplemente copia el código, pégalo, guárdalo en htdocs (si no sabes instalar PHP ya he escrito un tutorial aquí) y finalmente visita http://localhost/listar-todas-las-impresoras.php

Hasta aquí llegamos por hoy

Instalar y configurar JDK (compilador e intérprete de Java) en Windows

Introducción

Para programar en Java necesitamos el JDK, que no es otra cosa más que el kit de desarrollo de Java que trae el compilador, la documentación y la JVM para poder programar en este lenguaje.

Hoy veremos cómo descargarlo, instalarlo y agregarlo a la variable PATH para poder compilar sin necesidad de ningún IDE desde cualquier lugar del sistema.

Descargar

Lo primero que tenemos que hacer es ir a la página oficial y aceptar los Términos y condiciones. Después, simplemente elegimos la versión que se adapte a nuestro sistema. En mi caso uso Windows 10 con una arquitectura de 64 bits, así que voy a elegir esa:

Esperamos un momento a que se descargue y pasamos al siguiente paso que es la instalación.

Instalar

Ejecutamos el archivo que descargamos como administrador para que no haya problemas. El asistente nos dará la bienvenida. Hacemos click en Next

Aquí nos pregunta cuáles características queremos instalar. Podemos cambiar la ruta, pero si la cambiamos debemos recordarla. Hacemos click en Next

En este apartado se está instalando, así que vamos a esperar…

Ahora nos dice que se instalará JRE. JRE es Java runtime environment y se encarga de ejecutar el código precompilado, a diferencia de JDK que es el kit de desarrollo de Java. Es decir, uno es para programar y otro para ejecutar.

Hacemos click en Siguiente y si cambiamos la ruta la recordamos.

De nuevo esperamos a que el jre se termine de instalar…

Y cuando haya terminado veremos lo siguiente:

Ahora podemos hacer click en Close para terminar de instalar. Con ello habremos terminado la instalación, ahora falta configurar.

Configurar y agregar a la variable Path

Ya instalamos el compilador y el encargado de ejecutar el código precompilado, pero falta hacer que sean accesibles desde cualquier lugar. Para ello vamos a agregarlos a la variable Path.

Comencemos con el compilador, se encuentra en C:\Program Files\Java\jdk1.8.0_151\bin. Si no está ahí, checa la ruta que te marcó el instalador. Recuerda que es jdk, no jre.

Ya hice un post explicando cómo agregar carpetas a path. Así que sólo pondré aquí la captura de cómo queda:

Y lo mismo para JRE, ese se encuentra en C:\Program Files\Java\jre1.8.0_151\bin. Recuerda que si no existe esa carpeta verifica la ruta que el instalador te marcó. Normalmente si no está aquí está en Program Files x86.

Vamos a agregar el directorio a Path:

Y listo. Ahora es momento de probar

Probando

Una vez que hayamos agregado los directorios a PATH, vamos a abrir una terminal. Para probar el compilador escribimos javac -version y nos tiene que salir algo así:

Si es que sí, ya podemos compilar. Si no, verifica si agregaste correctamente el directorio.

Ahora es turno del ejecutable, escribimos java -version y tiene que salir algo así:

Hola mundo

Con nuestro editor favorito (recomiendo Sublime Text) vamos a pegar el siguiente código y guardarlo en un lugar accesible:

Desde la terminal vamos a navegar hasta donde lo guardamos.

Para compilar, ejecutamos javac NombreArchivo.java, que en este caso sería HolaMundo.java, lo que se ve así:

Es normal que no marque nada, de hecho es bueno. Ya que si hubiera un error, ahí aparecería. Esto significa que la compilación fue exitosa.

Si nos fijamos, esto habrá generado un archivo con extensión class. Pues ese es el famoso bytecode. Para ejecutarlo, escribimos ahora java HolaMundo (sin el .class) así:

Y listo, ahí nos muestra el mensaje que escribimos. Con esto damos por terminado el tutorial. Cabe mencionar que si después instalamos un IDE poderoso como Netbeans sólo tendremos que indicarle la ruta en donde se instaló Java, eso en caso de que no la detecte automáticamente.

De todos modos, para ejercicios pequeños podemos usar el bloc de notas o Sublime Text.

PHP: comprobar si palabra o letra aparece sólo una vez

Introducción

Hoy escribí una pequeña función que compara y evalúa si un carácter o string aparece únicamente una vez en otra cadena.

La función devolverá falso en caso de que no aparezca ninguna vez, ya que para que evalúe a verdadero debe aparecer una vez. No cero, no más, sino una.

Función

La función es sencilla. Solamente hace uso de la función substr_count que, como su nombre lo dice, cuenta cuántas veces aparece una porción de una cadena dentro de otra cadena.

Con eso simplemente comparamos si el resultado es 1, y si es que sí, regresamos verdadero.

Sin más que agregar, aquí dejo el código:

Probar en vivo

Hice un replit para poder ejecutar en vivo este código con algunos ejemplos. Dale al botón de play para probar:

Y con eso terminamos por hoy

Índice o posición de un carácter en cadena de PHP

Introducción

En algunas ocasiones necesitaremos encontrar la posición de un carácter en una cadena. Por ejemplo, el índice de una letra, un punto, un salto de línea, etcétera.

Esta función también es conocida como indexOf, algo así como índice de. En PHP contamos con dos funciones para esto, que al final nos pueden terminar confundiendo: strpos y strrpos (sí, una tiene doble r).

Veamos entonces cómo podemos aprovechar cada una de ellas.

strpos

Esta función devuelve el índice de la primer ocurrencia de un carácter en una cadena. Por ejemplo, tenemos lo siguiente:

Esta es una cadena

Si ejecutamos strpos buscando la letra “s” nos dará el índice 1, aunque hay otra s en la posición 6.

Nota: esta función devuelve false si es que no se encuentra lo que buscamos.

strrpos

Esta función es parecida a la anterior, pero comienza a buscar desde el final de la cadena. Si ejecutamos strrpos sobre la cadena del ejercicio anterior, ahora sí nos dará 6.

Nota: esta función devuelve false si es que no se encuentra lo que buscamos (igual que la anterior).

Resultados

Lo anterior escrito puede ser comprobado en este replit que dejo a continuación. Podemos ver que strpos y strrpos son llamados y ambos devuelven resultados distintos.

Haz click en el botón de play.

Comprobar si una cadena tiene determinado carácter

Como dijimos que las funciones devuelven false en caso de no encontrar el carácter, podemos usarlas para ver si una cadena contiene una letra o carácter.

Por ejemplo, supongamos que necesitamos que una cadena no tenga saltos de línea ni puntos. Para ello podemos probar con lo siguiente:

$cadenaMala = "Este es\nun ejemplo de cadena.";
if(strpos($cadenaMala, ".") === false && strpos($cadenaMala, "\n") === false )
 echo "Está bien"; 
else echo "Está mal";

Como se ve, buscamos primero si tiene algún punto, y después un salto de línea. Aquí se puede comprobar:

Ejemplo práctico: extensión de un archivo

Para terminar con esto haremos una función que devuelva la extensión de un archivo. Por ejemplo, si el nombre es “libro.pdf” debería devolver “pdf”.

Para esto podríamos usar strpos (comienza desde el inicio) pero habría un error, ya que si un archivo se llama “matemáticas.1.pdf” pensaría que la extensión es “1.pdf” cosa que es un error.

Entonces será mejor usar strrpos en conjunto con substr, para cortar la cadena desde donde se encuentre el último punto. La función queda así:

Y para probarla directamente podemos hacer click en el botón de play:

Comprobar si una cadena es palíndroma usando recursividad en C#

Introducción

Los palíndromos son palabras que se leen de igual manera de izquierda a derecha y de derecha a izquierda. Por ejemplo, “La ruta natural” o “Luz azul” son ejemplos de palíndromos.

Para comprobar si una oración lo es, simplemente hay que ver si al invertirla es igual que la original. Pero en este caso no podemos hacerlo así, porque tenemos que usar recursividad. Así que vamos a ver cómo comprobar si es palíndromo usando C# y recursión.

Pequeña nota: este ejemplo no remueve los espacios en blanco. Si quieres probar con una oración, remueve los espacios primero. Es decir, si quieres probar con “La ruta natural” escríbela así: “larutanatural”.

Igualmente puedes modificar el código y remover los espacios por ti mismo.

Nota: mira cómo se hace la implementación en C.

Algoritmo

La función que vamos a crear recibirá como argumento una variable de tipo String, que será la palabra en sí. Regresará un Booleano, que puede ser True o False indicando si la palabra lo es.

Paso 1: comprobar si la cadena tiene menos de dos caracteres

Primeramente veremos si la cadena está vacía o tiene sólo un carácter o letra, en caso de que sí, vamos a salir de la recursión. Ya que, por ejemplo, la letra “m” se lee de igual manera de izquierda a derecha que de derecha a izquierda y, aunque no sea una palabra, podría decirse que es un palíndromo.

Si te fijas en el ejemplo, también en este paso es cuando se puede decir que sí es palíndromo, porque es llamado con una sola letra (la “l”).

Paso 2: comparar primer y último carácter

Si la recursión no se rompió en el paso 1, vamos a comparar la primera y última letra de la cadena. Por ejemplo, si tenemos a “solos”, compararíamos la “s” (que es la primera letra) y la “s” (que es la última letra).

Si las letras no coinciden, se rompe la recursión porque desde ahí nos damos cuenta de que no es un palíndromo.

En caso de que las letras coincidan, aquí pasa la magia, y se vuelve a llamar a la recursión como el paso 3 lo detalla.

Paso 3: recursividad

Si no se rompe la recursión en el primer o segundo paso, entonces se llamará a la función de nuevo, pero no con la misma cadena de entrada, sino con el último y primer carácter.

Pongamos de ejemplo la palabra “solos” de nuevo. Al comparar el primer y último carácter el resultado es True, así que llamamos a la función de nuevo pero esta vez le pasamos “olo” (quitar primer y último). Y así hasta que se termine el ciclo.

Ejemplo

Por última vez usemos la palabra “solos” y veamos lo que pasa.

Se llama a la función con “solos”. Comprobamos si tiene menos de 2 letras. ¿Las tiene? no. Entonces comparamos la primera y última de estas. ¿Coincide? sí. Entonces llamamos a la función de nuevo con la cadena cortada.

Se llama a la función con “olo”. Comprobamos si tiene menos de 2 letras, y no es así. Así que comparamos la primera y última (“o” con “o”). Como sí coinciden, llamamos de nuevo a la función con la cadena cortada.

Finalmente llamamos al proceso con “l”. Comprobamos si tiene menos de 2 letras, y efectivamente así es. Así que aquí acaba la recursividad, y regresamos True.

Código

Una vez explicado el concepto y cómo se trabaja, aquí dejo el código

Ver online

Finalmente aquí dejo el ejemplo para que se pueda ejecutar en línea, sin descargar nada. Las vocales acentuadas (como í) no se muestran, pero eso no impide que se pueda probar. Para probar haz click en el botón de Play

Compilar y programar en C# sin visual Studio

Introducción

Personalmente se me hace muy tardado y pesado instalar Visual Studio para poder compilar algunos pequeños ejercicios de C#. Hoy les mostraré cómo podemos compilar código C# sin instalar Visual Studio.

Para hacer esto, debemos tener instalado .NET framework versión 4. No deberíamos preocuparnos si nuestro sistema está actualizado.

Si deseamos comprobar si lo tenemos, podemos checar si existe la carpeta C:\Windows\Microsoft.NET\Framework\v4.0.30319 en nuestra máquina. Si es que sí, podemos proseguir con el tutorial. En caso de que no, por favor instala las actualizaciones más recientes.

Probar compilador

El compilador que usaremos en este caso se llama csc (supongo que quiere decir C sharp compiler) y está ubicado en la carpeta que mencioné en la introducción. Para ver si funciona vamos a abrir el símbolo del sistema, pegar lo siguiente: C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe y finalmente presionar enter. Debería aparecer algo así:

El error que arroja no debe alarmarnos. Simplemente está diciendo que no especificamos ningún archivo para compilar, cosa que no hicimos porque sólo estamos probando.

Para compilar, navegaremos hasta donde esté nuestro código fuente y ejecutaremos lo siguiente:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe nombre_archivo.cs

Lo que dará salida a un archivo .exe con el mismo nombre. Voy a probar con un hola mundo. El código quedaría así:

Y para compilarlo simplemente navegamos hasta donde hayamos guardado el archivo y ejecutamos lo siguiente: C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe hola_mundo.cs

Al compilarlo podemos ver que se crea un archivo ejecutable que podemos llamar desde la línea de comandos como se ve en el paso 3. En el paso 2 nos arrojará los errores si es que tenemos algunos en nuestro código. Y en el paso 1 simplemente estoy llamando al compilador.

Extra: Agregar a la variable PATH

Como se vio anteriormente, cada que deseemos compilar tenemos que escribir la ruta completa del compilador y al menos a mí se me hace engorroso. ¿No sería mejor simplemente escribir csc hola_mundo.cs? para ello podemos agregar la ruta de la carpeta a la variable PATH y de esta forma compilar sin escribir toda la ruta.

Para hacerlo, simplemente tenemos que agregar C:\Windows\Microsoft.NET\Framework\v4.0.30319\ a dicha variable, como lo explico en este post.

Una vez agregada, compilamos con csc hola_mundo.cs así:

Si nos fijamos bien, el resultado es el mismo pero no tuve que escribir toda la ruta.

Conclusión

Si no queremos usar el IDE que nos proporciona Microsoft, o si sólo queremos hacer pequeños ejercicios, este truco viene de maravilla. Así podemos aprender un poco de este potente lenguaje que, en lo personal, no me gusta pero es muy bueno.

Obviamente no soy un genio, y este tutorial parte de algo que leí en https://stackoverflow.com/questions/18286855/how-can-i-compile-and-run-c-sharp-program-without-using-visual-studio

Agregar directorio a variable PATH en Windows

Introducción

Para abrir un archivo ejecutable sin tener que escribir la ruta completa, podemos agregar el directorio a la variable path.

Agregar directorio

Para ello vamos al panel de control y elegimos Sistema:

Una vez dentro seleccionamos Configuración avanzada del sistema a la izquierda:

En la ventana que se abra elegimos Variables de entorno…

Vamos al apartado de Variables del sistema y buscamos la que diga Path. La seleccionamos y hacemos click en Editar:

En la siguiente ventana seleccionamos nuevo:

Y en el apartado que aparezca escribimos la ruta de la carpeta que queremos agregar. Así:

Hacemos click en Aceptar, guardamos todos los cambios y listo. Después de haber hecho esto debemos reiniciar todas las terminales que tengamos abiertas para que los cambios surtan efecto.

Descargar, instalar y configurar fritzing

Introducción

Fritzing es un programa libre de automatización de diseño electrónico que busca ayudar a diseñadores y artistas para que puedan pasar de prototipos (usando, por ejemplo, placas de pruebas) a productos finales.

Fritzing fue creado bajo los principios de Processing y Arduino, y permite a los diseñadores, artistas, investigadores y aficionados documentar sus prototipos basados en Arduino y crear esquemas de circuitos impresos para su posterior fabricación.

Además, cuenta con un sitio web complementario que ayuda a compartir y discutir bosquejos y experiencias y a reducir los costos de fabricación. y su diseño de arte de artistas.

Personalmente lo ocupo para diseñar circuitos de Arduino, ya que tiene muchos componentes. Además, nosotros podemos crear los nuestros. Es gratuito y puede exportar a imagen, PDF, etcétera.

Descargar

Vamos a la página de descargas: Click aquí

En la siguiente página seleccionamos No donation y hacemos click en Download:

 

Ahora nos llevará a otra página en donde vamos a elegir nuestro sistema operativo. Si tenemos Windows o Linux podemos elegir entre 32 y 64 bits. Si tenemos MacOS X sólo tenemos una opción.

En mi caso la descargaré para Windows de 64 bits. Es un archivo comprimido que podemos extraer con nuestro software de compresión favorito.

Extraer

Recomiendo extraerlo en C:\fritzing para tenerlo como un programa normal

Creando acceso directo

Cuando haya terminado podemos abrir la carpeta que elegimos para extraerlo y dentro habrá una carpeta llamada fritzing.0.9.3b.64.pc o algo parecido.

Entraremos a ella y dentro veremos muchos archivos, aunque sólo nos importa el ejecutable, ya que lo demás son componentes y librerías:

Con un recuadro azul marqué la aplicación. Ahora podemos crear un acceso directo a ella o anclarlo al inicio o a la barra de herramientas.

Y finalmente podemos abrirlo:

Actualizaciones

Cuando haya actualizaciones el programa nos avisará y se actualizará. No necesitaremos intervenir mucho en el proceso. Aunque realmente casi no se actualiza, ya que la última versión estable es del 2016.

De todos modos, en cada actualización hay que asegurarnos de tener nuestros prototipos y diseños en una carpeta separada.

 

 

Instalar impresora térmica como genérica

Introducción

A veces no podemos conseguir los drivers o controladores originales de nuestras impresoras térmicas. O tal vez sea por nuestro gusto instalarlas como genéricas. Así que en este tutorial veremos cómo instalarlas sin necesidad de drivers.

Instalar impresora genérica

Lo primero que tenemos que hacer es conectar nuestra impresora y encenderla.

Ahora vamos al panel de control y luego a Dispositivos e impresoras. Ahí seleccionamos Agregar una impresora. Inmediatamente aparecerá una ventana como la de abajo, en donde vamos a seleccionar La impresora deseada no está en la lista

En la siguiente ventana seleccionamos Agregar una impresora local o de red con configuración manual y hacemos click en Siguiente

Ahora en el puerto elegimos el USB00X en donde la X es un número. Si tenemos más dispositivos tendremos que ir probando uno por uno, pero si no, seleccionamos el único que exista. En mi caso sólo hay uno, por lo que tomaré ese.

Una vez que seleccionemos el puerto hacemos click en Siguiente.

En la siguiente pantalla nos da una lista de controladores. Buscamos el que diga Generic y a la derecha seleccionamos Generic Text Only. Finalmente hacemos click en siguiente:

Ahora nos pregunta el nombre. Recomiendo no usar espacios ni caracteres extraños para asignarlo. En mi caso le puse ImpresoraTermica.

Una vez asignado el nombre hacemos click en Siguiente

Ahora aquí esperamos un momento a que se instale…

Cuando termine, mostrará esto. Hacemos click en Imprimir una página de prueba para ver si la instalación ha ido bien…

Aquí nos avisa que ya se ha mandado:

Hacemos click en Cerrar y en la otra ventana hacemos click en Finalizar. Si todo ha ido bien, se debió haber impreso algo así:

En esa imagen se puede apreciar el nombre, el puerto, etcétera. Si no ha ido bien, probemos con otro puerto siempre y cuando comience con USB00X

Compartir impresora

Si vienes aquí por el tutorial de imprimir ticket en impresora térmica desde PHP, te enseñaré a compartirla.

Una vez instalada vamos a Panel de control y después a Dispositivos e impresoras. Ahí, a la impresora que instalamos le hacemos click derecho y seleccionamos Propiedades de impresora:

Vamos a la pestaña de Uso compartido y hacemos click en el botón que dice Cambiar opciones de uso compartido si es que está deshabilitada la opción de “Compartir esta impresora”

Cuando hagamos click se habilitará la opción. Hacemos click en ella y luego en  la entrada de texto ponemos el nombre del a impresora.

En mi caso dejaré el mismo nombre.

Finalmente hacemos click en Aceptar y con eso hemos terminado.

Configurar e instalar PHP 7, Apache server y MySQL en Windows 10

Introducción

Si queremos desarrollar para PHP, y conectarlo con un motor de base de datos como es MySQL necesitamos instalar a ambos, y finalmente a un servidor que escuche las peticiones y las procese mediante PHP.

Pues bien, por eso es que existe un paquete todo en uno que trae principalmente a estas tres herramientas, y adicionalmente algunas otras como phpmyadmin, filezilla server, etcétera.

De lo que hablo es de XAMPP y en este post explicaré cómo instalarlo, configurarlo y establecerlo como servicio para que tanto el demonio de Apache y de MySQL estén siempre encendidos.

Nota: este tutorial fue hecho sobre Windows 10 en 64 bits, pero lo he probado tanto en Windows 7 como en Windows 8.1 (con todas las actualizaciones).

Continue reading…

Diferencia entre #define y const en Arduino

Introducción

Las constantes; como sabemos, no cambian su valor en tiempo de ejecución. Son útiles para prevenir que nosotros mismos tengamos errores.

En el lenguaje de Arduino, que no es otra cosa que C y C++, podemos declarar constantes usando #define y también const. Cada una de ellas tiene su explicación.

#define

Es un macro que se ejecuta antes de la compilación. Para explicarlo de la manera más sencilla, supongamos que definimos lo siguiente:

#define NUMERO 1

void setup(){
  pinMode(NUMERO, OUTPUT);
  digitalWrite(NUMERO, HIGH);
}

Antes de que el código sea compilado, se hará un buscar y remplazar, en donde las ocurrencias serán (valga la redundancia) remplazadas por el valor verdadero. Por lo que (no podemos verlo, pero así es), el programa de arriba se convertiría en lo siguiente:

void setup(){
  pinMode(1, OUTPUT);
  digitalWrite(1, HIGH);
}

Es decir, remplazó las constantes por el valor verdadero.

Ventajas

  • No ocupa memoria para almacenar las constantes, puesto que son remplazadas por sus valores
  • Si vamos a usarlo para cosas pequeñas, como definir un pin, una cadena, etcétera, nos viene genial

Desventajas

  • No tienen tipo. Por lo que el compilador no podrá avisarnos si algo estamos haciendo mal
  • Son globales, por lo que debemos ser sumamente cuidadosos al referirnos a ellas

 

Const

Para declarar una constante, usamos const seguido del tipo de la variable. Por ejemplo:

const int numero = 1;

Al compilar, esto no se remplaza. Queda así como está. Y si el compilador detecta que en algún momento de nuestro código queremos asignarle un nuevo valor nos arrojará un valor.

Ventajas

Obedecen el ámbito de las funciones. Es decir, podemos declarar dos constantes con el mismo nombre en diferentes funciones:

void funcionUno(){
  const int edad = 18;
}

void otraFuncion(){
  const int edad = 50;
}

Y podemos usarlas dentro de cada función sin que choquen. También tiene la ventaja de que tiene tipo, por lo que el compilador nos informará los errores que puede que estemos cometiendo.

Const también permite declarar arreglos, cosa que #define no.

Finalmente, cabe mencionar que el uso de const es recomendado en lugar de #define según este artículo.

Conclusión

Personalmente utilizo #define porque no trabajo en proyectos grandes, y las librerías que incluyo no chocan con el nombre de mis constantes.

Sin embargo, es una buena práctica usar const en lugar de #define según el sitio oficial de Arduino. Y si ellos lo dicen, es porque así debería ser. Además, en la mayoría de casos tenemos memoria de sobra para los proyectos que hacemos, por lo que no tenemos que ahorrarla usando #define.

¿Por qué en Javascript no necesitamos punto y coma ni var?

Introducción

Independientemente de qué tanto sepamos Javascript, en algún momento alguien nos dijo o descubrimos que en Javascript podemos hacer dos cosas un poco raras:

  • Declarar variables sin la palabra reservada var
  • No poner punto y coma al final de cada sentencia

Cada una de estas cosas tiene su explicación. Y deberíamos omitir siempre ambas.

Declarar variables sin var

Comenzamos con declarar variables sin var. Pues bien, recordemos que para declarar una variable normal usamos lo siguiente:

var edad = 10;
var nombre = "John";

Pero claro que podemos hacer esto:

edad = 10;
nombre = "John";

¿Qué está pasando ahí?

Cuando no usamos var, la variable pasa a ser global automáticamente. Hacer esto:

function hola(){
  saludo = "Mundo";
}

Es equivalente a hacer esto:

var saludo = "Hola"; //Es global
function hola(){

}

Puede que no parezca nada malo; pero cuando estamos en proyectos grandes, una variable global puede traernos graves problemas, porque puede que tengamos resultados inesperados leyendo una variable que creemos local cuando en realidad no lo es. O podemos asignarla y otro programador obtendrá valores equivocados.

Para solucionar esto y educarnos a nosotros mismos (y a nuestros compañeros) podemos usar el modo estricto poniendo “use strict”; al inicio de nuestros scripts.

"use strict";
function hola(){
  saludo = "Mundo"; // Error 
}

Así que asignar variables sin var no es un tipo de magia, sino más bien una muy mala práctica que debemos omitir al menos que sepamos lo que estamos haciendo.

No usar punto y coma ;

Por otro lado tenemos a aquellos que dicen que no es necesario el ; al terminar una sentencia. Esto tampoco es magia. Cuando no ponemos punto y coma, el intérprete separa las sentencias con saltos de línea.

Con punto y coma, yo puedo hacer esto:

var edad = 19; console.log("Tu edad es ", edad);

Sin punto y coma…

var edad = 19 console.log("Tu edad es ", edad)

Oh, sorpresa. ¿No decían que se puede hacer sin ;?

Veamos ahora otra cosa que me encontré un día en codewars. Esta función:

function obtenerMascota(){
  return
  {
    nombre: "Maggie"
  }
}

Lo que esperamos al llamar esta función es un objeto que tiene la propiedad nombre. Vamos a probar…

Podemos ver que al llamar a obtenerMascota nos da undefined. La razón de esto es que estamos separando por un salto de línea el return y la llave de inicio del objeto.

La función correcta debería quedar así:

En este caso ponemos la llave junto con return. Ya que anteriormente el intérprete tomaba a return como una sentencia aparte del objeto.

Por eso es importante terminar nuestras sentencias con punto y coma, y poner la llave de inicio en la misma línea cuando estamos regresando un objeto.

Conclusión

Con esto terminamos por hoy. Tal vez al inicio nos moleste un poco usar el modo estricto pero es una forma de mejorar. Dejo algunas referencias:

https://www.w3schools.com/js/js_variables.asp

https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/var

https://stackoverflow.com/questions/1470488/what-is-the-purpose-of-the-var-keyword-and-when-to-use-it-or-omit-it

Promedio de arreglos en Go

Introducción

Para sacar el promedio de valores de un arreglo, sólo tenemos que recorrer el mismo y sumar cada valor a una variable (la sumatoria). Finalmente dividir la sumatoria entre la longitud del arreglo, que en este caso la podemos obtener usando la función len.

Promedio de un arreglo con datos definidos por nosotros

En este caso el promedio es para un arreglo definido por nosotros mismos.

package main

import "fmt"

func main() {
	calificaciones := [10] int {78, 20, 55, 90, 99, 78, 96, 50, 80, 100};
	sumatoria := 0 //Aquí iremos sumando cada valor

	/*
		Recorrer el arreglo
	*/
	for _, calificacion := range calificaciones{
		sumatoria += calificacion
	}

	//El promedio es dividir la sumatoria entre el número de calificaciones
	promedio := sumatoria / len(calificaciones)


	fmt.Println("El promedio es", promedio)
}

Al ejecutarlo obtenemos lo siguiente:

Promedio de un arreglo con datos definidos por el usuario

Ahora vamos a pedir que el usuario nos dé diez calificaciones y dependiendo de ellas vamos a calcular el promedio. Para pedir datos por teclado usamos fmt.Scanf y le pasamos la cadena de formato que en este caso es un entero y un salto de línea.

Hacemos un ciclo del 1 al 10 y preguntamos por cada calificación. Asignamos cada valor al arreglo, y finalmente calculamos la sumatoria y la dividimos entre la longitud del array.

package main

import "fmt"

func main() {
	var calificacionIntroducida int // Para escanear cada calificacion introducida por el usuario
	var calificaciones[10] int //Aquí guardaremos los valores

	/*
		Preguntar cada valor...
	*/
	for i:= 0; i < 10; i++{
		fmt.Printf("\nIntroduce la calificación %d: ", i + 1)
		fmt.Scanf("%d\n", &calificacionIntroducida)
		calificaciones[i] = calificacionIntroducida // y asignarlo
	}

	/*
		Calcular promedio
	*/

	sumatoria := 0
	for _,calificacion := range calificaciones{
		sumatoria += calificacion
	}

	promedio := sumatoria / len(calificaciones)
	fmt.Printf("El promedio es %d", promedio)
}

Al ejecutarlo e ingresar los datos podemos ver esto:

Promedio de arreglo con longitud y datos definidos por el usuario

Para terminar este post; ahora no preguntaremos 10 calificaciones, sino las que el usuario desee. Inicialmente preguntaremos de cuántas calificaciones desea sacar el promedio y dependiendo de ello asignaremos el arreglo. Después haremos lo mismo que en el ejercicio de arriba.

En este caso las cosas cambian un poco, ya que la definición de nuestro arreglo será un poco diferente. Esto es debido a que no podemos declarar la longitud de un arreglo en tiempo de ejecución, por lo que mejor usaremos un slice. Un slice es un arreglo de longitud variable.

package main

import "fmt"

func main() {
	var calificacionIntroducida int // Para escanear cada calificacion introducida por el usuario
	var longitudArreglo int //La longitud

	/*
		Preguntar la longitud...
	*/
	fmt.Print("¿Cuántas calificaciones desea promediar? ")
	fmt.Scanf("%d\n", &longitudArreglo)

	/*
		En calificaciones guardaremos los valores
		Como no podemos asignar una longitud a un array en tiempo de ejecución, usamos
		un slice. Para crearlo llamamos a make y pasamos como primer argumento
		el tipo de dato que sería int, y como segundo la longitud que
		fue previamente escaneada
	*/
	calificaciones := make([] int, longitudArreglo) //Aquí guardaremos los valores.

	/*
		Preguntar cada valor...
	*/
	for i:= 0; i < longitudArreglo; i++{
		fmt.Printf("\nIntroduce la calificación %d: ", i + 1)
		fmt.Scanf("%d\n", &calificacionIntroducida)
		calificaciones[i] = calificacionIntroducida // y asignarlo
	}

	/*
		Calcular promedio
	*/

	sumatoria := 0
	for _,calificacion := range calificaciones{
		sumatoria += calificacion
	}

	promedio := sumatoria / len(calificaciones)
	fmt.Printf("El promedio es %d", promedio)
}

Lo ejecuté dos veces para probar con diferentes longitudes:

Y con esto terminamos por hoy.