Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Gus Garsaky

#41
¡Elektro! Qué tal amigo, qué bueno verte por aquí compañero. Espero te pases seguido.

Buen aporte compañero, un saludo.
#42
¿Estás seguro que es la ruta correcta? Fíjate lo que dice el rastreo de pila:

CitarW/System.err﹕ java.io.IOException: Error running exec(). Command: [/bin/chmod, 755, /data/data/com.hackloper.probando/cache/jave-1/ffmpeg]
W/System.err﹕ Caused by: java.io.IOException: No such file or directory

He aquí la importancia de saber interpretar las excepciones y el rastreo de pila.

Si no tienes permisos root, creo que poco vas a poder hacer. He encontrado una forma de hacerlo funcionar sin permisos root que se describe en StackOverFlow: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Saludos.

#43
Dudas y pedidos generales / Re:Error boot ubunt
Mayo 14, 2015, 03:26:28 PM
¿Tienes una partición de Windows activa? Si es así puedes recuperar el MBR. Solo necesitas el DVD o un USB bootable con Windows 8 y hacer lo siguiente:

  • Cuando inicie Windows click en Reparar Windows.
  • En la siguiente pantalla, elije Solucionar problemas y posteriormente Opciones avanzadas.
  • En opciones avanzadas elije el símbolo de sistema e ingresa los siguientes comandos:

    Código: bash
    bootrec /fixmbr
    bootrec /fixboot
    bootrec /RebuildBcd
    exit


    Y reinicia el equipo en modo normal. Si todo ha salido bien, se arreglará el MBR de windows y podrás ingresar. Por el momento, puedes probar con Hirens boot para recuperar tu info.

    Saludos.
#44
Java / Re:Mini curso Java [En progreso]
Mayo 14, 2015, 03:14:01 PM

#10 - ESTRUCTURAS DE CONTROL




Definición: Llamadas también estructuras condicionales, son un mecanismo que nos permite evaluar expresiones o condiciones y actuar de acuerdo a ello. Las estructuras de control nos proveen flujos que se tomará de acuerdo a si una condición o expresión se cumple o si no se cumple; ésto nos permite decidir entre uno o más caminos de acuerdo a un suceso y por ende aplicar diferentes lógicas y procesos de acuerdo al camino tomado.

1. ELEMENTOS

Una estructura de control tiene 3 elementos, que pasaremos a listar y a describir a continuación.

1.1 IF (si)

El elemento if evalúa si una expresión es verdadera, es decir, se cumple; a ésto le llamamos condición. La sintaxis es:

if(<expresión>)

Ejemplo:

Código: java
if(20/2 == 10) {
System.out.println("El resultado es diez");
}


El ejemplo anterior se puede traducir en pseudocódigo como:

Código: text
Si 20 entre 2 es 10, entonces:
Imprimir "El resultado es diez"
Fin Si


En caso la condición no se cumpla (20 / 2 no diera como resultado 10), no se imprimiría el texto. Si quisiéramos que en caso la condición no se cumpla, necesitaremos un else.

1.2 ELSE (si no)

El elemento else se usa cuando se desea tomar un flujo alternativo, es decir, cuando la condición evaluada en el if no se cumple, se ejecutará lo que hemos escrito en el else. La sintaxis es:

if(<expresión>) {
   // flujo normal
} else {
   // flujo alternativo   
}


Ejemplo:

Código: java
if(20 * 5 == 100) {
System.out.println("El resultado es 100");
} else {
System.out.println("El resultado no es 100");
}


En pseudocódigo, se puede resumir en:

Código: text
Si 20 * 5 = 100, entonces:
Imprimir "El resultado es 100"
Si no:
Imprimir "El resultado no es 100"
Fin Si


1.3 ELSE IF

Existe el caso en que queramos evaluar más de una condición y si ninguna se cumple tome el flujo else. Veamos la sintaxis:

if(<expresión>) {
   
} else if(<expresión>) {
   
} else if(<expresión>) {
   
} else {
   
}


Ejemplo:

Código: java
Scanner reader = new Scanner(System.in);
byte edad = 0;

System.out.print("Ingrese su edad:");
edad = reader.nextByte();

if(edad < 18) {
System.out.println("Usted es niño o adolescente");
} else if(edad > 17 && edad < 21) {
System.out.println("Usted es un joven");
} else if(edad > 20 && edad < 60) {
System.out.println("Usted es un adulto");
} else {
System.out.println("Usted es un anciano");
}


En pseudocódigo:

Código: text
Ingresar edad como entero
Si edad < 18, entonces
Imprimir "Usted es niño o adolescente"
Si no
Si edad > 17 y edad < 21, entonces
Imprimir "Usted es joven"
Fin Si
Si no
Si edad > 20 y edad < 60, entonces
Imprimir "Usted es un adulto"
Fin Si
Si no
Imprimit "Usted es un anciano"
Fin Si



2. Ejercicios



Practiquemos un poco las estructuras de control con unos ejercicios.

2.1 Calcular área de un triángulo. Si el área es menor a 10, imprimir "El triángulo es pequeño". Si el área está entre 10 y 25, imprimir "El triángulo es mediano". Si el área es mayor a 25, imprimir "El triángulo es grande".

Solución:

Analicemos el enunciado. El objetivo principal es calcular el área de un triángulo. ¿Qué necesitamos?

