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 - Adalher

#101
Hola grep,

muchas gracias por tu ayuda. Esta vez no la merecía.


Gracias y saludos
#102
Hola grep,

1) La primera manera en que instancias Builder... es necesario el método de tipo Builder?

2) Para poder interceptar el tráfico saliente tengo que llamar al método establish de la clase Builder cada vez que lo quiero hacer? Y luego tengo que leer de alguna forma el dato de tipo ParcelFileDescriptor que este método retorna?

La app de ejemplo de google, aparte de poder tener unos fallos al ser ejecutada, creo que tiene más bien el fin de ser conectada a un servicio de VPN real que interceptar el tráfico.


Gracias y saludos
#103
Hola grep,

Citar
Por eso, creo que usar una app como AIDE para desarrollar aplicaciones es impractico, yo preferiría hacerlo desde una computadora.
Tienes razón. Lo que pasa es que mi Network no cumple con los requisitos para instalar Android Studio. Es por eso que lo hago con AIDE.

Tengo una pregunta con respecto a este código:
Código: java

package com.mycompany.myapp2;

import android.app.*;
import android.os.*;

import android.net.VpnService;

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

run();
    }

public void run() {
VpnService.prepare(MainActivity.this);
VpnService.Builder builder = new VpnService.Builder();

// Create a local TUN interface using predetermined addresses. In your app,
// you typically use values returned from the VPN gateway during handshaking.
ParcelFileDescriptor localTunnel = builder
.addAddress("192.168.2.2", 24)
.addRoute("0.0.0.0", 0)
.addDnsServer("192.168.1.1")
.establish();
}
}


AIDE me larga el siguiente error: A reference to an enclosing class is required.

No lo entiendo. Que tengo que hacer para solucionar este problema?


Gracias y saludos
#104
Hola pandacopatas,

probablemente tu unidad usb está dañada. Prueba con otra unidad usb. Puedes escanearlo en busca de sectores defectuosos, pero creo que deberías usar uno nuevo.

Las distribuciones de Kali últimamente tienen estos problemas de rendimiento. Intenta evitar usarlo, pensa que el usb está constantemente escribiendo/leyendo datos y eso realmente jo** el SO (que está en el pendrive).

Alternativamente, intenta usar Parrot con USB Persistence. Entiendo que funciona mejor en equipos de bajo rendimiento.


Saludos
#105
Dudas y pedidos generales / ¿Qué IDE prefieren?
Septiembre 03, 2019, 03:11:39 PM
Hola a todos,

lo pregunto porque he estado saltando de IDE a IDE (actualmente estoy tratando de aprender C). Así que tengo curiosidad por ver lo que todos ustedes considerarían un buen IDE. :)


Gracias y saludos
#106
Hola a todos,

pasaron dos días y Bitcoin obviamente se está cayendo. Ahora está de vuelta en 10K USD nuevamente y jugando duro en su volatilidad... ¿Creen que va a subir?

Quiero escuchar sus pensamientos, amigos y expertos en el negocio de las criptomonedas...


Gracias y saludos
#107
Java / Re:Un simple file to hex string [source]
Septiembre 03, 2019, 07:10:08 AM
Hola Hu3c0,

aparte del código no demasiado bueno:
Que demonios tiene que ver un programa que lee un fichero y que después vuelve a escribir todo "codificado en Hex" con esto:
Citar
Quiero y tengo en mente, pero necesito tener tiempo libre, hacer un analizador uploadfile:
Consiste en crear un javaweb proyecto con un bonito index.jsp que será el uploader a través de getter setter quiero que analize el archivo y si va metido dentro de él código .php, o lo que es lo mismo un shell.php, deniege el upload y redireccione a un html bonito.

Y cuando algo no funciona entonces viene la pregunta en el foro sobre qué salió mal y el mensaje de error es: "Something go wrong....!" ⇒ Bloques de catch vacíos (de este modo salidas que no son enunciativas no cuentan!) son para ser evitados! Si, en tu caso puedes sencillamente lanzarlas de nuevo...

File Separator duramente codificado - Ahí sería apropiado File.separator.

En vez de la variable de entorno TEMP se debería usar System.getProperty("java.io.tmpdir").
En esta sección nosotros no escribimos scripts, sino programas Java. Ahí es inusitado definir las variables así a la cabeza. En cambio estas son definidas cuando se las necesita. Osea contigo en casi todas las variables cuando estas son inicializadas.

Referente a FileReader/Writer: usa sencillamente try with resources.

La UI o ingles o español. Consejo: quedate con el lenguaje que tu sabes... "Something went wrong....". Un inglés correcto quizás todavía sería "Something goes wrong" pero eso que causó la excepción es pasado y a continuación tu aplicación fallará... Sería diferente si tú no puedes abortar y si debes seguir soportando el error (control de una aplicación crítica y entran en parte datos de sensores incorrectos... Una conducción autónoma de un Tesla con 200 en la autopista ojala no dirá "Algo salió mal" y se apagará... Mas bién dirá: "Algo sale mal" y tratará de abortar controladamente osea de parar despacio, controladamente.)... Del mismo modo concebible: "Something will go wrong"... eso solo fue un error pequeño. El error principal es que impactará unas fracciones de segundos del Tesla con velocidad 200 en un obstáculo... O la temperatura de la batería pues es tan alta que está claro: ella está defectuosa, ya se quemará el Tesla... (Lamentablemente ambos no traído por los cabellos, como ha mostrado el pasado).

