viernes, 2 de mayo de 2014

Parametros estrategia BBlock Open Layers

Cuando se tienen muchas marcas que mostrar en un mapa no es recomendable cargarlas todas a la vez, lo recomendado es cargar únicamente las marcas de la sección visible del mapa. Para hacer esto en Open Layers se utiliza la estrategia BBox (Bounding Box).

BBox envía una petición a nuestro servidor cada vez que el área visible del mapa cambia. La petición, por defecto GET, tienen como parámetro principal uno llamado bbox que tiene por valor cuatro puntos en el mapa para delimitar el cuadrado visible, concatenados por comas.

La petición se ve así:
http://mymapsapp.com/GetAreaPoints?bbox=0,50,50,0

El primer punto es el más bajo; el segundo, el más a la izquierda; el tercero, el más alto y por último, el más a la derecha.

Bonus Track: en PostGis podríamos utilizar le siguiente query para obtener los puntos dentro del cuadrado.

SELECT punto_id, nombre_punto, coordenada_punto
FROM tabla_puntos
WHERE coordenada_punto && ST_SetSRID(ST_MakeBox2D(ST_Point(0, 50), ST_Point(50, 0)), 4326)

Saludos,
Giank

miércoles, 19 de marzo de 2014

Logoshi, bosqueja tu logo


Hoy quería hablar de algo diferente, pero que también sea útil y me acordé Logoshi. El concepto de la web es simple y útil, bosqueja un logo y Logoshi te generará uno a partir del tuyo.

La idea surge de un programador que necesitaba un logo para un proyecto pequeño y no tuvo suerte con diseñadores, decidió tomar el toro por las astas para diseñar su logo y creó esta web que es capaz de transformar bocetos simples en logos de estilo moderno.

Luego de dibujar tu boceto Logoshi generará 4 alternativas distintas entre las que podrás escoger, además también genera la tipografía; cuenta, también, con una zona de preview donde puedes ver tu logo en tarjetas de presentación, papelería y hasta en las oficinas de tu compañía, es un detalle genial. Al terminar puedes descargar tu recién generado logo en formato PNG o como imagen vectorial de alta resolución, la descarga incluye el logo con el nombre de tu compañía en varias presentaciones.

Saludos,
Giank

viernes, 14 de marzo de 2014

gTimer, mi librería para conteos regresivos

Continuando con los post relacionados a mi proyecto, esta vez me toca hablarles de una librería Javascript que hice hace poco, se llama gTimer y es una librería para trabajar con un contador regresivo.
Trabajando con un menú lateral me di cuenta que sería útil ocultar el menú luego de un tiempo sin usarlo, googlee un poco en busca de una librería que me ayudara pero no encontré nada útil por lo que me decidí a implementarlo yo mismo.  La librería es simple de usar, consta  de un inicializador, el que recibe el tiempo de la cuenta y un método para ejecutarse al terminar y varios métodos sin parámetros para controlar el conteo, terminarlo o reiniciarlo.
La librería está publicada bajo la licencia del MIT y alojada en GitHub. Si tienen alguna idea o necesitan que se agregue algo pueden pedirlo directamente en el repositorio del proyecto (aqui) o por los comentarios.

Saludos,
Giank

sábado, 8 de marzo de 2014

Agregar texto fijo a un mapa con OpenLayers

Entre las cosas que tiene mi proyecto es que trabajo con mapas en web, como quiero que use componentes 100% libres decidí utilizar la librería OpenLayers para manejar el mapa y demás cosas relacionadas. Una de las últimas cosas que he tenido que hacer es mostrar una etiqueta perenne en el mapa que indique el nivel de zoom en el que el usuario se encuentra. Leyendo y probando cosas encontré un solución, esta consiste en agregar un panel en el mapa que contenga un único "botón", el que luego reemplazaremos por nuestra etiqueta.
Para que esta solución funcione es necesario crear un div con id "panel" en nuestra web, no entiendo bien el motivo de esto, pero así funciona. Además, hay que definir estilos para el botón-etiqueta y para el panel.

Sin más preámbulo, aquí está el código explicado!

