jueves, 25 de julio de 2013

Programando en Java ... no. 4

Más ejemplos de programas en Java, son muy sencillos. No hay gran ciencia en ellos.



Hay dos formas de escribir programas sin errores; sólo la tercera funciona. ::Alan J. Perlis::



1. Instancia a una interface, nos imprimirá "prueba"
package codemonkey;

public class Codemonkey{
  public static void main(String[] args) {
    System.out.println(new Servicio(){public String toString(){return "prueba";}});
  }
}

interface Servicio{
  public abstract String toString();
}

2. Modificamos el anterior código para obtener una cadena al revés,  definimos un nuevo método getReverse() dentro de la interface.
package codemonkey;

public class Codemonkey{
  public static void main(String[] args) {
    System.out.println(new Servicio(){public String getReverse(){
// usamos StringBuffer para obtener la cadena al revés
     StringBuffer reversa = new StringBuffer("esto es un ejemplo del uso de interfaces Java");
      reversa = reversa.reverse();
      return reversa.toString();
    }
    });
  }
}

interface Servicio{
  public abstract String getReverse();
}
3. Ejemplo de una clase usando el Patrón Singleton; la clase tendrá un método que nos devolverá un número aleatorio.
package codemonkey;

import java.util.Random;

public class Codemonkey{
  public static void main(String[] args) {
    Aleatorio miNumero=Aleatorio.getAleatorio();
    System.out.println("numero: "+miNumero.aleatorio());
  }
}

//patrón singleton
class Aleatorio{

  private static Aleatorio aleatorio=null;
  private Aleatorio(){}

  public static Aleatorio getAleatorio(){
    if(aleatorio==null){
      aleatorio=new Aleatorio();
    }
    return aleatorio;
  }

  public int aleatorio(){
    int numero=0;
    Random rand=new Random();
    numero=(int)rand.nextInt()*100;
    return numero;
  }

}

4. Uso de subList
package codemonkey;
import java.util.List;
import java.util.ArrayList;

public class Codemonkey{

  public static void main(String[] args) {
    List<Integer> listaPrincipal=new  ArrayList<Integer>();
//llenamos la lista con números enteros
    listaPrincipal.add(1);
    listaPrincipal.add(2);
    listaPrincipal.add(3);
    listaPrincipal.add(4);
    listaPrincipal.add(5);
    listaPrincipal.add(6);
    listaPrincipal.add(7);
    listaPrincipal.add(8);
//definimos 2 listas
    List<Integer> listaA=listaPrincipal.subList(0,4); // iniciara en 0 y finalizara en el índice 4
    List<Integer> listaB=listaPrincipal.subList(4,listaPrincipal.size()); // inicia en 4 y termina hasta el final de la lista
    System.out.println("lista principal: "+listaPrincipal);
    System.out.println("lista A: "+listaA);
    System.out.println("lista B: "+listaB);
  }
}
¿Quieres ver más ejercicios de programación?
http://ejerciciosdeprogramacion.com

domingo, 21 de julio de 2013

Perl: Comparativa con Powershell

Powershell es la respuesta (bastante tardada) de Microsoft al shell de Unix/Linux debido a las limitantes del batch MS-DOS.

Tanto Perl como Powershell permiten automatizar tareas, por ejemplo, mediante un script podemos ejecutar un proceso del sistema operativo, buscar un archivo en directorios, encender/apagar el sistema, entre otras cosas más.

Para hacer uso de Powershell debemos tener instalado el .Net framework http://www.microsoft.com/es-mx/download/details.aspx?id=17851 

Abrir la terminal de comandos y teclear: powershell  o bien abrirlo directamente--> Ejecutar: powershell
En Powershell los archivos tienen la extensión *.ps1, en Perl *.pl
1. Hola mundo
hola.ps1
# esto es un comentario
"Hola, mundo desde powershell !!"
#también se puede hacer esto
Write-Host  "Hola, mundo desde powershell !!"

hola.pl
#esto es un comentario
print "Hola, mundo desde Perl !!\n";