A) Base
B) Altura

Las que desconocemos. Por lo tanto, si las desconocemos deberemos pedírselas al usuario y luego, almacenar el área en una variable para evaluarla luego con las condiciones que se nos han dado. Veamos el pseudocódigo:

Código: text
Ingresar base como real
Ingresar altura como real
Declarar area como real
area = base * altura / 2
Si area < 10, entonces
Imprimir "El triángulo es pequeño"
Si no
Si area >= 10 y area < 20, entonces
Imprimir "El triángulo es mediano"
Fin Si
Si no
Imprimir "El triángulo es grande"
Fin Si


Ya tenemos la solución, ahora hay que plasmarla en código Java:

Código: java
public class Clase09 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        float base;
        float altura;
        float area;
       
        System.out.println("Ingrese la base");
        base = reader.nextFloat();
        System.out.println("Ingrese la altura");
        altura = reader.nextFloat();
       
        area = (base * altura) / 2;
       
        System.out.println("Área: " + area);
        if(area < 10) {
            System.out.println("El triángulo es pequeño");
        } else if(area >= 10 && area < 20) {
            System.out.println("El triángulo es mediano");
        } else {
            System.out.println("El triángulo es grande");
        }
    }
}


EJERCICIOS PROPUESTOS

1. Ingresar un número de un mes y decir su nombre.
2. Ingresar un número e imprimir si es primo o no.
3. ingresar tres números e imprimirlos de mayor a menor.


EXTRA



Es posible colocar if simultáneos. La razón para colocarlos es simple:

"Utilizaremos if simultáneos en lugar de else if, cuando más de una condición puede cumplirse, es decir, si se cumple la primera condición, seguirá evaluando el resto de condiciones. utilizaremos else if, cuando solo úna condición debe cumplirse. En cuanto una condición se cumpla, rompe toda la estructura if, elseif y else."

Ejemplo:

Código: java
public class Clase09 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        float base;
        float altura;
        float area;
       
        System.out.println("Ingrese la base");
        base = reader.nextFloat();
        System.out.println("Ingrese la altura");
        altura = reader.nextFloat();
       
        area = (base * altura) / 2;
       
        System.out.println("Área: " + area);
        if(area < 10) {
            System.out.println("El triángulo es pequeño");
        if(area > 10) {
            System.out.println("El triángulo es mediano");
        if(area > 25) {
            System.out.println("El triángulo es grande");
        }
    }
}


Si el área fuera resultara 30 por ejemplo, se cumplirían las dos últimas condiciones:

CitarEl triángulo es mediano.
El triángulo es grande.

Espero se haya entendido el funcionamiento de las estructuras de control. Nos vemos.
#45
Back-end / Re:Tuneando el doc root de Apache
Mayo 14, 2015, 01:23:20 PM
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Gracias man, pensaba algo así pero como lo hice así en un ratito, pues lo hice bien simple. Si lo modificas, lo colocas para verlo.

@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta Gracias blacky xD, no es un aporte como tal, es algo muy pequeñito pero se ve mejor xD
#46
Siempre que crees algún código, hazlo lo más limpio y modular posible. Es muy posible que ahora no le veas sentido, pero cuando hagas cosas complejas, si no sigues los principales principios de desarrollo, como DRY, SRP y facilitando el unit testing y otras cosas más importantes en el desarrollo, realmente tu aplicación será pobre desde el punto de vista de escalabilidad y llegará un punto en que se haga inmantenible y tengas que dar la aplicación por muerta, y será una pérdida grande económicamente.

Esos for pueden estructurarse mejor, de manera más limpia. Recuerda que en el mundo real, muchas personas van a ver tu código y éste deberá tener la suficiente calidad como para que lo puedan entender y mantener.

Me alegra que se haya resuelto tu duda. Un saludo.
#47
Java / Re:Mini curso Java [En progreso]
Mayo 14, 2015, 12:10:22 PM

#9 - STATIC




DEFINICIÓN: static es una palabra reservada muy especial en Java. Static puede usarse en atributos y métodos y su uso representa un estado especial y para explicarlo, necesitamos entender el concepto de cargador de clases o ClassLoader.

CLASSLOADER: Es un módulo especial dentro de la arquitecutra de la JVM (Java Virtual Machine) que se encarga de cargar las clases existentes y que hemos definido nosotros. Cuando el classloader carga una clase, lo hace con sus atributos y métodos pero éstos solo pueden ser accedidos cuando se cree un objeto (representación de esa clase) que los construya y que posteriormente los llame, a no ser, que éstos métodos o variables sean públicas y estáticas.

CitarVeremos el concepto de clases y objetos en el apartado POO (Programación rientada a objetos).

Veamos un ejemplo de la importancia de static. Tenemos una clase llamada Person (Persona) con un atributo (característica) llamado names (nombres). Éste atributo es público pero no es estático:

Código: java
public class Person {
    public String names = "Homer Simpson"; // modificador por defecto
}


Ahora, ¿como accedemos a él? Tendríamos primero que crear un objeto (representación) de la clase Person. Al  crear un objeto de Person, estamos creando los atributos especificados en la clase, es por ésta razón, que éstos solo pueden ser accedidos por objetos de aquella clase. Entonces, para mostrar el valor del atributo names, tendríamos que hacer algo así:

Código: java
public class Main {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.names);
}
}


