marzo 2018

Ejemplo de envío de formulario con AngularJS y PHP utilizando AJAX

Introducción

Los formularios son los más utilizados a la hora de necesitar información del usuario. Si estamos trabajando con AngularJS sería una ofensa enviar un formulario con los métodos que ya conocemos. Así que hoy mostraré un pequeño ejemplo de cómo enviar un formulario utilizando:

  • AJAX
  • AngularJS
  • PHP

Podemos cambiar a PHP por cualquier lenguaje del lado del servidor.

Ver ejemplo terminado

Si quieres probar el ejemplo terminado, entra aquí. Abajo dejo también la carpeta para que puedas descargarla y probarla por ti mismo.

formulario_angularjs

Preparando el lado del cliente

App

Comencemos definiendo la app y el controlador, así como el código HTML. Al inicio, quedaría así:

Notar por favor que he puesto un {{5 + 5}} para ver si no ha habido ningún error. Si no lo hay, se mostrará el número 10:

Esto es más que nada para verificar si todo ha ido bien. Si no, por favor verifica que has incluido la librería y que no has tenido errores de escritura.

Formulario

Hora de comenzar a crear el formulario. En este caso haré un formulario para guardar mascotas. Preguntaré su nombre, edad y raza. El código se vería como a continuación. Notar por favor que no he definido nada en el código Javascript.

Simplemente agregué algunos campos de entrada. Es importante notar que a la edad le he asignado el tipo number, de esta manera AngularJS se encargará de convertir ese campo a un número.

Juntando modelo con formulario

Ahora vamos a meternos un poco con Javascript. Definiremos la variable que guardará la mascota (que será un objeto) y luego reflejaremos los cambios en el formulario. Así:

Lo único que hicimos fue declarar una variable en el $scope. Y luego, a cada input le pusimos un ng-model refiriéndose a una propiedad de dicha variable.

La etiqueta que puse abajo (pre) fue para “depurar” y ver si realmente se están haciendo cambios. Podemos probar cambiando los valores, y veremos que se reflejan abajo y se muestra el objeto completo.

También es importante notar que la edad es un número (no trae comillas). Esto sirve cuando hacemos operaciones aritméticas, pues no tenemos que estar viendo si es cadena o número.

Hasta ahora se ve así:

Ahora sí ya tenemos vinculado nuestro modelo con la vista. Hora de programar el botón y mandar esos datos por AJAX.

Enviando datos

Para terminar con la programación del lado del cliente, vamos a escuchar al botón. Cuando hagamos click, haremos una petición POST a un archivo PHP. Le mandaremos (codificado con JSON, para intercambiar y mantener limpios los datos) el objeto mascota.

Para esto necesitamos el módulo $http que AngularJS ya trae. El código final se ve así:

Muy simple de explicar. Utilizamos $http.post para enviar datos al archivo recibir.php. Serializamos los datos con JSON para que viajen de forma segura. Escuchamos el click del botón y listo. Una vez que la petición haya terminado, imprimimos la respuesta en la consola.

 

Programando el lado del servidor

Vamos a hacer que los datos que se reciban sean escritos en un archivo txt simplemente para comprobar que realmente se están enviando. En la vida real puede que los guardemos en una base de datos, o algo así.

Es importante mencionar que AngularJS manda los datos de diferente manera que jQuery. jQuery por defecto los manda como si fueran un formulario, y accedemos desde PHP con $_POST. En cambio, AngularJS los manda para poder leerlos en el flujo de entrada de datos.

Otra cosa que hay que mencionar es que se tiene que hacer un echo, pues eso es lo que leerá la petición como resultado.

Hace algunos años cuando apenas aprendía AJAX, intenté hacer un return y no hubo resultados ¡jaja! ya que se tiene que imprimir algo, no regresar algo.

Pero bueno; hablar es de mal gusto. Aquí el código:

Y listo ¡hemos terminado! Hora de probar

Probando app

Un GIF dice más que mil palabras:

Y con esto terminamos por hoy.

Buscar el número menor y mayor en un arreglo con Go

Introducción

Seguimos con los ejercicios clásicos. Hoy veremos cómo buscar el número más grande y el más pequeño que existe en un arreglo de datos. Será con un ciclo for y condiciones.