2. Paso de parámetros desde terminal
argumentos.ps1
#la declaración de variables es muy parecida a Perl
$args
"no. de parametros: $($args.count)"

argumentos.pl
use strict;
use warnings;

my $tam=scalar(@ARGV);
print "no. de parametros: $tam\n";

3. Uso de for
for.ps1
$args
"no. de parametros: $($args.count)"
foreach($arg in $args){
write-host "$1"
}

for.pl
use strict;
use warnings;

my $tam=scalar(@ARGV);
print "no. de parametros: $tam\n";

for(@ARGV){
  print "$_\n";
}

4. Introducir datos
entrada.ps1
$nombre= Read-Host "Introduce tu nombre: "
Write-Host "Hola $nombre"

entrada.pl
print "Tu nombre: ";
chomp(my $nombre=<STDIN>);
print "Hola $nombre\n";

5. Una simple función
funcion.ps1
function mensaje{
  "soy un simple mensaje"
}
#invocar
mensaje()

funcion.pl
sub mensaje{
  print "soy otro simple mensaje\n";
}
#invocar
mensaje();

6. Uso de if
if.ps1
$valor=18
$edad=read-host "Tu edad es "
if($edad -ge $valor){
write-host "correcto, puedes votar"
}else{
write-host "incorrecto,  no puedes votar todavia"
}

if.pl
my $valor=18;
print "Tu edad: ";
chomp(my $edad=<STDIN>);
if($edad ge $valor){
  print "correcto, puedes votar\n";
}else{
  print "incorrecto, no puedes votar todavia\n";
}

7. Conocer la ubicación del directorio donde se encuentra el script
ubicacion.ps1
<#
esto
es un comentario
multilínea en PS
#>
$ubicacion=gl
write-host $ubicacion

ubicacion.pl
=comment
este es
un comentario
multilínea en Perl
=cut
my $dir=`cd`;
print $dir;


ACTUALIZACIÓN:
La desventaja principal que tiene Powershell es que solo funciona en entornos Windows
ACTUALMENTE SE PUEDE USAR POWERSHELL EN ENTORNOS LINUX & MAC OS





sábado, 13 de julio de 2013

Otros lenguajes de programación

No todo es Java, ni C, ni C++ ni mucho menos .Net.

Existen muchas otras alternativas como:

  • Ceylon
  • Clojure
  • Erlang
  • Go
  • Haskell
  • Kotlin
  • R
  • Entre otros más
¿Por qué usar un nuevo lenguaje de programación?
Todo cambia (no es bueno confiarse), antes se usaba lenguajes como COBOL, Fortran y hasta Pascal  para realizar  cálculos matemáticos, científicos, en las empresas, etc.  Sin embargo, surgían nuevos lenguajes que facilitaban el aprendizaje y enseñanza de la programación.

  • Los programadores buscaban (buscan) algo más fácil de aprender y usar (si todo fuera tan fácil ...)
  • Evitar depender de un solo sistema operativo o plataforma (ups .Net)
  •  Hacer más rápido el trabajo (...)
  • cientos de cosas más (jeje)
Cuando te pidan cambiar de lenguaje de programación es bueno estar siempre preparado. 

No vaya ser que dejen de usar Java donde trabajas y te pidan usar Python.

--Editado
Hay muchas razones más para usar otros lenguajes a parte de Java, C, C++ y .Net, no solo porque hay más:

  • El cliente elije la plataforma de desarrollo, a veces aunque no exista un análisis previo del por que lo hacen
  • Los sistemas se migran a la tecnología más actual
  • El framework que se usaba dejo de tener soporte
  • etc.


"Si los constructores construyeran edificios como los programadores programan aplicaciones, un pájaro carpintero podría destruir toda la civilización." ::Gerald Weinberg::


¿Cuál es el propósito?
Conocer cual es el propósito de tu aplicación, ¿se trata de una aplicación web?, ¿una aplicación móvil?, etc. 



  • R: Si necesitas realizar cálculos estadísticos
  • Python: Aplicaciones clásicas(por terminal), GUI, y hasta aplicaciones web
  • Processing: Aplicaciones multimedia
  • Entre otros más
