Translate

sábado, 20 de agosto de 2016

Función para multiplicar dos números en más de 10 lenguajes de programación

Introducción


Hola a todos! a continuación les compartiré un código muy sencillo con el que podrán conocer como se hace una funciónd e multipicaciónd e dos números en varios lenguajes de programación.
Si bien es algo muy básico, estoy seguro que les permitirá a algunos nuevos decidirse por cual aprender.

Clojure

(ns multiply.bug.fix)
(defn multiply [a b]
 (* a b)
)

CoffeeScript

multiply =(a, b)->
  a * b

Crystal

def multiply(x, y)
  x * y
end

C++

int multiply(int a, int b)
{
    return a * b;
}

C#

public class CustomMath {
    public static int multiply(int a, int b) {
        return a * b;
    }
}

Dart

int multiply(int a, int b){
  return a * b;
}

Elixir

defmodule Multiply do
  def multiply(a, b) do:
   a * b
end

Java

public class Multiply {
    public static Double multiply(final Double a, final Double b){         
        return (a == null || b == null) ?
                                          Double.NaN
                                          : 
                                          a * b;
    }
}

Javascript

var multiply = function (a, b) {
  return a * b;
}

PHP

function multiply($a, $b) {
  return $a * $b;
}

Python

def multiply(a, b):
  return a * b

Ruby

def multiply(a, b)
  a * b
end

Rust

fn multiply(a:i32, b:i32)  -> i32 {
  a * b
}

Typescript

export function multiply(a: number, b: number): number {
  return a * b;
}

sábado, 6 de agosto de 2016

Equivalencias entre Java y Javascript

Introducción 

A continuaciòn mostraré algunos trucos simples para aquellos que necesiten pasar de un lenguaje a otro

Mensajes de error


System.err.println("Error");

console.log("Error");


Primitivos y Wrappers

Parseo

Integer.valueOf(questarray[4]);

parseInt(questarray[4]);

Compare