Buscar el número más grande

En este caso no importa la forma en la que iteremos sobre el arreglo. Por lo tanto, lo haré con un range. El proceso es simple, declaramos una variable de tipo entero, iniciada con el valor del primer elemento de la lista. Luego, vamos comparando y en cada iteración del arreglo preguntamos:

¿el número actual es mayor que el que está almacenado en la variable? en caso de que sí, entonces a la variable le asignamos ese número. En caso de que no, seguimos con el ciclo. Finalmente, imprimimos el mayor.

La salida del programa es la siguiente:

Buscar el número más pequeño

Ahora hagamos el proceso inverso, de la misma manera que antes, pero cambiando la comparación y el nombre de la variable.

Queda así (notar que he cambiado los valores del arreglo):

La salida es esta:

Bonus: buscar mayor y menor

Para terminar bien, vamos a buscar tanto al mayor y al menor en el arreglo. Se haría así:

La salida sería esta:

 Con esto terminamos por hoy.

Recorrer arreglos en Go

Introducción

Siempre vamos a necesitar recorrer arreglos o listas en Go. Al menos yo conozco 2 maneras de hacerlo y hoy vengo a explicarlas.

Recorrer un arreglo con una variable y un ciclo for

La forma más tradicional y antigua es declarar una variable en 0. Luego, hacer un ciclo for e ir incrementando esa variable de uno en uno hasta llegar a la longitud del arreglo.

Si queremos recorrer un arreglo o vector (por ejemplo, de números enteros) e imprimir sus valores el código de ejemplo sería el siguiente:

Eso lo recorre de arriba hacia abajo, para “optimizar” el ciclo y no llamar muchas veces a len. Al ejecutar, tenemos:

Pero si a queremos recorrerlo de abajo hacia arriba tenemos dos opciones… almacenar la longitud en una variable, o llamar a la función en cada iteración.

Almacenar longitud para recorrer de abajo hacia arriba

El código quedaría así:

Y su ejecución sería la siguiente:

Llamar a len en cada iteración

Ahora quedaría así:

Y su ejecución sería casi la misma que arriba,  así:

Recorrer un arreglo con range

Este es el método preferido y elegante. Si queremos recorrer un arreglo, utilizamos range. Así, podemos acceder al índice y al valor por separado.

Por ejemplo, para ver el índice y valor de un arreglo usamos esto:

La salida es la siguiente:

Si sólo queremos el índice…

Código de ejemplo:

Lo que da como resultado esto:

Y si sólo queremos el valor…

Código fuente de ejemplo:

Para terminar, esta es la salida:

Conclusión y notas

Sólo recorrimos arreglos de números, pero también podemos recorrer arreglos de cualquier tipo, sobre todo utilizando range.

Eliminar documentos duplicados en MongoDB

Introducción

Hablando de duplicidad, en alguna ocasión tuve que eliminar datos duplicados en MySQL y ya lo expliqué. Hoy explicaré cómo podemos eliminar duplicados en MongoDB, un gestor de base de datos que se compone de colecciones y que dentro de éstas aloja documentos.

Eliminar duplicados

Si sólo vienes por la solución, y no quieres ver el ejemplo, lo que tienes que ejecutar es esto:

Ahí “coleccion” es el nombre de tu colección. Y “laClave” es la clave que no quieres que se repita más de una vez.

Por cierto, haz un respaldo completo antes.

Quiero aclarar que la solución no es mía, yo sólo vengo a exponerla y a dar un ejemplo.

Ejemplo

Base de datos

Para este ejemplo utilizaré una base de datos de libros, en donde no puede repetirse el ISBN. Por favor nota que sólo es un base de datos de ejemplo, no esperes que los datos rean reales; se trata de ilustrar.

Insertaré esto:

Consultando

Consultaré los datos para ver si se han insertado:

Hora de eliminar los repetidos. Nota: en este caso es un ejemplo algo raro, pero puede que en alguna ocasión nos falle sólo una palabra y tengamos que eliminar los duplicados.

Eliminando duplicados

Para eliminarlos, utilizo esto:

Ejecuto la “consulta”:

Verificando eliminación

Y si vuelvo a consultar los datos existentes, veo esto:

¡Magia pura! ya no hay repetidos. Nos hemos quedado sólo con un dato. Esto funciona muy bien cuando tenemos documentos realmente repetidos, es decir, que todas sus claves sean idénticas; ya que de esta manera no importará cuál de ambos se elimine.

En este caso utilizamos al ISBN para eliminar, pero podemos utilizar cualquier clave.

Respaldar base de datos de MongoDB

Introducción

En toda base de datos siempre necesitaremos importar y exportar datos. Ya sea por prevención, seguridad o porque haremos un movimiento que puede hacer que la base de datos quede mal. El punto es que siempre lo necesitaremos.

Hoy veremos cómo hacer un respaldo completo de una base de datos en MongoDB utilizando tanto mongoexport y mongoimport como mongodump y mongorestore.

Diferencias entre mongoexport, mongoimport, mongodump y mongorestore

Mongoexport funciona para exportar. Para importar datos que respaldamos con esta herramienta, utilizamos mongoimport.

Mongodump funciona para exportar, y su contrario es mongorestore.

La diferencia es que mongodump conserva los datos de una forma más “fiel”, es decir, si tenemos datos que no son simples cadenas o números, éste método tratará de que queden intactos al exportarlos e importarlos.

Otra diferencia es que el primero exporta a JSON y el segundo a BSON. Si me preguntan a mí, prefiero JSON, pues guardo datos normales.

Importando y exportando con JSON

Sintaxis

Exportar

La sintaxis es la siguiente:

mongoexport --db tuBaseDeDatos --collection laColeccion --out C:\la\ruta\de\salida\del\archivo.json

Importar

Y para importar, usamos esto:

mongoimport --db tuBaseDeDatos --collection laColeccion --file C:\la\ruta\del\archivo.json

Ejemplo

Base de datos

Para ejemplificar esto, usaré una base de datos de una tienda, que tendrá una colección llamada productos. Habrá 3 registros en dicha colección, los cuales se ven así:

Exportando con mongoexport

Ahora voy a exportarlos:

Nota: no puse la ruta completa, sólo puse el nombre del archivo, por lo que el programa tomará la ruta actual como la ruta en donde debe quedar el archivo. En este caso es la raíz del disco D.

Si visito la ruta en donde lo exporté, veré que se creó un archivo que se puede abrir con un editor de texto plano:

Ahora eliminaré todos los datos de la base de datos. Al consultarlos, queda esto:

Así que la tabla ha quedado vacía.

Importando con mongoimport

Como ya hemos vaciado la tabla, vamos a probar la importación. Voy a importar el archivo:

Y ahora, si veo los registros que tengo, veré esto:

Y así podemos importar y exportar. Veamos ahora las otras 2 herramientas.

Importando y exportando con BSON

Para mostrar la diferencia, ahora vamos a exportar una base de datos completa.

Sintaxis

Exportar

Para exportar, hacemos lo siguiente:

mongodump --db tuBaseDeDatos --out C:\la\ruta\de\salida\de\la\carpeta

 

Importar

Y para importar, esto:

mongorestore C:\la\ruta\de\la\carpeta

En este caso no especificamos base de datos ni colección, pues la base de datos será creada automáticamente.

Ejemplo

Base de datos

Utilizaremos la misma base de datos de productos

Exportar con mongodump

Para exportar es:

Esto hizo que una carpeta fuera creada:

Importar con mongorestore

Ahora para importar únicamente paso el nombre de la carpeta como argumento:

Conclusión y notas

Si tenemos control de acceso, podemos pasar nuestro usuario y contraseña con –username y –password respectivamente. Por cierto, la contraseña debe ir entre comillas.

También tenemos las opciones –host y –port. Y puede que haya otras, pero espero haber mencionado aquí las más importantes.

Por otro lado, podemos exportar colecciones únicas, base de datos, todas las bases de datos, y muchas combinaciones que no podría explicar en un post.

Aquí dejo una lista de enlaces que pueden ser de ayuda:

Ejecutar código PHP en línea sin necesidad de registrarse

Introducción

A veces no tenemos tiempo de probar en nuestro servidor algún fragmento de código, o tal vez no tenemos PHP instalado. En este caso nos vemos en la necesidad de ejecutar código PHP online gratis y sin muchos líos.