Veo positivamente que la asignación de caracteres no tiene lugar en la operación del bucle while, como se ve tan a menudo. (Es mi preferencia, se puede ver de otra manera. Pero den correspondiente a esto también una comprobación de p. e. PMD).

Todavía también es concebible que se deje el 0x puesto que el archivo generalmente debe contener valores Hex.

Eso sería sencillamente una vez un comentario concreto, algo que creo que es mejor que solamente un "código no demasiado bueno".


Saludos
#108
Java / Re:Cronometraje hecho fácilmente
Septiembre 01, 2019, 05:26:09 PM
En mi opinión yo lo hago innecesariamente complicado. En absoluto no es necesario calcular todo inmediatamente (más bien al contrario) en cada llamada de fin(). Algo en esta manera sería suficiente:

Código: java

private long startTime = 0L;
    private List<Long> stopTimes = new ArrayList<>();

    public void arranque() {
        if (startTime == 0L) {
            startTime = System.nanoTime();
        }
    }

    public void fin() {
        stopTimes.add(System.nanoTime());
    }

    public long getFullInterval() {
        return stopTimes.get(stopTimes.size()-1) - startTime;
    }

Con eso, con cada llamada de fin(), se guarda la fecha y la hora. En la consulta de los valores pueden calcular cualquier intervalo en cualquier formato.

Al vector "startTime" todavía también se puede renunciar. El tiempo de inicio es muy simplemente la primera entrada en la lista.
       
Código: java

public void arranque() {
    if (stopTimes.size() == 0) {
        stopTimes.add(System.nanoTime());
    }
}

public long getFullInterval() {
    return getInterval(0, stopTimes.size()-1);
}

public long getInterval(int from, int to) {
    return stopTimes.get(to) - stopTimes.get(from);
}
#109
Hola a todos,

¿cómo puedo capturar las conecciones salientes de mi navegador en Android con Java? Osea, ¿cómo puedo bloquear una página web en Android con Java?


Gracias y saludos
#110
Java / Diffie-Hellman
Septiembre 01, 2019, 12:25:38 PM
Hola gente,

aquí se escribió una clase para el Diffie-Hellman. El código de demostración más abajo, aquí el código fuente:
Código: java

import java.math.BigInteger;
import java.security.SecureRandom;

/**
* Utilizes a Diffie-Hellman Key-Exchange<br>
* <br>
* <pre>
* Partner A            Partner B
* g, p, a (randomly)   b (randomly)
* A = g^a mod p
*           g, p, A ==&gt;
*                      B = g^b mod p
*                   &lt;== B
* K = B^a mod p        K = A^b mod p
* </pre>
* <br>
* Example Usage:<br>
* Partner A:<br>
* <code>
* DiffieHellman dh = new DiffieHellman(DiffieHellman.PARTNER_A);<br>
* dh.init(512);<br>
* sendToOtherSide(dh.getG());<br>
* sendToOtherSide(dh.getP());<br>
* sendToOtherSide(dh.getA());<br>
* byte[] key = dh.getKey(receiveFromOtherSide());<br>
* </code><br>
* <br>
* Partner B:<br>
* <code>
* DiffieHellman dh = new DiffieHellman(DiffieHellman.PARTNER_B);<br>
* dh.init(512);<br>
* BigInteger g = receiveFromOtherSide();<br>
* BigInteger p = receiveFromOtherSide();<br>
* BigInteger A = receiveFromOtherSide();<br>
* byte[] key = dh.getKey(g, p, A);<br>
* sendToOtherSide(dh.getB());<br>
* </code>
* @author Tobias Marstaller
*/
public class DiffieHellman
{
    public static final int PARTNER_A = 0xF124A;
    public static final int PARTNER_B = 0xC134B;
   
    protected BigInteger g;
    protected BigInteger p;
    protected BigInteger a;
    protected BigInteger b;
    protected BigInteger A;
    protected BigInteger B;
    protected byte[] K;
    protected int side;
    protected boolean initDone = false;
    protected SecureRandom rand;
   
    /**
     * Constructs a new Key-Exchange for the given side
     */
    public DiffieHellman(int side)
    {
        if (side != PARTNER_A && side != PARTNER_B)
        {
            throw new IllegalArgumentException("side must be equal to PARTNER_A or PARTNER_B");
        }
        this.side = side;
    }
   
    /**
     * Constructs a new Key-Exchange for the given side with the default bit
     * length 1024 and <code>random</code> as a source of randomness.
     * @param random A SPRNG for the parameter-generation
     */
    public DiffieHellman(int side, SecureRandom random)
    {
        this(side);
        this.rand = random;
    }
    /**
     * Constructs a new Key-Exchange for side B (therefore <code>assert(side == PARTNER_B)</code>)
     * with <code>b</code> as the private parameter.<br>
     * If this constructor is used, the call to {@link #init()} is not required anymore.
     * @param b The private parameter <code>b</code>
     */
    public DiffieHellman(int side, BigInteger b)
    {
        if (side != PARTNER_B)
        {
            throw new IllegalArgumentException("Side must be PARTNER_B");
        }
        this.side = side;
        this.b = b;
        initDone = true;
    }
    /**
     * Constructs a new Key-Exchange for side A (therefore <code>assert(side == PARTNER_A)</code>)
     * with <code>g</code>, <code>p</code> and <code>a</code> as the private parameters.<br>
     * If this constructor is used, the call to {@link #init()} is not required anymore.
     * @param g The private parameter <code>g</code>
     * @param p The private parameter <code>p</code>
     * @param a The private parameter <code>a</code>
     */
    public DiffieHellman(int side, BigInteger g, BigInteger p, BigInteger a)
    {
        if (side != PARTNER_A)
        {
            throw new IllegalArgumentException("Side must be PARTNER_A");
        }
        this.side = side;
        this.g = g;
        this.p = p;
        this.a = a;
        this.A = this.g.modPow(a, p);
        initDone = true;
    }

