Aprender a programar - Recomendaciones

@TheReeler ya solo por la curiosidad. ¿Por qué no funciona lo de NB-IoT en Azure? Sin tener ni idea de cómo funciona eso, ojo.


Aquí aparece nombrado: Narrowband or NB-IoT/Cat-M2
 
Me expresé mal. Yo tengo cero idea de programación. Pero... en algún momento supe. Porque todos damos programación al estudiar. Para luego estar en medio de unos y otros, lo tengo más fácil que el que solamente desarrolló, porque la otra parte le suena a chino.
No hay nadie que solo haya desarrollado y no tenga ni pajolera idea de Sistemas... otro tema es que no sepa de AZ, como tú probablemente no sabes nada sobre SQL Server o hacer mapas interactivos.
Ahora, lo de Azure y el problema que tienes... la culpa no es de Azure, es de quien decidió mover las cosas a un sitio sin haber mirado si se podía hacer todo :juas
No, si mover no se movió nada "real", fue una especie de entorno de PRE y donde las pruebas ya demostraron que habían varios problemas (IPs idénticas sobre todo)

¿Has propuesto a tu empresa coger el puesto del jefazo ese que tomó la decisión y cobra mucho más sin tener puñetera idea?
Está endiosado (tiene un Tesla, no te digo más :diablillo ) y para él TODO ha de ir a AZ y cambias todo lo que tengas que cambiar... y le costó entender que no es solo un tema de software, es que hay también sensónica a miles y se trabaja así a nivel global con estándares, ya sea con MQTT NB-IoT o ya sea por dispositivos TCP con AVLs. Eso no lo puedes cambiar, y ofreces una solución que mejore a lo que ya hay actualmente o ¿para qué migrar?
 
Lo de irse al Cloud para los de arriba es como un objetivo que necesitan imperiosamente. Igual van a reuniones de alto nivel y si dicen que sus sistemas no están en la nube quedan mal. Igual que si llevasen un Nokia por móvil. De lo contrario no hay quien entienda nada. Luego vienen los llantos y aparecen roles como FinOps. Aplicaciones que te dicen cómo ahorrar pasta, dónde la estás tirando... Después empiezan las automatizaciones para apagar máquinas por las noches y seguir ahorrando... En definitiva, porque les vendieron que pagas por lo que uses y luego resulta que lo que pagas es un pastizal enorme, que con el dinero que te cuesta tener ciertas bases de datos en la nube comprabas servidores con decenas de cores, cientos de GB de RAM y pagabas las licencias de Oracle. Pero claro, no está en la nube. Un paripé.
 
@TheReeler ya solo por la curiosidad. ¿Por qué no funciona lo de NB-IoT en Azure? Sin tener ni idea de cómo funciona eso, ojo.


Aquí aparece nombrado: Narrowband or NB-IoT/Cat-M2
Pues según me dijeron los "egggpertosshhh", porque no lo tienen disponible como servicio sin SSL, es decir, no permiten tener ese servicio usando UDP (obliga este NB-IoT), solo para conexiones TCP. Al no tener SSL, no se puede usar TLS, por lo que AZ ya no sirve como opción.

Me plantearon usar un middleware para "traducir" de uno a otro, pero entonces ya no tengo lo que necesito, que es justamente olvidarme del dimensionamiento de ese servicio y se adapte a la realidad de la calle en cada momento.

Claro, hablas con la gente de IT y te sueltan "pues que use TLS", sin plantearse que el hardware lleva unos componente concretos donde el consumo de batería se ha mirado hasta el último miliwatio para permitir que ésta dure lo menos 4 años y en ideal 8 sin necesidad de cambiar la pila interna. Es lo que comento, son mundos distintos y al igual que hay que entender el software, hay que entender el hardware.

Y ojo, que más o menos lo mismo pasó con el maravilloso servicio de Tomcat. Si tu aplicación luego necesita crear archivos o historias, ya no sirve, has de montarte historias con almacenamientos compartidos y no sé que mierdas porque no se les ocurrió siquiera que una aplicación necesitara escribir alguna vez a disco o leer configuraciones. Claro, se puede migrar, se pueden hacer muchas cosas, pero el caso es que se pide que te adaptes a como trabajan exactamente en AZ y luego ese sistema no es "llevable" a otro cloud sin volver a modificar programación.

Para mi, si me haces cambiar cosas (algunas de cientos de horas), has de darme a cambio un beneficio que lo compense. Por ahora, en pruebas hechas durante meses, no ha sido así. Aquí hemos querido montar alguna historia desde cero en AZ y ha terminado poniéndose... pero en VM, no como servicios.
 
Lo de irse al Cloud para los de arriba es como un objetivo que necesitan imperiosamente. Igual van a reuniones de alto nivel y si dicen que sus sistemas no están en la nube quedan mal. Igual que si llevasen un Nokia por móvil. De lo contrario no hay quien entienda nada. Luego vienen los llantos y aparecen roles como FinOps. Aplicaciones que te dicen cómo ahorrar pasta, dónde la estás tirando... Después empiezan las automatizaciones para apagar máquinas por las noches y seguir ahorrando... En definitiva, porque les vendieron que pagas por lo que uses y luego resulta que lo que pagas es un pastizal enorme, que con el dinero que te cuesta tener ciertas bases de datos en la nube comprabas servidores con decenas de cores, cientos de GB de RAM y pagabas las licencias de Oracle. Pero claro, no está en la nube. Un paripé.
Pero es que nosotros no es que estemos "en la nube", es que usamos tres clouds distintos y están interconectados (multicloud). El debate surge de mover TODO a AZ "porque es mejor y puedes ahorrarte VMs porque puedes la mayoría de cosas como servicios", y eso es una verdad a medias y que casa con algunas arquitecturas, pero no con todas.

Nos pegamos un buen curro haciendo todos los esquemas para que se entendiera bien la arquitectura, y aun a día de hoy, sigue siendo algo portable a cualquier otro cloud, cosa que si empiezas a pensar solo en AZ.... para mi no es el camino.
 
