jueves, 30 de agosto de 2012

Descent|OS 3.0

Descent OS wallpaper submission 

Que onda si mezclamos el sistema operativo más usado con el escritorio más elegante? Obtenemos Descent|OS que es un linux basado en Ubuntu pero con escritorio MATE, para el que no sabe MATE es un fork de Gnome 2 muy elegante y fácil de usar.

La misión del proyecto es proporcionar un entorno de escritorio intuitivo y  moderno.

Dejo link:
http://www.descentos.org/




miércoles, 29 de agosto de 2012

Pattern Matching


Se acuerdan cuando iban al jardín de infantes que había una actividad en la cual de una fila de patitos había que encontrar el que miraba en la dirección contraria. Bueno en programación Pattern Matching no tiene nada que ver con los patitos.

Pattern Matching nace del paradigma funcional aunque hoy en día lenguaje multiparadigma lo implementan como Scala. Pattern Matching permite definir funciones por medio de macheo de parámetros y resultados. Veamos un ejemplo en Haskell de definición de factorial:

factorial 0 = 1
factorial n = n * factorial (n - 1)

A primera vista parece recursividad, pero esto viene del paradigma funcional por lo tanto no existe secuencia. Para ver la diferencia entre la forma de resolver el problema voy a resolver lo mismo en C++

int factorial(int n) {
      if (n == 0) {
             return 1;
      } else {
            return factorial(n-1);
      }
}

Si comparamos nos ahorramos 5 lineas; pero el tema no es solo escribir menos; sino que cual les parece más legible? cual es más simple?

Muchos lenguajes implementan pattern matching, al venir del paradigma funcional normalmente los lenguajes funcionales como Erlang; vamos a hacer la función de factorial en Erlang.

fac(0) -> 1;
fac(N) when N > 0, is_integer(N) -> N * fac(N-1).

Se puede ver que en este caso se indica que debe ser positivo el numero; si se ingresa un valor negativo lanza un error. Ojo esta restricciones también la podíamos hacer en Haskell.

Factorial con ML:

fun fac 0 = 1
     | fac n = n * fac (n - 1)

Otros lenguajes multiparadigma nos permiten jugar con Patter Matching como Scala:

def fact(n: Int): Int = n match {
    case 0 => 1
    case n => n * fact(n - 1)
  }

En este caso se define fact que devolverá un entero, y que el parámetro n debe matchear con 0 y devuelve 1 o con cualquier otro valor y devolverá n * fact(n - 1).

Por ejemplo Kotlin permite hacer pattern Maching por el tipo de la siguiente manera:

when (x) {
  is Int -> print(x)
  is List<Int> -> print(x.sum())
  !is Number -> print("Not even a number")
  else -> print("can't do anything")
}

Donde x es una variable que llega de parámetro.

Por ejemplo con F# una función de figonacci nos queda de la siguiente manera:

let rec fib n =
    match n with
    | 0 -> 0
    | 1 -> 1
    | _ -> fib (n - 1) + fib (n - 2)

Si lo comparamos con Haskell:

fib[0|1]:=1
fib[n_]:= fib[n-1] + fib[n-2]

En Haskell podemos utilizar el | para decir esto o aquello y el _ para decir cualquier cosa que venga.

Las implementaciones son muchas pero la idea en general es la misma; Pattern Matching permite mayor legibilidad y comodidad a programar y va ganando terreno entre los lenguajes más modernos.



sábado, 25 de agosto de 2012

Performance en Postgres





Al parecer cuando instalamos una base de datos Postgres; se instala una base de datos de juguete; es decir que se debe trabajar mucho para dejarla a punto para producción. Los parametros por defecto son muy inferiores a lo que puede soportar realmente Postgres.

El primer paso para entender como mejorar la performance de su base de datos es entender el ciclo de vida de una query:
  • La transmisión de la consulta a la base de datos back-end
  • Análisis de cadena de consulta
  • Planificación de consulta para optimizar la recuperación de datos
  • Recuperación de datos de hardware
  • Transmisión de resultados a cliente