Es por ello que hoy vengo a compartir una página que permite simular y ejecutar código PHP, así como código MySQL.

PhpFiddle

La página de la que hablo es phpfiddle.org. La interfaz luce así:

La parte que más me gusta es la que dice Code Space. Se ve así:

  1. El código fuente. Aquí podemos escribir todo el código, es nuestro editor.
  2. Ejecutar. Con esto ejecutamos el código que previamente hemos escrito.
  3. Autoformatear. Esta herramienta es muy útil al menos para mí, pues acomoda e indenta el código para que se vea bonito.
  4. Edición. Es como el menú Editar que conocemos. Permite pegar, copiar, deshacer, etcétera.
  5. Analizar nuestro código.
  6. Exportar. Podemos descargar el código que hemos escrito.
  7. Cargar. Si tenemos un archivo php en nuestra computadora, podemos subirlo para probarlo aquí.
  8. El mismo que el 6, permite descargar el código
  9. Configuraciones. Ajustes del editor, mostrar líneas, autocompletar, etcétera.
  10. Ayuda de PHP. Esta es una poderosa herramienta, nos da ayuda traída directamente del sitio oficial de PHP. Es decir, no necesitamos salir del editor por si olvidamos la firma de una función o cosas de esas que suelen pasar.

Obviamente esto es una explicación a grandes rasgos. La mejor manera de explorar todas las características es entrar por ti mismo.

Conclusión

Sólo di una pequeña introducción a esta gran herramienta online. Pero incluso tiene soporte para trabajar con MySQL, hacer peticiones AJAX y un montón de cosas que no podría explicar aquí. También permite iniciar sesión para (creo) guardar nuestros archivos.

Es una maravilla total para los desarrolladores de PHP que por alguna u otra razón no tenemos un entorno local, o simplemente queremos hacer pruebas rápidamente sin tener que crear archivos y probar en nuestro ordenador.

Limpiar consola en Java

Introducción

Para las personas que nos gustan las aplicaciones a la antigua, y que más que nada lo hacemos para experimentar, nos viene bien saber cómo limpiar la consola o terminal en Java. Lo malo es que no es tan fácil como en otros lenguajes.

Buscando por internet encontré lo que expongo en este post. También explico cómo es que funciona internamente.

Código

El código de ejemplo lo dejo a continuación. Simplemente se encarga de ejecutar el archivo cmd.exe (un archivo de Windows, también conocido como símbolo del sistema) y pasarle argumentos, como explico más abajo.

Como vemos, el método puede lanzar excepciones, por eso lo encerramos en un bloque try/catch. Sin embargo, no estamos reaccionando a ninguna excepción. Esto es porque al menos yo pienso que no debería importarnos mucho si la consola se limpia o no; o si no se encuentra el ejecutable.

Es decir, no intervendría de gran manera en nuestra aplicación.

Explicación del comando

Lo único que hacemos con Java es ejecutar una nueva instancia del cmd, o el símbolo del sistema. Le pasamos la opción /c, con la cual indicamos que por favor ejecute el comando que le indicamos y luego se cierre a sí mismo. ¿y qué comando es? pues el comando para limpiar la pantalla: cls.

Voy a probarlo en un GIF:

Como se ve, se limpia la terminal inmediatamente. Y claro que sería más fácil llamar simplemente a cls, pero cls no es un ejecutable, sino un comando del ejecutable cmd. Por eso debemos llamarlo de ese modo para limpiar la pantalla en Windows.

Ejecutando código

Y finalmente aquí dejo un GIF de la ejecución del programa

Suma de números en Go

Introducción

Ya me gustó esto de hacer pequeños ejercicios con Go. Pero bueno, vamos a hacer otro en donde simplemente devolvemos la suma de 2 números que pedimos por pantalla. Muy simple pero nos da una pequeña introducción al lenguaje.

Ejemplo de código

Lo único que hacemos es declarar 2 variables al inicio. Luego, les asignamos un valor dependiendo de lo que el usuario elija.

Abajo asignamos el resultado a una tercera variable. No es necesario declarar su tipo, pues si estamos sumando enteros el resultado será por lo tanto entero.

Finalmente imprimimos.

Ejecución del programa