Piensa que ahí detrás igual hay cazo, gente haciendo el egipcio, entradas gratis para ir a eventos… Al de arriba se la suda Azure u otro. Quien más pague.
 
Piensa que ahí detrás igual hay cazo, gente haciendo el egipcio, entradas gratis para ir a eventos… Al de arriba se la suda Azure u otro. Quien más pague.
Algo hay per no creo que sea nada oscuro, sencillamente se busca tener mayor volumen con AZ para conseguir ser un cliente más relevante y conseguir mayores descuentos, dudo que haya mucho más que eso la verdad.

A mi me invitan cada año a eventos y fiestas con DJ, catering y demás pollas en vinagre y hasta la fecha jamás he ido a ninguna, y andan como locos persiguiéndome para que por favor acuda y así crear un vínculo más allá de las facturas que pago por unos servicios dados. Han conseguido que fuera una reunión a sus oficinas y a dios gracias, por el lado lúdico poco van a conseguir de mi (soy forero :garrulo )
 
Trabajo para "Computer Architecture Operating Systems and Networks" entregado!

No es el mejor que he hecho porque se me olvido que tenia que entregarlo ayer.. asi que al llegar del trabajo me puse manos a la obra.. y la ultima pregunta (Tienes una empresa y vas a virtualizar ordenadores, explica las razones, haz un business plan, crea una guia para el usuario acerca de la virtualizacion con imagenes, etc, etc) la deje a medias porque no me daba mas tiempo.

De todas maneras estoy bastante contento con el hecho de haber podido comenzar y terminar el trabajo en dos horas 😄
 
Trabajo para "Computer Architecture Operating Systems and Networks" entregado!

No es el mejor que he hecho porque se me olvido que tenia que entregarlo ayer.. asi que al llegar del trabajo me puse manos a la obra.. y la ultima pregunta (Tienes una empresa y vas a virtualizar ordenadores, explica las razones, haz un business plan, crea una guia para el usuario acerca de la virtualizacion con imagenes, etc, etc) la deje a medias porque no me daba mas tiempo.

De todas maneras estoy bastante contento con el hecho de haber podido comenzar y terminar el trabajo en dos horas 😄
En la vida real hay que hacer todo eso en 27 minutos.
 
La verdad es que eran un monton de preguntas faciles exceptuando las tres ultimas.

La de la virtualizacion nos pedian 8 hojas entre analisis, guia de usuario, etc..

Una que me gusto mucho era sobre procesos y como ordenarlos en base al algoritmo de "Shortest Job First".

El Miercoles que viene, examen de algoritmos y estructuras de datos 2.
 
Estoy pasando un código que escribí en QBASIC en 1999... ¡a C++, en 2023! :sudor Casi un cuarto de siglo después, he sacado el código de un CD del pleistoceno y me he tirado varias noches dándole vueltas. Desgraciadamente, es una versión que abandoné en su día por incluir varios errores que no supe solventar, pero estoy planteándome acudir a Chatgpt y calentarle la cabeza para que me ayude.

Sed clementes conmigo y con mi código pleistocénico de mierda, que yo no soy un profesional de esto :rubor

C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MaxCasas = 15; // Tres barrios con 5 casas cada uno
const int TiempoPorDia = 60; // 1 día de juego equivale a 60 segundos de tiempo real
const int DiasPorAnio = 365; // Asumiendo un año de 365 días

struct Persona {
    string Nombre;
    int Edad;
    int EdadMuerte;
    string Profesion;
    int Salario;
    int SaldoBancario;
    string Domicilio;
    int Hipoteca; // Nueva variable para la hipoteca
};

struct Profesion {
    string Nombre;
    int Salario;
};

struct Direccion {
    string Calle;
    int Numero;
};

void CargarNombresHombre(vector<string>& NombresHombre) {
    ifstream archivo("nombreshombre.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresHombre.push_back(nombre);
    }
    archivo.close();
}

void CargarNombresMujer(vector<string>& NombresMujer) {
    ifstream archivo("nombresmujer.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresMujer.push_back(nombre);
    }
    archivo.close();
}

void CargarApellidos(vector<string>& Apellidos) {
    ifstream archivo("apellidos.txt");
    string apellido;
    while (getline(archivo, apellido)) {
        Apellidos.push_back(apellido);
    }
    archivo.close();
}

void CargarProfesiones(vector<pair<string, int>>& Profesiones) {
    ifstream archivo("Profesiones.txt");
    string linea;
    while (getline(archivo, linea)) {
        size_t separador = linea.find(',');
        if (separador != string::npos) {
            string nombreProfesion = linea.substr(0, separador);
            int salario = stoi(linea.substr(separador + 1));
            Profesiones.push_back({nombreProfesion, salario});
        }
    }
    archivo.close();
}

string GenerarNombreCompleto(const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos) {
    string nombreCompleto;

    if (rand() % 2 == 0) { // Hombre
        int indiceNombre = rand() % NombresHombre.size();
        nombreCompleto = NombresHombre[indiceNombre];
    } else { // Mujer
        int indiceNombre = rand() % NombresMujer.size();
        nombreCompleto = NombresMujer[indiceNombre];
    }

    int indiceApellido1 = rand() % Apellidos.size();
    int indiceApellido2 = rand() % Apellidos.size();

    nombreCompleto += " " + Apellidos[indiceApellido1] + " " + Apellidos[indiceApellido2];

    return nombreCompleto;
}

