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 - K-YreX

#111
Si tu objetivo es aprender un lenguaje en profundidad lo mejor es que primero tengas claros tus objetivos. Prácticamente todos los lenguajes sirven para prácticamente todo pero en muchas ocasiones hay un lenguaje que resalta sobre el resto para una tarea específica.

Sobre API Rest no tengo conocimientos por lo que no puedo decir nada pero sobre POO está claro que es uno de los paradigmas de programación más utilizados, sino el más. Al final el mundo en general no se representa con variables sueltas sin más sino que todo son objetos, cada objeto tiene sus características y sus comportamientos y la POO justo define eso.

En cuanto a lenguajes: es cierto que .NET y Java son de los lenguajes más demandados y más completos que existen. Además ambos permiten programar mediante POO y a mi parecer tienen una buena curva de aprendizaje. En cambio de poco te sirven si lo que quieres es programador controladores o servicios del sistema por ejemplo, para esta tarea siempre será mucho mejor aprender C. Por eso digo que lo importante es que primero definas tus propósitos (sistemas operativos, juegos, análisis estadístico, desarrollo móvil (Android, iOS), ...) y cuando lo tengas te será muy fácil elegir el lenguaje más adecuado para ello (C, C++, Python, R, Java, Kotlin, Swift, Flutter,...) sin olvidar toda la parte de web (PHP, diversos frameworks en los que no estoy al día...) o las bases de datos (SQL).