CitarPor el momento, olvidemos el operador new para la creación de objetos.

Si por el contrario, el atributo names fuera estático:

Código: java
public class Person {
    public static String names = "Homer Simpson"; // modificador por defecto
}


Lo llamaríamos anteponiendo al atributo, el nombre de la clase seguido de un punto (el punto significa propiedad de, lo veremos más adelante):

Código: java
public class Main {
public static void main(String[] args) {
System.out.println(Person.names);
}
}


Es por ésta razón, que a los atributos o métodos estáticos se les llama comúnmente, de clase, ya que, éstos no dependen de un objeto para poder ser utilizados. Desde que el ClassLoader cargue dicha clase, el atributo estático pasa a estar disponible, pudiéndose llamar sin la necesidad de crear un objeto.

"Es por ésta razón, que a los atributos o métodos estáticos se les llama comúnmente, de clase, ya que, éstos no dependen de un objeto para poder ser utilizados. Desde que el ClassLoader cargue dicha clase, el atributo estático pasa a estar disponible, pudiéndose llamar sin la necesidad de crear un objeto."




Espero se haya entendido el concepto de static. Si tienen alguna duda, por favor, creen un tema de la manera normal o envíenme un MP. Nos vemos.
#48
Eclipse ya no es lo recomendado para desarrollo Android, Android Studio es todo lo que necesitas, además de ser el oficial, está basado en el mejor IDE que puedes encontrar para Java: IntelliJ IDEA.

Generalmente, ese tipo de error suele ser porque efectivamente no tienes permisos root o puede ser porque ffmpeg no tiene los permisos adecuados. Si es ésto último, lo solucionas dándole los permisos a través de exec de Runtime:

Código: java
String[] command = new String[]{"/system/bin/chmod", "744",
                                "/ruta/a/ffmpeg" };
Process process = Runtime.getRuntime().exec(command);


Si es lo primero puedes darle permisos root a tu app por tu root manager, como por ejemplo SuperSU.

Por último y poco probable es que hayas olvidado darle permisos en el manifest de tu aplicación para escribir en la SD:

Código: xml
android.permission.WRITE_EXTERNAL_STORAGE



Saludos.
#49
Hola,

Primero dos cosas:


  • Haz tu código lógico, es decir, ese for es una mezcla de variables que generan confusión para el lector.
  • Interpreta las excepciones.

El lugar de anidar dos for para ver si la ciudad ya existe, crea un método que haga ello e itera el List con un foreach simple:

Código: java
for(String ciudad : ciudades) {
if(checkIfExists(ciudad)) {
continue;
} else {
Object[] rowToAdd = {"a", "b", "c", "d"};
dm.addRow(rowToAdd);
}
}

/**
* Compara si un valor existe actualmente en la tabla
* @param city ciudad a evaluar si existe
* @return true si existe, false de lo contrario
*/
private boolean checkIfExists(String city) {
boolean exists;
for(int row=0; row<dm.getRowCount(); row++) {
for(int col=0; col<dm.getColumnCount(); col++) {
String currentCity = dm.getValueAt(row, col);
exists = currentCity.equals(city);
}
}
return exists;
}


Ahora, si analizamos la excepción, veremos que dice:

CitarException in thread "main" java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

La excepción java.lang.IndexOutOfBoundsException se lanza cuando se está tratando de acceder a un índice que excede el tamaño de la lista, por lo que, como dicho índice no existe, la VM lanza dicha excepción en tiempo de ejecución.

Ésto, se puede deducir en tu código por que iteras desde 0 hasta N, cuando es  desde 0 hasta N-1:

Código: java
for(int j=0, k=0; j<=ciudades.size() ; j++) { /*...*/ }


El rastreo de pila te indica en qué líneas están tu error. En tu caso dice que el error lógico está en las líneas 32 y 59 (posible redundancia) en la clase Table. Revisa y comentas cómo te fue.
#50
¿Te refieres a los hilos de ésta sección? Son aportes que los usuarios publican, por lo tanto no siguen ningún orden porque simplemente no lo tienen; si no te referías a ésto, explícate un poco mejor para poderte ayudar.

Un saludo.
#51
Python / Re:[GUI] Cifrado Caesar
Mayo 11, 2015, 01:58:55 PM
Muy buenos aportes los dos. @WhiZ, muy chulo quedan las UI con Kivy, además por lo que veo es un proyecto FOSS. Me viene muy bien ahora que estoy dándole a Python.

Saludos.
#52
Es un error común por incompatibilidades internas con la versión 2.0.x para Windows. Descarga la última versión (2.2) que corrije éste inconveniente.

Respecto a por qué no inicia el servidor, es por insatisfacción de dependencias. Trata de solucionarlas usando el comando:

Código: dos
bundle install


Es posible también que se deba a problemas con certificados SSL.
#53
Back-end / Tuneando el doc root de Apache
Mayo 10, 2015, 07:14:32 PM
Se me ocurrió ver mis proyectos "con estilo", así que, hice un pequeño script PHP y JS para que mis proyectos PHP se vean como una colección.

Los únicos requisitos son:


  • jQuery 2.x
  • Poner una imagen .png, .jpg, .jpeg o .gif en el root de nuestros proyectos.

Primero escribamos una función que lea los folders (proyectos) que hay en nuestro document root:

Código: php
function getAll() {
    $files = scandir(".");
    $folders = array(); // solo carpetas (nombres)
    $images = array(); // imagenes de las carpetas
    $pack = array(); // carpetas e imagenes

    foreach($files as $current) {
        if($current == "." || $current == "..") {
            continue;
        } else {
            if(is_dir($current)) {
                array_push($folders, $current);
            }
        }
    }
}


Ya tenemos solo las carpetas que hay en nuestro document root. Ahora, necesitamos checkear cada carpeta para buscar la imagen que usarmos como portada del proyecto:

Código: php
function getAll() {
    $files = scandir(".");
    $folders = array(); // solo carpetas (nombres)
    $images = array(); // imagenes de las carpetas
    $pack = array(); // carpetas e imagenes

    foreach($files as $current) {
        if($current == "." || $current == "..") {
            continue;
        } else {
            if(is_dir($current)) {
                array_push($folders, $current);
            }
        }
    }
    foreach($folders as $folder) {
        $files = scandir($folder);
        foreach($files as $file) {
            // si la carpeta está vacía (. y ..)
            if(count($files) < 3) {
                array_push($images, NULL);
                break;
            }
            // si no está vacía, ignora el . y .. leídos
            if($file == "." || $file == "..") {
                continue;
            }
            // checkea si el fichero es una imagen y la agrega al array
            if(strpos($file, ".jpg") || strpos($file, ".jpeg")
               || strpos($file, ".png") || strpos($file, ".gif")) {
               array_push($images, $file);
            }

        }
    }
    $pack["folders"] = $folders;
    $pack["images"] = $images;

    return json_encode($pack);
}


Ya tenemos los nombres de las carpetas e imágenes, pero necesitamos obtenerlos desde JS. Lo podemos hacer fácilmente:

Código: javascript
$(document).on("ready", init);

function init() {
    var all = <?php echo getAll(); ?>;
}


Ya las tenemos en el cliente, solo nos basta crear los elementos HTML que representarán nuestros proyectos y que utilizarán las imágenes de cada proyecto como portadas. En caso no el proyecto no tenga imagen, se colocará una que está encodeada en base64. Veamos como lo realizamos:

Código: javascript
$(document).on("ready", init);

function init() {
    var all = <?php echo getAll(); ?>;

    createDivs(all);

    function createDivs(data) {
        var folderNames = data["folders"];
        var folderImages = data["images"];
        var html = "<div class='project'>"+
            "<section class='back'>"+
            "<a class='link' href='#'>IR</a>"+
            "</section>"+
            "<section class='content'>"+
            "<section class='project-header'></section>"+
            "<section class='project-body'><img /></section>"+
            "</section>"+
            "</div>";
        for(var i=0; i<folderNames.length; i++) {
            $(".wrapper").append(html);
            var current = $(".project")[i];
            $(current).find(".project-header").html(folderNames[i]);
            // si la imagen existe (no es null)
            if(folderImages[i] !== undefined && folderImages[i] !== null) {
                $(current).find(".project-body > img").attr("src", folderNames[i]+"/"+folderImages[i]);
            } else { // de lo contrario asigna una por defecto en base64
                $(current).find(".project-body > img").attr("src", "data:image/jpg;base64,"+defaultImage);
            }
            $(current).find(".link").attr("href", folderNames[i]+"/"); // establece el link del proyecto
         }

var defaultImage = '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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/9k=';
    }
}


Ya tenemos toda nuestra lógica. Ahora solo nos queda hacer el HTML darle un poco de "estilo":

HTML

Código: html5
<!DOCTYPE html>
<html lang="es">
<head>
<link rel="icon" type="img/image/png" href="http://i.imgur.com/Fy36fAm.png"/>
<meta charset="UTF-8">
<title>Projects</title>
<!-- aquí irán nuestros estilos -->
</head>
<body>
<header>
<nav class="navbar">
<span>ÉSTOS SON TUS PROYECTOS</span>
</nav>
</header>
<section class="wrapper"></section>
<script src="http://code.jquery.com/jquery-latest.js"></script>
        <!-- aquí irá nuestro código JS -->
</body>
</html>


CSS

Código: css

* {
margin: 0px;
padding: 0px;
}
body {
background: #fff;
padding: 25px 50px;
}
.wrapper {
display: flex;
flex-flow: row wrap;
}
header {
display: block;
margin-bottom: 32px;
width: 100%;
}
.navbar {
display: block;
padding: .5rem;
text-align: center;
width: 100%;
}
.navbar > span {
font-family: 'dosis', 'segoe ui';
font-size: 24pt;
font-weight: normal;
}
.project {
background-color: #f7f7f7;
border-radius: 2px;
border-top: 2px solid #1E90FF;
box-shadow: 0px 2px 2px rgba(0,0,0,0.3);
display: flex;
height: 250px;
margin: 0px 30px 30px 0px;
overf low: hidden;
width: 200px;
}
.project:hover {
cursor: pointer;
}
.project:hover > .back {
width: 100%;
}
.project:hover > .content {
width: 0px;
}
.project > .content {
display: block;
height: 100%;
transition: width .3s ease-out;
width: 100%;
}
.project > .back {
align-items: center;
background-color: #eee;
display: flex;
height: 100%;
justify-content: center;
overflow: hidden;
transition: width .3s ease-out;
width: 0px;
}
.back > .link {
align-items: center;
color: #1e90ff;
display: flex;
font-family: 'segoe ui';
font-size: 20pt;
height: 100%;
justify-content: center;
padding: .8rem 1.5rem;
text-decoration: none;
text-transform: uppercase;
width: 100%;
}
.project-header {
align-items: center;
color: #555;
display: flex;
font-family: "segoe ui";
height: 40px;
justify-content: center;
text-align: center;
text-transform: uppercase;
}
.project-body {
display: block;
height: calc(100% - 40px);
}
.project-body > img {
border: 0px !important;
height: 100%;
width: 100%;
}