¿Cuánto tiempo me va llevar aprenderlo?
El tiempo necesario, esto es relativo depende de cada persona y el tiempo invertido. Hay personas que en poco tiempo ya son capaces de crear sus propias aplicaciones y otras a quienes les lleva mucho más tiempo.

La práctica constante da resultados.

Links

domingo, 7 de julio de 2013

Programando en Java ... no. 3

Java sigue siendo el lenguaje más usado para desarrollo de aplicaciones, le busquen donde le busquen sigue manteniendo el top de los lenguajes de programación.

Aunque no es del todo bueno usar solo uno.



Manejo de Excepciones

Alguna vez tuve que hacer una clase que manejara errores (o los gestionara), el código más o menos era algo como esto:
// clase Principal
public class Codemonkey{

  public Codemonkey(){}

  private TestMiExcepcion test=new TestMiExcepcion();

  public static void main(String[] args)throws MiExcepcion{
     // en esta parte se encuentra el método "manejaExcepcion"
      new Codemonkey().test.manejaExcepcion(args);
   
  }
}
//esta es la "clase Exception" definida
class MiExcepcion extends Exception{
  public MiExcepcion(String msg){
    super(msg);
  }
}
/* esta es la clase que contiene la información del error, en este caso se trata de un vector nulo o con tamaño cero*/
class TestMiExcepcion{
  public TestMiExcepcion(){}

  public void manejaExcepcion(String[] vector)throws MiExcepcion{
    if(vector.length==0){
      // esta es la información del error
      throw new MiExcepcion("el tamanyo del arreglo no debe ser cero");
    }
    else if(vector==null){
      throw new MiExcepcion("el vector no debe ser nulo");
    }
  }
}

Todo en un archivo llamado "Codemonkey.java" , es un ejemplo de crear tus propias excepciones. Aqui hay más ejemplos http://stackoverflow.com/questions/1754315/how-to-create-our-own-exceptions-in-java



En muchos casos es bueno definir nuestras propias excepciones, así tendremos una mejor perspectiva de como resolver los problemas en nuestro código (a veces no basta poner try-catch en cada línea de código).

Aquí más código
1. Otro ejemplo de uso de interfaces, clases abstractas y herencia

public class Ejemplos{
  public static void main(String[] args) {
    Persona deportista= new Deportista("Homero","Simpson","Thompson",36,2,"Futbol");
    deportista.ver();
  }
}

abstract class Persona implements Servicios{

  public static final boolean VALOR=true;

  private String nombre;
  private String apellidoPaterno;
  private String apellidoMaterno;
  private int edad;

  public Persona(){}

  public Persona(String nombre,String apellidoPaterno,String apellidoMaterno,int edad){
    this.nombre=nombre;
    this.edad=edad;
    this.apellidoPaterno=apellidoPaterno;
    this.apellidoMaterno=apellidoMaterno;
  }

  public boolean setNombre(String nombre){
    this.nombre=nombre;
    return VALOR;
  }

  public boolean setEdad(int edad){
    this.edad=edad;
    return VALOR;
  }

  public boolean setApellidoPaterno(String apellidoPaterno){
    this.apellidoPaterno=apellidoPaterno;
    return VALOR;
  }

  public boolean setApellidoMaterno(String apellidoMaterno){
    this.apellidoMaterno=apellidoMaterno;
    return VALOR;
  }

  public String getNombre(){
    return nombre;
  }

  public int getEdad(){
    return edad;
  }

  public String getApellidoPaterno(){
    return apellidoPaterno;
  }

  public String getApellidoMaterno(){
    return apellidoMaterno;
  }

  public abstract String verTodo();

}


interface Servicios{
public abstract void ver();
}

class Deportista extends Persona{
  private int horas;
  private String deporte;

  public Deportista colocarDatos(int horas,String deporte){
    this.deporte=deporte;
    this.horas=horas;
    return this;
  }

  public Deportista(){}

  public Deportista(String nombre,String apellidoPaterno,String apellidoMaterno,int edad,int horas,String deporte){
    super(nombre,apellidoPaterno, apellidoMaterno,edad);
    this.horas=horas;
    this.deporte=deporte;
  }

