lunes, 18 de noviembre de 2013

MySql vs PostgreSql, porque no restarle importancia al elegir.

Como programadores, es común no darle mucha importancia al motor que gestionara nuestra base de datos, pero la verdad es que este es un punto tan critico e importante que puede hacer que nuestros desarrollos especialmente los mas grandes y complejos se vuelvan una pesadilla en temas de desempeño y escalabilidad.

En desarrollos que tienen altas consultas a la base de datos y/o volúmenes de datos grandes, así como una gran complejidad en dichas consultas, el tema de elegir el motor de nuestra base de datos cobra especial relevancia. Si bien tema del diseño de la base también es critico, aquí solo tocaremos el tema de la elección del motor, en esta ocasión entre el famoso MySql y uno menos conocido pero no por ello malo si no todo lo contrario, hablamos del Oracle de código abierto, PostgreSql.


Muy poco de historia.


MySql.


Es un motor muy popular y que casi todos sabemos su historia al menos de forma muy espartana pero la conocemos, sabemos que fue comprada por Sun y posteriormente por Oracle y que bajo su sombra "gran cosa no ha crecido" o no como muchos esperaríamos y la perdida de usuarios a ultimas fechas demuestra que esta cayendo de la gracia de muchos. Aunque algunos le tenemos aun cariño porque probablemente fue el primer motor de base de datos con el que tuvimos contacto, así que hay sentimientos involucrados para muchos.


PostgreSql.


Es un motor muy antiguo, que se le puede seguir la pista hasta principios de la década de los 80's, mas viejo que yo así es. Con una historia interesante donde empresas han ido y venido intentado beneficiarse de este motor, pero PostgreSql se ha mantenido incólume ante el despiadado paso de los años que sabemos que en esta industria se mueven como huracanes y nada esta garantizado ni siquiera por algunos años, pero ahí esta viendo pasar los años XD, la verdad es que si ha crecido y ganado mucha madurez.


Aclarar un punto.


Antes de seguir, debemos de estar conscientes de que en el mercado de gestores de base de datos, existen dos "ligas" las grandes y las menores, donde se mueven todos los gestores habidos y por haber, en las menores tenemos por ejemplo a Sqlite y en las mayores a Oracle, Microsoft Sql Server y a PostgreSql, MySql empezó en las ligas menores y ahora esta queriendo meterse en las grandes. Pues hora del enfrentamiento, que empiece la batalla.


Características.


MySql


- modelo relacional.

- multiple soporte a sistemas operativos (windows, linux, mac, unix, bsd, symbian, amigaos, etc)
- licencia GPL
- control de acceso (Native Network Encryption, patch access, run unprivileged)
- indices (full-text, hash, r-/r+ tree)
- particionado (compuesto rango + hash, hash, lista, rango)
- procedimientos almacenados
- triggers
- cursores
- soporta inner joins, inner selects, merge joins, outer joins, union
- ACID
- Integridad referencial
- Transacciones
- Agrupacion de transacciones
Uso de multihilos mediante hilos del kernel.
hasta 64 índices por tabla
- replicacion
Uso de multihilos mediante hilos del kernel
- soporte a estandar SQL
- tablas temporales
- vistas

PostgreSql


- modelo objeto relacional

- soporte a multiples sistemas operativos (windows, linux, mac y bsd) menos que en mysql
- licencia GPL
- Control de acceso (audit, brute-force protection, enterprice directory compatibility, native network encryption, password complexity rules, patch access, resource limit, run unprivileged, security certificacion)
- indices (bitmap, expresion, full-text. gin, gist, hash, partial, r-/r+ tree, reverse) notar que tiene la capacidad de indexar sobre tipos de datos creados por el usuario.
- particionado (compuesto rango + hash, hash, lista, native replication, rango, shadow)
- procedimientos almacenados. 
- funciones (soporta funciones en segundo plano)
- triggers
- cursores
- soporta inner joins, inner selects, merge joins, outer joins, union, intersects, excepts, windowing functions
- ACID
- Integridad referencial
- Transacciones
- transacciones distribuidas (Permite a PostgreSQL integrarse en un sistema distribuido formado por varios recursos)
- funciones personalizadas
- alta concurrencia (Mediante un sistema denominado MVCC (Acceso concurrente multiversión, por sus siglas en inglés) PostgreSQL permite que mientras un proceso escribe en una tabla, otros accedan a la misma tabla sin necesidad de bloqueos. Cada usuario obtiene una visión consistente de lo último a lo que se le hizo commit. Esta estrategia es superior al uso de bloqueos por tabla o por filas común en otras bases, eliminando la necesidad del uso de bloqueos explícitos)
- altamente escalable, al mometo de expandir el hardware y usar muchos servidores de bases de datos postgreSql le aventaja a MySql.
- Herencia de tablas
- commits asíncronos
- backups en caliente (no es necesario detener el servicio)
- plantillas
- replicacion, aunque en este tema lleva ventaja sobre de MySql, ya que muestra mejor rendimiento en sistemas grandes
- procesamiento paralelo
- soporte a estandar SQL 
- tablas temporales
- vistas
- querys paralelos (muy bueno)
- tipos de datos geométricos y monetarios
- Roles

