Comprobar si un número es primo: optimizado en PHP

Durante mi carrera universitaria, en diversas materias nos hacían optimizar el código para obtener los mejores resultados posibles en lo que a eficiencia / tiempo de ejecución se refiere. Ha día de hoy esto parece no ser tan importante: hay supercomputadoras incluso en el mismo escritorio del usuario final que lo hacen todo rapidísimo aun metiéndole auténtica basura (las cosas como son). De ahí la crítica de los desarrolladores backend hacia los frontend (en teoría, INSISTO, en teoría, los menos eficientes en lo que a optimación de código se refiere).

¿Qué hacéis metiendo un for dentro de otro for y luego dentro de otro for más? En mis tiempos, eso podía romper el programa. Otro ejemplo son los SELECT que se hacen sobre las bases de datos por parte de algunos junios (y no tan juniors), donde se extrae información innecesaria para lo que se necesita (una fecha, una cantidad de artículos que quedan en stock, etc. son suficientes en algunos casos).

De cara a mostraros como trabajo (OJO, seguro que hay mil cosas que encontraréis que se puedan mejorar, se agradecen comentarios), os pondré un ejemplo que me ha «llegado» para su optimización: realizar una comprobación masiva de si un conjunto de números son de forma individual primos o no.

Podéis descargar el código desde mi GitHub: https://github.com/irotdev (dentro de PHPLogicProblems, MyInvestigations, con el nombre de prime-numbers.php)

Para realizar esta pequeña prueba, lo primero que hago es crearme funciones básicas. Una de ella es un generador de números a comprobar, los cuales tienen en cuenta la cantidad de números que se desea probar ($numbersToCheck) y el valor máximo que puede tener dicho número ($maxNumber). Esos números se obtienen de forma aleatoria por lo que la ejecución de las comprobaciones puede tardar menos o más (aunque normalmente tiempos similares), lo cual depende también de mi sistema y de lo que esté haciendo en ese momento.

function getRandomListOfNumbers($numbersToCheck, $maxNumber): Array {
    $listOfNumbers = array();
    for ($i = 0; $i < $numbersToCheck; $i++) $listOfNumbers[] = rand(2, $maxNumber);
    return $listOfNumbers;
}

Hay otras funciones que creo para cosas secundarias como la propia para obtener el listado de números primos (la cual utiliza la función isPrime0 e isPrime1, las menos eficientes) y una función para mostrar la lista de dichos números primos:

function listOfPrimeNumbers($numMaxToCheck): array {
    $primeNumbers = array();
    $primeNumbers[] = 2;
    for ($i = 3; $i <= $numMaxToCheck; $i++) {
        $isPrime = true;
        foreach ($primeNumbers as $value) {
            if ($i % $value == 0) {
                $isPrime = false;
                break;
            }
        }
        if ($isPrime) $primeNumbers[] = $i;   // Add a new number prime
    }
    return $primeNumbers;
}


function showListOfPrimeNumbers($numMaxToCheck) {
    $listPrimeNumbers =  listOfPrimeNumbers($numMaxToCheck);
    foreach ($listPrimeNumbers as $value)
        echo $value . " ";
}

Como es lógico, hay una función principal que es la que uso para llamar a las funciones que comprobarán uno a uno si un valor es o no primo con una u otra función, lo cual se utilizará para comprobar su tiempo de ejecución y por tanto su eficiencia:

function theChecker($numbersToCheck, $maxNumber): void {
    echo "<br><br>**************************************************<br>";
    echo "***** [$numbersToCheck] numbers to check with a maximum of [$maxNumber]";
    echo "<br>**************************************************<br><br>";
    $listOfNumbersToCheck = getRandomListOfNumbers($numbersToCheck, $maxNumber);

    
    // isPrime0
    echo "Checking 'isPrime0':<br>";
    $time_start = microtime(true);
    foreach ($listOfNumbersToCheck as $value) {
        echo " [$value is" . (isPrime0($value, $maxNumber) ? " TRUE" : " FALSE") . "] ";
    }
    $time_end = microtime(true);
    $diff = $time_end - $time_start;
    echo "<br>isPrime0 TIME: " . number_format($diff, 10) . "<br><br><br>";


    // isPrime1
    echo "Checking 'isPrime1':<br>";
    $time_start = microtime(true);
    $listPrimeNumbers =  listOfPrimeNumbers($maxNumber);
    foreach ($listOfNumbersToCheck as $value) {
        echo " [$value is" . (isPrime1($value, $listPrimeNumbers) ? " TRUE" : " FALSE") . "] ";
    }
    $time_end = microtime(true);
    $diff = $time_end - $time_start;
    echo "<br>isPrime1 TIME: " . number_format($diff, 10) . "<br><br><br>";

    ...

}

Prueba para 1 número con el número más grande de hasta 100000:

Para empezar las pruebas, utilizaré 4 funciones para hacer lo mismo pero de forma distinta.

Por un lado, isPrime0 e isPrime1, los cuales comprueban si el número pasado está dentro de la lista de números primos generada con anterioridad (isPrime0 lo genera en cada llamada e isPrime1 lo genera una vez para todas las llamadas que se haga a esa función). Ambos usan la función listOfPrimeNumbers antes indicada:

function isPrime0($num, $maxNumberToCheck): bool {
    $listPrimeNumbers =  listOfPrimeNumbers($maxNumberToCheck);
    foreach ($listPrimeNumbers as $numPrime)
        if ($num == $numPrime)
            return true;

    return false;
}


function isPrime1($num, $listPrimeNumbers): bool {
    return in_array($num, $listPrimeNumbers);
}

Por otro lado, isPrime2 e isPrime3, los cuales recorren y comprueban 1 a 1 desde el número 2. Los diferencia una cosa muy sencilla pero que ahorrará tiempo, y es que isPrime3 no recorre todos los números desde 2 hasta el número actual a comprobar, sino hasta la raíz cuadrada de dicho número a comprobar. ¿El motivo? Si un número no es divisible por su un valor inferior al de su raíz cuadrada, no será divisible por ningún otro (esto son matemáticas básicas).

function isPrime2($num): bool {
    for ($i = 2; $i < $num; $i++)
        if ($num % $i == 0)
            return false;

    return true;
}


function isPrime3($num): bool {
    for ($i = 2; $i <= sqrt($num); $i++)
        if ($num % $i == 0)
            return false;

    return true;
}

Además, añado isPrime4, el cual me «ahorra» el calcular la raíz cuadrada en cada vuelta del bucle. Lo que hago es almacenarla en una variable y cuando hay muchas comprobaciones (el número a comprobar si es primo es muy elevado) entonces mejorará el tiempo de ejecución:

function isPrime4($num): bool {
    $max = sqrt($num);
    for ($i = 2; $i <= $max; $i++)
        if ($num % $i == 0)
            return false;

    return true;
}

En las pruebas realizadas se nota una clara diferencia entre las funciones isPrime0 e isPrime1 respecto a las de isPrime2 e isPrime3. En algunos casos marca 0.0000000000 de tiempo de ejecución y en otros 0.0000009537 (entre otros), siendo esta última cifra muy repetida, lo que me lleva a pensar que es un tiempo mínimo que coge mi máquina (podría investigar sobre ello pero no me llama la atención, es un tiempo ínfimo).

Tiempos para el número máximo de 100:

  • isPrime4: 0.0000009537
  • isPrime3: 0.0000009537
  • isPrime2: 0.0000009537
  • isPrime1: 0.0000159740
  • isPrime0: 0.0000209808

Tiempos para el número máximo de 100000:

  • isPrime4: 0.0000009537
  • isPrime3: 0.0000009537
  • isPrime2: 0.0000009537
  • isPrime1: 0.8091838360
  • isPrime0: 0.8060331345

Prueba para 5 números con el número más grande 100000 (1 millón, aumentando 1 cero):

Dado que los resultados eran bastante simples, decidí aumentar a 5 pruebas (números a comprobar) y con unos máximos más grandes (hasta 1 millón puede ser cada uno de esos números). Aquí los resultados evidenciaban que los códigos de isPrime0 e isPrime1 eran mucho menos eficiente. No es buena idea, al menos con 5 números a comprobar, realizar un listado con todos los primos posibles:

Tiempos para el número máximo de 100:

  • isPrime4: 0.0000009537
  • isPrime3: 0.0000021458
  • isPrime2: 0.0000050068
  • isPrime1: 0.0000109673
  • isPrime0: 0.0000531673

Tiempos para el número máximo de 100000:

  • isPrime4: 0.0000040531
  • isPrime3: 0.0000059605
  • isPrime2: 0.0000038147
  • isPrime1: 0.8105370998
  • isPrime0: 4.0665309429

Dados los resultados y viendo que isPrime0 e isPrime1 no pueden competir con las otras funciones, las descarto para las siguientes pruebas.

Prueba para 50 números con el número más grande 10000000 (10 millones, aumentando otro cero):

Al aumentar significativamente la cantidad de números a comprobar si son o no primos, el tiempo de ejecución aumenta significativamente en la función de isPrime2, y apenas un poco en isPrime3 e isPrime4. En todo caso, aquí si que no hay lugar a dudas y muestra cómo isPrime4 es mejor a isPrime3 que a su vez es mejor a isPrime2.

Tiempos para el número máximo de 100:

  • isPrime4: 0.0000100136
  • isPrime3: 0.0000121593
  • isPrime2: 0.0000159740

Tiempos para el número máximo de 10000000:

  • isPrime4: 0.0003030300
  • isPrime3: 0.0005500317
  • isPrime2: 0.5178680420

Buscando el límite en la peor función, prueba para 100 números con el número más grande 1000000000 (añado dos 0, ya son 1000 millones):

Pues si, me quedé en el borde de mi i5 de 11ª generación y 64GB de RAM… Se puede ampliar el tiempo de ejecución de PHP (no sé si lo sabréis) pero no me hizo falta. Aquí me va «sobrando» el caso de isPrime2, el cual disparó mi tiempo de ejecución a 35 segundos en el peor de los casos. Las otras funciones, sin embargo, ni media centésima de segundo. Destaco los dos casos más grandes:

Tiempos para el número máximo de 100000000:

  • isPrime4: 0.0011880398
  • isPrime3: 0.0018908978
  • isPrime2: 6.6131939888

Tiempos para el número máximo de 1000000000:

  • isPrime4: 0.0018699169
  • isPrime3: 0.0033600330
  • isPrime2: 35.8763570786

Optimizando el código, añadiendo una nueva función a partir de la idea de recorrer «la mitad».

A partir de aquí dejaré atrás la función isPrime2, tras ver que su tiempo de ejecución se dispara. La idea de una nueva función, isPrime5, es la de «saltar» de 2 en 2 las comprobaciones ya que, teniendo en cuenta que todos los números pares no son primos (a excepción del 2), es absurdo comprobar que un número muy grande es primo (como 938416837, el cual es primo) y, para llegar hasta ahí, se haya comprobado si es divisible entre los números 4, 6, 8, 10, 12, …. 12992132132, 12992132134… Con solo comprobar si es divisible entre 2 sería más que suficiente.

function isPrime5($num): bool {
    $max = sqrt($num);
    if ($num % 2 == 0) return false;
    for ($i = 3; $i <= $max; $i+=2)
        if ($num % $i == 0)
            return false;

    return true;
}

Eso provocaría que el número de comprobaciones pasase a la mitad cuando hay un número primo grande impar (si hay muchos primos grandes, el tiempo se dispararía). Los resultados fueron los predecibles:

Tiempos para el número máximo de 100000000:

  • isPrime5: 0.0007750988
  • isPrime4: 0.0011410713
  • isPrime3: 0.0025339127

Tiempos para el número máximo de 1000000000:

  • isPrime5: 0.0019609928
  • isPrime4: 0.0033550262
  • isPrime3: 0.0071518421

Optimizando lo optimizado, atajando los números pares y los divisibles entre 3.

Dándole una vuelta más, creo isPrime6 y paso a la siguiente lógica: Ya había quitado para que no analizase los números pares. Ahora quiero quitar que analice los números divisibles entre 3. Ahora bien, el sumatorio ya no queda igual de bonito ($i+=2), sino que quedaría como un ($i+=6) pero haciendo la comprobación también de +2 de $i, es decir, 2 comprobaciones: el nuevo $i y el $i+2:

Valor $iDivisible 2Divisible 3Acción a realizar
2SI
3SI
4SI
5Comprobar si es primo
6SISI
7Comprobar si es primo
8SI
9SI
10SI
11Comprobar si es primo
12SISI
13Comprobar si es primo
14SI
15SI
16SI
17Comprobar si es primo
18SISI
19Comprobar si es primo
20SI

Viendo esto, se ve el salto de 5 y 7 hacia 11 y 13, y luego hacia 17 y 19. Es decir, hay que añadir un salto de 6 (el resultado de 2×3), cogiendo dicho resultado y sumando 2 (5+6 = 11 y sumando 2 es = 13). Los resultados son incluso mejor que lo esperado:

function isPrime6($num): bool {
    $max = sqrt($num);
    if (($num % 2 == 0) || ($num % 3 == 0)) return false;
    for ($i = 5; $i <= $max; $i+=6)
        if (($num % $i == 0) || ($num % ($i+2) == 0))
            return false;

    return true;
}

Tiempos para el número máximo de 1000000000:

  • isPrime6: 0.0008680820
  • isPrime5: 0.0017590523
  • isPrime4: 0.0033211708
  • isPrime3: 0.0060191154

En principio, si se añade esto para los números divisibles entre 5, 7, 11, 13, 17, 19 y algunos números primos más iniciales, la eficiencia puede crecer más. La pregunta es, ¿es necesario? Depende. Si me piden calcular una cantidad disparatada de números de un tamaño bastante grande SI merecería la pena. Pero viendo que la comprobación de 100 números de un valor de hasta 1000000000 (1.000.000.000, es decir, 1000 millones) es de solo 6 centésimas de segundo… muy disparatada debe de ser la cantidad de números.

Podría ampliarse en una ampliación de pruebas para ello. No obstante, si alguno es tan friki como yo como para haber llegado hasta esta línea, siéntete libre de bajarte el código de GitHub y seguir haciendo pruebas. Se agradece un enlace o reconocimiento en tal caso please ;-)

Estoy de vuelta (creo)

Tras tanto tiempo sin escribir, quizás sería adecuado una escusa… Y bien, así es la vida, llena de prioridades, y ciertamente había dado prioridades a otras cosas. ¿La escusa? Ah, si, pues he estado inmerso en otros proyectos, algunos personales y otros laborales. Si bien siempre podemos sacar cosas para «casi todo», soy de los que me gusta «terminar algo» para empezar «otro algo».

Mi idea es seguir escribiendo aquí de lo que se: PHP, Java, bases de datos como MySQL, metodologías ágiles, e incluso alguna cosa más. Si bien hace unos años hice algunas cosas para Android, a día de hoy quiero profundizar en mobile (sin abandonar mi parte backend) y mejorar en Android y Kotlin, por lo que quizás también escriba puntualmente de eso.

Es raro el día que escapan de encontrar «una piedra en el zapato» (un problema) que no merezca ser compartido para dar la valoración y resolución, pero eso lleva tiempo, y no siempre tengo ese «margen» diario para poder indicarlo aquí como se merece. Aunque en algún momento pueda escribir 2 o 3 artículos en una semana, tened en cuenta que si hago paréntesis y no publico durante un tiempo es porque, simplemente, lo necesito para mí y los míos.

Tengo la suerte de tener un «trabajo estable» que me permite llevar a cabo otros proyectos, y que incluso algunos de esos proyectos los puedo volcar a dicho «trabajo estable» para seguir creciendo y manteniéndome actualizado. Algunos de esos proyectos son el de reserva de portátiles y salas, y el de gestión de guardias de mi trabajo (ya os lo haré saber cuando tenga algo resolutivo de ello).

Mientras tanto, haceros saber que mañana mismo os publicaré algunas investigaciones y pruebas que estoy haciendo para optimizar el cálculo de la obtención de si un número es o no primo en PHP. Lo haré por «bombardeo» (mandaré muchas pruebas de golpe con números aleatorios).

Aprovecho para daros a conocer mi github, de nombre irotdev (hace referencia a mi antiguo nick del IRC IRoT.. IRC son cosas antiguas, no te asustes). Estoy empezando a publicar alguna cosilla pero… ¡no tengo tiempo!

Formatos al mostrar resultados de números decimales en Java con printf

Posibilidades al mostrar por pantalla en Java Cuando trabajamos en Java desde consola / shell, a la hora de mostrar resultados por pantalla hay tres opciones principales: Print (system.out.print): Imprime por pantalla una cadena. Println (system.out.println): Imprime por pantalla una cadena y luego baja una línea (conocido como “retorno de carro”). Printf (system.out.printf): Imprime por pantalla con formato, lo […]
http://dlvr.it/RlybPG

Formatos al mostrar resultados de números decimales en Java con printf

Posibilidades al mostrar por pantalla en Java

Cuando trabajamos en Java desde consola / shell, a la hora de mostrar resultados por pantalla hay tres opciones principales:

  • Print (system.out.print): Imprime por pantalla una cadena.
  • Println (system.out.println): Imprime por pantalla una cadena y luego baja una línea (conocido como «retorno de carro»).
  • Printf (system.out.printf): Imprime por pantalla con formato, lo que permite redondear decimales, alinear números en columnas, justificar el texto (a izquierda o derecha), mostrar fecha y hora en varios formatos, y representar números en formato exponencial (notación científica).

 

Mostrando números decimales con printf en Java

La última opción de las anteriormente indicadas permite dar formatos a los números decimales, y es lo que se verá a continuación.

A la hora de imprimir números decimales (float o double) utilizaremos %f en caso de querer mostrarlos de su forma normal, y %e para mostrarlos en notación científica (notación exponencial).

Con %f es posible especificar decimales, espacios en blanco a la izquierda, indicar el signo positivo (+), e incluso separar los miles y millones con puntos. Puesto que es más fácil apreciarlo con un ejemplo, se muestra el siguiente código a continuación:

public class ProgramaFormatos {
  public static void main(String[] args) {
    double cantidad = 71283.567811;

    System.out.println();
    System.out.println("Ejemplo para mostrar un mismo valor con varios formatos"); 

    // El simbolo %n es un salto de linea
    // Formato normal double y float
    System.out.printf("%nEl valor de la variable cantidad es %f", cantidad); 

    // Formato notación científica
    System.out.printf("%nEl valor de la variable cantidad es %e", cantidad); 

    // Formato con 2 decimales
    System.out.printf("%nEl valor de la variable cantidad es %.2f", cantidad);

    // Formato con 6 decimales
    System.out.printf("%nEl valor de la variable cantidad es %.6f", cantidad);

    // Formato con simbolo + y 2 decimales
    System.out.printf("%nEl valor de la variable cantidad es %+.2f", cantidad);

    // Formato con espacios en blanco (suman 11 todas las cifras) con 2 decimales
    System.out.printf("%nEl valor de la variable cantidad es %11.2f", cantidad); 

    // Formato con espacios en blanco (suman 11 todas las cifras) con símbolo + y 2 decimales
    System.out.printf("%nEl valor de la variable cantidad es %+11.2f", cantidad); 

    // Formato con ceros delante (suman 11 todas las cifras) con 2 decimales
    System.out.printf("%nEl valor de la variable cantidad es %011.2f", cantidad); 

    // Formato con ceros delante (suman 11 todas las cifras) con símbolo + y 2 decimales
    System.out.printf("%nEl valor de la variable cantidad es %+011.2f", cantidad); 

    // Formato separando los miles (71,283.567811 en lugar de 71283.567811) 
    System.out.printf("%nEl valor de la variable cantidad es %,f", cantidad);
  }
}

En los comentarios del código podéis ver los detalles de lo que se pretende hacer en cada línea. Los resultados son los siguientes:

formatosjavaprintfdecimal

 

  • El valor de la variable cantidad es 71283,567811
  • El valor de la variable cantidad es 7,128357e+04
  • El valor de la variable cantidad es 71283,57
  • El valor de la variable cantidad es 71283,567811
  • El valor de la variable cantidad es +71283,57
  • El valor de la variable cantidad es XXX71283,57 (cada X corresponde a cada espacio)
  • El valor de la variable cantidad es XX+71283,57 (cada X corresponde a cada espacio)
  • El valor de la variable cantidad es 00071283,57
  • El valor de la variable cantidad es +0071283,57
  • El valor de la variable cantidad es 71.283,567811

Espero que esto le sirva de ayuda a los futuros programadores que se están formando.

Un saludo

 

CLASSPATH en Windows 10 para programar en Java

En este artículo pretendo ayudar a mis alumnos de Programación e-learning de primer curso que tienen problemas para configurar el CLASSPATH. Para ello, utilizaré un ejemplo en Windows 10 de la forma más básica que se me ocurre, ya que están teniendo problemas a la hora de compilar un sencillo ejercicio (todos hemos sido novatos alguna vez).

El código de dicho ejercicio que se pretende ejecutar es el siguiente:

/**
* La clase MiModulo implementa una aplicación que
* simplemente imprime "Módulo profesional - Programación" en pantalla.
*/
class MiModulo {
  public static void main(String[] args) {
    System.out.println("Módulo profesional - Programación"); // Muestra la cadena de caracteres.
  }
}