//Primero, debemos crear el botón que insertaremos en nuestro panel.
var btnZoom = new OpenLayers.Control.Button({
 displayClass: 'olControlBtnZoom',
    text: 'Soy la etiqueta de Zoom',
    type: OpenLayers.Control.TYPE_BUTTON
});

//Luego definimos el panel que contendrá el botón e indicamos que será el control por defecto.
//Además en la propiedad "createControlMarkup" definimos una función que se encargará de crear nuestra
//etiqueta y nos la retornará, esto con el fin de reemplazar el botón.
var panel = new OpenLayers.Control.Panel({
defaultControl: btnZoom,
createControlMarkup: function(control) {
var textoSpan = document.createElement('span');
textoSpan.id="spnZoomText";
textoSpan.innerHTML = control.text;
return textoSpan;
}
});

//A continuación agregamos el botón al panel y el panel al mapa
panel.addControls([btnZoom]);
map.addControl(panel);

//Esta es la clase para el panel, el nombre es el que asigna por defecto OpenLayers
//y es el que debemos usar
.olControlPanel {
    top: 15px;
    left: 15px;
    width: 65px;
    cursor: default;
    }

//Esta es la clase para el botón que luego será etiqueta, es importante saber que si quieren cambiar el
//nombre del estilo solo puede cambiar el texto correspondiente al nombre del botón, el prefijo "olControl"
//es usado por OpenLayers y debe permanecer.
.olControlBtnZoom{
    position: absolute;
    height: 18px;
    width : 65px;
}

Espero que esto les sea de utilidad!

Saludos,
Giank


martes, 4 de marzo de 2014

Trello, que útil eres!

Como ya había comentado, tengo un proyecto personal en el que ando trabajando y desde que lo empecé he buscado un sitio donde pueda gestionar las tareas y el avance del mismo. Como siempre lo primero que se me vino a la mente fue lo que conocía, Scrumy, una web app donde podría gestionar al estilo Scrum Board el avance de mi proyecto, pero no me llegó a convencer del todo. Luego busqué otras alternativas online, que resultaron en su mayoría de paga, por lo que ni pensé en usarlas. Por último decidí registrar todo en un excel y trabajarlo "a mano". Ya tenía un buen tiempo en excel cuando conversando con unos amigos uno de ellos me contó de Trello. Cuando me terminó de contar puso el video de presentación y fue amor a primera vista, era exactamente lo que estaba buscando, flexible, online, organizado, colaborativo, simplemente perfecto.

En general Trello es una especie de kanban board flexible, se divide en organizaciones, pizarras y listas. Los proyectos se pueden gestionar como organizaciones, las organizaciones están compuestas por pizarras (boards) y estas a su vez están compuestas listas(lists) de tarjetas (cards). Las tarjetas son objetos sumamente útiles y completos; permiten agregar una descripción, que será el texto mostrado; comentarios; aplicar etiquetas; asignar miembros; adjuntar imágenes o links; organizar votaciones; agregar listas de tareas y comentarios. Son la herramienta principal de trabajo en Trello y están muy bien pensados. En los proyectos se pueden asignar miembros y estos repartirse entre pizarras distintas para formar grupos de trabajo. 

Por ejemplo, para usar Trello como herramienta en Scrum podríamos crear una organización para todo el proyecto. Crear una pizarra como Backlog, esta puede contener 3 listas, una para historias nuevas, otra con historias ya puntuadas y priorizadas, listas para un próximo Sprint, y por ultimo una que tenga las historias terminadas. Para cada Sprint habría que crear una nueva pizarra, agregar a todos los miembros del team y crear listas para los estados de las historias, creo que también sería bueno agregar una lista para registrar bugs. Cada historia sería una tarjeta y las tareas de cada una se podrían incluir en un check list, incluso si hubieran documentos relacionados con la historia se podrían adjuntar.