Rendimiento.


Si bien, MySql muestra un mejor rendimiento que PostgreSql en cuanto a consultas simples se refiere (siendo realistas difícilmente una aplicación medianamente compleja solo tendrá consultas simples) en cuanto se trata de consultas complejas con muchas tablas involucradas, toma ventaja PostgreSql, incluso MySql llega a presentar problemas para resolver ciertas consultas (no se si sea un bug) pero tuve una ocasión donde simplemente MySql (hace algunos días, obviamente con la ultima versión) no pudo resolver una consulta, pasaban los minutos y nada, no fue hasta que indexe las tablas involucradas que pudo resolver la consulta, caso contrario con PostgreSql que la resolvió en segundos y sin indexar tablas. Mirando por Internet leí un blog de alguno al que la paso algo parecido donde su consulta tardo mas de 40 minutos! y no fue hasta que indexo que pudo resolver su problema, este tipo de cosas dejan mal parado a MySql.


Un punto final.


Quiero esgrimir un argumento que tal vez no sea muy valido, pero yo creo que MySql bajo la sombra de Oracle no ha crecido y no lo va hacer, ¿porque? simple... se llama "conflicto de intereses" ¿quien es el mayor vendedor de bases de datos del mundo? así es, es Oracle! ¿de verdad piensan que va a dejar que rebase a su producto estrella?. El que exista una versión community no significa que quien tenga la sarten por el mango sea la comunidad, es Oracle quien tiene la ultima palabra, seguramente esto ha provocado un malestar y resultado de esto la desbandada de desarrolladores que antes agrupaba MySql y que han iniciado nuevos proyectos o unido a otros como son MongoDB y MariaDB, sin ir mas lejos el mismísimo creador de MySql inicio MariaDB, texto tomado de wikipedia "Monty decidió crear esta variante porque estaba convencido de que el único interés de Oracle en MySQL era reducir la competencia que MySQL daba al mayor vendedor de bases de datos relacionales del mundo que es Oracle". Al fin! no soy el único que piensa esto. Así que sin ser pesimistas, yo la verdad no lo usuaria en un proyecto de largo plazo.


Conclusión.


Con solo ver la tabla de características se puede ver quien juega en la liga mayor y quien si bien ya no esta en las menores aun NO se puede decir que esta en las grandes, en el tema de rendimiento están muy parejos, ya que MySql al querer meterse en las grandes ligas a sacrificado rendimiento por mayor robustez haciendo que las ultimas versiones consuman mas memoria RAM y procesador. En cambio PostgreSql a ultimas fechas se ha enfocado a mejorar el rendimiento y facilidad de uso para los desarrolladores, en el apartado de escalabilidad es sabido que lleva mas madures PostgreSql, aunque MySql no se queda muy atrás.


Finalmente dado que un gestor de base de datos no solo es desempeño y menos cuando se trata de desarrollos grandes, el claro ganador es PostgreSql.


Saludos y hasta la próxima, espero sea de su utilidad, si andan un poco confusos con este tema.




viernes, 20 de septiembre de 2013

Codigo Colaborativo en SublimeText 2