Dicho código tendremos que guardarlo en un archivo con extensión .java (por ejemplo, «MiModulo.java».

Para compilarlo y hacer que funcione, una vez instalado el JDK de Java se tiene que asociar la carpeta «bin» del JDK a nuestro sistema a través de la variable de sistema CLASSPATH. Para ello localizamos la ruta de dicha carpeta (en mi caso es «C:\Program Files\Java\jdk1.8.0_101\bin») ya que nos hará falta.

Sabremos que no lo tenemos asociado si al acceder al terminal de Windows 10 (CMD), al intentar ejecutar el comando «javac»nos indica que no existe o que no se reconoce dicho comando:

classpath1

¿Cómo se configura el CLASSPATH?

En Windows 10 es muy sencillo. Busca en tu ordenador: variables de entornoclasspath2

Elige la primera opción que aparece (como aparece en la imagen de la derecha).

A continuación, pulsa donde pone «Variables de entorno» (ver imagen de abajo).

classpath3

En la siguiente pantalla, teniendo seleccionado el “PATH” que aparece en la parte de abajo, pulsar “Editar” (dicha pantalla tendrá un aspecto similar al de la siguiente imagen).

classpath4

En la nueva pantalla, le dais a nuevo y ponéis la ruta de la carpeta BIN del JDK, tal y como veis abajo (el resultado debe de añadir la línea que veis marcada en azul).

classpath5

Una vez pulsado «Aceptar» en todas las ventanas, tendréis que cerrar el terminal de Windows (CMD) y volverlo a abrir. Si ponéis el comando «javac» ahora os tiene que indicar las opciones que tenéis para dicho comando (ver imagen inferior).

classpath6

Realización del ejercicio.

Los comandos a utilizar en Java para ejecutar una aplicación sencilla como la indicada anteriormente son muy básicos. Para ello, una vez guardado el ejercicio, compilaremos la aplicación (de tal forma que se transforme MiModulo.java a MiModulo.class):

Desde el CMD, para acceder a la carpeta donde tenenemos el código utilizaremos la orden «cd». Puedo saber la ruta exacta pinchando sobre la ruta de las carpetas y copiándola y pegándola en el terminal:

classpath7

A continuación accedemos al terminal (CMD) y a dicha carpeta, e incluso podemos ejecutar la orden «dir» para ver los archivos que hay en la carpeta. A continuación, compilamos el archivo java con la orden «javac MiModulo.java»:

classpath8

Si volvéis a hacer un «dir» en el CMD, veréis que se ha creado un nuevo archivo: «MiModulo.class». Para ejecutarlo, utilizaréis la orden «java MiModulo», y el resultado será la impresión de texto por pantalla: «Módulo profesional – Programación«. Ahora bien, esto puede dar un error como el que se ve en la siguiente imagen. Para evitarlo, ejecuta el comando con la opción «-cp .» : «java -cp . MiModulo»:

classpath9.PNG

Este error se debe a problemas con varias librerías (probablemente, a más de uno os ha pasado e incluso yo he forzado para que me pase). Las letras con acentos no se ven bien, aunque eso es más habitual y no es un grave problema realmente.

Bien, con esto ya tendríais vuestro primer programa en Java.

Un saludo

Cada negocio necesita su página web

Aun me sorprenderme que existan personas que al abrir un nuevo negocio todavía se planteen la posibilidad de abrir una página web o no, sobre su negocio. En los tiempos que corren no tener presencia en Internet o no darle la importancia que merece es un gran error.

A continuación podéis ver un listado

  1. Una página web debe de ser una tarjeta de presentación, tanto de tu negocio como de ti mismo.
  2. Hoy en día los futuros clientes suelen informarse primero a través de tu página web. Te buscarán en Google, y si no apareces no existirás para ellos.
  3. A través de ella puedes mantener siempre informados a tus clientes sobre ofertas, nuevos productos o servicios e incluso interaccionar con ellos.
  4. Gracias a tu página, tu negocio permanecerá abierto las 24 horas del día y todos los días del año.
  5. Puede llegar a ser tu gran canal de comunicación con tus clientes. Sus opiniones pueden ser muy interesantes para mejorar tus productos o servicios.
  6. Puedes integrarla con las redes sociales: Facebook, Twitter, LinkedIn, Google + y muchas más.
  7. Puedes obtener información detallada sobre los gustos y preferencias de tus clientes.
  8. También puedes ofrecer información detallada sobre tus productos o servicios.
  9. Internet no tiene fronteras por lo que podrás ampliar tu negocio a un nivel no sólo local sino también nacional o internacional.
  10. Una inversión rentable para la difusión de tus productos o servicios.
  11. Puedes crear una tienda online y de esa forma aumentar las ventas de tu negocio. De esta forma atraes más clientes, clientes que al no poder acceder por cualquier tipo de razón a tu tienda física, perderías si no les ofreces es la posibilidad de comprar tus productos a través de Internet.
  12. Una buena presencia en Internet te ayudará a crear una “imagen de marca”.
  13. Hacer publicidad online es muy rentable, ya que es una opción mucho más barata que la publicidad tradicional y tiene un alcance enorme.
  14. Y recuerda algo muy importante, tu competencia ya está en Internet.

En resumidas cuentas, ya puedes hacerte una idea de las ventajas que ofrece tener una buena presencia en Internet. A través de UrciSoftware (www.urcisoftware.com) se ofrece la realización de páginas web y desarrollos software integrales, además de asesoramiento digital, posicionamiento SEO e imagen corporativa.

Crear una buena página web y saber integrarla adecuadamente en tu negocio, va a proporcionarte una buena imagen, te ayudará a vender más, conseguir nuevos clientes y fidelizar los que ya tienes, y mejorar los servicios que puede ofrecer tu negocio.

necesidaddeunaweb

Compressor.io: Comprimiendo imágenes con calidad

Durante este verano estoy aprovechando para hacer algunas webs «pendientes», como la del bufete de abogados de mi hermano y su socio, Simó & Martínez Abogados, y la mía propia mientras busco trabajo, UrciSoftware. Éste es el motivo principal por el que me he visto envuelto en esto de comprimir imágenes, y a ser posible, de calidad :-)

Después de haber utilizado diversas herramientas para la compresión de imágenes, me he sorprendido bastante cuando veo que la mejor (bajo mi punto de vista) es la de Compressor.io, una herramienta online a la que le puedes subir imágenes para comprimirlas casi al instante.

Los resultados con Compressor.io me han gustado tanto que por ello lo recomiendo desde aquí, y os animo a que indiquéis alguna herramienta mejor para comprimir imágenes (en este caso, Compressor trabaja con los formatos jpeg, png, gif y svg).

Un simple ejemplo con sus resultados

En UrciSoftware hay un fondo con el auditorio de Águilas, el cual tenía un tamaño de 229 KB con unas dimensiones de 2362 x 1575 píxeles. Al comprimirlo, pasó a tener un tamaño de 220 KB con las mismas dimensiones, auque pasó de 220 ppp a 96 ppp de resolución (es decir, si pierde algo de calidad).

compressor_io_comparación

Para optimizarlo decidí pasarlo a 1920 píxeles de ancho con Photoshop a la máxima calidad para obtener unas dimensiones de 1920 x 1280 píxeles. ¿El resultado? 1,10 MB de tamaño, casi 5 veces el tamaño anterior, aun siendo sus dimensiones más pequeñas. Para probar si Compressor podía hacer algo con dicha foto, la pasé por su web y si, me dejó sorprendido: volvió a un tamaño pequeño, de apenas 200 KB, tras una compresión del 82% y una calidad que a simple vista parecen iguales.

compressor_io_ultimo

Pronunciando palabras técnicas en inglés

Escribo este post por un motivo, ¡solo por un motivo! No quiero volver a escuchar a un teleco preguntándome si sé de «césar».

Recuerdo que dicho personaje me dijo que estaba trabajando con «césar», a lo que yo pregunto: «¿Qué es césar?». Y el intelectual me responde, con aries de grandeza a saber algo que al parecer yo ignoro, que es un lenguaje de programación orientado a objetos más moderno que Java y que bla bla bla… Le corto, y le digo: «¿Hablas de si sharp (C#)?». A lo cual contesta: «¿Eso qué es?».

En fin, dejando a un lado que los telecos no sabeis ni sabreis hacer una base de datos (de eso sabemos los informáticos :-P ), muchos de ellos si saben pronunciar el lenguaje de programación C#, el cual tiene dos opciones (al menos en España): En español («ce almuadilla») o en inglés («si sharp»). Las demás pronunciaciones, suena a flipi de turno.

Nota: No quiero represarias de telecos, es una broma con dicho gremio :)

Para poner fin a esta lacra de malas pronunciaciones de palabras en inglés (de la cual a veces yo también tengo mis errores), comparto una lista de palabras que he encontrado con las pronunciaciones «españolizadas» de forma correcta. ¡Disfrutad!

Adobe = adóbi
AJAX = eiyáx
Apache = apáchi
Apple = ápol
Antivirus = antivairus
API = ei-pi-ai
Array = a-rey
ASCII – áski
ATM = ei-ti-em
BIOS = báios
Blu-ray = blu-rey
Boolean = buúlean
Boot = búut
Buffer = bófer
Byte = báit
C++ = si plos plos
C# = si sharp
Cache – cach
Cable = kéibol
CD = si-dí
CGI = si-yi-ai
Cloud Computing = claud compútin
Crowdsourcing = cráudsorsin
Delete = di-lít
DVD = di-vi-dí
Computer = compiurer
Cookie = kú-ki
CPU = si-pi-iú
Data = déita
Debug = di-bog
Device = diváis
Default = di-folt
Digital = di-yi-tol
DLL = di-elél
Domain = doméin
Download = dáunlod
DRM = di-arém
Dynamic = dainámik
E-Commerce = i-cómers
eBay = íbei
EMail = i-méol
EPUB = i-pob
Facebook = féisbúuk
FaceTime = féis-táim
FIFO = fai-fo
File = fáiol
FireWire = faíor-uaior
Firmware = férmuer
Flickr = flíquer
Floating Point = flóutin póint
Freeware = frí-wer
Function = fónshion
GMail = yi-meol
GigaByte = gui-ga-báit
Google = gúgol
Google+ = gúpol plos
GPS = yi-pi-és
Graphic = gráfik
GUI = giúi
Hard Drive = jar-dráiv
Hardware = járduer
Hash = jash
HDTV = eich-di-ti-vi
HTC = eich-ti-si
HTML = eich-ti-emél
Host = joust
HotSpot = jot-espót
HTTP = eich-ti-ti-pí
HTTPS = eich-ti-ti-pi-és
Hyperlink = jaiper-link
Hub = job
Hulu = julu
I/O = ai-ó
IBM = ai-bi-em
Icon = ai-con
IDE = ai-di-í
IEEE = ai-trípol-í
iOS = ai-o-és
Interface = interféis
iPad = áipad
iPhone = áifon
IPv4 = ai-pi vi-fóar
IPv6 = ai-pi vi-six
IRC = ai-ar-sí
iTunes = ai-túns
Java – yava
JPEG = yei-pegh
JSON = yai-son
JSP = yei-es-pí
KDE = kei-di-í
Keyboard = kí-bor
Language = lángüech
Latency = léitensi
LDAP = eldáp
LED = elidí
Like = láik
Menu = méniu
Microsoft = maicrosoft
Mouse = máus
mp3 = empitrí
MySpace = máispeis
MySQL = mai sicuól
MySQL = mai-es-kiú=el (alternativa)
Newline = niúlain
NFC = en-ef-sí
Node.js = noud-yei-es
Objective-C = Obyectiv-sí
OEM = o-iém
Open GL = open yi-el
Oracle = óracol
Outlook = autlúk
Partition = partíshion
Paste = páist
PayPal = peipál
PCI = pi-si-ai
Peripheral = períferol
PDF = pi-di-ef
PHP = pi-eich-pi
Primary Key = práimeri-kí
Python = páiton
Queue = kiú
QuikTime = kuik-táim
Dual Core = duol-cor
RAID = réid
RAW = róo
Readme = rídmi
Real-Time = riol-táim
Remote = rimóut
RFID = ar-ef-ai-di
Robot = rou-bot
Runtime = rontáim
SD = es-di
SD-HC = es-di eich-sí
Search Engine = serch ényin
Session = séshion
SKU = es-kei-ú
Skype = eskáip
SMS – ésemes
SOAP = só-up
Sprite = espráit
SSD = es-es-dí
SSL = esesél
Tape = téip
TCP/IP = ti-si-pi ai-pí
Template = témplait
Tool = túul
Traceroute = tráisraut
Trojan Horse = tróyan jors
Troubleshooting = trobol-shúutin
Truncate = trunkeit
Tweet = tuít
Twitter = tuírer
Typeface = taip-feis
UDP = iú-di-pí
Unicode = iunicóud
UNIX = iúnix
Upload = op-loud
USB = iú-es-bí
Username = iúser-néim
UTF = iú-ti-ef
Utility = iutílity
User – iu-ser
Vaporware = váipor-uér
Variable = vériabol
VGA = vi-yi-ai
Volume = voúlium
VPN = vi-pién
Waveform = wéiform
Website = websáit
Wi-Fi = uái-fái
Wireless = uáiarles
x86 = eks éiti-six
Xbox = éks-box
XML = eks-emel
Yahoo = yáju
YouTube = yiú-tub

Instalando Bower en Windows 10

¿Que es Bower?

Hoy os voy a hablar sobre Bower. ¿Qué es eso?

Bower es un gestor de dependencias para desarrolladores web front-end, lo cual es bastante similar a un gestor de paquetes pero no lo mismo. Un gestor de paquetes se usa para configurar sistemas, por ejemplo para establecer tu entorno de desarrollo y con los parámetros que normalmente construyas en muchos proyectos. Sin embargo, un gestor de dependencias es específico para un proyecto. Con él manejaras todas las dependencias del proyecto y las dependencias serán guardadas en tu proyecto (y ya está). Cuando empieces otro proyecto, deberás manejar las dependencias una vez más.

Por ejemplo: En el mundo del PHP encontramos a Composer como gestor de dependencias y a PEAR como gestor de paquetes. Con Composer se establecen todos los parámetros y extensiones para un simple proyecto mientras que los parámetros de PEAR establecen nuevas extensiones y librerías al núcleo de php (al core).

De hecho, Bower esta creado de manera específica para la parte front-end y está optimizada para esa idea. La mayor diferencia es que NPM (es cual es bastante usado en este mundo) creará necesariamente un árbol de dependencias (de gran tamaño) mientras Bower requiere un árbol de dependecias plano (poniendo la carga de la resolución de dependencias en el usuario).

In order to read this article in English, click here.

Instalando Bower en Windows

En primer lugar, deberás instalar NodeJS, debido a que Bower es una aplicación creada con NodeJS. Descarla la versión correcta para tu sistema (x64 para mi Windows 10), la v4.4.5 LTS:

Nodejs web
Link to NodeJS

Es bastante sencillo  instalar NodeJS… Solo Next, Next, Next… (¡No temas!):

NodeJS install

También es necesario instalar GIT, debido a que los paquetes de las dependencias deberán de estar en un repositorio GIT. Para instalar esto, las opciones por defecto son buenas, pero quizás preferirás hacer algún cambio.

A la misma vez, cuando instales NodeJS, NPM se instalará a la vez en tu sistema. Así pues, podrás abrir el «cmd» (símbolo de sistema) en tu Windows 10 para instalar Bower (para eso, click en «Inicio» y escribe «cmd», pulsando luego a «intro»).

El comando para instalar Bower es: npm install -g bower

NPM install

Ok, está hecho, Bower está instalado :) Ahora, para usar Bower, es necesario crear el bower.json (el archivo de dependencias del proyecto) en la raiz del proyecto. Para mí, voy a crear un proyecto llamado AguilasCity.com (bueno, es solo un ejemplo) en mi ordenador, en la carpeta C:\wamp\www\AguilasCity.com

Para acceder con el cmd de Windows es necesario usar el comando «cd», y para crear el archivo de dependencias del proyecto (bower.json) el comando: bower init

NPM install project

De hecho, puedes actualizar este fichero, el «bower.json«, el cual es creado en la misma raíz del proyecto. Después actualizaré la licencia y quizás algunas cosas más, como el  nombre del proyecto (es mejor si no usas mayúsculas).

bower install

Por ejemplo, si quieres tener varias dependencias como bootstrap, fontawesome y jquery, usarás el comando: bower install –save bootstrap fontawesome jquery

Si no usas la opción «–save», el paquete será instalado pero el bower.json no será actualizado, y esto sería un problema si tu cambias el paquete de sitio (por ejemplo, si pones el proyecto en el servidor de producción).

bower update

Con el comando «bower update», todos los paquetes de bower.json serán actualizados. Es bueno saber que tu puedes indicar la versión de los paquetes, incluso un rango de versiones. Para esto y más, deberías de visitar Bower.io

Referencias en mi página index.php

Para usar estos paquetes, tienes que enlazar las librerías a tu proyecto. Este sería mi página de index.php:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AguilasCity.com</title>
    <meta name="description" content="Aguilas City, the best place in the world">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    				<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
    				<link rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css">

    <script src="bower_components/jquery/dist/jquery.min.js"></script>
    <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>

</head>
<body>

<?php echo "testing AguilasCity.com :)"; ?>

</body>
</html>

Installing Bower on Windows 10

What is Bower?

Today I am going to speak you about Bower. What’s that?

Bower is a dependency manager for front-end web developers, which is similar to a package manager but it is not the same. A package manager is used to configure systems, ie to setup your development environment and with this settings you can build many projects. However, a dependency manager is specific to project. You manage all dependencies for project and that dependencies going to be saved on your project. When you start another project you should manage your dependencies again.

Example: In PHP world there is Composer as dependency manager and PEAR as package manager. When using composer all your settings and extensions are for single project where pear settings to setup new extension and library to php core.

In fact, Bower is created solely for the front-end and is optimized with that in mind. The biggest difference is that NPM (which is pretty used in this world) does nested dependency tree (size heavy) while Bower requires a flat dependency tree (puts the burden of dependency resolution on the user).

Para ver este artículo en español pulsa aquí.

Installing Bower on Windows

In first time, you should install NodeJS, because Bower is an application created with NodeJS. Download the correct version for your system (x64 for my Windows 10), the v4.4.5 LTS:

Nodejs web
Link to NodeJS

It is pretty easy to install NodeJS… Only Next, Next, Next… (don’t fear!):

NodeJS install

Also it is necessary to install GIT, because the dependencies packages should be on a GIT repository. In order to install it, the default options are good, but maybe you will prefer change it.

At the same time, when you install NodeJS, NPM will be installed in your system. So, you can open the cmd in your Windows 10 to install Bower (for that, click on «Start» and write «cmd» and press «enter»).

The command to install Bower is: npm install -g bower

NPM install

Ok, it is done, Bower was installed :) Now, in order to use Bower, it is necessary to create the bower.json (the dependency file of the project) in the root of the project. For my, I am going to create the project called AguilasCity.com (well, it is only an example) in my computer, on the folder C:\wamp\www\AguilasCity.com

In order to access with the cmd of Windows it is necessary to use the «cd» command, and in order to create the dependencies file of the project (bower.json) the command: bower init

NPM install project

In fact, you can update this file, bower.json, which is created in the same root of the project. Later I will update the license and maybe other things, as the name of the project (it is better if you don’t use uppercase).

bower install

For example, if we want to have several depencies as bootstrap, fontawesome and jquery, we will use the command: bower install –save bootstrap fontawesome jquery

If you don’t use the option «–save», tha package will be installed but the bower.json won’t be update, and it is a problem if you change your project of place (for example, if you put your project in the production server).

bower update

With the command «bower update», all the packages of bower.json will be updated. It is good to know that you can indicate the version of the packages, even a range of versions. For that and more, you should visit Bower.io

 

References on my index.php page

In order to use this packages, you have to link the libraries in your project. This is my index.php page:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AguilasCity.com</title>
    <meta name="description" content="Aguilas City, the best place in the world">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    				<link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css">
    				<link rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css">

    <script src="bower_components/jquery/dist/jquery.min.js"></script>
    <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>

</head>
<body>

<?php echo "testing AguilasCity.com :)"; ?>

</body>
</html>

 

Improving the Internet undersea connections

Have we got enough infrastructure for all the new mobile devices? Are we prepared for that?

Of course, from Spain I mean! I can imagine that you have read about the new massive undersea cable, which Microsoft and Facebook are going to build between Virginia Beach, USA, and Bilbao, Spain (some pieces of news: in Spanish by ElPais.es, and in English by USAtoday.com). That is the reason why I am going to write about that. As software developer, maybe it is not interesting for us, but it is pretty important in order to have a powerful software «on the cloud».

Este post en español en este enlace

Of course, in order to connect Europe with USA, it is only possible do it by sea (undersea, of course), and Spain was using the connections with the rest of Europe (France, UK, …), which are connected with the USA. In fact, Spain has a direct connection with the USA (the Submarine Cable called Columbus-III), which connect Florida (USA) with Conil, in the south of Spain (and other places in Portugal and Italy), but it is not good enough for all the connections between both countries.

By the moment, you can see the current undersea connections on this website, submarinecablemap.com, which will be improved during the next years with the new connections.

undersea.PNG

Mejorando las conexiones de Internet por mar

¿Tenemos suficientes infraestructuras para todos los nuevos dispositivos móviles? ¿Estamos preparados para ello?

Por su puesto, me referio a España! Puedo imaginar que habrás leido sobre el nuevo cable submarino que Microsoft yFacebook van a construir entre Virginia Beach, USA, yBilbao, Spain (algunos artículos de noticias: en español por ElPais.es, y en inglés por USAtoday.com). Esta es la razón por la que voy a escribir sobre esto. Como software developer, quizás este no es interesante para nosotros, pero es bastante importante para tener un software más poderoso «en la nube».

This post is in English in this link

Por su puesto, para conectar Europa con Estados Unidos, es posible hacerlo solo por mare (por su profundidades, claro), y España estaba usando las conexiones con el resto de Europa (Francia, Reino Unido, …) las cuales conectan con Estados Unidos: De hecho, España tiene una conexión directa con dicho país (el cable submarino llamado Columbus-III), el cual conecta Florida (Estados Unidos) con Conil, en el sur de España (además de otros lugares como Portugal e Italia), pero no es suficiente para conectar ambos paises.

Por el momento, puedes ver las actuales conexiones en el mar en esta web, submarinecablemap.com, las cuales serán mejoradas durante los proximos años con nuevas conexiones.