    /**
     * Initializes the instance with the default bit-length 1024
     */
    public void init()
    {
        init(1024);
    }
    /**
     * Initializes the instance with the given bitLength
     */
    public void init(int bitLength)
    {
        if (rand == null)
        {
            rand = new SecureRandom();
        }
        if (this.side == PARTNER_A)
        {
            this.g = BigInteger.probablePrime(bitLength, rand);
            this.p = BigInteger.probablePrime(bitLength, rand);
            this.a = BigInteger.probablePrime(bitLength, rand);
            this.A = this.g.modPow(a, p);
        }
        else if (this.side == PARTNER_B)
        {
            this.b = BigInteger.probablePrime(bitLength, rand);
        }
        initDone = true;
    }
   
    /**
     * @return Returns the key, if already calculated
     * @throws RuntimeException If the key hast not been calculated yet.
     */
    public byte[] getKey()
    {
        if (this.K == null)
        {
            throw new RuntimeException("The key has not been calculated yet.");
        }
        return K;
    }
    /**
     * Calculates the key for side B (therefore <code>assert(side == PARTNER_B)</code>).
     * @param g Parameter <code>g</code>
     * @param p Parameter <code>p</code>
     * @param A Parameter <code>A</code>
     * @return Returns the calculated key
     * @throws UnsupportedOperaionException If this instance has been inizialied as PARTNER_A
     * @throws RuntimeException If the parameters are not initialized
     */
    public byte[] getKey(BigInteger g, BigInteger p, BigInteger A)
    {
        if (this.side != PARTNER_B)
        {
            throw new UnsupportedOperationException("This method only works for PARTNER_B instances.");
        }
        if (!this.initDone)
        {
            throw new RuntimeException("The object has to be initialized.");
        }
        this.B = g.modPow(b, p);
        this.K = A.modPow(b, p).toByteArray();   
        return K;
    }
    /**
     * Calculates the key for side A (therefore <code>assert(side == PARTNER_A)</code>).
     * @param g Parameter <code>g</code>
     * @param p Parameter <code>p</code>
     * @param A Parameter <code>A</code>
     * @return Returns the calculated key
     * @throws UnsupportedOperaionException If this instance has been inizialied as PARTNER_B
     */
    public byte[] getKey(BigInteger B)
    {
        if (this.side != PARTNER_A)
        {
            throw new UnsupportedOperationException("This method only works for PARTNER_A instances.");
        }
        if (!this.initDone)
        {
            throw new RuntimeException("The object has to be initialized.");
        }
        this.K = B.modPow(a, p).toByteArray();
        return K;
    }

    public BigInteger getG()
    {
        return g;
    }
    public BigInteger getP()
    {
        return p;
    }
    public BigInteger getA()
    {
        return A;
    }
    public BigInteger getB()
    {
        return B;
    }
}


Código de demostración:
Código: java

// Partner A
DiffieHellman dh = new DiffieHellman(DiffieHellman.PARTNER_A);
dh.init(512);
sendToOtherSide(dh.getG());
sendToOtherSide(dh.getP());
sendToOtherSide(dh.getA());
byte[] key = dh.getKey(receiveFromOtherSide());


Código: java

// Partner B
DiffieHellman dh = new DiffieHellman(DiffieHellman.PARTNER_B);
dh.init(512);
BigInteger g = receiveFromOtherSide();
BigInteger p = receiveFromOtherSide();
BigInteger A = receiveFromOtherSide();
byte[] key = dh.getKey(g, p, A);
sendToOtherSide(dh.getB());


Autor: Tobias Marstaller


Saludos
#111
Java / Generador de sudoku
Agosto 31, 2019, 09:13:57 PM
Hola,

se escribió un generador de sudoku. Pensé que valiese la pena que el fuera presentado aquí.

El genera un vector completo. Qué campos individuales se eliminan y de qué manera, eso depende de ti.

Código:
Código: java