Ya está, probemos cómo se ve.




ANTES


DESPUÉS


Para ir hacia el proyecto, solo hay que colocar el cursor en el proyecto y una capa se deslizará, mostrándonos el link hacia el proyecto:





Simple y bonito. El código completo lo pueden ver en éste gist: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#54
Java / Re: Mini curso Java ~ Static
Mayo 08, 2015, 04:13:23 PM

8# - MODIFICADORES DE ACCESO




DEFINICIÓN: un modificador de acceso o de visibilidad, es un atributo en forma de palabra reservada que se le aplica a una variable o método (función) y que cambia la forma en que el exterior (otras clases) tiene acceso a ellos.

Existen 4 modificadores de acceso en Java, que se pasarán a listar y a describir brevemente:

package: Modificador por defecto. Éste modificador es el que se le asigna a toda variable/método si no se especifica otro.

Código: java
public class Person {
    String names; // modificador por defecto
}


public: Éste modificador se utiliza cuando se desea que una variable o método, sea visible para toda la aplicación.

Código: java
public class Person {
    public String names; // modificador público
}


private: Éste modificador se utiliza para ocultar una variable o método no sea visible para el exterior (demás clases) si no, que sea visible solo para la clase que lo contiene. Éste modificador se utiliza mucho, ya que es parte escencial del encapsulamiento (1).

Código: java
public class Person {
    private String names; // modificador privado
}


protected: Éste modificador se utiliza cuando trabajamos con herencia. Se explicará más adelante, solamente tengan la idea, que las variables y métodos protected que tiene una clase padre, serán visibles solamente para las clases hijas.

Código: java
public class Person {
    potected String names; // modificador protegido
}


Por el momento, es importante que tengan claros éstos conceptos. Más adelante, veremos cómo funcionan en un ejemplo real.

¿SON IMPORTANTES LOS MODIFICADORES DE ACCESO?

Los modificadores de acceso permiten al diseñador de clases delimitar la frontera entre lo que es accesible para los usuarios de la clase, lo que es estrictamente privado y 'no importa' a nadie más que al diseñador de la clase e incluso lo que podría llegar a importar a otros diseñadores de clases que quisieran alterar, completar o especializar el comportamiento de la clase.

Con el uso de estos modificadores se consigue uno de los principios básicos de la Programación Orientada a Objetos, que es la encapsulación: Las clases tienen un comportamiento definido para quienes las usan conformado por los elementos que tienen un acceso público, y una implementación oculta formada por los elementos privados, de la que no tienen que preocuparse los usuarios de la clase.




(1) Encapsulamiento: característica de la programación orientada a objetos cuyo objetivo es ocultar un atributo o procedimiento del resto de clases e interfaces para crear una barrera de protección. Lo veremos con detalle más adelante.
#55
Java / Re:Minicurso JAVA
Mayo 08, 2015, 03:50:44 PM

#7 - ENTRADA, PROCESO Y SALIDA DE DATOS




INTRODUCCIÓN: La entrada de datos es una parte escencial en el desarrollo de programas informáticos, sin éste, no pudiera ser posible un desarrollo eficiente de cualquier aplicación. Una aplicación o programa informático consta básicamente de 3 partes: entrada, proceso y salida.

ENTRADA

Toda aplicación necesita información del exterior para poder llevar a cabo la tarea para la que fue diseñada. Ésta información puede ser proveída directa, es decir, mediante el código fuente, mediante servicios externos (por ejemplo servicios web) o mediante el usuario.

PROCESO

Una vez que la aplicación tiene los datos necesarios, empieza el proceso. El proceso es el resultado de las operaciones que realiza la aplicación con los datos de entrada. Una vez que se tienen los resultados de las operaciones que se han realizado, viene el proceso de salida.

SALIDA

Teniendo ya los resultados de las operaciones, éstos son mostrados al usuario por distintas vías: texto, gráficos, reportes, etc. Ésto depende de cómo el programador ha decidido mostrar el resultado del proceso.

ENTRADA DE DATOS EN JAVA

ENTRADA DE DATOS POR PARTE DEL USUARIO

En Java la entrada de datos puede ser de dos formas: Por medio de la clase Scanner y por BufferedReader. Veamos cómo hacerlo con Scanner por simplicidad.

Para leer datos con Scanner usaremos los siguientes métodos:


  • next: lee una sola línea consecutiva. Si encuentra un espacio, deja de leer.
  • nextLine: lee una línea completa, incluídos espacios en blanco.
  • nextByte: lee un entero pequeño.
  • nextShort: lee un entero mediano.
  • nextInt: lee un número entero.
  • nextFloat: lee un número de coma flotante de precisión simple.
  • nextDouble: lee un número de coma flotante de precisión doble.
  • nextBoolean: lee un número booleano.