Particularmente uso Trello para mi proyecto personal con una configuración de listas simple: por hacer, en progreso, en proceso constante, detenida, terminada, ideas nuevas(como backlog) e incidencias/cambios. Para un proyecto pequeño esto debe ser más que suficiente, todo en una sola pizarra y se puede trabajar de maravilla.
Esta útil herramienta tiene apps para Android, iOS y Windows Phone 8, solo he probado la de Android y es completamente funcional, tiene prácticamente las mismas opciones que la web con el adicional de notificaciones para el móvil.


Saludos,
Giank

sábado, 22 de febrero de 2014

WhatsApp se cae y se lleva consigo a Telegram

Se ha caído la app de comunicación escrita más grande del mundo, es algo de lo que todos los usuarios nos dimos cuenta al instante; y si no eres usuario igual ya lo sabes porque lo has visto en Facebook o más rápido aún en Twitter.

Según los primeros comentarios y reportes la caída fue a alrededor de las 13:30 hrs, hora Peruana y un rato después también callo el chico nuevo del barrio mensajero, Telegram. La noticia llenó los muros de Facebook y los time lines de Twitter, el hashtag #WhatsApp se hizo TT en  menos de media hora y en una hora la palabra Telegram hizo lo mismo. Era la oportunidad perfecta del avión de papel para crecer, muchísimas personas están volteando a verlo, a tomarlo en cuenta, a descubrirlo, pero han fallado. Según su propio reporte están teniendo alrededor de 100 activaciones por segundo, motivo por el que supongo se ha caído el servicio o en todo caso está muy lento.

Por otro lado debo decir que WhatsApp escogió el mejor día y momento para caerse, un sábado por la tarde, cuando todos están coordinando que hacer, a donde ir, como ir y demás cosas; pero sobre todo cuando aún está fresca la idea de su venta al gigante azul de las redes sociales. Es inevitable pensar que de alguna manera la compra de WhatsApp por parte de Facebook tiene algo que ver con el actual problema y lo primero que se me ocurre es que han metido la pata tratando de migrar data de los servidores de una compañía a la otra. Aún no hay un anuncio oficial ni en redes sociales por parte de WhatsApp, por lo que solo nos queda seguir suponiendo que es lo que pueda haber pasado.

#BonusTrac: ¿Alguien se acuerda de que existe LINE? Particularmente no me gusta su interfaz, prefiero el simplismo de Whatsapp o de Telegram

Saludos,
Giank

miércoles, 19 de febrero de 2014

Copiar arreglos en Javascript

Hoy toca hablar de Javascript, hace un par de meses vengo trabajando intensivamente con este lenguaje y tengo algunas cosas que compartir, esta es una de ellas.
En JS siempre se trabaja pasando valores y no referencias excepto en el caso de arreglos, objetos o funciones. En general esto es útil y uno se acostumbra con el tiempo, pero cuando trabajas con objetos complejos que contienen arreglos de otros objetos te topas con unos cuantos problemas, sobre todo al momento de modificar o copiar un arreglo.

Si tenemos arreglos que contienen tipos primitivos hacer copias es simple, existen principalmente dos formas de hacer copias sin que los datos de ambos arreglos queden linkeados: usando el método slice() o el método concat(). Un pequeño ejemplo.

var arregloFuente = ['a','b','c','d','e'];

var arregloDestino = arregloFuente.slice(); 

var arregloDestino = arregloFuente.slice(0); 
o
var arregloDestino = arregloFuente.concat(); 

Estos mismos métodos también se pueden aplicar a arreglos de objetos, con la diferencia que en este caso los dos arreglos contendrán referencias a los mismos objetos, por lo que si modificamos algún objeto en un arreglo este cambio se verá en ambos. Esto puede ser útil para sincronizaciones, pero molesto a la hora de aplicar filtros o duplicar data para modificarla. A nuestros rescate llega jQuery con su método extend() que permite hacer copias "superficiales"( shallow) o "profundas"(deep) de arreglos. Con "superficiales" me refiero a copias que se hacen usando referencias y con "profundas" me refiero a copias usando valores; esto es que, si modificamos un objeto dentro de uno de los arreglos no afectaremos al otro. La sintaxis es la siguiente.