private int[][] createSudoku()
    {
        int[][] field = new int[9][9];
       
        for(int i = 0; i < field.length; i++)
        {
            int[] rand;
            do {
                rand = createRandomRange();
                System.arraycopy(rand, 0, field[i], 0, rand.length);
            }
            while(!proofIntField(field));
        }
        return field;
    }
   
    private boolean proofIntField(int[][] field)
    {
        for(int i = 0; i < field.length; i++)
        {
            if(!proofNoDuplicate(field[i])) {
                return false;
            }
        }
       
        for(int i = 0; i < 9; i++)
        {
            int[] temp = new int[9];
            for(int j = 0; j < 9; j++)
            {
                temp[j] = field[j][i];
            }
            if(!proofNoDuplicate(temp)) {
                return false;
            }
        }
       
        for(int i = 0; i < 9; i += 3)
        {
            for(int j = 0; j < 9; j += 3)
            {
                int[] temp = new int[9];
                int h = 0;
                for(int k = 0; k < 3; k++)
                {
                    for(int g = 0; g < 3; g++)
                    {
                        temp[h] = field[i+k][j+g];
                        h++;
                    }
                }
                if(!proofNoDuplicate(temp)) {
                    return false;
                }
            }
        }
        return true;
    }
   
    private boolean proofNoDuplicate(int[] field)
    {
        int[] temp = new int[9];
        for(int i = 0; i < field.length; i++)
        {
            if(field[i] != 0) {
                for(int j:temp)
                {
                    if(j == field[i]) {
                        return false;
                    }
                }
                temp[i] = field[i];
            }
        }
        return true;
    }
   
    private int[] createRandomRange()
    {
        int[] field = new int[9];
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i = 1; i <= 9; i++)
        {
            list.add(i);
        }
        Collections.shuffle(list);
        for(int i = 0; i < 9; i++)
        {
            field[i] = list.get(i).intValue();
        }
        return field;
    }


Quizás se ayudó a alguien con eso.


Saludos
#112
Java / Re:Generador de contraseñas (Update 1)
Agosto 29, 2019, 08:02:14 AM
Lo retoque.
#113
Java / Cronometraje hecho fácilmente
Agosto 29, 2019, 05:37:57 AM
Hola gente,

quiero compartir con ustedes con gusto una pequeña clase que se escribió puesto que algunos necesitan a menudo tal funcionalidad.

Se trata de la clase CronoMetro, una cosa sencilla y pequeña que puede emitir el tiempo de ejecución de sus Apps/Programas (o una parte de sus Apps/Programas).

El proceder es imaginablemente fácil: al principio ustedes instancian un objeto de tipo CronoMetro. Al principio del cronometraje llaman al método arranque().

Al final del cronometraje llaman al metodo fin(). A partir de ese momento los datos estan disponibles para ustedes:
. Intervalo total en nanosegundos.
. Intervalo total en milisegundos.
. Intervalo total en segundos.
. Intervalo total en minutos.
. Intervalo total en horas.
. Intervalo total en días.
Por otra parte, una emisión estándar del intervalo en las unidades que están arriba así como una devolución de un Hashmap para poder ajustar esa emición como se desea.

Código:
Código: java

package CronoMetro;

import java.util.HashMap;

/**
* <p>Con ello la clase ayuda a calcular y a emitir fácilmente tiempos de
* ejecuciones de aplicaciones.</p>
* <p>Después de la instanciación el método arranque() debe ser llamado para definir un
* tiempo de inicio. </p>
* <p>Después de la terminación del programa se finaliza el cronometraje con fin(), después de esto
* los valores del intervalo están disponibles:</p>
* <p>El intervalo total convertido en</p>
* <ul>
* <li>Nanosegundos</li>
* <li>Milisegundos</li>
* <li>Segundos</li>
* <li>Minutos</li>
* <li>Horas</li>
* <li>Días</li>
* <li>El intervalo convertido legiblemente</li>
* </ul>
* @author Dominik Sust
* @creation 07.07.2014 09:20:36
* @version 1.0
*/
public class CronoMetro
{

    //Arranque y tiempo de finalización en nanosegundos
    private long startTime = 0L;
    private long endTime = 0L;

    //Intervalos
    private long intervalInNanoseconds;
    private double intervalInMilliseconds;
    private double intervalInSeconds;
    private double intervalInMinutes;
    private double intervalInHours;
    private double intervalInDays;

    //Intervalo total
    private HashMap<String, Integer> totalInterval = new HashMap<String, Integer>();

    /**
     * Arranca el cronometraje
     * Esa función puede ser llamada sólo una vez para que no pueda ocurrir un intervalo
     * de tiempo negativo. Solo se registrará la primera llamada,
     * las llamadas posteriores serán ignoradas.
     */
    public void arranque()
    {
        if ( startTime == 0L )
        {
            startTime = System.nanoTime();
        }
    }

    /**
     * Finaliza el cronometraje.
     * Esta función puede ser llamada varias veces para calcular varios
     * (con medida a la primera llamada
     * arranque()).  Después de la llamada de este método los valores de los resultados están
     * disponibles.
     */
    public void fin()
    {
        endTime = System.nanoTime();
        calculaTiempos();
    }

    /**
     * Función interna que calcula todos los intervalos
     */
    private void calculaTiempos()
    {
        //Intervalos totales
        intervalInNanoseconds = endTime - startTime;
        intervalInMilliseconds = (double) intervalInNanoseconds / (double) 1000000;
        intervalInSeconds = intervalInMilliseconds / (double) 1000;
        intervalInMinutes = (double) intervalInSeconds / (double) 60;
        intervalInHours = intervalInMinutes / (double) 60;
        intervalInDays = intervalInHours / (double) 24;

        //Intervalos totales en días, horas, minutos, segundos
        double oneSecondInMS = 1000.0;
        double oneMinuteInMS = 60000.0;
        double oneHourInMS = 3600000.0;
        double oneDayInMS = 86400000.0;

        //Calcular días
        double tempInterval = intervalInMilliseconds;
        int temp = (int) (tempInterval / oneDayInMS);
        totalInterval.put( "Days", temp );
        //Quitar los días calculados del intervalo total
        tempInterval -= temp * oneDayInMS;

        //Calcular horas
        temp = (int) (tempInterval / oneHourInMS);
        totalInterval.put( "Hours", temp );
        //Quitar las horas calculados del intervalo total
        tempInterval -= temp * oneHourInMS;

        //Calcular minutos
        temp = (int) (tempInterval / oneMinuteInMS);
        totalInterval.put( "Minutes", temp );
        // Quitar los minutos calculados del intervalo total
        tempInterval -= temp * oneMinuteInMS;

        //Calcular segundos
        temp = (int) (tempInterval / oneSecondInMS);
        totalInterval.put( "Seconds", temp );
        //Quitar los segundos calculados del intervalo total
        tempInterval -= temp * oneSecondInMS;

        //¿¿Milisegundos??
        totalInterval.put( "Milliseconds", (int) tempInterval );
    }

