Obtener la ciudad del cliente en PHP

Hola Mundo:

Ya saben, estoy metiéndome poco a poco en desarrollo y les quiero compartir un trocito de código que utilicé en un proyecto.
El objetivo de este código  es obtener la ciudad del visitante a partir de la dirección IP.

 $ip = $_SERVER['REMOTE_ADDR'];
$url = "http://freegeoip.net/json/".$ip;
$data = file_get_contents($url);
$obj = json_decode($data);
$ciudad = $obj->city;

El codigo es sencillo. Obtiene un archivo JSON desde el servicio de Free Geo IP, lo procesa y almacena la ciudad en una variable.

Sencillo, ¿no?

Enviar datos a Azure Mobile Apps usando jQuery

Hola Mundo:

Este artículo es un tanto distinto a los que siempre se publican. Esta vez es sobre desarrollo, pero
consumiendo servicios publicados en Microsoft Azure.

Azure Mobile Apps es un servicio de Microsoft Azure que permite levantar, sin mayor esfuerzo, un backend para aplicaciones móviles. Este backend puede estar construido con ASP.NET o Node.js.
De cualquier manera, provee las herramientas para generar una REST API lista para ser consumida desde las aplicaciones cliente.

Me refiero a aplicaciones cliente y no móviles, porque estos servicios pueden ser consumidos desde cualquier lugar. Incluso desde un sistema web usando Javascript.

En este caso puntual, compartiré una ayuda de memoria para enviar datos usando jQuery usando el método AJAX:

$.ajax({
type: "POST",
contentType: "application/json; charset=UTF-8",
url: "https://xxxxxxx.azurewebsites.net/tables/xxxxxx",
headers: {'ZUMO-API-VERSION': '2.0.0', 'Content-Type': 'application/json'},
data: JSON.stringify({
"Campo1": "Valor1",
"Campo2": "Valor2"
}),
dataType: "json",
accept: "json",
success: function(datos){
console.log(datos)
alert('Datos reportados correctamente')
},
error: function(jqXHR, estado, error){
console.log(estado)
console.log(error)
},
complete: function(jqXHR, estado){
console.log(estado)
},
timeout: 1000000000
});

Lo relevante:

  • El type es POST. No olvidar que estamos enviando datos al servidor. Si tienes duda sobre esto, revisa este link: http://www.restapitutorial.com/lessons/httpmethods.html
  • contentType debe ser «application/json; charset=UTF-8». El servidor recibe datos en formato JSON. De otra forma, arrojará error 500.
  • La url es la dirección web del servicio. Esta es la forma más estándar si es que no han creado una personalizada.
  • La cabecera de la petición se indica en headers. Siempre debe estar incluido ‘ZUMO-API-VERSION’: ‘2.0.0’ y  ‘Content-Type’: ‘application/json’. En el caso que alguno falte, la consola indicará que hace falta una de las dos y arrojará un error 500 o 400.
  • En data se indican los datos que se enviarán. El método stringify del objeto JSON es el encargado de hacer que los datos que estamos enviando sigan el formato de JSON.  Recuerden que en contentType y en la cabecera se indica que estamos enviando datos en formato JSON. Si esto no está, recibirán un error 400.
  • El atributo accept le indica al servidor el formato en el que se requiere la respuesta.
  • El atributo dataType es usado por jQuery para «formatear» la respuesta antes de dejarla disponible para el trabajo con ella.
  • Success indica la función que se ejecutará cuando los datos se reporten correctamente.
  • Error indica la función que se ejecutará cuando se produzca un error en el reporte de datos.
  • Complete indica la función que se ejecutará luego de la ejecución de lo indicado en Success o Error.
  • Timeout indica el tiempo total de espera, en milisegundos, antes de cancelar la operación. Previene una ejecución casi infinita de la solicitud.
Nada más quería estar a la moda y jugar un rato con Javascript y Azure.
Espero que les sea de su total utilidad.

Rápida reflexión sobre seguridad y IoT

Hola Mundo:

En los últimos 2 ó 3 años hemos visto como han ido creciendo el desarrollo de las tecnologías que se conectan directamente a internet y aportan datos de todo tipo. Ya es cada vez más común que los electrodomésticos se conecten a Internet y muchas personas estén experimentando con dispositivos y componentes cada vez más baratos que apoyan en la lectura de variable y automatización de procesos.

Es entretenido ver a adultos jugando como niños al construir sus proyectos con Arduino o Raspberry Pi o algún otro hardware y construyendo piezas de software exclusivos para el sistema.

El principal problema está en que no se trabaja con un equipo con roles definidos, donde cada uno se encargue de las distintas variables de un sistema: red, administración, seguridad, procesos, etc.
Es momento de tomar conciencia y hacerse responsable de todo lo que conectamos a internet.

Esto nace del conocido ataque DDoS al servicio Dyn del pasado viernes, donde se descubrió que el ataque venía del Botnet Mirai. Este botnet se aprovecha de los dispositivos sencillos conectados a internet o que forman parte de algún sistema IoT.