undersea.PNG

Maven: What is its purpose? How to install it? Examples

What is its purpose?

Apache Maven is a built automation tool used normally for Java projects. Maven has a XML file called pom.xml (Project Object Model), and that file describes the software project being built, its dependencies on other external modules and components, the build order, directories, and required plug-ins. The nice is that Maven dynamically downloads Java libraries and Maven plug-ins from several repositories, and stores them in a local cache.

In order to work, Maven can create your project quickly with a simple command since the sell (Linux/Mac/…) or cmd (Windows).

The directory structure for a Java project is very simple:

  • Project Home:
    • src
      • main
        • java
        • resources
      • test
        • java
        • resources
    • target
    • pom.xml

A project can be generate with Maven in any directory of your computer (only it is necessary configurate the «Environment Variables» of the system).

In addiction, you can use Maven with the more powerful IDE in order to have more posibilities: Eclipse, NetBeans, IntelliJ… Maven has a plugin for Eclipse in order to allow using Maven form this IDE avoiding the use of the Maven command line interface, and NetBeans includes full Maven support.

For example, I normally generate the project with Maven, add new libraries / plug-ins in the pom.xml file, and work with Eclipse for edit the code. In order to compile the project, you can use Maven and Eclipse separalety. This is an example of a pom.xml file:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jmsimo</groupId>
  <artifactId>2014.01.07.1400</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>2014.01.07.1400</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>2.10.1</version>
    </dependency>

    <dependency>
      <groupId>com.sparkjava</groupId>
      <artifactId>spark-core</artifactId>
      <version>1.1.1</version>
    </dependency>

    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.19</version>
    </dependency>
  </dependencies>
</project>

Note: For the curious, this code is of a project that is using MongoDB, Spark Java and Freemarker.

In my opinion, if you never have worked with Maven, you should try to use it :)

How to install it?

Check Java version.

Are you using JDK 1.7? In order to check it: https://josemmsimo.wordpress.com/2014/01/14/how-to-install-java-jdk-and-jre-in-linux-and-windows-with-details/

Download and install Maven: http://maven.apache.org/download.cgi

download maven

Use the link of one of the binary files.

Once downloaded, unzip the file, and put the folder in a fixed directory (you don´t have to change the place of this folder in the future, for example, in Windows you could put the folder in C:\ ).

Now, you need add the «bin» folder to the «Environment variables». For example, working with Windows, you could have this path: C:\apache-maven-3.2.1\bin

Note: If you don’t know how add this path to the «environment variables», review the link for install the JDK 1.7 (in one step, it is configurated the path for Java, so that do the same for Maven).

Creating a new Maven project

And here starts the good :)

Using cmd / shell, go to the folder where you want create the project. In Windows:

  • Start / Run, and type cmd (for open the cmd.exe), and click there.
  • Once with the terminal, type: mvn archetype:generate
  • It will generate several lines. At the end (maybe in 5 or 10 seconds), the system will ask: «Choose a number or apply filter…» with a number. Click enter for use the default.
  • Later it will ask the version for use. Click enter for default (the last one).
  • Later it will ask the groupId. Type, for example: com.myfirstmaven
  • Later it will ask the artifactId for the class. Type, for example: MFM
  • Later it will ask the version. Click enter for default.
  • Later it will ask the default java packet. Type, for example: com.mypackage
  • Later it will ask for confirm. Click enter for ok.

mavenCMD

Ok, now we have a project created with an excelent structure in the folder C:\Users\j (in my case).

That project is (in my case) in: C:\Users\j\MFM, where you could see:

  • src
    • main
      • java
        • com
          • mypackage
            • App.java
    • test
      • java
        • com
          • mypackage
            • AppTest.java
  • pom.xml

The App.java file has only the typicall «Hello world».

For compile and execute it, type: mvn compile exec:java -Dexec.mainClass=»com.mypackage.App»

mavenCompile

Ok, it was pretty simple. The current pom.xml is the basic one.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

<groupId>com.myfirstmaven</groupId>
 <artifactId>MFM</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>

<name>MFM</name>
 <url>http://maven.apache.org</url>

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

<dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
 </dependency>
</dependencies>
</project>

Remember that you can use Eclipse, IntelliJ or other in order to edit. For compile, with Eclipse for example, you could compile the file Api.java indendently without problems, so that since now, you could use the IDE where you are more comfortable.

Adding new libraries

This is my favorite part. For add dependencies, you don’t need download new libraries. Maven will do it! For do it, you only need load a new dependency in the pom.xml file (you can check the first pom.xml file with JUnit, MongoDB and SparkJava and FreeMarker). In the last pom.xml file, I have the JUnit by default. For add the MongoDB, the final result will be so:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.myfirstmaven</groupId>
<artifactId>MFM</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>MFM</name>
<url>http://maven.apache.org</url>

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>2.10.1</version>
 </dependency>
</dependencies>
</project>

Links

How to install Java JDK and JRE in Linux and Windows (with details)

[En Español: clic aquí]

The JDK has a collection of progamming tools, including java, javac, javadoc, javaws, jar, apt, appletviewer, visualVM, etc. Too, the JDK also comes with a complete Java Runtime Environment, usually called a private runtime, due to the fact that it is separated from the «regular» JRE and has extra contents. It consists of a Java Virtual Machine and all of the class libraries present in the production environment, as well as additional libraries only useful to developers, such as the internationalization libraries and the IDL libraries (wikipedia reference).

So, the JDK is necessary for several things that I have proposed in this blog during some years, so that I have decided include an article more complete about it. There are others JDKs (different to Java JDK): for example OpenJDK. Here, I am going to write only about Java JDK.

  1. How to install Java JDK and JRE in Windows:
    1. Check if you have Java JDK 1.7 or higger in Windows.
    2. Check your «Environment Variables».
  2. How to install Java JDK and JRE in Linux:
    1. Check if you have Java JDK 1.7 or higger in Linux.
    2. Other posibilities.

1. How to install Java JDK and JRE in Windows.

1.1. Check if you have Java JDK 1.7 or higger in Windows.

Go to «Computer» and access to «C:\Program Files\Java», and check the folder that you have.

Folder Java

In my case, I have 2 versions of JDK (1.6 and 1.7) and 2 versions of JRE (jre6 and jre7). What is your case?

a) JDK: Do you have a folder called «jdk1.7…» (or higger)?

  • If it is so, go to the step b).
  • If you have not that folder:
    • 1. Download the Java JDK 7 since here. Accept the License Agreement if you agree, and download your Windows version.
      • Note: If you don’t know what is your version (32 or 64 bits), go to your desktop and click with the right bottom on «Computer». You will see in the new window a line where is wrote: «System type: XX-bit Operating System». Download the version x86 for 32 bits and the version x64 for 64 bits.

Java JDK 7 Download

    • 2. Install the Java JDK 7 that you have downloaded. It is very simple: Next, Next, Next… Finish.

b) JRE: Do you have a folder called «jre7…» (or higger)?

  • If it is so, go to the step 1.2.
  • If you have not that folder:
    • 1. Download the Java JRE 7 since here. Accept the License Agreement if you agree, and download your Windows version (the exe option is easier for install).
      • Note: If you don’t know what is your version (32 or 64 bits), go to your desktop and click with the right bottom on «Computer». You will see in the new window a line where is wrote: «System type: XX-bit Operating System». Download the version x86 for 32 bits and the version x64 for 64 bits.
    • 2. Install the Java JRE 7 that you have downloaded. It is very simple: Next, Next, Next… Finish (yes, it is pretty similar to the step a) xD ).

1.2. Check your «Environment Variables».

The form easiest is:

  • Go to Start / and write in the search textbox «cmd».
  • Click in «cmd.exe». This is the command environment of Windows.
  • Write here: java -version

cmd java version

  • Posibilities:
    • If you have the version 1.7 or higger, you have not problem, you don’t need change your system… bye! (it is the case of the image).
    • If your have a smaller version, you need update your environment variables.
    • If you receive the text: «‘java -version’ is not recognized as an internal or external command…», you need add a new environment variable.

If you need update or add an environment variable:

  • Go to your Desktop and click with the right bottom on «Computer», and click on «Properties».
  • In the new window, click in «Advanced system settings» (left side).
  • In the new window, click in «Advanced» (top side) and in the bottom «Environment Variables».

System Properties and Environment Variables

  • In the new window, in the side of «System variables» add a new variable:
    • Check if the variable JAVA_HOME exist (and if exist, it is easier delete it and create a new one).
    • Click on «New».
    • Variable name: JAVA_HOME
    • Variable value: C:\Program Files\Java\jdk1.7.XXX (insert your correct version)
    • Click on «OK».
  • In the same window and in the same side («System variables»), edit the variable «Path»:
    • Select the line where the variable is «Path».
    • Click on «Edit».
    • In the «Variable value», access to the top right of the line and add: ;%JAVA_HOME%;%JAVA_HOME%\bin
      • The semicolon (;) is for separate the variables, and here is add the variable with the path and the variable with the bin path.
    • Click in «OK».
  • Close the windows (click in OK).
  • In order to check if you have the correct version, open a new cmd.exe and write again the command: java -version

2. How to install Java JDK and JRE in Linux.

2.1. Check if you have Java JDK 1.7 or higger in Linux.

The steps are:

  • Open a terminal / shell.
  • Write the command: java -version

java version en ubuntu

  • Posibilities:
    • If you have the version 1.7 or higger, you have not problem, you don’t need change your system… bye!
    • If your have a smaller version, you need update your java version.
    • If you receive the text: «java -version: command not found», you need add java in your system.
  • For both add and update java in the system, I recommend these simple steps:
    • Add this repository, command: sudo add-apt-repository ppa:webupd8team/java
    • Update all the respotories, command: sudo apt-get update
    • Install Oracle Java 8 and JDK 7, commands:
      • sudo apt-get install oracle-jdk7-installer
      • sudo apt-get install oracle-java8-installer
    • Check the version that the system is using, command: java -version
    • Posibilities:
      • If your version is 1.7 or higger, it is OK, everything is right (you have finished :) ).
      • If your version is smaller, we need change the versión that is running. For do it:
        • Either update the alternatives, command: sudo update-alternatives –config java
        • Or set up the Java 8 environment variables directly, command: sudo apt-get install oracle-java8-set-default

– 

2.2. Other posibilities.

  • If it is not running and you prefer uninstall it, command: sudo apt-get remove oracle-java8-installer
  • For delete the repositories:
    • Install the ppa-purge, command: sudo apt-get install ppa-purge
    • Delete the respository, command: sudo ppa-purge ppa:webupd8team/java

 

Cómo instalar Java JDK y JRE en Linux y Windows (con detalles)

[In English: click here]

El JDK tiene una colección de herramientas de desarrollo, incluyendo java, javac, javadoc, javarw, jar, apt, appletviewer, visualVM, etc. También, el JDK viene con un completo Entorno de Ejecución para Java (en inglés Java Runtime Environment, JRE), el cual consiste en una Maquina Virtual de Java y todas las librerías de clases presentes en un entorno de producción, además de librerías adicionales solo para el uso de desarrolladores, como las librerías de internationalización y las librerías IDL (referencia de la wikipedia).

Así pues, el JDK es necesario para diversas cosas que he propuesto en este blog durante algunos años, así que he decidido incluir un artículo más completo sobre esto. Hay otros JDKs (direrentes a Java JDK): por ejemplo OpenJDK. Aquí, escribiré solo sobre Java JDK.

  1. Cómo instalar Java JDK y JRE en Windows:
    1. Comprueba si tienes Java JDK 1.7 o superior en Windows.
    2. Comprueba tus «Variables de Entorno».
  2. Cómo instalar Java JDK y JRE en Linux:
    1. Comprueba si tienes Java JDK 1.7 o superior en Linux.
    2. Otras posibilidades.

1. Cómo instalar Java JDK y JRE en Windows.

1.1. Comprueba si tienes Java JDK 1.7 o superior en Windows.

Ve a «Mi PC» y accede a «C:\Archivos de programa\Java», y comprueba si tienes esta carpeta.

Folder Java

En mi caso, tengo 2 versiones de JDK (1.6 y 1.7) y 2 versiones de JRE (jre6 y jre7). ¿Cuál es tu caso?

a) JDK: ¿Tienes una carpeta llamada «jdk1.7…» (o superior)?

  • Si esto es así, ve al paso b).
  • Si no tienes esa carpeta:
    • 1. Descarga Java JDK 7 desde aquí. Acepta el acuerdo de la licencia si te parece bien, y descarga tu versión para Windows.
      • Nota: Si no sabes cual es tu versión (32 o 64 bits), ve a tu escritorio y click con el botón derecho sobre «Mi PC». Verás en la nueva ventana una linea que pondrá: «Tipo de sistema: XX-bit Sistema Operativo». Descarga la versión x86 para 32 bits y la versión x64 para 64 bits.

Java JDK 7 Download

    • 2. Instala el Java JDK 7 que has descargado. Es muy simple: Siguiente, Siguiente, Siguiente… Finalizar.

b) JRE: ¿Tienes una carpeta llamada «jre7…» (o superior)?

  • Si esto es así, ve al paso b).
  • Si no tienes esa carpeta:
    • 1. Descarga Java JRE 6 desde aquí. Acepta el acuerdo de la licencia si te parece bien, y descarga tu versión para Windows (la opción exe es más sencilla de instalar).
      • Nota: Si no sabes cual es tu versión (32 o 64 bits), ve a tu escritorio y click con el botón derecho sobre «Mi PC». Verás en la nueva ventana una linea que pondrá: «Tipo de sistema: XX-bit Sistema Operativo». Descarga la versión x86 para 32 bits y la versión x64 para 64 bits..
    • 2. Instala el Java JDK 7 que has descargado. Es muy simple: Siguiente, Siguiente, Siguiente… Finalizar (si, es bastante similar a la del paso a) xD ).

1.2. Comprueba tus «Variables de Entorno».

La forma más fácil es:

  • Ve a Inicio / y escribe en la casilla de búsqueda «cmd».
  • Click en «cmd.exe». Este es el entorno de comandos de Windows.
  • Escribe aquí: java -version

cmd java version

  • Posibilidades:
    • Si tienes la versión 1.7 o superior, no tienes ningún problema, no necesitas cambiar tu sistema… adios! (es el caso de la imagen superior).
    • Si tu sistema tiene una versión más pequeña, necesitas actualizar las variables de entorno.
    • Si recibes el texto: «‘java -version’ no es un comando reconocido…», necesitarás añadir una nueva variable de entorno.

Si necesitas actualizar o añadir una variable de entorno:

  • Ve a tu escritorio y click con el botón derecho sobre «Mi PC», y click en «Propiedades». Desktop and click with the right bottom on «Computer», and click on «Properties».
  • En la ventana nueva, click en «Configuración avanzada del sistema» (en la parte izquierda).
  • En la ventana nueva, click en «Avanzada» (en la parte superior) y en el botón «Variables de entorno».
    • Nota: Siento que las imágenes estén en inglés, pero es como tengo mi sistema. Los valores / textos serán similares.

System Properties and Environment Variables

  • En la nueva ventana, en la parte de «Variables del sistema», añadir una nueva variable:
    • Comprobar si la variable JAVA_HOME existe (y si existe, es más fácil eliminarla y crear una nueva).
    • Click sobre «Nuevo».
    • Nombre de variable: JAVA_HOME
    • Valor de variable: C:\Archivos de programa\Java\jdk1.7.XXX (inserta la versión correcta y asegúrate que la ruta sea la correcta)
    • Click en «OK».
  • En la misma ventana y en el mismo lado («Variables del sistema»), edita la variable «Path»:
    • Selecciona la variable donde el nombre es «Path».
    • Click en «Editar».
    • En «Valor de la variable», accede al tope de la parte derecha y añade: ;%JAVA_HOME%;%JAVA_HOME%\bin
      • El punto y coma (;) es para separar variables, y aquí es añadieda la variable con el path y la variable con la «bin» path.
    • Click en «OK».
  • Cierra las ventanas (click en OK).
  • Para comprobar si tienes la versión correcta, abre un nuevo cmd.exe y escribe otra vez el comando: java -version

2. Cómo instalar Java JDK y JRE en Linux.

2.1. Comprueba si tienes instalado Java JDK 1.7 o superior en Linux.

Los pasos son:

  • Abre el terminal / shell.
  • Escribe el comando: java -version

java version en ubuntu

  • Posibilidades:
    • Si tienes la versión 1.7 o superior, no tendrás ningún problema (a menos a día de hoy, enero de 2014), así que no necesitas cambiar cosas en tu sistema… adiós!
    • Si tienes una versión más pequeña, necesitas actualizar tu versión de java (es el caso de la imagen.
    • Si recibes el texto: «java -version: command not found», necesitarás añadir java en tu sistema.
  • Para tanto actualizar como añadir  java en el sistema, recomiento estos sencillos pasos:
    • Añadir este repositorio, comando: sudo add-apt-repository ppa:webupd8team/java
    • Actualizar todos los repositorios, comando: sudo apt-get update
    • Instalar Oracle Java 8 y JDK 7, comandos:
      • sudo apt-get install oracle-jdk7-installer
      • sudo apt-get install oracle-java8-installer
    • Comprobar la versión que tu sistema está ahora utilizando, comando: java -version
    • Posibilidades:
      • Si tu versión es 1.7 o superior, ya está todo hecho, todo está correcto (si, has terminado :) ).
      • Si tu versión es más antigua, necesitas cambiar la versión que está funcionando por defecto. Para ello:
        • O actualizas entre las alternativas que tienes, comando: sudo update-alternatives –config java
        • O estableces a Java 8 como variable de entorno directamente, comando: sudo apt-get install oracle-java8-set-default

– 

2.2. Otras posibilidades.

  • No está funcionando bien y prefieres desinstalarlo, comando: sudo apt-get remove oracle-java8-installer
  • Para eliminar los repositorios:
    • Instalar el ppa-purge primero, comando: sudo apt-get install ppa-purge
    • Eliminar el repositorio, comando: sudo ppa-purge ppa:webupd8team/java

 

Conectando una aplicación Java con MongoDB en Windows

MongoDB es un sistema de base de datos NoSQL orientado a documentos y de código abierto. MongoDB, a diferencia de MySQL que guarda los datos en tablas de bases de datos relaciones, guarda estructuras de datos en documentos tipo JSON con un esquema dinámico (cuyo formato es llamado BSON). Con MongoDB, la integración de datos en ciertas aplicaciones es más fácil y rápida.

Esta guía / tutorial para conectar y utilizar datos de MongoDB usando Java en Windows 7 (aunque creo que con Windows 8 también funcionaría). Las partes que lo componen son:

  1. Instalación de MongoDB.
    1. Descarga de MongoDB.
    2. Descomprime MongoDB.
    3. Configura variables de entorno.
    4. Crea el archivo de configuración.
    5. Crea las carpetas para datos y logs.
    6. Ejecuta el servidor de MongoDB.
    7. Probar a ejecutar MongoDB.
  2. Descarga del driver mongo-java.
  3. Creación de un proyecto simple en Java (con Eclipse).
    1. Estructura básica del proyecto Java.
    2. Añadiendo código para imprimir las bases de datos MongoDB.
    3. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 1).
    4. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 2).

.

1. Instalación de MongoDB.

1.1. Descarga de MongoDB.

En primer lugar, descarga e instala MongoDB: http://www.mongodb.org/downloads

mongodb1

Como puedes ver, puedes instalar MongoDB en Windows, Linux, Mac OS X y Solaris (en la misma web, tienes otros instaladores para otros sistemas, como FreeBSD, Debian, Gentoo, etc.). Debes de tener en cuenta si tu sistema operativo está a 32 o 64 bits.

MongoDB 2.4.8 para Windows 64 bits ocupa 101 MB comprimidos.

.

1.2. Descomprime MongoDB.

Una vez descargado, descomprime el archivo en, por ejemplo, c:\mongodb\ (crea antes la carpeta). Debe quedar un aspecto similar a éste:

mongodb2

.

1.3. Configura variables de entorno.

La carpeta bin contiene una serie de ejecutables, por lo que es conveniente añadir dicha carpeta en las variables de entorno de Windows. Para ello:

  • Click con el boton derecho sobre Mi PC / Propiedades.
  • Click en “Configuración avanzada del Sistema”
  • En la pestaña “Avanzado”, click en “Variables de Entorno”.
  • En “Variables del sistema”, en la variable “Path”, añade al final del valor “;c:\mongodb\bin\”.
  • Pulsa OK a esta ventana y a las otros.

mongodb3

.

1.4. Crea el archivo de configuración.

Crea un archivo con nombre “mongo.config” en c:\mongodb\ y en éste indica estos parámetros:

##store data here
dbpath=c:\mongodb\data

##all output go here
logpath=c:\mongodb\log\mongo.log

##log read and write operations
diaglog=3

.

1.5. Crea las carpetas para datos y logs.

Crea las carpetas “data” y “log” en “c:\mongodb\”.

En ellas se añadirán los datos de las bases de datos y los archivos logs respectivamente.

.

1.6. Ejecuta el servidor de MongoDB.

Para ejecutar el servidor de MongoDB tienes dos alternativas:

  1. Ejecutarlo en el shell de windows y dejar dicha ventana abierta todo el rato.
  2. Añadir al servidor de MongoDB como Servicio de Windows para que se inicie automáticamente cuando se arranque el sistema operativo.

La primera alternativa simplemente consiste en ejecutar “cmd.exe” (el command de Windows) e introducir el siguiente comando:

mongod –config c:\mongodb\mongo.config

Siempre que no cierres la ventana, podrás interactuar con MongoDB, ya que el servicio estará activo. El resultado será algo similar al de la imagen:

mongodb20

.

La segunda alternativa también es bastante simple, aunque en este caso se añade un nuevo servicio a Windows, y sería recomendable tenerlo parado (stop) cuando no estamos utilizándolo. Para ello, ejecuta “cmd.exe” (el command de Windows) pero en este caso como administrador (para ello, click con el botón derecho sobre “cmd.exe” y pulsa sobre “Ejecutar como administrador”) e introduce los siguientes comandos:

mongod --config c:\mongodb\mongo.config –install
net start MongoDB

mongodb21

El primer comando instala a MongoDB como un servicio de Windows, y el segundo comando inicia el servidor de MongoDB.

El resultado será algo similar al de la imagen:

mongodb22

.

Nota: Quizás en un futuro quieres detener o eliminar MongoDB como servicio de Windows. Para ello, aquí tienes estos comandos:

  • Para detener el servicio: net stop MongoDB
  • Para eliminar el servicio: mongod –remove

.

1.7. Probar a ejecutar MongoDB.

Asegúrate que instalaste y configuraste con éxito MongoDB. Para ello, ejecutar “cmd.exe” (el command de Windows) e introducir el siguiente comando:

mongo

Si todo salió con éxito, el resultado será algo similar al de la imagen:

mongodb23

.

2. Descarga del driver mongo-java.

Descárgalo desde aquí: https://github.com/mongodb/mongo-java-driver/downloads

El driver de Mongo en su versión 2.10.1 ocupa 389 KB.

Nota: Una excelente colección de drivers para MongoDB para multitud de lenguajes la tienes aquí: http://docs.mongodb.org/ecosystem/drivers/

Sugiero guardar el driver en una carpeta fácil de recordar. En mi caso, he creado en “c: \mongodb” la carpeta “drivers”, y ahí los voy guardando (c:\mongodb\drivers\).

.

3. Creación de un proyecto simple en Java (con Eclipse).

3.1. Estructura básica del proyecto Java.

La idea de esta guía es que sea lo más simple posible, por lo que realizaré un proyecto Java con Eclipse muy sencillo. Para ello:

  • Abre Eclipse.
  • Click en Archivo / Nuevo / Otros.
  • En la nueva ventana, click en Java / Java Project, y click en “Siguiente”.

mongodb10

  • Pon un nombre el proyecto, por ejemplo “mongo-project” (en mi caso ni me he complicado en la ubicación y lo crearé sobre wamp en c:\wamp\www\mongo-project), y click en “Siguiente”.

mongodb11

  • En la pestaña librerías, click en “Añadir JAR externo”, y agregamos el driver que habíamos descargado previamente, y click en “Finalizar”.

mongodb12

  • La estructura del proyecto será muy simple, tal y como se puede ver en la imagen.

mongodb13

.

3.2. Añadiendo código para imprimir las bases de datos MongoDB.

A continuación, añadir una nueva clase en nuestro proyecto Java en el que escribiremos el siguiente código. En dicho código, se crea una conexión para la base de datos y se hace un listado de las bases de datos:

import java.net.UnknownHostException;
import java.util.List;

import com.mongodb.MongoClient;

/**
 * Prueba para realizar conexión con MongoDB.
 * @author j
 *
 */
public class prueba {
	/**
	 * Main del proyecto.
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Prueba conexión MongoDB");
		MongoClient mongo = crearConexion();

		if (mongo != null) {
			System.out.println("Lista de bases de datos: ");
			printDatabases(mongo);

		} else {
			System.out.println("Error: Conexión no establecida");
		}
	}

	/**
	 * Clase para crear una conexión a MongoDB.
	 * @return MongoClient conexión
	 */
	private static MongoClient crearConexion() {
		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

		return mongo;
	}

	/**
	 * Clase que imprime por pantalla todas las bases de datos MongoDB.
	 * @param mongo conexión a MongoDB
	 */
	private static void printDatabases(MongoClient mongo) {
		List dbs = mongo.getDatabaseNames();
		for (String db : dbs) {
			System.out.println(" - " + db);
		}
	}
}

.

El resultado será algo similar a éste:

mongodb30

.

3.3. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 1).

A continuación se añaden ciertas operaciones para hacer más fácil la visión de insert, update, select y delete archiconocido en MySQL. La sintaxis es aquí muy distinta, pero no por ello es más complicado.

En este ejemplo, el código se plasma solo en el main de una forma, llamémosle a lo bestia. Aun así, quizás así sea mucho más fácl para ser entendido por novatos:

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;

/**
 * Prueba para realizar conexión con MongoDB.
 * @author j
 *
 */
public class prueba {
	/**
	 * Main del proyecto.
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Prueba conexión MongoDB");
		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

		if (mongo != null) {

			//Si no existe la base de datos la crea
			DB db = mongo.getDB("bd-ejemplo");

			//Crea una tabla si no existe y agrega datos
			DBCollection table = db.getCollection("trabajador");

			//Crea los objectos básicos
			BasicDBObject document1 = new BasicDBObject();
			document1.put("nombre", "Jose");
			document1.put("apellidos", "Lopez Perez");
			document1.put("anyos", 45);
			document1.put("fecha", new Date());

			BasicDBObject document2 = new BasicDBObject();
			document2.put("nombre", "Maria");
			document2.put("apellidos", "Martinez Aguilar");
			document2.put("anyos", 35);
			document2.put("fecha", new Date());

			BasicDBObject document3 = new BasicDBObject();
			document3.put("nombre", "Juan");
			document3.put("apellidos", "Navarro Robles");
			document3.put("anyos", 25);
			document3.put("fecha", new Date());

			BasicDBObject document4 = new BasicDBObject();
			document4.put("nombre", "Lucia");
			document4.put("apellidos", "Casas Meca");
			document4.put("anyos", 66);
			document4.put("fecha", new Date());

			BasicDBObject document5 = new BasicDBObject();
			document5.put("nombre", "Jose");
			document5.put("apellidos", "Naranjo Moreno");
			document5.put("anyos", 33);
			document5.put("fecha", new Date());

			BasicDBObject document6 = new BasicDBObject();
			document6.put("nombre", "Jose Luis");
			document6.put("apellidos", "Romero Diaz");
			document6.put("anyos", 55);
			document6.put("fecha", new Date());

			BasicDBObject document7 = new BasicDBObject();
			document7.put("nombre", "Ana");
			document7.put("apellidos", "Canovas Perez");
			document7.put("anyos", 24);
			document7.put("fecha", new Date());

			BasicDBObject document8 = new BasicDBObject();
			document8.put("nombre", "Lucia");
			document8.put("apellidos", "Martinez Martinez");
			document8.put("anyos", 67);
			document8.put("fecha", new Date());

			//Insertar tablas
			table.insert(document1);
			table.insert(document2);
			table.insert(document3);
			table.insert(document4);
			table.insert(document5);
			table.insert(document6);
			table.insert(document7);
			table.insert(document8);

			//Actualiza la edad de los trabajadores con el nombre "Jose"
			BasicDBObject updateAnyos = new BasicDBObject();
			updateAnyos.append("$set", new BasicDBObject().append("anyos", 46));

			BasicDBObject searchById = new BasicDBObject();
			searchById.append("nombre", "Jose");

			table.updateMulti(searchById, updateAnyos);

			//Listar la tabla "trabajador"
			System.out.println("Listar los registros de la tabla: ");
			DBCursor cur = table.find();
			while (cur.hasNext()) {
				System.out.println(" - " + cur.next().get("nombre") + " " + cur.curr().get("apellidos") + " -- " + cur.curr().get("anyos") + " años (" + cur.curr().get("fecha") + ")");
		    }
			System.out.println();

			//Listar de la tabla "trabajador" aquellos que se llamen "Jose"
			System.out.println("Listar los registros de la tabla cuyo nombre sea Jose: ");
			BasicDBObject query = new BasicDBObject();
			query.put("nombre", "Jose");

			DBCursor cur2 = table.find(query);
			while (cur2.hasNext()) {
				System.out.println(" - " + cur2.next().get("nombre") + " " + cur2.curr().get("apellidos") + " -- " + cur2.curr().get("anyos") + " años (" + cur2.curr().get("fecha") + ")");
			}
			System.out.println();

			//Eliminar los trabajadores cuyo nombre sean "Ana"
			table.remove(new BasicDBObject().append("nombre", "Ana"));

			//Eliminar los trabajadores cuyos anyos sean mayor que 50
			BasicDBObject query2 = new BasicDBObject();
			query2.put("anyos", new BasicDBObject("$gt", 65));
			table.remove(query2);

			//Eliminar los trabajadores con los apellidos abajo indicados en la lista
			List lista = new ArrayList();
			lista.add("Casas Meca");
			lista.add("Navarro Robles");
			BasicDBObject query3 = new BasicDBObject();
			query3.put("apellidos", new BasicDBObject("$in", lista));
			table.remove(query3);

			//Listar la tabla "trabajador" (otra vez)
			System.out.println("Listar los registros de la tabla: ");
			DBCursor cur3 = table.find();
			while (cur3.hasNext()) {
				System.out.println(" - " + cur3.next().get("nombre") + " " + cur3.curr().get("apellidos") + " -- " + cur3.curr().get("anyos") + " años (" + cur3.curr().get("fecha") + ")");
		    }
			System.out.println();

			//Listar las tablas de la base de datos actual
			System.out.println("Lista de tablas de la base de datos: ");
			Set tables = db.getCollectionNames();
			for(String coleccion : tables){
				System.out.println(" - " + coleccion);
			}
			System.out.println();

			//Listas las bases de datos
			System.out.println("Lista de todas las bases de datos: ");
			List basesDeDatos = mongo.getDatabaseNames();
			for (String nombreBaseDatos : basesDeDatos) {
				System.out.println(" - " + nombreBaseDatos);
			}
			System.out.println();

			//Borrar base de datos
            db.dropDatabase();

		} else {
			System.out.println("Error: Conexión no establecida");
		}
	}
}

.

3.4. Añadiendo una nueva base de datos a MongoSQL y operaciones (ejemplo 2).

Este ejemplo está totalmente basado en el anterior. De hecho, primero cree este código separado en funciones (aquí indicado) y a continuación el del punto 3.3. para darle una lectura más simple. No obstante, este código es muy mejorable, y el separarlo por funciones no lo hace ni más rápido ni más ligero que el anterior:

import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.MongoClient;

/**
 * Prueba para realizar conexión con MongoDB.
 * @author j
 *
 */
public class prueba2 {
	/**
	 * Main del proyecto.
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println("Prueba conexión MongoDB");
		MongoClient mongo = crearConexion();

		if (mongo != null) {

			//Si no existe la base de datos la crea
			DB db = mongo.getDB("bd-ejemplo");
			System.out.println();

			//Crea una tabla si no existe y agrega datos
			insertTrabajador(db, "trabajador", "Jose", "Lopez Perez", 45);
			insertTrabajador(db, "trabajador", "Maria", "Martinez Aguilar", 35);
			insertTrabajador(db, "trabajador", "Juan", "Navarro Robles", 25);
			insertTrabajador(db, "trabajador", "Lucia", "Casas Meca", 66);
			insertTrabajador(db, "trabajador", "Jose", "Naranjo Moreno", 33);
			insertTrabajador(db, "trabajador", "Jose Luis", "Romero Diaz", 55);
			insertTrabajador(db, "trabajador", "Ana", "Canovas Perez", 24);
			insertTrabajador(db, "trabajador", "Lucia", "Martinez Martinez", 67);

			//Actualiza la edad de los trabajadores con el nombre "Jose"
			updateNombreTrabajador(db, "trabajador", "Jose", 46);

			//Listar la tabla "trabajador"
			System.out.println("Listar los registros de la tabla: ");
			selectTablas(db, "trabajador");
			System.out.println();

			//Listar de la tabla "trabajador" aquellos que se llamen "Jose"
			System.out.println("Listar los registros de la tabla cuyo nombre sea Jose: ");
			selectTablasWhere(db, "trabajador", "Jose");
			System.out.println();

			//Eliminar los trabajadores cuyo nombre sean "Ana"
			deleteTrabajadorPorNombre(db, "trabajador", "Ana");

			//Eliminar los trabajadores cuyos anyos sean mayor que 50
			deleteTrabajadorEdadMayorQue(db, "trabajador", 65);

			//Eliminar los trabajadores con los apellidos abajo indicados en la lista
			List lista = new ArrayList();
			lista.add("Casas Meca");
			lista.add("Navarro Robles");
			deleteTrabajadorEnLista(db, "trabajador", lista);

			//Listar la tabla "trabajador" (otra vez)
			System.out.println("Listar los registros de la tabla: ");
			selectTablas(db, "trabajador");
			System.out.println();

			//Listar las tablas de la base de datos actual
			System.out.println("Lista de tablas de la base de datos: ");
			printColecciones(db);
			System.out.println();

			//Listas las bases de datos
			System.out.println("Lista de todas las bases de datos: ");
			printDatabases(mongo);
			System.out.println();

			//Borrar base de datos
            db.dropDatabase();

		} else {
			System.out.println("Error: Conexión no establecida");
		}
	}

	/**
	 * Ejemplo para crear una conexión a MongoDB.
	 * @return MongoClient conexión
	 */
	private static MongoClient crearConexion() {
		MongoClient mongo = null;
		try {
			mongo = new MongoClient("localhost", 27017);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		return mongo;
	}

	/**
	 * Ejemplo que imprime por pantalla todas las bases de datos MongoDB.
	 * @param mongo conexión a MongoDB
	 */
	private static void printDatabases(MongoClient mongo) {
		List basesDeDatos = mongo.getDatabaseNames();
		for (String nombreBaseDatos : basesDeDatos) {
			System.out.println(" - " + nombreBaseDatos);
		}
	}

	/**
	 * Ejemplo que imprime por pantalla todas las colecciones / tablas de una base de datos.
	 * @param db de tipo DB
	 */
	private static void printColecciones(DB db) {
		Set tables = db.getCollectionNames();

		for(String coleccion : tables){
			System.out.println(" - " + coleccion);
		}
	}

	/**
	 * Ejemplo que inserta un registro dado un DB, nombre de tabla y campos de la tabla (id, nombre, apellidos y años).
	 * @param db
	 * @param tabla
	 * @param id
	 * @param nombre
	 * @param apellidos
	 * @param anyos
	 */
	private static void insertTrabajador(DB db, String tabla, String nombre, String apellidos, int anyos) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Crea un objecto básico y le añade elementos
		BasicDBObject document = new BasicDBObject();
		document.put("nombre", nombre);
		document.put("apellidos", apellidos);
		document.put("anyos", anyos);
		document.put("fecha", new Date());

		//Inserta la tabla
		table.insert(document);
	}

	/**
	 * Ejemplo que modifica el campo anyos dado una DB, tabla e id de usuario.
	 * Hay varias formas de actualizar los registros, y ésta es una de ella.
	 * Otros tipos de actualización de registros aquí: http://www.mkyong.com/mongodb/java-mongodb-update-document/
	 *
	 * @param db
	 * @param tabla
	 * @param id
	 * @param nuevosAnyos
	 */
	private static void updateNombreTrabajador(DB db, String tabla, String nombre, int nuevosAnyos) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Prepara para insertar un nuevo campo
		BasicDBObject updateAnyos = new BasicDBObject();
		updateAnyos.append("$set", new BasicDBObject().append("anyos", nuevosAnyos));

		//Busca el/los registro/s con el nombre indicado
		BasicDBObject searchById = new BasicDBObject();
		searchById.append("nombre", nombre);

		//Realiza la actualización
		table.updateMulti(searchById, updateAnyos);
	}

	/**
	 * Ejemplo que imprime por pantalla todos los trabajadores
	 * @param db
	 * @param tabla
	 */
	private static void selectTablas(DB db, String tabla) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Busca y muestra todos los datos de la tabla
		DBCursor cur = table.find();
		while (cur.hasNext()) {
			System.out.println(" - " + cur.next().get("nombre") + " " + cur.curr().get("apellidos") + " -- " + cur.curr().get("anyos") + " años (" + cur.curr().get("fecha") + ")");
	    }
	}

	/**
	 * Ejemplo que imprime por pantalla todos los trabajadores con nombre indicado
	 * @param db
	 * @param tabla
	 * @param nombre
	 */
	private static void selectTablasWhere(DB db, String tabla, String nombre) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Creando el filtro en el campo "nombre"
		BasicDBObject query = new BasicDBObject();
		query.put("nombre", nombre);

		//Busca y muestra todos los datos de la tabla donde "nombre" sea el indicado
		DBCursor cur = table.find(query);
		while (cur.hasNext()) {
			System.out.println(" - " + cur.next().get("nombre") + " " + cur.curr().get("apellidos") + " -- " + cur.curr().get("anyos") + " años (" + cur.curr().get("fecha") + ")");
		}
	}

	/**
	 * Ejemplo que elimina los trabajadores con nombre indicado
	 * @param db
	 * @param tabla
	 * @param nombre
	 */
	private static void deleteTrabajadorPorNombre(DB db, String tabla, String nombre) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Indica el campo y valor y lo elimina
		table.remove(new BasicDBObject().append("nombre", nombre));
	}

	/**
	 * Ejemplo que elimina los trabajadores con una edad mayor a la indicada
	 * @param db
	 * @param tabla
	 * @param anyos
	 */
	private static void deleteTrabajadorEdadMayorQue(DB db, String tabla, int anyos) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Indica el campo y valor que ha de ser mayor para eliminarlo
		BasicDBObject query = new BasicDBObject();
		query.put("anyos", new BasicDBObject("$gt", anyos));
		table.remove(query);
	}

	/**
	 * Ejemplo que elimina los trabajadores cuyos apellidos estén en una lista
	 * @param db
	 * @param tabla
	 * @param lista
	 */
	private static void deleteTrabajadorEnLista(DB db, String tabla, List lista) {
		//Recoge datos de la tabla
		DBCollection table = db.getCollection(tabla);

		//Indica la lista de nombres que quiere eliminar
		BasicDBObject query = new BasicDBObject();
		query.put("apellidos", new BasicDBObject("$in", lista));
		table.remove(query);
	}
}

Comparativa Frameworks PHP: Zend, Symfony, Codeigniter, Yii y Cake PHP