Aquí dejo un GIF en donde se ejecuta el programa.

Tablas de multiplicar en Go

Introducción

Recordando mis primeros ejercicios de programación, en alguna ocasión tuve que imprimir las tablas de multiplicar de diferentes maneras.

Una de ellas era pedir cuál tabla quería ver, y entonces se imprimía. Por ejemplo, si el usuario decía que quería la tabla del 5, entonces se imprimía 5 x 1 = 5…. hasta 5 x 10.

En otro ejercicio, se pedía hasta cuál tabla se quería ver. Por ejemplo, si el usuario quería hasta la tabla del 3, entonces imprimíamos la tabla del 1, luego la del 2 y finalmente la del 3.

Hoy veremos cómo hacer esos dos sencillos pero reconfortantes y nunca olvidados ejercicios.

Tabla de multiplicar en donde el usuario elige cuál desea ver

Comencemos con este problema, en donde el usuario elige y nosotros imprimimos la tabla. Quedaría así:

Hacemos un for que va desde 1 hasta 10. Ya que la condición dice que el ciclo se ejecute siempre y cuando el número sea menor o igual que 10. Cuando sea 11, ya no valdrá, así que sólo llega al 10.

Dentro del ciclo, asignamos el resultado de multiplicar el número en el que vamos (1, 2, 3… hasta 10) por la tabla (lo que introduce el usuario). Finalmente lo imprimimos y listo.

Ejecución del programa

Así se ve, por ejemplo, la tabla del 7:

Tablas de multiplicar hasta donde el usuario elija

Ahora vamos a imprimir muchas tablas, el límite lo pondrá el usuario. Es decir, primero será la tabla del 1, luego la del 2 y así hasta donde el usuario quiera. Queda así:

Ahora el usuario nos da el límite, y la tabla es parte del ciclo. Tenemos un ciclo dentro de otro. El primero se encarga de ir tabla por tabla, y el segundo imprime del 1 al 10 multiplicados por la tabla.

Ejecución

Así se ve al ejecutarse:

Leer datos por teclado en Go | Versión 2

Introducción

Ayer escribí cómo leer datos del usuario que son pedidos por consola. La versión que hice fue un poco larga para un proceso tan simple, así que aquí traigo una versión mejorada que me recuerda más a cuando leíamos variables en C con scanf.

La ventaja de esto es que podemos leer muchas variables de varios tipos, con la conversión automática.

Código de ejemplo

Pondré el mismo ejemplo de ayer, en donde elegíamos nuestra botana (si así se le puede llamar) favorita. La diferencia es que ahora leeremos un número entero. Es importante notar que al leer con Scanln pasamos como argumento la dirección de la variable, no la variable en sí.

A lo que acabamos de hacer se le puede llamar lectura sin formato, porque lee toda la entrada. Podríamos igualmente leer un flotante, una cadena, etcétera.

 

Sentencias de control en Go: If y Switch

Introducción

Este tutorial pretende ser muy sencillo. Simplemente explica cómo funciona la sentencia if, else y switch. Veremos cómo a veces vamos a preferir switch, y cómo aquí no tenemos que utilizar break cuando lo utilizamos.

If y else

Comencemos con la sentencia if. A diferencia de otros lenguajes, la condición no va entre paréntesis. Y aunque el cuerpo ocupe una línea, debemos encerrarlo entre llaves.

La forma más simple del if y else es esta:

Al ejecutar el código, se imprime “Verdadero”:

También puede haber if sin else

En este caso imprimimos sólo si la condición se cumple; en caso de que no, no hacemos nada. Recordemos que un if siempre puede ir sin else.

Podemos hacer negaciones

Recuerdo que cuando inicié a programar (con C) hace algunos años, me ocurrió algo muy gracioso. No sabía cómo hacer un else sin un if. Es decir, dejaba el if (con la condición) vacío, y ejecutaba el código sólo en el bloque del else.

Si tan sólo mis profesores (y no los culpo) me hubieran enseñado que las condiciones se pueden negar con ! las cosas serían distintas. En fin, podemos negar una variable, el resultado de una función, etcétera.

 

En este caso estamos negando a false, lo que da como resultado true.

Utilizar and y or