Para inicializar un objeto lo haremos de la siguiente manera:

Código: java
Scanner scanner = new Scanner(System.in);


Como recordamos, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, hace referencia al stream o flujo de entrada, y con éste flujo, va a trabajar Scanner para poder leer datos. Veamos un ejemplo de lectura para cada tipo de dato primitivo:

Código: java
import java.util.Scanner;

public class Class05 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
       
        System.out.println("Ingrese su nombre");
        String singleLine = reader.next();
        reader.nextLine();
        System.out.println("Ingrese sus apellidos");
        String fullLine = reader.nextLine();
        System.out.println("Ingrese un número entre -128 y 127");
        byte b = reader.nextByte();
        System.out.println("Ingrese un número entre -32768 y 32767");
        short s = reader.nextShort();
        System.out.println("Ingrese un número de precisión simple");
        float f = reader.nextFloat();
        System.out.println("Ingrese un número de precisión doble");
        double d = reader.nextDouble();
        System.out.println("Ingrese un valor booleano");
        boolean bool = reader.nextBoolean();
       
    }
}


PROCESO DE DATOS EN JAVA

En Java, podemos realizar muchos tipos de procesos: aritméticos, con ficheros, con bases de datos, etc. A continuación, veremos un pequeño ejemplo de un proceso en Java con operaciones aritméticas.

Código: java

public class Excercise01 {
    public static void main(String[] args) {
        Scanner reader;
        byte number1;
        byte number2;
        byte resultado;
        number1 = 15;
        number2 = 45;
        resultado = number1 * number2;
    }
}


En el ejemplo anterior, se ha llevado a cabo un proceso que consta de una operación aritmética. Éste proceso se encarga de multiplicar number1 y number2 y guardarlo en la variable resultado.

SALIDA DE DATOS EN JAVA

Una salida de datos en Java, significa mostrarle información al usuario. Ésta información como dijimos más arriba, puede ser en forma de texto, gráficos, reportes, etc. Veamos un ejemplo de salida, mostrando un texto y un número por pantalla:

Código: java

public class Excercise02 {
    public static void main(String[] args) {
        System.out.println("Hola mundo!");
        System.out.println(35);
    }
}


EJERCICIO

Ingresar dos números enteros, multiplicarlos y mostrarlos por pantalla.

Veamos, nos piden ingresar dos números, enteros:

Código: java

public class Excercise03 {
    public static void main(String[] args) {
        Scanner reader;
        int number1 = 0;
        int number2 = 0;
        reader = new Scanner(System.in);
        System.out.println("Ingrese un número entero");
        number1 = reader.nextInt();
        System.out.println("Ingrese un número entero");
        number2 = reader.nextInt();
    }
}


Ahora, nos piden multiplicarlos. ¿Dónde guardamos en valor de ésta operación? Bien, necesitamos crear una variable y almacenar el resultado allí:

Código: java

public class Excercise03 {
    public static void main(String[] args) {
        Scanner reader;
        int number1 = 0;
        int number2 = 0;
        int result = 0; // nueva variable

        reader = new Scanner(System.in);
        System.out.println("Ingrese un número entero");
        number1 = reader.nextInt();
        System.out.println("Ingrese un número entero");
        number2 = reader.nextInt();
        resultado = number1 * number2; // almacenamos el resultado de la operación
    }
}


Por último, mostramos el resultado (salida):

Código: java

import java.util.Scanner;

public class Excercise03 {
    public static void main(String[] args) {
        Scanner reader;
        int number1 = 0;
        int number2 = 0;
        int result = 0;
        reader = new Scanner(System.in);
        System.out.println("Ingrese un número entero");
        number1 = reader.nextInt();
        System.out.println("Ingrese un número entero");
        number2 = reader.nextInt();
        result = number1 * number2;
        System.out.println(result); // mostramos el resultado
    }
}


EJERCICIO PROPUESTO


  • Ingresar dos números de coma flotante de precisión simple, dividirlos y mostrar el resultado.




Espero se haya comprendido el concepto de Entrada, Proceso y Salida. Cualquier duda o sugerencia, mensaje privado por favor. Nos vemos.
#56
Java / Re:Minicurso JAVA
Mayo 07, 2015, 10:09:01 PM

#6 - CLASE SYSTEM




CitarPor el momento, nos imaginaremos a una clase como un conjunto que alberga variables y funcionalidades. Luego, cuando entremos a POO, describiremos con detalle qué es una clase.

La clase System es una clase muy especial. Aquí se encuentran los flujos de entrada, error y salida. Éstos flujos se utilizan para diversas cosas, por ejemplo, el flujo de entrada se utiliza para leer datos que se ingrese por medio del teclado, es decir, datos que ingresa el usuario; el flujo de error se utiliza para mostrar por consola los errores que se desee al usuario y el flujo de salida se utiliza para mostrar información también al usuario. Todos éstos flujos están definidos como atributos estáticos (1).

Código: java
public class System {
static PrintStream err;
static InputStream in;
static PrintStream out;
...
}


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

La variable in, representa al flujo de entrada. Su sintaxis es:
Código: java

static InputStream in;


Veremos un ejemplo de éste flujo en la próxima publicación.

SYSTEM.ERR

La variable err, representa al flujo de salida. Su sintaxis es:

Código: java
static PrintStream


Ejemplo:

Código: java
System.err.print("Ha ocurrido un error");


SYSTEM.OUT

La variable out, se utiliza para mostrar valores por pantalla. Su sintaxis es:

Código: java
static PrintStream out;


Ejemplo:

Código: java
System.out.println("¡Hola mundo!");
System.out.println("Su edad es "+21);


CitarPara concatear (unir) textos, texto y números, etc, usaremos el operador +.

La diferencia entre err y out, es que el primero utiliza algunos parámetros para simular un log (registro) de error como por ejemplo, pintar el texto en rojo. Veamos un ejemplo:

Código: java
public class Class05 {
    public static void main(String[] args) {
        System.err.println("¡System.err!");
        System.out.println("System.out");
    }
}


La salida es:



Es interesante notar, que el System.err, siempre se ejecuta después de los demás flujos. Esto sucede porque err y out son flujos diferentes y actúan en tiempos diferentes.

Eso ha sido todo. Nos vemos en la próxima clase.



(1) Hablaremos de static un poco más adelante.
#57
Java / Re:Minicurso JAVA
Mayo 07, 2015, 07:47:58 PM

#5 - VARIABLES Y CONSTANTES



1. VARIABLES

DEFINICIÓN: Una variable es una representación abstracta de un valor. En programación, una variable es básicamente una dirección de memoria que está asociada a un identificador. Ésta dirección de memoria almacena valores que luego podrán ser recuperados por medio del identificador. El identificador en el código fuente puede estar ligado a distintos valores en tiempo de ejecución, por lo tanto, el valor de una variable puede cambiar durante la ejecución de la aplicación.

1.1 SINTAXIS

Una variable en Java tiene la siguiente sintaxis:

<tipo de dato> <identificador>

1.2 DECLARACIÓN

Para declarar una variable en Java, basta con seguir la sintaxis anterior mencionada. Por ejemplo:

Código: java

byte edad;


1.3 ASIGNACIÓN

La asignación es la acción que le permite a las variables guardar valores. Ésto se hace a través del operador igual (=), donde:

<variable> = <valor a guardar>

Lo que está a la izquierda, será almacenado en la variable que está en la izquierda. De ésta forma se asignan valores a las variables. Modifiquemos un poco el ejemplo anterior:

Código: java

byte edad;
edad = 21;


1.3.1 INICIALIZACIÓN

También podemos realizar la declarción y asignación en una sola sentencia. A ésto se le llama inicialización. Modificando el ejemplo anterior, podemos decir:

Código: java

byte edad = 21;





2. CONSTANTES

DEFINICIÓN: La definición de una constante es la misma para una variable pero, con algunas diferencias importante:


  • Debe de tener la palabra reservada final
  • Una constante debe ser inicializada
  • Una constante es de solo lectura. No se puede cambiar su valor una vez definido.
  • Como recomendación, una constante debe estar en mayúsculas (uppercase)

Una constante se utiliza cuando necesitamos asociar valores fijos a variables y que éstas sean de solo lectura. Así, tenemos esos valores fijos en la constante y nos aseguramos que nunca podrán ser cambiados.

Ejemplo:

Código: java

final float PI = 3.1416


En la sentencia anterior, hemos declarado una constante de tipo float que almacena el valo de PI. PI es un valor que nunca va a cambiar, por lo tanto, por sentido común debe ser una constante. Otro ejemplo:

Código: java

final byte IGV = 18; // 18% de una venta = IGV (impuesto)


Ahora, intentemos cambiar el valor del IGV a 25:

Código: java

final byte IGV = 18;
IGV = 25;


¿Qué ocurre? Como dijimos, una constante es un valor fijo, constante que no podrá ser cambiado durante la ejecución y el ciclo de vida de nuestra aplicación. En NetBeans, podemos ver que la línea de asignación a IGV está subrayada con rojo. Ésto es muy útil, ya que NetBeans nos avisa de éstos tipos de errores en tiempo real, ahorrándonos mucho tiempo:






Para resumir:


  • Una variable es un espacio de memoria que tiene asociado un identificador
  • Una variable puede ser declarada y asignada o inicializada (ambas juntas)
  • El valor de una variable puede variar durante la ejecución de una aplicación
  • Una constante es una variable cuyo valor una vez definido no puede cambiar
  • Una constante debe de tener la palabra reservada final y debe ser inicializada
  • Una constante debe utilizarse para representar valores fijos que no cambiarán en el tiempo (PI, IGV, etc)
#58
Java / Re:Minicurso JAVA
Mayo 06, 2015, 07:39:00 PM

#4 - OPERADORES



Definición: un operador lógico es un símbolo que representa un significado dentro de un conjunto de reglas. En programación, un ejemplo de operador lógico es + (más), / (entre), etc.

En Java disponemos de los siguientes operadores lógicos:



   
   
   
   
   
   
   
   
SignoDescripción
=Asignación
==Igual que
!=Distinto que
>, >=, <, <=Mayor, mayor o igual, menor, menor o igual
&&Y (AND)
||Ó (OR)
!No, negación (NOT)

Estos operadores lógicos tienen un orden de precedencia que hay que tener muy en cuenta cuando las combinemos, para no tener resultados equivocados. Veamos el orden de precedencia:


2. EJERCICIOS PROPUESTOS