Primero paso la transmisión de la consulta a la base de dato en este caso no se puede hacer mucho; solo en el caso de que la query sea muy grande se puede crear un store procedure para mejorar la trasmición de esta forma no viaja la query completa sino el nombre del store.

El segundo paso es el analisis de cadena que tambien se puede mejorar haciendo un store procedure.

La planificación de la consulta es donde realmente comienza PostgreSQL hacer algún trabajo. En esta etapa se comprueba si la consulta está bien para la versión de PostgreSQL. También se analiza el SQL para determinar cuál es la forma más eficaz de recuperar sus datos. ¿Debemos utilizar un índice? y si es así ¿cuál? Estas son algunas de las decisiones de la base de datos hace que en este punto del proceso. Este paso puede ser eliminado si la consulta se prepara previamente.

Ahora que PostgreSQL tiene un plan de lo que cree que es la mejor manera de recuperar los datos, es el momento de ejecutar el plan. Si bien hay algunas opciones de optimización que ayudarían, este paso se optimiza principalmente por la configuración de hardware.

Y, finalmente, el último paso es la transmisión de los resultados al cliente. Si bien no hay ninguna opción de optimización real de este paso, se debe tener en cuenta que todos los datos que están estrayendo desde el disco y se envía a través del cable al cliente. Reducir al mínimo el número de filas y columnas para sólo aquello que es necesario a menudo puede aumentar el rendimiento.

Vamos a ver los parametros que hay que tocar para mejorar la performance de nuestra base. Se pueden cambiar los parametros de postgres de diferente formas pero la más facil es modificar el archivo postgresql.conf ejecutando SHOW config_file  podremos saber donde se encuentra este archivo.

max_connections = <num> esta opción establece el número máximo de backend de base de datos para tener en un momento dado. Utilice esta función para asegurarse que no tenga tanto clientes y puedan matar la base.

shared_buffers = <num> La edición de esta opción es la forma más sencilla de mejorar el rendimiento de su servidor de base de datos. El valor por defecto es bastante bajo para la mayoría del hardware moderno. General se dice que esto se debe establecer en aproximadamente el 25% de la memoria RAM disponible en el sistema. Como la mayoría de las opciones que se describen aquí, simplemente tendrá que probar en diferentes niveles (tanto hacia arriba como hacia abajo) y ver lo bien que funciona en su sistema particular.

effective_cache_size = <num> Este valor es la cache de postgres. Esto se debe establecer la cantidad de memoria asignada a shared_buffers más la cantidad de caché del sistema operativo disponible. A menudo esto es más de 50% de la memoria total del sistema.

work_mem = <num> Esta opción se utiliza para controlar la cantidad de memoria utilizando en las operaciones de ordenación y tablas hash. Si bien es posible que necesite aumentar la cantidad de memoria se debe tener cuidado de no aumentarlo demasiado.

max_fsm_pages = <num> Esta opción ayuda a controlar el mapa de espacio libre. Cuando algo se elimina de una tabla no se elimina del disco inmediatamente, simplemente se marca como "libre" en el mapa de espacio libre. El espacio se puede volver a utilizar para cualquier inserción en la tabla. Si su configuración tiene una alta tasa de eliminaciones e inserta puede ser necesario aumento de este valor.

commit_delay = <num> y commit_siblings = <num> Estas opciones se utilizan en conjunto para ayudar a mejorar el rendimiento de escritura múltiples transacciones que están comitiando al mismo tiempo. Si hay una serie de backends commit_siblings activos en el instante en que la transacción se comitea, el servidor espera microsegundos commit_delay para tratar de confirmar las transacciones a la vez.

random_page_cost = <num>controla la forma en PostgreSQL considera las lecturas no secuenciales. Un valor más alto hace que sea más probable que un recorrido secuencial.

Dejo link:
http://wiki.postgresql.org/wiki/Performance_Optimization

Rosa una distro linux que se las trae...



 ROSA Marathon 2012 sistema operativo es una distribución de Linux con ampliación de los 5 años de soporte técnico con un enfoque en los clientes empresariales.