    /**
     * Retorna el intervalo total en nanosegundos.
     * Esta función suministra solamente un valor válido después de que los métodos
     * arranque() y fin() son llamados
     * @return El intervalo total en nanosegundos
     */
    public long getIntervalInNanoseconds()
    {
        return intervalInNanoseconds;
    }

    /**
     * Retorna el intervalo total en milisegundos.
     * Esta función suministra solamente un valor válido después de que los métodos
     * arranque() y fin() son llamados
     * @return El intervalo total en milisegundos
     */   
    public double getIntervalInMilliseconds()
    {
        return intervalInMilliseconds;
    }
   
    /**
     * Retorna el intervalo total en segundos.
     * Esta función suministra solamente un valor válido después de que los métodos
     * arranque() y fin() son llamados
     * @return El intervalo total en segundos
     */
    public double getIntervalInSeconds()
    {
        return intervalInSeconds;
    }
   
    /**
     * Retorna el intervalo total en minutos.
     * Esta función suministra solamente un valor válido después de que los métodos
     * arranque() y fin() son llamados
     * @return El intervalo total en minutos
     */
    public double getIntervalInMinutes()
    {
        return intervalInMinutes;
    }

    /**
     * Retorna el intervalo total en horas.
     * Esta función suministra solamente un valor válido después de que los métodos
     * arranque() y fin() son llamados
     * @return El intervalo total en horas
     */   
    public double getIntervalInHours()
    {
        return intervalInHours;
    }

    /**
     * Retorna el intervalo total en días.
     * Esta función suministra solamente un valor válido después de que los métodos
     * arranque() y fin() son llamados
     * @return El intervalo total en días
     */     
    public double getIntervalInDays()
    {
        return intervalInDays;
    }

    /**
     * <p>Retorna una Hashmap con los valores del intervalo.</p>
     * <p>Llaves son</p>
     * <ul>
     * <li>Days</li>
     * <li>Hours</li>
     * <li>Minutes</li>
     * <li>Seconds</li>
     * <li>Milliseconds</li>
     * </ul>
     * <p>Con eso se puede elaborar una salida individual del intervalo.</p>
     * @return HashMap<String, Integer>
     */
    public HashMap<String, Integer> getTotalInterval()
    {
        return totalInterval;
    }

    /**
     * <p>Retorna el intervalo en forma de strings totales.</p>
     * <p>Ejemplo:<br>
     * 2 días, 4 horas, 40 minutos, 38 segundos, 456 milisegundos</p>
     * <p>Si no se necesita todos los valores se puede elaborar por medio del
     * metodo getTotalInterval() una propia salida.</p>
     *
     * @return El intervalo en forma de string
     */
    public String totalIntervalToString()
    {
        int d = totalInterval.get( "Days" );
        int h = totalInterval.get( "Hours" );
        int min = totalInterval.get( "Minutes" );
        int s = totalInterval.get( "Seconds" );
        int ms = totalInterval.get( "Milliseconds" );

        String result = d+" dia, "+h+" hora, "+min+" minuto, "+s+" segundo, "+ms+" milisegundo";

       
        //Días
        if ( d != 1 )
        {
            result = result.replace( "dia", "dias");
        }
        //Horas
        if ( h != 1 )
        {
            result = result.replace( "hora", "horas");
        }
        //Minutos
        if ( min != 1 )
        {
            result = result.replace( "minuto", "minutos");
        }
        //Segundos
        if ( s != 1 )
        {
            result = result.replace( "segundo", "segundos");
        }
        //Milisegundos
        if ( ms != 1 )
        {
            result = result.replace( "milisegundo", "milisegundos");
        }         

        return result;
    }

    /**
     * <p>Emite todos los valores del objeto en el siguiente orden:</p>
     * <ul>
     * <li>startTime</li>
     * <li>endTime</li>
     * <li>intervalInNanoseconds</li>
     * <li>intervalInMilliseconds</li>
     * <li>intervalInSeconds</li>
     * <li>intervalInMinutes</li>
     * <li>intervalInHours</li>
     * <li>intervalInDays</li>
     * <li>La salida del metodo totalIntervalToString()</li>
     * </ul>
     * @return String
     */
    @Override
    public String toString()
    {
        return "IntervalUtil{"
                + "startTime=" + startTime
                + ",\n endTime=" + endTime
                + ",\n intervallInNanoseconds=" + intervalInNanoseconds
                + ",\n intervallInMilliseconds=" + intervalInMilliseconds
                + ",\n intervallInSeconds=" + intervalInSeconds
                + ",\n intervallInMinutes=" + intervalInMinutes
                + ",\n intervallInHours=" + intervalInHours
                + ",\n intervallInDays=" + intervalInDays
                + ",\n " + totalIntervalToString() + "'}'";
    }

}