El código colaborativo consiste simplemente en trabajar en equipo, el mismo desarrollo en tiempo real, generalmente la mejor forma de trabajar es en parejas de programadores como así lo sugiere el eXtreme Programming, esto tiene muchas ventajas ya que dos mentes piensan mejor que una, además de que se sufre (o mas bien se goza) un proceso de aprendizaje y crecimiento que no logras trabajando solo, a mi modo de ver esto revolucionara el trabajo de un programador. En una analogía con los procesadores modernos es el siguiente paso, de trabajar secuencialmente (un solo núcleo) a trabajar multi-hilos (dos o mas núcleos) eso aumenta mucho las capacidades.
Bueno sin mas preámbulo y relleno XD, veamos cómo trabajar en equipo con sublime text 2 que para muchos y ese es mi caso, es el editor definitivo. vamos al grano.
Descargamos del siguiente sitio el plugin zookraton.
descomprimimos su contenido en el directorio:
path_a_sublimetext2\data\packages\
renombran la carpeta que les extrajo el zip a "Collaboration".
Ejecutan sublimetext
Crean o abren un script y teclean la siguiente combinación de teclas:
1. - Ctrl+alt+s . Esto les creara el servidor localmente. También les saltara una alerta del firewall, deben darle permiso de lo contrario no funcionara o pueden abrir el puerto 6633.
2.- Ctrl+alt+c . Esto les permite conectarse a un servidor y les pregunta por la ip, en este caso ustedes mismos son el servidor y también se conectaran como cliente, por lo que le dan "localhost" y luego enter.
3.- Ctrl+alt+a . Con esto agregan un archivo actual al servidor, escriben el nombre del script que abrieron o crearon.
Ahora ya está el archivo en el servidor y listo para editarse por todos los que se unan, para ello vamos a otra máquina que esté conectada a la misma red que la nuestra (por ahora para probar que funciona)
Entonces instalamos exactamente igual el plugin en el sublime text 2 de la otra máquina y realizan el paso 2 poniendo la ip de nuestra maquina servidor, en seguida en la segunda maquina tecleamos:
Ctrl+alt+o . Esto si es que funciono todo bien, les permite agregar un documento que se encuentre en el servidor, les aparece un recuadro con los archivos disponibles, seleccionan el que acabamos de agregar y listo, prueben modificando el archivo en el servidor y en la segunda maquina.
¡Maravilloso! ¿no?. Si requieren de usar esto fuera de la red local y usarlo desde internet, no tienen más que re direccionar (hacer NAT) desde el router-modem (mal llamado solo modem) todas las peticiones del puerto 6633 hacia la maquina servidora, investigan la ip publica por ejemplo desde acá
O pueden optar por un servicio como no-ip para que siempre este disponible.
Le dan dicha ip a su amigo o colega programador, las instrucciones de cómo usarlo y a gozar de productividad :) no lo usen de chat XD porque entonces es el efecto contrario.

lunes, 15 de abril de 2013

IE6 el mejor navegador web que ha existido




IE6 es de lejos el mejor navegador de la historia. ¿Para que alinearse a los estándares  si violarlos ha sido la regla por muchos años en el navegador por excelencia?

¿Para que reinventar la rueda? si no me crees visita esta pagina, donde se exponen razones de mucho peso para apoyar esta idea, donde también podrás firmar por salvar al mejor navegador que ha existido.

http://www.saveie6.com/index.php

Nota: por supuesto que esto es una broma XD

sábado, 5 de enero de 2013

Cookies Persistentes

Todo programador web sabe que es una cookie y para que sirve, son simples y pequeños archivos que contienen información asociada a un sitio web y que esta puede ser de hasta 4Kb.

A veces se nos a presentado el problema de hacer persistir ciertos datos de lado cliente de forma mas permanente, por ejemplo hacer que el navegador recuerde la sesión de un usuario o mejor aun hacer que esta sesión sea cross browser, eso quiere decir que podría recuperar una sesión desde otro navegador, la solución es una cookie persistente, también conocida como cookie zombie.

La forma de lograrlo es crear un sistema capaz de crear la cookie en varias vías y luego recuperar la información requerida, pero también debe verificar si en alguna de las vías la cookie ya no existe, entonces crearla de nuevo usando el valor en una de las otras cookies y para ello se utilizan métodos variados como pueden ser:

El método convencional con un Script de lado servidor que crea la cookie.

LSO que son cookies Flash.

Cookies almacenadas en imágenes.

El sistema HTML5 de almacenamiento.