El producto incluye un sistema de escritorio hasta al día de funcionamiento con una interfaz fácil de usar y un conjunto de aplicaciones de software cuidadosamente seleccionados por nuestros desarrolladores. Después de instalar ROSA usuario de Escritorio consigue listo lugar de trabajo sin necesidad de instalar suite ofimática, editor gráfico, el software anti-virus, reproductores multimedia, los clientes de ICQ tipo, diccionarios y software básico como una adición.


ROSA Marathon 2012 estará disponible en dos ediciones: Free (incluye software libre solamente) y Extended Edition (con componentes que no son libres y software propietario, como codecs multimedia), permitiendo a los usuarios seguir ya sea el espíritu del Software Libre, o llegar a tanta funcionalidad como sea posible "fuera de la caja".

ROSA Marathon 2012 sistema operativo es el primer producto de la empresa ROSA creados utilizando el software de desarrollo propio y entorno de compilación - ROSA ABF - que nos da un control completo de la base de paquetes y herramientas de desarrollo, garantizando la independencia tecnológica y la alta calidad de la distribución. Esto también permite a la empresa ROSA garantía de 5 años de soporte técnico que implica mucho tiempo las actualizaciones de software de seguridad, correcciones de errores para los componentes del sistema y las actualizaciones de software de aplicación a las nuevas versiones reconocidas como estable.


ROSA Marathon 2012 está disponible en los principales idiomas europeos: Inglés, francés, alemán, italiano, portugués, rumano, ruso, español, ucraniano.

Dejo link:

http://www.rosalab.com/

miércoles, 22 de agosto de 2012

El blog de Carlos Ble

Quiero recomendar este blog sobre tecnología y agilismo. Hay muchos post muy claros tanto en Ingles como en castellano.

Dejo el link:
http://www.carlosble.com/

Savepoint


Cuando jugábamos algún juego de aventura había una luz, una bandera o un objeto medio raro que indicaba que si moríamos en ese nivel no tendríamos que hace de nuevo todo el nivel sino que comenzaríamos de ese punto.


Algo así son los savepoint de las bases de datos, si vemos la wikipedia podemos leer:

"Un savepoint (en español, punto de recuperación) es una forma de implementar subtransacciones (también conocidas como transacciones anidadas) dentro de un sistema gestor de base de datos relacional indicando un punto dentro de unatransacción de base de datos que puede ser "rolled back" (devuelta) sin afectar a cualquier trabajo realizado en la transacción antes de que el punto de recuperación fuera creado. Varios savepoints pueden existir dentro de una transacción individual. Los Savepoints son útiles para implementar recuperación de errores complejos en aplicaciones de base de datos — si ocurre un error en el medio de una transacción de múltiples sentencias, la aplicación puede ser capaz de recuperarse del error (devolviendo, "rolling back", hasta un savepoint) sin necesidad de abortar la transacción completa."

Pero como puedo utilizar este punto de recuperación? En Postgres, es como esta definido en el siguiente ejemplo:

BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

En el ejemplo el insert con valor 2 no se aplica dadoque hace un rollback al savepoint my_savepoint.

En Oracle es muy similar veamos otro ejemplo:

DECLARE
   emp_id        employees.employee_id%TYPE;
   emp_lastname  employees.last_name%TYPE;
   emp_salary    employees.salary%TYPE;
BEGIN
   SELECT employee_id, last_name, salary INTO emp_id, emp_lastname,
     emp_salary FROM employees WHERE employee_id = 120;
   UPDATE emp_name SET salary = salary * 1.1 WHERE employee_id = emp_id;
   DELETE FROM emp_name WHERE employee_id = 130;
   SAVEPOINT do_insert;
   INSERT INTO emp_name VALUES (emp_id, emp_lastname, emp_salary);
EXCEPTION
   WHEN DUP_VAL_ON_INDEX THEN
      ROLLBACK TO do_insert;
      DBMS_OUTPUT.PUT_LINE('Insert has been rolled back');
END;
/

Luego de correr esta instrucción podemos ejecutar cualquier instrucción y romper todo. Que tenemos un punto donde podemos volver.

lunes, 20 de agosto de 2012

Otro movimiento de Oracle que genera desconfianza...