Autor: Dominik Sust

Muchos saludos

Adalher
#114
Java / Generador de contraseñas (Update 1)
Agosto 26, 2019, 08:25:35 PM
Hola a todos,

se ha programado un generador de contraseñas, por una parte para amistarse mejor con Java, por otra parte también para programar una vez algo más significativo. Ustedes mismos pueden determinar el largo de la contraseña y también los caracteres que deben figurar. Osea si deben ser números, letras o si deben ser alfanuméricos.

Código: text

import java.util.Random; //importar
import java.util.Scanner; //importar

public class GenCont {

public static void main(String[] args) {
 
  Scanner s = new Scanner (System.in); //Crear un nuevo objeto de la clase Scanner
 
  int largo, seleccion; //inicializar las variables para la selección y el largo de la contraseña

  System.out.println("Hola y bienvenido");
  System.out.println("Por favor ingrese el largo de la contraseña y a continuación presione Enter:");
  largo = s.nextInt(); //Selección del largo
  System.out.println("Por favor haga una selección: \n1. Solamente números \n2. Solamente letras \n3. Alfanúmerico");
  seleccion = s.nextInt(); //Selección de la clase de contraseña
  System.out.println(creacont(seleccion, largo)); // Llamada del método para la generación de la contraseña
}
private static char[] creacont( int seleccion, int largo) {

char[] cont;
cont = new char[largo];

int contador = 0;

switch (seleccion) {

case 1:

while (contador<largo) {

cont[contador] = intercambionumero(numeroaleatorio(10, 26));
contador++;

}
break;

case 2:

while (contador<largo) {

cont[contador] = intercambionumero(numeroaleatorio(26, 0));
contador++;

}
break;

case 3:

while (contador<largo) {

cont[contador] = intercambionumero(numeroaleatorio(36, 0));
contador++;
}
break;
}


return cont;
}

private static int numeroaleatorio(int limitea, int limiteb) {

Random cont = new Random();
return cont.nextInt(limitea)+limiteb; //Creación de un número aleatorio
}
private static char intercambionumero(int numero){ //Genera letras y números a partir de los números transmitidos
 
  String s = "abcdefghijklmnopqrstuvwxyz0123456789"; //Definir las/los posibles letras/números
  char[] c = s.toCharArray(); //Convertir el String en Char para que pueda abordar a las letras individualmente
  return c[numero]; //Distribuye la letra respectiva
 
}

}



Saludos
#115
Java / Re:[Java] Maquina Tragaperras
Agosto 26, 2019, 11:31:49 AM
Hola /d3v/nu11,

realmente relevantes son solamente los dos últimos. Puede que en semejantes programas pequeños la entrada de usuario invalidante todavía este okay; y simplemente se debe al formato. Pero el bucle con el índice fijo es justamente un bug que nunca debería pasar.

Citar
Código: java

int n = 1; // n = numero de premios
                        for (int i = 0; i <= n; i++) {
                                //comprueba si combinación esta en premios registrados
                                if (Arrays.equals(frutas, coleccion[i].getCombGanad()) == true){
                                        credDisp = credDisp + coleccion[i].getPremio();
                                }       
                        }

Código: java

for (Premio premio : coleccion) {
    if (Arrays.equals(frutas, premio.getCombGanad()) == true){
        credDisp = credDisp + premio.getPremio();
    }   
}


Sobre todo evita el bug de sencillamente presuponer una longitud de Array fija en una clase pero no comprobar esto en ninguna parte.


Saludos
#116
Java / Re:[Java] Obtener factores primos de un Número
Agosto 22, 2019, 01:45:45 PM
Hola hackmin,

si, naturalmente! counter+2 al final. Mientras teclee no puse suficiente atención. (Eso es todo el sentido detrás del código - que a partir del 3 se siga en dos pasos! De lo contrario, lo hubiera hecho un simple counter++;).

Tenía ganas de construir una solución más con la criba de Eratóstenes y, naturalmente, con streams:
Código: java
        
import static java.util.stream.LongStream.iterate;
import java.util.BitSet;
import java.util.stream.LongStream;
public class PrimeFactors {
  public static void main(String[] args) {
    primeFactors(2 * 2 * 2 * 2 * 2 * 109).forEach(System.out::println);
  }
  public static LongStream primeFactors(int n) {
    BitSet notPrime = new BitSet(n);
    return iterate(2, i -> i <= n, i -> notPrime.nextClearBit((int) (i + 1)))
          .peek(i -> iterate(i * i, j -> j <= n, j -> j + i)
                    .forEach(j -> notPrime.set((int) j, true)))
          .flatMap(i -> iterate(n, j -> (j % i) == 0, j -> j / i)
                       .map(__ -> i));
  }
}


