Al final del vídeo os dejo un problema que resolveremos en el siguiente de la serie! Dejarme en los comentarios las propuestas de solución y quizá las revisamos! :D
@alvarocespedes98903 жыл бұрын
Manos a la obra! 😎👌
@boomboom-94513 жыл бұрын
Aquí te adjunto la mía, aunque te la mencioné en otro comentario. He usado stacks y hash tables, tiene un coste de O(n). const input = process.argv[2].split(''); let hashTable = { '(': ')', '[': ']', '{': '}' }; let stack = []; for (let i = 0; i < input.length; i++) { if (input[i] in hashTable) { stack.push(input[i]); continue; } if (stack.length != 0 && input[i] == hashTable[stack[stack.length - 1]]) { stack.pop(); if ( i+1 == input.length ) { console.log(true); return true; } continue; } console.log(false); return false; }
@petro13cid3 жыл бұрын
@@boomboom-9451 Considero que sería preferible determinar si la cadena es correcta poniendo un if ( stack.length == 0 ) después de for, así evitarías ejecutar ese if ( i+1 == input.length ) por cada vez que se saque un elemento de la pila. Dentro del for se pondría una condición y un break para cuando el caracter de cierre no seaa correcto. Pero buena solución
@MaximoPower20243 жыл бұрын
Una pila.
@pepeluis7663 жыл бұрын
No me gusta mucho mi solución, funciona para el ejemplo dado (aunque fallaría si se abren dos elementos del mismo tipo antes de cerrarse uno de ellos). Una mejor sería el uso de substring como si de pilas se tratatran, quitando la recursión y teniendo en cuenta si se abren varios elementos del mismo tipo, pero ahora no tengo tiempo!! Bueno, ahí va mi código: //-------------------------------------------------------------------------------------------------------------------------------------------- public class Ejemplobusqueda { public static boolean comprobarTexto(char[] texto, int i, int j) { if(i>j) return true; // no queda nada que comprobar, todo bien if(i==j) return false; // solo hay una letra, no puedo encontrar el objetivo char letra = texto[i]; // letra que voy a comprobar char objetivo = ' '; // letra de cierre buscada //----------------------------- switch (letra){ case '[': objetivo = ']'; break; case '{': objetivo = '}';break; case '(': objetivo = ')';break; default: return false; } //----------------------------------------------- int k = i + 1; //empiezo a buscar desde la siguiente letra a i while(k j) // no he encontrado el caracter objetivo { return false; } else //encontré el caracter objetivo { boolean parte1 = comprobarTexto(texto, i+1, k-1); // quito las letras emparejadas y sigo comprobando if(parte1) { return comprobarTexto(texto, k+1, j); // compruebo el resto del string } else { return false; } } } //-------------------------------------------------------------------------------------------------------------------------------------------- public static void main(String[] args) { String texto = "[()]{}{[()()]()}"; String texto2 = "[(])"; boolean resultado = comprobarTexto(texto.toCharArray(),0, texto.length() -1); if(resultado) { System.out.println("correcto"); } else { System.out.println("incorrecto"); } } }
@victorfondevilla14243 жыл бұрын
Hola! Una recomendación, para mejorar la escalabildiad, concurrencia y resiliencia de la solución, a menos que haya un requerimiento de actualizar datos en tiempo real, creo que deberías poder un sistema de colas entre la API y la base de datos con un (o varios) ingestor de datos. Esta cola daría persistencia a las peticiones, con lo que si en un momento dado tu base de datos colapsa por sobrecarga, no se perderían transacciones de escritura de la API. Mi recomendación (me dedico profesionalmente a diseñar sistemas) es que se empiece siempre este tipo de entrevista haciendo un requirements gathering (incluyendo límites y riesgos), que es lo que deberías usar para guiar tus decisiones arquitecturales. Mi enhorabuena por el vídeo porque no hay mucho de Systems Design en español (y te has ganado otro suscriptor)! :D
@ernestoviso30833 жыл бұрын
Buenas, estoy de acuerdo contigo pero solo a medias. Si implementas un sistema de colas para realizar la persistencia de modo asincrono, correrías el riesgo de si en determinado momento fallaras al persisitir, perderías esta información o podrías tambien correr el riesgo de ralentizar toda la cola con una lógica de reintentos. Aquí creo que dependería en gran medida de las necesidades reales del producto, si hablamos de información que requiera cierta transaccionalidad (como la información del vuelo de un cliente) no puedes permitirte un sistema de colas sin más, sería más robusto hacerlo de forma síncrona y mejorar el rendimiento en otros aspectos. Igualmente es una opinión, pero hay otro tipo de operaciones en las que utilizar sistemas de colas puede ser mas seguro, o usar una cola persistente como la que ofrece NATS o algo así para almacenar mensajes e ir reintentandolos con cierta regularidad, pero el problema reside en que al ser de manera asíncrona es muy complejo recuperar al usuario para dicha operación.
@alejandroballesterosh42523 жыл бұрын
Esta serie es de lo mejor, hasta ahora practicaba con los problemas de hackerank, pero las explicaciones que das, agregan muchísimo sentido y valor para quienes van empezando. Saludos desde México.
@BettaTech3 жыл бұрын
Gracias! Me alegra muchísimo ver que os gusta y que además os es de utilidad. :)
@eduardomurrieta13673 жыл бұрын
Si es una BD relacional y declarar el ID o su identificador PK no tendría por que pasar lo de perder datos, a lo máximo a pasar es que uno de los dos de fallo. Al ser PK automáticamente tiene que ser único y no repetir, pero al final si tendrías que implementar la solución que dan en el vídeo.
@marialejandrausart41623 жыл бұрын
Dejo un tip: todo estos problemas los vez en la facultad, a mi lo que me pasa es que cuando presentas titulo es como que ni pasas por la entrevista tecnica porque en realidad si los rrhh hicieron su trabajo al leer sus programas de estudios ya esta claro, es como preguntarle a un corredor de formula uno si sabe conducir, pero si lo hacen para aquellos que son autodidactas a la marcha, va en resumen con titulo la entrevista dura minutos sin titulo la entrevistas pueden ser varias fases. Y si vez que como profesional te preguntan cosas absurdas ya como que a prender la alarma y pensarlo.
@carlosjavierbellotti66603 жыл бұрын
Muy bueno el planteo. Respecto al próximo problema creo que se puede solucionar con un stack, haciendo push en en el stack cuando tenes un carácter de apertura ((, [ o { ) y cuando son de cierre ( ), ] o }) hacer un pop comprobando que lo que acabamos de levantar de la pila se corresponda con el carácter de cierre, si no llega a corresponder o la pila se encuentra vacía al momento de hacer el pop es incorrecto. Abrazo!!!!
@moisescaicedo40783 жыл бұрын
Esa fue una de las preguntas en mi primera entrevista de trabajo.
@marianaquinteros16113 жыл бұрын
Te fue bien ?
@moisescaicedo40783 жыл бұрын
@@marianaquinteros1611 quede 👌
@pablorequejo56803 жыл бұрын
He empezado a ver hace poco tus vídeos ya que son muy explicativos y ahora estoy enganchado, gran trabajo! Una pregunta soy una persona que viene de la rama mixta y desde hace unos años trabajo para una empresa de desarrollo de proyectos dentro del mundo TI. Gracias a esto ha crecido mi interés por toda la parte técnica del diseño de sistemas y me gustaría conocer cuál sería tu mejor opción para adquirir este mayor detalle técnico de diseño de sistemas y programación? Gracias!
@FlightgearTutorials3 жыл бұрын
Muy buen video. Yo lo que mas estoy esperando es un video CLARO (solo como tu sabes hacerlos, que lo dificil parezca facil) sobre (DI) Dependency Injection en la serie de Patrones de Diseño. Please !!! Jejeje
@ThePomelo093 жыл бұрын
genial muchas gracias me sirvio mucho ! esa pregunta me la hicieron en mi ultima entrevista, en si el concepto era bastante similar: tener una aplicacación que permita al usuario visualizar y escribir un mensaje y guardarlo en la db pero esta app podian consumirla varios usuarios simultanamente.
@AlejandroMartinezAp25 күн бұрын
Hola! muy buen contenido, solo para agregar, que si uno quiere calcular exactamente la cantidad de combinaciones (permutaciones en realidad) de aeropuertos se usaria P(40000,2) donde P(n, 2)= n × (n−1) Saludos, sigue asi :)
@Renzofranche7703 жыл бұрын
Hola tengo 17 años y soy un estudiante de ingeniería informática. Tu canal me ayudó e inspiró mucho, graciaaaaaasss:)
@DavidCervantes.3 жыл бұрын
Podemos tener un arreglo de variables que "abren" ({[ y otras que "cierran" )}]. Siempre podemos permitir que allá variables que abren, estás las escribimos en una pila, pero si se detecta que hay una que cierra está la tenemos que comparar con la cabeza de la pila, y si es la misma está bien, se sigue iterando a las demás posiciones haciendo lo mismo. Pienso que está podría ser una solución... Aunque tal vez no la más óptima. Excelente video!
@fedegregori3183 жыл бұрын
Betta muchas gracias por estos videos, para estudiantes de ing son un camino hacia la luz! Saludos y ojalá siga la serie!
@19JVC683 жыл бұрын
Lo felicito por su valiosa colaboracion para los que estamos en este mundo de la programacion, que no es saber programar, si no es saber la logica de lo que se esta haciendo, muy clara su explicacion, estaremos pendientes de sus proximos videos, Feleicitaciones
@tutistar963 жыл бұрын
Recuerdo haber visto ese problema en la materia de compiladores cuando estaba en la universidad, me dieron ganas de leer esos apuntes de autómatas y pilas.
@eloscmao69453 жыл бұрын
Felicitaciones, explica muy bien todo se hace fácil. Espero el próximo video. Saludos desde Colombia.
@Luis-ww1kx3 жыл бұрын
10:00 no es n al cuadrado, es n * (n - 1); esto es porque no puedes viajar desde el punto a al a... ya estás ahí 😅
@gidraxl.60823 жыл бұрын
tienes razon, sin embargo es mejor utilizar una cota superior fácil de usar como n * n y ademas, es más comprensible
@rbjmalca23 жыл бұрын
de razón no le llamaron
@VallenatoDelAlma3 жыл бұрын
Tenia el mismo comentario, chevere la aclaración, buenos videos saludos
@grl41713 жыл бұрын
@@gidraxl.6082 ¿por qué es más comprensible?, todas las combinaciones posibles es n por n --> n^2 de ahí quitas lo que por condiciones de contorno no se puede dar , no valen combinaciones contigo mismo le restas n (que son los elementos únicos) no te valen permutaciones divides entre dos. Es combinatoria básica, cualquier ingeniero debería pensar así y no en una fórmula al aire genérica, porque cada problema es un mundo.
@gidraxl.60823 жыл бұрын
@@grl4171 claro pero a efectos prácticos se usa una cota superior sencilla. En este caso n^2. Si quieres mas información investiga sobre "Big-O notation"
@javieraleangonzalez47863 жыл бұрын
Ahhhh, Primer Comentario, felicidades por tus videos, cada día mejoran más (producción) y se vuelven más interesantes, Saludos desde Colombia!!!
@BettaTech3 жыл бұрын
Gracias y saludos desde España!! :D
@joaquinvilchez58463 жыл бұрын
Genial!! Ojalá a puedas hacer mas ejercicios prácticos sobre diseño de sistemas, no hay mucha data de eso... Gracias
@kingskull6193 жыл бұрын
Con neo4j xD
@eduardozepeda19723 жыл бұрын
Hay un ejercicio parecido en js-assesment de github. Son una serie de problemas para evaluar el conocimiento de Javascript, están interesantes.
@UskoKruM20103 жыл бұрын
¡Excelente video, Martín! Saludos! 👋🏻👋🏻
@fernandiwxbc133 жыл бұрын
Me gusta la solucion que diste, simple y real. De igual forma, generaria un microservicio dedicado a los vuelos (o abstraerlo por completo a un servicio de consulta y reporte y usarlos desde otros microservicios si esta tarea se piensa extender a mas entidades), y si no es mi prioridad controlar de alguna forma especifica la cola de peticiones y como atenderla usaria alguna base de datos en tiempo real o un CaaS (los cuales incluso ya manejan la logica de Key/Value) y delegar la concurrencia a un recurso dedicado a esto. Editado: Creo que para el problema del final de video, si el lenguaje lo soporta utilizaria una regular expression, pero desconozco si es la mejor alternativa.
@GerentedeSistemas3 жыл бұрын
Una de las entrevistas para un puesto laboral mas difícil que me sucedió, no fue precisamente técnica, si no fue una mesa redonda entre 5 entrevistadores y yo, todos ellos expertos en diversas áreas, tuve a mi favor que me desenvuelvo muy bien en cualquier nivel y eso fue el valor diferente por el que me dieron el puesto de Gerente de tecnologías de información y procesos para una entidad de gobierno, mas allá de mi pericia técnica y el PMP.
@jonthan343 жыл бұрын
Me gusta mucho el contenido. Por favor mantén el formato... primero intro luego publicidad 👍🏼
@yumix772 жыл бұрын
Interesante video. Solo un pequeño comentario. En la solución al problema de la doble escritura en la base de datos mencionas que debe ser atómica, y en el caso de la base de datos relacional transaccional. Realmente eso no es suficiente, porque depende del aislamiento de dicha transacción. Si el aislamiento es serializable o lectura repetida si funcionaria, porque hace un lock de dicha linea de la base de datos, pero si es otro tipo de aislamiento como "read comitted" (por defecto por ejemplo en Oracle) "read uncommitted", entonces podrías tener exactamente el mismo problema, independientemente de que la ejecución sea transaccional o atómica.
@mauroquiroga2253 жыл бұрын
Muy buena toda la info que aportas y con la buena calidad que lo haces. Super agradecido, me gustan mucho esta serie de videos.
@shelu173 жыл бұрын
Diría que falta un sistema de colas como kafka , rabbit y el evento de dominio a encolar es la consulta de pares de aeropuertos/ciudades. Un saludo ! :) gran video !
@estrelladelsurjudiciales52592 жыл бұрын
Buenas humilde aporte, si para identificar un aeropuerto solo se cuenta con 3 caracteres, ejemplo el primer aeropuerto AAA y el ultimo ZZZ por combinatoria ( son 26 si no contamos la Ñ) 26 X 26 X 26 = 17.576, según comentas te informaron que son 40.000 aprox. así que estimo que serian del tipo char y también numéricos, ( letras 26 + números 10 ) 36 X 36 X 36 = 46.656.- (este nro es el máximo alcanzable ) Esta forma de verlo puede ayudar a estimar, si es que no se cuenta con el dato de que hay 40.000 aeropuertos,. O para saber cual seria la maxima capacidad posible (46.656 todas las combinaciones ) y la capacidad real los aeropuertos funcionando ( 40.000 aprox ).-
@sentadoensilla3 жыл бұрын
Muy buena forma de resolverlo! Yo hubiera pensado en hacer una tabla de registros tipo bitácora: bitacora(idreg int, fecha timestamp, ip text, navegador text, os text, origen text, destino text ) index (fecha, origen, destino) sin PK o FK, registrando con la API todas las búsquedas, Luego ampliar la API para que consulte dicha tabla cada N segundos, devolviendo los pares origen-destino con su frecuencia de acuerdo al mes actual o un período específico de tiempo. Claro que también se podrían saber sólo los destinos, los orígenes u otros datos de acuerdo a la tabla. El único prooblema sería que de acuerdo a la cantidad de registros, la consulta cada N segundos sería más o menos impactante para la DB.
@jorgelopezcabrera16583 жыл бұрын
Para el problema de la concurrencia, yo lo resolvería con un procedimiento almacenado en la DB, la base de datos automáticamente se encargaría de gestionar la cola de ejecución del procedimiento y mantener la secuencia de los datos
@kingskull6193 жыл бұрын
El problema se soluciona con un stack Iteras por cada carácter, si es un carácter de apertura "( [ {" lo metes al stack. Si es de fin ") ] }" haces pop, y checas, si el carácter del stack no coincide con el de fin (paréntesis con paréntesis y así) si no coincide está mal y lanzas un error. Si si está bien continuas. Si al final de iterar el strings el stack está vacío está correcto, si aun tiene valores está mal.
@popularfan58933 жыл бұрын
Puedes hablar del tema seguridad, autenticacion en webservices ? Es decir que solo puedan acceder al webservices solo ciertos clientes y que ademas los datos esten de alguna manera encriptados.
@marcjall3 жыл бұрын
😮 top video. El mejor en Español. Compartiendo!
@arnaucastellvi3 жыл бұрын
Se puede reducir un poco el tamaño suponiendo que el origen y el destino no sera el mismo aeropuerto, por lo que serian 40.000 X 39.999 pares. Por otra parte, yo habría presentado los datos en capacidades binarias (MiB y no MB), pero eso va a gustos.
@andresandreti3 жыл бұрын
siendo más rigurosos seria permutado 2, además tampoco se especificó si se debe diferenciar los viajes de A a B y de B a A, si no es necesario seria combinado 2.
@pepeluis7663 жыл бұрын
Muy buen vídeo y solución al problema. Se me ocurren un par de optimizaciones, crear una tabla de destinos con un id autoincremental y el nombre. Luego trabajar en la tabla muchos a muchos destino-destino con los id, creo que las lecturas-escrituras y espacio de esa tabla se optimizaría. Otra mejora que se me ocurre podría ser un sistema de replicación de información con servidor de bases de datos maestro y varios esclavos. También existe la posibilidad de crear una caché en el cliente que accede a los datos (actualizando la caché de manera asíncrona) para que tenga la última versión de la base de datos. Esto puede traer problemas pero es otra opción. Gracias por el vídeo, está genial!
@Swilarx193 жыл бұрын
Pues fue un buen video, me agrada este tipo de problemas que desarrollan habilidades para ser un buen programador, estuvo increible espero mas resoluciones así y tambien sugerencia para practicar nosotros tambien! Aún no me han preguntado ello estoy en la facultad aún pero gracias!.
@franciscojesusmartinezdura47483 жыл бұрын
Mola mucho esto de proponer problemas y resolver lo en el próximo vídeo 👏
@aigon7773 жыл бұрын
Para no generar bloqueos, si este proceso no fuese crítico, podrías usar una cola de mensajes. Publicas ahí una nueva "búsqueda", y otro proceso se encargaría de ir consumiendo esa cola de mensajes. Puede parecer muy lento, pero realmente funcionan muy rápido y son muy versátiles.
@aigon7773 жыл бұрын
Y como seguramente tengas los aeropuertos en otra tabla, puedes hacer que la clave sean id de aeropuerto A, e id de aeropuerto B, reduciendo el tamaño de la base de datos.
@gustavoandres17923 жыл бұрын
Muy bueno el video, pero si trabajas con tablas sql, podrias sin necesidad de atomizar la consultar (es decir meterla en una transaccion esperando a otra consulta), realizar un update en la cantidad haciendo UPDATE table SET cantidad +1 where key = "clave q lei", es decir la suma no depende de la concurrencia sumas 1 al valor de la cantidad q ya estaba independientemente de la lectura
@carsdfj3 жыл бұрын
Excelente serie de vídeos para estudiar y la explicación va muy de la mano Gracias un saludo desde Venezuela
@EzequielRegaldo3 жыл бұрын
Se me ocurre un modelo mejor : { from : (aeropuerto), to : (aeropuerto), flights : (number) } con eso podrías usar un grafo :P
@LuisLopez1099llg3 жыл бұрын
El problema del final me lo dejaron de tarea en la universidad :0 Jaja
@lucaslorenzo3613 жыл бұрын
Alguien más está viendo este video sin saber casi nada de programación y no entendiendo una mierda salvo los nombres como "sql, mongo, etc" ? jajaja quisiera saber tanto como esta persona :( buenos videos crack!
@pablopalma28623 жыл бұрын
La concurrencia es cuando dos procesos se ejecutan al mismo tiempo. El problema con esto es que al haber mas de 1 proceso accediendo a los mismos datos, estos pueden que no se guarden segun lo esperado y que haya algun conflicto. Por eso la solucion propuesta por Betta es que solo se permita acceder a la BD de modo sincrono, que no haya mas de un hilo a la vez modificando los datos. Eso para evitar posibles conflictos con los datos. Depues hablo de la estimación del tamaño, aca dijo que cuanto es el peso aproximado que puede llegar a tener la base de datos, asi como cualquier archivo, una musica, una imagen, en este caso una base de datos. El calculo los posibles datos que se pueden guardar en ella y asi sacar una estimacion de lo que va a pesar la base de datos. Igual si no entendiste el video, menos creo que entendas esto jaja, pero bueno volve a ver el video e intenta buscar en el google lo que no tendas bro. Suerte y a seguir dandole!
@22panchy3 жыл бұрын
Bonito problema final. Existen dos aproximaciones. La corta y bonita sería una función recursiva pura, pero hay que tener cuidado con el tamaño de la pila de llamadas, por otro lado está la forma liosa pero más eficiente, que sería una función iterativa.
@LuisRuizHalo3 жыл бұрын
Una opción práctica para un sistema con una buena carga sería poner un collector de datos con un simple endpoint (potencialmente pudiendo ser gRPC streaming unidireccional) que envíe datos periódicamente de los vuelos a través de un stream (AWS Kinesis o Apache Kafka), el cual contenga un grupo de consumidores donde se encuentren los nodos workers (procesadores) que se encarguen de agregar los datos en el data lake Key-Value (potencialmente pudiendo ser una tabla AWS DynamoDB). Cabe recalcar que, como siempre, nuestros procesadores deben cumplir con la regla de idempotencia. Para finalizar, la aplicación GUI de analítica hipotética lee de este data lake los agregados en tiempo real con algún websocket o usando igualmente gRPC con streaming full-duplex.
@LuisRuizHalo3 жыл бұрын
PD: Se puede tener una arquitectura completamente serverless con AWS Kinesis o SNS/SQS, Lambda, DynamoDB, Route53, CloudFront y API Gateway. (Sin contar S3 con CloudFront para algún sitio web para la aplicación GUI)
@josevicente6323 жыл бұрын
Excelente por favor màs contenido sobre diseño stmas como este video..saludos desde Colombia!!!
@ManuelMartinez-sl7op3 жыл бұрын
Me queda la duda al igual que a varios, ya que al hacer n^2 se piensa en una permutaciones es decir la conexión Madrid-Barcelona y Barcelona -Madrid cuentan como pares distintos, el problema inicial nos pedía que contaramos la petición en un par de aeropuertos dado, que no sería mejor pensar en un combinación es decir n! /((n-2)!2!), que daría la mitad del cálculo original, ya que da lo mismo el orden de donde se haga la petición solo importa el par de conexión???
@dan65773 жыл бұрын
Hola, me llamo Daniel De Paz saludos desde El Salvador, me pareció bastante interesante el ejercicio que dejaste al final del video así que me puse a resolverlo, no sé si sea la mejor forma de hacerlo o esté totalmente correcto ya que solo hice algunas pruebas pero aquí lo dejo por si lo quieren revisar, lo hice en javascript: const validateBrackets = (textToTest) => { let valid = true; let charArray = textToTest.split(''); let map = new Map([ ['{',{rep:0,pos:[]}], ['[',{rep:0,pos:[]}], ['(',{rep:0,pos:[]}], [')',{rep:0,pos:[]}], [']',{rep:0,pos:[]}], ['}',{rep:0,pos:[]}], ]); let closingBrackets = new Map([ [')',{opos:['{','['],recipr:'('}], [']',{opos:['{','('],recipr:'['}], ['}',{opos:['(','['],recipr:'{'}], ]); charArray.forEach((char,index) => { map.set(char, { rep:(map.get(char)===undefined)?1:map.get(char).rep+1, pos:(map.get(char)===undefined)?[index]:[...map.get(char).pos,index], }); if(closingBrackets.get(char)){ let recipr = closingBrackets.get(char).recipr; closingBrackets.get(char).opos.forEach(c => { if(map.get(c).pos[map.get(c).pos.length-1]!==undefined) if(map.get(c).pos[map.get(c).pos.length-1]>map.get(recipr).pos[map.get(recipr).pos.length-1]) valid = false; }); map.get(recipr).pos.pop(); } }); return valid; } console.log(validateBrackets("[()([)]")); //Incorrecto console.log(validateBrackets("[()()]")); //Correcto console.log(validateBrackets("[()]{}{[()()]()}")); //Correcto console.log(validateBrackets("[(])")); //Incorrecto
@Unknown9713 жыл бұрын
Muy buen video, muy util la verdad. Me genera una duda en el punto de hacer una transaccion atomica, ya que a mi me gusta mas es estilo de tener la logica en un solo lugar (por ejemplo, generar tablas virtuales para trabajar con los datos, como por ejemplo entity framework), ya que lo considero mas ordenado que tener logica en la base de datos y en la aplicacion en si. ¿Sabrias cual seria el equivalente (o de que forma se haria) para hacer esto desde el lado de la aplicacion?
@CulturaDevOps3 жыл бұрын
buenisimo este video gracias por comparti esto
@djthdinsessions3 жыл бұрын
Un redis te lo resuelve en dos patadas y ya tiene la instrucción incr que es atómica y te quitas el problema de concurrencia, gestion de bbdd y demás de un plumazo
@Kevin-et9jy3 жыл бұрын
Molaría un video sobre ACID vs BASE y llegar un poco a las bases de datos de grafos como Neo4j
@marioagostinelli5827 Жыл бұрын
12:58 en este caso, no seria necesario tambien contabilizar desde B-A? para diferenciar el lugar de origen/destino?
@MinombreesSergio2 ай бұрын
Pues no sé yo, yo lo hubiera planteado guardando cada búsqueda con su IP, ubicación, y un token de usuario, para luego tener esa data para minería o para Big Data, pero claro, depende mucho de lo que necesite el producto.
@sadielottenwardel3313 жыл бұрын
Me gustan mucho estos vídeos, aprendo muchísimo
@nicolasa.bermellferrer80253 жыл бұрын
Me encanta este canal
@MaximoPower20243 жыл бұрын
Como no sé mucho de bases de datos, mi solución al problema fue otra: tenemos un conjunto de arrays, pongamos 100 diferentes, y cada uno de ellos tiene 100 valores, consistentes a su vez en un array inicialmente vacío. Cada vez que entra una nueva consulta de aeropuertos del frontend, obtenemos un número aleatorio de 1 a 10.000, creamos un objeto que represente la solicitud (el más simple sería una cadena de 6 caracteres) y lo añadimos al array correspondiente al número aleatorio. De esta manera, podríamos tener a miles de usuarios enviando datos a la vez sin apenas colisiones (un porcentaje despreciable). Luego, cada cierto periodo de tiempo, por ejemplo una hora, copiariamos los arrays, los reseteariamos, y con los datos de las copias haríamos la operación de incremento en la base de datos. Con esto tanto las colisiones como el tiempo de inactividad sería mínimo. Hay que tener en cuenta que hacer muchas operaciones pequeñas en una base de datos supone una gran cantidad de tiempo, lo que su vez incrementa la probabilidad de que se produzcan cuellos de botella. Por eso me parece interesante solucionar el asunto en el nivel previo, en lo que sería la RAM.
@andresmauriciovalderramagi61383 жыл бұрын
Los pares de aeropuerto a-b no seria 40000 combinado 2?? O en su defecto 40000 permutado 2??
@SolucionesELP3 жыл бұрын
Tal vez usando diccionario en python con key los aeropuertos A y B, el valor las veces que se repite.
@kaelt753 жыл бұрын
Hola, genial todos tus videos :D, muchas gracias por ellos. Solo me quedá una duda, ¿durante la entrevista lo que tu entregaste fueron los dibujos que nos mostraste?
@maxbarcon3 жыл бұрын
Problema: Tendría una variable para cada caracter y iteraría por la string, cada vez que me encuentre un carácter abierto ( [ { le sumo 1 a su correspondiente variable y si está cerrado ) ] } le resto 1, en caso de que cualquiera de las variable sea negativa significa que se ha cerrado más veces de las que se ha abierto y termino el bucle y devuelvo false, si se termina el bucle y cualquiera de las variables es mayor que 0 significa que se ha abierto más veces de las que se ha cerrado y devuelvo false, si no, pues es que es correcto :D
@BettaTech3 жыл бұрын
Cómo se comporta tu algoritmo con el siguiente string 🤔? [{]} (debería dar false porque no está bien construido)
@maxbarcon3 жыл бұрын
@@BettaTech Buff esto me complica las cosas. No se si se puede continuar como lo estaba haciendo pero tengo otra solucion :) Lo que haría sería una pila de carácteres y cada vez que llegue un carácter abierto se pondría en la pila, cuando llegue uno cerrado, mirará en la cima y si es su carácter opuesto lo "quitas" de la pila, en caso contrario o en el caso que la pila no quede vacía al final de la iteración, es que no es correcto.
@joaquinllallire67443 жыл бұрын
@@BettaTech Si pongo esa cadena efectivamente sale false. Lo hice con Javascript tu creas que lo puedas revisar he probado con varias cadenas y hace la validación correctamente. Te dejo el link del código paiza.io/projects/CcIW9gY6Y9YxpgXS3Cl-IQ#&togetherjs=kf8MTAe0Uq
@ElIncreibleCptSpiff3 жыл бұрын
Me encanta este tipo de contenidos. Muchas gracias, crack!
@junama3 жыл бұрын
16 Gb de sistema concurrente me parece que puede haber cuello de botella en el motor de base de datos, depende de cuántas búsquedas por segundo se hagan, yo empezaría a mirar sistemas cloud que aceptaran colas de mensajes, y que cada mensaje fuera a una función lambda creada para cada par de asociaciones (limitada a concurrencia 1), y desde ahí simplemente crear un archivo en DynamoDB e ir incrementándolo en cada llamada. Y a pesar de que Mongo te da opción para incrementar, y veo bien comentarlo, creo que en rendimiento en paralelo pierde mucho
@pablopalma28623 жыл бұрын
Si 16 gb de datos, cada consulta puede demorar una eternidad, imaginte si son miles de consultas por segundo. Te hago una consulta bro, si los datos se acceden de forma asincronica en diferentes hilos, supuestamente se dice que es mas rapido que acceder de forma sincrona, ¿esto es cierto? si fuese falso es preferible que los datos se accedan de forma secuencial y no paralela. Así mentenemos integros los datos sin causar algún conflicto creo yo
@paumasabad14493 жыл бұрын
¡Gran video! Tengo una duda acerca de la orientación laboral: si quiero ser software developer pero elijo la mención en tecnologías de la información, me será más difícil?
@lolimilesi12913 жыл бұрын
el ejercicio se puede hacer con una expresión regular?
@erickhilario87823 жыл бұрын
He visto que sí es posible
@samuelfarfan30623 жыл бұрын
Muy buen video, cada vez estan mejores muchas felicitaciones
@ciberhormaza3 жыл бұрын
yo lo habría hecho con una combinación de microservicio+logstash, podria solucionar el desafío y servir para explotar mucha más información
@aprende-computacion2 жыл бұрын
40k^2 no creo, quizás sería 40k^2*media de conexiones de un aeropuerto no?, que opinas?
@Soy_Kenneth19933 жыл бұрын
Yo había hecho un Dashboard con algo parecido a lo que presentaste
@meiffel48743 жыл бұрын
tengo una duda... es valido responder con un diagrama de flujos? casos de uso? es que ando viendo la materia y no veo donde entran estrcutruas si todo es codigo y corridas en frio :C , muchas gracias por el video esta genial tu canal!
@JuanCamiloSutachanTrujillo3 жыл бұрын
El número de pares que tendrías no sería 40000 choose 2? Porque que n^2 sólo es el número de formas en que podemos combinar todos los elementos.
@alfoorego83803 жыл бұрын
7:40 Eso se resuelve si metes la actualización en una transacción
@migcon673 жыл бұрын
Muy bueno como siempre. el universo es confuso realmente
@pablino234 Жыл бұрын
Todo es UML de casos de uso cierto ?
@CragCode3 жыл бұрын
El ejercicio del final ya lo habia visto en codewars
@vidasimple66113 жыл бұрын
9:51 40mil al cuadrado? 🤔 Si no me equivoco sería factorial, ya que descartas los que salen y van al mismo sitio. Si tenés 3 aeropuertos, A, B y C tenemos los pares A-B, A-C, B-C, B-A, C-A y C-B... 3! No 3cuadrado (no contas A-A ni B-B ni C-C)
@BettaTech3 жыл бұрын
Seria N * (N - 1), pero cuando te acostumbras a hacer cotas superiores, acabas simplificando casi todo como si fuera asintótico, que es lo que me ha pasado aqui xD (O(N*(N-1)) es equivalente a O(N*N))
@ThePomelo093 жыл бұрын
Buenas, como estas? que libro, curso/tutorial completo me recomiendan para empezar de cero con diseño de sistemas?
@marlon50133 жыл бұрын
Hola, yo lo solucionaría usando un stack, algo más o menos así. static String isBalanced(String stringToCheck) { Stack stack = new Stack(); for (char currentChar : stringToCheck) { if(isOpening(currentChar)) stack.push(currentChar); else if(stack.isEmpty()) return "INCORRECTO"; else if(isComplement(stack.top(), currentChar)) stack.pop(); else return "INCORRECTO"; } if(stack.isEmpty()) return "CORRECTO"; return "INCORRECTO"; }
@jcoucelanga43733 жыл бұрын
ciclomatic complexity over 5 please review your code :D
@leow3753 жыл бұрын
Muy buen video betta!!
@Alkchofa3 жыл бұрын
Me gusta pensar este problema con una base de datos basada en grafos.. Por alguna razón no sería una buena idea? 🤔
@claudioj.45123 жыл бұрын
¿No estarías cometiendo un error en dejar en la tabla los pares de aeropuertos como strings?. En otra tabla deberías poner los 40000 aeropuertos con una clave numérica asociada y luego en la tabla de registro hacer referencia a esas claves numéricas en vez de utilizar un string de 6
@vicenttortosa76802 жыл бұрын
No hay 400^2 pares… hay que restarle 40K para quitar los emparejamientos con uno mismo
@dalilabenkaddour67673 жыл бұрын
Aquí está mi solución al problema del final: github.com/satinfive/betta_tech_string_problem Muy interesante el planteamiento del sistema :) Muy similar a lo que se me hubiese venido a la cabeza en primera instancia, aunque agradezco la completitud del planteamiento, llegando a analizar hasta cuánto ocuparía la BD. Si bien al principio pensé en un sistema de colas, quizás, pero a lo mejor se hacía demasiado para el planteamiento del problema. ¡Gracias!
@relarbaelish3 жыл бұрын
No deberían ser 7 bytes para el key? Faltaría el guión que separa a los dos aeropuertos. Por cierto, el problema final creo recordar que se resuelve con pilas (creo haberlo visto en Sintaxis y Semántica de los Lenguajes).
@heatxtm3 жыл бұрын
te puedes ahorrar el guión, ya que siempre son 3 caracteres en los códigos de aeropuerto al leerlo después, tan solo haces el split
@flavioe.salasm.99222 жыл бұрын
todo esto se resuelve con programacion del lado del servidor de bases de datos... procedimientos almacenados
@PositronQ3 жыл бұрын
Se que esto es algo de pila y se necesita conocimientos de paréntesis balanceados en donde si lo hacemos en Python lo haría con la librería import pila
@lucian13203 жыл бұрын
Que buena serie de videos!
@BettaTech3 жыл бұрын
Gracias!!!!!!
@johncerpa37823 жыл бұрын
Buen video
@awakt3 жыл бұрын
El numero de pares no debería ser 40.000²-40.000? Dado que un aeropuerto no se puede tener de par a sí mismo
@Marcos-pm4zo3 жыл бұрын
deberia ser de hecho 40000!/(40000-2)! no? Variaciones de (m) 40.000 elementos tomados de (n) 2 en (n) y sin repetición (como dices no se puede tener en cuenta un Madrid-Madrid o un BCN - BCN). Si no recuerdo mal la formula era m!/(m-n)! (que, efectivamente, cuando los elementos se toman de 2 en 2 equivale a m² - m como tú has dicho)
@MaximoPower20243 жыл бұрын
Si te pones así, igual no son 40.000 sino 38.592.
@Marcos-pm4zo3 жыл бұрын
@@MaximoPower2024 por qué?
@MaximoPower20243 жыл бұрын
@@Marcos-pm4zo Pues porque el número exacto de aeropuertos no es 40.000. La diferencia entre esa aproximación y el número real es probablemente mucho mayor a la diferencia entre 40.000 al cuadrado y 40.000! / (40.000 - 2)!, que es relativamente pequeña. Entiendo que por eso lo simplifica diciendo 40.000 al cuadrado.
@Marcos-pm4zo3 жыл бұрын
@@MaximoPower2024 sí, eso es cierto, simplemente me había extrañado el cálculo no por la exactitud si no por el error en el método xD
@sebasppp3 жыл бұрын
Nuevo sub. Gracias
@PterPmntaM3 жыл бұрын
Buen video amigo, sirven mucho este tipo de videos, ya que no todo es programar y por que si, pero tengo una duda, ¿Cuál sería la razón de guardar el nombre de los aeropuertos por siglas acorde a sus nombres?, hago dicha pregunta, por que no le veo sentido a eso, me explicaré más abajo. Dicho problema si es para un aeropuerto, que debe serlo, ya ellos deben contar con la información de los aeropuertos, o al menos de los cuales a donde envían vuelos y de donde llegan, aunque por otro lado, viéndolo, parece un problema de una empresa de venta de pasajes para los aviones, el cual también, ya deben contar con una gran cantidad de dichos registros de aeropuertos por ciudad, por ende deben tener ya una tabla en la base de datos de los nombres de las ciudades, que a su vez, deben estar asociadas a países, y que a su vez cada ciudad debe tener asociada su aeropuerto. Entonces, si lo que se desea es ir acumulando el número de veces que alguien consulta un vuelo, guardando la ciudad de donde sale el vuelo hasta donde va a llegar, no bastaría con guardar el código de la ciudad de salida con la de destino y otro campo con un número entero de las veces de la consulta, ósea: Barcelona (001) - Madrid (002) - 5 Los números al lado de cada ciudad serian los códigos de registros en sus tablas de origen, y serian estos los que se guardan, o más bien, serian llaves foráneas en dicha tabla nueva, que se podría llamar **Consultas_Solicitudes**
@MaximoPower20243 жыл бұрын
Con eso consigues cambiar una cadena de 3 caracteres por un entero en el intervalo 1-40.000. No tengo muy claro que valga la pena. Sobre todo si piensas que pueda haber varios frontend diferentes llamando a las apis, y que si uno de ellos tiene los códigos equivocados, vas a corromper todos los datos.
@PterPmntaM3 жыл бұрын
@@MaximoPower2024 No pueden existir errores si la información, ya que estás tomando datos que provienen de una tabla principal, la cual seria aeropuertos, por llamarla así, si tienes errores, entonces proviene de la principal, esta proviene de la tabla principal, y una de las cosas que las bases de datos buscan es evitar la redundancia, por eso pregunto, cuál es el sentido de guardar los nombre si ya están. Por otro lado, con relación a los enteros, ya también antes me lo preguntaba, y pasa que las consultas que se realicen sobre valores enteros, resultan ser más rápidas que si es por texto o cadenas de texto, por eso muchas veces puedes ver que una tabla la dejan con campos autoincrementales, por que resulta práctico por un lado, y al momento de consulta resulta más rápido. Pero aclaro, eso es como yo lo haría, solo guardo el código de cada aeropuerto y de la ciudad, y otro campo que seria como un contador de cuantas veces han realizado dicha consulta.
@MaximoPower20243 жыл бұрын
@@PterPmntaM Piensa una cosa. Cada web de reserva de vuelos tiene un frontend que tiene que comunicarse con la Api que interactúa con la base de datos. ¿Cómo haces para que todas esas webs, pongamos que sean 100 ó 200, tengan sincronizada la misma tabla de aeropuertos, y nunca se produzcan errores? Sin duda en un mundo perfecto es posible lograrlo, pero en el mundo real los errores suceden. Por ejemplo, tal vez algunas webs tarden en actualizar el cierre de algún aeropuerto o la creación de alguno nuevo. Ahí se pueden deslizar errores que con las cadenas son muchos más difíciles. El eslabón débil de este sistema es la base de datos, debido al riesgo de que se creen cuellos de botella o se pierdan datos. Crear un nuevo punto débil para lograr una pequeña ganancia en eficiencia puede ser un error. No siempre es adecuado hacer las cosas de la manera más eficiente posible.
@PterPmntaM3 жыл бұрын
@@MaximoPower2024 Creo que estás mezclando dos cosas una cosa es el front end y otra es el back, el front yo puedo decidir que se muestra y que no, pero si las 100 o 200 webs que existen se alimentasen de una misma empresa que diseña todo, y ocurre un error, el error va a duplicarse si duplicas la información. Voy a explicarte con más detalle y con otro ejemplo para que entiendas: Países, Ciudades, Aeropuertos. Un País tiene una relación de uno a muchas ciudades, ósea de 1 a n. Por otro lado una ciudad puede tener uno o varios aeropuertos, ya que no se especifica en el problema, entonces se podría convenir que una ciudad tiene un solo aeropuerto, entonces es una relación de uno a uno. Si se necesita tener un registro de cuáles son las consultas que las personas tienen tanto de salida del vuelo como destino, yo no necesito guardar el nombre del aeropuerto, por que para eso le doy un código único que lo identifique, y lo mismo a cada ciudad y a cada país, así me evito que por alguna razón una ciudad se llame igual que otra, por que eso puede pasar, o quien sabe si un aeropuerto, se llegue a llamar igual que otro, vaya uno a saber cosas a futuro. Entonces si ya tengo un código único, simplemente registro los códigos y la cantidad de veces que se realiza dicha consulta la voy actualizando. Ahora si hablas de que el front, yo en el front lo que veo que hacen esas páginas de las empresas, es ponerte un menú dropdown o lista desplegable donde salen el nombre de las ciudades acorde a un país que tú eliges como destino y como salida del vuelo. Entonces, tú en el menú puedes ver Los nombres de los países y ciudades, pero al momento de darle consultar o que se actualice la página, ya que puede tener un evento que se ejecute cuando cambie la información en el menú desplegable, lo más seguro es que envíen el código único de cada ciudad y país, y estoy casi seguro que es numérico.
@MaximoPower20243 жыл бұрын
@@PterPmntaM Los códigos en forma de cadenas de 3 letras de los que habla en el libro son códigos únicos que representan a los aeropuertos. Que en algunos casos coincidan con nombres de ciudades es irrelevante para el problema que estamos tratando. Tanto la solución que propones tú como la que se propone en el vídeo usan códigos únicos para los aeropuertos. La diferencia es que en tu solución, cambiar una cifra en algún sitio va a generar un error potencialmente más difícil de detectar. ¿Vale la pena a cambio de un poco más de eficiencia? Puede ser. Yo pienso que no.
@Dev403M3 жыл бұрын
Gran video!!! Saludos!.
@BettaTech3 жыл бұрын
Gracias! 😊
@francocaballero48353 жыл бұрын
Excelente!!!
@BettaTech3 жыл бұрын
Gracias!!!
@IsraelBuitronD3 жыл бұрын
Tengo una duda. Dices que hay aproximadamente 40,000 aeropuertos. Cada aeropuerto tiene como identificador una cadera de tres caracteres. Suponiendo que está cadena está en un alfabeto de 29 caracteres (latino). Sólo 24,389 (29^3) -poco más de la mitad- aeropuertos pueden tener un identificador único. ¿Cómo identificas los demás aeropuertos?
@rafaelpereiraarias3 жыл бұрын
Para cuando un video con el canal @holamundo?
@espinetegarcia3 жыл бұрын
En python se resuelve ese problema con un diccionario y una lista :D string = '[()]{}{[()()]()}' pairs = { '(' : ')', '[' : ']', '{' : '}' } last_seen = [] for n, char in enumerate(string): if char in pairs.keys(): last_seen.append(char) elif len(last_seen) and pairs[last_seen[-1]] == char: last_seen.pop(-1) else: print(string) print((n)*' ' + '^') exit(0) print('Correcto')
@kketoo_3 жыл бұрын
Me ha gustado mucho la idea de proponer un problema. Te mandamos la solución y lo comentas en el siguiente video?
@BettaTech3 жыл бұрын
En el siguiente video propondre una solución y enseñare las que me hayan parecido interesantes ☺️
@boomboom-94513 жыл бұрын
Saludos mi querido amigo BettaTech, esta es mi solución a tu problema al final del vídeo. Cuéntame que tal te ha parecido, que opinas de ella? He usado hash tables y stacks const input = process.argv[2].split(''); let hashTable = { '(': ')', '[': ']', '{': '}' }; let stack = []; for (let i = 0; i < input.length; i++) { if (input[i] in hashTable) { stack.push(input[i]); continue; } if (stack.length != 0 && input[i] == hashTable[stack[stack.length - 1]]) { stack.pop(); if ( i+1 == input.length ) { console.log(true); return true; } continue; } console.log(false); return false; }
@finnelhumano33263 жыл бұрын
Creo que esto se llama el problema de los lectores y escritores en programacion concurrente.. Se resulve con semaforos o monitores (al menos asi me lo enseñaron a mi)