Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Libro Aprendizaje Javafx Con Netbeans y Mysqlworkbench
Libro Aprendizaje Javafx Con Netbeans y Mysqlworkbench
Lo primero que tenemos que tener claro, es que toda aplicación para distribución debe hacerse
frasco gordo (fatjar) con el plugin de Maven de springboot en nuestro pom: en dicho proyecto
podemos quitar los module-info, que ya no hacen mas que molestar, y no se necesita otra clase
principal mas que App. Así que ponemos al final de nuestro pom:
Con esto, al darle clean and build me da error, pero en netbeansproyect library acceso directo a los
proyectos, se consigue un segundo jar, que porta todas las librerías.
Recordamos que obtener las class de java o código, es tan sencillo como coger un jar y
descomprimirlo con winrar. Ni decompiladores necesitas.
Este método nos va bien para ver las librerías que lleva el fatjar, y ya vemos que es un componente
que corre automáticamente en nuestro equipo, pero que si lo exportamos a otro, pej, mi maquina
virtualbox w10 con java8, es incapaz de correr allí.
Todo fatjar, para distribuirse, debe de ir con su maquina virtual de java empotrada, motivo por el
cual aparece jpackage.
jpackage --type msi --name MyAApp --vendor softwaregroup --input C:\MyApp --main-jar MyApp.jar
--icon C:\MyApp\app-icon.ico --win-shortcut --win-menu
** nota recordamos que hay que desinstalar la versión de pruebas previa para hacer otra instalación
tras formar el nuevo jpackage.
y me generará, en la dirección donde este trabajando el cmd, un instalador tipo msi de Microsoft,
que al ejecutarlo, me genera un archivo .exe (el ejecutable) con un runtime o maquina virtual, y una
carpeta app donde lleva el fatjar dentro. También esta el icono. Esta aplicación se instala en mis
archivos, y disponemos de un acceso directo.
Para ello, le decimos que genere aplicación MyAApp, que esta en C:\MyApp folder, que dentro
contiene nuestro jar que se llama MyApp.jar y donde también esta el icono en ese path absoluto, y
que me genere un acceso directo .exe al escritorio.
---- tutorial launch4j
Launch4j y jpackage son cosas distintas. Jpackage, te forme un exe o un msi, lo que hace
es un wrapper del archivo fatjar, añadiendo la maquina virtual de javafx 17 en que se
construyó, y así independientemente de la configuración de java del cliente, la app se
distribuye y funciona. También se ofrece está posibilidad de jpackage, porque el cliente
tiene acceso al fatjar, y por ende al código, al descomprimirlo con unzip. En ambos, exe o
msi, crea una carpeta en c:/archivos de programa/nombredemiApp/bin== aquí estará el fat
jar
En contrapartida, Launch4j te deja opción de hacer un wrapp de un fatjar, o solo
empaquetar sin distribuir paquete. Es decir, no instala nada. Hace un portable, y el código
es inaccesible. Es un exe que con 2 clicks se ejecuta mágicamente si hace nada.
Y como se hace esto?: metes en una carpeta1 en el escritorio la app.jar (fatjar), el icono
de la app y ahí es donde irá el archivo de salida. No hacer sobre el escritorio, igual que el
Jpackage, porque empieza a absorber todo lo que pilla en el escritorio y te genera app de
40 gb.
Una vez le hayas dado a la ruletita, se genera un archivo con extensión cfg (o xls) y lo
guardas en el escritorio mismo, y ahora la app, si te dejará pulsar el botón play. Ya está.
para esto, obviamente, tenenos que tener jmods configurado.
¿Cómo se configura?
Como vemos, esto de empaquetar aplicaciones, para Windows, o Linux, es importante, ya que
generamos la maquina virtual de java que viaja con nuestro fatjar que ya contiene las libreria (de
unos 100 mb), pero aun así, en el desempaquetado, en la carpeta App, el usuario tiene acceso al
fat jar, y con una simple descompilacion con winrar, es capaz de obtener el código.
Solución, OFUSCAR EL CODIGO, PARA ello usaremos proguard en su versión 7.2 o superior,
que ya soporta java 17 y javafx. Este es un software de difícil uso, pero tenemos videos de
su funcionamiento en el servidor.
Si desea mantener los métodos en una determinada clase sin confundirse, debe configurar lo
siguiente
Instalar manualmente Maven en Windows 10
Descargar Maven
Se abrirá una ventana llamada propiedades del sistema ,presiona el boton llamado variables de
entorno .
Se abrirá otra ventana en la cual en el aparatado que se llama variables del sistema presiona el botón
Se abrirá un formulario el cual se deberá llenar de la siguiente manera en el nombre de la variable
digita MAVEN_HOME y en valor de la variable digita la ruta donde esta la carpeta de maven que se
descomprimio. Presiona el botón aceptar .
M2= %M2_HOME%\bin
M2_HOME= C:\apache-maven-3.2.2
Java -version.
-
los pasos anteriores.
HELLO WORLD EN PROYECTO MAVEN NO MODULAR.
Maven
Siga estos pasos para crear un proyecto no modular JavaFX y use las herramientas
de Maven para construirlo y ejecutarlo. Alternativamente, puede descargar un
proyecto similar desde aquí .
2. Verifique el pom
Puede encontrar el archivo pom generado aquí .
3. Ejecuta el proyecto
Haga clic Run -> Run Projectpara ejecutar el proyecto. Tenga en cuenta que el
proyecto Maven ya incluye un nbactions.xmlarchivo que asigna la runacción
al javafx:runobjetivo.
Hay que darle un id o nombre a cada uno de los textbox 1,2 y 3 aunque no lleven evento asociado.
Ahora, en el evento generado del controlador,capturamos y metemos en variables enteras lo que venga
del textbox, y ponemos bajo sentencia try-catch excepción para blindar el código.
3) creación nueva javaclass llamada suma: click derecho árbol lateral, javaclass.
Primero, tras definir
public class suma {
private int a;
private int b;
}
Lo primero es crear un constructor. Click derecho/insert code/constructor/ponemos en tick positivo
pestañas de las 2 variables.
2) lo segundo, crear getters and setters de las 2 variables. Click derecho, señalar las 2 variables y ya esta.
3) crear el método que será retornable al controlador que llame al modelo.
Resumen de todo dentro de la clase:
Como vemos el método public int suma(){ return a+b} se escribe así y es realmente sencillo.
4) llamar desde el evento de controlador al modelo, meter alert y reescribir en textlabel3.
Pero, el cursador, debe estar dentro de los {} del método de la clase en este caso pedidos, si no, no
aparece nada. Estando dentro enseguida la imagen izq. Generamos constructor y getters and setters.
Y tachan, modelo construido en menos de un minuto. En estos “mateos” típicos del controlador, también
puede expresarse la condición que puede haber libros del mismo autor del mismo año, o mismo genero.
Esto se hará con los equals o no equals.
1. Guis avanzados y eventos javafx.
Radiobutton: es muy similar. La diferencia con checkbotton es que no se pueden señalar 2 a la vez:
3. combobox o choicebox como aquí le llaman, no existe diferencia? Ver documentales ken.
https://www.youtube.com/channel/UCTOlGyde8NA1rfUAZXaBjrg/videos
4- slider.
5- spiner:esto es un spiner.
Código spinner:
@FXML /* al importarse o crear el controlador click derecho fxml si edito sale esto 2 clicks
veo la vista*/
lista2.addAll("ingenieria","fisica","quimica","biologia");
spinner1.setValueFactory(curso);
}
AlertBox dialog and confirm dialog:
7- text input dialog.
/etc/init.d/apache2 stop
y enfatizo esto ultimo de Linux, y lo enfatizo pq heroku o servidor web con constructor de herramientas es un stack
Ubuntu 20.04 LTS
// esta es la orden maven que ejecuta la explotación y arranque local del servidor. Para Una vez nuestro proyecto se
web en el navegador, ejecutamos:
// y se genera un archivo.zip en target/al lado del archivo .jar del proyecto, que es el que arrancaremos siempre con
un script de bash. Ese zip lo descomprimo en desktop y me muevo a la carpeta: C:// carpetadescomprimida(o
mavenexplotado)/bash ./bin/restart.sh y ya esta el servidor funcionando. 1) Si ahora pongo localmente en
navegador: 192.168.1.250:8080 veo mi aplicación. 2) si abro el router nat: 192.168.1.250:8080 como puerto interno
y 8080 como externo con seguridad intermedia, al teclear desde el 4g o navegador exterior:
electricidadvalencia22.duckdns.org:8080 ya veo mi aplicación y además superrapido. Y Trinity nada.
Ahora habría que crear un script en Windows de bash para que arranque automáticamente el servidor siempre que
arranque el servidor x86.
Programador de tareas/crear tarea básica/al iniciar sesión
➔ Limitaciones de Guis de javafx sobre navegador en jpro.
Vamos a ver que cuando ejecutamos una aplicación jpro, sobre cualquier navegador. .sucede lo siguiente:
Objetivo, superar este problema para conseguir la autentica aplicación javafx sobre jpro o
navagador al stilo javascript front end+html+css. ¿Como lo hacemos? Haciendo un
wrapper html.
Primero vamos a hacer funcionar esta aplicación .jar mvc nativa con maven que funciona
Con copia y pega del menúItem es suficiente, pero arriba, en la pestaña de menús, que no de de
controls donde esta el menú, podemos arrastrar menú ítems: luego, les damos nombre en id
Make controller. Metemos un text área para un solo archivo de selección, y un text área para
varios o un listview. Puedo meter también un imageview si quiero visualizar los png.
Si quiero un selector de multiples archivos usando el textarea.
Y si quiero usar el listview:
Creating a DirectoryChooser
DirectoryChooser directoryChooser = new DirectoryChooser();
directoryChooser.setInitialDirectory(new File("src"));
File selectedDirectory = directoryChooser.showDialog(null);
------→ Guis final, Canvas, real time plot con charts y clase Math.
0) error copia y pega .fxml mas controller que no te deja construir app. Si no edito, y otra cosa: un evento,
jamas puede ser igual al texto del label o al id que demos a ese componente, sino fallo.
1) tooltips
Montamos una gui Pane típica como las que venimos montando, dándole id al textbox sobre el cual ira el tooltip:
Id: textbox1
Ahora en el tooltip properties, debemos indicar el texto que quiero que me indique cuando pase el mouse por
arriba.
Sorpresa, solo hay un evento, el del botón que se prentende lanzar y ya está, no hay nada nada mas que indicador
@FXML
2) hiperlinks: nos interesa unos hiperlinks que nos muestren otros forms antes que páginas web
externas.
Montamos la gui, como siempre,
Ahora Abrimos una nueva carpeta en el ide de netbeans, y arrastramos los iconos .jpeg recortados con
recortes a la carpeta nueva, y ya están importados.
3) Canvas class:
MAS FACIL QUE EN PROCESSING TODAVIA. Vamos a primary.fxml y añadimos miscellaneus/canvas y shapes.
Deben quedar asi las dependencias. Yo por ejemplo, he dibujado.
Esto es muy facil. Se meten lineas verticales, horizontales, puedo controlar el stroke, x and y position, el text,
position etc… colour, etc…. Todo es configurable. Es muy facil. Entre las pestañas properties y layout, puedo
gestionarlo todo.
Esto no se puede anclar y manipular como bloques. Has de editar mas o menos cada línea horizontal y vertical una a
una, no se puede hacer copia pegas de 2 en 2. Además, tampoco existe posibilidad de anclar todo como un objeto,
pero si puedo desplazar conjuntos enteros seleccionándolo todo.
4) charts: decir, en cuanto a los charts, que el único que nos gusta un poco, es:
Pero ciertamente, todo lo que no sea editable por el anterior metodo, nada. Así que no voy a aprender charts.
Voy a aprender a hacer tickevents, y graficar una linea roja en la canva anterior.
5) animations.
Ahí podemos estudiar entre otras, animations que va tras la main class javafx App extends aplication{
} es decir, va en el primaryController
package application;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.animation.FadeTransition;
import javafx.animation.Interpolator;
import javafx.animation.RotateTransition;
import javafx.animation.ScaleTransition;
import javafx.animation.TranslateTransition;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.image.ImageView;
import javafx.scene.transform.Rotate;
import javafx.util.Duration;
@FXML
@Override
public void initialize(URL url, ResourceBundle rb) { /* muy importante observar que la clase animation, va igual que
la carga de color sobre el método initialize, así que ha olvidar aquello de extends app, etc… aunque admitia 2
apellidos*/
// translate
translate.setNode(myImage);
/* translate.setCycleCount(2); */
translate.setByX(500);
translate.setByY(-250);
/*
// rotate
rotate.setNode(myImage);
rotate.setDuration(Duration.millis(500));
rotate.setCycleCount(TranslateTransition.INDEFINITE);
rotate.setInterpolator(Interpolator.LINEAR);
rotate.setByAngle(360); // angulo de rotación. Muy interesante para el orientado del cohetecito en cuando
paredes.
rotate.setAxis(Rotate.Z_AXIS);
rotate.play();
// fade // esta para que nuestra imagen pestañee osea, aparezca y desaparezca o sea visible o no en la pantalla.
fade.setNode(myImage);
fade.setDuration(Duration.millis(1000));
fade.setCycleCount(TranslateTransition.INDEFINITE);
fade.setInterpolator(Interpolator.LINEAR);
fade.setFromValue(0);
fade.setToValue(1);
fade.play();
scale.setNode(myImage);
scale.setDuration(Duration.millis(1000));
scale.setCycleCount(TranslateTransition.INDEFINITE);
scale.setInterpolator(Interpolator.LINEAR);
scale.setByX(2.0);
scale.setByY(2.0);
scale.setAutoReverse(true);
scale.play();
*/
}
5) nosotros ya tenemos un programa implementado que plotea una funcion matemática animada corriendo por una
curva en el tiempo x. no obstante vemos que la función es linealmente dependiente con el tiempo.
Es decir, para representar el vector velocidad, mas no el vector posición, que puede ser x(t)= at^2
Vamos a centrarnos en la funcion del coseno y ver el periodo de oscilación en funcion del marco.
private enum NamedFunction {
SIN(x -> Math.sin(2 * Math.PI * x /200)*100+250/** 200 + 200 200 es es descenso en eje y para centrarse*/,
"Sine"),
COS(x -> -Math.cos(2 * Math.PI * x / 100) * 150 + 180, "Cosine"),-- EL +180 ES EL Y0 DE ORIGEN, SI LO QUITO
TODO SE DESPLAZA 180 PIXELES PARA ARRIBA.
El ancho en pixeles del cuadrante gausiano es: 695-324=371 (layoutx2- layoutx1) poco mas de 360
Resulta se que: COS(x -> Math.cos(2 * Math.PI * x / 100) * 150 + 180, "Cosine")
*150 == amplitud de oscilación pq math.cos =1 pixel respecto al punto yo=180 que es el mas de después respecto
al marco superior rojo +30 --- es decir, que los 150 + esos 30 dan esa sensación de simetría.
2*150/100 =300/100 =3 los 3 pis radianes que tenemos. Es decir las oscilaciones?
Falso: el factor *150 es la amplitud de oscilación respecto al punto y0, que es los 180 de suma.
La demo es ver que la raya ultima de arriba, la de rojo está a 30 de yo. Entonces la frecuencia se puede ver así: hay
un 2*pi=1 oscilacion onda por encima ejex, por debajo eje x por cada 100 pixeles. Yo tengo 370 pixeles, tengo 3.7
osc.
if (newFunction != null) {
// LOS 2 primeros numeros son tamaño del picture box los 2 ultimos son xini y xfinal del plotaje
funcion
Yf aquí expresado es el contrario de la roja de arriba subrayada. Xf es el palote ultimo amarillo fluorescente mas a
la derecha.
O son el picturebox? Realmente parecen lo limites del picture box que esa superajustado a nuestras rayas.
Uso de las expresiones matemáticas o Math.funcion:
Math.exp(10.0)= e^10
Math.atan(angulo)
La función log calcula el logaritmo natural (de base e) de un número
Math.log(Math.E))=1;
Math.pow(10.0,3.5)=10^3.5
Math.abs(x);
Math.sqrt(x);
Los redondeos:
floor Redondeo al entero menor double x = Math.floor(2.5); x = 2.0;
double x = 72.3543;
double y = 0.3498;
System.out.println(x + " es aprox. " + (double)Math.round(x*100)/100);
System.out.println(y + " es aprox. " + (double)Math.round(y*100)/100);
Se obtiene 72.35 y 0.35 como cabría esperar. Fijarse que round devuelve un número entero int que es
necesario promocionar a double para efectuar la división entre 100.
La clase Math define una función denominada random que devuelve un número pseudoaleatorio
comprendido en el intervalo [0.0, 1.0)
En java no existe ninguna función que nos calcule directamente logaritmos en bases distintas a
10. Para ello habrá que crear nuestra propia función.
perimetro=2*n*Math.sqrt(2.0-Math.sqrt(4.0-(perimetro/n)*(perimetro/n)));
Dado que Math.max(x,y)me da el mayor o máximo de entre 2 numeros, que son x e y en este caso y
que Math.min(x,y)me da el mínimo entre 2 números:
num[i] = leer.nextInt();
}
//////////////////////////////
Arrays.sort(num);
////////////////////////////
System.out.println("\nLos numeros ingresados ORDENADOS ASCENDENTEMENTE son: ");
System.out.println(num[i]);
}
}
5) Finalmente queda analizar sobre la clase gráfica tick_animation. Es decir, los charts.
Bien, tenemos un proyecto, que es un tick evento cada 500ms de una funcion integrado en un char , en
este caso, coseno(x) que tiene la dimensión o acople en ventana que deseamos, y a la cual hemos
aprendido le podemos cargar los dibujos copia y pega, de la clase canvas.
Esta clase, esta además sobre el form1, con lo cual podemos seguir haciendo otros forms, y además el
evento empieza, no esta sobre inicialize, sino sobre el botón begin running
En lo que andamos ahora es en canviar los colores de la línea, y cambiar lo tiempos de autorefresco de los
ticks y para y limpiar la simulación.
Para los plots de física, poder representar a tiempo real (ticks de un segundo) una funcion matemática (ej,
t^2 es importante)
Código:
import java.util.concurrent.atomic.AtomicInteger;
import javafx.scene.control.ComboBox;
@FXML
private Button primaryButton;
@FXML
private Button btnbegin;
@FXML
private Button btnstop;
@FXML
private Button btnclear;
@FXML
@Override
public void initialize(URL url, ResourceBundle rb) {
}
@FXML
@FXML
private void begin(ActionEvent event) { // el botón btn begin, inicializa variable y lanza método run
// que es un temporizador.
valorcoseno=0;
x=0;
exit = false;
run();
}
// execution of thread starts from run() method
public void run()
{
// PrimaryController.chart1.setTitle("Realtime JavaFX Charts");
chart1.setAnimated(false); // disable animations
//defining a series to display data
XYChart.Series<String, Number> series = new XYChart.Series<>();
series.setName("Data Series");
try {
String txt=(tick.incrementAndGet()+"");
Thread.sleep(500);
// Platform.runLater(() -> series.getData().add(new
XYChart.Data<>(tick.incrementAndGet(),(int)corrercoseno() )));
Platform.runLater(() -> series.getData().add(new XYChart.Data<>(txt,corrercoseno() )));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
// System.out.println(name + " Stopped.");
updateThread.setDaemon(true);
updateThread.start();
}
// for stopping the thread
@FXML
private void clear(ActionEvent event) {
chart1.getData().clear();
}
@FXML
private void stopi(ActionEvent event) {
exit = true;
}
}
Hemos de darle id, a cada uno de los tabpanes (subpaneles, y al tabpanel principal.
Al mas importante que hay que darle id no es los subtabs, sino al tabpane principal. Le
llamaremos tp (tabpanel ) y es necesario para el getselectiomodel y seleccionar el tab adecuado
Como identidad, le damos tp. Acordarse del click derecho, make controller.
Programacion con clases Abstractas. Métodos numéricos. Corrección fallo copia-pega
archivos fxml o gui, y porque no podía crear nuevos programas de jpro.
1) ojito al copia y pega de las Guis de otros proyectos de netbeans, es decir, a los archivos de escen Buider .fxml, si
hago un copia pega fxml se hereda en fxml edition el paquete antiguo y esta en rojo error y no carga la app aunque
sea nueva. Netbeans es incapaz, para tu paquete, de señalarte esto en rojo. Por esto no podíamos implementar
ídem projecto jpro.
2) procedemos a la metodología de implementación por clases para los ejemplos de calculo numérico. Empezamos
por regula-falsi. La estructura de programas debe ser:
App principal el launcher, es el de siempre, no se toca, el objetivo, es lanzar el PrimaryController (tras fxml click
derecho make controller)
Muy importante: la clase PrimaryController, jamas debe ser una clase abstracta. Las clases abstractas, son las clases
Hijas pero PrimaryController, no debe ser abstracta, sino, no puede construir.
import javafx.scene.paint.Color;
public class PrimaryController extends Ecuacion implements Initializable {
// no debe extenderse la clase App o la de la clase principal. Debe Extenderse, la clase abstracta hija. Fíjate que
arriba figura en gris…..
@FXML
@FXML
private void resultado(ActionEvent event) { // el evento llama a funcion de otra clase. Throws IOexception.
try{
// System.out.println(ex.getMessage());
alert.setTitle("warning");
alert.showAndWait();
}
}
// este método vacio de acontinuación, diría que es la parte mas importante del código. Es un método, que hace que
el chivato o luz roja de decirle a la clase PrimaryController, No se haga abstracta. Si quitara esto, no me deja
compilar si la clases principal, no la hago abstracta. Y Entonces, nada funcionaria.
@Override
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods,
choose Tools | Templates.
Pane.setBackground(naranja); }}
// clase abstracta hija Ecuacion.java. esta clase suele ser la que lleva el método principal.
package com.mycompany.newtonclases;
// no imports aquí.
double m, ym;
int iter=0;
do{
m=(a+b)/2;
ym=f(m);
if(Math.abs(ym)<CERO) break;
if(Math.abs((a-b)/m)<ERROR) break;
if((f(a)*ym)<0) b=m;
else a=m;
iter++;
}while(iter<MAXITER);
if(iter==MAXITER){
return m;
public RaizExcepcion(String s) {
super(s);
}
Public class funcion. Estudiemosla
package com.mycompany.newtonclases;
return(x-Math.cos(x));
// otra cosa muy importante: la clase primaryController, debe ser lo mas publica (o protected) que se pueda,
evitando usar argumentos private, sino las dependencias no llegaran a las subclases, y no se podrá implementar.
Fíjate, el método, en lugar de ser private, así como los argumentos, son todos public, no private.
@FXML
@FXML
@FXML
@FXML
public double a;
public double b;
public int n;
*/
@FXML
//
Conexión javafx arduino atraves de librería jssc.
Ejemplo de adicion de librerías externas.
Bien, vamos a unir un programa de javafx17 con uno de Arduino.
Necesitaremos añadir la librería jssc la última que haya(java simple serial conector). Nos bajamos el .jar de
Maven central o github, y como siempre que añadimos librería:
Y aparecerá un Brower en el que buscaremos la librería externa. Una vez hecho, esto, añadimos el
siguiente código en el primary controller:
Perfecto, ahora falta la interfaz grafica, y la parte de Arduino:
Luego, lo que haremos es es quitar esta clase scanner y poner una interfaz gráfica:
Para ello, hemos de modificar un poco mas el código:
Aquí es lo que se pretende es que tras buscar el puerto y darle a conectar, la introducción de una
contraseña correcta, me habilite el disparo de led o apertura caja fuerte. Esos círculos, son los intentos, si
hay 3 intentos fallidos, los 3 circulos se ponen en rojo, y la caja fuerte no se puede abrir.
Cuando se introduce la contraseña correcta, los 3 leds se encienden en verde, y se muestra el estado de
otro led.
Introduciríamos un combobox, y un observable list.
***** recordamos que todo archivo modular, se inicia como un archivo normal acorde
especificacions de openjavafx.io es decir, configuración con Maven fxml…., y es pom posterior el
del parent-directory, el que los arreplegara a todos bajo un único archivo.
El groupId es un parámetro que indica el grupo o la persona que creó un proyecto, que
suele ser un nombre de dominio de empresa invertido. El artefactoId es el nombre del
paquete base usado en el proyecto, y usamos el arquetipo estándar .
Dado que no especificamos la versión ni el tipo de paquete, estos se establecerán en
los valores predeterminados: la versión se establecerá en 1.0-SNAPSHOT y el
paquete se establecerá en jar .
Si no sabe qué parámetros proporcionar, siempre puede
especificar interactiveMode = true , de modo que Maven solicite todos los
parámetros necesarios.
Una vez que se completa el comando, tenemos un proyecto Java que contiene una
clase App.java , que es solo un programa simple "Hello World", en
la carpeta src/main/java .
También tenemos una clase de prueba de ejemplo en src/test/java . El pom.xml de
este proyecto se verá similar a esto:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.baeldung</groupId>
<artifactId>org.baeldung.java</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>org.baeldung.java</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Con packaging se indica el tipo de empaquetado que hay que hacer con el proyecto.
Podemos usar jar, war, ear, pom.
Gradle:
Proporcione el nombre del proyecto, como HelloFXy una ubicación para el proyecto, proporcione
el nombre del paquete, como org.openjfxy la clase principal, como MainApp. Finalmente,
seleccione Initialize Gradle Wrapper.
El proyecto se crea y se abre.
Nota: actualmente, el complemento Gradle de JavaFX requiere que el contenedor de gradle esté
configurado en un valor máximo de 6.3. Establezca el valor de distributionUrlen consecuencia en
el gradle/wrapper/gradle-wrapper.propertiesarchivo.
2. Modificar la compilación
Edite el build.gradlearchivo y reemplácelo con este archivo de compilación .
javafx {
version = "17"
modules = [ 'javafx.controls', 'javafx.fxml' ]
}
Nota: si NetBeans se ejecuta con un JDK inferior a 11, es posible que el complemento no funcione. Edite
el netbeans/etc/netbeans.confarchivo y configure en netbeans_jdkhomeconsecuencia, o haga lo mismo
con el ~/.gradle/gradle.propertiesarchivo, configurando org.gradle.java.home.
Guarde el proyecto y obtendrá las dependencias de JavaFX.
En cuanto a cualquier otra dependencia de Gradle, estos archivos jar se pueden encontrar en
el .gradlerepositorio local.
React, vue, Angular, son frameworks de JAVASCRIPT, NO DE JAVA. TU NO VAS A APRENDER ESO
Y oracle sql, y oracle, la mas importante.
Por tanto en industria : frontend = javascript
Backend: java o php.
Luego esta el full Stack developer, que es front end +backend = maquina.
Con jpro-one, serias un fullstack developer, pues implementas las 2 capas, pero las
app, distan mucho de ser tan vistosas como las conseguidas con javascript y estos
frameworks.
Jakarta EE 9.1
Esta revisión menor solo añade Java 11 como requisito. La publicación del curso comenzó antes
de esta versión y ya se usaba Java 11, así que la vamos a ignorar y no habrá actualizaciones hasta
la llegada y difusión de Jakarta EE 10.
Servidores de aplicaciones
Desde una perspectiva práctica, la definición de Jakarta EE como un simple conjunto de APIs
estandarizadas no es suficiente. Tenemos una para trabajar con bases de datos relacionales, otra
orientada al desarrollo de servicios REST, un par relativas a la notación JSON… pero
necesitamos la integración de todas ellas si queremos crear una aplicación completa. Vamos a
dedicar mucho tiempo a ensamblar las piezas si no tenemos una plataforma de desarrollo que
provea todo lo necesario.
Pues bien, esta plataforma existe y no podía haberse diseñado mejor: es una especificación
llamada Jakarta EE Platform. Se asume que nos referimos a ella cuando simplemente hablamos
de Jakarta EE. Sus implementaciones resultan especiales: son servidores de aplicaciones en los
que se puede desplegar (ejecutar) cualquier aplicación basada en la versión y perfil de
JEE\Jakarta EE con las que el servidor sea compatible. Para conseguirlo, deben incluir tanto las
APIs como las implementaciones de todas las especificaciones. No tenemos que preocuparnos
por seleccionarlas y empaquetarlas en nuestros proyectos y, lo más importante, ya están
integradas para que funcionen en perfecta armonía.
Esta imagen subraya el requerimiento anterior. Todo lo que una aplicación necesite de Jakarta
EE está en el servidor.
De acuerdo a lo que ya sabemos, los servidores de aplicaciones son intercambiables si la
aplicación solo usa las APIs del estándar. Otro asunto son las configuraciones y la
administración, dependientes de cada uno.
(*) Hasta 2013, WildFly se llamaba JBoss AS, y muchos todavía utilizan este nombre.
Otras alternativas de código abierto a considerar son Apache TomEE, Payara Server, Open
Liberty y GlassFish. Este último forma parte de la donación de Oracle a la Fundación Eclipse. Es
la implementación de referencia de JEE y, en cierto modo, lo sigue siendo para Jakarta EE pues
los TCK se basan en sus librerías y debería ser el primer servidor compatible con cada nueva
versión.
Para concluir esta sección, me gustaría señalar un error muy común. Los servidores de
aplicaciones Jakarta EE \JEE suelen confundirse con servidores tan populares como Apache
Tomcat y Eclipse Jetty que solo ofrecen las características imprescindibles para desplegar
aplicaciones web. La distinción la haremos atendiendo a la clasificación del producto: son
servidores, pero no «de aplicaciones». Si se quiere usar en ellos una especificación, la aplicación
debe incluirla (API e implementación).
- Instalación del software: instamos en nuestra maquina virtual java 11 y netbeans y por
ende la variable de entorno de Maven.
WildFly
No hay que realizar ninguna instalación, tan solo descargar y descomprimir. En la próxima
entrega mostraré varias formas de desplegar aplicaciones en este servidor.
• src/main. Aquí están los ficheros con las fuentes («sources»), divididos en tres grupos.
▪ java. Es el código fuente.
▪ resources. «Recursos» que utiliza el código, como por ejemplo
ficheros .properties, y que forman parte del classpath. Cuando la aplicación se
empaqueta en un artefacto, el contenido de esta carpeta se copia de forma
recursiva en la raíz del directorio en el que se ubican los ficheros .java ya
compilados en .class.
48</project>
49
50
51
El ejemplo anterior de fichero pom.xml contiene una configuración básica para una aplicación
web basada en Jakarta EE. De hecho, pertenece al proyecto de ejemplo hello con el que vamos a
trabajar en este capítulo. Analicemos brevemente su contenido.
• Los datos que caracterizan al proyecto.
▪ groupId: Es el identificador de la organización o persona que lo desarrolla.
La costumbre es utilizar una ruta de paquetes. En mi caso, es la dirección
invertida de mi blog, criterio muy habitual (org.apache, org.hibernate,
com.liferay, etc).
▪ artifactId: El identificador específico del proyecto, y único para un
mismo groupId. En definitiva, su nombre.
▪ version: La versión actual. Iré actualizando y ampliando los ejemplos del
curso pero no cambiaré su versión, de ahí que haya añadido el
sufijo SNAPSHOT («instantánea») para que Maven sepa que se trata del
código más reciente de la 1.0.0.
▪ packaging: El tipo de artefacto a generar. El predeterminado es jar, así que
ponemos war.
• El artefacto con la aplicación se llamará «hello.war» (finalName). Si no proporcionamos
el nombre, Maven lo compondrá con los valores de artifactId y version (hello-1.0-
SNAPSHOT.war)
• Las librerías de Maven (plugins) que vamos a utilizar para construir el artefacto. Hay
dos: uno lo genera (maven-war-plugin) y el otro compila el código (maven-compiler-
plugin) para la versión de Java especificada con la propiedad maven.compiler.release. No
es necesario declarar estos plugins si no se va a realizar ninguna configuración de los
mismos, pero recomiendo hacerlo para indicar su versión y así evitar sorpresas
desagradables. De lo contrario, Maven utiliza unas versiones bastante antiguas.
• Me gusta definir variables en el bloque properties con los números de versiones. La idea
es reutilizarlas si tenemos varios módulos de una misma librería que comparten la
numeración. Otra ventaja es que vemos de un vistazo todas las librerías y versiones.
Entre las propiedades, fijémonos en project.build.sourceEncoding. La utiliza el
plugin maven-resources-plugin para establecer la codificación de los ficheros.
Recomiendo definirla con el valor UTF-8 y así evitar problemas causados por usar el
proyecto tanto en Windows como en Linux. Obsérvese que acabo de mencionar un plugin
que no aparece en el pom: no necesitamos realizar ninguna configuración adicional y
Maven ya lo utiliza. En este caso concreto, indicar el número de versión no me parece tan
relevante como en los casos de maven-war-plugin y maven-compiler-plugin.
• El punto de mayor interés son las dependencias. Por omisión, y al igual que los plugins,
se descargan de los repositorios centrales de Maven, un auténtico paraíso de librerías
de código abierto que podemos inspeccionar con la web mvnrepository.com. Estas
dependencias no son sino artefactos y se van guardando en nuestro equipo en un
«repositorio local» para evitar descargarlas cada vez que sean necesarias.
Hay dos alternativas a la hora de añadir las dependencias con las APIs de Jakarta EE.
Lo habitual es decidirse por la primera opción. La razón es muy sencilla y se explicó en el capítulo
dos: todas las dependencias de Jakarta EE son de tipo «provided» porque están disponibles,
tanto las APIs como sus implementaciones, en el entorno de ejecución (el servidor). No se
empaquetan en la aplicación (la carpeta /WEB-INF/lib en hello.war), así que lo más cómodo es
hacer que todas las APIs estén a nuestra disposición e ir usando lo que necesitemos. Otra ventaja
es la sencillez del pom.
Con el pom anterior ya tenemos el proyecto hello listo para ser publicado, pero es un «cascarón
vacío» que no hace nada. Demasiado triste; vamos a añadir alguna funcionalidad. Por ejemplo,
la página principal de la aplicación que se verá cuando accedamos su dirección raíz. Tenemos
que crearla en el fichero /src/main/webapp/index.html.
1<!DOCTYPE html>
2<html lang="es">
3
4 <head>
5 <meta charset="UTF-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1">
7 <title>Hello</title>
8
<link rel='icon' href='img/favicon.png' type='image/x-icon'>
9
<style>
10
body {
11
max-width: max-content;
12
margin: auto;
13
text-align: center;
14
}
15
</style>
16
</head>
17
18
19 <body>
20
21 <h1>Hello - Jakarta EE</h1>
22
23 <img src="img/jakartaee.png">
24
25 </body>
26
</html>
Las líneas marcadas son de especial interés porque enlazan imágenes situadas en la
carpeta /src/main/webapp/static/img. Con la excepción del contenido de WEB-INF, todos los
ficheros de webapp son accesibles vía web añadiendo su ruta relativa a la url raíz que la
aplicación tiene en el servidor, por ejemplo {url aplicación}/img/jakartaee.png.
Comencemos a utilizar Jakarta EE con una de las especificaciones más importantes: Jakarta
Servlet, API que gestiona peticiones y respuestas HTTP. Es la base de todas las aplicaciones web
Java y, aunque casi nunca la usaremos directamente, siempre está ahí, por ejemplo «oculta»
detrás de Jakarta Server Faces o Jakarta REST. La veremos con detalle en el capítulo
correspondiente. Por ahora, es suficiente con saber que un servlet, definido de forma sencilla y
práctica, es una clase que recibe una petición HTTP y devuelve una respuesta, por ejemplo una
cadena con el HTML de una página web.
A continuación se muestra el servlet que vamos a usar. Una petición de tipo GET realizada a la
dirección indicada en la anotación @WebServlet provoca la invocación del método doGet en el
que recibimos dos objetos que modelan la petición (request) y la respuesta asociada (response).
Esta última consiste en una cadena de texto tal y como especifica el content-type.
1
2package com.danielme.jakartaee.hello;
3
4import jakarta.servlet.ServletException;
5import jakarta.servlet.annotation.WebServlet;
6import jakarta.servlet.http.HttpServlet;
7import jakarta.servlet.http.HttpServletRequest;
8import jakarta.servlet.http.HttpServletResponse;
9
10import java.io.IOException;
11import java.io.PrintWriter;
12
13@WebServlet("/helloServlet")
14public class HelloServlet extends HttpServlet {
15
16 private static final String HELLO_MESSAGE = "Jakarta EE rocks!!";
17
18 @Override
19 protected void doGet(HttpServletRequest request, HttpServletResponse response)
20 throws ServletException, IOException {
21 PrintWriter printWriter = response.getWriter();
22 response.setContentType("text/plain;charset=UTF-8");
23 printWriter.print(HELLO_MESSAGE);
24
}
25
}
La siguiente imagen ofrece una visión general del funcionamiento de la aplicación que hemos
construido.
A través del protocolo HTTP, por ejemplo usando un navegador, llega la petición GET al servidor
quien determinará el servlet que debe atenderla. Su método service se invocará como parte de un
flujo de trabajo que puede implicar a varios servlets. En algún momento se llama a nuestro
método doGet.
Todo lo anterior es realizado por un componente denominado «contenedor de servlet» (servlet
container), requisito de la especificación. Este elemento forma parte del servidor web que debe
incluir, valga la redundancia, todo servidor capaz de ejecutar aplicaciones web Java aunque no
sea compatible con Jakarta EE. En el caso de WildFly, se trata de Undertow. Este nombre nos
será muy familiar pues aparecerá con frecuencia en los registros de la bitácora (logs).
Construcción y despliegue
Manual (Maven)
Veamos ahora cómo publicar la aplicación en WildFly (este proceso es distinto en cada servidor).
En primer lugar, generamos el artefacto .war. Mencioné en el capítulo anterior que el proyecto
incluye el wrapper de Maven, un script que permite utilizar una versión concreta sin instalarla
en el equipo. El wrapper en sí mismo es un fichero .jar ubicado en una carpeta oculta.
Lanzamos el ejecutable de Maven, ya sea con el wrapper dentro del proyecto (mvnw) o bien el
instalado en el equipo (mvn), y solicitamos las acciones (goals) que necesitamos.
Clean borra el contenido de target con el fin de asegurar que la aplicación se genera desde cero.
Por su parte, package crea el artefacto realizando las tareas necesarias, lo cual incluye la
compilación del código y la ejecución de las pruebas si las hubiera. Si todo va bien, veremos algo
como lo siguiente.
¡Ya casi estamos! Ahora es el turno de WildFly. Lo iniciamos ejecutando el script standalone (*)
ubicado en la carpeta bin dentro del directorio donde lo hayamos descomprimido.
Usamos standalone.sh en Linux y standalone.bat en Windows. El script ejecuta el servidor con la
versión de Java que tengamos configurada en el sistema operativo. Admite algunos parámetros
que ya iremos viendo cuando los necesitemos.
(*) WildFly tiene dos modos de ejecución: independiente (standalone) o formando parte de un
clúster (dominio). En el curso solo usaremos el primero.
La aplicación está accesible dentro de ella con el nombre del fichero .war.
Probemos el servlet que escucha en la dirección http://localhost:8080/hello/helloServlet .
Es importante que nos familiaricemos con esta poderosa herramienta que usaremos de forma
recurrente a lo largo del curso.
Eclipse
Podemos navegar por sus ficheros y librerías con el explorador que aparece a la izquierda. A
diferencia de IntelliJ, en una misma ventana de Eclipse se muestran múltiples proyectos: todos
los pertenecientes al espacio de trabajo («workspace») seleccionado. Nada nos impide abrir otra
instancia de Eclipse y escoger un workspace distinto.
Comprobemos la JDK que Eclipse usa para compilar hello. Queremos que sea OpenJDK 11, y si
su instalación no está registrada tendremos que añadirla. Abrimos el menú contextual del
proyecto en el explorador para pulsar Properties. Nos vamos a la sección «Java Build Path», en
concreto la pestaña «Libraries».
Marcamos la JRE que aparece y pulsamos Edit para mostrar la pantalla de selección.
A continuación, intentemos desplegar hello con la opción «Run As» de la barra de herramientas
(botón «play» en un círculo verde) o con el menú contextual (botón derecho del ratón)
desplegable desde la carpeta con el nombre del proyecto en el explorador. También podemos
hacer el despliegue en modo depuración con el icono del «bichito».
Al ser la primera vez, carecemos de una configuración para hacer el despliegue, así que el
asistente nos pedirá definir un servidor. Seleccionamos nuestra versión de WildFly. Si vamos a
usar una muy reciente es posible que falte. Es el caso de la captura siguiente donde la más actual
es la 21 a pesar de que en ese momento ya se había publicado la 22. Cuando nos encontremos
ante esta situación, además de intentar actualizar JBoss Tools, seleccionamos la versión más
alta. Por experiencia, no suele haber problemas.
Al final del asistente, indicamos el directorio de instalación de WildFly (también tenemos la
posibilidad de descargar la versión seleccionada en la pantalla anterior), y la JDK de Java 11 que
se usará para ejecutarlo.
Eclipse procederá a realizar el despliegue de forma inmediata. En la vista Console tenemos la
salida del servidor.
Código de ejemplo
El código de ejemplo para este capítulo se encuentra en GitHub (todos los proyectos están en
un único repositorio). Contiene un fichero Dockerfile correspondiente a otro capítulo. Para más
información sobre cómo utilizar GitHub, consultar este artículo.
Estudio del paquete de netbeans calculo Númerico. Calibración y funciones.
Nuestro paquete .rar tiene 18 aplicaciones. Veamoslas.
1) Gui: (3)→ canvas plot, una animación ok, tick animación, y proyecto Maven 1. Que es el de jpro
pero en local. (jdk16) recordamos que jpro solo va sobre jdk 11 y lo he quitado. Cuando llegue el
jdk17 usare los2. Testadas.
2) Raicesmultiple p(x) y raíces complejas de p(x) (2). → Tma fundamental del algebra. Testadas.
3) Cramer y multiplicación de matrices. Testadas.(2)
4) Regresión lineal y cuadrática a chicuadrado (2)
5) Integral simple simpsom y doble (2)
6) Edos primer orden individiduales, sistemas y segundo orden, individual y sistemas (x4)
7) Derivación y optimización de funciones por el criterio de la derivada(1).
8) Interpolación de newton y FFT (2)
Recordamos que en C# también disponemos del algoritmo de Dantzing (meter simplex en lupa de
windows), el cual no hemos conseguido implementar en java, ni transformar de c# a java, pero que lo
estudiaremos.
1) Edos y sistemas de edos de primer y de segundo orden. Fundamento
matemático.
Se demuestra que la resolución de un paso h de una edo por el procedimiento de runge-kutta es:
Se elige una anchura de paso h, y se calculan cuatro números k1, k2, k3, k4 de acuerdo con el
procedimiento esquematizado en la tabla adjunta. Según el procedimiento ordinario de Runge-
Kutta, a partir del valor de x en el instante t se determina el valor de x en el
instante t+h mediante la fórmula que figura en la última fila de dicha tabla.
Ejemplo:
Continuando con el ejemplo de la desintegración radioactiva consideremos ahora, una serie
radioactiva de tres elementos en la que, una sustancia radiactiva A se desintegra y se
transforma en otra sustancia radiactiva B, que a su vez se desintegra y se transforma en una
sustancia C estable. Las ecuaciones diferenciales que gobiernan el proceso y sus soluciones
analíticas son, respectivamente,
La solución analítica que aparece a la derecha, se ha obtenido con las condiciones iniciales t=0,
x=x0 e y=0. La segunda solución se obtiene siempre que a sea distinto de b. En el caso de
que a sea igual a b, la solución analítica para y es
La interpretación del sistema de ecuaciones diferenciales no es complicada. En la unidad de
tiempo, desaparecen ax núcleos de la sustancia A al desintegrarse (primera ecuación). En la
unidad de tiempo, se producen ax núcleos de la sustancia B, y a su vez desaparecen bx núcleos
de la sustancia B que al desintegrarse se transforman en núcleos de la sustancia C estable
(segunda ecuación).
Para codificar este ejemplo, primero se han de definir las funciones f, g en la clase
derivada Funcion de la clase abstracta RungeKutta.
Uno de los problemas del tratamiento numérico con ordenador, es la de reducir el problema a
números simples e inteligibles por el usuario de un vistazo. Las masa de los planetas y del Sol
son números muy grandes: la masa de la Tierra es 5.98 1024 kg., y 1.98 1030 kg. la del Sol. La
distancia media entre la Tierra y el Sol es también muy grande 1.49 1011 m. y la constante G es
muy pequeña 6.67 10-11 en el Sistema Internacional de Unidades. Podemos simplificar el
problema numérico, refiriéndonos a un hipotético Sol cuya masa sea tal que el
producto GM=1 o bien, que se ha cambiado la escala de los tiempos de modo que se cumpla
esta condición. Teniendo en cuenta que la aceleración es la derivada segunda de la posición, el
sistema de dos ecuaciones diferenciales de segundo orden quedará
Esto esta bien seguro vamos. Están todos calibrados. Ahora lo que hay es que hacer correr
un evento de tick que vaya generando cada uno de los pasos, y almacenar la variable en un
vector y plotearlo.
MULTIPLICACION MATRICIAL Y SISTEMAS DE ECUACIONES: PERFECTO: I*I=I
Este programa calcula la matriz inversa, y resuelve el sistema de ecuaciones por el método
de la matriz inversa: A-1*A=A-1*d donde d es el vector de soluciones.
◼ Raíces polinomiales y teorema fundamental del algebra (2) perfecto:
Solución de la funcion prueba debe ser +-2 y levernier o obtención de raíces complejas
también.
Si el discriminante >=0, las raíces son lineales, y son calculados, las multiples
soluciones, por regula falsi,
Transformada rápida de Fourier: FFT
La transformada rápida de Fourier, conocida por la abreviatura FFT (del inglés Fast Fourier
Transform) es un algoritmo eficiente que permite calcular la transformada de Fourier
discreta (DFT) y su inversa.
N=4 k = 0,1,2, 3
la fase
Reconstruccion de la señal:
Si la frecuencia de muestreo son 8 kHz, el correspondiente periodo
n = 0, 1, 2, 3
LOS RESULTADOS SON 100% COINCIDENTES. Y ESTE EJEMPLO SERA EL QUE NOS SERVIRÁ PARA CALIBRAR
EL ALGORITMO, Y ES PERFECTO.
En lugar de usar la notación compleja también se puede usar la real:
➔
➔ Resolución integrales dobles:
Existe un problema muy común en programación lineal que consiste en hallar los
valores que hacen máxima o mínima una función lineal, dadas una serie de restricciones
para dichos valores. Por ejemplo, puede tratarse de hallar una función de coste mínimo
o de máxima producción. Para ello, existe un algoritmo desarrollado en 1947 por George
Dantzig, llamado Simplex, que permite realizar dichos cálculos de una forma simple y
efectiva.
En este enlace podéis encontrar una explicación matemática del método Simplex, y en
este otro podéis descargar el proyecto Simplex, con el código de ejemplo que acompaña
a este artículo, escrito en CSharp con Visual Studio 2013.
Una vez escritas las ecuaciones, se debe pulsar el botón Build para compilarlas, y, a
continuación, ya se puede pulsar el botón Maximize o Minimize para que el programa
proporcione los valores de las variables que hacen máxima o mínima la función con las
restricciones dadas.
Y al darle a maximize:
Producto 1 10 12 8
Producto 2 15 17 9
Producto 3 7 7 8
· La función objetivo representa la utilidad obtenida por cada unidad de producto A,B y C.
· La primera restricción nos indica que el tiempo requerido para los tres productos en la Mesa 1 debe ser
menor a 3300 minutos.
· La segunda restricción establece que el tiempo requerido para los tres productos en la Mesa 2 debe ser
menor a 3500 minutos.
· La tercera restricción nos indica que el tiempo requerido para los tres productos en la Mesa 3 debe ser
menor a 2900 minutos.
SOLUCIÓN
Resolveremos este planteamiento a través del método Simplex. Nuestro primer paso será convertir
nuestro modelo a la forma estándar, agregando variables de holgura en las restricciones donde sea
necesario. El modelo queda de la siguiente manera:
Max. Z = 150 X1 + 210 X2 + 130 X3
10 X1+ 15 X2 + 7 X3+X4= 3300
12 X1 + 17 X2 + 7 X3 +x5 = 3500
8 X1 + 9 X2 + 8 X3+x6 = 2900
Xi >= 0 i=1,6
X1=0
X2=105.4795
X3=243.8656
X4=10.958
Z= 53849.32
INTERPRETACIÓN:
La solución nos indica que para alcanzar la ganancia óptima posible se tendrán que producir 105
unidades del producto B y 243 del producto C, el producto A no debe ser producido. Además
tendremos que en la Mesa 1 habrá un sobrante de 10.958 minutos, y que en la Mesa 2 y 3 se utilizará
el tiempo disponible en su totalidad.
En las tres primeras columnas están los coeficientes de las restricciones, en las
primeras filas, y, en la última, los de la función objetivo. En las tres columnas siguientes
la base canónica, en este caso de tres dimensiones, pues existen tres restricciones.
En la última columna están las constantes que limitan los valores y el valor final de la
función, en la última fila, que comienza con el valor 0.
El algoritmo está definido para maximizar la función, por lo que, si lo que queremos en
minimizarla, la debemos reescribir de manera que se convierta en un problema de
maximización, convirtiendo la función objetivo Z = AX, con las restricciones BX >= C,
en la función Z = CY, con las restricciones BY <= A.
Podemos probar por ejemplo la interpolación lineal para el valor 1.5, que resulta ser
a) La media estadística:
Lo que vamos a hacer es pasar nuestras distribuciones (yi,xi) inicialmente a estudiar si la funcion es
gausiana o normal, para eso se debe cumplir que:
Es decir, y(x)=(1/(2*Math(pi)*Math.Sqrt(desv.cuadraticamedia)))*Math(Exp(-(x-media)* (x-
media)/(2*desv.cuadraticamedia)) -- ya aprenderemos a usar la clase Math ostia.
Si n2<= dataset.lenght*0.955
Si n3<= dataset.lenght*0.997
entonces esta distribución es gausiana.
Es decir, toda distribución que cumpla estos contajes, se ajusta a lo de arriba, y con los parámetros que nos
da nuestra clase o proyecto estadística, podemos ajustar y ya la tenemos.
Otras distribuciones chulas en variable continua:
El siguiente paso, es la determinación de la dependencia funcional entre las dos variables x e y que no son
gaussianas. que mejor ajusta a la distribución bidimensional. Se denomina regresión lineal cuando la función
es lineal, es decir, requiere la determinación de dos parámetros: la pendiente y la ordenada en el origen de la
recta de regresión, y=ax+b.
La regresión nos permite además, determinar el grado de dependencia de las series de valores X e Y,
prediciendo el valor y estimado que se obtendría para un valor x que no esté en la distribución.
Vamos a determinar la ecuación de la recta que mejor ajusta a los datos representados en la
figura. Se denomina error ei a la diferencia yi-y, entre el valor observado yi, y el valor
ajustado y= axi+b, tal como se ve en la figura inferior. El criterio de ajuste se toma como aquél
en el que la desviación cuadrática media sea mínima, es decir, debe de ser mínima la suma. Este
método de minimización, se llama chi-cuadrado, y sigue el teorema de la máxima verosimilitud,
o que el mejor ajuste posible de los coeficientes de la curva lineal o cuadrática, y=ax^2+bx+c es
el que se obtiene de la resolución de un sistema de ecuaciones por el método de la inversa,
obtenidos por esta minimización.
El extremos de una función: máximo o mínimo se obtiene cuando las derivadas de s respecto
de a y de b sean nulas. Lo que da lugar a un sistema de dos ecuaciones con dos incógnitas del
que se despeja a y b.
El coeficiente de correlación es otra técnica de estudiar la distribución bidimensional, que nos
indica la intensidad o grado de dependencia entre las variables X e Y. El coeficiente de
correlación r es un número que se obtiene mediante la fórmula.
Se puede trasformar en
Y=aX+b.
Donde b=log c
Método de los mínimos cuadrados. Polinomio aproximador
Supongamos que hemos medido un conjunto de pares de datos (xi, yi) en una experiencia, por
ejemplo, la posición de un móvil en ciertos instantes de tiempo.
Queremos obtener una función y=f(x) que se ajuste lo mejor posible a los valores
experimentales. Se pueden ensayar muchas funciones, rectas, polinomios, funciones potenciales
o logarítmicas.
La función más sencilla es la función lineal y=ax+b que hemos tratado en la página anterior. El
procedimiento de ajustar los datos experimentales a una línea recta se denomina regresión lineal
Polinomio aproximador
Sea el polinomio
P(x)=a0+a1x+a2x2+...anxn
Se calcula la cantidad
Para obtener los valores de los coeficientes del polinomio aproximador se tienen que determinar
los valores de los coeficientes a0, a1, a2, ...an de forma que la cantidad S tome un valor mínimo.
hagamos las derivadas parciales de S respecto de a0, a1, a2, ...an iguales a cero. Este método de
minimización se llama el chi-cuadrado.
(1)
Obtenemos un sistema de n+1 ecuaciones con n+1 incógnitas, a0, a1, a2, ...an
Ejemplo:
Supongamos que tenemos 4 pares de datos y que queremos ajustarlos al polinomio de segundo
grado y=a0+a1x+a2x2
(3)
Si todos los puntos son distintos, el sistema de ecuaciones tiene una solución única.
Calculo matricial:
Suma de matrices:
elemento a
elemento
3) producto de matrices:
2) matrices especiales:
Desarrollo de determinantes superior a 3x3:
7- Si una fila (o columna) tiene todos sus elementos nulos, el determinante es cero.
9- A⋅ B = A ⋅ B ∀ A, B∈Enxn (K).
Método de gauss-jordan.
A la hora de calcular el valor de un determinante de orden elevado o a la hora de
resolver un sistema de ecuaciones mediante el método de Gauss, por ejemplo, se
realizan sobre las líneas de la matriz o sobre las ecuaciones del sistema una serie de
operaciones que son conocidas con el nombre de operaciones o transformaciones
elementales.
Finalmente, un sistema incompatible, es en el que no existen puntos de corte, es decir, las líneas
viajan en paralelo.
AQUÍ, EN EL TEOREMA DE ROCHÉ, ES DONDE SACAMOS EL RANGO DE LA MATRIZ
AMPLIADA, MATRIZ DE COEFICIENTES, ETC…. Y ASÍ SABEMOS COMO ES EL SISTEMA.
Ejemplo 2
La matriz ampliada del sistema es
Por el teorema de Rouche-Frobenius, como los rangos coinciden pero son menores
que el numero de incognitas, el sistema es compatible indeterminado.
Es decir,
2 Comprobamos si tiene rango mayor o igual que , para ello se tiene que cumplir que al menos un
elemento de la matriz no sea cero y por tanto su determinante no será nulo.
3 Tendrá rango mayor o igual que si existe alguna submatriz cuadrada de orden , tal que su
determinante no sea nulo.
4 Tendrá rango mayor o igual que si existe alguna submatriz cuadrada de orden , tal que su
determinante no sea nulo.
Como todos los determinantes de las submatrices son nulos, tienen rango menor que , por tanto rango=2.
Método de cramer:
Como podemos observar, en este caso la segunda ecuación es una ecuación lineal,
por tanto seguiremos los pasos que vimos en el método de sustitución:
1º. Despejamos una de las incógnitas en la ecuación lineal (ahora no podemos elegir
la que queramos).
2ªecuación: y = 7- x
2º. Sustituimos su valor en la primera ecuación:
3º. Obtenemos una ecuación de segundo grado en una de las incógnitas (en este caso
en x), la desarrollamos y resolvemos utilizando la fórmula conocida:
4º. Por último, como hemos obtenido dos valores de x, sustituimos en la ecuación que
obtuvimos en el primer paso, obteniendo también dos valores de y:
Si x=3, y = 7-3=4
Si x=4, y = 7-3=4
2º. Resolvemos la ecuación que es una ecuación de segundo grado incompleta que
nos da dos soluciones, que luego sustituiríamos en una de las ecuaciones para halla
los valores de x.
3º. Como las raíces nos salen negativas, el sistema no tiene solución.
3º. Como podemos observar, es un sistema del tipo que hemos mencionado en el caso
1, luego lo resolvemos por el método de sustitución. Por el que obtenemos los
siguientes valores:
Si v = 2, u = 3,
Si v = -3, u = -2.
4º. Por último tenemos que deshacer el cambio: x=1/u, y=1/v. Por tanto las soluciones
que obtenemos son: (1/3, 1/2) y (-1/2, -1/3)
donde
Ver solución
Como podemos en en el pdf JAVAFX3D.pdf de javafx, mediante una simple GUI, que mediante scroll bar, mueva un
angulo tecta, y un eje, que puede ser (1,1,1)
ROLL, EL DE LA DIMENSIÓN MAS LARGA COLA CABEZA, PITCH, EL QUE ATRAVIESA DE ALA A ALA, Y LUEGO EL YAW EL
OTRO.
(X2 (X1
Y2 = Rxyz(abc Euler angulos) * Y1
Z2) Z1)
es decir, un punto (x0,y0,z10)=X(0) (3) perteneciente a un solido, tras rotarlo Alpha según x primero, beta
según y luego y gamma según z, es el punto (x2,y2,z2)== X(1) (3) . Se comprueba que la aplicación de n giros,
independientemente del eje que sea, se traduce en un nuevo producto matricial con su angulo de Euler.
( 1 0 0 )
Ejemplo: Rx(a=30) = ( 0 (sqr3)/2 -0.5 )
( 0 0.5 (sqr3)/2 )
Es decir: X (6)(3) (posición de un punto del solido x,y,z tras 6 giros)=Rz2*Rx3*Ry1*Rz1*Rx2*Rx1
(3) primero conforme alpha1 ejex, luego conforme alpha2 otra vez ejex, luego
Es decir, hemos girado X (0)
conforme gamma1 eje z, luego beta1 eje y , luego alfa eje x y luego de nuevo gamma 2 eje z.
Si primero hago una rotación antihoraria de 30 grados en el ejex y luego hago otra de otros 30 en el eje x,
el producto de las 2 matrices = = en resultado a aplicar una única matriz de rotación de 60 grados
antihorarios en el eje x. pero es el producto de las 2 matrices, no la suma. Y así para los 3 angulos de Euler.
2 ejes hace la rotación identidad (subcolumnas de arriba). Igualmente sucede de aplicar Ry subre
uy=(0,1,0) columna.
Ejercicio:
Sea la matriz de rotación R que me transforma el eje cartesiano azul (inicial) en el morado (final), es decir, que me lo
rota.
Calcular los angulos de Euler que producen dicho efecto apartir de la martriz de rotación.
(X2 (X1
Y2 = Rxyz(abc Euler angulos) * Y1
Z2) Z1)
Es decir: Y=AX donde Y y X son vectores, y A una matriz.
2) javaswing con jpanels:
1) Acción de botón: aquí si pulsamos aparece un nuevo jdialog diciendo
Al darle a click derecho, propiedades, es donde le damos nombre a los ítems, y ponemos los
que queramos:
Jtextarea:
Slider:
Y con esto ya:
definimos una variable de tipo int global y:
Fíjate que hemos quitado el evento de botón de capturar. Ahora el status bar:
Menúbar:
Aquí hay que arrastrar los componentes de menú item a la pestaña introducida.
Ahora, igual que cualquiercomponente, se definen sus propiedades y sus eventos.
Dispose(), sabe.
Java Swing escrito: el tutorial.
Crear un Jframe (o pagina.)
Jlabels:
4- buttons:
Un poco mas completo seria: // pongo el label que cargara el png primero, como false, luego creo el botón, y en el
método pulsar, me enciende la imagen en el label o aparece el label. Ojo a label.setBounds, que es quien me da la
posición x e y de la esquina izquierda superior, y luego ya el tamaño.
Veamos las posiciones.
Joption pane:
Para coger una de los 2 estados true or false en una variable o un string:
Fíjate como el orden en que se van mencionando los componentes se van introduciendo.
--- combobox:
Aquí podemos decirlo que en lugar que lo saque por consola:
Label1.setText(comboboxBox.getSelectedItem());
Ojo al
Slider demo:
Radiobutton:
El evento del radiobutton seria:
Checkbox:
** No existe hibridación o paso del javaSwing awt o escrito, al de ventanas o jpanels que
describimos a continuación (como tampoco lo existe a javafx o scenebuilder)
--- menuBar:
Ahora lo mismo para las otras pestañas, y los eventos.
El evento exit es funcional. Load debería lanzar filechooser, y save se implementa a golpe
de atajo de teclado. El a programado nemotécnicos a atajos de teclado, pero no, lo esta
haciendo para que el comportamiento sea real.
Como poner el file chooser en Swing.
configuracion mariadb acceso clientes remotos
Por defecto, el valor asignado es 127.0.0.1.Esto significa que el servidor permitirá únicamente
conexiones locales. tienes que cambiar esta directiva a 0.0.0.0:
lc-messages-dir = /usr/share/mysql
skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 0.0.0.0
Y luego:
Ya entra a mariadb y raspberry por pep/beberagu y jose 9876 mariadb has quitado muchas
medidas de seguridad para acceso a ddbb del servidor y la ddbb general maríadb instalada
para el acceso remoto por javafx.
2) hemos de crear al usuario [email protected]> en nuestra base de datos mysql para que
este pueda acceder. Esto es importante.
No es lo mismo el usuario jose@localhost que [email protected] que es el que va a entrar en
el servidor 192.168.1.234 pero desde el 192.168.1.250. hasta que no hagas eso, no podras entrar
desde tu aplicación java.
Además, si sustituyes esto por jose@% estas creando un usuario que tiene acceso desde
cualquier ip remota.
CREATE USER 'juanf'@'%' IDENTIFIED BY 'B4antior'; // creamos un usuario que tiene acceso desde
cualquier ip
Ahora aqui podriamos empezar a explicar un poco sobre la estructura del lenguaje sql, consultas y
queries y tal, pero no perdamos el hilo que lo que estamos explicando es la configuración del
servidor para permitir acceso externo.
3) comprobación que el Puerto de escucha de mysql/mariadb es el 3306 y abrir el cortafuegos
para así permitirlo.
configurando Firewall #
Iptables #
Se puede hacer con mysqlworkbench o con alguna aplicación móvil instalada en bluestacks en
nuestra maquina local:
Yo descargue DBCliente
También figura la base de datos con la que queremos hacer conexión. Le damos al botón testea
conexión, y me dice desde mi red local ip/ethernet o wifi si puedo acceder o no. Desde el móvil,
desde luego, no voy a poder acceder, pq no tiene ip 192.168.1.250, entonces para el usuario
arriba definido, no puedo entrar seguro, pero al instalarla en el pc, sin problema. Asi veo si hay
conexión con servidor mysql, veo las tablas de dicha database, las queries, aquí puedo cambiar
parámetros de la conexión para enlace hasta nueva database, etc…
◼ AHORA SI: LENGUAJE SQL: maríadb usa ; sino la introduces en un renglón, luego
puedes.
Usuarios: privilegios:
Existen diferentes tipos de privilegios que podemos asignar a los usuarios de un SGBD con
MySQL/MariaDB. A continuación se detallan todos ellos y que hace cada uno de ellos:
• ALL PRIVILEGES: Como vimos antes, esto le otorgaría a un usuario de MySQL acceso completo a una
base de datos designada (o si no se selecciona ninguna base de datos, acceso global a todo el
sistema)
• CREATE: Permite crear nuevas tablas o bases de datos
• DROP: Permite eliminar tablas o bases de datos
• DELETE: Permite eliminar filas de las tablas
• INSERT: Permite insertar filas en las tablas
• SELECT: Les permite usar el comando SELECT para leer las bases de datos
• UPDATE: Permite actualizar las filas de las tablas
• GRANT OPTION: Permite otorgar o eliminar privilegios de otros usuarios
Si queremos conceder todos los privilegios al usuario "antonio" y en la base de datos "test",
ejecutaremos:
Volvemos a mostrar la lista de privilegios del usuario y vemos que ahora aparecen nuevos
privilegios sobre la base de datos "test":
+
+
| GRANT USAGE ON *.* TO `antonio`@`localhost` IDENTIFIED BY PASSWORD '*E31BAC86033F438E42D17F5D
F3815C36C657D253' |
| GRANT ALL PRIVILEGES ON `test`.* TO `antonio`@`localhost`
+
+
2 rows in set (0.001 sec)
Si queremos conceder permisos de insertar, actualizar, borrar y listar al usuario "antonio" en la base de
datos "gestco", ejecutaremos:
MariaDB [(none)]> GRANT INSERT,UPDATE,DELETE,SELECT ON gestco.* TO 'antonio'@'localhost';
Query OK, 0 rows affected (0.029 sec)
ALTER TABLE Customers ADD Email varchar(255); //añadimos columna email tipo
barachar a la tabla customers.
ALTER TABLE Customers DROP COLUMN Email;
Queries: este lenguaje de consulta es comun para todos los motores de búsqueda: mysql, Oracle,
mariadb, postgre, sqlmicrosoft.
SQL NO distinguen entíe mayúsculas y minúsculas: En este tutoíial encontíaíás todos los comandos SQLen
mayúsculas. Algunos lenguajes sql teíminan con ; punto y coma paía finalizaí instíucción. Este es el caso de
maíiadb.
Las exploramos solo con tocar sus pestañas, es decir, atraves de gui. Podemos ver hasta sus columnas, es decir, su
estructura de campos.
Ahora vamos a verlas. Para crear una consulta en mysql workbench, hemos de señalar o subrayar el código a
ejecutar: si están así en azul, y las ejecutamos, obtenemos respuesta. Si están en blanco, haz lo que quieras que no.
Eso sirve para regular el flujo de los scripts que quieres ir ejecutando. Pero existe un atajo de teclado sin seleccionar:
CRTL+BLOQ MAYUS+ENTER
Señalando una línea o script borras lo que deseas, y si el script es erroneo, o si seleccionas los anteriores
verdes que eran validos, también desaparecen del lienzo, y tienes que volver a ejecutarlos. Es un flujo.
Recuerda, select * from table order by id para ver elementos por id.
Botones importantes:
El clear de abajo, es para no ver el historial de scripting acertado o fallido, y el refresh del costado, es para ver los
cambios en el servidor.
Ahora nos faltaría crear la tabla relacional, pues entre película y director hay una relación de muchos a muchos, 1
pelicula puede tener muchos actores, y un actor puede trabajar en muchas películas, entonces vamos a crear una
tabla intermedia, llamada actores películas. A lo que queremos llegar es a este esquema.
Con las tabla ya creada por scripting, tras refresco, vamos a ingeniería reversa, y es donde vemos el
esquema anterior via next, next, selección mi ddbb, next, next, y asi sacamos este esquema.
Otro ejemplo: sea el siguiente diagrama de flujo del modelo relacional de la ddbb.
Queremos una base de datos, relacional en que un cliente compra productos, que son suministrados por un
proveedor. Obvio el elemento común es el producto. Hay 2 acciones, una que es entrada en el almacen o suministro
por nuestro proveedor, y otro que es la salida hacia el cliente.
Entre clientes y productos: muchos clientes pueden comprar muchos productos o mucho productos
pueden pertenecer a muchos clientes. Sin embargo, un producto, id único, es suministrado por un único
proveedor.
Venimos a la sección de aquí abajo, y cogemos a los vinculadores:
Le pincho al vinculador, le pincho a una tabla, y a la otra y mágicamente, se genera la tabla intermedia.
La cual vamos a llamar compras. Veamos sus claves foráneas.
Ahora ya, le doy al rayito de arriba, y me ejecuta todo es script, y me crea la ddbb
relacional. Vemos que esta todo ok.
arriba señalado el refresco.
Bien, vamos a ver como exportar e importar ddbb a servidores:
La web por defecto de Apache reside en /var/www/html/, por lo que esta será la ruta
donde descomprimiremos el paquete:
Usaremos el cliente de consola mysql para crear el usuario que manejará esta base de
datos:
~$ mysql -u root -p
Para MariaDB o MySQL 5, creamos el usuario como de costumbre:
> exit
Como los pasos 2 y 3 ya los teníamos antes hechos, y la tabla usuarios existe, vamos a usar el
usuario.
[email protected] B3antior que es el que tiene permisos de acceso a tabla para hacer esto.
// Tambien hic el del usuario [email protected] y jamás pude entrar por mobaxterm.
Para inicializar la base de datos necesaria utilizaremos desde consola un archivo SQL
previsto al efecto:
Y arriba en
~$ mysql -u root -p
CREATE DATABASE compra; + exit.
Hmmmmm el nombre debe ser una palabra sin guiones. No me acepto compra-venta.
Bien, ahora queremos dar respuesta a la siguiente pregunta: ¿Qué es ese tipo de conector línea
continua o discontinua de tablas?¿cuando hay que generar tablas intermedias y cuando no?--- es
decir teoría de mysql.
Concepto de clave foránea: La clave foránea identifica una columna o grupo de columnas en una tabla
(tabla hija o referendo) que se refiere a una columna o grupo de columnas en otra tabla (tabla maestra o
referenciada). Las columnas en la tabla referendo deben ser la clave primaria u otra clave candidata en la
tabla referenciada.
La discontinua es solo si la clave foranea no es principal en la otra, por ejemplo, con estas tablas.
USUARIOS
id INT PK
nombre VARCHAR(20)
localidad INT FK
LOCALIDADES
id INT PK
nombre
Localidad VARCHAR(10)NN
usuarios.localidad y localidades.id estarian unidas por una discontinua, porque localidad es FK a id.
Se genera la table intermedia compra muchos a muchos relacional que relaciona 2 pk, por tanto, ok,
pero la tabla suministra es de 1 a muchos, y liga
Tablas de muchos a muchos, necesitamos una tabla intermedia, trazo continuo que liga sus claves
floráneas o rosas con las pk de ambas tablas que conecta. ,
To delete a column in a table, use the following syntax (notice that some database
systems don't allow deleting a column):
UPDATE Syntax
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Note: Be careful when updating records in a table! Notice the WHERE clause in
the UPDATE statement. The WHERE clause specifies which record(s) that should be updated. If
you omit the WHERE clause, all records in the table will be updated!
DELETE Syntax
DELETE FROM table_name WHERE condition;
Note: Be careful when deleting records in a table! Notice the WHERE clause in
the DELETE statement. The WHERE clause specifies which record(s) should be deleted. If you
omit the WHERE clause, all records in the table will be deleted!
ALTER TABLE - ADD Column (Tambien Servia para borrar columna, recuerda)
Example
ALTER TABLE Customers
ADD Email varchar(255);
COUNT() function returns the number of rows that matches a specified criterion.
COUNT() Syntax
SELECT COUNT(column_name)
FROM table_name
WHERE condition;
AVG() Syntax
SELECT AVG(column_name)
FROM table_name
WHERE condition;
SUM() Syntax
SELECT SUM(column_name)
FROM table_name
WHERE condition;
The MIN() function returns the smallest value of the selected column.
The MAX() function returns the largest value of the selected column.
MIN() Syntax
SELECT MIN(column_name)
FROM table_name
WHERE condition;
MAX() Syntax
SELECT MAX(column_name)
FROM table_name
WHERE condition;
There are two wildcards often used in conjunction with the LIKE operator:
Note: MS Access uses an asterisk (*) instead of the percent sign (%), and a question
mark (?) instead of the underscore (_).
The percent sign and the underscore can also be used in combinations!
LIKE Syntax
SELECT column1, column2, ...
FROM table_name
WHERE columnN LIKE pattata;
Tip: You can also combine any number of conditions using AND or OR operators.
Here are some examples showing different LIKE operators with '%' and '_' wildcards:
Operadores:
Los de arriba son la forma compuestos a esto y que muestran igualdad true or false.
Arriba una big table, abajo 2 tablas ligadas que equivalen a una bigtable. Al final, la estructura de tablas
ligadas anterior, equivale a una gran tabla.
Teorema de la equivalencia de las tablas ligadas a una gran tabla le llamaremos a esto.
Sin embargo, es muy desventajoso tener la base de datos como una única gran tabla, y es muy ventajoso
tenerla segmentada en varias tablas por varias razones.
1) A la hora de inserción de datos, no tenemos pej que decir que marco Alcañiz va a hacer un nuevo
curso de tantas horas en una localidad dada, definiendo de nuevo todos los datos de este idDni o
usuario. Es un ahorro considerable de memoria en la ddbb y de tiempo en la inserción de datos.
2) Reduce la probabilidad de reducir errores en la inserción de datos.
3) ¿es ventajoso en las busquedas? Si, pq yo puedo introducir un dni que es campo común, y tener 2
pestañas una que me indique la información relativa a los cursos, si es eso lo que me importa, o la
información personal de este alumno, sin que me salga todo el churro duplicado, información
personal todo el rato, si lo que me importa son los cursos realizados, y viceversa, si lo que quiero
son los datos de contacto del alumno, ni lo tengo que ver mas veces repetido, ni me tiene que
explicar todos los cursos, si es algo que no me interesa. es decir… hace búsquedas mas selectivas.
1) Nos descargamos de H2.org database, la versión 1.4 del motor h2, tras extraer y tal, lo colocamos en
proyectos netbeans. Tiene la forma:
Entramos en bin:
Y ahí o lanzamos el script h2.bat que me construya el h2 server embeded o lanzamos el conector/interfaz h2-1.4
Así tal como esta, lo que me indica, es que hay una ddbb embebida en C:/Users/juanf llamada test.mv.db
A la que se entra con usuario sa y sin contraseña por defecto. Esta estructura esta embebida en la dirección de
arriba, pero no se llama por navegador, solo por el *.jar.
Bueno, si entramos:
Podemos crear la tabla con los parámetros deseados, que se unirá junto con la tabla users de la derecha.
Cogemos este archivo, click derecho botón copia, y pegar en el proyecto netbeans donde vayamos a crear la
ddbb portable o embebida, en este caso, H2 proyect.
Y lo ponemos en el directorio raíz. El h2-1.4 jar no hace falta realmente. Ahora, vamos a nuestro proyecto de
netbeans de DAO. Realmente, todos los proyecto de netbeans de escritura, lectura, actualización, borrado y
filtrado de bases de datos, son iguales. Solo cambia el conector, es decir, el programa java o métodos son
genéricos, y la forma del conector es lo que cambia. Ver que es el mismo programa para mysql que para H2
database. Así pues, cogemos el FXML de MYsql o DAO programa, y hacemos copia y pega en el nuevo proyecto,
make controler, y cogemos el Controlador de dicho fxml y le pegamos el código encima:
Eso significa que tenemos la base de datos, con la tabla de la forma estipulada arriba, en la raíz de nuestro
proyecto netbeans, y pues nada, compilar y funcionar.
V8
Este ejemplo ilustra la inserción de valores de fecha y hora con desplazamientos de zona horaria
en TIMESTAMP y DATETIMEcolumnas usando diferentes time_zone configuraciones y luego
recuperándolos:
El DATE tipo se utiliza para valores con una parte de fecha pero sin parte de hora. MySQL recupera y
muestra DATE valores en formato. El rango admitido es de . 'YYYY-MM-DD''1000-01-01''9999-12-31'
El DATETIME tipo se utiliza para valores que contienen partes de fecha y hora. MySQL recupera y
muestra DATETIME valores en formato. El rango admitido es de . 'YYYY-MM-DD hh:mm:ss''1000-01-01
00:00:00''9999-12-31 23:59:59'
El TIMESTAMP tipo de datos se utiliza para valores que contienen partes de fecha y hora. TIMESTAMP
tiene un rango de '1970-01-01 00:00:01'UTC a '2038-01-19 03:14:07'UTC.
MySQL convierte TIMESTAMP los valores de la zona horaria actual a UTC para el almacenamiento y de
vuelta de UTC a la zona horaria actual para la recuperación. (Esto no ocurre con otros tipos
como DATETIME.) De forma predeterminada, la zona horaria actual para cada conexión es la hora del
servidor. La zona horaria se puede configurar por conexión. Siempre que la configuración de la zona
horaria permanezca constante, obtendrá el mismo valor que almacenó. Si almacena un TIMESTAMP valor
y luego cambia la zona horaria y recupera el valor, el valor recuperado es diferente del valor que
almacenó. Esto ocurre porque no se utilizó la misma zona horaria para la conversión en ambas
direcciones. La zona horaria actual está disponible como el valor de la time_zone variable del
sistema. Para obtener más información, consulte la Sección 5.1.15, “Compatibilidad con la zona horaria del
servidor MySQL” .
En MySQL 8.0.22 y versiones posteriores, puede convertir TIMESTAMP valores a valores UTC DATETIME
al recuperarlos CAST()con el AT TIME ZONE operador, como se muestra aquí:
Otro ejemplo:
La manera en que hacemos un registro en la hora y fecha actual es la siguiente. Mira el id de abajo como
la hemos insertado.