El mundo del open source ve con desconfianza a MySQL desde la compra de Oracle a Sun. Nuevamente hay controversias dada la desaparición de los paquetes de prueba (test cases) y otras partes en la última versión de MySQL 5.5.27. Lo que indica el esfuerzo de oracle de cerrar la base de datos MySQL.

La cuestión se remonta a un descubrimiento reciente que la última versión de MySQL tiene correcciones de errores, pero sin tener ni una sola algún caso de prueba asociados con ella. Eso crea todo tipo de problemas para los desarrolladores que no tienen ninguna garantía de que el problema ha sido resuelto.

Para los observadores, estos movimientos no se ven como simples descuidos. Más aún, parece que Oracle está haciendo sus pruebas de revisión y las historias de código cerrado.

Espero que esto sean solo rumores; MySQL es una gran base de datos, y su mayor fuerza es la comunidad si Oracle destruye esta comunidad el futuro de MySQL es incierto.


jueves, 16 de agosto de 2012

Argentina 70 en el ranking mundial de innovación

Leyendo el diario me encuentro con esta noticia:


El Ranking Global de Innovación 2012, elaborado por la Organización Mundial de la Propiedad Intelectual de las ONU, y la escuela de negocios INSEAD, con sede en Francia, clasificó a 141 países según su capacidad de innovación, o habilidad para inventar nuevos productos. Es un indicador clave: en una economía global basada en el conocimiento, donde las empresas que inventan nuevos productos a menudo tienen un valor que supera al PBI de países enteros, la innovación es un factor de crecimiento cada vez mayor.

Según este ranking, los diez líderes mundiales en innovación son Suiza, Suecia, Singapur, Finlandia, Inglaterra, Holanda, Dinamarca, Hong Kong, Irlanda y Estados Unidos. No sólo se toma en cuenta las nuevas patentes registradas por cada país -EEUU está muy por delante del resto- sino también las inversiones en investigación y desarrollo, y el clima empresarial y regulatorio.

Ningún país latinoamericano, salvo Chile, figura entre los 50 líderes mundiales en innovación. Chile está en el puesto 39, seguido por Brasil (59), Colombia (65), Uruguay (67), Argentina (70), Perú (75), Guyana (77), México (79), Paraguay (84), Panamá (87), El Salvador (93), Ecuador (98), Guatemala (99), Nicaragua (105), Honduras (111), Bolivia (114) y Venezuela (118) que sigue cayendo en picada y cerca del final de la lista, debajo de Zimbabue, Lesoto y Uganda.


...


Señaló que "los países de bajo desempeño latinoamericanos están mejorando, pero el resto del mundo está avanzando más rápido y en Asia mucho más''.

Y el autor del articulo indica de forma muy acertada: 

"Con respecto a la baja calificación de los países latinoamericanos, se debe en gran medida a que la mayoría de los presidentes se resiste a reconocer que la región se está quedando atrás en calidad educativa, ciencia y tecnología. Prefieren no hablar de estudios como el Ranking de Innovación Global, o los tests internacionales PISA de estudiantes de 15 años, o de las estadísticas de la Oficina de Patentes y Marcas Registradas de EEUU, que muestran que Corea del Sur sola registró 13.200 patentes el año pasado, mientras Brasil sólo registró 250, México 120 y Argentina 50."

Coincido con el autor creo que en gran parte el problema bien de los gobiernos que no invierten en educación y en innovación. Pero echar la culpa al gobierno es muy simplista y muy argentino. Todos somos culpables; la industria debería invertir un poco los dolares que llegan de la exportación de software (por ejemplo) y invertir en capital humano; generar productos innovadores que son una inversión más productiva que tener dolares bajo el colchón. La facultad deberían investigar pero no tan lejos de la industria; producir conocimiento practico y producto innovadores. Sin duda debemos arriesgarnos un poco más; creer en nosotros.    


Fuente:
http://www.diariodecuyo.com.ar/home/new_noticia.php?noticia_id=533633


Escribe Javascript en cualquier lenguaje con Babylscript


Babylscript es una herramienta que permite escribir javascript en el lenguaje que uno lo desee y luego traducirlo a javascript. Esta herramienta esta pensada para gente que no habla ingles; también es muy útil para culturas que no tienen nuestro abecedario rusos, vietnamitas, turcos, chinos, etc...