Dos de las compuertas lógicas básicas: and, en donde todas las condiciones deben cumplirse. Y or, en donde al menos una de ellas debe cumplirse.

La salida al ejecutar el programa es la siguiente:

5 > 0 && 10 > 9
1 < 2 && 5 > 1
4 > 9 || 3 < 10

If anidados con else

Podemos crear tantos if y elses como deseemos, aunque en estos casos se prefiere el switch, que veremos más abajo. En fin, así se ve:

La salida será Excelente. Si la calificación no cumple ninguna condición, el programa irá al else, en donde dirá “Sin palabras”.

If anidados

Puede que deseemos ejecutar múltiples cosas en varios bloques if, así:

En este caso utilizamos el operador módulo, que se encarga de sacar el residuo de una división. Por ejemplo, al dividir 10 entre 3, el residuo es 1; es por ello que sabemos que 10 no es múltiplo de 3. Pero no pasa lo mismo con 5 y 2.

Asignar variables antes de iniciar la condición

A veces es necesario asignar una variable que utilizaremos dentro de la condición. Para ello, podemos hacerlo como en los ejemplos de arriba, en donde asignamos calificación. O podemos hacerlo así:

En este caso es un ejemplo sin sentido, pues no utilizamos a edad dentro del if o else, pero ilustra correctamente.

Por favor notar que esta variable sólo vivirá dentro del if (y else, si es que ponemos); ya que si la queremos utilizar fuera de éstos habrá errores.

Asignar variables dependiendo de condición

Para terminar, veremos cómo asignar un valor dependiendo de una condición.

Qué bueno que hice este ejemplo, así también puedo demostrar que si una variable es booleana o devuelve un booleano, no es necesario compararlo con == true o con == false. Es decir, es lo mismo:

if variable == true{} y if variable{}

Así como:

if variable == false{} y if !variable{}

Switch

Esto será sencillo. Switch es como un if, pero más limpio. Permite comparar muchas condiciones, y sólo evalúa una de ellas; cuando se cumple, ya no ejecuta las demás.

Lo que más me gusta de esto es que podemos no sólo comparar números, sino cadenas y resultados de funciones.

Si ninguna condición se ejecuta, se llama a default.

Finalmente quiero hacer que noten que no es necesario el uso de break como en otros lenguajes, ya que el switch se termina cuando una de sus condiciones se cumple.

Evaluando muchas condiciones

Podemos evaluar varias condiciones que se verían confusas con bloques if. Notar por favor que es como si se comparase con ==, y no podemos utilizar >= o <=

 

Comparando cadenas

Podemos comparar tanto cadenas como números enteros. Si queremos hacerlo con cadenas, puede ser así:

Y también podemos declarar variables que sólo serán visibles en el ámbito del switch. Por ejemplo, así se vería el ejemplo de arriba:

 

Leer datos de entrada del usuario con Go

Introducción

En la mayoría de programas por consola, necesitamos que el usuario introduzca datos. Ya sea para pedirle información o para hacer que seleccione determinada acción. Hoy veremos cómo leer datos por consola en el maravilloso lenguaje de programación Go.

Leer entrada del teclado

Para esto necesitamos crear un reader, que lea hasta un separador. En este caso el separador será el salto de línea; el que se escribe al presionar la tecla Enter.

Después, como la entrada de datos contiene el salto de línea que utilizamos como separador, hay que limpiarla; es en donde usamos TrimRight.

Finalmente hacemos un switch para comparar la entrada del usuario, y listo. Este ejemplo es muy sencillo, pero a la vez ilustra cómo podemos leer datos del teclado en Go.

Código de ejemplo

El código fuente que se explica arriba está escrito aquí abajo. Imprimimos un mensaje en donde preguntamos al usuario qué cosa prefiere. Si es una de las dos opciones que le damos, le avisamos. En caso de que no, indicamos que prefiere otra cosa.

Ejecución

Así se ve el código una vez que lo compilamos:

Ajustando fechas en Javascript

Introducción

No sé si sólo a mí me pasa o si sólo yo ocupo las fechas en Javascript, pero siempre que intento compararlas, algunas salen mal debido al offset. Sé que no se debe confiar en las fechas del cliente, pues se pueden cambiar, pero en alguna ocasión debimos necesitar trabajar con estas y puede que nos haya dado resultados inesperados.
Así que hoy mostraré cómo “ajustar el tiempo” de las fechas de Javascript utilizando getTimezoneOffset.