void GenerarNuevaPersona(Persona& persona, const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos, const vector<pair<string, int>>& Profesiones) {
    persona.Nombre = GenerarNombreCompleto(NombresHombre, NombresMujer, Apellidos);

    int indiceProfesion = rand() % Profesiones.size();
    persona.Profesion = Profesiones[indiceProfesion].first;
    persona.Salario = Profesiones[indiceProfesion].second;
    persona.Edad = rand() % 23 + 18; // Edad aleatoria entre 18 y 40 años
    persona.EdadMuerte = persona.Edad + 20 + rand() % 12; // Edad de muerte entre 20 y 31 años
    persona.SaldoBancario = persona.Salario - (persona.Salario * 30 / 100); // Saldo bancario inicial
    persona.Hipoteca = 30; // Hipoteca inicial de 30 años

    // Asignar un domicilio aleatorio
    Direccion direccion;
    switch (rand() % 3) {
        case 0:
            direccion.Calle = "Calle del Olmo";
            break;
        case 1:
            direccion.Calle = "Calle Brigadier Algarra";
            break;
        case 2:
            direccion.Calle = "Calle Carlos Arniches";
            break;
    }
    direccion.Numero = rand() % 5 + 1; // Número de casa aleatorio entre 1 y 5 (cada barrio tiene 5 casas)
    persona.Domicilio = "Domicilio: " + direccion.Calle + ", número " + to_string(direccion.Numero);
}

void ActualizarSaldoBancario(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.SaldoBancario += persona.Salario - (persona.Salario * 30 / 100); // Actualizar saldo bancario
        persona.SaldoBancario -= 500; // Cuota anual de hipoteca
        if (persona.SaldoBancario < 0) {
            persona.Hipoteca--; // Restar un año de hipoteca si el saldo es insuficiente
            persona.SaldoBancario += 500; // Añadir de nuevo la cuota a la deuda
        }
    }
}

void ActualizarEdad(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.Edad++;
        if (persona.Hipoteca > 0) {
            persona.Hipoteca--; // Reducir el plazo de la hipoteca cada año
        }
    }
}

void MostrarPersonas(const vector<Persona>& personas, int tiempo) {
    system("cls");

    cout << "Años: " << tiempo << endl;
    cout << "--------------------------------" << endl;
    for (const Persona& persona : personas) {
        cout << "Nombre: " << persona.Nombre << endl;
        cout << "Edad: " << persona.Edad << endl;
        cout << "Profesion: " << persona.Profesion << endl;
        cout << "Salario: " << persona.Salario << endl;
        cout << persona.Domicilio << endl;
        if (persona.Hipoteca > 0) {
            cout << "Hipoteca: " << persona.Hipoteca << " años por pagar" << endl;
        } else {
            cout << "Hipoteca pagada" << endl;
        }
        cout << "Saldo Bancario: " << persona.SaldoBancario << endl;
        cout << "--------------------------------" << endl;
    }
}

void PausaSegundos(int segundos) {
    clock_t end_time = clock() + segundos * CLOCKS_PER_SEC;
    while (clock() < end_time) {}
}

bool ExisteAlcalde(const vector<Persona>& personas) {
    for (const Persona& persona : personas) {
        if (persona.Profesion == "Alcalde") {
            return true;
        }
    }
    return false;
}

void AsignarProfesionAlcalde(vector<Persona>& personas, const vector<pair<string, int>>& Profesiones) {
    if (!ExisteAlcalde(personas)) {
        for (Persona& persona : personas) {
            if (rand() % Profesiones.size() == 0) { // Probabilidad baja de ser Alcalde
                persona.Profesion = "Alcalde";
                break;
            }
        }
    }
}

int main() {
    srand(time(NULL));
    vector<string> NombresHombre;
    vector<string> NombresMujer;
    vector<string> Apellidos;
    vector<pair<string, int>> Profesiones;
    vector<Persona> personas;

    CargarNombresHombre(NombresHombre);
    CargarNombresMujer(NombresMujer);
    CargarApellidos(Apellidos);
    CargarProfesiones(Profesiones);

    int tiempo = 1; // Contador de tiempo (años)
    bool nuevoAnio = false; // Bandera para verificar si se ha pasado un año

    clock_t tiempoInicio = clock(); // Iniciar el contador de tiempo

    while (true) {
        clock_t tiempoActual = clock();
        double tiempoTranscurrido = (double)(tiempoActual - tiempoInicio) / CLOCKS_PER_SEC;

        if (tiempoTranscurrido >= TiempoPorDia) {
            tiempoInicio = tiempoActual;
            nuevoAnio = true; // Se ha pasado un día
        }

        if (nuevoAnio) {
            tiempo++;
            nuevoAnio = false;
        }

        Persona persona;
        GenerarNuevaPersona(persona, NombresHombre, NombresMujer, Apellidos, Profesiones);
        personas.push_back(persona);
        MostrarPersonas(personas, tiempo);

        PausaSegundos(TiempoPorDia); // Espera 60 segundos (1 día de juego)
        ActualizarSaldoBancario(personas); // Actualizar saldo bancario
        ActualizarEdad(personas);

        // Verificar y registrar muertes
        for (auto it = personas.begin(); it != personas.end();) {
            if (it->Edad >= it->EdadMuerte) {
                it = personas.erase(it);
                nuevoAnio = true; // Se ha pasado un año
            } else {
                ++it;
            }
        }

        // Regular la profesión del Alcalde si no existe
        AsignarProfesionAlcalde(personas, Profesiones);
    }

    return 0;
}
 
Estoy pasando un código que escribí en QBASIC en 1999... ¡a C++, en 2023! :sudor Casi un cuarto de siglo después, he sacado el código de un CD del pleistoceno y me he tirado varias noches dándole vueltas. Desgraciadamente, es una versión que abandoné en su día por incluir varios errores que no supe solventar, pero estoy planteándome acudir a Chatgpt y calentarle la cabeza para que me ayude.

Sed clementes conmigo y con mi código pleistocénico de mierda, que yo no soy un profesional de esto :rubor

C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MaxCasas = 15; // Tres barrios con 5 casas cada uno
const int TiempoPorDia = 60; // 1 día de juego equivale a 60 segundos de tiempo real
const int DiasPorAnio = 365; // Asumiendo un año de 365 días

struct Persona {
    string Nombre;
    int Edad;
    int EdadMuerte;
    string Profesion;
    int Salario;
    int SaldoBancario;
    string Domicilio;
    int Hipoteca; // Nueva variable para la hipoteca
};

struct Profesion {
    string Nombre;
    int Salario;
};

struct Direccion {
    string Calle;
    int Numero;
};