compare=Double.compare(variable, 0.0);
if(compare>0) {

if (variable > 0.0) {

Excepciones


throw new RuntimeException("Error");

throw "Error";


 Arreglos


Arrays.copyOfRange y Array.protototype.slice


Arrays.copyOfRange(myArr, myArr.length / 2, myArr.length);

questionMapArr.slice( myArr.length / 2, myArr.length);



Listas


Como en Javascript no hay listas se usan arreglos con sus métodos equivalentes

lista.addAll(Arrays.asList(tokens));

lista.push(...tokens);


Collections.shuffle(questions);

this.questions.sort(() => .5 - Math.random());


Mapas



answerChoicesMap.entrySet().stream().forEach((choiceEntry) => {
  choiceQuestion.setChoice(
     choiceEntry.getKey(), choiceEntry.getValue()
  );
});


for (var [key, value] of answerChoicesMap) {
   choiceQuestion.setChoice(
       key, value
   );
}

No duden en rpeguntar si encesitan otra cosa como entrada por consola. Saludos!

viernes, 17 de junio de 2016

El Hola mundo en Java 9

Hola, por fin me dí tiempo para probar hacer proyectos con Java 9, específicamente con Jigsaw que será la próxima innovación de Java que estará disponible para todo el público a partir del mes de septiembre.

Creación del código de Hola Mundo en Java 9


Actualmente no está disponible la opción de crear un nuevo proyecto de Java 9 como tal ni siquiera en Netbeans, así que deberemos de crear un proyecto de Java normal, y de deshabilitar la compilación al guardar hasta que tengamos la estructura básica.

La estructura que voy a manejar es la siguiente:

la clase hola mundo podría ir también en el paquete raíz o por defecto, pero no es una práctica muy recomendada.

El archivo module info


El archivo module.info.java es el más importante en este tipo de proyecto, pues nos permite administrar mejor nuestro proyecto en caso de que interactúe con otros proyectos. para el caso de nuestro proyecto de hola mundo, no necesitaremos más que el módulo base, que afortunadamente viene importado por defecto.



Nuestro archivo tendrá la siguiente estructura:

module NOMBRE_DEL_MODULO{
     requires MODULOS_QUE_USA; 

}

En nuestro caso, su usaramos estrictamente la estructura quedaría algo así:

module holamundodejava {
     requires java.base; //imported by default
}


pero como ya mencionamos previamente, el módulo java.base viene importado por defecto así que lo obviaremos.

module holamundodejava {
}

Nuestro archivo Holamundodejava


El otro archivo de Java será bastante normal y lo pondré a continuación:

package holamundodejava;

/**
 * Class that greets the world
 *
 * @author Javatlacati
 */
public class Holamundodejava {

    /**
     * Application entry point.
     *
     * @param args the command line arguments
     */
    public static void main(final String... args) {
        System.out.println("Hola mundo");
    }

}








Preguntas Frecuentes

¿Si importo un proyecto tal como está podría compilarlo con Java 9?


Desafortunadamente no, el uso de Jigsaw requiere específicamente el uso de una nueva característica que es el uso de módulos. Si bien tu código se reusa, a veces podrías requerir analizar el nuevo sistema de módulos para saber exactamente que módulos usas.

¿Por qué no funciona en mi Netbeans?


Uso una versión de desarrollo tanto de Java 9 como de Netbeans 9, debido a que ambos están programados cerca de septiembre se deben bajar de ciertos repositorios especiales y no los hallarás tan fácilmente.

¿Por que no funciona con mi Java 9?


La versión de Java que estoy usando es de acceso prematuro con Jigsaw. Puedes descargarla del sitio de Oracle.

jueves, 16 de junio de 2016

Modernizando el blog

Este blog me representa un activo, tal vez no se genere mucho dinero, pero se genera permanentemente sin representarme ningún gasto, por ello decidí invertirle un poco de tiempo para plasmar mis habilidades y retribuir un poco de lo que he recibido; para ello, les voy a ir compartiendo algunos tips técnicos por si alguien tuviera problemas:

Edición y personalización de la plantilla:


Primeramente hay que notar que las plantillas en blogger no son como el html normal que conocemos, iniciaron como xhtml y actualmente para modernizarlo tienen html5 con muchos atributos no estándard. Esto ha causado que al estructura del blo que había personalizado en los tiempos del xhtml se corrompa ( en mi caso tengo dos head por ejemplo ).

Primera etiqueta: html


<html b:version="2" class="v2" expr:dir="data:blog.languageDirection" xmlns="http://www.w3.org/1999/xhtml" xmlns:b="http://www.google.com/2005/gml/b" xmlns:data="http://www.google.com/2005/gml/data" xmlns:expr="http://www.google.com/2005/gml/expr" dir="ltr">

De esta etiqueta no hay mucho que decir, únicamente se observa una versión y la direcicón del texto.

 Etiquetas específicas de Blogger:


Todaas las etiquetas que son exclusivamente apra el uso de blogger tienen el namespace b, es decir inician con una b luego tienen dos puntos y luego el nombre de la etiqueta.

Por ejemplo para configurar el área visible en dispositivos móbiles mi plantilla tiene el siguiente código:

<b:if cond='data:blog.isMobile'>
 <meta content='width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0' name='viewport'/>
 <b:else/>
 <meta content='width=1100' name='viewport'/>
</b:if>


Publicidad


Clicksor


Tengo varios bloques de publicidad en todo el sitio, el más visible y la primera publicidad que usé fue la de clicksor, por ser la más fácil de configura, pues cimplemente se agrega en al plantilla en la sección head un script como el siguiente:

<script type="text/javascript">
 //default pop-under house ad url
 clicksor_enable_pop = true;
 clicksor_enable_adhere = false;
 clicksor_frequencyCap = 0.1;
 durl = 55;
 clicksor_layer_border_color = 55;
 clicksor_layer_ad_bg = 55;
 clicksor_layer_ad_link_color = 55;
 clicksor_layer_ad_text_color = 55;
 clicksor_text_link_bg = 55;
 clicksor_text_link_color = 55;
 clicksor_enable_inter = true;
</script>
<!-- muestra publicidad a página completa de clicksor -->
<script src="http://a.horsered.com/show.php?nid=1&pid=230002&sid=373299" type="text/javascript">

Este código lo genera su sitio

Y como podrán ver básicamente significa que cada 6 minutos va a cargar una nueva publicidad que se puede mostrar como un pop up o como una publicidad intermitente. Actualmente no quiero el pop up así que lo deshabilito.

De als ventajas que tiene clicksor lo que más destacaría es que su sitio es muy fácil de usar, y que tienen videos de como agregar la publicidad, por ejemplo: https://www.youtube.com/watch?v=m2KV5GhzxEo&feature=youtu.be


Nota: Esta publicidad se coloca dentro de la primera etiqueta head que encontremos.

Kontextua


Esta publicidad desde mi opinión fué la mejor inversión de mi tiempo, pues es estrictamente la única de la cual he recibido dinero constantemente, pues no hay límite de ganancias apra retirar, mientras que en los demás provedores de publicidad se deben de reunir sumas como 5 dólares a partir de los centavos o mejor dichos milésimas de centavos que dejan.

Esta publicidad consiste en dos partes:

La primera es un script que obtiene los datos de la publicidad y el segundo es una etiqueta div donde queremos que se muestre.

Ambos se generan desde el sitio del proveedor. Hay 4 servicios actualmente, publicidad en palabras resaltadas, una nube de etiquetas relacionadas, publicidad en las imágenes y banners.


Una de las desventajas de Kontextua es que se conoce poco de como configurarlo, por ello explicaré mi configuración hasta donde lo he logrado.
Se debe ser cuidadoso al seleccionar las categorías debido a que serán los temas de los qeu se muestren anuncios, si ponemos anuncios de cosas que sabemos que a las personas que revisan nuestro blog o sitio no les agrada estaremos afectando directamente nuestros ingresos.


Finalmente en mi caso seleccioné que los enlaces de texto aparecieran con doble resaltado para que la gente pudiera saber que se trataba de publicidad y no pensara que es un virus.



El resultado final será:



En nuestra plantilla se debe de agregarel script se recomienda idealmente antes de terminar la etiqueta body, pero también funciona en el head.

AdHitz

Otro provedor de publicidad que tengo se centra en anuncios pequeños que agrego al final de cada post. Su sitio es horribe, pero  genera ganancias bastante rápido.
Es un proveedor bastante estricto, en cuanto a la temática del sitio, los lenguajes que acepta y acerca de la cantidad de tráfico, normalmente tardan cerca de una semana en resolver acerca de si te dan la publicidad o no. Si tu sitio es mucho más popular que el mío tienen un sistema de subastas, en el que tu puedes poner el precio mínimo que deseas recibir por cada anuncio mostrado.

La configuración es bastante dolorosa, esencialmente consta de 3 tediosísimos pasos

Primero se registran los datos de tu sitio en la sección MyWebSites



Seguidamente se crean zonas de anuncios.


Finalmente se genera el código para la sección de anuncios, si se te olvida el script deberás volverlo  a generar con su asistente desde cero.

En mi caso el código que se genera lo agrego al final de cada post manualmente y es:

<script src="//adhitzads.com/704203" type="text/javascript"></script>

De las ventajas que tiene es que soporta muchos más tamaños que AdSense, y que si sabes correr riesgos, podrias ganar bastante dinero con la publicidad si tu sitio es muy usado.

Adsense


Finalmente en este ámbito el indiscutible rey es AdSense, pues te otorga cerca de un 30 veces más comparado con los otros provedores, pero es mucho más estricto, para iniciar, ellos tienen la capacidad de analizar el tráfico con sus bots, así que si observan un flujo cercano a por lo menos 100 personas el úlimo mes te aceptan. Desde qeu se solicita Adsense hasta que genera ganancias pasan cerca de dos semanas en las que hacen sus pruebas, pues sus contenidos son personalizados para el usuario, así que en esas dos semanas hacen un perfil de los usuarios que visitan tu blog o sitio. Si no tienes claro a que tipo de personas les estas escribiendo, realmente te será muy complicado conseguir ganancias significantes.
Otra restricción, es que está prohibido que le des click a tu publicidad, ni siquiera por error, incluso si te interesa. La restricción más importante, es que no puedes solicitar explícitamente a tus usuarios que le den click a la publicidad, ni siquiera en redes sociales, pues en caso de que incumplas este u otros términos te cancelan tu cuenta y pierdes todo lo que pudieras haber ganado.
No toleran sitios declarados abiertamente de piratería, por el simple hecho de que les son problemáticos y podrían recibir sanciones.
De sus grandes ventajas está que se integra automáticamente si usas blogger y que puedes seleccionar las veces que aparece y dónde aparece mediante el editor de plantillas.

miércoles, 9 de marzo de 2016

JUnit para hacer pruebas unitarias desde Java a Javascript!

Introducción

 Cuando tenemos sistemas grandes para comprobar que nuestro código realice lo mínimo de las tareas necesarias correctamente es buena idea usar las pruebas unitarias y pruebas de integración a la aplicación. Una librería muy popular y fácil de usar es JUnit ya que nos permite hacer métodos para probar funcionalidades concretas de nuestro código Java. Desafortunadamente, resulta difícil probar de forma automatizada los códigos Javascript que se usan en aplicaciones empresariales de Java, en esta ocasión se presenta un enfoque sencillo para proveer esta funcionalidad en nuestras pruebas de JUnit que ya tengamos.

Prerequisitos


  1. Java 6 o superior
  2. JUnit

Explicación


Usaremos la Java Scripting API que está disponible desde Java 6 para ejecutar código javascript dentro de Java, teniendo en cuenta que existen algunas limitaciones:

  1. Los objetos de Window no se pueden llamar (tales objetos incluyen por ejemplo console y alert entre otros).
  2. No se puede hacer manipulación del DOM, sino que debe ser javascript en su más pura esencia.
En base a estas limitaciones, el uso con JUnit se limitará a probar funciones muy específicas en vez de códigos extensos.

Algunos ejemplos

Hola mundo del scripting API

En este ejemplo comprobamos simplemente que si hay un objeto lo podamos obtener desde Java.

public class PruebasJavascript{
@Test
    public final void testJavascript() {
        System.out.println("Probando Javascript\n===================");

        ScriptEngineManager  administrador =
                new ScriptEngineManager();
        ScriptEngine engine=administrador.getEngineByName("javascript");
        ScriptContext context = engine.getContext();
      
        String script = "'Hola mundo!'";
        try {
            String expResult = "Hola mundo";
            engine.eval(script);
            String result=writer.toString();
            //System.out.println(String.valueOf(result)+"\n");
            assertEquals(expResult, result);
        } catch (ScriptException e) {
            fail("Error");
        }
    }


Inferir salida

En este ejemplo obtenemos valores impresos por el script para inferir el resultado de la ejecución. Favor de notar que como ya se dijo antes, alert y console.log no funcionarán, por ello usamos print.

public class PruebasJavascript{
@Test
    public final void testJavascript() {
        System.out.println("Probando Javascript\n===================");

        ScriptEngineManager  administrador =
                new ScriptEngineManager();
        ScriptEngine engine=administrador.getEngineByName("javascript");
        ScriptContext context = engine.getContext();
        StringWriter writer = new StringWriter();
        context.setWriter(writer);
        String script = "print('Hola mundo!');";
        try {
            String expResult = "Hola mundo";
            engine.eval(script);
            String result=writer.toString();
            //System.out.println(String.valueOf(result)+"\n");
            assertEquals(expResult, result);
        } catch (ScriptException e) {
            fail("Error");
        }
    }


Usar un objeto de Java

A veces para las comparaciones es un poco más conveniente usar objetos de Java, ya sea para almacenar o para dar un mejor formato a la salida.

public class PruebasJavascript{
@Test
    public final void testJavascript() {
        System.out.println("Probando Javascript\n===================");

        ScriptEngineManager  administrador =
                new ScriptEngineManager();
        ScriptEngine engine=administrador.getEngineByName("javascript");
        ScriptContext context = engine.getContext();

        engine.put("out", System.out);
        String script = "out.println('Hello, world!');";
            engine.eval(script);
    }

Comprobar la existencia de la API

Adicionalmente, podemos incluso hacer una prueba para verificar que podamos ejecutar las pruebas unitarias que involucren Javascript.

 @Test
    public final void testScriptAPI() {
        boolean soportaJavasCript = false;
        ScriptEngineManager mgr = new ScriptEngineManager();
        List<ScriptEngineFactory> factories = mgr.getEngineFactories();
        for ( ScriptEngineFactory factory : factories ) {
            System.out.println("ScriptEngineFactory Info");
            String engName = factory.getEngineName();
            String engVersion = factory.getEngineVersion();
            String langName = factory.getLanguageName();
            String langVersion = factory.getLanguageVersion();
            System.out
                    .printf("\tScript Engine: %s (%s)\n", engName, engVersion);
            List<String> engNames = factory.getNames();
            for ( String name : engNames ) {
                System.out.printf("\tEngine Alias: %s\n", name);
            }
            System.out.printf("\tLanguage: %s (%s)\n", langName, langVersion);
            if (langName.equalsIgnoreCase("ECMAScript")) {
                soportaJavasCript = true;
                break;
            }
        }
        assertEquals(soportaJavasCript, true);
    }

Llamar funciones ( por fin! ) 

Ahora un ejemplo un poco más real... comprobemos el resultado de una función si le mandamos ciertos argumentos.
@Test
    public final void testEcho() {
        System.out
                .println("Probando función de intentos en Javascript\n===================");

        ScriptEngineManager administrador = new ScriptEngineManager();
        ScriptEngine engine = administrador.getEngineByName("javascript");
        ScriptContext context = engine.getContext();
        // Versión simplificada de index.jsp
        String script = "function echo(message) {return message;}";
        try {
            engine.eval(script);
            Invocable invocableEngine = (Invocable) engine;

            String expResult = "Hola";
            String result =
                    String.valueOf(invocableEngine.invokeFunction("echo",
                            "Hola"));
             System.out.println(String.valueOf(result)+"\n");
            assertEquals(expResult, result);

        } catch (ScriptException e) {
            fail("Error" + e);
        } catch (NoSuchMethodException nse) {
            fail("Error" + nse);
        }
    }

 Enlaces y Recursos


5 things you didn't know about ... the Java Scripting API

Scripting for the Java Platform

lunes, 22 de febrero de 2016

Incursionando en netbeans para Java 9


Sí... este post es un spoiler para aquellos que no les gusta esperar ( seamos sinceros a casi andie le gusta esperar ) .

Prefacio


Oficialmente Java 9 saldrá en Septiembre de este año 2016, pero... ( Spoiler alert ) ya se puede tener acceso a builds previos. Lo cual es una noticia realmente excelente, pues la forma en que Oracle muestra su interés por los apasionados de Java.

De momento solamente sé de 3 tipos de JVM que soportan Java 9:

  1. OpenJDK ( Como zulu no me funcionó tan bien y está basado en OpenJDK aún no lo pruebo )
  2. Zulu
  3. Oracle JDK ( Antes conocido como Sun SDK )
Yo me interesé gracias a Zulu, que es a pesar de ser una versión open source, una versión robusta y ligera con enorme soporte empresarial ( Y me agrada porque no trae JavaFX, ustedes saben.. la tecnología que nunca logró sorprender a nadie ) .

Mi primer intento fue bajar el Zulu desde su página: http://zulu.org/zulu-9-pre-release-downloads/.
La primera sorpresa fue que no había JRE... sí... se pretende las herramientas de desarrollo sean las mismas herramientas para ejecutar los programas de Java. El Oracle JDK si presenta un JRE para su descarga, pero... su ejecutable de java es deficiente... por lo que uno termina usando el ejecutable java del SDK.

Desafortunadamente, hasta el momento no he podido correrlo con mi editor favorito que es Netbeans, aunque el personal de esta empresa es muy amable y está atento a todo el que se interese en Zulu, así que no dudo que ya se estén encargando de ello.

Así que... primero vamos a los errores y como resolverlos para ahorrarles tiempo.

Versión de netbeans correcta


Ese será el primer problema... como ni siquiera está disponible la versión final de jigsaw, podrían presentarse complicaciones.

La versión más estable y con soporte apra jigsax se puede descargar de http://deadlock.netbeans.org/job/NB-for-JDK9_jigsaw/ws/dist/zip/ donde sacan una versión diariamente en mi caso yo bajé esta versión.

 Para configurar el netbeans deberá tener instalada una JVM 8 y una JVM 9, configura la 8 como la máquina virtual de netbeans.

Posiblemente el primer error que encontremos tras crear un hola mundo como lo haríamos normalmente sea
 

Unrecognized option: -modulepath
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
C:\Users\Administrador\AppData\Local\NetBeans\Cache\dev\executor-snippets\run.xml:136: The following error occurred while executing this line:
C:\Users\Administrador\AppData\Local\NetBeans\Cache\dev\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 0 seconds)


El error se debe a que por defecto está habilitada la opción de compilar al guardar, y netbeans trata de compilar con la máquina virtual de Java 8. Para ello deberemos deshabilitar esa opción para deshacernos del error en el run.xml.


Tras ello nos quedará el error:
module-info.java doesn't exist

Esto es debido a que Java 9 ( con jigsaw ) se organiza por módulos y no solamente por paquetes como estábamos acostumbrados, para ello existe un nuevo "tipo" de archivo que podremos encontrar, el module-info.

continuará...