miércoles, 5 de abril de 2017

ZonedDateTime & OffsetDateTime

Hoy quiero compartirles algunas pruebas que realice con ZonedDateTime y OffsetDateTime.

En primer lugar podemos decir que tenemos un "Instant" que representa un instante determinado de tiempo, luego tenemos un OffsetDateTime que representa un instante de tiempo con el agregado de que este tiene un offset aplicado, luego tenemos un ZonedDateTime que es un instante de tiempo con un Offset aplicado y con reglas de TimeZone (ZoneRules) para las conversiones de horario de verano y otras particularidades de cada TimeZone.
Puede que tengan las dudas de cual debemos y cual no debemos usar ya que ambas son iguales a simple vista o parecidas pero a la realidad no lo son, por las particularidades ya mencione al principio.
Por lo general para guardar fechas en cualquier medio de almacenamiento debemos usar el OffsetDateTime ya que este no pierde información al momento de almacenarse, cosa que si pasa cuando usamos el ZonedDateTime, ya que se pierden las ZoneRules al momento de persistirse, por lo cual tenemos que tener en claro que el OffsetDateTime debemos usarlos en los modelos de persistencia y el ZonedDateTime cuando queremos realizar operaciones de complejas entre fechas ya que estas operaciones van a contemplar las reglas de cada TimeZone. Ahora si las operaciones son simples como determinar si una fecha es menor, igual o mayor podemos usar tranquilamente OffsetDateTime para este tipo de operaciones.



Resumiendo OffsetDateTime es para modelos de persistencia y ZonedDateTime para realizar operaciones con las fechas, y como ultimo comentario mencionar que podemos obtener un ZonedDateTime mediante un OffsetDateTime y viceversa.

Del paquete java.time tenemos:

Instant -> OffsetDateTime -> ZonedDateTime

Saludos a todos y Happy Haking } ;)

martes, 28 de marzo de 2017

Trabajo en equipo

Hola a todos, hace mucho que no me doy una vuelta por acá XD.

Hoy tengo ganas de escribir del trabajo en equipo, hace poco me tope con un articulo que habla de cuanto invierte Google en buscar cual es la mejor dinámica para trabajar en equipo. Y básicamente dice que los equipos trabajan mejor cuando no existe jerarquía o tiene una jerarquía plana, y esto es lo que ayuda a que ningún miembro del equipo sienta temor en contradecir una idea ya sea del líder o cualquier otro miembro del proyecto para demostrar que no es del todo correcto.
Si nos ponemos a pensar por lo general cuando queremos plantear una idea siempre tenemos el temor de contradecir a nuestros superiores o sentimos que podemos no ser valorados o aceptados en la propuesta de nuevas ideas o decir que una idea planteada no es del todo correcta.
Otra cosa que puede pasar es que a primera vista el equipo muestre que todas las ideas son bienvenidas y se arman reuniones para plantear ideas entre todos los miembros del equipo y lo que se termina haciendo es lo que un superior decide y eso a largo plazo termina perjudicando ya que se termina pensando: "Para que pensar en una alternativa si al final se hace lo que el jefe dice", esto en un contexto de un jefe que ni contempla las alternativas y solo quiere parecer un buen jefe.
Personalmente haciendo una retrospectiva de mi vida laboral, me doy cuenta que cuando mas rendí fue cuando mas cómodo estuve en cuanto a la aceptación de mis ideas (claro algunas fueron buenas, otras no tanto y otras fueron malisimas :( el proceso del aprendizaje), y en esos equipos que estuve el rol del "Líder/Jefe" siempre fue un rol de coordinador y moderador mas que un jefe, siempre fue uno mas que nosotros y nos hacia sentir que valoraba nuestras ideas a lo que atribuyo que esos lideres entendían y aplicaban la inteligencia emocional.

Para terminar, si sos líder o jefe aplica la inteligencia emocional, motiva al equipo y sobre todo, demostrá que sos uno de ellos y no solo el jefe.


Saludos y Happy Hacking } ;)

martes, 29 de marzo de 2016

Migración MongoDb 2.4 -> 2.6 -> 3.0 (con replicas)

Migración MongoDB 2.4 -> 2.6 -> 3.2 (con replicas)

Este post pretende mostrar los pasos a seguir para la migración del mongoDB 2.4 a 3.2.

¿Por qué debemos migrar a 2.6 primero?

En la versión 2.6 se cambia el modelo de datos para las credenciales de los usuarios, como así también se agregan nuevas herramientas de auditoria. En el proceso de migración a esta versión se realizan los cambios de modelos necesario y la verificación del buen funcionamiento de las nuevas herramientas. Estas verificaciones y cambios en versiones posteriores no se realiza.

Migración de 2.4 a 2.6

Fuente de información para la migración: https://docs.mongodb.org/manual/release-notes/2.6-upgrade/

Lo primero que debemos hacer es descargarnos el mongoDb 2.6, esto es para usar su cliente y realizar por medio de este la migración.

64: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.11.tgz

32: https://fastdl.mongodb.org/linux/mongodb-linux-i686-2.6.11.tgz

Para descargar los binarios para otras versiones u otros Sistemas Operativos ir a la siguiente url : https://www.mongodb.org/downloads#previous

La migración debe de comenzar por las réplicas secundarias siguiendo los siguientes pasos:

1- Conectarse a la réplica con el mongo 2.6:
  1. ./mongo host:puerto -> Cambien el host según la réplica que estén actualizando y el puerto.