Dejo el link:
http://www.babylscript.com

miércoles, 15 de agosto de 2012

The Architecture of Open Source Applications




















The Architecture of Open Source Applications es un blog que se realizo a partir de 2 libros; que muestran arquitecturas de proyectos open source muy exitosos; la verdad que buena idea!. Con esto aprendemos de aciertos y de grandes aciertos! Entre los proyectos que se describen en estos 2 libros puedo citar: Eclipse, Git, Asterisk, Mercurial, Moodle, Nginx, etc...

A raíz de estos dos libros se creo un blog que es para promocionarlos pero de igual manera es interesante; espero que siga creciendo.

Dejo el link:
http://www.aosabook.org/blog/


Javascript Fundamentals: Development for Absolute Beginners


Si queres iniciarte en javascript estos más de 21 episodios te pueden ayudar. Son videos en los cuales se enseñan las bases del lenguaje. Lo único criticable es que tenes que tener instalado silverligth para ver los videos, pero se instala rápido.

A la vez estuve viendo el sitio channel 9 y esta bueno; muy completo.  Y después estuve viendo learnvisualstudio y también parece buena; muchos vídeos de la tecnología .net de microsoft.

Dejo los links:

http://channel9.msdn.com/Series/Javascript-Fundamentals-Development-for-Absolute-Beginners
http://channel9.msdn.com/
http://www.learnvisualstudio.net/courses/

martes, 14 de agosto de 2012

Enroll in Code School.

Sin lugar a duda el mejor sitio de cursos les aconsejo que realicen cursos en code school.

Dejo el link para inscribirse:

http://zfer.us/cwkg7

sábado, 11 de agosto de 2012

Suse cumple 20 años y OpenSuse 7 añitos

Se cumplen 20 años de Suse y 7 de OpenSuse; este calculo esta hecho sobre el comienzo del proyecto y no del release.

Dejo esta infografía que muestra los mayores logros del proyecto:


Feliz Cumpleaños!!

jueves, 9 de agosto de 2012

Introduction to MongoDB for Java, PHP and Python Developers

Muy bueno este resumen sobre mongoDB!!

Dejo link: http://www.infoq.com/articles/mongodb-java-php-python

JAMon, mirando como viene la mano...




The Java Application Monitor (JAMon) es una herramienta para monitorizar aplicaciones web hechas en java. Basicamente se agrega el monitor a jetty o tomcat y este intercepta todos los pedidos; registrando el momento que entraron y salieron. Como un portero botón que esta mirando a que hora llegas y a que hora salís.

JAMon es simple, fácil de usar, fácil de configurar y es software libre. Y permite de forma sensilla monitorizar una aplicación java.

Para que usaríamos JAMon?
  • Para garantizar la aplicación cumple con sus requisitos de rendimiento
  • Para garantizar la aplicación cumple con los requisitos de escalabilidad
  • Para detectar si la aplicación tiene errores o arroja excepciones no deseados
  • Para asegurar que todas las partes de la aplicación fueron probados adecuadamente (cobertura)
  • Para garantizar que la aplicación está funcionando correctamente en la producción como parte de las pruebas de post-producción
  • Para obtener información de la producción e iniciar un ciclo de retroalimentación entre el desarrollo, prueba y producción que mejoren la aplicación


¿Qué tipo de estadísticas de hace y cómo puedo verlos?

Jamón puede ser pensado como un cronómetro de software que asocia una etiqueta con los tiempos de ejecución y algunos agregados, otras estadísticas. JAMon trae consigo un completo view que se puede desplegar fácilmente; brindando toda la info de nuestra aplicación.


 ¿Cómo puedo agregar JAMon en mi aplicación?

