Translate

jueves, 6 de septiembre de 2012

JBoss Developer Framework


Recientemente Jboss ha liberado JBoss Developer Framework o JDF para los amigos.  El Framework en realidad es un centro de documentación central para todas las tecnologías relacionadas con JBoss y JBoss AS. Este esfuerzo de consolidación permite a los desarrolladores centrarse en un recurso único de documentos en lugar de tomar varias guías individuales de las diferentes tecnologías de JBoss (por ejemplo, una guía de Hibernate y otra para Seam).

JDF incluye más de 50 quickstarts  que son proyectos Maven que se generan con archetypes. Lo interesante es que la mayoría de los quickstarts generan los proyectos con varias capas,  Estos pueden servir ya sea como tutoriales o como la base para las aplicaciones más complicadas. Algunas de las tecnologías que incluyen: EJB, JAX-RS, JPA, JSF, CDI, HTML5, JTA, Apache Wicket...

Dejo links:
http://in.relation.to/Bloggers/AnnouncingJdfJBossDeveloperFramework
http://www.jboss.org/jdf/news/2012/06/05/welcome/

miércoles, 5 de septiembre de 2012

Queres aprender Neo4j?

Si queres aprender sobre la base orientada a grafos más popular te dejo unos link del sitio oficial:

http://neo4j.org/learn/
http://neo4j.org/resources/

Oracle habla de BigData

Oracle nos regala esta revista virtual donde habla de BigData.

Dejo link:
http://oracle.com.edgesuite.net/ebook/bigdata/

select * from Dual en Oracle



En Oracle existe una tabla llamada DUAL, normalmente se usa para referenciar consultas que no tienen una tabla sino que son resultado de una función; por ejemplo:

Select SYSDATE from dual;

De esta forma podemos saber la fecha del servidor. Pero que pasa si queremos saber que tiene dual podemos hacer lo siguiente:

desc dual


Name                    Null?    Type
 ----------------------- -------- ----------------
 DUMMY                            VARCHAR2(1)

Claro en realidad DUAL es una table con un solo registro, de esta forma siempre nos devuelve un valor las consultas a dual: Vamoa a hacer un select * from Dual para ver que nos devuelve:

select * from Dual

Y nos retornara una sola fila con un único valor X para la tabla Dual. Supongamos que migramos de oracle a otra base y hacemos uso de la tabla dual o estamos acostumbrados a usarla. Por ejemplo en Postgres no existe esta tabla solo debemos hacer el select si From:


SELECT SYSDATE
o como deberia ser en PostgreSQL
SELECT now()
o
SELECT current_date


Otra solución es crear la tabla DUAL de la siguiente manera:

 CREATE TABLE DUAL
(
DUMMY VARCHAR(1)
)

Luego insertamos el único valor: 

INSERT INTO DUAL (DUMMY)
VALUES ('X')

Eso es todo amiguitos...

Dejo link:

martes, 4 de septiembre de 2012

¡Aprende Haskell por el bien de todos!



Bienvenido a ¡Aprende Haskell por el bien de todos! Si estás leyendo esto probablemente quieras aprender Haskell. Pues bien, has venido al sitio adecuado, pero primero vamos a hablar un poco sobre esta guía.

Decidí escribir esta guía porque quería arraigar mi propio conocimiento de Haskell y porque pensé que podía ayudar a la gente que empezaba con Haskell. Existen bastantes manuales y guías sobre Haskell por la red. Cuando empecé con Haskell no lo leí un único documento. La forma en la que aprendí Haskell fue leyendo varios artículos y guías, porque explicaban el mismo concepto de diferentes formas. Así, yendo a través de varios documentos, fui capaz de juntar todas las piezas y entonces todo encajó. De modo que, esto es un intento más de añadir otro útil documento para aprender Haskell de forma que tengas más oportunidades de encontrar uno que te guste.

Así comienza el sitio que tiene como objetivo enseñarnos haskell, es muy recomendable.

Dejo el link:
http://aprendehaskell.es/

Yahoo! Hadoop Tutorial


Un excelente tutorial de hadoop hecho por la gente de yahoo!

Dejo link:
http://developer.yahoo.com/hadoop/tutorial/

domingo, 2 de septiembre de 2012

Como instalar oracle 11g en fedora y no morir en el intento


Pruebas muy difíciles me ha dado la vida pero nada tan difícil como instalar Oracle. Es imposible!! Vamos a intentar instalar oracle en fedora 17 64 bits. Para esto vamos a bajar los instaladores de el siguiente link:

 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

Hay que registrarse y deben compran la licencia.

Luego de bajar los zip hay que descomprimirlo:

unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip

Si todo salio bien se creo una carpeta llamada database
Ahora tenemos que modificar el archivo /etc/hosts porque tiene que tener todo el nombre del servidor. Para esto nos logeamos como root. El archivo debe quedar con la siguiente forma:
<IP-address>  <fully-qualified-machine-name>  <machine-name>

Ahora vamos a agregar unos parametros a /etc/sysctl.conf (como root)

fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
# semaphores: semmsl, semmns, semopm, semmni
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default=262144
net.core.rmem_max=4194304
net.core.wmem_default=262144
net.core.wmem_max=1048586
Ahora corremos el siguiente comando para aplicar los nuevos parametros:
/sbin/sysctl -p

Ahora debemos agregar la siguientes lineas en el "/etc/security/limits.conf"
oracle              soft    nproc   2047
oracle              hard    nproc   16384
oracle              soft    nofile  1024
oracle              hard    nofile  65536

Y ahora debemos modificar "/etc/pam.d/login" y agregar la siguiente linea si no existe:

session    required     pam_limits.so

Despues tenemos que desactivar el firewall eso lo podemos hacer con la aplicaci{on propia para firewall

Ahora a desactivar SELINUX para esto editamos "/etc/selinux/config" y editamos la linea

SELINUX y ponemos:
SELINUX=disabled

Ahora a Instalar librerias:

yum install binutils
yum install compat-libstdc++-33
yum install compat-libstdc++-33.i686
yum install elfutils-libelf
yum install elfutils-libelf-devel
yum install gcc
yum install gcc-c++
yum install glibc
yum install glibc.i686
yum install glibc-common
yum install glibc-devel
yum install glibc-devel.i686
yum install glibc-headers
yum install ksh
yum install libaio
yum install libaio.i686
yum install libaio-devel
yum install libaio-devel.i686
yum install libgcc
yum install libgcc.i686
yum install libstdc++
yum install libstdc++.i686
yum install libstdc++-devel
yum install make
yum install numactl-devel
yum install sysstat
yum install unixODBC
yum install unixODBC.i686
yum install unixODBC-devel
yum install unixODBC-devel.i686

 Ahora debemos crear los siguientes grupos:

groupadd oinstall
groupadd dba
groupadd oper
groupadd asmadmin

useradd -g oinstall -G dba,oper,asmadmin oracle
passwd oracle

Ahora creamos el directorio donde oracle va a ser instalado:

mkdir -p /u01/app/oracle/product/11.2.0/db_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01

Vamos a editar el archivo  "/etc/redhat-release" y simulamos que es un red-hat borrando lo que tiene y escribiendo:

redhat release 5

por ultimo tenemos que ir al .bash_profile logeados como usuario oracle y agregamos

# Oracle Settings
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=fedora14.localdomain; export ORACLE_HOSTNAME
ORACLE_UNQNAME=DB11G; export ORACLE_UNQNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=DB11G; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

Ahora salimos de la session y nos logeamos como oracle y ejecutamos
./runInstaller y seguimos el wizard...

















Y tuvimos éxito!!

Viste que fácil que era...

Dejo link:


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