2- En la Shell de mongo ejecutar:
  1. rs.stepDown() -> Este solo hay que ejecutarlo si el nodo es el primario, hace que otro nodo sea el primario.
  2. rs.slaveOk() -> Ese comando es la forma corta de ejecutar el siguiente comando: db.getMongo().setSlaveOk(), lo que hace es habilitar en la conexión actual las operaciones de lectura en el miembro secundario (En la réplica).
  3. use admin -> selecciona la base de datos “admin”.
  4. db.upgradeCheckAllDBs() -> Realiza una comprobación de compatibilidad de todos los datos almacenados.
3- Actualizamos los binarios del mongoDb en el nodo(servidor):
  1. Ingresamos al nodo.
  2. Nos conectamos al MongoDb.
  3. use admin -> cambiamos a admin.
  4. db.shutdownServer() -> paramos el server. 
  5. mv carpetaMongoBinarios carpetaMongoBinarios-2.4 -> renombramos la carpeta del mongo para instalar la nueva versión.
  6. Descargamos la versión del MongoDB según nuestro Sistema Operativo (recordar que estamos migrando primero a la 2.6)
  7. Levantamos el mongod nuevamente. Recuerden que tenemos que levantar el nodo con la misma configuración que tenia antes de migrar el binario. Este post supone que se tiene en una carpeta separada el archivo de configuración del mongod y el storage del mongo.
  8. Esperamos que se ponga funcional.

Migración de 2.6 a 3.0

Los pasos para la migración de la versión 2.6 a la 3.0 son los mismos ya descritos para la migración de la 2.4 a la 2.6, solo hay que cambiar las referencias a las versiones 3.0 en donde corresponda.

¿Qué nos ofrece MongoDB 3.0?:

Nueva API de motor de almacenamiento de MongoDB que permite optimizar la base de datos para diferentes arquitecturas de hardware y cargas de trabajo de aplicaciones.
MongoDB 3.0 multiplica el rendimiento entre siete y diez veces, ofrece escalabilidad vertical para las cargas de trabajo de escritura intensiva mediante la recopilación y el bloqueo a nivel de documento. La compresión nativa reduce considerablemente los costes de almacenamiento hasta en un 80%. Ahora los conjuntos de réplicas pueden incluir hasta 50 miembros, lo que reduce la latencia al distribuir geográficamente los datos cerca de los usuarios.
Ampliación del marco de auditoría introducido en MongoDB 2.6 para incluir todas las operaciones de sistema y datos (DDL y DML) en la base de datos. Gracias a estas extensiones, ahora los administradores pueden crear y filtrar las trazas de auditoría de cualquier operación en MongoDB sin tener que recurrir a herramientas de terceros.

Definir el Engine WiredTiger

Para realizar correctamente el proceso hay que verificar los valores de los tamaños de los objetos almacenados y el tamaño de la base de datos antes de la migración al nuevo engine. Luego de la migración hay que volver a tomar los valores y comparar con los valores viejos, si los valores se redujeron la migración fue exitosa. Más grande sea la base más notorio va a ser la diferencia en el tamaño después de la migración.

Manos a la obra y a seguir los siguientes pasos:

1- Conectarse a la réplica que vamos a migrar (Comenzar por las secundarias y luego la primaria):
  1. ./mongo host:puerto -> Solo es un ejemplo, cambien el host según la réplica que estén actualizando y el puerto.
2- En la Shell de mongo ejecutar:
  1. rs.stepDown() -> Este solo hay que ejecutarlo si el nodo es el primario, hace que otro nodo sea el primario.
  2. rs.slaveOk() -> Ese comando es la forma corta de ejecutar el siguiente comando: db.getMongo().setSlaveOk(), lo que hace es habilitar en la conexión actual las operaciones de lectura en el miembro secundario (En la réplica).
  3. use Database -> La base de datos que se va a usar para realizar la comparación con el antes y el despues de la migración.
  4. db.stats(1024*1024) -> Json con el estado de la base de datos, entre esos datos tenemos el tamaño total de la base y el tamaño por objeto entre otros. Tener en cuenta que si ponemos la escala 1024 lo tenemos en KB y si ponemos 1024*1024 lo tenemos en MB.
3- Bajar el servidor, para hacer esto hay dos alternativas:
  1. db.shutdownServer() -> Esta es una de las opciones, no es la más recomendada.