Podemos incorporar JAMon en sus aplicaciones utilizando cualquiera de estos enfoques:
  • Utilizando el JAMon Servlet Filter - El filtro de servlet Jamón pasa automáticamente nombres de las páginas web de la aplicación (servlets, JSP y mucho más) para el JAMon , permite a los desarrolladores realizar un seguimiento de rendimiento de la página sin cambiar una sola línea de código de aplicación. Todo lo que se necesita es copiar algunas líneas estándar pocos en el archivo web.xml aplicaciones.
  • El controlador de JDBC de JAMon - es un proxy que puede monitorizar cualquier driver JDBC (que ha sido probado con Sybase / MySQL / Oracle / HSQLDB y otros),  Lleva la cuenta de las consultas más recientes ejecutados N y N excepciones más recientes lanzados. Utilizando el controlador de JAMon JDBC no requiere ningún cambio de código de aplicación. Basta con sustituir la información del controlador original (nombre de la clase del controlador, y la dirección URL) con JAMon.
  • Utilizar la interfaz de supervisión JAMon - Como se puede ver a continuación, puede controlar cualquier interfaz Java simplemente por el paso de una implementación de la interfaz con el método de monitor de JAMon , a continuación, llamar a métodos en el objeto como lo haría si el objeto no se controló. La firma de clase y el método aparece como una etiqueta en los informes de JAMon :


MyInterface myObject=(MyInterface) MonProxyFactory.monitor(new  MyImplementation());
            myObject.myMethod(); // Monitored!


  • Por último, puede llamar explícitamente al inicio JAMon / métodos de detención de la siguiente manera. Además, cuenta que, debido al hecho de que la etiqueta JAMon  es simplemente una cadena de Java, los datos dinámicos / tiempo de ejecución, como un nombre de usuario, se puede incorporar fácilmente en la etiqueta.


import com.jamonapi.*;

// page hits by user name using runtime data

Monitor mon = MonitorFactory.start("homePage.jsp-"+userName);             ...code that you wish to time...
mon.stop();


JAMon es una gran herramienta de software libre,muy útil para la monitorización de aplicacioes java.

Dejo links:
http://jamonapi.sourceforge.net/testingwithjamon.html
https://javasight.wordpress.com/2010/10/04/monitoring-with-spring-and-jamon-using-jamonperformancemonitorinterceptor/
http://jamonapi.sourceforge.net/

domingo, 5 de agosto de 2012

Blog sobre integración continua

La integración continua, según Martin Fowler, es una práctica de desarrollo de software en la que los miembros de un equipo de desarrollo integran frecuentemente su trabajo. Cada integración se comprueba de un modo automático (incluso con pruebas), para detectar errores de integración lo más frecuentemente posible.

Esta definición la saque del siguiente blog sobre integración continua: http://informatica.coutemeier.com/ que esta muy bueno. Se los recomiendo.

viernes, 3 de agosto de 2012

Javathcript, corriendo Lisp en tu browser!!


Javathcript.js permite correr un lisp en tu browser. Una vez agregado el script Javathcript.js va a analizar los script que tengan como lenguaje type="text/lisp" y va a ejecutar script list en tu browser.

Veamos un ejemplo:


<script type="text/lisp">
(let*
( (button (getElement "btn"))
(nameField (getElement "name"))
(clickHandler (lambda () (alert (concat "Hello " (get nameField "value"))))) )
(set button "onclick" (export clickHandler))
)
</script>


La verdad que es bastante impresionante; dejo links:
http://kybernetikos.github.com/Javathcript/

jueves, 2 de agosto de 2012

Codecademy

Codecademy es una pagina muy buena para hacer cursos, se especializa en la web; javascript, HTML, CSS; Jquery, etc.. pero también tiene cursos de lenguaje como por ejemplo python.

Dejo el link:
http://www.codecademy.com

Ahora comenzó un nuevo curso de python: http://www.codecademy.com/es/tracks/python

miércoles, 1 de agosto de 2012

Node?? js??


Node.js es una plataforma basada en runtime de Chrome para procesar JavaScript, el objetivo es la construcción de aplicaciones web fácil, rápido y de forma escalables. Dejo unos cuantos recursos para ir estudiando:

http://www.ibm.com/developerworks/ssa/java/library/j-nodejs/index.html
http://visionmedia.github.com/masteringnode/ (este es un libro, esta bueno!)
http://stella.laurenzo.org/2011/03/bulletproof-node-js-coding/
http://nodetuts.com/
http://howtonode.org/
http://nodeguide.com/
http://www.nodehispano.com/

y la pagina oficial: http://nodejs.org/