Y si no tienes muy claro lo que hacer o estás dando tus primeros pasos Java y .NET (C#) creo que son dos de las mejores opciones para empezar porque como ya he dicho son lenguajes muy completos y que permiten hacer muchas cosas. Hay gente que prefiere empezar con lenguajes más sencillos como Python pero en mi opinión estos lenguajes enmascaran demasiado la programación. Si aprendes un lenguaje como Java, C# o similares te será más sencillo dar el paso a Python y similares, que al contrario.

Mucha suerte y recuerda que puedes probar todos los que te causen curiosidad y quedarte al final con el/los que más te guste/n.
#112
Java / Re: [JAXB] Generar xsd mediante schemagen
22 Diciembre 2020, 01:17 AM
Cita de: rub'n en 21 Diciembre 2020, 18:02 PM
que tal doc? que es la que hay?

quitale el
Código (java) [Seleccionar]
@XmlRootElement a las superclases y avisa que tal... o sea a la superclase Vehiculo
He probado el cambio que comentas y el resultado sigue sin ser satisfactorio. El error que aparecía sigue apareciendo y además ahora tampoco aparece el elemento Vehiculo en el xsd.
El resultado es el siguiente:
Código (xml) [Seleccionar]

  <xs:element name="Furgoneta" type="furgoneta"/>

  <xs:element name="Vehiculos" type="conjuntoVehiculos"/>

  <xs:complexType name="conjuntoVehiculos">
    <xs:sequence>
        <xs:element ref="Furgoneta" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <!-- ... -->
#113
Tal y como dices, los diagramas uml se asemejan bastante a las clases cuando hablamos de POO, sin embargo; que aparezcan relaciones no significa que hagan referencia a bases de datos. Las relaciones son necesarias también para saber cómo interactúan unas clases con otras y además existen pequeños detalles que se pueden apreciar en la implementación.

Te pongo un ejemplo donde creo que se puede ver bien:
Imagina que estás creando una aplicación para un banco donde entre otras muchas cosas tienes una clase Cliente y otra clase Cuenta. Según cómo definas la relación entre ambas clases tendrás una estructura u otra.
  • Según la cardinalidad: Definimos si hace falta utilizar una colección de datos (array u otras) para relacionar los datos. Por ejemplo: "Un cliente puede tener una o más cuentas pero una cuenta solo puede ser de un cliente" esto suena a diagrama entidad-relación de bases de datos pero también se aplica a las clases de tu programa. Las clases de tu aplicación quedarían así:

    class Cuenta {
      string numeroCuenta;
      Cliente propietario;
      //...
    }

    class Cliente {
      string nombre;
      Array<Cuenta> cuentas;
      //...
    }


  • Según la dirección: La dirección de la relación indica qué clase conoce (y puede acceder) a las instancias de la otra. Aunque en UML se suelen usar relaciones bidireccionales (sin punta de flecha), también se pueden hacer unidireccionales. Por ejemplo imagina la relación anterior Cliente-Cuenta pero en este caso unidireccional: Cliente -> Cuenta (solo el cliente conoce sus cuentas entonces desde un cliente puedes acceder a sus cuentas pero desde una cuenta no puedes acceder a su propietario) Esto en tus clases se representaría así:

    class Cuenta {
      string numeroCuenta;
    }

    class Cliente {
      string nombre;
      Array<Cuenta> cuentas;
    }


    Mediante UML se puede llegar a un nivel de precisión muy alto aunque no está muy estandarizado. Sí que existen algunos estándares a seguir pero a la hora de la verdad cada uno utiliza los elementos que cree convenientes para representar la información.
    Hace un año tuve que preparar unas cosas mediante UML y me costó mucho trabajo encontrar algo de información en claro así que al final acabé leyendo por encima la guía "UML 2 Certification Guide Fundamental & Intermediate Exams (Tim Weilkiens y Bernd Oestereich)" y más o menos pude apañarme aunque es muy extensa pues está preparada precisamente para los exámenes de certificación en UML.

    Yo creo que al final UML está ahí como un modelo teórico para representar las ideas de forma rápida y más o menos común para que todo el que conozca UML pueda entenderlo pero al final cada empresa o grupo de trabajo se crea sus propias anotaciones para entenderse. Mientras tanto emisor como receptor entiendan el diagrama, queda muy abierto a posibilidades.
#114
Java / Re: [JAXB] Generar xsd mediante schemagen
19 Diciembre 2020, 13:47 PM
Fichero ConjuntoVehiculos.java
Código (java) [Seleccionar]

@XmlRootElement(name = "vehiculos")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConjuntoVehiculos {
  @XmlElementRefs({
    @XmlElementRef(name = "Vehiculo", type = Vehiculo.class),
    @XmlElementRef(name = "Coche", type = Coche.class),
    @XmlElementRef(name = "Furgoneta", type = Furgoneta.class)
  })
  private ArrayList<Vehiculo> vehiculos;
  //...
}


Fichero Vehiculo.java
Código (java) [Seleccionar]

@XmlRootElement(name = "Vehiculo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Vehiculo implements Serializable {
  //...
}


Fichero Coche.java
Código (java) [Seleccionar]

@XmlRootElement(name = "Coche")
@XmlAccessorType(XmlAccessType.FIELD)
public class Coche extends Vehiculo {
  //...
}


Fichero Furgoneta.java
Código (java) [Seleccionar]

@XmlRootElement(name = "Furgoneta")
@XmlAccessorType(XmlAccessType.FIELD)
public class Furgoneta extends Vehiculo {
  //...
}


Y el schema xsd que quiero obtener es:
Código (xml) [Seleccionar]

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Coche" type="coche"/>

  <xs:element name="Furgoneta" type="furgoneta"/>

  <xs:element name="Vehiculo" type="vehiculo"/>

  <xs:element name="Vehiculos" type="conjuntoVehiculos"/>

  <xs:complexType name="conjuntoVehiculos">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="Vehiculo"/>
        <xs:element ref="Coche"/>
        <xs:element ref="Furgoneta"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="vehiculo"><!-- ... --></xs:complexType>
 
  <xs:complexType name="coche"><!-- ... --></xs:complexType>

  <xs:complexType name="furgoneta"><!-- ... --></xs:complexType>
</xs:schema>


Pero como no reconoce la clase Coche.class, me genera el siguiente xsd:
Código (xml) [Seleccionar]

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Furgoneta" type="furgoneta"/>

  <xs:element name="Vehiculo" type="vehiculo"/>

  <xs:element name="Vehiculos" type="conjuntoVehiculos"/>

  <xs:complexType name="conjuntoVehiculos">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="Vehiculo"/>
        <xs:element ref="Furgoneta"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="vehiculo"><!-- ... --></xs:complexType>

  <xs:complexType name="furgoneta"><!-- ... --></xs:complexType>
</xs:schema>
#115
Java / Re: [JAXB] Generar xsd mediante schemagen
19 Diciembre 2020, 00:50 AM
Cita de: rub'n en 18 Diciembre 2020, 19:54 PM
El el mismo directorio cual? original del proyecto? o en otra carpeta ?
Para simplificarlo y no tener que lidiar con los paquetes originales del proyecto lo que hice fue copiar todos los .java en un directorio llamémoslo CodigoFuente/ y modifiqué la sentencia package y los imports de los .java (es decir, los eliminé). El directorio en el que estaba trabajando tenía la siguiente estructura:

CodigoFuente/
|_ ConjuntoVehiculos.java
|_ Vehiculo.java
|_ Coche.java
|_ Furgoneta.java

Entonces desde línea de comandos al ejecutar

C:\...\CodigoFuente>schemagen -d . -cp *.java -encoding utf-8

me generaba el fichero schema1.xsd en el directorio CodigoFuente/ pero salía en el cmd el error que cité en el otro mensaje de que no se reconocía el símbolo Coche.class y en el xsd me incluía correctamente todas las clases (como xs:element) menos la clase Coche que no aparecía.
Lo que me parece raro pues la clase Coche.java tiene prácticamente la misma estructura que Furgoneta.java (solo cambia algún atributo) y las anotaciones de ambas clases también son iguales. Me dio que pensar que quizás al pasar como argumento *.java se estuviesen compilando los ficheros en este orden:
1. Vehiculo.java -> Vehiculo.class
2. Furgoneta.java -> Furgoneta.class
3. ConjuntoVehiculos.java -> ConjuntoVehiculos.class
4. Coche.java -> Coche.class
Y quizás por eso al compilar ConjuntoVehiculos.java no se reconoce el símbolo Coche.class (porque todavía no existe).

Cita de: rub'n en 18 Diciembre 2020, 19:54 PM
Tal cual doc asi mismo, es, cuando compila los .java estos pasan a ser .class que sera usados luego para crear los .xsd
Respecto a esto, noté que aunque schemagen compile los .java en .class, estos no aparecen en el directorio en el que se está trabajando (CodigoFuente/ en este supuesto). Por eso intenté compilarlos yo y tras varios intentos vi que la única forma en que funcionaba es teniendo todos los ficheros compilados ya y pasar a schemagen únicamente el .java que contiene a los demás. Es decir, teniendo:

CodigoFuente/
|_ ConjuntoVehiculos.java
|_ ConjuntoVehiculos.class
|_ Vehiculo.java
|_ Vehiculo.class
|_ Coche.java
|_ Coche.class
|_ Furgoneta.java
|_ Furgoneta.class

Y ejecutando:
C:\...\CodigoFuente>schemagen -d . -cp ConjuntoVehiculos.java -encoding utf-8
Por lo tanto no entiendo cuándo es necesario compilar los .java a .class antes de ejecutar schemagen y qué argumentos hay que pasarle a schemagen con la opción -cp. :huh:

PD: Gracias por responder. Siendo un tema tan raro ya pensaba que no iba a tener respuestas.  :-X
#116
Java / [JAXB] Generar xsd mediante schemagen
18 Diciembre 2020, 12:53 PM
He tenido problemas para generar un schema xsd a partir de unas clases .java mediante el comando schemagen.

Tenía las siguientes clases (todas ellas en el mismo directorio . para simplificar):

ConjuntoVehiculos
Vehiculo
Furgoneta extends Vehiculo
Coche extends Vehiculo

Entonces al ejecutar:
schemagen -d . -cp *.java -encoding utf-8
Se me generaba el schema xsd pero me aparecía el siguiente mensaje y no se incluía el elemento Coche en el schema.
Citar
ConjuntoVehiculos.java:14: error: cannot find symbol
                        @XmlElementRef(name = "Coche", type = Coche.class),
                                                                                             ^
    symbol:   class Coche
    location: class ConjuntoVehiculos
Esa anotación @XmlElementRef la tengo junto a otras dos que hacen referencia a Vehiculo y Furgoneta y estas otras no producen ningún problema. He comprobado los nombres y está todo bien escrito.

He hecho varias pruebas incluyendo los ficheros .java uno por uno y compilándolos primero (aunque por lo que he visto, schemagen debe llamar internamente a javac para compilar los ficheros fuente) pero obtenía más errores y no me generaba el schema.

Al final después de mucho probar me ha dado por compilar los ficheros .java (en el mismo directorio) y ejecutar:
schemagen -d . -cp . ConjuntoVehiculos.java -encoding utf-8
Con esto sí he conseguido generar el schema correctamente, sin errores e incluyendo todos los elementos pero no entiendo por qué ha funcionado. Es decir, no entiendo cómo funciona schemagen. He buscado en muchas webs y en todas aparece un ejemplo sencillo que funciona con el primer comando que he probado y no se explica nada más.

Espero que alguien conozca esta herramienta y pueda ayudarme. :-X

PD: Estoy utilizando schemagen 3.0.0 (recientemente descargado junto con las otras herramientas de JAXB).
#117
Me parece un poco pretencioso, no crees? Y lo digo desde la crítica constructiva, no se me malentienda.
Cita de: cer0_hacker en 15 Diciembre 2020, 09:37 AM
Para todo aquel que le interese conocer a fondo como manejar y dominar el sistema operativo LINUX,
He entrado a ver los vídeos para conocer a fondo Linux y solo he visto un poco de introducción, una instalación (en máquina virtual) y varios comandos básicos de consola.

Cita de: cer0_hacker en 15 Diciembre 2020, 09:37 AM
les dejo este curso completisimo y GRATIS.
No puede ser un curso muy completo cuando se llama "Dominar Linux y su Consola" y de 7 vídeos que tiene el curso y una duración de ~1 hora, solo 3 de ellos (~30 minutos) tratan realmente sobre la consola y muestran comandos muy sencillos y básicos.

Un nombre más correcto me parece: Introducción a GNU/Linux.
No estoy diciendo que el curso sea malo. Pero el título debería ser acorde a sus contenidos y una explicación de lo que es GNU/Linux, una introducción a sus características y varios comandos básicos me parece demasiado presuntuoso como para decir que tras ver esos vídeos ya domino Linux a fondo.
El clickbait está muy bien para conseguir que entre más gente al curso pero no va a conseguir que se queden. Hay que ser fieles a la realidad y ese curso no es (al menos de momento) para personas con conocimientos avanzados de Linux sino para gente que está empezando. Habrá quienes estén empezando y no entren porque el título les parezca demasiado avanzado y otros que tengan más nivel, entren y no se queden porque los contenidos no son lo que el título promete.

Suerte  :-X
#118
Windows / Re: Optimizar windows 10
15 Diciembre 2020, 12:24 PM
Para equipos tan limitados yo siempre he recomendado distribuciones GNU/Linux. Aunque hayas cambiado el disco duro por un SSD lo cual se notará (aunque 120 GB tampoco dan para mucho), 2 GB de RAM me parecen muy muy limitados para un Windows 10.
Claro está que es importante conocer el uso que se le va a dar al ordenador pero siendo tan antiguo no creo que se vaya a usar para edición de vídeos o cosas por el estilo. Si el uso que se le va a dar es el típico de cualquier usuario promedio (internet, editor de texto, reproductor multimedia,...) un sistema Linux cumplirá mucho mejor que Windows.

Si por lo que sea quieres o necesitas seguir utilizando Windows, no puedo ayudarte porque desconozco como optimizarlo pero sí te digo que yo he instalado Linux en sistemas con más recursos que ese y el cambio ha sido muy satisfactorio.

Suerte  :-X
#119
Tienes que concretar un poco más en lo que necesitas. No se sabe dónde o para qué tienes que agregar una fecha límite.

Aparte te eso, algunas recomendaciones:
  • No utilizar variables globales (opc). No la necesitas para nada fuera del main() y aunque así fuese, para eso existen los parámetros en las funciones: para pasar las variables entre ellas.

  • Utilizar constantes para dar un nombre a los valores que hay sueltos por el programa. Por ejemplo:

    #define SIZE_NOMBRE 30
    #define SIZE_CADENA 100
    #define SLEEP_TIME 3
    //...

    Y así puedes cambiar los valores en un único sitio (al principio del programa) y que se modifique en todos los sitios donde se usa.

  • Poner hasta 2 instrucciones en una línea se puede llegar a dar de paso si es algo muy sistemático y sencillo de ver. Mezclar 3 o más instrucciones dificulta bastante su lectura (línea 61).

  • Utilizas muchas funciones diferentes para lo mismo. Para leer cadenas de texto (char[]) utiliza siempre fgets() ya sea desde un fichero o desde la entrada estándar. Lo único que tienes que cambiar es el último argumento con el nombre del fichero o con stdin para referirte a la entrada estándar.

    char nombreBloc[SIZE_NOMBRE];
    printf("Introduce el nombre del bloc: ");
    fgets(nombreBloc, SIZE_NOMBRE, stdin);

    Si utilizas scanf(), tal y como haces, el programa fallará si introduces un número de caracteres mayor a la longitud máxima permitida. Con fgets() evitas esta situación.

  • Relacionado con lo anterior, fflush(stdin) no es una forma correcta de usar la función fflush(). Esta fue diseñada para limpiar el buffer de salida (stdout), no el de entrada (stdin). Su comportamiento no está definido. Una forma de limpiar el buffer es utilizar getchar() que coge un caracter del buffer.
    Seguido al ejemplo anterior de fgets(), si justo después incluyes estas líneas conseguirás, por una parte eliminar el salto de línea final de la cadena y por otra dejar el buffer limpio.

    fgets(nombreBloc, SIZE_NOMBRE, stdin);
    if(nombreBloc[strlen(nombreBloc) - 1] == '\n') nombreBloc[strlen(nombreBloc) - 1] = '\0'; // si el salto de linea esta al final, lo sustituyes por el fin de cadena y ya sabes que no queda nada en el buffer
    else while(getchar() != '\n'); // si queda algo en el buffer (el salto de linea o caracteres que no cabian), entonces lo limpias

    Igual que con la lectura de cadenas, no sigues un patrón claro de limpieza. A veces llamas a fflush(), otras veces no... Y luego está la función setbuf() que no sé si sabes exactamente lo que hace ya que es la primera vez que la veo en unos cuantos años.

  • feof() no debe utilizarse como condición de parada en la lectura de ficheros. Utiliza directamente el valor que devuelve fgets().

    while(fgets(cadena, SIZE_CADENA, fichero))
      printf("%s", cadena);


  • Por otro lado, en las dos últimas funciones compruebas si el fichero se ha abierto correctamente pero en la primera no. Qué pasa si no se puede crear el fichero?

  • Y en la última función, en vez de hacer la comprobación con un while() (que en la primera iteración no tienes nada en <cadena>), utiliza un do-while() que primero ejecuta el interior y después hace la comprobación.

    // Esto puede ir como constante global o dentro de la propia funcion
    const char CADENA_FIN[] = "FIN";

    char cadena[SIZE_CADENA];
    int continuar;
    do {
      printf("Introduce una cadena: ");
      fgets(cadena, SIZE_CADENA, stdin);
      // Como he dicho antes, eliminas el salto de linea y limpias el buffer
      if(cadena[strlen(cadena) - 1] == '\n') cadena[strlen(cadena) - 1] = '\0';
      else while(getchar() != '\n');
      // Ahora comparas la cadena
      continuar = (strcmp(cadena, CADENA_FIN)); // Guardara 0 (que equivale a false) si son iguales y 1 o -1 (que equivale a true por ser distinto de 0) en otro caso. Asi no haces la comparacion 2 veces
      if(continuar){
        // No veo ninguna ventaja de usar fputs() en vez de fprintf()
        fprintf(fichero, "%s\n", cadena);
      }
    } while(continuar);


    Dicho todo esto, espero que apliques los consejos aunque lo hagas a tu manera. Y especifica con más detalle el problema que tienes para poder ayudarte.


    PD: Permíteme hacer esta mención:
    Cita de: Xlajenafroxdro en 15 Diciembre 2020, 06:45 AM
    Estoy igual ojala alguien ayude
    Fíjate en la diferencia. Alex1209 ha abierto un tema con un poco de formalidad y siguiendo las normas y ha tenido más ayuda ya que si hubiese abierto x temas con títulos para nada descriptivos, sin aportar nada y solo pidiendo que le hagan la tarea. Y no ha tenido que pedir que sean serios... :silbar: :silbar:
#120
Cita de: Xlajenafroxdro en 14 Diciembre 2020, 21:49 PM
Hacer un programa que obtenga el producto de varios números positivos, el programa termina al introducir un número negativo.

Alguna persona que no se burle y que pueda hacer eso se lo agradecería muchooo
Pides demasiado.
Me parece que te vas a tener que salvar las vacaciones tú solito... :silbar: :silbar:
Ah y si te sobra tiempo, siempre puedes leerte las reglas del foro donde dice claramente que no se hacen tareas.
Para que no pierdas tu valioso tiempo buscándolas: https://foro.elhacker.net/programacion_cc/reglas_del_subforo-t251603.0.html

Dicho esto, tema cerrado.