  @Override
  public void ver(){
    System.out.printf("%s\n",verTodo());
  }

  @Override
  public String verTodo(){
    return "nombre: "+getNombre()+"\napellido paterno: "+getApellidoPaterno()+"\napellido materno: "+getApellidoMaterno()+"\nedad: "+getEdad()+"\nhoras: "+horas+"\ndeporte: "+deporte;
  }

}

2. Cálcular el Imc
import java.util.List;
import java.util.ArrayList;

public class Ejemplos{
  public static void main(String[] args) {
    Imc horacio=new Imc();
    horacio.setPeso(45.0);
    horacio.setTalla(1.60);
    Imc andres= new Imc(67.0,1.66);
    List<Imc> listaImc=new ArrayList<Imc>();
    listaImc.add(horacio);
    listaImc.add(andres);

    for(Imc imc: listaImc){
      System.out.printf("peso: %f - talla: %f  - imc obtenido: %f\n",imc.getPeso(),imc.getTalla(),imc.getIMC());
    }
 
  }
}

class Imc{
  private double peso;
  private double talla;

  public Imc(){}
  public Imc(double peso,double talla){
    this.talla=talla;
    this.peso=peso;
  }

  public double getIMC(){
    return peso/(talla*talla);
  }

  public boolean setPeso(double peso){
    this.peso=peso;
    return true;
  }

  public double getPeso(){
    return peso;
  }

  public boolean setTalla(double talla){
    this.talla=talla;
    return true;
  }

  public double getTalla(){
    return talla;
  }
}
3. Calcular la frecuencia cardíaca máxima:
import java.util.Scanner;

public class Codemonkey{
  public static void main(String[] args)throws MiExcepcion {
      int edad=0;
      double porc=0.0;
      Scanner teclado=new Scanner(System.in);
      do{
        System.out.println("Introduce tu edad:");
        edad=teclado.nextInt();
      }while(edad<=0);

      do{
        System.out.println("Introduce % de esfuerzo a realizar: ");
        porc=teclado.nextDouble();
      }while(porc<=0.0);

      System.out.println("frecuencia cardiaca maxima obtenida: "+porcentaje(obtenerFcmax(edad),porc));
  }

  public static int obtenerFcmax(int edad)throws MiExcepcion{
    int frecuencia=0;
    if(edad<=0){
      throw new MiExcepcion();
    }
    frecuencia=(220-edad);
 
    return frecuencia;
  }

  public static double porcentaje(double puls,double porc)throws MiExcepcion{
    double porcen=0.0;
      if(puls==0.0 ||  porc==0.0){
        throw new MiExcepcion("no debe haber valores nulos, menores o iguales a cero");
      }

      porcen=(porc/100)*puls;
    return porcen;
  }

}

class MiExcepcion extends Exception{
  public MiExcepcion(){super("la edad no debe ser cero o nula");}
  public MiExcepcion(String msg){super(msg);}
}

El problema de los programadores es que nunca saben lo que están haciendo hasta que es demasiado tarde. ::Seymour Cray::

Links
http://www.arrakis.es/~abelp/ApuntesJava/GestionExcepciones.htm

domingo, 30 de junio de 2013

Groovy para novatos


Groovy es un lenguaje dinámico que permite usar el API de java para crear código más sencillo de leer y entender.

El código generado es compatible con los bytecodes (.class) de un programa java.



Algunos ejemplos en Groovy.
1. Ejecutar desde línea de comandos
Ver la versión: groovy -version
Compilar: groovyc script.groovy
Ejecutar: groovy script.groovy
2. Paso de parámetros (desde línea de comandos)
Le paso un parámetro: groovy -e "println 'Hola '+args[0]" Juan 
Debería imprimir:
Hola Juan 

Ahora paso varios parámetros:
groovy -e "if(args){args.each{println 'Hola '+it } }else{ println 'no hay argumentos'}" Alma Karla Johnatan Belem Ricardo 

Debería imprimir:
Hola Alma
Hola Karla
Hola Johnatan
Hola Belem
Hola Ricardo 