Existen decenas de herramientas gratuitas y de código abierto que apoyan en el monitoreo de recursos y detección de intrusos que permitirían apoyar en la seguridad de los entornos.

Aparte de las herramientas externas para el monitoreo de nuestra solución, también se deben revisar constantemente las actualizaciones del firmware de nuestro dispositivo o del sistema operativo que esté utilizando. Es altamente recomendable unirse a las listas de distribución del dispositivo para estar  enterado de las actualizaciones del componente.

El llamado es a trabajar en equipo y a estudiar más allá del desarrollo del proyecto en si, siendo responsable de las «cosas» que conectamos a internet.

Mas información:
http://dyn.com/blog/dyn-statement-on-10212016-ddos-attack/
https://en.wikipedia.org/wiki/2016_Dyn_cyberattack
http://www.zdnet.com/article/the-dyn-report-what-we-know-so-far-about-the-worlds-biggest-ddos-attack/

Un abrazo a todos y sigamos desarrollando!

Ubicacion de adb en Mac OS X

Hola Mundo:

Dentro de los variados tópicos que aquí se hablan a calzón quitado, ahora es el turno de un tip interesante de la plataforma de desarrollo de Android para Mac OS X.

Hace unos días instalé la suite de Android Studio para aprender el oficio del desarrollo de móviles y hacer algunas aplicaciones para mi entretención.

Al querer instalar el sdk de Facebook, me di cuenta que no encontraba la herramienta adb para el trabajo con el emulador. En varias partes encontré ubicaciones que no correspondían a mi escenario. De tanto buscar en mi equipo, di con la ubicación. Esta es:

/Users/<usuario>/Library/Android/sdk/platform-tools

Teniendo esta información, la pueden agregar al PATH y listo.

Chau!

Actualizacion de QSL_QR – Mejoras y funcionalidades nuevas

Hola Mundo:
Hace unos días atrás publiqué un programita que generaba un código QR a modo de tarjeta QSL para los QSO realizados. Recibí feedback de mi heramano, quien también es radioaficionado, CA5MBT y me hizo unos alcances.  Esos mismos alcances fueron tomados para esta actualizacion. Las mejoras son:

  • El archivo generado lleva el QRZ de la estación con la cual se hizo el contacto. Así los archivos no se sobreescriben.
  • Se incluye el QRA de ambas estaciones.
  • Se incluye el QTH de la estacion que genera el QSL_QR
  • Se incluye un mensaje por defecto en el comentario.
  • La funcionalidad nueva que se incluye en esta versión, es un generador de QSL_QR en lote.

 

QSL_QR Ventana Principal
QSL_QR Ventana Principal

 

La modalidad de generar QSL_QR en lote, está en el Menu

QSL_QR Lote
QSL_QR Lote

Pueden descargar el instalador desde aqui

 

73.

Duplicar datos tabla en la misma tabla (Y como comerse la memoria y el disco de forma brutal)

Hoy estaba jugando con mi SQL Server, obviamente en entorno de pruebas,  y tuve la «brillante» idea de duplicar los datos de una tablas de hecho de AdventureWorksDW. Aparte de lograr que los registros se duplicaran, noté bastantes cosas que quiero compartir con ustedes.

Importante: Antes de duplicar los datos dentro de la misma tabla, debes desactivar las claves primarias. De lo contrario, arrojará un error. Recomiendo copiar los datos hacia una tabla temporal.

Sentencias:

INSERT INTO tabla SELECT * FROM tabla
Esta es la sentencia básica. Lo que hace es seleccionar todos los registros y volverlos a insertar. O sea, si se tienen 10 registros, insertará esos mismos 10 registros, quedando así con 20 registros. Ésta es la forma mas básica que hay.

INSERT INTO tabla SELECT top 100 * FROM tabla
Esta selecciona los 100 primeros registros y las inserta. O sea, si se tienen 1000 registros, insertará los primeros 100 registros, quedando así con 1100 registros.

INSERT INTO tabla SELECT * FROM tabla WHERE campo1 = 'algo'
Esta sentencia selecciona e inserta solo los registros donde la clausula WHERE se cumpla. No importa cuantos registros sean.

INSERT INTO tabla SELECT top 100 * FROM tabla WHERE campo1 = 'algo'
Esta hace lo mismo que la anterior, pero solo tomando en cuenta los 100 primeros registros.

Nunca hagas esto (a no ser de que sepas muy bien lo que estás haciendo)

Puedes hacer un sencillito script que duplique de forma exponencial los registros, causando un excesivo uso de disco y recursos de memoria. Con esta operación, el log de transacciones crece de forma desmesurada.


DECLARE @contador int
SET @contador = 0
WHILE (@contador < 10)
BEGIN
INSERT INTO tabla SELECT * FROM tabla
SET @contador = @contador + 1
END
GO