Descripción del problema

Esto pasa cuando creamos un objeto fecha utilizando una fecha como cadena. En donde la cadena es algo como “2018-03-05” (que representa el 5 de marzo del 2018 ). El objeto se crearía de la siguiente manera:

Nosotros esperamos que la fecha sea el 5 de marzo del 2018 a las 12 de la noche, o a las 00:00:00. Pero al imprimirlo...

Sorpresa. Dice que la fecha es del domingo (sunday) 4 de marzo a las 6 de la tarde. Y nosotros esperábamos que fuera del lunes 5 de marzo a las 0 horas.

Lo que está pasando aquí es que se están restando las horas del Tiempo universal coordinado (creo); en mi caso, como soy de México, resta 6 horas. ¿y si no estamos en México?

Javascript provee una forma de obtener el offset de la fecha. Y con ello podemos arreglar las fechas.

Vamos a ver la solución más abajo.

Solución

Esto es simple, al objeto que ya hemos creado vamos a ponerle el tiempo en milisegundos como el resultado de los milisegundos que ya tiene, sumando los milisegundos que resultan al obtener el offset. Para no confundirnos, se hace así:

Expliquemos esto.

setTime recibe un número, que es el tiempo en milisegundos que han pasado desde la fecha unix.

getTimezoneOffset devuelve en minutos la diferencia de tiempos; en este caso devolverá 360, pues son 6 horas multiplicadas por 60 minutos.

Estos 360 minutos los multiplicamos por 60 para pasarlos a segundos, y luego al resultado lo multiplicamos por 1000 para convertirlo a milisegundos.

Con eso, hacemos la resta. Obtenemos los milisegundos que ya tiene la fecha con getTime y a eso le sumamos el resultado que obtuvimos arriba.

En pocas palabras, se le suman los milisegundos de la diferencia de horas. Si después de hacer esto imprimo la fecha, tengo esto:

Correcto. La fecha ahora sí es del lunes a las 12 de la noche. Y este método, me parece, funciona para cualquier zona horaria.

Así, podemos arreglar y ajustar fechas en Javascript sin perder la cabeza.

Conclusión

Cabe mencionar que esto sólo me ha pasado al instanciar objetos con una fecha ya existente; si se instancia y no se le pasan parámetros, todo va bien. Es decir, si hago lo siguiente todo va bien:

Se desajusta cuando al constructor de Date le paso una cadena como argumento.

Compilar java y MySQL sin NetBeans ni otros IDE’s

Introducción

En este post explicaré cómo conectar Java y MySQL sin utilizar ningún IDE. Es decir, lo único que necesitamos es el compilador de Java (javac), el “ejecutador” de archivos de java (java), un editor de texto plano como Sublime Text, una consola y el conector que será un archivo.jar.

Si quieres, puedes ver este post para ver cómo instalar java.

Sólo explicaré la conexión, y escribiré otro post de un CRUD para complementar a éste; pero no podemos crearlo si no sabemos conectar.

Descargando driver

El conector es traído a nosotros por MySQL. Lo podemos descargar de su página oficial aquí. Prefiero descargar la versión comprimida en un zip. En el momento de escribir esto, la versión es 5.1.45 pero igual puede cambiar.

Por favor evita descargar las “development releases”.

Cuando hagamos click en el botón, nos pedirá una cuenta para descargarlo. Esto me recuerda a cuando descargabas un archivo en una página en donde el verdadero botón de descarga estaba oculto, y los que te llenaban de publicidad estaban grandes y coloridos.

En fin, hasta abajo dice “No gracias, sólo inicia mi descarga” o algo así. Hacemos click en ese enlace.

Y lo guardamos en donde deseemos. En mi caso hice una nueva carpeta y lo extraje ahí.

Una vez extraído, lo único que nos importa es el archivo .jar, así que procederemos a eliminar todo lo demás y quedarnos únicamente con este fichero. Por lo que la carpeta en donde estaremos trabajando debe verse algo así:

Recomiendo renombrar este archivo a un nombre fácil de recordar. El nombre no afecta al comportamiento, por lo que en este caso le pondré simplemente “mysql” así:

Y con eso hemos terminado la descarga. En la misma carpeta en donde dejamos el archivo vamos a crear otros archivos para comenzar a programar.

Conexión MySQL

Hay muchas maneras de instalar MySQL. Yo instalo la versión que viene con XAMPP. Algunas personas lo instalan separado, el punto es que esto siempre cambia.

Antes de probar este código, verifica si te puedes conectar a MySQL. Normalmente el ejecutable puede estar en “C:\Program Files\MySQL\MySQL Server 5.7\bin\” o si lo instalaste con XAMPP está en “C:\xampp\mysql\bin”.

Para probar, navegamos desde una terminal hasta la carpeta y ejecutamos el archivo mysql.exe con nuestro usuario y contraseña. Repito de nuevo, el usuario y la contraseña son configuraciones nuestras, nosotros debemos saberlas.

Por razones que no importan, tengo mysql en la ruta que se ve. Como se puede ver, navegué hasta ahí (línea rosa) y ejecuté el comando (línea azul), en este caso mi usuario es root. Si tu usuario es otro, usa ese. En la línea verde pide la contraseña, si tu usuario la tiene, ponla.

Una vez que hayamos entrado, creamos la base de datos como se ve en la línea roja. Y listo.

En caso de que no haya salido ningún error, puedes continuar.

Probando conector o driver

Si ya probaste que MySQL funciona normalmente, puedes continuar.

Código java

Crearemos un nuevo archivo java y dentro de él colocaremos lo siguiente:

Explicando el código, primero utilizamos el método forName. Ese método busca si hay una clase cargada con ese nombre; es decir, verifica si hemos incluido la librería correctamente. Si no, lanza una excepción.

Más abajo nos conectamos a la base de datos. Puse el host, puerto y nombre por separado, para que sea fácil cambiarlos. También coloqué en otro lado el usuario y la contraseña. Para compilar este archivo simplemente llamamos a javac Prueba.java así:

Ejecutando código

Ahora viene la parte “difícil” y es ejecutar el archivo. Recordemos que necesitamos el conector, ¿y cómo le decimos a Java que lo use? muy fácil, ejecutamos y pasamos como argumento el classpath, que es el lugar en donde está nuestro conector.

Como se puede ver, yo lo descargué en D:\desarrollo\java\java_mysql y se llama mysql.jar. Una vez compilado con javac, ejecutamos con java de esta forma:

En la línea verde compilamos, es lo que hice hace unos momentos. Y luego ejecutamos el archivo, llamando a java. Le pasamos la opción classpath con cp,  y le indicamos en dónde está el .jar que queremos que incluya.

Es importante notar el ;, que funciona como separador. Primero le pasamos un . el cual es el directorio actual, para que encuentre “Prueba” y luego, separado con un ; le pasamos la ruta del conector. Si tenemos el conector en la misma carpeta, podríamos simplificarlo a:

java -cp .;./mysql.jar Prueba

Luego, separado con un espacio, ponemos el nombre del archivo que previamente compilamos.

Recordemos que para compilar utilizamos archivo.java, pero para ejecutar sólo archivo. Es decir, no necesitamos extensión al ejecutar. Eso sí, debemos haber compilado antes.

Aquí dejo una captura de la carpeta en donde tengo todo esto, por si sirve de algo:

El archivo Prueba.class es el archivo compilado. Y bueno, al final de todo pudimos ver que sí se pudo conectar.

Errores comunes

Si yo cambiara el puerto, saldría esto:

Y si, por ejemplo, no existiera el archivo .jar que tiene el conector, pasaría esto:

En fin, recuerda seguir todo al pie de la letra. Si lo haces bien, no tendrás problemas.

Conclusión

Conectar Java con MySQL es muy fácil, pero debemos saber que son conceptos diferentes. Es decir, Java sirve para muchas cosas, no sólo para conectar a bases de datos. Y MySQL puede ser consumido por muchos otros lenguajes de programación.

Lo que estamos haciendo aquí es combinar ambas cosas para obtener un resultado. Espero poder traer muy pronto un ejemplo de cómo crear, leer, actualizar y eliminar registros con Java.