[In English: https://josemmsimo.wordpress.com/2013/12/02/php-frameworks-comparison-zend-symfony-codeigniter-yii-and-cake-php ]

Según la Wikipedia: «En el desarrollo de software, un framework o infraestructura digital, es una estructura conceptual y tecnológica de soporte definido, normalmente con artefactos o módulos de software concretos, que puede servir de base para la organización y desarrollo de software. Típicamente, puede incluir soporte de programas, bibliotecas, y un lenguaje interpretado, entre otras herramientas, para así ayudar a desarrollar y unir los diferentes componentes de un proyecto.»

En PHP, los frameworks más importantes son: Zend, Symfony, Codeigniter, Yii y Cake PHP. Sería recomendable perder algunas horas en aprender de forma básica como funcionan cada uno de ellos, ya que cada uno presenta detalles que pueden ser más o menos interesantes.

En esta infografía de ZFort.com hay algunos detalles interesantes:

top-php-frameworks-infographic

PHP Frameworks Comparison: Zend, Symfony, Codeigniter, Yii and Cake PHP

[En Español: https://josemmsimo.wordpress.com/2013/12/02/comparativa-frameworks-php-zend-symfony-codeigniter-yii-y-cake-php ]

According to Wikipedia: «In computer programming, a software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus providing application-specific software. A software framework is a universal, reusable software platform to develop applications, products and solutions. Software frameworks include support programs, compilers, code libraries, tool sets, and application programming interfaces (APIs) that bring together all the different components to enable development of a project or solution.»

In PHP, the most important frameworks are : Zend, Symfony, Codeigniter, Yii y Cake PHP. It is a good idea spend some hours in learn a bit how run these frameworks, because each one presents details that may be more or less interesting for developers.

In this infographic of ZFort.com there are some details very interesting:

top-php-frameworks-infographic

Problems with Drupal 8 and optimization in WAMP

Today I have been testing the alpha version 3 of Drupal 8 (the latest alpha version available for Drupal, a CMS written in PHP). The installation is very simple (perhaps another day I will explain something about this one), and due that I have new WAMP 2.4 installed since a few days, I detected a couple of problems in the middle of installing Drupal (mainly because I needed do some small changes in the config files):

An AJAX HTTP error occurred.
HTTP Result Code: 500
Debugging information follows.
Path: http://localhost:81/drupal2/core/install.php?langcode=es&profile=standard&id=1&op=do_nojs&op=do 
StatusText: Internal Server Error
ResponseText:

and

Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\drupal-8.0-alpha3\core\vendor\doctrine\common\lib\Doctrine\Common\Reflection\StaticReflectionParser.php on line 132

The easiest is to think it’s a problem of the runtime, and it is. Some people suggest to increase this time to 10 minutes, but it is too long to run a page (I suggest one or two minutes at most, it is boring waiting). Therefore, I propose here two things for do the WAMP server more efficient:

  • By increase execution time allowance.
  • By increase communication buffer size.


By increase execution time allowance.

For do this one, we must change the variable «max_execution_time» in «php.ini» (initially have a value of 30).

For check and modify this value, you can access to «php.ini» by two ways:

  • Left-click on the WAMP Server icon / php / php.ini
  • Or directly go to «C:\wamp\bin\php\php5.4.12\php.ini» (maybe your PHP version is different, or you are not using WAMP).

Find the variable «max_execution_time». In my case, it was using only 30 seconds:

CapturePHPini-max_execution_time

In my case, I put the value of 60 seconds. If your computer is very old, put more time:

max_execution_time = 60


By increase communication buffer size.

By increasing communication buffer size, the whole WAMP server will be faster. We are going to modify the variable «max_allowed_packet» in «my.ini» of MySQL, that controls the maximum size of its communication buffer.

For check and modify this value, you can access to «my.ini» by two ways:

  • Left-click on the WAMP Server icon / MySQL / my.ini
  • Or directly go to «C:\wamp\bin\mysql\mysql5.6.12\my.ini» (maybe your PHP version is different, or you are not using WAMP).

Find the variable «max_allowed_packet». In my case, it was using only 1 MB:

MyIni-max_allow_packet

In my case, I put the value of 64M, due that I have a powerful computer, and I do not need more memory:

max_allowed_packet = 64M

After these two changes, save the changes and restart WAMP Server for the changes to take effect.


Note: If you use a hosting service.

Moreover, for a hosting service would be advisable to use more MB. Usually, hosting companies do not allow access to «my.ini», so you could access to the MySQL or phpMyAdmin terminal (in the SQL section), and write the following query:

SHOW VARIABLES LIKE 'max_allowed_packet';

CaptureConfig

This last result is expressed in bytes, so you have to divide by 1024 twice (in my case, before I was using 1 MB, ie 1048576 bytes (1 * 1024 * 1024)).

For the variable «max_allowed_packet», I recommend at least 128 or 256M value (the more MB better) for a hosting service.

 

Problemas con Drupal 8 y optimización en WAMP

Hoy he estado probando la versión alpha 3 de Drupal 8 (la última versión alpha disponible de Drupal, un CMS escrito en PHP). La instalación es muy sencilla (quizás otro día explique algo sobre esto), y dado que hace apenas unos días instalé el nuevo WAMP 2.4, detecté un par de problemas en mitad de la instalación de Drupal:

An AJAX HTTP error occurred.
HTTP Result Code: 500
Debugging information follows.
Path: http://localhost:81/drupal2/core/install.php?langcode=es&profile=standard&id=1&op=do_nojs&op=do 
StatusText: Internal Server Error
ResponseText:

y

Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\drupal-8.0-alpha3\core\vendor\doctrine\common\lib\Doctrine\Common\Reflection\StaticReflectionParser.php on line 132

Lo más fácil aquí es pensar que es un problema por el tiempo de ejecución, y así es. Hay quienes sugieren aumentar dicho tiempo a 10 minutos, y eso es demasiado tiempo para ejecutar una página (yo sugiero 1 o 2 minutos como máximo, me aburre esperar). Por ello, lo que aquí os voy a proponer son dos cosas que debeis de hacer para poder usar vuestro servidor WAMP más eficientemente:

  • Aumentar el tiempo de ejecución permitido.
  • Aumentar el tamaño del buffer de comunicación.


Aumentar el tiempo de ejecución permitido.

Para ello debemos modificar la variable «max_execution_time» de «php.ini» que inicialmente tendrá previsiblemente el valor 30.

Para comprobar y poder modificar dicho valor, puedes acceder a “php.ini” por dos caminos:

  • Click izquierdo sobre el icono de WAMP Server / PHP / php.ini
  • O directamente acceder a “C:\wamp\bin\php\php5.4.12\php.ini” (quizás tu versión de PHP sea diferente, o puede que no estés utilizando el WAMP).

Busca la variable “max_execution_time”. En mi caso, se estaban utilizando apenas 30 segundos:

CapturePHPini-max_execution_time

En mi caso le pondré un valor de 60 segundos. Si tu ordenador es muy antiguo, ponle más tiempo:

max_execution_time = 60


Aumentar el tamaño del buffer de comunicación

Aumentando el tamaño del buffer de comunicación, el servidor WAMP en su conjunto será más rápido. Para ello vamos a modificar la variable “max_allowed_packet” que controla el máximo tamaño de su buffer de comunicación de “my.ini” de MySQL.

Para comprobar y poder modificar dicho valor, puedes acceder a “my.ini” por dos caminos:

  • Click izquierdo sobre el icono de WAMP Server / MySQL / my.ini
  • O directamente acceder a “C:\wamp\bin\mysql\mysql5.6.12\my.ini” (quizás tu versión de MySQL sea diferente, o puede que no estés utilizando el WAMP).

Busca la variable “max_allowed_packet”. En mi caso, se estaban utilizando apenas 1 MB:

MyIni-max_allow_packet

En mi caso voy a ponerlo con un valor de 64M, ya que tengo un ordenador bastante potente y en principio no necesito más memoria:

max_allowed_packet = 64M

Después de estos dos cambios, guarda los cambios de los archivos modificados y reinicia WAMP Server para que los cambios surjan efecto.


Nota: Si usas un servicio de hosting.

Por otra parte, para un servicio de hosting sería recomendable usar más MB. Normalmente las compañias de hospedaje no te permitán acceso a «my.ini», por lo que puedes acceder al terminal de MySQL o a phpMyAdmin (en el apartado de SQL), y escribir el siguiente query:

SHOW VARIABLES LIKE 'max_allowed_packet';

CaptureConfig

Este último resultado está expresado en bytes y no en megabytes, por lo que tendrás que dividirlo dos veces entre 1024 (en mi caso, antes estaba utilizando 1 MB, es decir, 1048576 bytes, (1 * 1024 * 1024)).

Sería adecuado que el servidor tuviese para la variable “max_allowed_packet” al menos el valor 128 o 256M (cuanto más megas mejor).

Drupal 8 and Backdrop vs. WordPress vs. Joomla!

(En Español: https://josemmsimo.wordpress.com/2013/10/09/drupal-8-y-backdrop-vs-wordpress-vs-joomla/)

Clarification on Drupal 8 and Backdrop.

Drupal 8, the last version in development, is causing a small internal war that it is causing the fist fork of Drupal.

And if the updates of the software projects are never easy for do, if the update is radical and the project is huge, the problems are guaranteed, mainly thinking that Drupal 8 is not an evolution of Drupal 7, being really a radical revolution where most of the project was rewritten. Drupal 8 requiere PHP 5.3, add the famous components of Symfony and get a lot of good modern practices of web development. The result is a code more professional and modern, but too more difficult of develop if you don’t have advanced knowledge of programming.

The problem is that a lot of people think that these change are too and they have decided to balk. This is the reason that some weeks ago, it born the project Backdrop CMS, the first fork of Drupal developed for people that don’t like the new Drupal (more info here: http://www.backdropcms.org ).

The expected audience of Backdrop is those amateur developers that are not happy with the new version of Drupal, a tool too complex to use, and could switch to WordPress (the most direct rival of Drupal). In a simple chart explains these assumptions, where supposedly professional developers will opt more by Drupal 8 and amateur developers mostly used in Backdrop:

backdrop-growth-chart

For its part, the goals pursued in this project are summarized in 7 points:

  1. Appeal to existing Drupal 6 and 7 Developers: We will deliver modern features (configuration management, content listings, rich-text editing, etc.) on a traditional Drupal-based architecture.
  2. Maintain an Easy-to-understand Architecture: We will make sure that new developers can understand the basics of the Backdrop architecture (info files, hooks, and callbacks) with minimal effort. An hour should be enough to summarize the architecture.
  3. Keep APIs Stable («Major» versions): We will make the upgrade process easier on end-users by maintaining slower-moving core APIs.
  4. Deliver New Features Often («Minor» versions): We will deliver new features at regular intervals with minimal risk of API breakage.
  5. Ensure Great Performance: We will focus on direct implementations and speed rather than accounting for edge-cases through abstraction.
  6. Provide a Better End-User Experience: We will constantly be improving the editorial and site-building experience. The intial release aims to improve content creation (matching Drupal 8’s advancements), and deliver a universal layout manager for site-builders (replacing blocks).
  7. Grow the community: We will focus on attracting new developers at all points of the spectrum, but especially remembering the entry-level developer.

The CMS in PHP more used and required since several perspectives.

Not everything is Drupal in the world of CMS. In fact, since Google Trend place WordPress above Drupal and Joomla. Possibly because WordPress is a CMS not only for developers, but a portal where people create blogs (the page you are reading belongs to wordpress: https://josemmsimo.wordpress.com ).

CaptureTrend

However, actually Drupal CMS is the most demanding professional by software development companies (at least in the UK, where I have been working this past year). According with ITJobsWatch (web with statistics and trends in the IT sector in UK), it verify that CMS Drupal is the most requested, followed by WordPress (both written in PHP). Joomla (also written in PHP) is less used (more details at: http://www.itjobswatch.co.uk/jobs/uk/cms.do ).

CMS

To finish, I made a small graphic considering the number of job vacancies in UK that are required, comparing the 3 CMS: Joomla, WordPress and Drupal. Note that there are jobs in which demand knowledge of several of these CMS, and also that the analysis is performed on only 2 or 3 job portals in that country. Therefore, this is just a small guide to reality:

CaptureOfertasEmpleoUK

About the salaries, in that web indicate that with Drupal is where the people win more money (some more of 40K pounds per year) if you compare with WordPress (34K pounds) and Joomla (some more of 32K pounds).

Differences between these 3 CMS:

There are websites which do a great job at the time of purchase between these 3 CMS. Here there are some links that I consider relevant, and too there is an infographic very interesting:

 devious_cms

Drupal 8 y Backdrop vs. WordPress vs. Joomla!

(In English: https://josemmsimo.wordpress.com/2013/10/09/drupal-8-y-backdrop-vs-wordpress-vs-joomla-english/ )

Aclaración sobre Drupal 8 y Backdrop.

Drupal 8, la última versión en desarrollo, está provocando una pequeña guerra interna que está dando lugar al primer fork de Drupal.

Y es que si las actualizaciones de los proyectos de software nunca son fáciles, si la actualización es radical y el proyecto es gigantesco, los problemas están garantizados, sobretodo teniendo en cuenta que Drupal 8 no es una evolución de Drupal 7, sino una revolución radical en la que se ha reescrito casi todo su código. Drupal 8 ha subido los requerimientos de PHP a la versión 5.3, ha incorporado los famosos componentes de Symfony y ha adoptado muchas de las buenas prácticas modernas del desarrollo web. El resultado es un código mucho más profesional y moderno, aunque también mucho más difícil de desarrollar si no tienes conocimientos avanzados de programación.

El problema es que a mucha gente todos estos cambios les han parecido excesivos y han decidido plantarse. Por ese motivo, hace apenas unas semanas nació el proyecto Backdrop CMS, el primer fork de Drupal creado por gente a la que no le gusta cómo está quedando el nuevo Drupal (más info aquí: http://www.backdropcms.org ).

Las explicaciones que han dado los creadores de este nuevo proyecto son las siguientes:

  • Los programadores tradicionales que usan Drupal no son los del mercado empresarial, sino programadores aficionados y gente con menos conocimientos técnicos.
  • El nuevo Drupal 8 ha perdido muchísimo rendimiento y es casi imposible hacerlo correr en un servidor compartido tradicional.
  • Backdrop no tiene como objetivo ni competir ni acabar con Drupal. Backdrop se dirige al mercado de programadores aficionados que no quieren aprender todo lo que requiere el nuevo Drupal 8.
  • Backdrop elimina todos y cada uno de los componentes Symfony.
  • Drupal 8 obliga a definir muchas clases y la estructura de directorios es muy compleja. El módulo aggregator en Drupal 7 estaba formado por 22 archivos y directorios. En Drupal 8, el mismo módulo contiene 103 archivos y directorios.
  • En Drupal 7 añadir un enlace en el menú de navegación requería definir un par de funciones. En Drupal 8 hay que crear un archivo PHP, un archivo de enrutamiento YAML y un archivo PHP con un controlador.
  • Drupal 8 no es malo, es simplemente demasiado difícil para muchos de los programadores de Drupal 7.
  • Los módulos del core de Drupal 8 sólo comparten un 24% de su código con los de Drupal 7. Además, de media los módulos son un 65% más grandes.
  • Drupal 8 es 10 veces más lento que Drupal 7 en algunas partes del instalador, 9 veces más lento al borrar la caché y 2 veces más lento al mostrar las páginas.

La audiencia que Backdrop espera obtener, es la de aquellos desarrolladores amateur que tras la nueva versión vean a Drupal 8 una herramienta demasiada compleja de utilizar, y que puedan pasar a utilizar WordPress (el rival más directo de Drupal). En un sencillo gráfico explican dichas suposiciones, donde supuestamente los desarrolladores profesionales optarán en mayor medida por Drupal 8, y los desarrolladores amateurs utilizarán en su mayoría Backdrop:

backdrop-growth-chart

Por su parte, las metas que persigue este proyecto las resumen en 7 puntos:

  1. Apelar a la existencia de desarrolladores en Drupal 6 y 7: Entregaremos características modernas (gestión de la configuración, listados de contenidos, edición de texto enriquecido, etc.) en una arquitectura tradicional basado en Drupal .
  2. Mantenimiento de una arquitectura fácil de entender: Nos aseguraremos de que los nuevos desarrolladores pueden entender los fundamentos de la arquitectura como telón de fondo (archivos de información, hooks, y callbacks) con el mínimo esfuerzo . Una hora debería ser suficiente para resumir la arquitectura.
  3. Mantener un API estable (en versiones «mayores»): Vamos a hacer el proceso de actualización fácil para los usuarios finales mediante el mantenimiento progresivo del núcleo de las APIs.
  4. Entregar nuevas características a menudo (versiones «menores»): Vamos a entregar nuevas características a intervalos regulares con el mínimo riesgo de rotura del API.
  5. Asegurar un gran rendimiento: Nos centraremos en las implementaciones directas y la velocidad en lugar de la representación de casos extremos mediante abstracción.
  6. Proporcionar una mejor experiencia del usuario final: Vamos a estar constantemente mejorando la redacción y experiencia en el sitio de construcción. La liberación inicial tiene como objetivo mejorar la creación de contenidos, y entregar un gestor de diseño universal para los constructores de sitio.
  7. Aumentar la comunidad de usuarios: Nos centraremos en atraer nuevos desarrolladores en todos los puntos del espectro , pero sobre todo recordando el desarrolladores entry-level (desarrolladores de nivel básico).

Los CMS en PHP más usados y demandados desde varias perspectivas.

No todo es Drupal en el mundo de los CMS. De hecho, desde Google Trend se posiciona a WordPress muy por encima de Drupal, y también de otro competidor llamado Joomla. Posiblemente sea porque WordPress es no solo un CMS para desarrolladores, sino un portal donde la gente crea páginas de tipo blog (la página que estás leyendo pertenece a wordpress: https://josemmsimo.wordpress.com ).

CaptureTrend

No obstante, a día de hoy, Drupal es el CMS profesional más demandando por las empresas de desarrollo software (al menos en Reino Unido, ciudad donde he estado trabajando este último año). Según ITJobsWatch (web estadística de salarios y tendencias en el sector IT de UK), se verifica que Drupal es el CMS más demandado, seguido de WordPress (ambos escritos en PHP). Joomla (también escrito en PHP) se ha quedado más rezagada (más detalles en: http://www.itjobswatch.co.uk/jobs/uk/cms.do ).

CMS

Para rematar, he realizado un pequeño gráfico teniendo en cuenta el número de ofertas de trabajo en UK que requieren los tres CMS aquí comparados: Joomla!, WordPress y Drupal. Ten en cuenta que hay ofertas de trabajo en las que piden el conocimiento de varios de estos CMS, y también que el análisis se realiza sobre solo 2 o 3 portales de empleo de dicho país. Por lo tanto, esto es solo una pequeña guía de la realidad:

CaptureOfertasEmpleoUK

En los que a salarios se refiere, en dicha web indica que con Drupal se gana bastante más (algo más de 40K libras esterlinas al año) que en WordPress (34K libras) y Joomla (algo más de 32K libras).

Diferencias entre estos 3 CMS:

Hay webs donde realizan un gran trabajo a la hora de comprar entre estos 3 CMS. A continuación dejo algunos links que considero relevantes, y una infografía que considero muy interesante:

 devious_cms

Activar cURL con WAMP Server, problemas resueltos.

[In English: https://josemmsimo.wordpress.com/2013/06/01/enable-curl-with-wamp-server-problems-solved]

Este artículo no es solo para activar cURL in WAMP Server… Además, es para resolver los problemas que tienen las últimas versiones de WAMP Server con cURL, así que si tú tienes problemas para activar cURL, has encontrado aquí la solución :)

Hace algunos dias, en mi actual proyecto tuvimos la necesidad de usar cURL. Con el fin de resolver este problema fue necesario cambiar algunos archivos en WAMP y añadir algunos archivos a Windows.

Esta solución es para PHP 5.4.3 y PHP 5.3.13 (32 y 64 bit) para Windows, ya que estas son las últimas versiones de WAMP (en este momento) y las versiones que tenían estos problemas.

Con el fin de habititar cURL:

  • Para todos los servicios de WAMP Server (click con el botón izquierdo sobre el icono de WAMP / click en «Detener todos los servicios»).
  • Cierra WAMP (click con el botón derecho sobre el icono de WAMP / «Salir»).
  • Abrir C:\wamp\bin\php\php[tu actual versión]\php.ini con Notepad o alguno similar, y descomentar extension=php_curl.dll (elimina el «;» que hay antes de «extension=php_curl.dll»). Guarda los cambios y cierra el archivo.
  • Abrir C:\wamp\bin\apache\apache[tu actual versión]\bin\php.ini con Notepad o alguno similar, y descomentar extension=php_curl.dll (elimina el «;» que hay antes de «extension=php_curl.dll»). Guarda los cambios y cierra el archivo.

Teóricamente, es no necesario hacer mas cambios, pero si estás usando la versión PHP 5.4.3 o PHP 5.3.13 en WAMP server, tendrás problemas para hacerlo funcionar.

Con el fin de resolver estos problemas:

  • Copia los archivos libeay32.dll y ssleay32.dll en C:\Windows\System32\
  • Copia el archivo php_curl.dll en c:\wamp\bin\php\php[tu actual versión]\ext\

Para descargar download libeay32.dll y ssleay32.dll click aquí.

Para descargar php_curl.dll, hay varias posibilidades:

– Usando PHP en «Non Thread Safe» o «Modo no seguro» (lo más normal):

– Usando PHP en «Thread Safe» o «Modo seguro»:

Espero que esto te haya ayudado ;)

Enable cURL with WAMP Server, problems solved.

[En Español: https://josemmsimo.wordpress.com/2013/06/01/activar-curl-con-wamp-server-problemas-resueltos]

This article is not only for enable cURL in WAMP Server… In addition, it is for resolve the problem that have the last versions of WAMP Server with cURL, so that if you have problems for active cURL, you have found the solution here :)

Some days ago, in my actual project we had the necessity of use the cURL. In order to resolve this problem was necessary change some files in WAMP and add some files in Windows.

This solution is for PHP 5.4.3 and PHP 5.3.13 (64 bit) for Windows, because they are the last versions of WAMP (in this moment) and the versions that have these problems.

In order to enable the cURL:

  • Stop all the services in WAMP Server (left click in the icon of WAMP / click in «Stop All Services»).
  • Close WAMP (right click in the icon of WAMP / «Exit»).
  • Open C:\wamp\bin\php\php[your actual version]\php.ini with Notepad or similar, and uncomment extension=php_curl.dll (delete «;» before of «extension=php_curl.dll»). Save the changes and close.
  • Open C:\wamp\bin\apache\apache[your actual version]\bin\php.ini with Notepad or similar, and uncomment extension=php_curl.dll (delete «;» before of «extension=php_curl.dll»). Save the changes and close.

Theoretically, it is not necessary do more changes, but if you are using the version PHP 5.4.3 or PHP 5.3.13 in WAMP server, you will have problems.

In order to resolve these problems:

  • Copy the files libeay32.dll and ssleay32.dll in C:\Windows\System32\
  • Copy the file php_curl.dll in c:\wamp\bin\php\php[your actual version]\ext\

In order to download libeay32.dll and ssleay32.dll click here.

In order to download php_curl.dll, there are several possibilities:

– Using PHP in «Non Thread Safe» (the most normal):

– Using PHP in «Thread Safe»:

I hope this has helped you ;)

6 mitos sobre Agile / 6 Myths About Agile

The original article was write by qarea.com Here you can read the full translation in Spanish.

El artículo original fue escribo por qarea.com Aquí puedes leer la traducción completa en Español.

Como metodología de desarrollo, Ágil es bastante joven hay muchos malentendidos. Vamos a descubrir algunos problemas comunes relacionados para que pueda juzgar por sí mismo si usted necesita para usarlo en su negocio o proyecto.

  •  Mito 1: Agile no es para equipo.

Algunas personas piensan que la metodología Agile toma demasiado tiempo para las reuniones y conduce al caos en el equipo grande. Pero en realidad Agile implica dividir equipo grande para los más pequeños por ubicación, funcionalidad, etc, de tal forma que se pueda automatizar la colaboración distribuida y concreción calendarios de reuniones. Recuerde, se usa más tiempo hoy para utilizar menos tiempo mañana.

  • Mito 2: Los desarrolladores ágiles son altamente cualificados.

El mito muy popular es que los desarrolladores Agile es una persona muy cualificada y nadie puede convertirse a esta metodología con facilidad. Pero la clave del éxito es la responsabilidad de los desarrolladores y siguiendo las normas comunes. Por supuesto, los desarrolladores experimentados, con gran fondo son siempre bienvenidos.

  • Mito 3: Agile no necesita documentación.

Esto no es cierto y tal vez uno de los mayores conceptos erróneos. Uno de los principios básicos de la metodología Agile es «Trabajar con software a través de una amplia documentación». Por supuesto, Agile implica menos documentación que otro proceso, pero lo más importante es si se va a necesitar. Así se obtiene el mejor rendimiento entre la combinación de costo, tiempo y calidad. La documentación debe ser breve, centrada en temas determinados que conduce a menos revisiones y ediciones.

  • Mito 4: Agile es para el cliente.

Algunos directivos creen que el cliente debe ser ágil y situado en el entorno de desarrollo. En el mundo real, Agile es para los desarrolladores, en primer lugar. Además, cualquier tipo de contrato está disponible para el desarrollo ágil, en lugar de contratos de precio fijo (son amoldables).

  • Mito 5: Usted puede ser lo suficientemente ágil.

Algunos equipos pueden decir que son ya lo suficientemente ágil. Sin embargo, no existe un límite de la perfección. Metodología ágil es la eficiencia, la responsabilidad y la mejora continua.

  • Mito 6: Agile arregla rápidamente cualquier problema de la manera más eficiente.

Por lo general, esto es una idea falsa. Agile lleva algún tiempo y dedicación para dominar hasta llegar a ser eficiente para su negocio (semanas / meses / años). Usted debe pasar algún tiempo para organizar este proceso y hacer que funcione correctamente.

Conclusiones

Todos estos pensamientos se debaten. Teniendo a la mayoría de los empleados con esta metodología se producen mejoras de productividad en sus procesos de negocio. También estamos seguros de que cada equipo puede hacer Agile, sólo tratando de ponerlo en práctica a fondo: la adopción de prácticas de uno en uno y no ir a ciegas. De todas formas, Agile permite al cliente trabajar a nivel experto, llegando a ser parte del proceso de desarrollo.

[Artículo original (inglés): http://www.qarea.com/articles/6-myths-about-agile ]

[Original article (English): http://www.qarea.com/articles/6-myths-about-agile ]

Get a random alphanumeric string using PHP

[En Español: https://josemmsimo.wordpress.com/2013/01/18/obteniendo-una-cadena-alfanumerica-usando-php]

In this post, I write how is possible generate an aleatory code (with numbers, letters and symbols) using PHP, easy peasy :-) My company ask me this one, for a specific task, and I think that this one could be useful for generate passwords aleatory:

function getRandomCode(){
	$an = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-)(.:,;";
	$su = strlen($an) - 1;
	return substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1);
}

This php code generate 6 aleatory digits. For this one, use:

  • rand(X, Y) function: X is the number more small to generate and Y the number more big. With this one, we will have an aleatory number.
  • substr(X, Y, Z) function: X is the string, Y is where start the string, and Z is the number of letters. With this one, we will have one digit
  • strlen(X) function: X is a string. With this one, we will have the length of the string.

We could be call 100 times to this function so:

for ($i = 0; $i < 100; $i++)
	echo getRandomCode() . "<br />";

And with a result similar to:
CSHY7S
SGYVAQ
YVU(W7
3MYKSW
WF0FWK
DOP1MU
IO-H3S …

Obteniendo una cadena alfanumérica usando PHP

[In English: https://josemmsimo.wordpress.com/2013/01/18/get-a-random-alphanumeric-string-using-php]

En este post, escribo como es posible generar un código aleatorio (con números, letras y símbolos) usando PHP muy fácilmente :-) Mi companía me pidió esto, para una tarea específica, y pensé que esto podría ser util para generar contraseñas aleatorias (entre otras cosas):

function getRandomCode(){
	$an = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-)(.:,;";
	$su = strlen($an) - 1;
	return substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1) .
			substr($an, rand(0, $su), 1);
}

Este código php genera 6 dígitos aleatorios. Para esto, se usa:

  • rand(X, Y): X es el número más pequeño que se puede generar e Y el más grande. Con esto, tendremos un número aleatorio.
  • substr(X, Y, Z): X es una cadena, Y es donde empezara una subcadena, y Z el número de letras que se escogerán de la cadena. Con esto, tendremos un dígito.
  • strlen(X): X es una cadena. Con esto, obtendremos el tamaño de una cadena.

Podríamos llamar 100 veces a la función así:

for ($i = 0; $i < 100; $i++)
	echo getRandomCode() . "<br />";

Y obtener un resultado similar a:
CSHY7S
SGYVAQ
YVU(W7
3MYKSW
WF0FWK
DOP1MU
IO-H3S …

1,587 GB en/in 3 segundos/seconds

Sabías que… Un único espermatozoide contiene 37,5 MB de información en forma de ADN en su interior. Esto significa que en una eyaculación normal se transfieren al rededor de 1,587 GB en unos 3 segundos… Y tu pensabas que el 4G era rápido.esperma

Installing a SVN Client in Eclipse

En Español: https://josemmsimo.wordpress.com/2012/12/07/installing-a-svn-client-in-eclipse

I am using Eclipse Juno, and I need a SVN client (subversion repository).

The steps to do are very easy… In this version:

  • Click in Help –> Install New Software.
  • Press in Add.. button.

svn-1

svn-4

  • Restart Eclipse.

Note: The URL is for: Eclipse 3.2/Callisto, 3.3/Europa, 3.4/Ganymede, 3.5/Galileo, 3.6/Helios, 3.7/Indigo, 3.8/4.2/Juno +

Instalando un Cliente SVN en Eclipse

In English:  https://josemmsimo.wordpress.com/2012/12/07/instalando-un-cliente-svn-en-eclipse

Estoy usando Eclipse Juno, y necesito un cliente SVN (repositorio subversión).

Los pasos a hacer son muy sencillos… En esta versión:

  • Click en Help –> Install New Software.
  • Click en el botón Add...

svn-1

svn-4

  • Reinicia Eclipse.

Nota: La URL indicada es para: Eclipse 3.2/Callisto, 3.3/Europa, 3.4/Ganymede, 3.5/Galileo, 3.6/Helios, 3.7/Indigo, 3.8/4.2/Juno +

Software Engineering Radio

Aquí os sugiero un enlace con podcast de artículos de desarrollo de software, espero que os parezca interesante (es en inglés).

Here I suggest a link to podcasts of software development articles, I hope you find interesting (it’s in English).

Software Engineering Radio: http://www.se-radio.net [The Podcast for Professional Software Developers]

Preparing and updating Ubuntu 10.10 «virgin» to develop Java since Eclipse

[En Español:  https://josemmsimo.wordpress.com/2012/08/22/preparando-y-actualizando-ubuntu-10-10-virgen-para-desarrollar-java-desde-eclipse/]

I decided to use version 10.10 because I have more affection, has the environment as I like and don’t fail me without knowing why.

I do not know which is your opinion about it. Here I refer you how to update and prepare for programming with Eclipse. I use it via VMWare, so I can use Windows and Linux at the same time, according to my necessities. Indeed, I’ll use this post as pin because usually I forgot some steps, so some things that you can look «strange» :P

Steps to follow? Presumably you must have a system Ubuntu 10.10. Almost everything we do it will be in the terminal, and when I enter something beginning with $ it will be a command (this is basic, but some people may not know it). Moreover, many things need to be done as superuser (root), so we opened the terminal and directly put it to work as root:

$ sudo su

Put the password, and you will see a sign (#) in front (I even so write a dollar ($)).

As a personal hobby, to put the buttons to minimize, restore / maximize and close to the right:

  • Press Alt + F2.
  • Write: gconf-editor
  • In the new window on the left: app / metacity / general
  • Find the entry called button_layout
  • Delete whatever brings in that field and you put: menu:minimize,maximize,close
  • Enter button and you will see the little buttons on the right.

First command to execute: I recommend you do it one by one. If do not know them, use Google and ask what he does.

$ apt-get update
$ apt-get upgrade
$ apt-get install aptitude
$ aptitude update
$ aptitude upgrade

Add repositories (I took this to the version of Java you want, there are many more):

$ sudo add-apt-repository «deb http://archive.canonical.com/ubuntu maverick partner»
$ sudo apt-get update

To install the browser Chrome in Ubuntu (Chromium), my favorite browser :P The 2nd line is to copy the flash plugin to the plugins folder of chrome.

$ sudo apt-get install chromium-browser chromium-browser-l10n flashplugin-installer
$ sudo cp /usr/lib/flashplugin-installer/libflashplayer.so /usr/lib/chromium-browser/plugins

To install JRE and JDK:

$ sudo apt-get install sun-java6-jre
$ sudo apt-get install sun-java6-jdk

To install Java in the browser and fonts (Lucida TrueType fonts Java).

$ sudo apt-get install sun-java6-plugin sun-java6-fonts

To update Java ( may be useful):

$ sudo apt-get install update-java
$ sudo update-java

To check Java version:

$ java -version
$ javac -version

At one point you can have multiple Java versions installed, so be careful with their priorities. Using this command you can choose the alternatives. In this case it is best to use the 3rd:

$ sudo update-alternatives –config java

There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
————————————————————
* 0 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java 66 auto mode
1 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java 66 manual mode
2 /usr/lib/jvm/java-6-sun/bin/java 65 manual mode
3 /usr/lib/jvm/java-6-sun/jre/bin/java 63 manual mode

Press enter to keep the current choice[*], or type selection number:

To properly set up the variable path JAVA_HOME (and keep us program without problems in Linux). First, make sure you have things «on their site»:

$ ls /usr/lib/jvm/java-6-sun

If you do not get anything review the steps above. If things go, perfect! Now run the following command:

$ sudo gedit /etc/bash.bashrc

In the file that was opened, paste these lines at the end:

export JAVA_HOME=/usr/lib/jvm/java-6-sun
export PATH=$PATH:$JAVA_HOME/bin.

Save the changes, close the file, and restart the computer.

Ok, now let’s install Eclipse. In my case, the version will download Eclipse IDE for Java EE Developers (Eclipse Juno by the way) for 32-bit Linux. Web: http://www.eclipse.org/downloads/

Once downloaded, unzip the file and save the folder in a directory. In my case I will keep it within the current user folder (home folder): /home/myuser

The path should be something like this then: /home/myuser/eclipse     Within that folder, we will have to click on the executable «eclipse», so for convenience I suggest making a shortcut to the desktop.

When starting eclipse, it lets you use the workspace you suggest, and I will do so within the user folder (you can choose another route if you prefer): /home/myuser/workspace

After starting Eclipse, we can create our «Hello World» in Linux :)

public class Ejemplo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Hola mundo");
	}

}

 

Preparando y actualizando Ubuntu 10.10 «virgen» para desarrollar Java desde Eclipse

[In English: https://josemmsimo.wordpress.com/2012/08/28/preparing-and-updating-ubuntu-10-10-virgin-to-develop-java-since-eclipse/]

Odio Ubuntu 12.04 y el me odia a mí. He decidido usar la versión 10.10 porque le tengo más cariño, tiene el entorno como a mí me gusta y no se me pilla sin saber el por qué.

No se cual será vuestra opinión al respecto. Aquí os indico como actualizarlo y prepararlo para programar con Eclipse. Yo lo utilizo a través de VMWare, de tal forma que puedo usar Windows y Linux a la vez, según mis necesidades. Por cierto, este post lo usaré como chincheta porque de una vez para otra al reinstalar se me olvidan algunos pasos y luego me rallo, así que algunas cosas puede que os parezcan «extrañas» :P

Insisto que las indicaciones son para un sistema Ubuntu 10.10 recién instalado. ¿Cómo lo instalo? ¿Cómo lo emulo? Notas para los muy novatos:

  • VMWare Player: Con esto puedes emular Sistemas Operativos desde tu sistema operativo actual.
  • Ventajas de VMWare: Puedes instalar todos los sistemas operativos que quieras y todas las versiones. Eso si, debes de reservar un espacio en tu ordenador para que trabaje el sistema que vas a emular (yo por ejemplo le pondré 20GB a Ubuntu 10.10). Además, si la cagas con el sistema que estás probando con el emulador, eliminar «a lo bestia» y punto xD. Más ventajas: puedes trabajar con tu sistema emulado y el actual, e incluso pasar archivos de uno a otro.
  • Desventajas de VMWare: No va tan rápido como si lo instalas directamente sobre el disco duro.
  • Alternativas de VMWare: Virtual Box quizás sea el más conocido, ya que hay bastantes más.
  • Alternativas a un emulador: Con «Windows installer for Ubuntu Desktop» te permite iniciar con Ubuntu desde el inicio del sistema. Lo he probado y no me ha gustado, aunque según he leido es una buena alternativa. Según indican también, es fácil desinstalar (cosa que debo de hacer cuando me acuerde).
  • Ubuntu: Este sistema operativo basado en Debian saca dos versiones al año, la .4 y la .10. Instalo la 10.10 porque ya la usé con anterioridad y siempre me ha ido bien con el tema de recursos de sistema y tal. Actualmente está la versión 12.04.
  • ¿Cómo funciona? ¿Cómo lo instalo? ¿Dónde lo descargo? ¿Cómo se pone la lavadora? En fin, para eso y mucho más, utiliza Google :)

¿Pasos a realizar? He de suponer que ya tenéis Ubuntu 10.10. Casi todo lo haremos en el terminal, y cuando indique algo empezando con $ es un comando (eso es básico, pero hay gente que puede no saberlo). Por otra parte, muchas cosas necesitan hacerse como superusuario (root), por lo que abrimos el terminal y directamente ponemos esto para trabajar como root:

$ sudo su

Ponéis la contraseña, y a os aparecerá una almohadilla (#) delante (aun así yo escribiré un dolar ($)).

Lo primero, yo soy español, y para configurar el teclado en español para tener mi querida y a veces odiada letra Ñ (además de los guiones, comas y otras cosas en su sitio):

$ sudo setxkbmap -layout ‘es,es’ -model pc105

También, y como manía personal, para poner los botones de minimizar, restaurar/maximizar y cerrar a la derecha:

  • Pulsamos Alt + F2.
  • Escribimos gconf-editor
  • En la nueva ventana a la izquierda: app / metacity / general
  • Buscamos la entrada llamada button_layout
  • Borrais lo que ponga en ese campo y poneís: menu:minimize,maximize,close
  • Enter y ya veréis el botón los botoncitos a la derecha.

Primeros comandos a ejecutar: recomiendo que lo hagáis uno a uno. Si no los conoces, usa Google y pregunta por lo que hace.

$ apt-get update
$ apt-get upgrade
$ apt-get install aptitude
$ aptitude update
$ aptitude upgrade

Añadiendo repositorios (cogí este para la versión de Java que quería, hay muchos más):

$ sudo add-apt-repository «deb http://archive.canonical.com/ubuntu maverick partner»
$ sudo apt-get update

Para instalar el Chrome en Ubuntu (Chromium), mi navegador favorito :P La 2ª línea es para copiar el plugin flash a la carpeta de plugins de chrome.

$ sudo apt-get install chromium-browser chromium-browser-l10n flashplugin-installer
$ sudo cp /usr/lib/flashplugin-installer/libflashplayer.so /usr/lib/chromium-browser/plugins

Para instalar JRE y JDK:

$ sudo apt-get install sun-java6-jre
$ sudo apt-get install sun-java6-jdk

Para instalar Java en el navegador y las fuentes (Java Lucida TrueType fonts).

$ sudo apt-get install sun-java6-plugin sun-java6-fonts

Para actualizar Java (os puede ser útil):

$ sudo apt-get install update-java
$ sudo update-java

Para comprobar tu versión Java:

$ java -version
$ javac -version

En cierto momento puedes tener varias versiones Java instaladas, así que ojo con sus prioridades. Utilizando el siguiente comando puedes elegir las alternativas. En este caso lo ideal es usar la 3ª:

$ sudo update-alternatives –config java

There are 3 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
————————————————————
* 0 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java 66 auto mode
1 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java 66 manual mode
2 /usr/lib/jvm/java-6-sun/bin/java 65 manual mode
3 /usr/lib/jvm/java-6-sun/jre/bin/java 63 manual mode

Press enter to keep the current choice[*], or type selection number:

Para configurar correctamente la variable de entorno JAVA_HOME (y ponernos a programar sin problemas en Linux como unos machotes). Primero, comprueba que tienes las cosas «en su sitio»:

$ ls /usr/lib/jvm/java-6-sun

Si no te sale nada revisa los pasos anteriores. Si salen cosas, «guay». Ahora ejecuta el siguiente comando:

$ sudo gedit /etc/bash.bashrc

En el archivo que se abrio, pega estas líneas al final del todo:

export JAVA_HOME=/usr/lib/jvm/java-6-sun
export PATH=$PATH:$JAVA_HOME/bin.

Guarda los cambios, cierra el archivo, y reinicia el equipo.

Ok, ahora vamos a instalar Eclipse. En mi caso, descargaré la versión Eclipse IDE for Java EE Developers (Eclipse Juno por cierto) para Linux de 32 bits. Web: http://www.eclipse.org/downloads/

Una vez descargado, descomprime el fichero y guarda la carpeta en un directorio. En mi caso lo guardaré dentro de la carpeta del usuario actual (home folder): /home/miUsuario

La ruta debería quedar algo así pues: /home/miUsuario/eclipse Dentro de esa carpeta, tendremos que cliquear sobre el ejecutable «eclipse«, por lo que por comodidad sugiero hacer un acceso directo al escritorio.

Al iniciar eclipse, le permitiré usar el workspace que me sugiere, y así lo tendré dentro de la carpeta de usuario (puedes elegir otra ruta si lo prefieres): /home/miUsuario/workspace

Una vez iniciado Eclipse, ya podemos crear nuestro «Hola mundo» en Linux :)

public class Ejemplo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("Hola mundo");
	}

}

Repito: Ventaja de hacerlo con VMWare: Si la lías, borras y punto :D

Olympics Developers: ACM-ICPC and other

(En Español: https://josemmsimo.wordpress.com/2012/08/08/olimpiadas-para-programadores-acm-icpc-y-otros)

More than Olympics, championships programming are described here. These are competitions that are performed individually or by small teams of 2 to 4 people. These specify a problem to be solved and we, as programmers, we need to develop their solution. Sometimes it takes into account only the time taken to resolve the problems, and some of them also the efficiency of the solution. They usually give enough money and / or gifts, although it has much merit.

For those wise, I propose the ACM International Collegiate Programming Contest, (ACM-ICPC). This competition, which dates from 1974, is organized every year for universities. Indeed, since 1997 it hasn’t won any U.S. University (ie, from which became popular internationally). Here you can see the questions: http://icpc.baylor.edu/info/Problem+Resources

Another event also interesting is the Tuenti Programming Challenge, whose second edition ended recently. The international ambit is lower, but some exercises are complicated. It’s more like a marathon, because its 20 questions will take time: https://contest.tuenti.net/Questions

Meanwhile, Google also has its own competition for programmers: the Google Code Jam. You can find more information here: http://code.google.com/codejam/

Facebook also has one, called The Facebook Hacker Cup, which despite the name is more focused on programming and not hacking: http://www.facebook.com/hackercup/

In addition, many countries organize their own. However, if you prove yourself, these links have enough exercises of programming ;-)

Olimpiadas para programadores: ACM-ICPC y otros

(In English: https://josemmsimo.wordpress.com/2012/08/08/olympics-developer-acm-icpc-and-other)

Más que olimpiadas, son campeonatos de programación lo que aquí indico. Son competiciones que se realizan individualmente o incluso por pequeños equipos de 2 a 4 personas. En ellos se especifica un problema que debe de ser resuelto y nosotros, como programadores, debemos de desarrollar su solución. A veces se tiene en cuenta únicamente el tiempo que se tarda en la resolución de los problemas, y en algunos de ellos también la eficiencia de la solución. Suelen dar bastante pasta y/o regalos, aunque tiene mucho mérito.

Para aquellos que vais de sobrados, os propongo la Competición Internacional Universitaria ACM de Programación. (en inglés: ACM International Collegiate Programming Contest, ACM-ICPC). Esta competición, que data desde 1974, se organiza cada año por universidades. Por cierto, desde 1997 que no lo gana una universidad norteamericana (prácticamente desde que empezó a ser popular internacionalmente). Aquí podéis ver sus preguntas: http://icpc.baylor.edu/info/Problem+Resources

Otro evento también interesante es la Tuenti Programming Challenge, cuya segunda edición finalizó hace poco. El calado internacional es bastante inferior, aunque algunos ejercicios propuestos son complicados. Más bien es como una marathon, porque sus 20 preguntas nos exige tiempo: https://contest.tuenti.net/Questions

Por su parte, Google también tiene su propia competición de programadores: la Google Code Jam. Puedes ver más información desde aquí: http://code.google.com/codejam/

Facebook no podía ser menos, y tiene la denominada The Facebook Hacker Cup, la cual a pesar del nombre está más orientada a la programación que al hacking: http://www.facebook.com/hackercup/

Y hay más, muchos países organizan la suya propia. No obstante, si quieres probarte a ti mismo, en estos enlaces tienes bastantes ejercicios de programación ;-)

 

Connecting a Java application with a MySQL database

(En Español / In Spanish: https://josemmsimo.wordpress.com/2012/08/01/conectando-una-aplicacion-java-con-una-base-de-datos-mysql/)

For a programmer is minimally necessary be capable to use databases. This is, in my case, one of the aspects most “beautiful” of programming, because that is where you manage the most important: The information. The way of representing it is infinite, and how to access and manage this information is multiple. I will not explain too many details, but in large databases (with millions of records), it is extremely important that the database is properly designed.

To carry out this practice I draw in my system present:

  • WAMP (Windows + Apache + MySQL + PHP), although it would be XAMP if you were in GNU/Linux environment or other one in another system … Finally, MySQL is what interests us.
  • Eclipse to write Java program.
  • JDK and other basic elements of Java.

First, I specify my database. Your name will be «agenda» and will contain a single table that it is «personal». The table will have: ID («identificador»), name («nombre»), phone («telefono») and e-mail (easy and intuitive). Before creating this table, it checks if it exist, in order to eliminate and prevent little problems. In the tests are also created a total of 4 registers, and then are displayed on screen.

Focusing on the part of Java, to make use of the database will have to import the package «java.sql.»

If we have never made ​​a connection from Java to the database, you may not have the driver installed. This driver allows the connection, and can be downloaded from here: We http://dev.mysql.com/downloads/connector/j/

Options for use:

  • Put in $ JAVA_HOME/lib/ and so will be accessible forever by default.
  • Put in the CLASSPATH.
  • Adding to our project we use the IDE (eg eclipse).

I will not explain this because there are many pages that show how, even if you have any questions please consult here and I will answer.

With respect to the source code is fairly intuitive. The long version, in which the steps are divided into small methods for further testing, it can be rather heavy. If you prefer something more «light», you have a second version «lighter».

Heavy version:

import java.sql.*;

public class conectarMostrar {
	private static Connection conexion = null;
	private static String bd = "agenda"; // Nombre de BD.
	private static String user = "root"; // Usuario de BD.
	private static String password = ""; // Password de BD.
	// Driver para MySQL en este caso.
	private static String driver = "com.mysql.jdbc.Driver";
	// Ruta del servidor.
	private static String server = "jdbc:mysql://localhost/" + bd;

	public static void main(String[] args) throws SQLException {

		System.out.println("INICIO DE EJECUCIÓN.");
		conectar();
		Statement st = conexion();

		// Se elimina la tabla "personal" en caso de existir.
		String cadena = "DROP TABLE IF EXISTS personal;";
		consultaActualiza(st, cadena);

		// Se crea la tabla "personal"
		cadena = "CREATE TABLE personal (`Identificador` int(11) NOT NULL AUTO_INCREMENT, `Nombre` varchar(50) NOT NULL, `Apellidos` varchar(50) NOT NULL, `Telefono` varchar(9) DEFAULT NULL, `Email` varchar(60) DEFAULT NULL, PRIMARY KEY (`Identificador`))";
		consultaActualiza(st, cadena);

		// Se crean datos de prueba para utilizarlos en la tabla "personal"
		cadena = "INSERT INTO personal (`Identificador`, `Nombre`, `Apellidos`, `Telefono`, `Email`) VALUES (1, 'José', 'Martínez López', '968112233', 'jose@martinezlopez.com'), (2, 'María', 'Gómez Muñoz', '911876876', 'maria@gomezoliver.com'), (3, 'Juan', 'Sánchez Fernández', '922111333', 'juan@sanchezfernandez.com'), (4, 'Ana', 'Murcia Rodríguez', '950999888', 'ana@murciarodriguez.com');";
		consultaActualiza(st, cadena);

		// Se sacan los datos de la tabla personal
		cadena = "SELECT * FROM personal;";
		ResultSet rs = consultaQuery(st, cadena);
		if (rs != null) {
			System.out.println("El listado de persona es el siguiente:");

			while (rs.next()) {
				System.out.println("  ID: " + rs.getObject("Identificador"));
				System.out.println("  Nombre completo: "
						+ rs.getObject("Nombre") + " "
						+ rs.getObject("Apellidos"));

				System.out.println("  Contacto: " + rs.getObject("Telefono")
						+ " " + rs.getObject("Email"));

				System.out.println("- ");
			}
			cerrar(rs);
		}
		cerrar(st);
		System.out.println("FIN DE EJECUCIÓN.");
	}

	/**
	 * Método neecesario para conectarse al Driver y poder usar MySQL.
	 */
	public static void conectar() {
		try {
			Class.forName(driver);
			conexion = DriverManager.getConnection(server, user, password);
		} catch (Exception e) {
			System.out.println("Error: Imposible realizar la conexion a BD.");
			e.printStackTrace();
		}
	}

	/**
	 * Método para establecer la conexión con la base de datos.
	 *
	 * @return
	 */
	private static Statement conexion() {
		Statement st = null;
		try {
			st = conexion.createStatement();
		} catch (SQLException e) {
			System.out.println("Error: Conexión incorrecta.");
			e.printStackTrace();
		}
		return st;
	}

	/**
	 * Método para realizar consultas del tipo: SELECT * FROM tabla WHERE..."
	 *
	 * @param st
	 * @param cadena La consulta en concreto
	 * @return
	 */
	private static ResultSet consultaQuery(Statement st, String cadena) {
		ResultSet rs = null;
		try {
			rs = st.executeQuery(cadena);
		} catch (SQLException e) {
			System.out.println("Error con: " + cadena);
			System.out.println("SQLException: " + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Método para realizar consultas de actualización, creación o eliminación.
	 *
	 * @param st
	 * @param cadena La consulta en concreto
	 * @return
	 */
	private static int consultaActualiza(Statement st, String cadena) {
		int rs = -1;
		try {
			rs = st.executeUpdate(cadena);
		} catch (SQLException e) {
			System.out.println("Error con: " + cadena);
			System.out.println("SQLException: " + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Método para cerrar la consula
	 *
	 * @param rs
	 */
	private static void cerrar(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
				System.out.print("Error: No es posible cerrar la consulta.");
			}
		}
	}

	/**
	 * Método para cerrar la conexión.
	 *
	 * @param st
	 */
	private static void cerrar(java.sql.Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (Exception e) {
				System.out.print("Error: No es posible cerrar la conexión.");
			}
		}
	}
}

 

Light version:


import java.sql.*;

public class conectarMostrar2 {
	public static void main(String[] args) throws SQLException {
		System.out.println("INICIO DE EJECUCIÓN.");
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "");
			Statement st = conexion.createStatement();
			st.executeUpdate("DROP TABLE IF EXISTS personal;");
			st.executeUpdate("CREATE TABLE personal (`Identificador` int(11) NOT NULL AUTO_INCREMENT, `Nombre` varchar(50) NOT NULL, `Apellidos` varchar(50) NOT NULL, `Telefono` varchar(9) DEFAULT NULL, `Email` varchar(60) DEFAULT NULL, PRIMARY KEY (`Identificador`));");
			st.executeUpdate("INSERT INTO personal (`Identificador`, `Nombre`, `Apellidos`, `Telefono`, `Email`) VALUES (1, 'José', 'Martínez López', '968112233', 'jose@martinezlopez.com'), (2, 'María', 'Gómez Muñoz', '911876876', 'maria@gomezoliver.com'), (3, 'Juan', 'Sánchez Fernández', '922111333', 'juan@sanchezfernandez.com'), (4, 'Ana', 'Murcia Rodríguez', '950999888', 'ana@murciarodriguez.com');");
			ResultSet rs = st.executeQuery("SELECT * FROM personal;");

			if (rs != null) {
				System.out.println("El listado de persona es el siguiente:");

				while (rs.next()) {
					System.out.println("  ID: " + rs.getObject("Identificador"));
					System.out.println("  Nombre completo: " + rs.getObject("Nombre") + " "	+ rs.getObject("Apellidos"));
					System.out.println("  Contacto: " + rs.getObject("Telefono") + " " + rs.getObject("Email"));
					System.out.println("- ");
				}
				rs.close();
			}
			st.close();

		}
		catch(Exception s)
		{
			System.out.println("Error: Varios.");
			System.out.println("SQLException: " + s.getMessage());
		}
		System.out.println("FIN DE EJECUCIÓN.");
	}
}

If you do not get it to work, the possible reasons may be diverse, usually forgetfulness.
Tip: Try to follow the steps, looking in Internet solutions, and as a last resort consulting here :-)

Conectando una aplicación Java con una base de datos MySQL

(In English / En Inglés: https://josemmsimo.wordpress.com/2012/08/03/connecting-a-java-application-with-a-mysql-database/)

Todo programador que se precie ha de saber manejarse mínimamente con las bases de datos. Este es, en mi caso, uno de los aspectos más “bonitos” de la programación, ya que es donde manejas lo que en el fondo es más importante: la información. La forma de representarla es infinita, y la forma de acceder y administrar dicha información también lo es. No voy a explicar demasiados detalles al respecto, pero en bases de datos grandes (con millones de registros), es sumamente importante que la base de datos esté bien diseñada.

Para la realización de esta pequeña práctica me baso en lo que yo ya tengo instalado en el sistema:

–          WAMP (Windows + Apache + MySQL + PHP), aunque sería XAMP si estuviese en entorno GNU/Linux u otro en otros sistemas… En fin, es MySQL lo que nos interesa.

–          Eclipse para escribir el programa en Java.

–          JDK y otros elementos básicos de Java.

En primer lugar, especifico como quiero que sea mi base de datos. Su nombre será “agenda”, y contendrá una sola tabla a la que llamaré “personal”. La tabla que creará tendrá: identificador, nombre, apellidos, teléfono y e-mail (más fácil e intuitiva imposible). Antes de crear dicha tabla, se comprobará si existe la misma para eliminarla y así evitar problemillas. En las pruebas también se crean un total de 4 registros, y a continuación se muestran por pantalla.

Centrándonos en la parte de Java, para hacer uso de la base de datos tendremos que importar el paquete “java.sql”.

Si nunca hemos realizado una conexión desde Java a la base de datos, es probable que no tengamos el driver instalado. Este driver nos permite la conexión, y puede ser descargado desde aquí: http://dev.mysql.com/downloads/connector/j/  Tendremos 3 opciones para utilizarlo:

–          Poniéndolo en $JAVA_HOME/lib/ext/ y así será accesible por defecto para siempre. Esta opción no es aconsejable, puesto que este jar estará disponible para todas las aplicaciones que corramos en el ordenador, lo necesiten o no. Si no somos cuidadosos, podemos tener conflictos entre distintas versiones o con otros jar que pongamos que ahí.

–          Poniéndolo en el CLASSPATH.

–          Añadiéndolo a nuestro proyecto del IDE que usemos (por ejemplo eclipse).

No explicaré esto porque hay muchas páginas que indican como hacerlo, aunque si tenéis alguna duda podéis consultarla por aquí y os responderé.

Respecto al código fuente, es bastante intuitivo. La versión larga, en la que se dividen los pasos en pequeños métodos para hacer más comprobaciones, puede resultar algo pesada. Si preferís algo más “light”, tenéis una segunda versión más “ligera” algo más abajo.

Versión “pesada”:

import java.sql.*;

public class conectarMostrar {
	private static Connection conexion = null;
	private static String bd = "agenda"; // Nombre de BD.
	private static String user = "root"; // Usuario de BD.
	private static String password = ""; // Password de BD.
	// Driver para MySQL en este caso.
	private static String driver = "com.mysql.jdbc.Driver";
	// Ruta del servidor.
	private static String server = "jdbc:mysql://localhost/" + bd;

	public static void main(String[] args) throws SQLException {

		System.out.println("INICIO DE EJECUCIÓN.");
		conectar();
		Statement st = conexion();

		// Se elimina la tabla "personal" en caso de existir.
		String cadena = "DROP TABLE IF EXISTS personal;";
		consultaActualiza(st, cadena);

		// Se crea la tabla "personal"
		cadena = "CREATE TABLE personal (`Identificador` int(11) NOT NULL AUTO_INCREMENT, `Nombre` varchar(50) NOT NULL, `Apellidos` varchar(50) NOT NULL, `Telefono` varchar(9) DEFAULT NULL, `Email` varchar(60) DEFAULT NULL, PRIMARY KEY (`Identificador`))";
		consultaActualiza(st, cadena);

		// Se crean datos de prueba para utilizarlos en la tabla "personal"
		cadena = "INSERT INTO personal (`Identificador`, `Nombre`, `Apellidos`, `Telefono`, `Email`) VALUES (1, 'José', 'Martínez López', '968112233', 'jose@martinezlopez.com'), (2, 'María', 'Gómez Muñoz', '911876876', 'maria@gomezoliver.com'), (3, 'Juan', 'Sánchez Fernández', '922111333', 'juan@sanchezfernandez.com'), (4, 'Ana', 'Murcia Rodríguez', '950999888', 'ana@murciarodriguez.com');";
		consultaActualiza(st, cadena);

		// Se sacan los datos de la tabla personal
		cadena = "SELECT * FROM personal;";
		ResultSet rs = consultaQuery(st, cadena);
		if (rs != null) {
			System.out.println("El listado de persona es el siguiente:");

			while (rs.next()) {
				System.out.println("  ID: " + rs.getObject("Identificador"));
				System.out.println("  Nombre completo: "
						+ rs.getObject("Nombre") + " "
						+ rs.getObject("Apellidos"));

				System.out.println("  Contacto: " + rs.getObject("Telefono")
						+ " " + rs.getObject("Email"));

				System.out.println("- ");
			}
			cerrar(rs);
		}
		cerrar(st);
		System.out.println("FIN DE EJECUCIÓN.");
	}

	/**
	 * Método neecesario para conectarse al Driver y poder usar MySQL.
	 */
	public static void conectar() {
		try {
			Class.forName(driver);
			conexion = DriverManager.getConnection(server, user, password);
		} catch (Exception e) {
			System.out.println("Error: Imposible realizar la conexion a BD.");
			e.printStackTrace();
		}
	}

	/**
	 * Método para establecer la conexión con la base de datos.
	 *
	 * @return
	 */
	private static Statement conexion() {
		Statement st = null;
		try {
			st = conexion.createStatement();
		} catch (SQLException e) {
			System.out.println("Error: Conexión incorrecta.");
			e.printStackTrace();
		}
		return st;
	}

	/**
	 * Método para realizar consultas del tipo: SELECT * FROM tabla WHERE..."
	 *
	 * @param st
	 * @param cadena La consulta en concreto
	 * @return
	 */
	private static ResultSet consultaQuery(Statement st, String cadena) {
		ResultSet rs = null;
		try {
			rs = st.executeQuery(cadena);
		} catch (SQLException e) {
			System.out.println("Error con: " + cadena);
			System.out.println("SQLException: " + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Método para realizar consultas de actualización, creación o eliminación.
	 *
	 * @param st
	 * @param cadena La consulta en concreto
	 * @return
	 */
	private static int consultaActualiza(Statement st, String cadena) {
		int rs = -1;
		try {
			rs = st.executeUpdate(cadena);
		} catch (SQLException e) {
			System.out.println("Error con: " + cadena);
			System.out.println("SQLException: " + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * Método para cerrar la consula
	 *
	 * @param rs
	 */
	private static void cerrar(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
				System.out.print("Error: No es posible cerrar la consulta.");
			}
		}
	}

	/**
	 * Método para cerrar la conexión.
	 *
	 * @param st
	 */
	private static void cerrar(java.sql.Statement st) {
		if (st != null) {
			try {
				st.close();
			} catch (Exception e) {
				System.out.print("Error: No es posible cerrar la conexión.");
			}
		}
	}
}

Versión “corta”, en la que he puesto dos catch para tener un mínimo de control ante fallos:


import java.sql.*;

public class conectarMostrar2 {
	public static void main(String[] args) throws SQLException {
		System.out.println("INICIO DE EJECUCIÓN.");
		try {
			Class.forName("com.mysql.jdbc.Driver");
			Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/agenda", "root", "");
			Statement st = conexion.createStatement();
			st.executeUpdate("DROP TABLE IF EXISTS personal;");
			st.executeUpdate("CREATE TABLE personal (`Identificador` int(11) NOT NULL AUTO_INCREMENT, `Nombre` varchar(50) NOT NULL, `Apellidos` varchar(50) NOT NULL, `Telefono` varchar(9) DEFAULT NULL, `Email` varchar(60) DEFAULT NULL, PRIMARY KEY (`Identificador`));");
			st.executeUpdate("INSERT INTO personal (`Identificador`, `Nombre`, `Apellidos`, `Telefono`, `Email`) VALUES (1, 'José', 'Martínez López', '968112233', 'jose@martinezlopez.com'), (2, 'María', 'Gómez Muñoz', '911876876', 'maria@gomezoliver.com'), (3, 'Juan', 'Sánchez Fernández', '922111333', 'juan@sanchezfernandez.com'), (4, 'Ana', 'Murcia Rodríguez', '950999888', 'ana@murciarodriguez.com');");
			ResultSet rs = st.executeQuery("SELECT * FROM personal;");

			if (rs != null) {
				System.out.println("El listado de persona es el siguiente:");

				while (rs.next()) {
					System.out.println("  ID: " + rs.getObject("Identificador"));
					System.out.println("  Nombre completo: " + rs.getObject("Nombre") + " "	+ rs.getObject("Apellidos"));
					System.out.println("  Contacto: " + rs.getObject("Telefono") + " " + rs.getObject("Email"));
					System.out.println("- ");
				}
				rs.close();
			}
			st.close();

		}
		catch(SQLException s)
		{
			System.out.println("Error: SQL.");
			System.out.println("SQLException: " + s.getMessage());
		}
		catch(Exception s)
		{
			System.out.println("Error: Varios.");
			System.out.println("SQLException: " + s.getMessage());
		}
		System.out.println("FIN DE EJECUCIÓN.");
	}
}

Si no os funciona, los posibles motivos son muy diversos, normalmente despistes.
Consejo: Prueba a seguir los pasos, busca en internet soluciones, y como última opción consulta por aquí :-)

JSF, características principales, ventajas y puntos a destacar

(Only in Spanish, sorry for English speakers).

JSF es un marco de trabajo para crear aplicaciones Java J2EE basadas en el patron MVC de tipo 1 (donde las vistas conocen la acción que se va a invocar en su peticion, y normalmente la función esta cableada dentro de la vista).

En este artículo se explican a modo de resumen las características principales, sus ventajas y los puntos a destacar desde un enfoque técnico.

JSF tiene como característas principales:

  • Utiliza páginas JSP para generar las vistas, añadiendo una biblioteca de etiquetas propia para crear los elementos de los formularios HTML.
  • Asocia a cada vista con formularios un conjunto de objetos java manejados por el controlador (managed beans) que facilitan la recogida, mapipulación y visualización de los valores nostrados en los diferentes elementos de los formularios.
  • Introduce una serie de etapas en el procesamiento de la petición, como por ejemplo la de validación, reconstrucción de la vista, recuperación de los valores de los elementos, etc.
  • Utiliza un sencillo fichero de configuración para el controlador en formato xml
  • Es extensible, pudiendo crearse nuevos elementos de la interfaz o modificar los ya existentes.
  • Y lo que es más importante: forma parte del estándar J2EE. En efecto, hay muchas alternativas para crear la capa de presentación y control de una aplicación web java, como Struts y otros frameworks, pero solo JSP forma parte del estándar.

JSF nos permite desarrollar rápidamente aplicaciones de negocio dinámicas en las que toda la lógica de negocio se implementa en java, o es llamada desde java, creando páginas para las vistas muy sencillas (salvo que introduzcamos mucha maquetación HTML o Javascript)

JSF nos ofrece una serie de ventajas:

  • El código JSF con el que creamos las vistas (etiquetas jsp) es muy parecido al HTML estándar. Lo pueden utilizar fácilmente desarrolladores y diseñadores web.
  • JSF se integra dentro de la página JSP y se encarga de la recogida y generación de los valores de los elementos de la página
  • JSF resuelve validaciones, conversiones, mensajes de error e internacionalización (i18n)
  • JSF permite introducir javascript en la página, para acelerar la respuesta de la interfaz en el cliente (navegador del usuario).
  • JSF es extensible, por lo que se pueden desarrollar nuevos componentes a medida, También se puede modificar el comportamiento del framework mediante APIs que controlan su funcionamiento.

Desde el punto de vista técnico podemos destacar los siguientes:

  • JSF forma parte del estándar J2EE, mientras que otras tecnologías para creación de vistas de las aplicaciones no lo forman, como por ejemplo Struts.
  • JSF dispone de varias implementaciones diferentes, incluyendo un conjunto de etiquetas y APIs estándar que forman el núcleo del framework. Entre estas implementaciones cabe destacar la implementación de referencia de Sun Microsystems, actualmente desarrollada como un proyecto open source, y la implementación del proyecto Apache, MyFaces, dotada de un conjunto de extensiones que la hacen muy interesante para el desarrollo de aplicaciones corporativas.
  • El desarrollo de JSF está realmente empezando. Las nuevas versiones del framework recogen la funcionalidad de versiones anteriores siendo su compatibilidad muy alta, de manera que el mantenimiento de aplicaciones no se ve penalizado por el cambio de versiones.

Tras este resumen, espero haberte despertado algo de interés por JSF ;-)

Puedes ver más desde la página del autor.

Link: http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=IntroduccionJSFJava

 

Can one read/write files from PL/SQL? Pueden leerse/escribirse archivos desde PL/SQL?

Can one read/write files from PL/SQL? Pueden leerse/escribirse archivos desde PL/SQL?

[EN-English] Yes :-) Often, I need to search through internet simple things that shine in their simplicity. Here you have one of these little things.
[ES-Spanish] Si :-) A menudo, necesito buscar a través de internet cosas simples que brillan por su simplicidad. Aquí os dejo una de esas cositas.

 

[EN] To read or write files necessary to create a directory object from SQL:
[ES] Para leer o escribir archivos es necesario crear un objeto directory desde SQL:

create directory dir_tmp as ‘c:\temp’;
grant read, write on directory dir_tmp to usuario;

 

[EN] Write:
[ES] Escritura:

create or replace procedure escribir is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen (‘DIR_TMP’, ‘test_utl_file.txt’, ‘w’);

utl_file.put_line (v_archivo, ‘Prueba de escritura’);

utl_file.put (v_archivo, ‘Texto sin fin de línea’);
utl_file.put_line (v_archivo, ‘ que sigue y termina acá.’);

utl_file.fclose(v_archivo);
end;
/

 

[EN] Read:
[ES] Lectura:

create or replace procedure leer is
v_archivo utl_file.file_type;
v_linea varchar2(1024);
begin
v_archivo := utl_file.fopen (‘DIR_TMP’, ‘test_utl_file.txt’, ‘r’);
loop
utl_file.get_line (v_archivo, v_linea);
dbms_output.put_line (v_linea);
end loop;
utl_file.fclose(v_archivo);

exception
when no_data_found then
dbms_output.put_line (‘Fin del archivo’);
end;
/

 

Error management / Manejo de errores.

[EN]: If another process is open and locked file:
[ES]: Si otro proceso tiene abierto y bloqueado el archivo:

create or replace procedure abrir_bloqueado is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen (‘DIR_TMP’, ‘test_utl_file.txt’, ‘w’);
utl_file.fclose(v_archivo);
dbms_output.put_line (‘Ok’);

exception
when utl_file.invalid_operation then
dbms_output.put_line (‘Error: utl_file.invalid_operation’);
end;
/

 

[EN]: If no read permissions:
[ES]: Si no hay permisos de lectura:

create or replace procedure abrir_no_lectura is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen (‘DIR_TMP’, ‘test_utl_file.txt’, ‘r’);
utl_file.fclose(v_archivo);
dbms_output.put_line (‘Ok’);

exception
when utl_file.access_denied then
dbms_output.put_line (‘Error: utl_file.access_denied’);
end;
/

 

[EN] If the file does not exist:
[ES] Si el archivo no existe:

create or replace procedure abrir_no_existe is
v_archivo utl_file.file_type;
begin
v_archivo := utl_file.fopen (‘DIR_TMP’, ‘test_no_existe.txt’, ‘r’);
utl_file.fclose(v_archivo);
dbms_output.put_line (‘Ok’);

exception
when utl_file.invalid_operation then
dbms_output.put_line (‘Error: utl_file.invalid_operation’);
end;
/

Link: http://plsql-tutorial.com

NoSQL comparison / comparación: Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase vs Membase vs Neo4j

(Español abajo)

While SQL databases are insanely useful tools, their monopoly of ~15 years is coming to an end. This article shows the main differences between NoSQL databases: Cassandra, MongoDB, CouchDB, Redis, Riak, HBase, Membase and Neo4j. The differences between NoSQL databases are much bigger than it ever was between one SQL database and another.

Mientras que las bases de datos SQL son herramientas increíblemente útiles, su monopolio de ~15 años está llegando a su fin. Este artículo muestra las diferencias entre las principales bases de datos NoSQL: Cassandra, MongoDB, CouchDB, Redis, Riak, HBase, Membase y Neo4j. Y es que las diferencias entre bases de datos NoSQL son mucho más grandes que las que hay entre una y otra base de datos SQL.

MongoDB

  • Written in: C++
  • Main point: Retains some friendly properties of SQL. (Query, index)
  • License: AGPL (Drivers: Apache)
  • Protocol: Custom, binary (BSON)
  • Master/slave replication (auto failover with replica sets)
  • Sharding built-in
  • Queries are javascript expressions
  • Run arbitrary javascript functions server-side
  • Better update-in-place than CouchDB
  • Uses memory mapped files for data storage
  • Performance over features
  • Journaling (with –journal) is best turned on
  • On 32bit systems, limited to ~2.5Gb
  • An empty database takes up 192Mb
  • GridFS to store big data + metadata (not actually an FS)
  • Has geospatial indexing

Best used: If you need dynamic queries. If you prefer to define indexes, not map/reduce functions. If you need good performance on a big DB. If you wanted CouchDB, but your data changes too much, filling up disks.

For example: For most things that you would do with MySQL or PostgreSQL, but having predefined columns really holds you back.

Link: http://www.mongodb.org

Riak

  • Written in: Erlang & C, some Javascript
  • Main point: Fault tolerance
  • License: Apache
  • Protocol: HTTP/REST or custom binary
  • Tunable trade-offs for distribution and replication (N, R, W)
  • Pre- and post-commit hooks in JavaScript or Erlang, for validation and security.
  • Map/reduce in JavaScript or Erlang
  • Links & link walking: use it as a graph database
  • Secondary indices: but only one at once
  • Large object support (Luwak)
  • Comes in «open source» and «enterprise» editions
  • Full-text search, indexing, querying with Riak Search server (beta)
  • In the process of migrating the storing backend from «Bitcask» to Google’s «LevelDB»
  • Masterless multi-site replication replication and SNMP monitoring are commercially licensed

Best used: If you want something Cassandra-like (Dynamo-like), but no way you’re gonna deal with the bloat and complexity. If you need very good single-site scalability, availability and fault-tolerance, but you’re ready to pay for multi-site replication.

For example: Point-of-sales data collection. Factory control systems. Places where even seconds of downtime hurt. Could be used as a well-update-able web server.

Link: http://basho.com

CouchDB

  • Written in: Erlang
  • Main point: DB consistency, ease of use
  • License: Apache
  • Protocol: HTTP/REST
  • Bi-directional (!) replication,
  • continuous or ad-hoc,
  • with conflict detection,
  • thus, master-master replication. (!)
  • MVCC – write operations do not block reads
  • Previous versions of documents are available
  • Crash-only (reliable) design
  • Needs compacting from time to time
  • Views: embedded map/reduce
  • Formatting views: lists & shows
  • Server-side document validation possible
  • Authentication possible
  • Real-time updates via _changes (!)
  • Attachment handling
  • thus, CouchApps (standalone js apps)
  • jQuery library included

Best used: For accumulating, occasionally changing data, on which pre-defined queries are to be run. Places where versioning is important.

For example: CRM, CMS systems. Master-master replication is an especially interesting feature, allowing easy multi-site deployments.

Link: http://couchdb.apache.org

Redis

  • Written in: C/C++
  • Main point: Blazing fast
  • License: BSD
  • Protocol: Telnet-like
  • Disk-backed in-memory database,
  • Currently without disk-swap (VM and Diskstore were abandoned)
  • Master-slave replication
  • Simple values or hash tables by keys,
  • but complex operations like ZREVRANGEBYSCORE.
  • INCR & co (good for rate limiting or statistics)
  • Has sets (also union/diff/inter)
  • Has lists (also a queue; blocking pop)
  • Has hashes (objects of multiple fields)
  • Sorted sets (high score table, good for range queries)
  • Redis has transactions (!)
  • Values can be set to expire (as in a cache)
  • Pub/Sub lets one implement messaging (!)

Best used: For rapidly changing data with a foreseeable database size (should fit mostly in memory).

For example: Stock prices. Analytics. Real-time data collection. Real-time communication.

Link: http://redis.io

HBase

  • Written in: Java
  • Main point: Billions of rows X millions of columns
  • License: Apache
  • Protocol: HTTP/REST (also Thrift)
  • Modeled after Google’s BigTable
  • Uses Hadoop’s HDFS as storage
  • Map/reduce with Hadoop
  • Query predicate push down via server side scan and get filters
  • Optimizations for real time queries
  • A high performance Thrift gateway
  • HTTP supports XML, Protobuf, and binary
  • Cascading, hive, and pig source and sink modules
  • Jruby-based (JIRB) shell
  • Rolling restart for configuration changes and minor upgrades
  • Random access performance is like MySQL

Best used: When you use the Hadoop/HDFS stack. When you need random, realtime read/write access to BigTable-like data.

For example: For data that’s similar to a search engine’s data

Link: http://hbase.apache.org

Neo4j

  • Written in: Java
  • Main point: Graph database – connected data
  • License: GPL, some features AGPL/commercial
  • Protocol: HTTP/REST (or embedding in Java)
  • Standalone, or embeddable into Java applications
  • Full ACID conformity (including durable data)
  • Both nodes and relationships can have metadata
  • Integrated pattern-matching-based query language («Cypher»)
  • Also the «Gremlin» graph traversal language can be used
  • Indexing of nodes and relationships
  • Nice self-contained web admin
  • Advanced path-finding with multiple algorithms
  • Indexing of keys and relationships
  • Optimized for reads
  • Has transactions (in the Java API)
  • Scriptable in Groovy
  • Online backup, advanced monitoring and High Availability is AGPL/commercial licensed

Best used: For graph-style, rich or complex, interconnected data. Neo4j is quite different from the others in this sense.

For example: Social relations, public transport links, road maps, network topologies.

Link: http://neo4j.org

Cassandra

  • Written in: Java
  • Main point: Best of BigTable and Dynamo
  • License: Apache
  • Protocol: Custom, binary (Thrift)
  • Tunable trade-offs for distribution and replication (N, R, W)
  • Querying by column, range of keys
  • BigTable-like features: columns, column families
  • Has secondary indices
  • Writes are much faster than reads (!)
  • Map/reduce possible with Apache Hadoop
  • I admit being a bit biased against it, because of the bloat and complexity it has partly because of Java (configuration, seeing exceptions, etc)

Best used: When you write more than you read (logging). If every component of the system must be in Java. («No one gets fired for choosing Apache’s stuff.»)

For example: Banking, financial industry (though not necessarily for financial transactions, but these industries are much bigger than that.) Writes are faster than reads, so one natural niche is real time data analysis.

Link: http://cassandra.apache.org

Couchbase

  • Written in: Erlang & C
  • Main point: Memcache compatible, but with persistence and clustering
  • License: Apache 2.0
  • Protocol: memcached plus extensions
  • Very fast (200k+/sec) access of data by key
  • Persistence to disk
  • All nodes are identical (master-master replication)
  • Provides memcached-style in-memory caching buckets, too
  • Write de-duplication to reduce IO
  • Very nice cluster-management web GUI
  • Software upgrades without taking the DB offline
  • Connection proxy for connection pooling and multiplexing (Moxi)

Best used: Any application where low-latency data access, high concurrency support and high availability is a requirement.

For example: Low-latency use-cases like ad targeting or highly-concurrent web apps like online gaming (e.g. Zynga).

Link: http://www.couchbase.com

Original article (written by Kristóf Kovács): http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

Superfriki, por la Facultad de Informática de la Universidad de Murcia

Aquí os dejo una mini-serie que intenta ser superfriki, aunque para mi se queda algo corta de lo mismo. Se hizo en la Facultad de Informática de la Universidad de Murcia hace algún tiempo. Por casualidad, hoy me la he encontrado en youtube y tenía que ponerla. No está mal del todo, va mejorando conforme pasan los capítulos.

Here you have some mini-series that they try to be superfriki, but for me it is something short to be its. It was done at the School of Informatics, University of Murcia, some time ago. By chance, today I have found it on youtube and I have had to put it. Not bad at all, getting better as time goes by chapters. It’s Spanish, sorry for English speakers.

Capítulo 1 – El Radar.

 

Capítulo 2 – Sueños.

 

Capítulo 3 – El Plan B.

 

Capítulo 4 – La decisión final.

 

Editores de código vía navegador web: CodeRun, ShiftEdit, Cloud9 IDE, Codeanywhere, Kodingen and GoInCloud.

En el siguiente artículo, indicaré y analizaré algunos de los más atractivos editores de código vía navegador web.

In the next article, I will indicate and analyze some of more attractive code editor via web browser.

(En Español): https://josemmsimo.wordpress.com/2012/07/11/editor-de-codigo-via-navegador-web-coderun-shiftedit-cloud9-ide-codeanywhere-kodingen-and-goincloud

(In English): https://josemmsimo.wordpress.com/2012/07/11/code-editor-via-web-browser-coderun-shiftedit-cloud9-ide-codeanywhere-kodingen-and-goincloud

 

CodeRun: CodeRun cuenta con soporte nativo para C#/.NET (3.5), PHP (5.1), JavaScript, HTML and CSS. El soporte de C# incluye los navegadores de aplicaciones de desarrollo y despliegue de ASP.NET, WCF, Silverlight y WPF. El soporte de base de datos incluye SQL Server 2005 y Amazon SimpleDB. Esto significa que usted no tiene que aprender nada nuevo con el fin de comenzar a trabajar con CodeRun. Basta con cargar el código existente, o comenzar desde una de las plantillas incorporadas. Usted puede probar y depurar código en la nube. Funciona en IE, Firefox, Chrome y Safari. No es necesario registrarse para usarlo.

CodeRun: http://www.coderun.com

ShiftEdit: Se trata de una IDE en línea para el desarrollo de PHP, Ruby, Python, Perl, HTML, CSS y JavaScript a través de FTP, SFTP y Dropbox. Permitir la depuración de autocompletado, la sintaxis en tiempo real, un “paso atrás en el tiempo” con el historial de revisiones, plegado de código, fragmentos, salto de línea, cierre el soporte, etc. Muy completo.

ShiftEdit: http://shiftedit.net

Cloud9 IDE: Ahora permite a los desarrolladores en todo el mundo editar el mismo código y charlar juntos en tiempo real. Su equipo y sus compañeros comparten una increíble productividad y una mayor calidad del código – no importa dónde se encuentren. Permite espacio de trabajo en la nube (SSH y FTP), colaboración (para grupos), plegado de código, arrastrar y soltar, múltiples cursores, enfoques, búsquedas, adaptación de temas, línea de comandos, completado de código, sincronización en línea, etc. Cloud9 ofrece infinidad de posibilidades para llevar su aplicación “a la vida”: Heroku, Cloud Foundry y Windows Azure. Muy completo.

Cloud9 IDE: http://c9.io

Codeanywhere: Editor de código en un navegador con un potente cliente de FTP integrado, y todos los formatos populares compatibles (HTML, PHP, JavaScript, CSS y XML). Los creadores ya desarrollaron el conocido PHPanywhere. Puede registrarse de forma gratuita y descargar la aplicación para Android y/o iPhone.

Codeanywhere: https://codeanywhere.net

Kodingen: Entorno de desarrollo en la nube muy útil con cuentas gratuitas de desarrollo y conexión a sus propios FTPs. Puede editar en: PHP, Perl, Python, FastCGI y otros. Usted tiene varios editores disponibles: Ace & Bespin, Codemirror, Ymacs y Pixlr. Hay planes para integrar los sistemas de control de versiones como svn o git, etc.

Kodingen: https://kodingen.com

GoInCloud: Un potente IDE para el desarrollo de proyectos en línea de PHP. Usted puede conectarse a los FTPs propios del proyecto o de uso local (ftp, ssh, acceso a phpmyadmin). Ahora en versión beta, aunque creo que actualmente están experimentando algunos problemas técnicos.

GoInCloud: http://goincloud.com

Si piensas que hay otros editors de código más interesantes, puedes añadir un comentario ;-)

Code editor via web browser: CodeRun, ShiftEdit, Cloud9 IDE, Codeanywhere, Kodingen and GoInCloud.

Code editor via web browser: CodeRun, ShiftEdit, Cloud9 IDE, Codeanywhere, Kodingen and GoInCloud.

In the next article, I will indicate and analyze some of more attractive code editor via web browser.

En el siguiente artículo, indicaré y analizaré algunos de los más atractivos editores de código vía navegador web.

(In English): https://josemmsimo.wordpress.com/2012/07/11/code-editor-via-web-browser-coderun-shiftedit-cloud9-ide-codeanywhere-kodingen-and-goincloud

(En Español): https://josemmsimo.wordpress.com/2012/07/11/editor-de-codigo-via-navegador-web-coderun-shiftedit-cloud9-ide-codeanywhere-kodingen-and-goincloud

 

CodeRun: CodeRun features native support for C#/.NET (3.5), PHP (5.1), JavaScript, HTML and CSS. C# support includes ASP.NET, WCF, Silverlight and WPF browser application development and deployment. Database support includes SQL Server 2005 and Amazon SimpleDB. This means you do not have to learn anything new in order to begin working with CodeRun. Simply upload you existing code, or start from one of the built-in templates. You can test and debug code in the cloud. Runs in IE, Firefox, Chrome and Safari. You don’t need sign up for use it.

CodeRun: http://www.coderun.com

ShiftEdit: It is an online IDE for developing PHP, Ruby, Python, Perl, HTML, CSS and JavaScript via FTP, SFTP and Dropbox. Permit autocomplete, realtime syntax debugging, step back in time with revision history, code folding, snippets, jump-to-line, bracket closing, etc. Very complete.

ShiftEdit: http://shiftedit.net

Cloud9 IDE: Now enables developers around the world to edit the same code and chat together in realtime. Your team and peers share in incredible productivity and higher quality code – no matter where they are. Permit your workspace in the cloud (SSH and FTP), collaboration (for groups), code folding, drag & drop, multiple cursors, focus, search, adaptive themes, command-line, code completion, offline and in sync, etc. Cloud9 offers incredible choices for bringing your application to life: Heroku, Cloud Foundry and Windows Azure. Very complete.

Cloud9 IDE: http://c9.io

Codeanywhere: Codeanywhere is a code editor in a browser with a powerful ftp client integrated, and all popular web formats are supported (HTML, PHP, JavaScript, CSS, and XML). The creators made the known PHPanywhere. You can sign up for free and download the Android and/or IPhone application.

Codeanywhere: https://codeanywhere.net

Kodingen: A very handy cloud development environment featuring free developer accounts and Connect to your own FTPs. You can edit in: PHP, PERL, Python, FastCGI and others. You have several editors available: Ace & Bespin, Codemirror, Ymacs and Pixlr. There are plans to integrate version-control systems like svn or git, etc.

Kodingen: https://kodingen.com

GoInCloud: An powerful online IDE for developing PHP projects. You may connect to your own FTPs or use local project (ftp, ssh, phpmyadmin access). Now in beta version, and I think that they are currently experiencing some technical issues.

GoInCloud: http://goincloud.com

If you think that there are others code editor via web browser most interesting, you can add a comment ;-)

SkyDrive vs. Dropbox vs. Google Drive (in iPhone): Comparision complete / Comparación completa

SkyDrive vs. Dropbox vs. Google Drive: iPhone cloud storage app showdown!

SkyDrive vs. Dropbox vs. Google Drive: Enfrentamiento de servicios de almacenamiento para iPhone en la nube.

Link of article: http://www.imore.com/skydrive-dropbox-google-drive-cloud-storage-app-iphone-ipad

Gomokingbird: Web & software mockups

Gomokingbird is an online tool that makes it easy for you to create, link together, preview, and share mockups of your website or application. It isn’t new, but it’s a excelent tool that requires no registration.

Gomokingbird es una herramienta online que te permite fácilmente crear, unir, hacer vistas previas, y compartir maquetas de tu web o aplicación. No es algo nuevo, pero es una herramienta excelente que no requiere ni registro.

Link: https://gomockingbird.com

Other alternatives / Otras alternativas:

Easily remove weird characters from your WordPress database // Eliminación sencilla de caracteres incorrentos en tu base de datos WordPress

(Español abajo)

If your WordPress database is filled with weird characters (for example, if you pasted something from Microsoft Word…) the following recipe will solve the problem by replacing those characters by the correct characters.

Simply run the following SQL query on your WordPress database, using the command line client or PhpMyAdmin. This will remove weird characters from all your posts and comments. Don’t forget to backup your database before using this query.

Si tu base de datos WordPress está con caracteres incorrectos (por ejemplo, si has pegado algo de Microsoft Word…) el siguiente código resolverá el problema de reemplazar aquellos caracteres incorrectos por los correctos caracteres.

Simplemente ejecutando la siguiente sentencia SQL en tu base de datos WordPress, usando la linea de comandos del cliente o en PhpMyAdmin. Esto eliminará caracteres erroneos de todos tus post y comentarios. No olvides hacer una copia de seguridad de tu base de datos antes de utilizar esta sentencia.

Query:

UPDATE wp_posts SET post_content = REPLACE(post_content, '“', '“');
UPDATE wp_posts SET post_content = REPLACE(post_content, '”', '”');
UPDATE wp_posts SET post_content = REPLACE(post_content, '’', '’');
UPDATE wp_posts SET post_content = REPLACE(post_content, '‘', '‘');
UPDATE wp_posts SET post_content = REPLACE(post_content, '—', '–');
UPDATE wp_posts SET post_content = REPLACE(post_content, '–', '—');
UPDATE wp_posts SET post_content = REPLACE(post_content, '•', '-');
UPDATE wp_posts SET post_content = REPLACE(post_content, '…', '…');

UPDATE wp_comments SET comment_content = REPLACE(comment_content, '“', '“');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '”', '”');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '’', '’');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '‘', '‘');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '—', '–');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '–', '—');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '•', '-');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, '…', '…');
Link: http://digwp.com/2011/07/clean-up-weird-characters-in-database/