void CargarNombresHombre(vector<string>& NombresHombre) {
    ifstream archivo("nombreshombre.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresHombre.push_back(nombre);
    }
    archivo.close();
}

void CargarNombresMujer(vector<string>& NombresMujer) {
    ifstream archivo("nombresmujer.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresMujer.push_back(nombre);
    }
    archivo.close();
}

void CargarApellidos(vector<string>& Apellidos) {
    ifstream archivo("apellidos.txt");
    string apellido;
    while (getline(archivo, apellido)) {
        Apellidos.push_back(apellido);
    }
    archivo.close();
}

void CargarProfesiones(vector<pair<string, int>>& Profesiones) {
    ifstream archivo("Profesiones.txt");
    string linea;
    while (getline(archivo, linea)) {
        size_t separador = linea.find(',');
        if (separador != string::npos) {
            string nombreProfesion = linea.substr(0, separador);
            int salario = stoi(linea.substr(separador + 1));
            Profesiones.push_back({nombreProfesion, salario});
        }
    }
    archivo.close();
}

string GenerarNombreCompleto(const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos) {
    string nombreCompleto;

    if (rand() % 2 == 0) { // Hombre
        int indiceNombre = rand() % NombresHombre.size();
        nombreCompleto = NombresHombre[indiceNombre];
    } else { // Mujer
        int indiceNombre = rand() % NombresMujer.size();
        nombreCompleto = NombresMujer[indiceNombre];
    }

    int indiceApellido1 = rand() % Apellidos.size();
    int indiceApellido2 = rand() % Apellidos.size();

    nombreCompleto += " " + Apellidos[indiceApellido1] + " " + Apellidos[indiceApellido2];

    return nombreCompleto;
}

void GenerarNuevaPersona(Persona& persona, const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos, const vector<pair<string, int>>& Profesiones) {
    persona.Nombre = GenerarNombreCompleto(NombresHombre, NombresMujer, Apellidos);

    int indiceProfesion = rand() % Profesiones.size();
    persona.Profesion = Profesiones[indiceProfesion].first;
    persona.Salario = Profesiones[indiceProfesion].second;
    persona.Edad = rand() % 23 + 18; // Edad aleatoria entre 18 y 40 años
    persona.EdadMuerte = persona.Edad + 20 + rand() % 12; // Edad de muerte entre 20 y 31 años
    persona.SaldoBancario = persona.Salario - (persona.Salario * 30 / 100); // Saldo bancario inicial
    persona.Hipoteca = 30; // Hipoteca inicial de 30 años

    // Asignar un domicilio aleatorio
    Direccion direccion;
    switch (rand() % 3) {
        case 0:
            direccion.Calle = "Calle del Olmo";
            break;
        case 1:
            direccion.Calle = "Calle Brigadier Algarra";
            break;
        case 2:
            direccion.Calle = "Calle Carlos Arniches";
            break;
    }
    direccion.Numero = rand() % 5 + 1; // Número de casa aleatorio entre 1 y 5 (cada barrio tiene 5 casas)
    persona.Domicilio = "Domicilio: " + direccion.Calle + ", número " + to_string(direccion.Numero);
}

void ActualizarSaldoBancario(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.SaldoBancario += persona.Salario - (persona.Salario * 30 / 100); // Actualizar saldo bancario
        persona.SaldoBancario -= 500; // Cuota anual de hipoteca
        if (persona.SaldoBancario < 0) {
            persona.Hipoteca--; // Restar un año de hipoteca si el saldo es insuficiente
            persona.SaldoBancario += 500; // Añadir de nuevo la cuota a la deuda
        }
    }
}

void ActualizarEdad(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.Edad++;
        if (persona.Hipoteca > 0) {
            persona.Hipoteca--; // Reducir el plazo de la hipoteca cada año
        }
    }
}

void MostrarPersonas(const vector<Persona>& personas, int tiempo) {
    system("cls");

    cout << "Años: " << tiempo << endl;
    cout << "--------------------------------" << endl;
    for (const Persona& persona : personas) {
        cout << "Nombre: " << persona.Nombre << endl;
        cout << "Edad: " << persona.Edad << endl;
        cout << "Profesion: " << persona.Profesion << endl;
        cout << "Salario: " << persona.Salario << endl;
        cout << persona.Domicilio << endl;
        if (persona.Hipoteca > 0) {
            cout << "Hipoteca: " << persona.Hipoteca << " años por pagar" << endl;
        } else {
            cout << "Hipoteca pagada" << endl;
        }
        cout << "Saldo Bancario: " << persona.SaldoBancario << endl;
        cout << "--------------------------------" << endl;
    }
}

void PausaSegundos(int segundos) {
    clock_t end_time = clock() + segundos * CLOCKS_PER_SEC;
    while (clock() < end_time) {}
}

bool ExisteAlcalde(const vector<Persona>& personas) {
    for (const Persona& persona : personas) {
        if (persona.Profesion == "Alcalde") {
            return true;
        }
    }
    return false;
}

void AsignarProfesionAlcalde(vector<Persona>& personas, const vector<pair<string, int>>& Profesiones) {
    if (!ExisteAlcalde(personas)) {
        for (Persona& persona : personas) {
            if (rand() % Profesiones.size() == 0) { // Probabilidad baja de ser Alcalde
                persona.Profesion = "Alcalde";
                break;
            }
        }
    }
}