Una vez había algo así en SO (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login


Saludos
#117
Java / Re:[Java] Obtener factores primos de un Número
Agosto 22, 2019, 01:43:53 PM
Hola hackmin,

y no tienes que reinventar la rueda. Alimentar un motor de busqueda con "Java prime factor given number" hubiera sacado a la luz algunas ideas (mas eficientes).

Lamentablemente calculas todos los divisores aunque se trata de factores primos. Por lo tanto, de nuevo mi indicio:
Citar
Si opinas tener un algoritmo: Pues ¿suministra el números correctos? (¡Aquí se prueba con números pequeños que también se pueden verificar a mano y así! ¡Por tanto prueba una vez tu algoritmo p. e. con el número 8!)
Edición: Aunque aquí 8 ya bastaría, 8! Ya es algo grande.

Osea, por un lado se tiene que verificar 2, naturalmente. Entonces se puede seguir con 3 en dos pasos.

Si se tiene un divisor, entonces se verifica si el divisor se repite múltiples de veces. Por lo tanto se debe dividir el número por el divisor y luego seguir con el resultado. De allí que sugerí el 8 como ejemplo.

8%2 = 0 -> 2 es un divisor, 8/2 = 4.
Verificamos 4 de nuevo - 4%2 = 0 -> Es un divisor, 4/2 = 2
Verificamos 2 de nuevo - 2%2 = 0 -> Es nuevamente un divisor, 2/2 = 1 -> Final.
Factorización en números primos de 8 es, por consiguiente, 2,2,2.

Por tanto, que se puede identificar en este ejemplo?:
a) Si se ha encontrado un divisor, el final siempre se desplaza.
b) Se debe verificar un divisor múltiples de veces.
c) El final se tiene que definir. Aquí se puede proceder fácilmente: Contador -> Raíz del número restante -> En ese caso es el número restante el último divisor. Osea en el ejemplo tuvimos número restante 4, contador 2 -> Éxito, nuevo número restante 2, prueba: 2> Raiz de 2: ==> Número restante es el último divisor.

Quizás se puede todavía pensar que se prueba: Número restante == Contador ->. En ese caso se ahorra una vez la raíz. Pero esa optimización no la veo como algo tan alucinante porque complica un poco el algoritmo y, en mi opinión, no satisface el principio KISS.

Con esto, ojala que esto esté claro:
Fraccionamiento en factores primos.
El posible algoritmo.

Y si ya lo he puesto tan lejos como pretexto, entonces también puedo dar un ejemplo de implementación:
Código: java
        
import java.util.ArrayList;
import java.util.List;

public class PrimeFactor {

    public static List<Long> getPrimeFactors(final long number) {
        List<Long> result = new ArrayList<>();
        long counter = 2;
        long reminder = number;
        while (counter < Math.sqrt(reminder)) {
            while (reminder % counter == 0) {
                result.add(counter);
                reminder=reminder/counter;
            }

            counter = (counter==2) ? 3 : counter+1;
        }

        if (reminder > 1) {
            result.add(reminder);
        }

        return result;
    }

    public static void main(String[] args) {
        System.out.println("8 fraccionado: " + getPrimeFactors(8));
        System.out.println("600851475143 fraccionado: " + getPrimeFactors(600851475143L));
    }
}

Y esto, naturalmente, calcula muy rápido los resultados:
8 fraccionado: [2, 2, 2]
600851475143 fraccionado: [71, 839, 1471, 6857]


Saludos
#118
Java / Re:[Java] Obtener factores primos de un Número
Agosto 19, 2019, 08:00:45 PM
Hola hackmin,

pues ¿ya has pensado aquí un poco más en cómo optimizar eso?

-> Incremento: ¿Realmente tienes que incrementar i en 1 o se puede optimizar aquí?
-> ¿Hasta donde tienes que probar? ¿Realmente tienes que probar hasta incluído el número?

Si opinas tener un algoritmo: Pues ¿suministra el números correctos? (¡Aquí se prueba con números pequeños que también se pueden verificar a mano y así! ¡Por tanto prueba una vez tu algoritmo p. e. con el número 8!)

Y sobre todo, 1 no es un factor primo.


Saludos
#119
Hola DeBobiPro,

el objetivo debe ser no comprar o vender más por mi propia cuenta, sino dejar que haga un programa eso tan pronto sean dadas las listas (condiciones) fijadas. Actualmente sigo aprendiendo programación (orientada a objetos) como principiante (en comparación a algunos). Pero las sugerencias no podrían doler, creo  ;).

Muchos saludos
#120
Java / Re:Cifrado en JAVA
Junio 03, 2019, 10:29:35 AM
Hola ravenheart,

un detalle: los nombres de los métodos en Java se escriben por convención en lowerCamelCase.
Generalmente, los métodos para cifrar y descifrar están demasiado sobrecargados y difíciles de entender porque DeBobiPro ha puesto todos los pasos del cifrado/descifrado en un método. Además, el cambia las variables de clase dentro de los métodos. Estas variables pueden ser variables locales dentro de los métodos porque DeBobiPro no desea transportar información a través de múltiples llamadas de métodos con esas variables. Entonces esto evita un posible Multithreading (llamada de sus métodos desde múltiples Threads hacia afuera).
Los pasos individuales, así como se ven en DeBobiPro, son:
1. Asignar la frase a una secuencia de valores clave/números clave (su primer bucle).
2. Encontrar el índice de un carácter en el alfabeto (el bucle interno dentro del segundo bucle).
3. "Offsettear" este índice con el valor clave/dígito clave calculado en el paso uno.
4. Componer el resultado (en la variable 'encrypt').
5. Además, atender siempre el espacio.
Yo separaría más estos aspectos individuales, de tal forma que este claro qué cosa sucede exactamente y donde.
Por diversión, se ha construido una realización funcional del cifrado (usen jOOL You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login - según algunas opiniones, esto debería ser parte del JRE, pero da igual...) y se ha dividido más los pasos.
Código: java