Pulseras para medir la atención de los alumnos // Biosensors to monitor students’ attentiveness

(English above)

Pulseras para medir la atención de los alumnos… yo le añadiría un «pequeño» calambre cuando se despisten xD

Cito del artículo:

Para defender la necesidad de este tipo de sensores, el portavoz de la fundación dice que el aparato podría ayudar a los profesores a detectar los temas aburridos y los interesantes para sus alumnos llevándolos a mejorar y a hacer más dinámicas las clases. Además, también comenta que los métodos actuales de mejora educativa (como las videograbaciones del aula) para la mejora de las praxis educativas está teniendo unos resultados más bien flojos y, por ello defiende la necesidad de “medir matemática y objetivamente” la atención de dichos alumnos para así poder actuar sobre esos estados de fatiga y nula atención.

http://www.xarxatic.com/pulseras-para-medir-la-atencion-de-los-alumnos/

Biosensors to monitor students’ attentiveness… Best if it has cramps for improve it xD

Quote:

The biometric bracelets, produced by a Massachusetts startup company, Affectiva Inc, send a small current across the skin and then measure subtle changes in electrical charges as the sympathetic nervous system responds to stimuli. The wireless devices have been used in pilot tests to gauge consumers’ emotional response to advertising.

Gates officials hope the devices, known as Q Sensors, can become a common classroom tool, enabling teachers to see, in real time, which kids are tuned in and which are zoned out.