int main() {
    srand(time(NULL));
    vector<string> NombresHombre;
    vector<string> NombresMujer;
    vector<string> Apellidos;
    vector<pair<string, int>> Profesiones;
    vector<Persona> personas;

    CargarNombresHombre(NombresHombre);
    CargarNombresMujer(NombresMujer);
    CargarApellidos(Apellidos);
    CargarProfesiones(Profesiones);

    int tiempo = 1; // Contador de tiempo (años)
    bool nuevoAnio = false; // Bandera para verificar si se ha pasado un año

    clock_t tiempoInicio = clock(); // Iniciar el contador de tiempo

    while (true) {
        clock_t tiempoActual = clock();
        double tiempoTranscurrido = (double)(tiempoActual - tiempoInicio) / CLOCKS_PER_SEC;

        if (tiempoTranscurrido >= TiempoPorDia) {
            tiempoInicio = tiempoActual;
            nuevoAnio = true; // Se ha pasado un día
        }

        if (nuevoAnio) {
            tiempo++;
            nuevoAnio = false;
        }

        Persona persona;
        GenerarNuevaPersona(persona, NombresHombre, NombresMujer, Apellidos, Profesiones);
        personas.push_back(persona);
        MostrarPersonas(personas, tiempo);

        PausaSegundos(TiempoPorDia); // Espera 60 segundos (1 día de juego)
        ActualizarSaldoBancario(personas); // Actualizar saldo bancario
        ActualizarEdad(personas);

        // Verificar y registrar muertes
        for (auto it = personas.begin(); it != personas.end();) {
            if (it->Edad >= it->EdadMuerte) {
                it = personas.erase(it);
                nuevoAnio = true; // Se ha pasado un año
            } else {
                ++it;
            }
        }

        // Regular la profesión del Alcalde si no existe
        AsignarProfesionAlcalde(personas, Profesiones);
    }

    return 0;
}
Pues a mi me gusta tu código… tiene colorines !
 
Estoy pasando un código que escribí en QBASIC en 1999... ¡a C++, en 2023! :sudor Casi un cuarto de siglo después, he sacado el código de un CD del pleistoceno y me he tirado varias noches dándole vueltas. Desgraciadamente, es una versión que abandoné en su día por incluir varios errores que no supe solventar, pero estoy planteándome acudir a Chatgpt y calentarle la cabeza para que me ayude.

Sed clementes conmigo y con mi código pleistocénico de mierda, que yo no soy un profesional de esto :rubor

C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MaxCasas = 15; // Tres barrios con 5 casas cada uno
const int TiempoPorDia = 60; // 1 día de juego equivale a 60 segundos de tiempo real
const int DiasPorAnio = 365; // Asumiendo un año de 365 días

struct Persona {
    string Nombre;
    int Edad;
    int EdadMuerte;
    string Profesion;
    int Salario;
    int SaldoBancario;
    string Domicilio;
    int Hipoteca; // Nueva variable para la hipoteca
};

struct Profesion {
    string Nombre;
    int Salario;
};

struct Direccion {
    string Calle;
    int Numero;
};

void CargarNombresHombre(vector<string>& NombresHombre) {
    ifstream archivo("nombreshombre.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresHombre.push_back(nombre);
    }
    archivo.close();
}

void CargarNombresMujer(vector<string>& NombresMujer) {
    ifstream archivo("nombresmujer.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresMujer.push_back(nombre);
    }
    archivo.close();
}

void CargarApellidos(vector<string>& Apellidos) {
    ifstream archivo("apellidos.txt");
    string apellido;
    while (getline(archivo, apellido)) {
        Apellidos.push_back(apellido);
    }
    archivo.close();
}

void CargarProfesiones(vector<pair<string, int>>& Profesiones) {
    ifstream archivo("Profesiones.txt");
    string linea;
    while (getline(archivo, linea)) {
        size_t separador = linea.find(',');
        if (separador != string::npos) {
            string nombreProfesion = linea.substr(0, separador);
            int salario = stoi(linea.substr(separador + 1));
            Profesiones.push_back({nombreProfesion, salario});
        }
    }
    archivo.close();
}

string GenerarNombreCompleto(const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos) {
    string nombreCompleto;

    if (rand() % 2 == 0) { // Hombre
        int indiceNombre = rand() % NombresHombre.size();
        nombreCompleto = NombresHombre[indiceNombre];
    } else { // Mujer
        int indiceNombre = rand() % NombresMujer.size();
        nombreCompleto = NombresMujer[indiceNombre];
    }

    int indiceApellido1 = rand() % Apellidos.size();
    int indiceApellido2 = rand() % Apellidos.size();

    nombreCompleto += " " + Apellidos[indiceApellido1] + " " + Apellidos[indiceApellido2];

    return nombreCompleto;
}

void GenerarNuevaPersona(Persona& persona, const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos, const vector<pair<string, int>>& Profesiones) {
    persona.Nombre = GenerarNombreCompleto(NombresHombre, NombresMujer, Apellidos);

    int indiceProfesion = rand() % Profesiones.size();
    persona.Profesion = Profesiones[indiceProfesion].first;
    persona.Salario = Profesiones[indiceProfesion].second;
    persona.Edad = rand() % 23 + 18; // Edad aleatoria entre 18 y 40 años
    persona.EdadMuerte = persona.Edad + 20 + rand() % 12; // Edad de muerte entre 20 y 31 años
    persona.SaldoBancario = persona.Salario - (persona.Salario * 30 / 100); // Saldo bancario inicial
    persona.Hipoteca = 30; // Hipoteca inicial de 30 años

    // Asignar un domicilio aleatorio
    Direccion direccion;
    switch (rand() % 3) {
        case 0:
            direccion.Calle = "Calle del Olmo";
            break;
        case 1:
            direccion.Calle = "Calle Brigadier Algarra";
            break;
        case 2:
            direccion.Calle = "Calle Carlos Arniches";
            break;
    }
    direccion.Numero = rand() % 5 + 1; // Número de casa aleatorio entre 1 y 5 (cada barrio tiene 5 casas)
    persona.Domicilio = "Domicilio: " + direccion.Calle + ", número " + to_string(direccion.Numero);
}

void ActualizarSaldoBancario(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.SaldoBancario += persona.Salario - (persona.Salario * 30 / 100); // Actualizar saldo bancario
        persona.SaldoBancario -= 500; // Cuota anual de hipoteca
        if (persona.SaldoBancario < 0) {
            persona.Hipoteca--; // Restar un año de hipoteca si el saldo es insuficiente
            persona.SaldoBancario += 500; // Añadir de nuevo la cuota a la deuda
        }
    }
}

void ActualizarEdad(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.Edad++;
        if (persona.Hipoteca > 0) {
            persona.Hipoteca--; // Reducir el plazo de la hipoteca cada año
        }
    }
}