Dadas las variables de tipo int con valores A = 5, B = 3, C = -12 indicar si la evaluación de estas expresiones daría como resultado verdadero o falso:

A) A > 3                                                            B) A > C                                               C) A < C

D) B < C                                                            E) B != C                                              F) A == 3

G) A * B == 15                                                 H) A * B == -30                                   I) C / B < A

J) C / B == -10                                                  K) C / B == -4                                       L) A + B + C == 5

M) (A+B == 8 ) && (A-B == 2)                        N) (A+B == 8 ) || (A-B == 6)

O) A > 3 && B > 3 && C < 3                          P) A > 3 && B >= 3 && C < -3
#59
Java / Re:Minicurso JAVA
Mayo 06, 2015, 05:42:26 PM

#3 - TIPOS DE DATOS




DEFINICIÓN

Tipo de dato informático es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar. Esto incluye imponer restricciones en los datos, como qué valores pueden tomar y qué operaciones se pueden realizar. Los tipos de datos comunes son: enteros, números de coma flotante (decimales), cadenas alfanuméricas, fechas, horas, etc.

En Java existen 8 tipos de dato primitivos. Los tipos de dato primitivos son nombrados por un keyword o palabra clave. Veamos éstos tipos de datos.

Byte


  • Entero de 8 bits.
  • Valor mínimo: -128
  • Valor máximo: 127
  • Valor por defecto: 0
  • Cuándo utilizarlo: Cuando queramos guardar enteros pequeños.
  • Valor por defecto: 0
  • Ejemplo: byte a = 100 byte b = -50

Short


  • Entero de 16 bits.
  • Valor mínimo: -32,768
  • Valor máximo: 32.767
  • Cuándo utilizarlo: Cuando queramos guardar enteros medianos.
  • Valor por defecto: 0
  • Ejemplo: short s = 10000 short r = -20000

Int


  • Entero de 32 bits.
  • Valor mínimo: -2147483648
  • Valor máximo: 2147483647
  • Cuándo utilizarlo: Cuando queramos guardar enteros grandes.
  • Valor por defecto: 0
  • Ejemplo: int a = 100000 int b = -200000

Long


  • Entero de 64 bits
  • Valor mínimo: -9223372036854775808
  • Valor máximo: 9223372036854775807
  • Cuándo utilizarlo: Cuando se quiera almacenar enteros muy grandes.
  • Valor por defecto: 0
  • Ejemplo: long a = 100000000; long b = -200000000

Float


  • Número de coma flotante de precisión simple de 32 bits
  • Cuándo utilizarlo: Cuando se quiera almacenar números reales con precisión simple.
  • Valor por defecto: 0,0f
  • Ejemplo: float f1 = 234,5f

Double


  • Número de coma flotante de doble precisión de 64 bits
  • Cuándo utilizarlo: Cuando se quiera almacenar números reales con precisión doble.
  • Valor por defecto: 0,0d
  • Ejemplo: double d1 = 123,4

Boolean


  • Representa un bit de información (verdadero o falso)
  • Solo hay dos posibles valores: true y false
  • Éste tipo de dato se utiliza para armar condiciones en estructuras condicionales
  • Valor predeterminado: falso
  • Ejemplo: boolean esCasado = true

Char


  • Carácter Unicode de 16 bits.
  • Valor mínimo: '\u0000' (0)
  • Valor máximo: '\uffff' (65.535)
  • Cuándo utilizarlo: Cuando se quiera almacenar cualquier carácter.
  • Ejemplo: char letra = 'A'

String


  • Colección de Char
  • Valor por defecto: null
  • Cuándo utilizarlo: Cuando se quiera almacenar texto.
  • Ejemplo: String miTexto = "Éste es un texto !#@ :P"

"String no es un tipo de dato primitivo (es un objeto), pero se usa con tanta frecuencia que he dicidido incluirlo"

Hasta aquí llegamos con los tipos de datos. En el próximo tema, hablaremos sombre variables.
#60
Java / Re:Minicurso JAVA
Mayo 06, 2015, 04:04:51 PM

#2 - El MÉTODO MAIN



Éste tutorial será pequeño ya que, solo nos centraremos en aprender cómo funciona el método más importante en Java: main.


DEFINICIÓN

El método main es un método muy especial ya que sin él, ningúna aplicación Java podría levantarse. Su función es básicamente, hacer ejecutable una aplicación. El método main no es el área principal de una aplicación Java como muchos principiantes lo ven.

El método main es inalterable, ésto es:


  • Siempre debe tener visibilidad pública y ser estático.
  • Siempre debe retornar void
  • Siempre debe tener como parámetro una colección de String (String[])

Código: java

public class Class01 {
    public static void main(String[] args) {
        /*
            Aquí irá el código que se ejecutará
        */
    }
}


Los parámetros del método main son los parámetros que se le pueden pasa cuando se invoca, ésto es, por medio de la consola o por medio de cualquier otra herramienta.

Cuando se invoca al método main, éste levanta la aplicación llamando a la JVM mediante JNI (Java Native Interface), cargando la aplicación y el código que está dentro del main. Ésto por supuesto, no indica que todo el código funcional debe ir allí, como en el caso de C. Ésto definitivamente es una mala práctica y debemos de erradicarla por completo. En los próximos temas, veremos como realizarlo.