var arregloFuente = [{color: 'rojo', peso: 10},{color: 'verde', peso: 10},{color: 'rojo', peso: 20}, {color: 'amarillo', peso: 5}];

// Copia superficial (Shallow copy) 
var arregloDestino = jQuery.extend([], arregloFuente); 

// Copia en profundidad (Deep copy) 
var arregloDestino = jQuery.extend(true, [], arregloFuente); 

Me pasó recientemente que incluso el método extend() no me hizo una copia en profundidad de un arreglo el cual contenía entre sus propiedades otro arreglo con objetos, para este caso lo único que me quedó fue hacer un método propio que haga el copiado del arreglo. Como dato, el arreglo anidado era un objeto observable de knockout, creo que esto tuvo algo que ver con que no me haga la copia en profundidad bien.

Saludos,
Giank.

jueves, 13 de febrero de 2014

De regreso al blog!

Dejé de publicar mucho tiempo, pero ya estoy de regreso. Ya tengo más notas, tiempo libre y un proyecto persona interesante que me gustaría compartir. La temática del blog sigue siendo la misma, tecnología y mi vida diaria en internet. So.. I`m Back baby!


Saludos,
Giank

martes, 16 de octubre de 2012

TempData y ViewData en MVC2

Cuando uno lleva mucho tiempo trabajando con el clásico paradigma de N capas planteado al estilo .NET y trata de ir al mundo del MVC (también de .NET) se encuentra con que las clásicas variables de sesión son poco usadas y en su lugar se usan TempData y ViewData. Aunque en un principio los nombres son algo descriptivos, estos mismos también son confusos, por lo que me han dado más de un dolo de cabeza al querer usarlo y más al tratar de entenderlos.
Antes de pasar a explicar el funcionamiento de cada uno de estos debo aclara que Session aún existe, ahora paso a la explicación.

TempData, ViewData y Session funcionan igual en lo que se refiere a la forma de guardar información, todo son pares key - value.
TempData guarda la información solo durante el Request actual y el siguiente, muy útil cuando necesitas pasar data en redirecciones a páginas de error.
ViewData guarda la información solo durante un Request, más específicamente durante el camino Vista - Controlador (y viceversa), muy útil para mostrar mensajes de confirmación.
Session sigue trabajando igual, guarda datos que están disponibles durante toda la sesión de cliente.


Saludos,
Giank

lunes, 15 de octubre de 2012

LinQ To SQL y los archivos dbml

Linq To Sql es un ORM ligero, con soporte para Linq (Tecnologia .NET) integrado. Un ORM es un componente de software que se encarga de hacer el mapeo de una BD relacional a clases/objetos.
Como en todo trabajo con .NET existe una herramienta visual para hacer este trabajo y es realmente útil, en unos minutos podemos tener toda nuestra BD, relaciones incluidas, mapeada en nuestro sistema sin mayor esfuerzo.
Los pasos para trabajar con LinQ to SQL son simples:
  • Se agrega al proyecto un archivo de clases de LinQ to SQL, extension dbml. 
  • En el explorador de servidores realizamos un conexión a la BD de nuestro sistema. 
  • Agregamos todas las tablas que necesitemos de nuestra al archivo dbml, esto se hace solo "jalando" las tablas al archivo. 
  • Nombramos nuestras tablas con los nombres que queramos que tengan las clases en nuestro sistema. 
  • y listo! 
Hecho esto ya tenemos mapeadas todas las tablas de BD que necesitemos para trabajar y gracias al poder de LinQ podemos hacer inserciones, modificaciones y eliminaciones de manera rápida y sin generar un solo caracter en Transact-SQL.

Saludos,
Giank

ActionLink a otro controlador

Siempre hay cosas nuevas que aprender y hoy he aprendido mucho de MVC2. Entre todo mi trajín del día, haciendo el proyecto de DSD, me topé con la necesidad de llamar a un controlador diferente al que manejaba una vista determinada. Busque un rato entre las sobrecargas del método ActionLink, pero no encontré nada que calzara al 100% con mi necesidad, al final me aventuré por un constructor con 5 parámetros y como no tenia idea de que pasarle al último le di un null.. y ¡ohh sorpresa!, funcionó; se hizo una llamada a un controlador diferente al asociado con la vista en la que trabajaba en ese momento. El constructor es este:

Html.ActionLink("TextoDelLink", "NombreDelAction", "NombreDelControlador", new { NombreParametro1 = Valor1, NombreParametro2 = Valor2, etc, etc }, null)

Como "bonus track" para este post, agrego que este método no reconoce entre sobrecargas de métodos en el controlador al que se llame.

Saludos,
Giank

miércoles, 7 de marzo de 2012

Mi nuevo Razer Onza Tournament Edition


Debido a la mala experiencia con mi experimento iPod-joypad me quedé con las ganas de jugar con un buen joypad, así que me puse en busca de uno. Al principio pensé en solo comprar un conector para mandos de PS2 a PC, pero conforme iba leyendo reseñas y opiniones me convencía de que no era buena idea. Al final, por pura casualidad, recordé que, según los conocedores, el mejor mando del mercado es el del Xbox 360 y ya que es un mando inalámbrico me gusto mucho la idea.

Cuando ya tenía decidido en donde comparar mi futuro mando Microsoft de Xbox 360 para PC, me encontré con el motivo de este post, mi actual Razer Onza Tournament Edition. Fue pura casualidad aunque yo lo llamaría destino. Estaba viendo los anuncios de venta nuevamente y vi que al final de la lista alguien vendía un gamepad Razer; la marca me sonó al instante, sé que Razer hace muy buen hardware y que se especializa en pro gaming lo que llamo mi atención. Hice un par de preguntas al vendedor, leí reviews en internet y me convencí que ese era el mando que quería.

Hecha la compra regresé a mi casa emocionadísimo, instalé Gears Of War, conecté el mando y a jugar se ha dicho!.

No tengo nada malo que decir del joypad, su desempeño es optimo, su peso, sus botones,  sus joysticks, su retro iluminación, su velocidad de respuesta y sus botones configurables, todo es genial. Si algo malo tendría que decir, es que el cable que lo conecta a la PC es demasiado rígido y por momentos hace incomodo moverlo para conectarlo.



Saludos,
GNK.

martes, 6 de marzo de 2012

WifiPad + iPod + Pc = Retrogaming - Resultado



En mi cabeza la idea de utilizar mi iPod como joypad para mi PC y poder jugar viejojuegos de SNES o PSONE parecía buena, pero la verdad fue otra. Puede conectar el iPod a la PC, pude abrir los emuladores y correr los juegos, pero el look and feel es totalmente distinto; además que la funcionalidad de un iPod como joypad no es ni mínimamente parecida a uno de verdad. Es difícil mantener apretado 2 botones a la vez y más difícil aún saber si de verdad los estas apretando a la vez, la distribución de los mismos no es igual, no se tiene a la mano los famosos R y L, y principalmente el "feeling" de tener un joypad real en mano se extraña.

Todo este tema del iPod-joypad despertó mis ganas de jugar nuevamente y decidí buscar algunos de mis no tan antiguos juegos, he comprado un muy buen joypad, pero cual es y que tal me va es tema de otra entrada.

Saludos,
GNK.

lunes, 27 de febrero de 2012

WifiPad + iPod + Pc = Retrogaming

Hoy sin querer se me ha ocurrido un nuevo "proyecto" muy geek. Me he dedicado a los vídeo juegos desde muy pequeño, comencé con un snes y pronto salté al PC donde finalmente me quedé, pero realmente nunca deje de jugar juegos de consolas. Siempre me conseguía emuladores nuevos y roms nuevas también, así me mantenía actualizado de todo lo último en vídeo juegos sin gastar en consolas nuevas.

Por simple curiosidad compré, en una página de oferta por cupones, un cable HDMI para conectar mi portátil a la TV y como caída del cielo encontré una app que podía transformar mi iPod en un joypad, se llama WifiPad. Al principio no me di cuenta, solo vi los dos sucesos por separado, pero en un toque de iluminación se me ocurrió: Con el nuevo cable puedo conectar mi portátil, corriendo algún emulador, a la TV; luego sincronizar mi iPod, corriendo WifiPad con el portátil; correr alguno de mis emuladores y voila! una "consola" retro a la orden y lista para jugar.

Llegando a mi casa pondré manos a la obra para que tal me va con el experimento, deséenme suerte que me hace muchísima ilusión.


Saludos,
GNK.

martes, 3 de enero de 2012

Jailbreak iOS 5.0.1, hecho.

Desde que compré mi iPod,  he seguido detenidamente las noticias sobre el Jailbreak para la última versión de OS de la manzanita. Empecé a buscar en blogs y foros sobre el tema hasta que caí en el blog de Pod2G, quien se encontraba en pleno desarrollo del Jailbreak. Durante un par de semanas seguí asiduamente su blog esperando noticias positivas sobre el desarrollo, hasta que avisó el traspaso del desarrollo al Dev Team. Luego del traspaso deje de seguirle la huella al estado del Jailbreak y grande fue mi sorpresa al ver en blog geek que el Jailbreak ya había sido liberado. Decidí esperar un tiempo a ver si causaba problemas, pero como no encontré nada grave, me anime. El proceso fue limpio y rápido, totalmente diferente al primero que hice un año atrás donde todo fue fallos y hasta tuve que restaurar el iPod de mi amigo. Por el momento solo he descargado modificaciones visuales y controles extra y no me ha dado ningún problema. Mi recomendación es que liberen sus iCosas ya mismo.

P.d: El Jailbreak no funciona con dispositivos con procesadores A5 (iPhone 4S e iPad2)

Saludos,
GNK

jueves, 29 de diciembre de 2011

Recuperaré mi Super Nintendo (SNES)

Como ya he contado antes, mi primera consola fue un Súper Nintendo el cual conservé y usé con mucho afán durante años. Cuando en el 2007 pidieron donaciones para los damnificados por el terremoto de Pisco a mi herma no se le ocurrió mejor idea que regalar mi Súper Nintendo, por dios, ¡¡¡MI Súper Nintendo!!!! Es algo que por más hermana y por más que la quiera siempre recordare molesto.  Desde esa fecha no he jugado nada de snes, pero esta navidad sucedió un milagro, después de muchas indirectas y de mucho insistir mí enamorada a prometido conseguirme uno y con tres de los mejores juegos que alguna vez tuve: Súper Street Fighter II, Súper Mario World y Top Gear II. Espero que lo consiga pronto y sobre todo que logre encontrar esos juegos, la amaré de por vida y hasta en la otra vida si lo hace. Espero mi regalo con la misma ilusión que lo esperé hace casi 13 años y sé que me sentiré de 9 nuevamente cuando lo conecte, prenda y escuche el sonido de al coger monedas cuando juegue Mario Bros.

P.d: Lista juegos a recuperar: Futbol Excitante, Futbol Peruano 97, todos los Bomberman, Los Picapiedras, Metroid, Mario Cart, Yoshi Island, todos los Donkey Kong, Indiana Jones, Motorratones, Las Tortuninjas.

Saludos,
GNK.

lunes, 19 de diciembre de 2011

Un iPod en mi vida


Si, el título es extraño incluso para mí, pero es la verdad. Para esta navidad he decido autoregalarme un iPod Touch 4G, el motivo no es otro que el de jugar. Particularmente no soy amante de las iCosas sobre todo porque considero que usar uno de estos aparatos es venderle tu alma al diablo, pero yo quería una consola portátil y el iPod me cayó como anillo al dedo. Es muy pequeño, no incomoda, siempre que alguien pregunta puedes decir que lo tienes para escuchar música y no para jugar, tiene muchos más usos que el solo jugar, es barato y sobre todo es "liberable". He tenido que pensarlo y leer mucho, pero al final fue la elección más lógica. Por lo pronto no he podido hacerle el respectivo JailBreak, solo ando probando juegos free, pero ni bien salga el JailBreak para el iOS 5.0.1 lo aplico y a bajarme miles de juegos, ya les contaré como me va.

Saludos, GNK.