http://www.reuters.com/article/2012/06/13/us-usa-education-gates-idUSBRE85C01820120613

«Extended Abstract» of my final project: «SCADAS Free: State of the art and evaluation of pilot plant over ScadaBR»

This is the «Extended Abstract» of my final project: «SCADAS Free: State of the art and evaluation of pilot plant over ScadaBR«. The «Extended Abstract» is an English summary of the main parts of the project (for my second university Degree in Computer Science). If someone wants to complete work, contact me.

Este es el «Extended Abstract» de mi trabajo fin de grado: «SCADAS Libres: Estado del arte y evaluación de ScadaBR sobre planta piloto«. El «Extended Abstract» es un resumen en inglés de las partes principales del proyecto. Si alguien quiere el trabajo completo que se ponga en contacto conmigo.

TFG- SCADAS LIBRES- José Manuel Muñoz Simó- Extended Abstract

My new blog: https://josemmsimo.wordpress.com

Since now, I focus all publications in WordPress, and I will link from Google +, Facebook, Twitter and LinkedIn.

Desde ahora, centraré todas mis publicaciones en WordPress, y las enlazaré desde +, Facebook, Twitter y LinkedIn.

https://josemmsimo.wordpress.com

Spain: 3,915,249 of users in Google+

In Spain we are 3,915,249 of users in Google+
Rank 31, why are we always the last in technology?

En España somos 3,915,249 usuarios en Google+
Posición 31º, ¿por qué siempre somos los últimos en tecnología?

http://www.circlecount.com/statistic/countrypopulation