void MostrarPersonas(const vector<Persona>& personas, int tiempo) {
    system("cls");

    cout << "Años: " << tiempo << endl;
    cout << "--------------------------------" << endl;
    for (const Persona& persona : personas) {
        cout << "Nombre: " << persona.Nombre << endl;
        cout << "Edad: " << persona.Edad << endl;
        cout << "Profesion: " << persona.Profesion << endl;
        cout << "Salario: " << persona.Salario << endl;
        cout << persona.Domicilio << endl;
        if (persona.Hipoteca > 0) {
            cout << "Hipoteca: " << persona.Hipoteca << " años por pagar" << endl;
        } else {
            cout << "Hipoteca pagada" << endl;
        }
        cout << "Saldo Bancario: " << persona.SaldoBancario << endl;
        cout << "--------------------------------" << endl;
    }
}

void PausaSegundos(int segundos) {
    clock_t end_time = clock() + segundos * CLOCKS_PER_SEC;
    while (clock() < end_time) {}
}

bool ExisteAlcalde(const vector<Persona>& personas) {
    for (const Persona& persona : personas) {
        if (persona.Profesion == "Alcalde") {
            return true;
        }
    }
    return false;
}

void AsignarProfesionAlcalde(vector<Persona>& personas, const vector<pair<string, int>>& Profesiones) {
    if (!ExisteAlcalde(personas)) {
        for (Persona& persona : personas) {
            if (rand() % Profesiones.size() == 0) { // Probabilidad baja de ser Alcalde
                persona.Profesion = "Alcalde";
                break;
            }
        }
    }
}

int main() {
    srand(time(NULL));
    vector<string> NombresHombre;
    vector<string> NombresMujer;
    vector<string> Apellidos;
    vector<pair<string, int>> Profesiones;
    vector<Persona> personas;

    CargarNombresHombre(NombresHombre);
    CargarNombresMujer(NombresMujer);
    CargarApellidos(Apellidos);
    CargarProfesiones(Profesiones);

    int tiempo = 1; // Contador de tiempo (años)
    bool nuevoAnio = false; // Bandera para verificar si se ha pasado un año

    clock_t tiempoInicio = clock(); // Iniciar el contador de tiempo

    while (true) {
        clock_t tiempoActual = clock();
        double tiempoTranscurrido = (double)(tiempoActual - tiempoInicio) / CLOCKS_PER_SEC;

        if (tiempoTranscurrido >= TiempoPorDia) {
            tiempoInicio = tiempoActual;
            nuevoAnio = true; // Se ha pasado un día
        }

        if (nuevoAnio) {
            tiempo++;
            nuevoAnio = false;
        }

        Persona persona;
        GenerarNuevaPersona(persona, NombresHombre, NombresMujer, Apellidos, Profesiones);
        personas.push_back(persona);
        MostrarPersonas(personas, tiempo);

        PausaSegundos(TiempoPorDia); // Espera 60 segundos (1 día de juego)
        ActualizarSaldoBancario(personas); // Actualizar saldo bancario
        ActualizarEdad(personas);

        // Verificar y registrar muertes
        for (auto it = personas.begin(); it != personas.end();) {
            if (it->Edad >= it->EdadMuerte) {
                it = personas.erase(it);
                nuevoAnio = true; // Se ha pasado un año
            } else {
                ++it;
            }
        }

        // Regular la profesión del Alcalde si no existe
        AsignarProfesionAlcalde(personas, Profesiones);
    }

    return 0;
}
No tengo ni idea de C++ pero me he enterado de todo lo que hace el programa.

Se parece un monton a Java.. pero mas limpio y sencillito (creo)
 
Estoy pasando un código que escribí en QBASIC en 1999... ¡a C++, en 2023! :sudor Casi un cuarto de siglo después, he sacado el código de un CD del pleistoceno y me he tirado varias noches dándole vueltas. Desgraciadamente, es una versión que abandoné en su día por incluir varios errores que no supe solventar, pero estoy planteándome acudir a Chatgpt y calentarle la cabeza para que me ayude.

Sed clementes conmigo y con mi código pleistocénico de mierda, que yo no soy un profesional de esto :rubor

C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MaxCasas = 15; // Tres barrios con 5 casas cada uno
const int TiempoPorDia = 60; // 1 día de juego equivale a 60 segundos de tiempo real
const int DiasPorAnio = 365; // Asumiendo un año de 365 días

struct Persona {
    string Nombre;
    int Edad;
    int EdadMuerte;
    string Profesion;
    int Salario;
    int SaldoBancario;
    string Domicilio;
    int Hipoteca; // Nueva variable para la hipoteca
};

struct Profesion {
    string Nombre;
    int Salario;
};

struct Direccion {
    string Calle;
    int Numero;
};

void CargarNombresHombre(vector<string>& NombresHombre) {
    ifstream archivo("nombreshombre.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresHombre.push_back(nombre);
    }
    archivo.close();
}

void CargarNombresMujer(vector<string>& NombresMujer) {
    ifstream archivo("nombresmujer.txt");
    string nombre;
    while (getline(archivo, nombre)) {
        NombresMujer.push_back(nombre);
    }
    archivo.close();
}

void CargarApellidos(vector<string>& Apellidos) {
    ifstream archivo("apellidos.txt");
    string apellido;
    while (getline(archivo, apellido)) {
        Apellidos.push_back(apellido);
    }
    archivo.close();
}

void CargarProfesiones(vector<pair<string, int>>& Profesiones) {
    ifstream archivo("Profesiones.txt");
    string linea;
    while (getline(archivo, linea)) {
        size_t separador = linea.find(',');
        if (separador != string::npos) {
            string nombreProfesion = linea.substr(0, separador);
            int salario = stoi(linea.substr(separador + 1));
            Profesiones.push_back({nombreProfesion, salario});
        }
    }
    archivo.close();
}