import static java.util.stream.IntStream.range;
import static org.jooq.lambda.Seq.seq; // <- https://github.com/jOOQ/jOOL
import java.util.ArrayList;
import java.util.function.Supplier;
import java.util.stream.Stream;
public class VerschlüsselungJAVA2 {
  private final static int ALFA[] = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '_', '.', ',', ';', ':'
  };
  private static Supplier<? extends IllegalArgumentException> characterNotInAlphabet(int cp) {
    return () -> new IllegalArgumentException("Character not in alphabet: " + Character.toString(cp));
  }
  private static int alphaAt(int index) {
    return ALFA[index % ALFA.length];
  }
  public static String encrypt(String key, String phrase) {
    // zip the phrase characters with the exclusive prefix
    // sum mapping the space to 0 and every other character to 1,
    // lookup the alphabet character and offset by the key digit
    // at the index provided by the prefix sum
    return seq(phrase.chars())
          .map(Character::toUpperCase)
          .zip(keyIndicesOf(phrase))
          .map(t -> t.v1 == ' ' ? ' ' : alphaAt(offset(t.v1, key, t.v2)))
          .map(Character::toString)
          .toString();
  }
  private static int findAlphabetIndexOf(int cp) {
    // 'C' -> 2
    return range(0, ALFA.length)
          .filter(i -> ALFA[i] == cp)
          .findFirst()
          .orElseThrow(characterNotInAlphabet(cp));
  }
  private static int offset(int phraseChar, String key, int keyIndex) {
    // Find the index of the phrase character and offset by the digit at the key index
    return findAlphabetIndexOf(phraseChar)
         + key.charAt(keyIndex % key.length()) - '0';
  }
  private static Stream<Integer> keyIndicesOf(String phrase) {
    // Exclusive prefix sum of the stream producing
    // 0 for spaces and 1 for every other character
    // "abc de f" -> [0, 1, 2, 2, 3, 4, 4, 5]
    return phrase.chars()
          .map(c -> isIgnored(c) ? 0 : 1)
          .collect(ArrayList<Integer>::new,
                   (l, v) -> l.add(v + (l.isEmpty() ? 0 : l.get(l.size() - 1))),
                   (l1, l2) -> {}).stream()
          .map(i -> i - 1);
  }
  private static boolean isIgnored(int c) {
    return c == ' ';
  }
  public static void main(String[] args) {
    String phrase = "cifrado ejemplo";
    String key = "9876"; // Cualquier número
    System.out.println(encrypt(key, phrase));
  }
}


Independientemente de la implementación real: el cifrado César NUNCA es razonable. Hay mejores métodos para cifrar.
Déjame intentar aclarar lo que realmente se quiere expresar con esto: El cifrado es relativamente complejo. Cuando se trata de cifrado, hay que tener en cuenta muchos aspectos. Ya el generador aleatorio de números aleatorios juega un papel importante. Los conceptos básicos ya son tan complejos que ellos obtienen su propia conferencia. Encriptaciones de César tan simples son una broma. Ellas pueden ser descifradas por ataques triviales. A esto entonces, de niño, ya basta con leer un libro correspondiente (Así que tenía un libro ? ? ? con acertijos en aquel entonces. Pues en un tiempo eso también era precisamente un tema...).
Y solo un ejemplo que muestra la complejidad:
Después de que se supo que alguien está trabajando para la NSA en un gran sistema operativo de código abierto y de que la confianza se había ido de repente, se necesitaron dos semanas (creo) solamente para ver si existía un debilitamiento del cifrado y cómo había llegado a existir este. Solo se tenía que comprobar los Commits de la persona.
U otro tema:
Imagínate que escribes un algoritmo que muestre de qué forma está ese algoritmo actualmente detrás del cifrado SSL. Uno podría pensar: Hurra, algoritmo logrado. Se ve bien. Pero no - incluso ahí hay muchos expertos que optimizan constantemente y descartan cosas antiguas! Por lo tanto, pertenece a la administración tanto en el cliente como en el lado del servidor, qué algoritmos se querrá permitir para el acceso SSL.
Por consiguiente, el cifrado no es tan trivial. Y si se desea tener un cifrado que conserve el formato, entonces también existen posibilidades correspondientes (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login).
En general, se debe tener en cuenta que, con trabajos de desarrollo tan pequeños en la escuela y en el estudio, el aprendizaje está en primer plano. Allí se simplifica mucho. Entonces, de ahí se querrá escribir un árbol de búsqueda ordenado y equilibrado, pero eso no jugará ningún papel más más adelante porque se obtendrá soluciones mucho mejores (con mejor rendimiento), en donde además se utilizan hashcodes (Por lo tanto, el tipo de datos almacenado ya no necesita implementar un Comparable) y mucho más.
Si se quiere se puede hacer esto hasta tal punto que al final se tiene una base de datos In Memory o una base de datos en donde todo está almacenado con un Caching adecuado.
Así que, por favor, que no se tome esto personalmente, pero la evaluación del código para tareas estándar es correspondientemente así.

Saludos