Si tenemos una tabla de 1000 registros, la primera vez insertará 1000 registros, quedando así con 2000 registros. La segunda vez, seleccionará los 2000 registros y los insertará, quedando así con 4000 registros. Esto ocurrirá hasta que se cumpla la condición (Imagina este escenario, pero  partiendo con 60000 registros)

Para finalizar quiero exponer algunas conclusiones:

  1. Nunca realices experimentos así en entornos de producción.
  2. Siempre ten un respaldo de las bases de datos.
  3. Ten controlado el crecimiento del log de transacciones. Hay mucha documentación al respecto.
  4. Si vas a duplicar los datos de tu tabla, hazlo de manera controlada y no de forma brutal (como lo hice yo)

Chau!

Los puntos y comas decimales: Víctimas de la cultura

… Y lo peor de todo, es que somos víctimas de eso nosotros también.

Hola Mundo, más botado no puede quedar mi blog. He decidido volver con un tema que me dió dolores de cabeza varios días y tiene que ver con las diferencias culturales y las matemáticas.

Me encontraba programando una aplicación sencilla que hace un formula sencilla para el cálculo de IMC (Índice de Masa Corporal). Esta fórmula  exige ingresar un valor decimal (una expresión numérica que contiene decimales).

El problema es que el lenguaje no tiene control sobre la realización de este tipo de cálculo, sino que para nosotros puede que la coma sea un indicador decimal o que sea el punto, pero de cualquier modo siempre va a ser diferente con otras culturas (como la inglesa).

Gracias a Dios, Alá, El Gran Arquitecto, belcebú (no sé a quien le rinden culto) este problema fue solucionado con una clase ya perteneciente al framework de .NET.

En VB.NET el tema es sencillo

  1. Importar System.Globalization
  2. Agregar estas líneas al método load o loaded:

System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo(«en-US»)
System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator = «.»

Con eso, el . siempre será un separador decimal en nuestra aplicación.

Libro gratis sobre Windows Azure

Hola Chicos! Hoy se publicó un libro gratuito sobre Windows Azure, titulado: «Windows Azure Platform:  Articles from the Trenches Volume I»

El libro consiste en 20 articulos de 15 desarrolladores que han estado desarrollando (valga la redundancia)  sobre Windows Azure y tratan sobre como iniciarse en  Windows Azure hasta como implementar buenas prácticas de desarrollo.

El PDF lo puedes conseguir gratuitamente desde http://bit.ly/downloadazurebookvol1 o sencillamente lo puedes leer aqui mismo en el gadget empotrado de slideshare.net

Necesitas conectarte a una base de datos?

Bases de datos mas Conocidas
Bases de datos mas Conocidas

No se si les ha pasado, pero los que estamos ( o han) aprendido a desarrollar (por necesidad) aplicaciones en el lenguaje que sea, les falla el connection string para la conexion a la base de datos.

Hacer una investigacion al respecto resulta realmente tedioso. Se pierde demasiado tiempo investigando en sitios webs de otras personas, foros, blogs de especialistas, etc.

Eso se torna muy confuso, mas aun, cuando hay bases de datos que no tienen mucha documentacion por parte de la comunidad por su uso no tan habitual.

No todo es perdida de tiempo. Hace algun tiempo, conoci un sitio web llamado ConnectionStrings.com en el que muestra la Connection String (valga la redundancia… que cosas, no?) para un buen numero de DBMS, entre los cuales se encuentran:

  • Oracle
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server
  • Informix
  • IBM Unidata
  • Sybase Advantage Database Server
  • IBM DB2
  • IBM Universe
  • Progress
  • Firebird

Y muchos otros menos conocidos. Tambien ofrece soporte para Excel, Access, Archivos de Texto, Windows Azure y demases.

El sitio web es bastante completo y ofrece una tremenda ayuda cuando queremos aprender a usar otras bases de datos.

Ejemplo de Herencia en java

Estimados, debo aclarar que no soy un maestro en JAVA, ni lo pretendo ser. Solo quiero compartir lo poco y nada que se sobre este lenguaje.

En clases hace poco vimos algo de herencia y les compartire un ejercicio muy sencillo.
El encabezado es el siguiente:

Un centro cultural se dedica al préstamo de dos tipos de materiales de préstamo: discos y
libros. Para los dos se guarda información general, como su código identificativo, el título y
el autor. En el caso de los libros, almacenamos también su número de páginas, y para los
discos el nombre de la discográfica.
Al centro cultural acuden una serie de clientes (de los que se guarda su DNI y nombre), que
realizan una serie de peticiones de discos o libros (como mucho hasta 5 peticiones). Para
cada petición se guarda la fecha de inicio y fin del préstamo.

El codigo del ejemplo lo pueden encontrar aqui:
http://rapidshare.com/files/308502492/CentroCultural.zip

Dedicado a todos aquellos que me lo pidieron en clases 😛