Entre otros mas. Bien esto es mas complicado de lo que parece, pero si no quieres complicarte mucho o aprender a hacerlo que mejor que aprender de otros, puedes usar o echarle un vistazo a un proyecto llamado evercookie de Samy Kamkar. Este sistema crea la cookie en las siguientes vías:


 - Estándar HTTP Cookies (PHP)
 - LSO (Flash Cookies)
 - Almacenamiento Silverlight
 - En valores RGB (PNG)
 - En el Historial Web
 - HTTP ETags
 - Cache web
 - Cacheo en window.name
 - Almacenamiento userData de Internet Explorer
 - HTML5 Session Storage
 - HTML5 Local Storage
 - HTML5 Global Storage
 - HTML5 Database SQLite


Por cierto que este es cross browser y puedes descargar el código fuente que viene incluso con un ejemplo de uso. La pagina del proyecto es:

http://samy.pl/evercookie/

Por cierto si piensan hacer uso de el recuerden la ética y no le den mal uso "un gran poder conlleva una gran responsabilidad" XD

Saludos espero les sea de utilidad.


jueves, 3 de enero de 2013

El peligroso XSS

El XSS (Cross Site Scripting) o secuencia de comandos en sitios cruzados, es una técnica de hacking que vulnera la forma en que esta programado un sitio web, básicamente se basa en el descuido del programador que al hacer un sitio piensa que solo se le dará la utilidad para la cual lo creo y dado que las computadoras obedecen ciegamente es posible ejecutar código malicioso si el programador no tiene cuidado en la confianza que le da a los datos de entrada y salida. El XSS se vale de tecnologías de lado cliente como javascript, vbscript y html.

Si bien es un ataque que se da de lado cliente(navegador) no significa que estamos exentos de responsabilidad como programadores de un sitio, ya que este ataque se lleva a cabo a través de nuestros sitios, por lo que podría quedar en algunos casos, comprometida la seguridad de nuestro propio sitio.

Es usado principalmente para robar información delicada, phishing, secuestrar sesiones y lograr entrar en un sitio restringido. Existen dos tipos de XSS, el indirecto y el directo:

El indirecto o reflejado. Consiste en modificar las variables que una aplicación web usa para funcionar, ejemplo los valores que se pasa google en la URL a la hora de hacer las búsquedas, y puede valerse de GET,  cabeceras HTTP (POST) y Cookies

El directo o persistente. Este se basa en embeber código html y javascript en aplicaciones que presentaran dicho código, ejemplo un sitio de foros, donde los usuarios publican temas y respuestas que serán almacenados en una base de datos y posteriormente para su visualización serán leídos.

Para darse una idea, nada como unos ejemplos muy simples. Tenemos el siguiente sitio que usa a otra pagina, pero lo hace por medio de una variable pasada por URL.

www.miweb.com/paginax.php?pagina=paginados.php

Luego podemos ejecutar código arbitrario.

www.miweb.com/paginax.php?pagina=<script>alert(document.cookie);</script>

o ejecutar código usando caracteres en Hexadecimal


www.miweb.com/paginax.php?pagina=%3Cscript%3alert(document.cookie);%3C%2Fscript%3

Lo anterior es un ataque de tipo reflejado.

El directo se basa en el echo de que un sitio web es capas de guardar el código inyectado y posteriormente interpretado en el navegador de la victima. Por ejemplo, el siguiente código inyectado desde un <input>

<script>for (;;) alert("bucle"); </script>

Podría provocar una especie de denegación de servicio en el navegador de la victima.

Desde luego estos ejemplos son muy ingenuos y no son útiles para nada, pero solo sirven para dar una idea. La forma de mitigar este problema, es simplemente validando todos los datos que vendrán del lado cliente.

Usar validaciones tanto de lado cliente como de lado servidor es lo recomendable, la expresiones regulares ayudan mucho, por regla general nunca confíes en el dato que vendrá de lado cliente, por lo tanto valida siempre según el dato que esperas, por ejemplo, en un formulario que pide datos como correo o numero de teléfono  se debe validar que dichos campos tengan solamente caracteres de ese tipo.


Aquí hay un PDF que me sirvió para darme una introducción al tema http://xsser.sourceforge.net/xsser/XSS_for_fun_and_profit_SCG09_(spanish).pdf

Y que mejor que la guía OWASP sobre el tema, los PDF están en esta pagina.

https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

Saludos.