Blog

Temporizador en Java

Hoy presentamos el temporizador escrito en Java, con esta aplicación puedes poner una cuenta atrás en el PC, y una voz te avisará cuando acabe el tiempo programado para la tarea. También puedes parar y reanudar el tiempo, ya que funciona con hilos de ejecución. Para reproducir el mp3 que viene integrado he utilizado la libreria JLayer.

Puedes encontrar la aplicación para windows en descargas y el código en github

Esperamos que te guste…

Resolver sudokus con Java y recursividad

Hoy traemos el código necesario para resolver sudokus en Java utilizando recursividad.
Tendremos dos clases una Principal.java con el main y otra clase sudoku.java.
La clase sudoku.java contendrá la funcion resolverSudoku() que utilizará recursividad. Y las funciones necesarias para comprobar que el numero introducido en la celda es correcto(esValido()):

package sudoku;

/**
 *
 * @author Javi
 */
public class Sudoku {
    
    
    private int tablero[][];
    static final int  SIN_ASIGNAR=0;
    
    public Sudoku(int sudoku[][]){
        this.tablero=sudoku;
    }
    
    
    public boolean resolverSudoku(){
        
        for(int fila=0;fila <9;fila++){
            for (int columna=0;columna<9;columna++){
                if(tablero[fila][columna]==SIN_ASIGNAR){
                    for (int numero =1;numero<=9;numero++){
                        if(esValido(fila,columna,numero)){
                            tablero[fila][columna]=numero;
                            if(resolverSudoku()){
                                return true;
                            }else{
                                tablero[fila][columna]=SIN_ASIGNAR;
                            }
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }
    
    private boolean esValido (int fila, int columna, int numero){
        return !(contieneFila(fila,numero)||contieneColumna(columna,numero)||contieneCaja(fila,columna,numero));
    }
    
    private boolean contieneFila(int fila,int numero){
        for(int columna=0;columna<9;columna++){
            if(tablero[fila][columna]==numero){
                return true;
            }
        }
        return false;
    }
    
    private boolean contieneColumna(int columna,int numero){
        for(int fila=0;fila<9;fila++){
            if(tablero[fila][columna]==numero){
                return true;
            }
        }
        return false;
    }
    
    private boolean contieneCaja(int fila, int columna,int numero){
        int f = fila - fila % 3;
        int c = columna -columna % 3;
        for(int i =f;i<f+3;i++){
            for(int j = c; j<c+3;j++){
                if(tablero[i][j]==numero){
                    return true;
                }
            }
        }
        return false;
    }
    
public void ImprimirSudoku(){
    for(int i=0;i<9;i++){
        for (int j=0;j<9;j++){
            System.out.print(tablero[i][j]);
        }
        System.out.println("");
    }
}    

    
}

Con esta clase conseguimos que nos devuelva un sudoku solucionado.
Con la clase principal.java creamos el objeto miSudoku y le pasamos el tablero que queremos que resuelva.

package sudoku;

/**
 *
 * @author Javi
 */
public class Principal {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        int tablero[][]={{6,9,5,3,7,1,8,4,2},
                         {0,0,0,0,0,0,0,0,0},
                         {8,4,1,2,9,6,3,7,5},
                         {0,0,0,0,0,0,0,0,6},
                         {0,0,0,0,0,0,0,0,8},
                         {5,6,2,0,1,7,4,3,9},
                         {0,0,0,0,0,0,1,8,7},
                         {0,0,0,0,0,0,0,0,0},
                         {7,5,4,0,0,0,0,0,0}};
        
        Sudoku miSudoku=new Sudoku(tablero);
        miSudoku.resolverSudoku();
        miSudoku.ImprimirSudoku();
                
        }
        
    }

En este video aprendí como era el algoritmo.

video youtube

He hecho una versión del código anterior en PHP pero el algoritmo es el mismo, lo podeis probar https://dornisoft.es/sudoku

Espero que te guste 😉

Dorni-Recetas

Hoy te presentamos una nueva aplicación escrita en Java con la que podrás gestionar tus recetas de cocina. La aplicación tiene tres partes:

1-Añadir: En esta sección podrás añadir recetas de cocina con sus ingredientes, métodos de preparación, comentarios, autor de la receta, podrás seleccionar si es privada o pública y podras elegir si la receta necesita de la elaboración de otra receta.
Tambien podrás añadir tus comensales habituales.

2-Actualizar receta: En esta sección podrás actualizar la receta, pudiendo modificar todos los campos de la receta, podras añadir los comentarios de los comensales y añadir mas elaboraciones necesarias para la receta.

3-Buscador: En esta sección podras buscar una receta por ingredientes separados por comas o buscar por nombre de receta o mostrar todas las recetas, una vez seleccionada una receta podras ver su contenido e imprimir la receta a un archivo txt que se ubica en el mismo lugar que el ejecutable.

Lo puedes descargar desde:

Dorni-Recetas

Y tambien está el manual de usuario para descargar, aunque es muy fácil de usar:

Manual usuario Dorni-Recetas

Esperamos que te guste 😉

Introducción a webservices con aplicación Java 8 y servidor PHP

Hola, en el artículo de hoy trataré el tema de webservices.
Los webservices son muy útiles cuando queremos distribuir nuestra aplicación y, en vez de dar acceso a la base de datos desde la aplicación directamente con un driver JDBC, lo que hacemos es que sea el webservice el que nos procese las peticiones a la base de datos. De esta manera, no tenemos que incluir la contraseña y usuario de la base de datos en la aplicación a distribuir y corremos menos riesgos de seguridad, ya que un usuario un poco espabilado podría descompilar nuestra aplicación y hacerse con las credenciales de la base de datos.

Usaremos el servidor XAMPP y ubicaremos los archivos php en la carpeta htdocs/service

Para empezar, crearemos la base de datos(webservice) con una única tabla(adjetivos) con 3 campos: Id, adjetivo,fecha.
Id (int, auto increment, primary key)
adjetivo(varchar)
fecha(timestamp)

Ahora crearemos el webservice que será un archivo php que procese las peticiones que se le envíen desde la aplicación Java, vamos a hacer que el web service procese dos peticiones, una de insertar datos y otra de hacer una consulta.

El archivo insert.php tendría este aspecto

<?php
$adjetivo=$_POST['adjetivo'];
$db=mysqli_connect("localhost","root","","webservice");
mysqli_query($db,"insert into adjetivos (adjetivo)values('$adjetivo')");
?>

El archivo select.php tendría este aspecto:

<?php
$db=mysqli_connect("localhost","root","","webservice");
mysqli_query($db,"set names 'utf8'");
$res=mysqli_query($db,"select * from adjetivos");
$fila=mysqli_fetch_array($res);
do{
	echo $fila["adjetivo"].",".$fila["fecha"]."\n";
	
}while($fila=mysqli_fetch_array($res));
?>

Una vez hecho ésto haremos nuestra aplicación en Java que le pasará un parámetro POST al webservice, éste la procesará y nos devolverá los resultados en el caso del select o insertará el adjetivo en el caso del insert, para lo que he creado una clase base adjetivos.java para convertir a objetos los resultados de la petición select.
La clase adjetivo.java tiene este aspecto:

import java.util.Objects;

/**
 *
 * @author Javi
 */
public class adjetivos {
    private int id;
    private String adjetivo;
    private String fecha;

    public adjetivos(String adjetivo) {
        this.adjetivo = adjetivo;
    }

    public adjetivos(String adjetivo, String fecha) {
        this.adjetivo = adjetivo;
        this.fecha = fecha;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAdjetivo() {
        return adjetivo;
    }

    public void setAdjetivo(String adjetivo) {
        this.adjetivo = adjetivo;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    @Override
    public String toString() {
        return "adjetivo{ adjetivo=" + adjetivo + ", fecha=" + fecha + "}\n";
    }

Usaré 2 clases con main, una para el ejemplo con insert y otra para el ejemplo con select.
En la clase main correspondiente al insert, le pasaremos un parámetro POST a PHP para que lo procese y lo inserte en la base de datos, esta clase sería una como la siguiente:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;





/**
 *
 * @author Javi
 */
public class Servicio {

    /**
     * @param args the command line arguments
     */
    
    private static final String USER_AGENT = "Mozilla/5.0";

    private static final String POST_URL = "http://localhost/service/insert.php";

    private static final String POST_PARAMS = "adjetivo=encomiable";
    
    
    public static void main(String[] args) throws IOException {
       

          sendPOST();
    }
    
    private static void sendPOST() throws IOException {
        URL obj = new URL(POST_URL);
        HttpURLConnection httpURLConnection = (HttpURLConnection) obj.openConnection();
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("User-Agent", USER_AGENT);

        // Aqui le pasamos los parametros
        httpURLConnection.setDoOutput(true);
        OutputStream os = httpURLConnection.getOutputStream();
        os.write(POST_PARAMS.getBytes());
        os.flush();
        os.close();
        // Una vez pasados los parametros recibimos el codigo de respuesta

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println("POST Response Code :: " + responseCode);

       
    }
    
}

El código anterior pasará un parámetro al archivo php con el adjetivo encomiable y será php el encargado de insertarlo en la base de datos

Ahora seguiremos haciendo un select de la tabla adjetivos y transformando los resultados en un arrayList de objetos adjetivos, en este caso no le vamos a pasar parámetros al select por lo que el parámetro será una cadena vacía, el siguiente código muestra como se debe proseguir

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;


/**
 *
 * @author Javi
 */
public class leerphp2 {

    /**
     * @param args the command line arguments
     */
     private static final String USER_AGENT = "Mozilla/5.0";

    private static final String POST_URL = "http://localhost/service/select.php";

    private static final String POST_PARAMS = "";
    
    
    
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        sendPOST();
    }
    private static void sendPOST() throws IOException {
        ArrayList <adjetivos> mati = new ArrayList<>();
        
        URL obj = new URL(POST_URL);
        HttpURLConnection httpURLConnection = (HttpURLConnection) obj.openConnection();
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("User-Agent", USER_AGENT);

        // For POST only - START
        httpURLConnection.setDoOutput(true);
        OutputStream os = httpURLConnection.getOutputStream();
        os.write(POST_PARAMS.getBytes());
        os.flush();
        os.close();
        // For POST only - END

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println("POST Response Code :: " + responseCode);

        if (responseCode == HttpURLConnection.HTTP_OK) { // success
            BufferedReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in .readLine()) != null) {
                response.append(inputLine);
                
                String [] fields = inputLine. split(",");
                mati.add(new adjetivos (fields[0],fields[1]));
                
            } in .close();

            // print result
            System.out.println(response.toString());
        } else {
            System.out.println("POST request not worked");
        }
        System.out.println("Escribiendo array");
        for (int i = 0; i < mati.size(); i++) {
            System.out.println(mati.get(i).toString()+"\n");
            
        }
    }
}

Enlace de interésJAVA POST

Espero que te haya gustado 😉

DorniSoft Inc.