string GenerarNombreCompleto(const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos) {
    string nombreCompleto;

    if (rand() % 2 == 0) { // Hombre
        int indiceNombre = rand() % NombresHombre.size();
        nombreCompleto = NombresHombre[indiceNombre];
    } else { // Mujer
        int indiceNombre = rand() % NombresMujer.size();
        nombreCompleto = NombresMujer[indiceNombre];
    }

    int indiceApellido1 = rand() % Apellidos.size();
    int indiceApellido2 = rand() % Apellidos.size();

    nombreCompleto += " " + Apellidos[indiceApellido1] + " " + Apellidos[indiceApellido2];

    return nombreCompleto;
}

void GenerarNuevaPersona(Persona& persona, const vector<string>& NombresHombre, const vector<string>& NombresMujer, const vector<string>& Apellidos, const vector<pair<string, int>>& Profesiones) {
    persona.Nombre = GenerarNombreCompleto(NombresHombre, NombresMujer, Apellidos);

    int indiceProfesion = rand() % Profesiones.size();
    persona.Profesion = Profesiones[indiceProfesion].first;
    persona.Salario = Profesiones[indiceProfesion].second;
    persona.Edad = rand() % 23 + 18; // Edad aleatoria entre 18 y 40 años
    persona.EdadMuerte = persona.Edad + 20 + rand() % 12; // Edad de muerte entre 20 y 31 años
    persona.SaldoBancario = persona.Salario - (persona.Salario * 30 / 100); // Saldo bancario inicial
    persona.Hipoteca = 30; // Hipoteca inicial de 30 años

    // Asignar un domicilio aleatorio
    Direccion direccion;
    switch (rand() % 3) {
        case 0:
            direccion.Calle = "Calle del Olmo";
            break;
        case 1:
            direccion.Calle = "Calle Brigadier Algarra";
            break;
        case 2:
            direccion.Calle = "Calle Carlos Arniches";
            break;
    }
    direccion.Numero = rand() % 5 + 1; // Número de casa aleatorio entre 1 y 5 (cada barrio tiene 5 casas)
    persona.Domicilio = "Domicilio: " + direccion.Calle + ", número " + to_string(direccion.Numero);
}

void ActualizarSaldoBancario(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.SaldoBancario += persona.Salario - (persona.Salario * 30 / 100); // Actualizar saldo bancario
        persona.SaldoBancario -= 500; // Cuota anual de hipoteca
        if (persona.SaldoBancario < 0) {
            persona.Hipoteca--; // Restar un año de hipoteca si el saldo es insuficiente
            persona.SaldoBancario += 500; // Añadir de nuevo la cuota a la deuda
        }
    }
}

void ActualizarEdad(vector<Persona>& personas) {
    for (Persona& persona : personas) {
        persona.Edad++;
        if (persona.Hipoteca > 0) {
            persona.Hipoteca--; // Reducir el plazo de la hipoteca cada año
        }
    }
}

void MostrarPersonas(const vector<Persona>& personas, int tiempo) {
    system("cls");

    cout << "Años: " << tiempo << endl;
    cout << "--------------------------------" << endl;
    for (const Persona& persona : personas) {
        cout << "Nombre: " << persona.Nombre << endl;
        cout << "Edad: " << persona.Edad << endl;
        cout << "Profesion: " << persona.Profesion << endl;
        cout << "Salario: " << persona.Salario << endl;
        cout << persona.Domicilio << endl;
        if (persona.Hipoteca > 0) {
            cout << "Hipoteca: " << persona.Hipoteca << " años por pagar" << endl;
        } else {
            cout << "Hipoteca pagada" << endl;
        }
        cout << "Saldo Bancario: " << persona.SaldoBancario << endl;
        cout << "--------------------------------" << endl;
    }
}

void PausaSegundos(int segundos) {
    clock_t end_time = clock() + segundos * CLOCKS_PER_SEC;
    while (clock() < end_time) {}
}

bool ExisteAlcalde(const vector<Persona>& personas) {
    for (const Persona& persona : personas) {
        if (persona.Profesion == "Alcalde") {
            return true;
        }
    }
    return false;
}

void AsignarProfesionAlcalde(vector<Persona>& personas, const vector<pair<string, int>>& Profesiones) {
    if (!ExisteAlcalde(personas)) {
        for (Persona& persona : personas) {
            if (rand() % Profesiones.size() == 0) { // Probabilidad baja de ser Alcalde
                persona.Profesion = "Alcalde";
                break;
            }
        }
    }
}

int main() {
    srand(time(NULL));
    vector<string> NombresHombre;
    vector<string> NombresMujer;
    vector<string> Apellidos;
    vector<pair<string, int>> Profesiones;
    vector<Persona> personas;

    CargarNombresHombre(NombresHombre);
    CargarNombresMujer(NombresMujer);
    CargarApellidos(Apellidos);
    CargarProfesiones(Profesiones);

    int tiempo = 1; // Contador de tiempo (años)
    bool nuevoAnio = false; // Bandera para verificar si se ha pasado un año

    clock_t tiempoInicio = clock(); // Iniciar el contador de tiempo

    while (true) {
        clock_t tiempoActual = clock();
        double tiempoTranscurrido = (double)(tiempoActual - tiempoInicio) / CLOCKS_PER_SEC;

        if (tiempoTranscurrido >= TiempoPorDia) {
            tiempoInicio = tiempoActual;
            nuevoAnio = true; // Se ha pasado un día
        }

        if (nuevoAnio) {
            tiempo++;
            nuevoAnio = false;
        }

        Persona persona;
        GenerarNuevaPersona(persona, NombresHombre, NombresMujer, Apellidos, Profesiones);
        personas.push_back(persona);
        MostrarPersonas(personas, tiempo);

        PausaSegundos(TiempoPorDia); // Espera 60 segundos (1 día de juego)
        ActualizarSaldoBancario(personas); // Actualizar saldo bancario
        ActualizarEdad(personas);

        // Verificar y registrar muertes
        for (auto it = personas.begin(); it != personas.end();) {
            if (it->Edad >= it->EdadMuerte) {
                it = personas.erase(it);
                nuevoAnio = true; // Se ha pasado un año
            } else {
                ++it;
            }
        }

        // Regular la profesión del Alcalde si no existe
        AsignarProfesionAlcalde(personas, Profesiones);
    }

    return 0;
}