4- Eliminar el contenido de la carpeta que contiene los datos con el viejo formato, al eliminarlo forzará una re sincronización y al realizar el mismo comprimirá los datos con el nuevo engine. (Revisar que no haya una carpeta montada dentro - “df -h”)
  1. rm -r carpetaMongoConData/*
5- Agregar al archivo de configuración el uso del nuevo engine:
  1. “storageEngine=wiredTiger” -> agregar al archivo mongodb.conf
  2. mongod --storageEngine wiredTiger -> De esta forma se puede especificar en el comando para levantar el mongo. Sí se esta usando el archivo de configuración esta linea no es necesaria
6- Levantar el servidor de mongo:
  1. mongod --storageEngine wiredTiger -> comando alternativo pero poco recomendado. Recordar que si se esta usando un archivo de configuración no es necesario agregar el parámetro
7- Mientras se levanta se va a sincronizar los datos y mientras dure la sincronización el nodo va a estar desactivado en la réplica.

8- Cuando termine la sincronización hay que repetir el paso 1 y 2 para verificar los nuevos valores y comprarlos con los viejos.

9- Repetir los pasos anteriores con los demás nodos.

Los pasos descritos anteriormente es una alternativa de migrar el engine, la otra es hacer un dump de la base de datos y luego un restore, para más información de este proceso revisar el siguiente link.

https://docs.mongodb.org/v3.0/release-notes/3.0-upgrade/

Para más información de las características del mongo 3.0 ir al siguiente link.

viernes, 15 de mayo de 2015

Cada vez es mas fácil o mas difícil desarrollar?

Hola a todos, hoy les quiero hablar sobre una conversación que tuve con un compañero de trabajo, hoy en día es ¿mas fácil o mas difícil desarrollar?.
Hoy en día hay miles de Frameworks y librerías que nos facilitan muchísimo el desarrollo de nuevas aplicaciones, como ejemplo podemos tomar a Polymer, esté se basa en del desarrollo de webcomponents, la idea es construir o re-utilizar componentes desarrollados por otros o nosotros y de esta forma aceleramos el desarrollo de una web.(Tengamos en cuenta que hoy en día esta en su etapa beta, 0.9). Estos componentes desarrollados luego los usamos como si fueran un TAG mas de nuestro HTML, poner un mapa hoy en día en una web usando Polymer es tan fácil como poner el siguiente TAG:
<google-map latitude="37.77493" longitude="-122.41942"></google-map>
Con esto nos olvidamos del JavaScript y de renegar haciendo los imports y todo eso. (MAS FÁCIL IMPOSIBLE!!).
O que tal cuando queremos construir una WEB con JAVA y SPRING, con tan solo usar el annotation  @RequestMapping ya tenemos un controller (BASTA DE CONFIGURACIONES RARAS), y sin hablar si queremos usar JACKSON para convertir un objeto a JSON, con tan solo declararlo en el xml de spring como un ObjectMapper, una configuración de entre 5 y 10 lineas, no mas de eso, y tenemos un mapper a json en nuestros controllers. Recordemos que de lo contrario, tendríamos que realizar la conversión antes de retornar los datos en todos nuestros controllers.
Pero hasta acá todo fácil, si es que viviéramos en un mundo ideal, ¿qué pasa si es que falla nuestra aplicación en medio de lo que desconocemos?, imaginemos que tenemos un dato de entrada a nuestros controllers y no nos llega el dato esperado del lado del server, ¿cómo sabemos lo que paso? si lo que hace spring es lo mágico que nos facilita la vida. O que tal si nos ponemos en el caso de usar Polymer y algo fallara en el renderizado del mapa usando el TAG de Polymer, ¿Cómo sabríamos que fallo?, sí el funcionamiento interno es justamente lo que desconocemos y nos facilita la vida al desarrollar.
Eh aquí donde todos nos tenemos que darnos cuenta que si bien hoy en día teneos muchas herramientas que nos facilitan la vida a la hora de desarrollar, tenemos que tener un cierto nivel de conocimiento de las herramientas que usamos para poder afrontar los problemas que podamos llegar a enfrentar, y ahí es donde la experiencia y los conocimientos a bajo nivel (conocer las entrañas de las herramientas que usamos) nos es de buena ayuda.
Por todo esto yo diría que si bien hoy tenemos muchas herramientas que nos ayudan en el día a día en los desarrollos, el nivel de conocimientos que debemos tener hoy para solventar los posibles errores que debemos afrontar requieren un mayor nivel de conocimientos, en patrones, lenguajes, arquitecturas, tecnologías, en fin, en muchísimas mas cosas que las que requeríamos antes.

Me gustaría dejar la siguiente frase para que la tengamos en cuenta:

"Hoy en día es mas fácil iniciarnos en el mundo del desarrollo, y depende de nosotros profundizar los conocimientos"

En lo personal amo esta profesión porque siempre hay algo por aprender y tengo retos nuevos todos los días, conozco gente que admiro el como realiza las cosas, como las resuelve. Y siempre que me preguntan de que trabajo responde que yo no trabajo, hago lo que mas me gusta en el mundo.

Hakiemos nuestras vidas, nuestra forma de vivir, nuestra forma de aprender, hagamos divertido nuestro aprendizaje.

Happy Haking } ; ) by Tahuri

viernes, 26 de diciembre de 2014

Mi 2014

Hola a todos, hoy les quiero contar un poco lo que fue mi 2014.

Este año comenzo con muchos obstáculos por saltar y muchas metas por cumplir, se que no eh podido cumplir todas las metas, pero las principales gracias a dios si las pude cumplir :).

En lo personal crecí muchisimo :), y lo unico que les puedo contar es que el amor que nos tenemos con mi señora se duplico :).

En lo profesional, arranque el año Trabajando en Accenture, una empresa donde aprendí muchisimo, fue mi primer trabajo en el ambito laboral, arranque dentro de Accenture trabajando en c++ haciendo servicios web en Tuxedo para Movistar España, una gran experiencia, luego pase a un proyecto web, la www de personal (www.personal.com.ar) ahí seguí aprendiendo muchisimas cosas del mundo web y de Vignette (aunque no me guste mucho), tecnologías del back-end y del front-end :), y mis últimos meses estuve en un proyecto interno de Accenture, en ese proyecto aprendí mucho de como trabajar en equipo y que cosas no tengo que hacer cuando tengo a gente a cargo XD, aprendí como un equipo tiene que tirar y laburar a la par y la organización de la misma.

Luego gracias a dios pude cambiar de trabajo y entre a trabajar en el HSBC Banck (Mediante a Tecnosoftware), ahí conocí a una gran persona, ahí conocí a Gastón alvarez, para mi esa persona es lo que yo llamo Hacker, personas con una gran inteligencia y que cualquiera, si mantiene una charla de 10 minutos aprende cosas maravillosas, él re vivió en mi la pasión por el desarrollo y las ganas de incursionar en nuevos mundos de la informática, hoy en mi trabajo actual lo extraño mucho... ;), espero poder volver a compartir una charla con él. Otra persona interesante fue Nacho XD ese es un loco que me dejo muchas lecciones de la vida, Alan otra persona que me tuvo mucha paciencia jaja en fin, muchas personas de las cuales aprendí mucho en HSBC :).

Actualmente llevo 3 meses trabajando en despegar.com, estoy mas que chocho, lugar donde hay mucha gente que sabe y no es solo eso, actualmente estoy trabajando con tecnologías de punta, con desafíos constantes y aprendiendo mucho. :), actualmente puedo hablar de Agustin y de Lucas, dos personas que saben Bocha, Otra persona que puedo mensionar es Pablo, aunque no hablo mucho con el se nota que sabe... y la charla que dio para la comunidad de JavaScript me dejo anonadado XD, El equipo entero con el cual trabajo me deja con boca abierta, y eso, hace que sea un gusto estar trabajando con ellos, hoy deje de ser aquella persona que notaba cosas malas hechas en los proyectos que participaba, a una persona que aprende como se tienen que hacer bien las cosas :).

En cuanto a mi participación en el GDG (Google Developers Groups), fue un excelente año, hoy soy Manager del GDG La Plata, tratando de levantar la comunidad en La Plata, volví a participar en el DevFest en Buenos Aires, Conocí a Diego (Manager del GDG La Plata), una excelente persona, me hice de nuevos amigos y conocidos :), Participar en esta comunidad es lo mejor que me paso en cuanto a lo profesional, constantemente estoy conociendo a personas con un dominio de las tecnologías que da envidia jaja ojo de la buena, aquella que te contagia esas ganas de seguir aprendiendo, personas que alientan a uno a crecer constantemente y que ayudan a uno a dejar de tener los miedos al cambio, a esos cambios que nos ayudan en diferentes aspectos.

Este año fue un excelente año para mi, y la verdad que estoy super agradecido a dios y a mi querida virgen de Urkupiña por el gran año que me dieron.

Debajo les dejo los resúmenes del DevFest 2013 y 2014.

Felices fiestas a todos y les deseo un excelente 2015 :) Happy Hacking };)

DevFest 2013


DevFest 2014


lunes, 1 de diciembre de 2014

Repaso y cosas a tener en cuenta con archivos en pascal

Hola a todos, hoy vamos a repasar algunos conceptos y mencionar algunas cosas que hay que tener en cuenta a la hora de trabajar con archivos.

Marca de fin de Archivo: Todos los archivos tienen una marca de fin de archivo EOF y para consultar si estamos en el fin de archivo tenemos la sentencia eof(nombre_logico). Este nos retorna true si es que estamos en el fin del archivo.

Control de Tamaño de Archivo: Para controlar la cantidad de elementos del archivo tenemos la sentencia filesize(nombre_logico), que nos retorna un entero con la cantidad de elementos que guardamos en el archivo.

Control de posición dentro del Archivo: Tenemos una sentencia que nos retorna la posición actual del puntero (descriptor) , este es la variable que contiene la referencia lógica de nuestro archivo. La sentencia es la siguiente: Filepos(nombre_logico),  y esta nos retorna un valor de 0 al tamaño del archivo.

Ubicación física en alguna posición del archivo: Con esta operación nos podemos posicionar en cualquier lugar del archivo para leer, modificar cualquier elemento o agregar nuevos elementos, la sentencia es: seek(nombre_logico, posición), por ejemplo podemos usar esta función para pararnos al final del archivo de la siguiente forma: seek(nombre_logico, filesize(nombre_logico)).

Algunas cosas que debemos recordar es que cuando leemos un dato del archivo este puntero al archivo (nombre_logico) avanza un lugar en el archivo y cuando escribimos pasa lo mismo, por lo cual no pensemos que se queda en el mismo lugar, si no mas bien avanza una posición en ambos casos.

Por otro lado comentarles que todas estas instrucciones tienen sus equivalentes en otros lenguajes, por lo cual son facilmente trasladables a otros lenguajes.

Por ahora es todo, en los proximos post comenzaremos con la algoritmia básica sobre archivos.


Saludos y Happy Haking } ; ) .

domingo, 30 de noviembre de 2014

Crear, Cargar, Leer y Modificar Archivos

Hola a todos, hoy les voy a dejar un código donde se muestra como crear, cargar, leer y modificar los datos de un archivo en pascal.

Recuerden que este código lo pueden compilar y funciona perfectamente. También recuerden que las explicaciones de los mismos están como comentarios en el código.

domingo, 16 de noviembre de 2014

Buffers de Lectura y Escritura en Archivos

Antes de comenzar a explicar como movernos dentro de los datos de un archivo, tenemos que entender como funcionan los buffers de lectura/escritura del Sistema Operativo.

Debido a los tiempos de acceso de la RAM y del Disco Rigido, se busco una forma optima de obtener los datos, lo que se hace es leer de a bloques grandes del disco y estos datos se guardan temporalmente en memoria RAM.

Esta lectura se dispara con la petición de obtención de un dato en disco, y como se dijo, junto a ella se trae mas datos (Un Bloque), ya que es muy probable que la siguiente lectura el dato a obtener esté continua a la anterior, y por ello la siguiente vez que se requiera un dato, este no lo buscara en el disco, si no que ya estará en RAM por lo cual se ahorra mucho tiempo de espera al obtener el dato.

Pasa lo mismo con la escritura, es mas rápido escribir un bloque entero de memoria que pequeñas partes del mismo, por ello también se cuenta con un bloque para las escrituras, donde se van almacenando los datos hasta que el programa se cierre o el bloque se llene (también podemos indicar al Sistema Operativo desde el programa que escriba el buffer en disco cuando mas lo creamos conveniente).

Resumiendo un poco, recordemos que entre el disco rígido y nuestro programa vamos a tener un buffer (Estos son registros en RAM) y que gracias a ello tenemos una mejora en la performance de nuestras lecturas y escrituras.

Saludos a todos :) Happy Hacking } ; )

Archivos, Operaciones Básicas, Crear, Abrir y Cerrar

Hola a todos, hoy les vengo con las operaciones básicas para poder comenzar a trabajar con archivos, lamentablemente (para mi que me gustan otros lenguajes) voy a tener que usar pascal ya que la cátedra lo dicta con ese lenguaje.

Abajo dejo el código con los comentarios necesarios para comprender todo lo necesario para comenzar a trabajar con los archivos.

sábado, 15 de noviembre de 2014

Formas de Acceso a la Información de un Archivo

Hola a todos, hoy les vengo con las formas que tenemos de acceder a un archivo.

Existen 3 formas de acceder a un archivo, y estas son:


  1. Secuencial: El acceso a los datos es secuencial, dicho de otra forma, se accede a los datos desde el principio hasta el final, uno tras el otro.
  2. Secuencial Indizado: El acceso a los datos se realiza según algún criterio de ordenación, sin tener en cuenta el orden físico de los datos. (Esto se realiza mediante el uso de indices en los archivos), cuando utilizamos esta forma de acceso vamos a notar que después de ingresar un nuevo dato, al recuperarlo, este estará ordenado.
  3. Directo: Conociendo las características de un dato se puede obtener el mismo con un solo acceso, mas allá de su orden físico o lógico predeterminado.
A partir de ahora viene lo mas lindo, que es hacer código XD.

En los próximos post, va ir acompañado de la teoría un código ejemplo del mismo en pascal, ( si lo se pascal :(, no queda de otra, la cátedra lo usa para dictar esta materia ), pero para los que les guste otro lenguaje, voy a crear un repo en githup donde iré poniendo estos mismos ejemplos en otros lenguajes de programación, de esta forma yo practico esos otros lenguajes ( También los aprendo ) y a mas de uno le servirá para aprender un lenguaje nuevo :)


Saludos a todos, Happy Haking } ; )

Administración de Archivos

Cuando trabajemos con archivos, nos vamos a encontrar con dos tipos de administración de archivos.

Estos dos tipos de administración se basan en su visión y estos son:


  1. Visión Física: Este es el archivo que se encuentra físicamente en el disco.
  2. Visión Lógica: Este es el archivo utilizado desde el algoritmo.
Como ocurre toda la magia?

Como primer capa de administración los archivos físicos tienen a los controladores de los discos rígidos, y son estos controladores quienes crean, modifican y eliminan a los archivos físicos directamente.
Como segunda capa de administración a los archivos físicos se tiene a los Sistemas Operativos, estos son los que dan una capa de abstracción al uso de los archivos. Estos nos simplifican la manipulación de archivos. Como parte de su abstracción dan al desarrollador un serie de instrucciones para su fácil interacción con los mismos.

En la capa de administración Lógica tenemos a los distintos lenguajes de programación, estos definen un archivos lógico ( Variable ) que es inicializado por el Sistema operativos, esto se realiza mediante una instrucción que enlaza el archivo lógico con el archivo físico. Esta es la forma que tenemos de indicarle al sistema operativo que cambios queremos que realice en el archivo físico.

Cada lenguaje tiene su propia forma de enlazar el archivo lógico con el físico, en algunos de ellos nos vamos a dar cuenta cuando hace el enlace y en otros no, ya que nos abstraen un poco mas el proceso de manipulación del archivo.


Bueno por el momento esto es todo :)

Saludos y Happy Haking } ; )

lunes, 10 de noviembre de 2014

Archivos

Hola a todos, lo que vamos a ver ahora es el uso de archivos, la idea es ir entendiendo como se fue generando de a poco la necesidad de construir lo que hoy conocemos como sistemas de base de datos. Comencemos :)

Todo esto se inicio con la necesidad de persistir los datos que manipulamos en nuestra computadora, viendo que si bien , durante una sesión en la computadora estos datos persistían en la RAM, estos dejaban de existir cuando reiniciábamos la computadora, y eh! ahi el primer problema, ¿Cómo persistir nuestros datos mas allá de una sesión?, la solución fue almacenarlo en archivos en medios de almacenamiento permanente ( o secundario), como son los Discos Rígidos.

Bien pero que es un archivo?

Según Wikipedia : Un Archivo es un conjunto de bits que es almacenado en un dispositivo. Leer completo Aquí.

Según el libro que leo: Un Archivo es una colección de registros que abarcan entidades con un aspecto común y originadas para algún propósito particular.

Para mi un archivo es un conjunto de datos relacionados entre si bajo un objetivo común, ordenados homogéneamente.

Otra cosa que debemos entender es la diferencia que existe entre la RAM y los dispositivos secundarios; esta diferencia radica básicamente en dos aspectos:


  1. Capacidad: La Memoria RAM tiene un espacio limitado y por lo general los datos se procesan en ella mientras el programa este en funcionamiento, y cuando este se cierra se persisten los datos en una memoria secundaria ( como los discos rígidos).
  2. Tiempos de Acceso: Los dispositivos de almacenamiento secundario por lo general son mas lentos que la memoria RAM, y es por ello que no se trabaja directamente sobre estos medios de almacenamiento. Ya se que mas de uno estará diciendo que actualmente las memorias de estado solido, como los pen drive tiene un acceso casi igual a las RAM y con ellas se pueden alcanzar una velocidad semejante a las RAM, pero lo que no se toma en cuenta ahí es que estos medios son muy caros y que a nivel usuario tal vez son precios razonables pero cuando hablamos de grandes volúmenes de datos estos gastos por ahi no se justifican, ya que tendríamos que tener dispositivos de almacenamientos de estado solido del orden del tera byte.( de esto seguiremos hablando en post posteriores).
Bueno ya dimos el punta pie para iniciar con la parte mas linda de esto que es entender el porque y el como fue evolucionando el concepto de base de datos, ademas de que ya se acerca mas la parte que comenzar a tirar código que lo que mas me gusta XD.

Saludos a todos y Happy Haking } ; )

martes, 4 de noviembre de 2014

Categorías de usuarios de base de datos

Hoy les voy a hablar de un tema muy corto, definir los tipos de usuarios que pueden interactuar de forma directa o indirecta con una base de datos. Esto es esencial ya que el uso de una base de datos no solo se restringe al ámbito Informático.

Estos usuarios se clasifican en:


  • Administrador de BD: Este usuario es el que define el esquema, los permisos de quienes van a acceder a la base de datos, definir las restricciones de integridad para mantener la consistencia de datos, es el que interactúa directamente con el SGBD (Sisema de Gestión de Base de Datos).
  • Programadores de Aplicaciones: Son los informáticos que desarrollan los sistemas de Software.
  • Usuarios sofisticados: Usuarios que realizan consultas a la base de datos, mediante un lenguaje de consultas (LMD), Por lo general estos usuarios son del ámbito informático.
  • Usuarios especializados: Estos usuarios por lo general desarrollan aplicaciones no tradicionales ( Sistemas Expertos).
  • Usuarios Normales: Estos son los usuarios finales de toda aplicación de software, estos interactuan de forma indirecta con la base de datos.

Estas son las distintas categorías de usuarios que podemos ver en entornos de base de datos.

Bueno estos post que fui haciendo eran mas para ponernos en contexto en el mundo de las bases de datos, espero que de aquí en mas los siguientes post sean mas prácticos y nos vayan ayudando a entender que hay desde los cimientos de una base de datos hasta conocer que es lo vemos cuando interactuamos con los mismos.

Saludos a todos, Happy Haking } ; )

Modelo de Datos

Hola a todos, hoy les quiero hablar de los modelos de datos.

Lo primero que hay que entender es ¿Qué es un modelo?.

Según mi comprensión un modelo es:"Un objecto o un algo de donde se va a usar sus definiciones de como esta compuesto y las definiciones de sus estructuras para reproducir otro objeto u ente abstracto similar a este.".
Según Internet un modelo es: "Cosa que sirve como pauta para ser imitada, reproducida o copiada.".
Según la Real Academia Española:"Esquema teórico, generalmente en forma matemática, de un sistema o de una realidad compleja, como la evolución económica de un país, que se elabora para facilitar su comprensión y el estudio de su comportamiento".

Una base de datos es una estructura compuesta por varios elementos y uno de ellos es el modelo de datos, siendo este fundamental y mas importante. Recordemos que según su definición este modelo va a describir como están formados los datos en si, su semántica, sus relaciones, sus restricciones de integridad y la consistencia de la misma.

Existen tres tipos de modelos de datos:
  • Modelo lógico basado en objetos.
  • Modelo lógico basado en registros.
  • Modelo Físico.
Los modelos basados en objectos son usados para describir datos en los niveles de Vista y Lógico; mientras que los basados en registros son utilizados para describir datos en los niveles Lógicos y Físicos.

Modelos lógicos basados en objetos:

Estos modelos son utilizados para representar la información de un problema del mundo real con un esquema de alto nivel de abstracción. Dentro de estos modelos se destacan, el modelo de entidades y relaciones, y el modelo orientado a objetos.

El modelo de datos Entidad Relación (ER) está integrado por entidades y sus relaciones.Una entidad es un objeto de la realidad que se describe por un conjunto de características denominadas atributos. Actualmente, este modelo es el mas utilizado debido a su simplicidad y, al mismo tiempo, a su potencia expresiva.

El modelo orientado a objetos representa la realidad con objetos de similares características a los objetos del mundo real. En lo particular considero que este nivel es el mas adecuado para llevar adelante la mayoría de los desarrollos informáticos, debido a su gran escalabilidad.

Modelos lógicos basados en registros:

Estos modelos utilizan la estructura de datos de registros para almacenar la información en una Base de Datos, Existen tres modelos basados en registros: modelo jerárquico, modelo red y modelo relacional.

La esencia del modelo jerárquico consiste en utilizar registros vinculados entre si formando una estructura de árbol.

El modelo de red también utiliza registros vinculados que generan una estructura de grafo.

El modelo relacional utiliza un conjunto de tablas para representar la información. Una tabla se compone por filas, denominadas tuplas, y por columnas. Cada fila representa un registro, y cada columna, un campo o atributo. Estas tablas se vinculan entre si y establecen relaciones de integridad entre los datos que la componen. Este modelo es el más utilizado desde hace mas de tres decadas.

Esto es todo en cuanto a modelo de datos, para los que aún no les resulta del todo familiar los niveles de abstracción de Vista, lógicos y físicos, les recomiendo que se den una vuelta por mi anterior post que esta aquí.

Saludos a todos y Happy Haking } ; )

Niveles de visión de los datos

Hoy les vengo a hablar de los distintos niveles de visión que tienen los datos, en una base de datos.

Debido a que la interacción con las bases de datos se convirtió en una interacción muy compleja, por las estructuras de datos que cada vez se volvían mas y mas complejas, se comenzó a definir distintos niveles de abstracción para poder interactuar con la base de datos.

Estos niveles con:


  • Nivel de Vista: Esta corresponde al nivel mas alto de las capas de abstracción, en esta capa solo se muestra lo que se desea ver de la base de datos. Es posible generar varias vistas, cada una de ellas de diferentes partes de la base de datos.
  • Nivel Lógico: En esta vista se describe la base de datos completa, indicando los datos y las relaciones entre las mismas, el resultado de la misma es una estructura simple que puede conducir a estructuras mas complejas en el nivel físico.
  • Nivel Físico: Este es el nivel mas bajo de la abstracción, en el cual se describe como realmente se almacenan los datos, detallando las estructuras mas complejas de bajo nivel.
Estos son los distintos niveles de abstracción en las bases de datos.

esto es todo por este articulo.


Saludos y Happy Haking } ; )

jueves, 30 de octubre de 2014

Sistema de Gestión de Bases de Datos

Hoy toca hablar de que es un Sistema de Gestión de Base de Datos, también conocido como SGBD. Este es un conjunto de programas que nos sirve para acceder y administrar una Base de Datos (BD).

Actualmente cualquier Sistema de Software requiere tener acceso a una Base de Datos (BD) y para ello se apoya en los Sistemas de Gestión de Base de Datos (SGBD).

Un Sistema de Gestión de Base de Datos (SGBD) posee dos lenguajes diferentes, uno para especificar el esquema de la Base de Datos (BD), y otro para la manipulación de datos.

Un esquema de Base de Datos (BD) es el diseño de la estructura de la BD, es decir especifica los tipos de datos, las relaciones entre ellos, la semántica asociada y las restricciones de consistencia. Para esto se usa un lenguaje que se llama Lenguaje de Definición de Datos (LDD). Cuando se compila un archivo escrito con el LDD, se genera un archivo llamado Diccionario de Datos. Un Diccionario de Datos es un archivo con datos sobre los datos.

Para manipular los datos de la Base de Datos (BD), tenemos un lenguaje que se llama Lenguaje de Manipulación de Datos (LMD), el cual nos servirá para consultar, modificar e insertar datos en la BD.

Existen dos tipos de Lenguaje de Manipulación de Datos:

  • LMD Procedimentales: El usuario especifica todo, que datos quiere y como los obtendrá
  • LMD No Procedimentales: El usuario especifica que datos quiere pero no como los va a obtener ( Esto esta muy bueno ya que el usuario tiene menos cosas de que preocuparse :) )
Como es de suponer el LMD No Procedimentales son mas fáciles de aprender por dejar menos cosas al control del usuario y por ello es mas fácil de utilizarlo.

Finalmente los objetivos de un SGBD son:

  • Controlar la concurrencia: Controlar el acceso simultaneo de varios usuarios y asegurar que no mas de un usuario modifique un dato.
  • Tener control centralizado: Desde un mismo software tener acceso a los datos como al SGBD.
  • Facilitar el acceso a los datos: Permitir un fácil acceso a los datos, para esto provee un lenguaje, el LMD.
  • Proveer seguridad para imponer restricciones de acceso: Definir explícitamente que usuarios pueden acceder a la base de datos.
  • Mantener la integridad de la Base de Datos (BD): Posibilidad de verificar que todos los datos respeten las estructuras definidas previamente(Ej: que en un dato de tipo Integer no se coloque un String), y ademas ante un fallo verificar y reparar el dato si fuese necesario (restauración del dato).

Bueno por el momento esto es todo :), espero que hoy hayan aprendido algo mas como yo :)

Saludos y Happy Hacking :)

martes, 28 de octubre de 2014

Introducción a las Bases De Datos

Hola a todos } ; )

Después de tanto tiempo, eh vuelto a escribir un post, XD

Como tengo que rendir un final en la facultad ( UNLP Informática ) seguramente voy a ir subiendo lo que vaya aprendiendo sobre las bases de datos...

En fin comencemos.

Lo primero que tenemos que hacer es saber ¿qué es una base de datos?.

Según el libro que estoy leyendo una base de datos es: "Colección o conjunto de datos interrelacionados con un propósito especifico vinculado a la resolución de un problema del mundo real".

Bueno, vamos entendiendo por partes esta frase:

"Colección o conjunto de datos..." : Esto creo que es bastante claro, XD, esto se refiere a cualquier tipo de datos, ya sean datos en papel o  datos guardados en la pc, y que estén agrupados.

"... interrelacionados...":  Esté se refiere a que los datos agrupados tienen que tener una relación lógica, por ejemplo, los datos de una persona, cuando queremos saber los mismos por lo general siempre preguntamos por su nombre y apellido, y estos dos datos ( dato 1 : nombre, dato 2: apellido) estén relacionados entre si por el objetivo de identificar a una persona de forma precisa ( Ya sabemos que para este ejemplo se puede dar que dos personas tengan los mismos datos, pero recuerden es solo un ejemplo XD).

"...con un propósito especifico...": Esto hace referencia a que los datos que se agrupan tiene que tener un propósito por el cual se agrupan, en el ejemplo anterior el propósito fue la identificación de una persona de forma precisa.

"... vinculado a la resolución de un problema del mundo real.": Esta parte hace referencia a que esta agrupación de datos existen con el objetivo de resolver un problema del mundo real. En el ejemplo anterior el problema es identificar a todas las personas de forma precisa.

Entonces una base de datos es un conjunto de datos que se relacionan con un propósito especifico, propósito que esta vinculado a la resolución de un problema del mundo real.

Bueno eso es todo por este primer post, voy a tratar de no hacer post enormes para que no sea denso la explicación.

Saludos y Happy Hacking } ; )

lunes, 3 de marzo de 2014

C# - Outllook Access - Bug de Seguridad

Les vengo con algo que considero muy interesante, hace un tiempo que se me encomendó la ardua tarea de enviar mails con .net teniendo estos mails el permiso "Do not forward" activado y durante esta investigación me encontré con la gran sorpresa de que si usamos el PIA de Outlook para enviar mails este programa puede acceder a los datos del Outlook sin que le salte al usuario un solo cartel avisándole que un programa externo esta accediendo a sus datos. Consultado a algunos compañero (Ninguno experto en seguridad) me dijeron que este no es un error. A lo que a mi me respecta para mi si es un gravisimo error ya que tranquilamente yo podría construir un programa que se conectara a mi servidor para recibir ordenes desde el mismo, haciendo que este actúe como un zombie enviando mails a nombre del propietario a mi antojo y si no queremos parar ahí, podemos acceder a todos los mails que el atacado fue enviando, a toda su lista de contactos, a los mails recibidos en fin a todos sus datos. Prácticamente podríamos suplantar la identidad de esta persona. Y si llevamos esta situación a un ambiente corporativo esto es muy peligroso dependiendo de la jerarquía del atacado.

Debajo les dejo un código de concepto que hice en donde se abre una consola pidiendo el mail a donde se enviara el mail generado. Por el momento la única pre condición, es que se tenga Outlook instalado y configurado por lo menos con una cuenta (Recuerden que el Outlook puede tener varios cuentas instaladas -Cuentas empresariales - hotmail- gmail- yahoo- etc...)

miércoles, 22 de enero de 2014

El camino de Tahuri Killer

Lo que espero de www.tahurikiller.com.ar es que este me sirva como base para mis proyectos en los diferentes lenguajes que domino.

Sub-dominios:


www: La url base sera redirigida a este sub-dominio y en este estará alojado mi blogger, acá lo que espero es que me sirva como cumulo de mis lecciones aprendidas y que tenga un lugar a donde ir cuando busque algo que en algún momento aprendí y que luego quiero recordar algún detalle olvidado.

Java: Acá iré dejando registros de los avances de los proyectos java que vaya construyendo, este tipo de secciones serán mas técnicas (Cualquier detalle técnico y como lo aplique a este lenguaje). En esta sección tendré proyectos web como Desktop. Este sera la primer sección que voy a desarrollar ya que tengo en mente un proyecto OpenSource para Maven.

Python: Lo mismo que para la sección Java pero en esté lenguaje que desde que me inicie en el maravilloso mundo de la programación quise aprender.

Go: Lo mismo que para la sección de Java pero en esté lenguaje, de este no conozco nada por lo cual lo mas seguro que vaya haciendo un paso a paso de como se construye una aplicación en este lenguaje.

Php: Lo mismo que para la Sección de Java pero con esté lenguaje. En este aprendí todo lo que se hoy de desarrollo web :), por lo cual espero compartir muchas cosas sobre el mismo.

Estos 4 lenguajes, como algunos sabrán, son los soportados por Google AppEngine y es en ese servicio donde estarán alojados mis aplicaciones web. Cada una de esas secciones estará construida con ese lenguaje (Eso me dará una mejor visión de los pro y contra de cada uno de ellos en AppEngine).

Fuera de estos lenguajes es muy posible que suba algunas cosas mas de c-plus-plus y c-sharp. Estas secciones seguramente estarán construidas en Python o Go.

Por otro lado como también estoy tratando de practicar y aprender Ingles lo mas seguro que arme un sub-dominio "en" para publicar lo mismo que publico en el blog en Español. No prometo hacer lo miso con las secciones de Java, Python, Go Php, C-Plus-Plus y C#, pero voy a hacer todo lo posible.

Bueno eso es todo por el momento :)

Happy Hacking } ; )

Mi Primer Post :)

Hola a todos, este es mi primer articulo y la verdad que soy demasiado nuevo en esto, espero poder compartir buenos artículos e ir mejorando con el pasar del tiempo.

Porque decidí dejar el desarrollo de mi web?

porque creo que necesito dar mas tiempo a otros proyectos en los cuales puedo aprender mas que en hacer una infraestructura que ya me brinda blogger, no estoy del todo contento por esta decisión pero creo que es lo mejor por el momento para poder compartir cosas con el mundo XD ademas mi idea es usar este blog como un lugar donde ir dejando mis lecciones aprendidas para luego cuando me olvide de algún proceso tenga donde ir a buscarlo, con una explicación realizada por mi.

ZonedDateTime & OffsetDateTime

Hoy quiero compartirles algunas pruebas que realice con ZonedDateTime y OffsetDateTime. En primer lugar podemos decir que tenemos un ...