3. Obtener las propiedades del sistema
Vamos a usar System.getProperty, para conocer el SO:
  def sistemaOperativo(){ 
 return System.getProperty("os.name") 

 def ver(so){ 
 if(so.toLowerCase().contains("win")){ 
 println "windows" 
 } else if(so.toLowerCase().contains("mac")){
 println "mac" 
 } else if(so.toLowerCase().equalsIgnoreCase("nix")){ 
 println "unix" 
 } else{ 
 println so 
 } 
} def inicio(){ 
 ver(sistemaOperativo()) 

//invoco el método principal 
inicio()
4. Usar "assert"
Nos sirve para depurar nuestro código.
def groovy="Groovy" // tiene 6 caracteres 
 assert groovy.size()==8 // es obvio que será error 
Obtenemos esto:
Caught: Assertion failed:

assert groovy.size()==8
       |      |     |
       Groovy 6     false

Assertion failed:

assert groovy.size()==8
       |      |     |
       Groovy 6     false

        at Groov.run(Groov.groovy:127)

Si cambiamos el código
def groovy="Groovy" // tiene 6 caracteres 
assert groovy.size()==6 // correcto 

No producirá nada, eso indica que esta bien.
5. Clases
class Persona{ 
 def nombre 
 def edad 
 def verDatos(){ 
 return "nombre: $nombre ,edad: $edad" 
 } 
 def getEdad(){ edad } 
 def getNombre(){ nombre } 

 def persona=new Persona(nombre:"Ignacio",edad:41) 
println "nombre: $persona.nombre ,edad: $persona.edad" 
println persona.verDatos() 
println "nombre: "+persona.getNombre()+" , edad: "+persona.getEdad()
6. Entrada de datos
def entrada=new java.util.Scanner(System.in) 
println "Introduce tu nombre:" 
def nombre=entrada.nextLine() 
println "Hola ${nombre}"
7. Ejecutar comandos
Dese línea de comandos:
groovysh
println "dir".execute().text 
En un script:
println "teclea comando" 
 def comandoWin=teclado.nextLine() 
 def sub="cmd /c "+comandoWin 
 println sub 
 Process proceso = sub.execute() 
 println "${proceso.text}"
8. try-catch
try{ 
 println "inicio"
 // más código...
 }catch(e){
 println "error ${e.getCause()}"
 } finally{ 
 println "fin..." 
}


Hay más cosas sobre Groovy.
"Si la depuración es el proceso de eliminar errores, entonces la programación debe ser el proceso de ponerlos" ::Edsger Dijkstra::
Links:
Clojure comparativa con Groovy 
Groovy comparativa con otros lenguajes 
http://codemonkeyjunior.blogspot.mx/2012/02/groovy-programando-al-estilo-java.html
http://codemonkeyjunior.blogspot.mx/2012/11/programando-en-groovy-al-estilo-java-no.html
Cómo hacer prueba a un script Groovy (@rodrigo salado anaya)

domingo, 23 de junio de 2013

Programando en Ruby ... no. 1

["¿Qué es Ruby?","Un poco de historia"]
Ruby es un lenguaje de programación orientado a objetos, muy parecido a Perl y Python.

El creador del lenguaje (Yukihiro  Matsumoto) pretendía hacer un lenguaje "parecido al lenguaje humano".

#este es un comentario
puts "¡Hola, mundo!"

Ruby posee un REPL, si usas una terminal (Windows MS-DOS, Linux) teclea  "irb". Puedes probar como funciona en esta página: http://tryruby.org/levels/1/challenges/0


irb(main):001:0>7+43
=>50
irb(main):002:0>"Codemonkey".reverse
=>yeknomedoC
Ejecutar: ruby programa.rb
1. Mostrar el abecedario
letras=('a'..'z')
for letra in letras
  puts "#{letra}"

end

2. Identificar sistema operativo y ejecutar comando
sistema=ENV['os']

def escribeComando()
  puts "Escribe comando: "
  comando = STDIN.gets.chomp()
  puts "comando a ejecutar: "+comando
  system(comando)
end

if sistema=="Windows_NT"
  puts "Windows"
  escribeComando()
else
  puts "Otro"
  escribeComando()
end

3. Uso  de "try-catch"
begin #try
p "Libro de Ann: "+mapa["Ann"]
p "Libro de Lucio: "+mapa["Lucio"]
rescue #catch
@error_message="#{$!}"
ensure #finally
puts "Fin..."
end

4.Paso de parámetros, mostrar en mayúsculas
ARGV.each do |arg|
  arg=arg.upcase
  puts "hola #{arg}"

end

sábado, 22 de junio de 2013

Programando en Java ... no. 2


Uso de clases abstractas e interfaces
  • Clase principal: Ejemplos
  • Interface: Servicio
  • Clase asbtracta: Persona
  • Clase "hija": Obrero
El programa obtiene 6 parámetros: nombre, apellido paterno, apellido materno, edad, tasa y horas

Calcula el salario neto y el salario bruto de una persona.


public class Ejemplos{
    public static void main(String[] args)throws Exception {
       if(args.length!=0){
Persona obrero=new Obrero(args[0],args[1],args[2],Integer.parseInt(args[3]), Double.parseDouble(args[4]),Integer.parseInt(args[4]));
        obrero.ver();
        }else{
            System.out.println("No hay argumentos:\n"+uso());
        }
    }
    static String uso(){
        return "java Ejemplos <nombre> <apellidoPaterno> <apellidoMaterno> <edad> <tasa> <horas>";
    }
}

interface Servicio{
    public abstract void ver();
}
abstract class Persona implements Servicio{
    protected String nombre;
    protected String apellidoPaterno;
    protected String apellidoMaterno;
    protected int edad;
    public abstract String obtenerDatos();
    public abstract double obtenerSalarioNeto();
    public abstract double obtenerSalarioBruto();

    public Persona(){}

    public Persona(String nombre,String apellidoPaterno,String apellidoMaterno, int edad){
        this.nombre=nombre;
        this.apellidoPaterno=apellidoPaterno;
        this.apellidoMaterno=apellidoMaterno;
        this.edad=edad;
    }

    public String getNombre(){
        return nombre;
    }
    public String getApellidoPaterno(){
        return apellidoPaterno;
    }

    public String getApellidoMaterno(){
        return apellidoMaterno;
    }

    public int getEdad(){
        return edad;
    }

}

class Obrero extends Persona{
    public double tasa;
    public int horas;


    public static final double VALOR1=1.5;
    public static final double VALOR2=0.9;

    public Obrero(){
    }

    public Obrero(String nombre,String apellidoPaterno,String apellidoMaterno,int edad,double tasa,int horas){
        super(nombre,apellidoPaterno,apellidoMaterno,edad);
        this.tasa=tasa;
        this.horas=horas;
    }

    @Override
    public double obtenerSalarioBruto(){
        double salarioB=0.0;
        int extras=0;
        if(horas<=38){
            extras=0;
        }else{
            extras=horas-38;
            horas=38;
        }
        salarioB=horas*tasa+extras*tasa*VALOR1;
        return salarioB;
    }

    @Override
    public double obtenerSalarioNeto(){
        double salarioN=0.0;
        if(obtenerSalarioBruto()<=300){
            salarioN=obtenerSalarioBruto();
        }else{
            salarioN=obtenerSalarioBruto()*VALOR2;
        }
        return salarioN;
    }

    @Override
    public void ver(){
        System.out.println(obtenerDatos());
    }

    @Override
    public String obtenerDatos(){
        return "Obrero(nombre: "+nombre+" , apellido paterno: "+apellidoPaterno+" , apellido materno: "+apellidoMaterno+" , edad: "+edad+" , tasa: "+tasa+" , horas: "+horas+" , salario bruto: "+obtenerSalarioBruto()+" , salario neto: "+obtenerSalarioNeto();
    }
}


Vibe Coding y el Prompt engineering

Según san Google, la Ingeniería de prompts (prompt engineering) es: el arte y la ciencia de estructurar, diseñar y optimizar las entrada...

Etiquetas

Archivo del blog