Lo puedes hacer en Javascript, Php o en Java. Yo en los primeros sé hacerlo, en el tercero en discordia tengo ciertas nociones porque lo he usado poco. Has fijado constantes y luego varios bucles, con "while" y "for", para sacar los "condicionales" y tener la respuesta final. Incluso se podría hacer con un simple formulario de javascript, sin tantos líos. :cortina
 
Ayer tuve el primer examen de "Algoritmos 2 y Programacion Avanzada".

Estoy SUPER CONTENTO! Eran 5 preguntas en un examen de 1 hora 45 minutos.

Una de las preguntas era acerca del Big O Notation, la respondi perfecta.

Otra era explicar un algoritmo de busqueda y sorting en la vida real (Google!)

Y dos de ellas eran de, obviamente, programar.

La que mas puntos daba era crear un algoritmo Bubble Sort que ordenase una serie de numeros que nos dio el profe para poner en un Array en orden descendente.

Me tire una hora haciendolo (entre apuntes y demas) pero le puse una interfaz grafica para que el usuario viese los numeros en el Array al principio (que estaban desordenados, obviamente), tambien para que cada vez que el algoritmo hacia (o no) un swap con el numero de al lado el usuario lo viese, para que mostrase el orden de los numeros en cada pase y para que los mostrase ordenados del todo al final.

Al finalizar el examen y mandarselo al profe me di cuenta que habia cometido un fallo (que no afecta al programa pero que sin el habria quedado mejor).

Cree otro Array para guardar temporalmente cada pase y mostrar el Array final.. pero no lo use y use el primero.

Deje la otra pregunta sin contestar, pero un 8 seguro que me llevo!

😊
 
Mientras tanto, en el lado empresarial.. tuve esta semana mi primera reunion con el mentor que me asignaron en el departamente de Startups de Dublin.. me dio un monton de consejos y al final me comento que si mejoraba tres aspectos de mi idea de negocio me recomendaria para la ayuda de desarrollo de empresas de 15.000€.

Una de las cosas que me dijo fue: Cuando te den la ayuda, NO compres tecnologia. Si necesitas un servidor, ponlo en la nube, si necesitas un ordenador, haz un leasing. Maravilloso consejo.

Otro supervalioso fue que con la mitad (o mas) del dinero de la ayuda contratase a un Business Development Manager para que me ayudase a enfocar el proyecto en el medium and long term Y que buscase un BDM que estuviese retirado y fuese de Europa del Este, porque aparentemente son los mejores a la hora de desarrollar un plan estrategico y de negocios.. y de ejecutarlo!.

Tengo que mandar los papeles a mediados de Diciembre para tener otra reunion y crear un plan estrategico basico con el mentor.

Seguiremos informando.
 
Ayer tuve el primer examen de "Algoritmos 2 y Programacion Avanzada".

Estoy SUPER CONTENTO! Eran 5 preguntas en un examen de 1 hora 45 minutos.

Una de las preguntas era acerca del Big O Notation, la respondi perfecta.

Otra era explicar un algoritmo de busqueda y sorting en la vida real (Google!)

Y dos de ellas eran de, obviamente, programar.

La que mas puntos daba era crear un algoritmo Bubble Sort que ordenase una serie de numeros que nos dio el profe para poner en un Array en orden descendente.

Me tire una hora haciendolo (entre apuntes y demas) pero le puse una interfaz grafica para que el usuario viese los numeros en el Array al principio (que estaban desordenados, obviamente), tambien para que cada vez que el algoritmo hacia (o no) un swap con el numero de al lado el usuario lo viese, para que mostrase el orden de los numeros en cada pase y para que los mostrase ordenados del todo al final.

Al finalizar el examen y mandarselo al profe me di cuenta que habia cometido un fallo (que no afecta al programa pero que sin el habria quedado mejor).

Cree otro Array para guardar temporalmente cada pase y mostrar el Array final.. pero no lo use y use el primero.

Deje la otra pregunta sin contestar, pero un 8 seguro que me llevo!

😊
Me ha puesto un 4.9 por dos razones:
1) Deje sin responder una pregunta.
2) El metodo que tenia que implementar en el algoritmo tenia un nombre que nos dio el y en vez de ese nombre puse BubbleSort

Voy a reclamar!

Mientras tanto, en el proyecto de Distribution Systems tengo que hacer un GUI con una serie de llamadas a diferentes servicios que tengo que crear. He decidido crear el GUI en JavaFX y solo digo una cosa: Scene Builder BOOOOOM!
 
@Tim estaras contento, he comenzado la parte que te mola en Distribucion de Sistemas.
(Por cierto, esta asignatura es bastante interesante! Ayer hice un chat con un servidor y varios clientes.. y con un GUI).
1702323841660.png


Despues de esto tengo:
  • RPC Concepts
  • Protobuff
  • Designing Services with Proto3
  • Unary GRPC connections
  • Unary RPC (Server side, client side, bidirectional)
  • MQTT
  • Peer to peer systems
 
Buenas compañeros.
Pues yo he cumplido ya 9 meses como programador Cobol sobre AS400, habiéndome re-enganchado al mundo de la programación con 40 años y después de no haber tocado nada de código desde 2008 (si se puede llamar programar a hacer código web).
Hace unos meses me revisaron la categoría para subirme de Junior1 a Developer porque la plantilla del proyecto se ha ido reduciendo hasta el punto de habernos quedado 3 personas y estoy haciendo las tareas que hace cualquier programador senior, incluso trabajo de analista y documentación de auditoría con resolución final de problemas de UATs. La pena es que el sistema nos les permite saltar varios pasos de categoría del tirón y me han dejado como Junior2... que esperan volverme a subir a principios del año que viene.
Super contento y sobretodo agradecido de que una empresa me haya dado la oportunidad de entrar a través de una Bootcamp.
 
Arriba Pie