From gorka en getmanfred.com Mon Jul 1 13:21:52 2019 From: gorka en getmanfred.com (Gorka Puente) Date: Mon, 01 Jul 2019 17:21:52 +0000 Subject: [Python-es] =?utf-8?q?=5BJOB=5D_Senior_Python_Developer_=28entre?= =?utf-8?b?IOKCrDI3SyB5IDM2LjAwMOKCrCkgcGFyYSBHbGFtcGluZyBIdWIgKFNldmls?= =?utf-8?b?bGEp?= Message-ID: Hola, Soy Gorka, de Manfred ( https://www.getmanfred.com/ ) , una agencia de talento. Estamos buscando gente para nuestros amigos de Glamping Hub, la plataforma de reservas de alojamientos *únicos en la naturaleza. * En este enlace podéis encontrar la oferta con todos los detalles:  https://github.com/getmanfred/offers/wiki/Senior-Python-Developer-(entre-%E2%82%AC27K-y-36.000%E2%82%AC)-para-Glamping-Hub-(Sevilla) Pero como resumen, estamos buscando desarrolladores/as senior de Python (5 años de experiencia) que hayan trabajado con Django (3 años de experiencia). Trabajarían en uno o varios de los verticales (proyectos internos o áreas) que tiene la plataforma: en la parte de SEO, internacionalización, en la parte de privada para guests y hosts... En la oferta está más explicado.  Las oficinas están en el centro de Sevilla (junto a la plaza de El Salvador), y ofrecen: * Salario de entre de *?27K y ?36K bruto anual* * *Horario flexible* de entrada, los *viernes trabajan 5 horas* y la *jornada semanal son 37h*. * 22 días de vacaciones al año (libertad de disfrute) y 3 días de asuntos propios * *12 días de trabajo en remoto al año* pudiendo acumular 3 días seguidos. * Acceso a *formación* * *Clases de inglés gratuitas* a través de un programa con profesores de diferentes nacionalidades * *Eventos anuales* : Sports day, Beach day, Thanksgiving, General Assemblies o GH Talks * *Gift card valorada en 250?* * Descuento en *seguro de salud* de la empresa ¡Ah! y si hay perfiles juniors también :)  https://github.com/getmanfred/offers/wiki/Junior-Python-Developer-(entre-%E2%82%AC22K-y-27.000%E2%82%AC)-para-Glamping-Hub-(Sevilla) Un saludo, Gorka Sent via Superhuman ( https://sprh.mn/?vip=gorka en getmanfred.com ) ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcaballero.hep en gmail.com Tue Jul 2 19:58:19 2019 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Tue, 2 Jul 2019 19:58:19 -0400 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= Message-ID: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Hola, a un colega le han preguntado durante una entrevista de trabajo lo siguiente: ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, usando únicamente random.randint(1,5)? O sea, sin usar ninguna otra función que genere números aleatorios. Y he pensado en proponer el reto aquí, a ver lo que los miembros de la lista sugieren. Un saludo, Jose From lasizoillo en gmail.com Tue Jul 2 22:09:08 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Wed, 3 Jul 2019 04:09:08 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Buenas, Lo primero sería acotar cual es realmente el problema. En una entrevista de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y esa aptitud puede tener varias facetas: - Eres capaz de poner en duda los requisitos y plantear alternativas mejores para la empresa - Eres capaz de resolver problemas lógicos - Ante un problema que muy posiblemente no sabes por dónde cogerlo... ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución erronea, asumirás que no sabes hacer eso pero plantearás estrategias para atacar el problema, ... Así que lo primero negociaría si realmente no se puede simplificar el enunciado porque lo que realmente se quiere evaluar el conocimiento técnico o recursos para atacar este problema. Si les vale ser capaz de poner en duda requisitos peregrinos eso que me ahorraría. Si quiere una solución técnica pasaría a atacar el problema, reconociendo que no sé la solución a priori, y pensaría en voz alta algunas cosas evidentes: - Una sola llamada a la función randint(1,5) no tiene información suficiente para hacer el equivalente a randint(1,7) - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la distribución no sería plana. - Al no ser una potencia de dos no puedo convertir a binario la función randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas binarias me darían números del 0 al 7, no del 1 al 7. Ahora diría en alto lo que me parece una solución válida que me ha venido a la cabeza: lo mismo que con la función randint(1,5) desechaba cuando salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando el resultado de calcular 3 bits me da un número que equivale a 0. Pensaría si cumple con las restricciones del enunciado (creo que si) y pasaría a una implementación rápida. def rand_0_1() -> int: while True: num = randint(1, 5) if num==5: continue return num % 2 def randint_1_7() -> int: while True: num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() if num: return num Le comentaría que lo suyo sería hacer una función de test para quedarme tranquilo con que el resultado es correcto y poder refactorizar en el futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo aquí o si quiere ver la función que haga el test (que no es trivial, pero tampoco demasiado complicada). Pero la función de test ya se escapa a tu propuesta ;-) Un saludo, Javi El mié., 3 jul. 2019 a las 1:50, Jose Caballero () escribió: > Hola, > > a un colega le han preguntado durante una entrevista de trabajo lo > siguiente: > ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, > usando únicamente random.randint(1,5)? > O sea, sin usar ninguna otra función que genere números aleatorios. > > Y he pensado en proponer el reto aquí, a ver lo que los miembros de la > lista sugieren. > > Un saludo, > Jose > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Wed Jul 3 00:52:34 2019 From: agtugo en gmail.com (AGTUGO) Date: Tue, 2 Jul 2019 21:52:34 -0700 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Tal cual lo contest'o Javi es m'as importante el m'etodo con el que lo resuelves, es imposible saberlo todo, aunque recomiendo Classic Computer Science Problems in Python. Es buena referencia para problemas. On Tue, Jul 2, 2019 at 7:09 PM lasizoillo wrote: > Buenas, > > Lo primero sería acotar cual es realmente el problema. En una entrevista > de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y > esa aptitud puede tener varias facetas: > - Eres capaz de poner en duda los requisitos y plantear alternativas > mejores para la empresa > - Eres capaz de resolver problemas lógicos > - Ante un problema que muy posiblemente no sabes por dónde cogerlo... > ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución > erronea, asumirás que no sabes hacer eso pero plantearás estrategias para > atacar el problema, ... > > Así que lo primero negociaría si realmente no se puede simplificar el > enunciado porque lo que realmente se quiere evaluar el conocimiento técnico > o recursos para atacar este problema. Si les vale ser capaz de poner en > duda requisitos peregrinos eso que me ahorraría. Si quiere una solución > técnica pasaría a atacar el problema, reconociendo que no sé la solución a > priori, y pensaría en voz alta algunas cosas evidentes: > - Una sola llamada a la función randint(1,5) no tiene información > suficiente para hacer el equivalente a randint(1,7) > - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la > distribución no sería plana. > - Al no ser una potencia de dos no puedo convertir a binario la función > randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 > es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas > binarias me darían números del 0 al 7, no del 1 al 7. > > Ahora diría en alto lo que me parece una solución válida que me ha venido > a la cabeza: lo mismo que con la función randint(1,5) desechaba cuando > salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando el > resultado de calcular 3 bits me da un número que equivale a 0. Pensaría si > cumple con las restricciones del enunciado (creo que si) y pasaría a una > implementación rápida. > > def rand_0_1() -> int: > while True: > num = randint(1, 5) > if num==5: > continue > return num % 2 > > def randint_1_7() -> int: > while True: > num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() > if num: > return num > > Le comentaría que lo suyo sería hacer una función de test para quedarme > tranquilo con que el resultado es correcto y poder refactorizar en el > futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo > aquí o si quiere ver la función que haga el test (que no es trivial, pero > tampoco demasiado complicada). Pero la función de test ya se escapa a tu > propuesta ;-) > > Un saludo, > > Javi > > > El mié., 3 jul. 2019 a las 1:50, Jose Caballero () > escribió: > >> Hola, >> >> a un colega le han preguntado durante una entrevista de trabajo lo >> siguiente: >> ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, >> usando únicamente random.randint(1,5)? >> O sea, sin usar ninguna otra función que genere números aleatorios. >> >> Y he pensado en proponer el reto aquí, a ver lo que los miembros de la >> lista sugieren. >> >> Un saludo, >> Jose >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Wed Jul 3 07:58:05 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 3 Jul 2019 13:58:05 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: El mié., 3 jul. 2019 a las 4:09, lasizoillo () escribió: > Buenas, > > Lo primero sería acotar cual es realmente el problema. En una entrevista > de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y > esa aptitud puede tener varias facetas: > - Eres capaz de poner en duda los requisitos y plantear alternativas > mejores para la empresa > - Eres capaz de resolver problemas lógicos > - Ante un problema que muy posiblemente no sabes por dónde cogerlo... > ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución > erronea, asumirás que no sabes hacer eso pero plantearás estrategias para > atacar el problema, ... > > Así que lo primero negociaría si realmente no se puede simplificar el > enunciado porque lo que realmente se quiere evaluar el conocimiento técnico > o recursos para atacar este problema. Si les vale ser capaz de poner en > duda requisitos peregrinos eso que me ahorraría. Si quiere una solución > técnica pasaría a atacar el problema, reconociendo que no sé la solución a > priori, y pensaría en voz alta algunas cosas evidentes: > - Una sola llamada a la función randint(1,5) no tiene información > suficiente para hacer el equivalente a randint(1,7) > - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la > distribución no sería plana. > - Al no ser una potencia de dos no puedo convertir a binario la función > randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 > es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas > binarias me darían números del 0 al 7, no del 1 al 7. > Te dejas el caso de que no sea resoluble, a pesar de tener un enunciado tan sencillo. Lo primero que podemos pensar es que necesitamos 7 tiradas de [1,5] para tener 5 tiradas de [1,7]. Representamos este cambio de dominios por una matriz 7 x 5. Todos los elementos están a cero, excepto un elemento de cada fila que asignamos aleatoriamente a 1. Por ejemplo: [[0, 0, 0, 0, 1], [0, 0, 0, 0, 1], [0, 0, 0, 0, 1], [0, 0, 1, 0, 0], [0, 0, 0, 0, 1], [1, 0, 0, 0, 0], [0, 0, 1, 0, 0]] Es imposible asegurar que en cada columna haya un único elemento a 1. Alguna columna puede tener todos sus elementos a cero y, al menos, habrá alguna columna que tendrá más de un 1 seguro. Por tener una imagen del problema: es como tirar un dado y que algunas veces no sale nada, y en otras salen dos números o más. > > Ahora diría en alto lo que me parece una solución válida que me ha venido > a la cabeza: lo mismo que con la función randint(1,5) desechaba cuando > salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando el > resultado de calcular 3 bits me da un número que equivale a 0. Pensaría si > cumple con las restricciones del enunciado (creo que si) y pasaría a una > implementación rápida. > > def rand_0_1() -> int: > while True: > num = randint(1, 5) > if num==5: > continue > return num % 2 > > def randint_1_7() -> int: > while True: > num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() > if num: > return num > El truco está en que quitar un elemento de una distribución uniforme deja una distribución uniforme de los elementos que quedan. En tu caso, a randint(1,5) le quitas el 5, lo que equivale a randint(1,4), y lo usas para construir un randint(0,1) . Por otro lado, implementas un randint(0,7) al que le quitas el cero, lo que equivale a randint(1,7), que es lo que se buscaba. Un efecto añadido es que no se sabe cuántas llamadas son necesarias hacer a randint(1,5) para obtener un elemento de randint(1,7). Cómo poco haces 3 llamadas. El ideal sería hacer 1.4 llamadas por resultado obtenido (1.4 == 7/5). El nuevo reto podría ser ahora minimizar el número de llamadas necesarias. > > Le comentaría que lo suyo sería hacer una función de test para quedarme > tranquilo con que el resultado es correcto y poder refactorizar en el > futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo > aquí o si quiere ver la función que haga el test (que no es trivial, pero > tampoco demasiado complicada). Pero la función de test ya se escapa a tu > propuesta ;-) > > Un saludo, > > Javi > > > El mié., 3 jul. 2019 a las 1:50, Jose Caballero () > escribió: > >> Hola, >> >> a un colega le han preguntado durante una entrevista de trabajo lo >> siguiente: >> ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, >> usando únicamente random.randint(1,5)? >> O sea, sin usar ninguna otra función que genere números aleatorios. >> >> Y he pensado en proponer el reto aquí, a ver lo que los miembros de la >> lista sugieren. >> >> Un saludo, >> Jose >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From nimbiotics en gmail.com Wed Jul 3 12:04:42 2019 From: nimbiotics en gmail.com (Mario R. Osorio) Date: Wed, 3 Jul 2019 12:04:42 -0400 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Muy interesante la solución de Javi (Que demuestra tener una distribución plana), sin embargo me permito presentar la mía para su consideración: """ Solucion para: generar una distribución plana de enteros aleatorios, del 1 al 7, usando únicamente random.randint(1,5) como funcion generadora de enteros aleatorios """ from random import randint def randint_1_7(seed=None): l = (1, 2, 3, 4, 5, 6, 7) if seed is None: seed = randint(1,5) + randint(1,5) else: seed += randint(1,5) seed = seed % 7 return (l[seed - 1], seed) if __name__ == "__main__": """ se demuestra que la distribucion es plana, pero la PRUEBA matematica se la dejo a otro... """ d = {} k, seed = randint_1_7() for n in range(100000): k, seed = randint_1_7(seed) if k in d: d[k] += 1 else: d[k] = 1 print(d) On Tue, Jul 2, 2019 at 10:10 PM lasizoillo wrote: > Buenas, > > Lo primero sería acotar cual es realmente el problema. En una entrevista > de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y > esa aptitud puede tener varias facetas: > - Eres capaz de poner en duda los requisitos y plantear alternativas > mejores para la empresa > - Eres capaz de resolver problemas lógicos > - Ante un problema que muy posiblemente no sabes por dónde cogerlo... > ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución > erronea, asumirás que no sabes hacer eso pero plantearás estrategias para > atacar el problema, ... > > Así que lo primero negociaría si realmente no se puede simplificar el > enunciado porque lo que realmente se quiere evaluar el conocimiento técnico > o recursos para atacar este problema. Si les vale ser capaz de poner en > duda requisitos peregrinos eso que me ahorraría. Si quiere una solución > técnica pasaría a atacar el problema, reconociendo que no sé la solución a > priori, y pensaría en voz alta algunas cosas evidentes: > - Una sola llamada a la función randint(1,5) no tiene información > suficiente para hacer el equivalente a randint(1,7) > - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la > distribución no sería plana. > - Al no ser una potencia de dos no puedo convertir a binario la función > randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 > es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas > binarias me darían números del 0 al 7, no del 1 al 7. > > Ahora diría en alto lo que me parece una solución válida que me ha venido > a la cabeza: lo mismo que con la función randint(1,5) desechaba cuando > salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando el > resultado de calcular 3 bits me da un número que equivale a 0. Pensaría si > cumple con las restricciones del enunciado (creo que si) y pasaría a una > implementación rápida. > > def rand_0_1() -> int: > while True: > num = randint(1, 5) > if num==5: > continue > return num % 2 > > def randint_1_7() -> int: > while True: > num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() > if num: > return num > > Le comentaría que lo suyo sería hacer una función de test para quedarme > tranquilo con que el resultado es correcto y poder refactorizar en el > futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo > aquí o si quiere ver la función que haga el test (que no es trivial, pero > tampoco demasiado complicada). Pero la función de test ya se escapa a tu > propuesta ;-) > > Un saludo, > > Javi > > > El mié., 3 jul. 2019 a las 1:50, Jose Caballero () > escribió: > >> Hola, >> >> a un colega le han preguntado durante una entrevista de trabajo lo >> siguiente: >> ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, >> usando únicamente random.randint(1,5)? >> O sea, sin usar ninguna otra función que genere números aleatorios. >> >> Y he pensado en proponer el reto aquí, a ver lo que los miembros de la >> lista sugieren. >> >> Un saludo, >> Jose >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcaballero.hep en gmail.com Wed Jul 3 14:37:37 2019 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Wed, 3 Jul 2019 14:37:37 -0400 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Hmmm. Seguro? Imagino que una funcion que genera numeros aleatorios debe producir una distribucion plana (si ese es el requisito) cuando se la llama N veces, sin argumentos. En este caso, la implementacion real seria def randint_1_7( ): l = (1, 2, 3, 4, 5, 6, 7) seed = randint(1,5) + randint(1,5) seed = seed % 7 return l[seed - 1] No? Produce eso una distribucion plana? El mié., 3 jul. 2019 a las 12:06, Mario R. Osorio () escribió: > > Muy interesante la solución de Javi (Que demuestra tener una distribución plana), sin embargo me permito presentar la mía para su consideración: > > """ > Solucion para: > generar una distribución plana de enteros aleatorios, del 1 al 7, usando únicamente random.randint(1,5) > como funcion generadora de enteros aleatorios > """ > > from random import randint > > def randint_1_7(seed=None): > l = (1, 2, 3, 4, 5, 6, 7) > > if seed is None: > seed = randint(1,5) + randint(1,5) > else: > seed += randint(1,5) > > seed = seed % 7 > > return (l[seed - 1], seed) > > > if __name__ == "__main__": > """ > se demuestra que la distribucion es plana, > pero la PRUEBA matematica se la dejo a otro... > > """ > > d = {} > k, seed = randint_1_7() > > for n in range(100000): > k, seed = randint_1_7(seed) > if k in d: > d[k] += 1 > else: > d[k] = 1 > > print(d) > > > > > On Tue, Jul 2, 2019 at 10:10 PM lasizoillo wrote: >> >> Buenas, >> >> Lo primero sería acotar cual es realmente el problema. En una entrevista de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y esa aptitud puede tener varias facetas: >> - Eres capaz de poner en duda los requisitos y plantear alternativas mejores para la empresa >> - Eres capaz de resolver problemas lógicos >> - Ante un problema que muy posiblemente no sabes por dónde cogerlo... ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución erronea, asumirás que no sabes hacer eso pero plantearás estrategias para atacar el problema, ... >> >> Así que lo primero negociaría si realmente no se puede simplificar el enunciado porque lo que realmente se quiere evaluar el conocimiento técnico o recursos para atacar este problema. Si les vale ser capaz de poner en duda requisitos peregrinos eso que me ahorraría. Si quiere una solución técnica pasaría a atacar el problema, reconociendo que no sé la solución a priori, y pensaría en voz alta algunas cosas evidentes: >> - Una sola llamada a la función randint(1,5) no tiene información suficiente para hacer el equivalente a randint(1,7) >> - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la distribución no sería plana. >> - Al no ser una potencia de dos no puedo convertir a binario la función randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas binarias me darían números del 0 al 7, no del 1 al 7. >> >> Ahora diría en alto lo que me parece una solución válida que me ha venido a la cabeza: lo mismo que con la función randint(1,5) desechaba cuando salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando el resultado de calcular 3 bits me da un número que equivale a 0. Pensaría si cumple con las restricciones del enunciado (creo que si) y pasaría a una implementación rápida. >> >> def rand_0_1() -> int: >> while True: >> num = randint(1, 5) >> if num==5: >> continue >> return num % 2 >> >> def randint_1_7() -> int: >> while True: >> num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() >> if num: >> return num >> >> Le comentaría que lo suyo sería hacer una función de test para quedarme tranquilo con que el resultado es correcto y poder refactorizar en el futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo aquí o si quiere ver la función que haga el test (que no es trivial, pero tampoco demasiado complicada). Pero la función de test ya se escapa a tu propuesta ;-) >> >> Un saludo, >> >> Javi >> >> >> El mié., 3 jul. 2019 a las 1:50, Jose Caballero () escribió: >>> >>> Hola, >>> >>> a un colega le han preguntado durante una entrevista de trabajo lo siguiente: >>> ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, usando únicamente random.randint(1,5)? >>> O sea, sin usar ninguna otra función que genere números aleatorios. >>> >>> Y he pensado en proponer el reto aquí, a ver lo que los miembros de la lista sugieren. >>> >>> Un saludo, >>> Jose >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es From davidmenhur en gmail.com Wed Jul 3 14:58:54 2019 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Wed, 3 Jul 2019 20:58:54 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Distribución plana es sólo uno de los requisitos de randint. Otro es que los valores sucesivos sean independientes. La solución de Mario tiene este problema: import numpy as np import pylab as plt results = [] k, seed = randint_1_7() for n in range(100000): k, seed = randint_1_7(seed) results.append(k) results = np.array(results) plt.hist2d(results[::2], results[1::2], bins=(np.arange(1, 8)-0.5, np.arange(1,8)-0.5)) plt.colorbar() plt.scatter(results[::2], results[1::2], color='w') plt.tight_layout() [image: hist_randint.png] Como puedes ver, nunca tienes dos números iguales seguidos, y nunca tienes un número seguido del anterior. El mismo proceso en tres dimensiones revela más agujeros. La solución de Lasizoillo parece no tener este problema. Detalle importante: este es un test muy básico de independencia, que lo pase no quiere decir que sea independiente... /David. On Wed, 3 Jul 2019 at 18:07, Mario R. Osorio wrote: > Muy interesante la solución de Javi (Que demuestra tener una distribución > plana), sin embargo me permito presentar la mía para su consideración: > > """ > Solucion para: > generar una distribución plana de enteros aleatorios, del 1 al 7, > usando únicamente random.randint(1,5) > como funcion generadora de enteros aleatorios > """ > > from random import randint > > def randint_1_7(seed=None): > l = (1, 2, 3, 4, 5, 6, 7) > > if seed is None: > seed = randint(1,5) + randint(1,5) > else: > seed += randint(1,5) > > seed = seed % 7 > > return (l[seed - 1], seed) > > > if __name__ == "__main__": > """ > se demuestra que la distribucion es plana, > pero la PRUEBA matematica se la dejo a otro... > > """ > > d = {} > k, seed = randint_1_7() > > for n in range(100000): > k, seed = randint_1_7(seed) > if k in d: > d[k] += 1 > else: > d[k] = 1 > > print(d) > > > > > On Tue, Jul 2, 2019 at 10:10 PM lasizoillo wrote: > >> Buenas, >> >> Lo primero sería acotar cual es realmente el problema. En una entrevista >> de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y >> esa aptitud puede tener varias facetas: >> - Eres capaz de poner en duda los requisitos y plantear alternativas >> mejores para la empresa >> - Eres capaz de resolver problemas lógicos >> - Ante un problema que muy posiblemente no sabes por dónde cogerlo... >> ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución >> erronea, asumirás que no sabes hacer eso pero plantearás estrategias para >> atacar el problema, ... >> >> Así que lo primero negociaría si realmente no se puede simplificar el >> enunciado porque lo que realmente se quiere evaluar el conocimiento técnico >> o recursos para atacar este problema. Si les vale ser capaz de poner en >> duda requisitos peregrinos eso que me ahorraría. Si quiere una solución >> técnica pasaría a atacar el problema, reconociendo que no sé la solución a >> priori, y pensaría en voz alta algunas cosas evidentes: >> - Una sola llamada a la función randint(1,5) no tiene información >> suficiente para hacer el equivalente a randint(1,7) >> - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la >> distribución no sería plana. >> - Al no ser una potencia de dos no puedo convertir a binario la función >> randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 >> es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas >> binarias me darían números del 0 al 7, no del 1 al 7. >> >> Ahora diría en alto lo que me parece una solución válida que me ha venido >> a la cabeza: lo mismo que con la función randint(1,5) desechaba cuando >> salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando el >> resultado de calcular 3 bits me da un número que equivale a 0. Pensaría si >> cumple con las restricciones del enunciado (creo que si) y pasaría a una >> implementación rápida. >> >> def rand_0_1() -> int: >> while True: >> num = randint(1, 5) >> if num==5: >> continue >> return num % 2 >> >> def randint_1_7() -> int: >> while True: >> num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() >> if num: >> return num >> >> Le comentaría que lo suyo sería hacer una función de test para quedarme >> tranquilo con que el resultado es correcto y poder refactorizar en el >> futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo >> aquí o si quiere ver la función que haga el test (que no es trivial, pero >> tampoco demasiado complicada). Pero la función de test ya se escapa a tu >> propuesta ;-) >> >> Un saludo, >> >> Javi >> >> >> El mié., 3 jul. 2019 a las 1:50, Jose Caballero (< >> jcaballero.hep en gmail.com>) escribió: >> >>> Hola, >>> >>> a un colega le han preguntado durante una entrevista de trabajo lo >>> siguiente: >>> ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, >>> usando únicamente random.randint(1,5)? >>> O sea, sin usar ninguna otra función que genere números aleatorios. >>> >>> Y he pensado en proponer el reto aquí, a ver lo que los miembros de la >>> lista sugieren. >>> >>> Un saludo, >>> Jose >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: hist_randint.png Type: image/png Size: 13680 bytes Desc: no disponible URL: From nimbiotics en gmail.com Wed Jul 3 16:09:42 2019 From: nimbiotics en gmail.com (Mario R. Osorio) Date: Wed, 3 Jul 2019 16:09:42 -0400 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Muchas gracias por la explicación. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lasizoillo en gmail.com Wed Jul 3 18:46:25 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Thu, 4 Jul 2019 00:46:25 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Buenas, Tras leer el correo de Chema me puse a pensar en cuantos bits de información se podía obtener de randint(1,5) y cuantos necesitaba randint(1,7) y me dio por pensar que era ln2(5) y ln2(7). Lo cual seguramente es incorrecto (las mates no son lo mío), pero aun siendo una estimación menor que el ideal propuesto por Chema de 1.4 llamadas es mayor al usado en la solución de Mario (1). Así que había pensado en hacer unos tests de aleatoriedad sobre esa solución demasiado bonita para ser cierta, pero gracias por adelantarte. ¿Se deberían descartar todas las soluciones que hagan menos de 1.2 o 1.4 llamadas a randint(1,5) para calcular randint(1,7)? De todas formas aunque he encontrado formas de hacer algo más eficiente mi solución, no se me ha ocurrido nada digno de mención y por ahora están muy lejos de 1.4 llamadas. Un saludo, Javi El mié., 3 jul. 2019 a las 21:00, Da?id () escribió: > Distribución plana es sólo uno de los requisitos de randint. Otro es que > los valores sucesivos sean independientes. > > La solución de Mario tiene este problema: > > import numpy as np > import pylab as plt > > results = [] > k, seed = randint_1_7() > for n in range(100000): > k, seed = randint_1_7(seed) > results.append(k) > > results = np.array(results) > plt.hist2d(results[::2], results[1::2], bins=(np.arange(1, 8)-0.5, > np.arange(1,8)-0.5)) > plt.colorbar() > plt.scatter(results[::2], results[1::2], color='w') > plt.tight_layout() > [image: hist_randint.png] > > Como puedes ver, nunca tienes dos números iguales seguidos, y nunca tienes > un número seguido del anterior. > > El mismo proceso en tres dimensiones revela más agujeros. > > La solución de Lasizoillo parece no tener este problema. > > > Detalle importante: este es un test muy básico de independencia, que lo > pase no quiere decir que sea independiente... > > /David. > > On Wed, 3 Jul 2019 at 18:07, Mario R. Osorio wrote: > >> Muy interesante la solución de Javi (Que demuestra tener una distribución >> plana), sin embargo me permito presentar la mía para su consideración: >> >> """ >> Solucion para: >> generar una distribución plana de enteros aleatorios, del 1 al 7, >> usando únicamente random.randint(1,5) >> como funcion generadora de enteros aleatorios >> """ >> >> from random import randint >> >> def randint_1_7(seed=None): >> l = (1, 2, 3, 4, 5, 6, 7) >> >> if seed is None: >> seed = randint(1,5) + randint(1,5) >> else: >> seed += randint(1,5) >> >> seed = seed % 7 >> >> return (l[seed - 1], seed) >> >> >> if __name__ == "__main__": >> """ >> se demuestra que la distribucion es plana, >> pero la PRUEBA matematica se la dejo a otro... >> >> """ >> >> d = {} >> k, seed = randint_1_7() >> >> for n in range(100000): >> k, seed = randint_1_7(seed) >> if k in d: >> d[k] += 1 >> else: >> d[k] = 1 >> >> print(d) >> >> >> >> >> On Tue, Jul 2, 2019 at 10:10 PM lasizoillo wrote: >> >>> Buenas, >>> >>> Lo primero sería acotar cual es realmente el problema. En una entrevista >>> de trabajo alguien tiene que desentrañar si eres apto o no para un puesto y >>> esa aptitud puede tener varias facetas: >>> - Eres capaz de poner en duda los requisitos y plantear alternativas >>> mejores para la empresa >>> - Eres capaz de resolver problemas lógicos >>> - Ante un problema que muy posiblemente no sabes por dónde cogerlo... >>> ¿cómo vas a reaccionar? te enfadarás, tratarás de colar una solución >>> erronea, asumirás que no sabes hacer eso pero plantearás estrategias para >>> atacar el problema, ... >>> >>> Así que lo primero negociaría si realmente no se puede simplificar el >>> enunciado porque lo que realmente se quiere evaluar el conocimiento técnico >>> o recursos para atacar este problema. Si les vale ser capaz de poner en >>> duda requisitos peregrinos eso que me ahorraría. Si quiere una solución >>> técnica pasaría a atacar el problema, reconociendo que no sé la solución a >>> priori, y pensaría en voz alta algunas cosas evidentes: >>> - Una sola llamada a la función randint(1,5) no tiene información >>> suficiente para hacer el equivalente a randint(1,7) >>> - No puedo sumar 7 "tiradas" de randint(1,5) y dividir entre 5 porque la >>> distribución no sería plana. >>> - Al no ser una potencia de dos no puedo convertir a binario la función >>> randint(1,5) y codificar los bits del número. Ejemplo 1 y 3 es un 0, 2 y 4 >>> es un 1 y 5 vuelvo a calcular. 2^3=8, por lo que tres bits de tiradas >>> binarias me darían números del 0 al 7, no del 1 al 7. >>> >>> Ahora diría en alto lo que me parece una solución válida que me ha >>> venido a la cabeza: lo mismo que con la función randint(1,5) desechaba >>> cuando salía 5 para simular tiradas de cara o cruz, puedo eliminar cuando >>> el resultado de calcular 3 bits me da un número que equivale a 0. Pensaría >>> si cumple con las restricciones del enunciado (creo que si) y pasaría a una >>> implementación rápida. >>> >>> def rand_0_1() -> int: >>> while True: >>> num = randint(1, 5) >>> if num==5: >>> continue >>> return num % 2 >>> >>> def randint_1_7() -> int: >>> while True: >>> num = rand_0_1() * 4 + rand_0_1() * 2 + rand_0_1() >>> if num: >>> return num >>> >>> Le comentaría que lo suyo sería hacer una función de test para quedarme >>> tranquilo con que el resultado es correcto y poder refactorizar en el >>> futuro si se me ocurre una solución mejor. Escucharía si quiere dejarlo >>> aquí o si quiere ver la función que haga el test (que no es trivial, pero >>> tampoco demasiado complicada). Pero la función de test ya se escapa a tu >>> propuesta ;-) >>> >>> Un saludo, >>> >>> Javi >>> >>> >>> El mié., 3 jul. 2019 a las 1:50, Jose Caballero (< >>> jcaballero.hep en gmail.com>) escribió: >>> >>>> Hola, >>>> >>>> a un colega le han preguntado durante una entrevista de trabajo lo >>>> siguiente: >>>> ¿cómo generar una distribución plana de enteros aleatorios, del 1 al 7, >>>> usando únicamente random.randint(1,5)? >>>> O sea, sin usar ninguna otra función que genere números aleatorios. >>>> >>>> Y he pensado en proponer el reto aquí, a ver lo que los miembros de la >>>> lista sugieren. >>>> >>>> Un saludo, >>>> Jose >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: hist_randint.png Type: image/png Size: 13680 bytes Desc: no disponible URL: From garcia.marc en gmail.com Wed Jul 3 18:08:55 2019 From: garcia.marc en gmail.com (Marc Garcia) Date: Wed, 3 Jul 2019 23:08:55 +0100 Subject: [Python-es] EuroScipy 2019, Bilbao, 2 - 6 Septiembre Message-ID: Hola! Acabamos de publicar el prorgama de la EuroSciPy 2019. Esta disponible en: https://www.euroscipy.org/2019/program.html Vamos a contar con speakers de lujo, incluyendo maintainers de numpy, matplotlib, pandas, scikit-learn, pytest, numba y muchos otros. Y hasta el domingo todavia tenemos precios early bird. :) Nos vemos en Bilbao! PS: Todavia se aceptan sponsors, y propuestas de sprints y sesiones para maintainers. Podeis mandarme un mail directamente. ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rabs en dimension-virtual.com Thu Jul 4 06:18:08 2019 From: rabs en dimension-virtual.com (=?utf-8?B?UmHDumw=?= Alexis Betancor Santana) Date: Thu, 4 Jul 2019 12:18:08 +0200 (CEST) Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= Message-ID: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento leer en stream de un fichero que está siendo escrito por otro proceso, que contiene la grabación del audio, para enviarla al GCS, pero sin éxito. ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da GCS para hacer lo mismo con un fichero directamente, que lo que hace es leerlo completo en memoria y enviarlo, no me da problemas y transcribe bien el texto. Basandome en el código de ejemplo de GCS para streaming def read_in_chunks(file_object,chunk_size): """Lazy function (generator) to read a file piece by piece. while True: chunk = file_object.read(chunk_size) if not chunk: return data = [chunk] yield b''.join(data) def transcribe_streaming(stream_file,language,timeout): """Streams transcription of the given audio file.""" from google.cloud import speech from google.cloud.speech import enums from google.cloud.speech import types import io client = speech.SpeechClient() #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) audio_file = io.open(stream_file+'.sln16','rb') # In practice, stream should be a generator yielding chunks of audio data. requests = (types.StreamingRecognizeRequest(audio_content=chunk) for chunk in read_in_chunks(audio_file,3200)) config = types.RecognitionConfig( encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=16000, language_code=language) #streaming_config = types.StreamingRecognitionConfig(config=config,single_utterance=True) streaming_config = types.StreamingRecognitionConfig(config=config) # streaming_recognize returns a generator. responses = client.streaming_recognize(streaming_config, requests) for response in responses: # Once the transcription has settled, the first result will contain the # is_final result. The other results will be for subsequent portions of # the audio. for result in response.results: if result.is_final: print('Finished: {}'.format(result.is_final)) print('Stability: {}'.format(result.stability)) alternatives = result.alternatives ### The alternatives are ordered from most likely to least. for alternative in alternatives: print('Confidence: {}'.format(alternative.confidence)) print(u'Transcript: {}'.format(alternative.transcript)) (null) From davidmenhur en gmail.com Thu Jul 4 06:57:11 2019 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Thu, 4 Jul 2019 12:57:11 +0200 Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> Message-ID: Creo que has encontrado la solución, pero la has puesto en el lugar equivocado. #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) El proceso que está escribiendo al archivo está probablemente usando un buffer, lo que quiere decir que sólo escribe al disco duro de vez en cuando, cuando haya acumulado una cierta cantidad de datos. Si tienes acceso al programa que escribe el archivo, tienes que o bien desactivar el buffer (¡cuidado con el rendimiento!), usar uno más pequeño, o vaciarlo explícitamente con un flush() más a menudo. On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < rabs en dimension-virtual.com> wrote: > Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento > leer en stream de un fichero que está siendo escrito por otro proceso, que > contiene la grabación del audio, para enviarla al GCS, pero sin éxito. > > ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da > GCS para hacer lo mismo con un fichero directamente, que lo que hace es > leerlo completo en memoria y enviarlo, no me da problemas y transcribe bien > el texto. > > Basandome en el código de ejemplo de GCS para streaming > > def read_in_chunks(file_object,chunk_size): > """Lazy function (generator) to read a file piece by piece. > while True: > chunk = file_object.read(chunk_size) > if not chunk: > return > data = [chunk] > yield b''.join(data) > > def transcribe_streaming(stream_file,language,timeout): > """Streams transcription of the given audio file.""" > from google.cloud import speech > from google.cloud.speech import enums > from google.cloud.speech import types > import io > client = speech.SpeechClient() > > #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) > audio_file = io.open(stream_file+'.sln16','rb') > # In practice, stream should be a generator yielding chunks of audio data. > requests = (types.StreamingRecognizeRequest(audio_content=chunk) > for chunk in read_in_chunks(audio_file,3200)) > > config = types.RecognitionConfig( > encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, > sample_rate_hertz=16000, > language_code=language) > #streaming_config = > types.StreamingRecognitionConfig(config=config,single_utterance=True) > streaming_config = types.StreamingRecognitionConfig(config=config) > > # streaming_recognize returns a generator. > responses = client.streaming_recognize(streaming_config, requests) > for response in responses: > # Once the transcription has settled, the first result will contain the > # is_final result. The other results will be for subsequent portions of > # the audio. > for result in response.results: > if result.is_final: > print('Finished: {}'.format(result.is_final)) > print('Stability: {}'.format(result.stability)) > alternatives = result.alternatives > ### The alternatives are ordered from most likely to least. > for alternative in alternatives: > print('Confidence: {}'.format(alternative.confidence)) > print(u'Transcript: {}'.format(alternative.transcript)) > (null) > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rabs en dimension-virtual.com Thu Jul 4 08:55:56 2019 From: rabs en dimension-virtual.com (=?utf-8?B?UmHDumw=?= Alexis Betancor Santana) Date: Thu, 4 Jul 2019 14:55:56 +0200 (CEST) Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> Message-ID: <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> No puedo, los ficheros los genera Asterisk y no voy a estar tocando el código para eso. He probado añadiendo un delay de 250ms al inicio de la lectura, para darle tiempo a que haga un flush a disco, pero tampoco me vá. En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y que hace exactamente lo mismo, funciona perfectamente, pero el código de python se me queda en el for response in responses: ... osea, no llega nunca a recibir respuesta de GCS o el generador del read_in_chunks no está resolviendo o algo raro. Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un script en python que ejecutaba desde el EAGI y tampoco había forma, o escuchaba el stream de audio y lo interpretaba o reproducía una locución del IVR, pero no ambas cosas al mismo tiempo y hacerlo vía threads, se me complicaba la cosa, hacerlo vía multiprocess y pipes, tenía el problema de que tenía que estar leyendo desde el proceso hijo el FD 3 del proceso padre, un coñazo. Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. > De: "Da?id" > Para: "python-es" > Enviados: Jueves, 4 de Julio 2019 11:57:11 > Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por > otro proceso. > Creo que has encontrado la solución, pero la has puesto en el lugar equivocado. > #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) > El proceso que está escribiendo al archivo está probablemente usando un buffer, > lo que quiere decir que sólo escribe al disco duro de vez en cuando, cuando > haya acumulado una cierta cantidad de datos. Si tienes acceso al programa que > escribe el archivo, tienes que o bien desactivar el buffer (¡cuidado con el > rendimiento!), usar uno más pequeño, o vaciarlo explícitamente con un flush() > más a menudo. > On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < [ > mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote: >> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento leer >> en stream de un fichero que está siendo escrito por otro proceso, que contiene >> la grabación del audio, para enviarla al GCS, pero sin éxito. >> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da GCS >> para hacer lo mismo con un fichero directamente, que lo que hace es leerlo >> completo en memoria y enviarlo, no me da problemas y transcribe bien el texto. >> Basandome en el código de ejemplo de GCS para streaming >> def read_in_chunks(file_object,chunk_size): >> """Lazy function (generator) to read a file piece by piece. >> while True: >> chunk = file_object.read(chunk_size) >> if not chunk: >> return >> data = [chunk] >> yield b''.join(data) >> def transcribe_streaming(stream_file,language,timeout): >> """Streams transcription of the given audio file.""" >> from google.cloud import speech >> from google.cloud.speech import enums >> from google.cloud.speech import types >> import io >> client = speech.SpeechClient() >> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >> audio_file = io.open(stream_file+'.sln16','rb') >> # In practice, stream should be a generator yielding chunks of audio data. >> requests = (types.StreamingRecognizeRequest(audio_content=chunk) >> for chunk in read_in_chunks(audio_file,3200)) >> config = types.RecognitionConfig( >> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, >> sample_rate_hertz=16000, >> language_code=language) >> #streaming_config = >> types.StreamingRecognitionConfig(config=config,single_utterance=True) >> streaming_config = types.StreamingRecognitionConfig(config=config) >> # streaming_recognize returns a generator. >> responses = client.streaming_recognize(streaming_config, requests) >> for response in responses: >> # Once the transcription has settled, the first result will contain the >> # is_final result. The other results will be for subsequent portions of >> # the audio. >> for result in response.results: >> if result.is_final: >> print('Finished: {}'.format(result.is_final)) >> print('Stability: {}'.format(result.stability)) >> alternatives = result.alternatives >> ### The alternatives are ordered from most likely to least. >> for alternative in alternatives: >> print('Confidence: {}'.format(alternative.confidence)) >> print(u'Transcript: {}'.format(alternative.transcript)) >> (null) >> _______________________________________________ >> Python-es mailing list >> [ mailto:Python-es en python.org | Python-es en python.org ] >> [ https://mail.python.org/mailman/listinfo/python-es | >> https://mail.python.org/mailman/listinfo/python-es ] > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rabs en dimension-virtual.com Thu Jul 4 13:55:32 2019 From: rabs en dimension-virtual.com (=?utf-8?B?UmHDumw=?= Alexis Betancor Santana) Date: Thu, 4 Jul 2019 19:55:32 +0200 (CEST) Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> Message-ID: <1088595464.1452258.1562262932246.JavaMail.zimbra@dimension-virtual.com> Haciendo más pruebas, he llegado a la conclusión, de que lo que está mal es la función de read_in_chunks ... ya que nunca lee nada y siempre acaba dentro del if not chunk: break ... y no entiendo porque narices. En todos los ejemplos que encuentro por la red para leer un fichero binario por porciones, siempre usan mas o menos el mismo estilo de código para la función, pero esta parece que nunca lee nada. ¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un fichero binario a trozos? ... :-( > De: "Raúl Alexis Betancor Santana" > Para: "python-es" > Enviados: Jueves, 4 de Julio 2019 13:55:56 > Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por > otro proceso. > No puedo, los ficheros los genera Asterisk y no voy a estar tocando el código > para eso. > He probado añadiendo un delay de 250ms al inicio de la lectura, para darle > tiempo a que haga un flush a disco, pero tampoco me vá. > En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y que hace > exactamente lo mismo, funciona perfectamente, pero el código de python se me > queda en el for response in responses: ... osea, no llega nunca a recibir > respuesta de GCS o el generador del read_in_chunks no está resolviendo o algo > raro. > Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un script > en python que ejecutaba desde el EAGI y tampoco había forma, o escuchaba el > stream de audio y lo interpretaba o reproducía una locución del IVR, pero no > ambas cosas al mismo tiempo y hacerlo vía threads, se me complicaba la cosa, > hacerlo vía multiprocess y pipes, tenía el problema de que tenía que estar > leyendo desde el proceso hijo el FD 3 del proceso padre, un coñazo. > Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. >> De: "Da?id" >> Para: "python-es" >> Enviados: Jueves, 4 de Julio 2019 11:57:11 >> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por >> otro proceso. >> Creo que has encontrado la solución, pero la has puesto en el lugar equivocado. >> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >> El proceso que está escribiendo al archivo está probablemente usando un buffer, >> lo que quiere decir que sólo escribe al disco duro de vez en cuando, cuando >> haya acumulado una cierta cantidad de datos. Si tienes acceso al programa que >> escribe el archivo, tienes que o bien desactivar el buffer (¡cuidado con el >> rendimiento!), usar uno más pequeño, o vaciarlo explícitamente con un flush() >> más a menudo. >> On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < [ >> mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote: >>> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento leer >>> en stream de un fichero que está siendo escrito por otro proceso, que contiene >>> la grabación del audio, para enviarla al GCS, pero sin éxito. >>> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da GCS >>> para hacer lo mismo con un fichero directamente, que lo que hace es leerlo >>> completo en memoria y enviarlo, no me da problemas y transcribe bien el texto. >>> Basandome en el código de ejemplo de GCS para streaming >>> def read_in_chunks(file_object,chunk_size): >>> """Lazy function (generator) to read a file piece by piece. >>> while True: >>> chunk = file_object.read(chunk_size) >>> if not chunk: >>> return >>> data = [chunk] >>> yield b''.join(data) >>> def transcribe_streaming(stream_file,language,timeout): >>> """Streams transcription of the given audio file.""" >>> from google.cloud import speech >>> from google.cloud.speech import enums >>> from google.cloud.speech import types >>> import io >>> client = speech.SpeechClient() >>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >>> audio_file = io.open(stream_file+'.sln16','rb') >>> # In practice, stream should be a generator yielding chunks of audio data. >>> requests = (types.StreamingRecognizeRequest(audio_content=chunk) >>> for chunk in read_in_chunks(audio_file,3200)) >>> config = types.RecognitionConfig( >>> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, >>> sample_rate_hertz=16000, >>> language_code=language) >>> #streaming_config = >>> types.StreamingRecognitionConfig(config=config,single_utterance=True) >>> streaming_config = types.StreamingRecognitionConfig(config=config) >>> # streaming_recognize returns a generator. >>> responses = client.streaming_recognize(streaming_config, requests) >>> for response in responses: >>> # Once the transcription has settled, the first result will contain the >>> # is_final result. The other results will be for subsequent portions of >>> # the audio. >>> for result in response.results: >>> if result.is_final: >>> print('Finished: {}'.format(result.is_final)) >>> print('Stability: {}'.format(result.stability)) >>> alternatives = result.alternatives >>> ### The alternatives are ordered from most likely to least. >>> for alternative in alternatives: >>> print('Confidence: {}'.format(alternative.confidence)) >>> print(u'Transcript: {}'.format(alternative.transcript)) >>> (null) >>> _______________________________________________ >>> Python-es mailing list >>> [ mailto:Python-es en python.org | Python-es en python.org ] >>> [ https://mail.python.org/mailman/listinfo/python-es | >>> https://mail.python.org/mailman/listinfo/python-es ] >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From davidmenhur en gmail.com Thu Jul 4 14:29:52 2019 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Thu, 4 Jul 2019 20:29:52 +0200 Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: <1088595464.1452258.1562262932246.JavaMail.zimbra@dimension-virtual.com> References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> <1088595464.1452258.1562262932246.JavaMail.zimbra@dimension-virtual.com> Message-ID: El archivo está vacío, así que chunk es una cadena vacía. Esa función asume que el archivo no está creciendo, así que cuando no lee más, el archivo está terminado. On Thu, 4 Jul 2019, 7:56 pm Raúl Alexis Betancor Santana, < rabs en dimension-virtual.com> wrote: > Haciendo más pruebas, he llegado a la conclusión, de que lo que está mal > es la función de read_in_chunks ... ya que nunca lee nada y siempre acaba > dentro del if not chunk: break ... y no entiendo porque narices. > > En todos los ejemplos que encuentro por la red para leer un fichero > binario por porciones, siempre usan mas o menos el mismo estilo de código > para la función, pero esta parece que nunca lee nada. > > ¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un fichero > binario a trozos? ... :-( > > ------------------------------ > > *De: *"Raúl Alexis Betancor Santana" > *Para: *"python-es" > *Enviados: *Jueves, 4 de Julio 2019 13:55:56 > *Asunto: *Re: [Python-es] Leer fichero al mismo tiempo que se está > escribiendo por otro proceso. > > No puedo, los ficheros los genera Asterisk y no voy a estar tocando el > código para eso. > > He probado añadiendo un delay de 250ms al inicio de la lectura, para darle > tiempo a que haga un flush a disco, pero tampoco me vá. > > En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y > que hace exactamente lo mismo, funciona perfectamente, pero el código de > python se me queda en el for response in responses: ... osea, no llega > nunca a recibir respuesta de GCS o el generador del read_in_chunks no está > resolviendo o algo raro. > > Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un > script en python que ejecutaba desde el EAGI y tampoco había forma, o > escuchaba el stream de audio y lo interpretaba o reproducía una locución > del IVR, pero no ambas cosas al mismo tiempo y hacerlo vía threads, se me > complicaba la cosa, hacerlo vía multiprocess y pipes, tenía el problema de > que tenía que estar leyendo desde el proceso hijo el FD 3 del proceso > padre, un coñazo. > > Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. > > ------------------------------ > > *De: *"Da?id" > *Para: *"python-es" > *Enviados: *Jueves, 4 de Julio 2019 11:57:11 > *Asunto: *Re: [Python-es] Leer fichero al mismo tiempo que se está > escribiendo por otro proceso. > > Creo que has encontrado la solución, pero la has puesto en el lugar > equivocado. > > #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) > > El proceso que está escribiendo al archivo está probablemente usando un > buffer, lo que quiere decir que sólo escribe al disco duro de vez en > cuando, cuando haya acumulado una cierta cantidad de datos. Si tienes > acceso al programa que escribe el archivo, tienes que o bien desactivar el > buffer (¡cuidado con el rendimiento!), usar uno más pequeño, o vaciarlo > explícitamente con un flush() más a menudo. > > > > On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < > rabs en dimension-virtual.com> wrote: > >> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he >> intento leer en stream de un fichero que está siendo escrito por otro >> proceso, que contiene la grabación del audio, para enviarla al GCS, pero >> sin éxito. >> >> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da >> GCS para hacer lo mismo con un fichero directamente, que lo que hace es >> leerlo completo en memoria y enviarlo, no me da problemas y transcribe bien >> el texto. >> >> Basandome en el código de ejemplo de GCS para streaming >> >> def read_in_chunks(file_object,chunk_size): >> """Lazy function (generator) to read a file piece by piece. >> while True: >> chunk = file_object.read(chunk_size) >> if not chunk: >> return >> data = [chunk] >> yield b''.join(data) >> >> def transcribe_streaming(stream_file,language,timeout): >> """Streams transcription of the given audio file.""" >> from google.cloud import speech >> from google.cloud.speech import enums >> from google.cloud.speech import types >> import io >> client = speech.SpeechClient() >> >> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >> audio_file = io.open(stream_file+'.sln16','rb') >> # In practice, stream should be a generator yielding chunks of audio >> data. >> requests = (types.StreamingRecognizeRequest(audio_content=chunk) >> for chunk in read_in_chunks(audio_file,3200)) >> >> config = types.RecognitionConfig( >> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, >> sample_rate_hertz=16000, >> language_code=language) >> #streaming_config = >> types.StreamingRecognitionConfig(config=config,single_utterance=True) >> streaming_config = types.StreamingRecognitionConfig(config=config) >> >> # streaming_recognize returns a generator. >> responses = client.streaming_recognize(streaming_config, requests) >> for response in responses: >> # Once the transcription has settled, the first result will contain >> the >> # is_final result. The other results will be for subsequent portions >> of >> # the audio. >> for result in response.results: >> if result.is_final: >> print('Finished: {}'.format(result.is_final)) >> print('Stability: {}'.format(result.stability)) >> alternatives = result.alternatives >> ### The alternatives are ordered from most likely to least. >> for alternative in alternatives: >> print('Confidence: {}'.format(alternative.confidence)) >> print(u'Transcript: {}'.format(alternative.transcript)) >> (null) >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rabs en dimension-virtual.com Thu Jul 4 15:16:54 2019 From: rabs en dimension-virtual.com (=?utf-8?B?UmHDumw=?= Alexis Betancor Santana) Date: Thu, 4 Jul 2019 21:16:54 +0200 (CEST) Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> <1088595464.1452258.1562262932246.JavaMail.zimbra@dimension-virtual.com> Message-ID: <1571371190.1452719.1562267814439.JavaMail.zimbra@dimension-virtual.com> El archivo no está vacío ... le he puesto un sleep de 2s para hacer pruebas ANTES de abrir el fichero, y veo que en el FS tiene tamaño, así que de vacio nada. Lo que no entiendo es porqué no lee absolutamente nada. > De: "Da?id" > Para: "python-es" > Enviados: Jueves, 4 de Julio 2019 19:29:52 > Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por > otro proceso. > El archivo está vacío, así que chunk es una cadena vacía. Esa función asume que > el archivo no está creciendo, así que cuando no lee más, el archivo está > terminado. > On Thu, 4 Jul 2019, 7:56 pm Raúl Alexis Betancor Santana, < [ > mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote: >> Haciendo más pruebas, he llegado a la conclusión, de que lo que está mal es la >> función de read_in_chunks ... ya que nunca lee nada y siempre acaba dentro del >> if not chunk: break ... y no entiendo porque narices. >> En todos los ejemplos que encuentro por la red para leer un fichero binario por >> porciones, siempre usan mas o menos el mismo estilo de código para la función, >> pero esta parece que nunca lee nada. >> ¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un fichero >> binario a trozos? ... :-( >>> De: "Raúl Alexis Betancor Santana" < [ mailto:rabs en dimension-virtual.com | >>> rabs en dimension-virtual.com ] > >>> Para: "python-es" < [ mailto:python-es en python.org | python-es en python.org ] > >>> Enviados: Jueves, 4 de Julio 2019 13:55:56 >>> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por >>> otro proceso. >>> No puedo, los ficheros los genera Asterisk y no voy a estar tocando el código >>> para eso. >>> He probado añadiendo un delay de 250ms al inicio de la lectura, para darle >>> tiempo a que haga un flush a disco, pero tampoco me vá. >>> En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y que hace >>> exactamente lo mismo, funciona perfectamente, pero el código de python se me >>> queda en el for response in responses: ... osea, no llega nunca a recibir >>> respuesta de GCS o el generador del read_in_chunks no está resolviendo o algo >>> raro. >>> Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un script >>> en python que ejecutaba desde el EAGI y tampoco había forma, o escuchaba el >>> stream de audio y lo interpretaba o reproducía una locución del IVR, pero no >>> ambas cosas al mismo tiempo y hacerlo vía threads, se me complicaba la cosa, >>> hacerlo vía multiprocess y pipes, tenía el problema de que tenía que estar >>> leyendo desde el proceso hijo el FD 3 del proceso padre, un coñazo. >>> Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. >>>> De: "Da?id" < [ mailto:davidmenhur en gmail.com | davidmenhur en gmail.com ] > >>>> Para: "python-es" < [ mailto:python-es en python.org | python-es en python.org ] > >>>> Enviados: Jueves, 4 de Julio 2019 11:57:11 >>>> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por >>>> otro proceso. >>>> Creo que has encontrado la solución, pero la has puesto en el lugar equivocado. >>>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >>>> El proceso que está escribiendo al archivo está probablemente usando un buffer, >>>> lo que quiere decir que sólo escribe al disco duro de vez en cuando, cuando >>>> haya acumulado una cierta cantidad de datos. Si tienes acceso al programa que >>>> escribe el archivo, tienes que o bien desactivar el buffer (¡cuidado con el >>>> rendimiento!), usar uno más pequeño, o vaciarlo explícitamente con un flush() >>>> más a menudo. >>>> On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < [ >>>> mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote: >>>>> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento leer >>>>> en stream de un fichero que está siendo escrito por otro proceso, que contiene >>>>> la grabación del audio, para enviarla al GCS, pero sin éxito. >>>>> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da GCS >>>>> para hacer lo mismo con un fichero directamente, que lo que hace es leerlo >>>>> completo en memoria y enviarlo, no me da problemas y transcribe bien el texto. >>>>> Basandome en el código de ejemplo de GCS para streaming >>>>> def read_in_chunks(file_object,chunk_size): >>>>> """Lazy function (generator) to read a file piece by piece. >>>>> while True: >>>>> chunk = file_object.read(chunk_size) >>>>> if not chunk: >>>>> return >>>>> data = [chunk] >>>>> yield b''.join(data) >>>>> def transcribe_streaming(stream_file,language,timeout): >>>>> """Streams transcription of the given audio file.""" >>>>> from google.cloud import speech >>>>> from google.cloud.speech import enums >>>>> from google.cloud.speech import types >>>>> import io >>>>> client = speech.SpeechClient() >>>>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >>>>> audio_file = io.open(stream_file+'.sln16','rb') >>>>> # In practice, stream should be a generator yielding chunks of audio data. >>>>> requests = (types.StreamingRecognizeRequest(audio_content=chunk) >>>>> for chunk in read_in_chunks(audio_file,3200)) >>>>> config = types.RecognitionConfig( >>>>> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, >>>>> sample_rate_hertz=16000, >>>>> language_code=language) >>>>> #streaming_config = >>>>> types.StreamingRecognitionConfig(config=config,single_utterance=True) >>>>> streaming_config = types.StreamingRecognitionConfig(config=config) >>>>> # streaming_recognize returns a generator. >>>>> responses = client.streaming_recognize(streaming_config, requests) >>>>> for response in responses: >>>>> # Once the transcription has settled, the first result will contain the >>>>> # is_final result. The other results will be for subsequent portions of >>>>> # the audio. >>>>> for result in response.results: >>>>> if result.is_final: >>>>> print('Finished: {}'.format(result.is_final)) >>>>> print('Stability: {}'.format(result.stability)) >>>>> alternatives = result.alternatives >>>>> ### The alternatives are ordered from most likely to least. >>>>> for alternative in alternatives: >>>>> print('Confidence: {}'.format(alternative.confidence)) >>>>> print(u'Transcript: {}'.format(alternative.transcript)) >>>>> (null) >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> [ mailto:Python-es en python.org | Python-es en python.org ] >>>>> [ https://mail.python.org/mailman/listinfo/python-es | >>>>> https://mail.python.org/mailman/listinfo/python-es ] >>>> _______________________________________________ >>>> Python-es mailing list >>>> [ mailto:Python-es en python.org | Python-es en python.org ] >>>> [ https://mail.python.org/mailman/listinfo/python-es | >>>> https://mail.python.org/mailman/listinfo/python-es ] >>> _______________________________________________ >>> Python-es mailing list >>> [ mailto:Python-es en python.org | Python-es en python.org ] >>> [ https://mail.python.org/mailman/listinfo/python-es | >>> https://mail.python.org/mailman/listinfo/python-es ] >> _______________________________________________ >> Python-es mailing list >> [ mailto:Python-es en python.org | Python-es en python.org ] >> [ https://mail.python.org/mailman/listinfo/python-es | >> https://mail.python.org/mailman/listinfo/python-es ] > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lasizoillo en gmail.com Fri Jul 5 03:19:57 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Fri, 5 Jul 2019 09:19:57 +0200 Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: <1571371190.1452719.1562267814439.JavaMail.zimbra@dimension-virtual.com> References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> <1088595464.1452258.1562262932246.JavaMail.zimbra@dimension-virtual.com> <1571371190.1452719.1562267814439.JavaMail.zimbra@dimension-virtual.com> Message-ID: Buenas, El código que has mandado tiene pinta de ser un corta y pega de tu código real, por lo que nadie mas que tu va a poder reproducirlo. Así que lo único que veo viable es hablarte de las herramientas que usaría para investigarlo y que lo hagas tu mismo por tu cuenta. Usa un depurador -------------------------- Python viene con pdb incluido, aquí tienes un depurador para usarlo https://www.pybonacci.org/2013/06/14/como-depurar-un-programa-python-con-pdb/ Si usas algún IDE (por ejemplo pycharm) esto lo podrás hacer de una forma más visual. Con esto podrás ver si te está lanzando alguna excepción que estés enmascarando o ponerte a ejecutar código para ver información del fichero con os.stat() o lo que sea. Evalúa las llamadas al sistema ---------------------------------------------- Dices tener un código en node.js que funciona, pero en python no. Es posible que analizando llamadas al sistema de uno y otro código encuentres alguna diferencia que te sea inspiradora para encontrar tu problema. Puedes usar el comando de linux strace o el truss de freebsd u otros unix para encontrar las llamadas que se hacen. Prueba un cambio de paradigma ----------------------------------------------- Quieres leer un fichero que está constantemente cambiando por lo que usar llamadas a sistema como kqueue en freebsd o inotify en linux pueden ayudarte a recibir eventos cuando el fichero cambie y leerlo entonces. Hay librerias dependiendo de tu SO (algunas son multiplataforma) para hacer un poco más fácil esta tarea (por ejemplo pyinotify para linux). Con esto evitas tener que hacer pollings para ver si hay nuevos datos o no y solo lees cuando sabes que tienes nuevos datos en el fichero. Espero que algo de esto te sirva. Un saludo, Javi El jue., 4 jul. 2019 a las 21:17, Raúl Alexis Betancor Santana (< rabs en dimension-virtual.com>) escribió: > El archivo no está vacío ... le he puesto un sleep de 2s para hacer > pruebas ANTES de abrir el fichero, y veo que en el FS tiene tamaño, así que > de vacio nada. Lo que no entiendo es porqué no lee absolutamente nada. > > ------------------------------ > > *De: *"Da?id" > *Para: *"python-es" > *Enviados: *Jueves, 4 de Julio 2019 19:29:52 > *Asunto: *Re: [Python-es] Leer fichero al mismo tiempo que se está > escribiendo por otro proceso. > > El archivo está vacío, así que chunk es una cadena vacía. Esa función > asume que el archivo no está creciendo, así que cuando no lee más, el > archivo está terminado. > > On Thu, 4 Jul 2019, 7:56 pm Raúl Alexis Betancor Santana, < > rabs en dimension-virtual.com> wrote: > >> Haciendo más pruebas, he llegado a la conclusión, de que lo que está mal >> es la función de read_in_chunks ... ya que nunca lee nada y siempre acaba >> dentro del if not chunk: break ... y no entiendo porque narices. >> >> En todos los ejemplos que encuentro por la red para leer un fichero >> binario por porciones, siempre usan mas o menos el mismo estilo de código >> para la función, pero esta parece que nunca lee nada. >> >> ¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un >> fichero binario a trozos? ... :-( >> >> ------------------------------ >> >> *De: *"Raúl Alexis Betancor Santana" >> *Para: *"python-es" >> *Enviados: *Jueves, 4 de Julio 2019 13:55:56 >> *Asunto: *Re: [Python-es] Leer fichero al mismo tiempo que se está >> escribiendo por otro proceso. >> >> No puedo, los ficheros los genera Asterisk y no voy a estar tocando el >> código para eso. >> >> He probado añadiendo un delay de 250ms al inicio de la lectura, para >> darle tiempo a que haga un flush a disco, pero tampoco me vá. >> >> En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y >> que hace exactamente lo mismo, funciona perfectamente, pero el código de >> python se me queda en el for response in responses: ... osea, no llega >> nunca a recibir respuesta de GCS o el generador del read_in_chunks no está >> resolviendo o algo raro. >> >> Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un >> script en python que ejecutaba desde el EAGI y tampoco había forma, o >> escuchaba el stream de audio y lo interpretaba o reproducía una locución >> del IVR, pero no ambas cosas al mismo tiempo y hacerlo vía threads, se me >> complicaba la cosa, hacerlo vía multiprocess y pipes, tenía el problema de >> que tenía que estar leyendo desde el proceso hijo el FD 3 del proceso >> padre, un coñazo. >> >> Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. >> >> ------------------------------ >> >> *De: *"Da?id" >> *Para: *"python-es" >> *Enviados: *Jueves, 4 de Julio 2019 11:57:11 >> *Asunto: *Re: [Python-es] Leer fichero al mismo tiempo que se está >> escribiendo por otro proceso. >> >> Creo que has encontrado la solución, pero la has puesto en el lugar >> equivocado. >> >> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >> >> El proceso que está escribiendo al archivo está probablemente usando un >> buffer, lo que quiere decir que sólo escribe al disco duro de vez en >> cuando, cuando haya acumulado una cierta cantidad de datos. Si tienes >> acceso al programa que escribe el archivo, tienes que o bien desactivar el >> buffer (¡cuidado con el rendimiento!), usar uno más pequeño, o vaciarlo >> explícitamente con un flush() más a menudo. >> >> >> >> On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < >> rabs en dimension-virtual.com> wrote: >> >>> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he >>> intento leer en stream de un fichero que está siendo escrito por otro >>> proceso, que contiene la grabación del audio, para enviarla al GCS, pero >>> sin éxito. >>> >>> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que >>> da GCS para hacer lo mismo con un fichero directamente, que lo que hace es >>> leerlo completo en memoria y enviarlo, no me da problemas y transcribe bien >>> el texto. >>> >>> Basandome en el código de ejemplo de GCS para streaming >>> >>> def read_in_chunks(file_object,chunk_size): >>> """Lazy function (generator) to read a file piece by piece. >>> while True: >>> chunk = file_object.read(chunk_size) >>> if not chunk: >>> return >>> data = [chunk] >>> yield b''.join(data) >>> >>> def transcribe_streaming(stream_file,language,timeout): >>> """Streams transcription of the given audio file.""" >>> from google.cloud import speech >>> from google.cloud.speech import enums >>> from google.cloud.speech import types >>> import io >>> client = speech.SpeechClient() >>> >>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >>> audio_file = io.open(stream_file+'.sln16','rb') >>> # In practice, stream should be a generator yielding chunks of audio >>> data. >>> requests = (types.StreamingRecognizeRequest(audio_content=chunk) >>> for chunk in read_in_chunks(audio_file,3200)) >>> >>> config = types.RecognitionConfig( >>> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, >>> sample_rate_hertz=16000, >>> language_code=language) >>> #streaming_config = >>> types.StreamingRecognitionConfig(config=config,single_utterance=True) >>> streaming_config = types.StreamingRecognitionConfig(config=config) >>> >>> # streaming_recognize returns a generator. >>> responses = client.streaming_recognize(streaming_config, requests) >>> for response in responses: >>> # Once the transcription has settled, the first result will contain >>> the >>> # is_final result. The other results will be for subsequent portions >>> of >>> # the audio. >>> for result in response.results: >>> if result.is_final: >>> print('Finished: {}'.format(result.is_final)) >>> print('Stability: {}'.format(result.stability)) >>> alternatives = result.alternatives >>> ### The alternatives are ordered from most likely to least. >>> for alternative in alternatives: >>> print('Confidence: {}'.format(alternative.confidence)) >>> print(u'Transcript: {}'.format(alternative.transcript)) >>> (null) >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From rabs en dimension-virtual.com Fri Jul 5 07:15:34 2019 From: rabs en dimension-virtual.com (=?utf-8?B?UmHDumw=?= Alexis Betancor Santana) Date: Fri, 5 Jul 2019 13:15:34 +0200 (CEST) Subject: [Python-es] =?utf-8?q?Leer_fichero_al_mismo_tiempo_que_se_est?= =?utf-8?q?=C3=A1_escribiendo_por_otro_proceso=2E?= In-Reply-To: References: <853925034.1444750.1562235488821.JavaMail.zimbra@dimension-virtual.com> <805392914.1448643.1562244956578.JavaMail.zimbra@dimension-virtual.com> <1088595464.1452258.1562262932246.JavaMail.zimbra@dimension-virtual.com> <1571371190.1452719.1562267814439.JavaMail.zimbra@dimension-virtual.com> Message-ID: <1929997313.1462901.1562325334084.JavaMail.zimbra@dimension-virtual.com> Si, el código es básicamente el ejemplo de reconocimiento de texto sobre audio en streaming que tiene Google en su repo de github, solo que fallaba la parte del streaming cuando esta viene de un fichero y no de una fuente como un mícrófono. Al final conseguí resolverlo modificando la función de read_in_chunks, que como sospechaba era la culpable. Encontré la inspiración en las diapositivas de una conferencia de la PyCon 2008, que trataba específicamente el tema de iteradores y generadores. [ http://www.dabeaz.com/generators/Generators.pdf | http://www.dabeaz.com/generators/Generators.pdf ] La pista estaba en el parte cuando habla de "Part 5. Processing Infinite Data", página 72, en la página 75 está el ejemplo que me ayudó a resolver el problema. Sigo teniendo un pequeño fleco, que es que se queda intentando estremear el fichero incluso cuando ya se ha cerrado la grabación ... pero no me importa, porque genera una Excepción que es fácil capturar y hacer el clean_up de todo antes de acabar el procesado. Gracias por las pistas. > De: "lasizoillo" > Para: "python-es" > Enviados: Viernes, 5 de Julio 2019 8:19:57 > Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por > otro proceso. > Buenas, > El código que has mandado tiene pinta de ser un corta y pega de tu código real, > por lo que nadie mas que tu va a poder reproducirlo. Así que lo único que veo > viable es hablarte de las herramientas que usaría para investigarlo y que lo > hagas tu mismo por tu cuenta. > Usa un depurador > -------------------------- > Python viene con pdb incluido, aquí tienes un depurador para usarlo [ > https://www.pybonacci.org/2013/06/14/como-depurar-un-programa-python-con-pdb/ | > https://www.pybonacci.org/2013/06/14/como-depurar-un-programa-python-con-pdb/ ] > Si usas algún IDE (por ejemplo pycharm) esto lo podrás hacer de una forma más > visual. Con esto podrás ver si te está lanzando alguna excepción que estés > enmascarando o ponerte a ejecutar código para ver información del fichero con > os.stat() o lo que sea. > Evalúa las llamadas al sistema > ---------------------------------------------- > Dices tener un código en node.js que funciona, pero en python no. Es posible que > analizando llamadas al sistema de uno y otro código encuentres alguna > diferencia que te sea inspiradora para encontrar tu problema. Puedes usar el > comando de linux strace o el truss de freebsd u otros unix para encontrar las > llamadas que se hacen. > Prueba un cambio de paradigma > ----------------------------------------------- > Quieres leer un fichero que está constantemente cambiando por lo que usar > llamadas a sistema como kqueue en freebsd o inotify en linux pueden ayudarte a > recibir eventos cuando el fichero cambie y leerlo entonces. Hay librerias > dependiendo de tu SO (algunas son multiplataforma) para hacer un poco más fácil > esta tarea (por ejemplo pyinotify para linux). Con esto evitas tener que hacer > pollings para ver si hay nuevos datos o no y solo lees cuando sabes que tienes > nuevos datos en el fichero. > Espero que algo de esto te sirva. > Un saludo, > Javi > El jue., 4 jul. 2019 a las 21:17, Raúl Alexis Betancor Santana (< [ > mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] >) escribió: >> El archivo no está vacío ... le he puesto un sleep de 2s para hacer pruebas >> ANTES de abrir el fichero, y veo que en el FS tiene tamaño, así que de vacio >> nada. Lo que no entiendo es porqué no lee absolutamente nada. >>> De: "Da?id" < [ mailto:davidmenhur en gmail.com | davidmenhur en gmail.com ] > >>> Para: "python-es" < [ mailto:python-es en python.org | python-es en python.org ] > >>> Enviados: Jueves, 4 de Julio 2019 19:29:52 >>> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por >>> otro proceso. >>> El archivo está vacío, así que chunk es una cadena vacía. Esa función asume que >>> el archivo no está creciendo, así que cuando no lee más, el archivo está >>> terminado. >>> On Thu, 4 Jul 2019, 7:56 pm Raúl Alexis Betancor Santana, < [ >>> mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote: >>>> Haciendo más pruebas, he llegado a la conclusión, de que lo que está mal es la >>>> función de read_in_chunks ... ya que nunca lee nada y siempre acaba dentro del >>>> if not chunk: break ... y no entiendo porque narices. >>>> En todos los ejemplos que encuentro por la red para leer un fichero binario por >>>> porciones, siempre usan mas o menos el mismo estilo de código para la función, >>>> pero esta parece que nunca lee nada. >>>> ¿Que estoy haciendo rematadamente mal, que no soy capaz de leer un fichero >>>> binario a trozos? ... :-( >>>>> De: "Raúl Alexis Betancor Santana" < [ mailto:rabs en dimension-virtual.com | >>>>> rabs en dimension-virtual.com ] > >>>>> Para: "python-es" < [ mailto:python-es en python.org | python-es en python.org ] > >>>>> Enviados: Jueves, 4 de Julio 2019 13:55:56 >>>>> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por >>>>> otro proceso. >>>>> No puedo, los ficheros los genera Asterisk y no voy a estar tocando el código >>>>> para eso. >>>>> He probado añadiendo un delay de 250ms al inicio de la lectura, para darle >>>>> tiempo a que haga un flush a disco, pero tampoco me vá. >>>>> En realidad lo que me mosquea, es que un ejemplo que tengo en Node.js y que hace >>>>> exactamente lo mismo, funciona perfectamente, pero el código de python se me >>>>> queda en el for response in responses: ... osea, no llega nunca a recibir >>>>> respuesta de GCS o el generador del read_in_chunks no está resolviendo o algo >>>>> raro. >>>>> Ahora lo estoy intentando con ARI, porque llevo días intentandolo con un script >>>>> en python que ejecutaba desde el EAGI y tampoco había forma, o escuchaba el >>>>> stream de audio y lo interpretaba o reproducía una locución del IVR, pero no >>>>> ambas cosas al mismo tiempo y hacerlo vía threads, se me complicaba la cosa, >>>>> hacerlo vía multiprocess y pipes, tenía el problema de que tenía que estar >>>>> leyendo desde el proceso hijo el FD 3 del proceso padre, un coñazo. >>>>> Si ha alguien se le ocurre como resolver esto ... estoy abierto a ideas. >>>>>> De: "Da?id" < [ mailto:davidmenhur en gmail.com | davidmenhur en gmail.com ] > >>>>>> Para: "python-es" < [ mailto:python-es en python.org | python-es en python.org ] > >>>>>> Enviados: Jueves, 4 de Julio 2019 11:57:11 >>>>>> Asunto: Re: [Python-es] Leer fichero al mismo tiempo que se está escribiendo por >>>>>> otro proceso. >>>>>> Creo que has encontrado la solución, pero la has puesto en el lugar equivocado. >>>>>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >>>>>> El proceso que está escribiendo al archivo está probablemente usando un buffer, >>>>>> lo que quiere decir que sólo escribe al disco duro de vez en cuando, cuando >>>>>> haya acumulado una cierta cantidad de datos. Si tienes acceso al programa que >>>>>> escribe el archivo, tienes que o bien desactivar el buffer (¡cuidado con el >>>>>> rendimiento!), usar uno más pequeño, o vaciarlo explícitamente con un flush() >>>>>> más a menudo. >>>>>> On Thu, 4 Jul 2019 at 12:28, Raúl Alexis Betancor Santana < [ >>>>>> mailto:rabs en dimension-virtual.com | rabs en dimension-virtual.com ] > wrote: >>>>>>> Buenas, estoy intentando hechar a andar el Google Cloud Speech, he intento leer >>>>>>> en stream de un fichero que está siendo escrito por otro proceso, que contiene >>>>>>> la grabación del audio, para enviarla al GCS, pero sin éxito. >>>>>>> ¿Alguien me puede comentar que estoy haciendo mal?, con el ejemplo que da GCS >>>>>>> para hacer lo mismo con un fichero directamente, que lo que hace es leerlo >>>>>>> completo en memoria y enviarlo, no me da problemas y transcribe bien el texto. >>>>>>> Basandome en el código de ejemplo de GCS para streaming >>>>>>> def read_in_chunks(file_object,chunk_size): >>>>>>> """Lazy function (generator) to read a file piece by piece. >>>>>>> while True: >>>>>>> chunk = file_object.read(chunk_size) >>>>>>> if not chunk: >>>>>>> return >>>>>>> data = [chunk] >>>>>>> yield b''.join(data) >>>>>>> def transcribe_streaming(stream_file,language,timeout): >>>>>>> """Streams transcription of the given audio file.""" >>>>>>> from google.cloud import speech >>>>>>> from google.cloud.speech import enums >>>>>>> from google.cloud.speech import types >>>>>>> import io >>>>>>> client = speech.SpeechClient() >>>>>>> #audio_file = io.open(stream_file+'.sln16','rb',buffering=0) >>>>>>> audio_file = io.open(stream_file+'.sln16','rb') >>>>>>> # In practice, stream should be a generator yielding chunks of audio data. >>>>>>> requests = (types.StreamingRecognizeRequest(audio_content=chunk) >>>>>>> for chunk in read_in_chunks(audio_file,3200)) >>>>>>> config = types.RecognitionConfig( >>>>>>> encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, >>>>>>> sample_rate_hertz=16000, >>>>>>> language_code=language) >>>>>>> #streaming_config = >>>>>>> types.StreamingRecognitionConfig(config=config,single_utterance=True) >>>>>>> streaming_config = types.StreamingRecognitionConfig(config=config) >>>>>>> # streaming_recognize returns a generator. >>>>>>> responses = client.streaming_recognize(streaming_config, requests) >>>>>>> for response in responses: >>>>>>> # Once the transcription has settled, the first result will contain the >>>>>>> # is_final result. The other results will be for subsequent portions of >>>>>>> # the audio. >>>>>>> for result in response.results: >>>>>>> if result.is_final: >>>>>>> print('Finished: {}'.format(result.is_final)) >>>>>>> print('Stability: {}'.format(result.stability)) >>>>>>> alternatives = result.alternatives >>>>>>> ### The alternatives are ordered from most likely to least. >>>>>>> for alternative in alternatives: >>>>>>> print('Confidence: {}'.format(alternative.confidence)) >>>>>>> print(u'Transcript: {}'.format(alternative.transcript)) >>>>>>> (null) >>>>>>> _______________________________________________ >>>>>>> Python-es mailing list >>>>>>> [ mailto:Python-es en python.org | Python-es en python.org ] >>>>>>> [ https://mail.python.org/mailman/listinfo/python-es | >>>>>>> https://mail.python.org/mailman/listinfo/python-es ] >>>>>> _______________________________________________ >>>>>> Python-es mailing list >>>>>> [ mailto:Python-es en python.org | Python-es en python.org ] >>>>>> [ https://mail.python.org/mailman/listinfo/python-es | >>>>>> https://mail.python.org/mailman/listinfo/python-es ] >>>>> _______________________________________________ >>>>> Python-es mailing list >>>>> [ mailto:Python-es en python.org | Python-es en python.org ] >>>>> [ https://mail.python.org/mailman/listinfo/python-es | >>>>> https://mail.python.org/mailman/listinfo/python-es ] >>>> _______________________________________________ >>>> Python-es mailing list >>>> [ mailto:Python-es en python.org | Python-es en python.org ] >>>> [ https://mail.python.org/mailman/listinfo/python-es | >>>> https://mail.python.org/mailman/listinfo/python-es ] >>> _______________________________________________ >>> Python-es mailing list >>> [ mailto:Python-es en python.org | Python-es en python.org ] >>> [ https://mail.python.org/mailman/listinfo/python-es | >>> https://mail.python.org/mailman/listinfo/python-es ] >> _______________________________________________ >> Python-es mailing list >> [ mailto:Python-es en python.org | Python-es en python.org ] >> [ https://mail.python.org/mailman/listinfo/python-es | >> https://mail.python.org/mailman/listinfo/python-es ] > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Sat Jul 6 12:19:22 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Sat, 6 Jul 2019 18:19:22 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: El jue., 4 jul. 2019 a las 0:47, lasizoillo () escribió: > Buenas, > > Tras leer el correo de Chema me puse a pensar en cuantos bits de > información se podía obtener de randint(1,5) y cuantos necesitaba > randint(1,7) y me dio por pensar que era ln2(5) y ln2(7). Lo cual > seguramente es incorrecto (las mates no son lo mío), pero aun siendo una > estimación menor que el ideal propuesto por Chema de 1.4 llamadas es mayor > al usado en la solución de Mario (1). Así que había pensado en hacer unos > tests de aleatoriedad sobre esa solución demasiado bonita para ser cierta, > pero gracias por adelantarte. > > ¿Se deberían descartar todas las soluciones que hagan menos de 1.2 o 1.4 > llamadas a randint(1,5) para calcular randint(1,7)? > > Yo muchas veces hablo más por intuición, por lo que considera ese límite como una estimación. Los estados definidos con randint(1,7) tienen más información que los definidos por randint(1,5), de ahí la estimación de 1.4 (=7/5) (puedes calcularlo en bits, pero sale lo mismo). Como 5 y 7 son primos entre sí, no es posible establecer una relación directa de estados. Dicho de otro modo: no existen n y m, números enteros, de modo que se cumpla la igualdad 5**n == 7**m. Siempre será necesario despreciar casos iniciales para que la distribución resultante sea más o menos uniforme. Analizando la solución propuesta anteriormente: para un valor de randint(1,7) es necesario llamar 3 veces a randint(1,5), con una probalidadad de repetir llamada de 3/5 + 1/8 = 29/40 ~= 0.72, probabilidad que es bastante alta. Una posible mejora sería hacer sólo dos llamadas, 25 casos posibles, y "mapearlos" con 21 estados de randint(1,7). Quedarían 4 casos sin mapear. La probabilidad de repetir tirada sería 4/25 ~= 0.16 que está bastante mejor. El código quedaría así: from random import randint from functools import partial # única función random que se permite usar rand5 = partial(randint, 1, 5) # yapf: disable # matriz de conversión conv = [ [1, 2, 3, 4, 5], [6, 7, 1, 2, 3], [4, 5, 6, 7, 1], [2, 3, 4, 5, 6], [7, 0, 0, 0, 0] ] # yapf: enable def rand7() -> int: """ Generador aleatorio de números en rango [1,7] a partir de randint(1,5) """ res = 0 while not res: # tomamos dos números aleatorios en el rango [1,5] (a, b) = (rand5(), rand5()) # buscamos su correspondencia en el rango [1,7] res = conv[a - 1][b - 1] return res Pero aún se puede hacer mejor. Podemos mapear los 125 estados posibles de 3 llamadas de randint(1,5) con 98 (2*7**2) estados de randint(1,7). La probabilidad de tener que repetir la tirada sería de 0.216, algo peor que en el caso anterior. Pero que el número de llamadas necesarias se reduzca a 1.5 nos acercaría bastante al límite ideal. Como este caso es algo más largo, lo dejo disponible como gist, incluyendo un test de uniformidad por probar algo: https://gist.github.com/chemacortes/3d66daf14b2ebd2190cd50d969defaed Una prueba completa de aleatoriedad es bastante compleja. Hay un artículo sobre criptografía bastante bueno sobre el tema en: https://www.incibe-cert.es/blog/comprobando-aleatoriedad -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Sat Jul 6 12:33:24 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Sat, 6 Jul 2019 18:33:24 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Repito el código por si no se ve bien la identación del anterior mensaje: from random import randint from functools import partial # única función random que se permite usar rand5 = partial(randint, 1, 5) # yapf: disable # matriz de conversión conv = [ [1, 2, 3, 4, 5], [6, 7, 1, 2, 3], [4, 5, 6, 7, 1], [2, 3, 4, 5, 6], [7, 0, 0, 0, 0] ] # yapf: enable def rand7() -> int: """ Generador aleatorio de números en rango [1,7] a partir de randint(1,5) """ res = 0 while not res: # tomamos dos números aleatorios en el rango [1,5] (a, b) = (rand5(), rand5()) # buscamos su correspondencia en el rango [1,7] res = conv[a - 1][b - 1] return res El sáb., 6 jul. 2019 a las 18:19, Chema Cortes () escribió: > El jue., 4 jul. 2019 a las 0:47, lasizoillo () > escribió: > >> Buenas, >> >> Tras leer el correo de Chema me puse a pensar en cuantos bits de >> información se podía obtener de randint(1,5) y cuantos necesitaba >> randint(1,7) y me dio por pensar que era ln2(5) y ln2(7). Lo cual >> seguramente es incorrecto (las mates no son lo mío), pero aun siendo una >> estimación menor que el ideal propuesto por Chema de 1.4 llamadas es mayor >> al usado en la solución de Mario (1). Así que había pensado en hacer unos >> tests de aleatoriedad sobre esa solución demasiado bonita para ser cierta, >> pero gracias por adelantarte. >> >> ¿Se deberían descartar todas las soluciones que hagan menos de 1.2 o 1.4 >> llamadas a randint(1,5) para calcular randint(1,7)? >> >> > Yo muchas veces hablo más por intuición, por lo que considera ese límite > como una estimación. > > Los estados definidos con randint(1,7) tienen más información que los > definidos por randint(1,5), de ahí la estimación de 1.4 (=7/5) (puedes > calcularlo en bits, pero sale lo mismo). Como 5 y 7 son primos entre sí, no > es posible establecer una relación directa de estados. Dicho de otro modo: > no existen n y m, números enteros, de modo que se cumpla la igualdad 5**n > == 7**m. Siempre será necesario despreciar casos iniciales para que la > distribución resultante sea más o menos uniforme. > > Analizando la solución propuesta anteriormente: para un valor de > randint(1,7) es necesario llamar 3 veces a randint(1,5), con una > probalidadad de repetir llamada de 3/5 + 1/8 = 29/40 ~= 0.72, probabilidad > que es bastante alta. > > Una posible mejora sería hacer sólo dos llamadas, 25 casos posibles, y > "mapearlos" con 21 estados de randint(1,7). Quedarían 4 casos sin mapear. > La probabilidad de repetir tirada sería 4/25 ~= 0.16 que está bastante > mejor. > > El código quedaría así: > from random import randint > from functools import partial > > # única función random que se permite usar > rand5 = partial(randint, 1, 5) > > # yapf: disable > # matriz de conversión > conv = [ > [1, 2, 3, 4, 5], > [6, 7, 1, 2, 3], > [4, 5, 6, 7, 1], > [2, 3, 4, 5, 6], > [7, 0, 0, 0, 0] > ] > # yapf: enable > > > def rand7() -> int: > """ > Generador aleatorio de números en rango [1,7] > a partir de randint(1,5) > """ > > res = 0 > while not res: > > # tomamos dos números aleatorios en el rango [1,5] > (a, b) = (rand5(), rand5()) > > # buscamos su correspondencia en el rango [1,7] > res = conv[a - 1][b - 1] > > return res > Pero aún se puede hacer mejor. Podemos mapear los 125 estados posibles de > 3 llamadas de randint(1,5) con 98 (2*7**2) estados de randint(1,7). La > probabilidad de tener que repetir la tirada sería de 0.216, algo peor que > en el caso anterior. Pero que el número de llamadas necesarias se reduzca a > 1.5 nos acercaría bastante al límite ideal. > > Como este caso es algo más largo, lo dejo disponible como gist, incluyendo > un test de uniformidad por probar algo: > > https://gist.github.com/chemacortes/3d66daf14b2ebd2190cd50d969defaed > > Una prueba completa de aleatoriedad es bastante compleja. Hay un artículo > sobre criptografía bastante bueno sobre el tema en: > > https://www.incibe-cert.es/blog/comprobando-aleatoriedad > > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > https://blog.ch3m4.org > Buscador Python Hispano: http://busca.ch3m4.org > > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From turriano en gmail.com Sat Jul 6 19:23:07 2019 From: turriano en gmail.com (Turriano) Date: Sun, 7 Jul 2019 01:23:07 +0200 Subject: [Python-es] Fwd: Consejo sobre reconocimiento de voz In-Reply-To: <1fd60226-096c-c69b-da25-47666da77eb9@gmail.com> References: <1fd60226-096c-c69b-da25-47666da77eb9@gmail.com> Message-ID: Hola! Tengo una Raspberry Pi, a la que uso para hacer experimentos de robótica y de electrónica digital en general. Me voy defendiendo con Python, pero no soy ningún experto, ni muchísimo menos. Estoy buscando soluciones para poder meter algunas palabras por audio ("adelante", "atrás", "derecha", "izquierda", "claxon" o "alarma". Por ejemplo) y cada una de éstas manejen una salida de los gpios. Mi intención es hacer una varsión de un carrito de la compra eléctrico, con el que suelo experimentar con varios sistemas de control. He probado por infrarrojos (por cierto, que no funcionó) :-( y con mejor éxito mediante rc y con una botonera y cables directamente conectada a los motores. Vosotros que sabéis mucho más que yo: ¿Qué librerías o qué sistemas podría usar para esto? Otros sistema que había pensado (aunque por ahora preferiría usar el primero que he comentado, que me detecte desde ambos lados del carrito, esquinas derecha e izquierda) y que cuando yo gire, una de las esquinas deje de detectarme y pare el motor contrario, obligando al carrito a girar (pues funciona con dos motores y gira parando uno de ellos). Pongo la dirección de alguno de los modelos, por si queréis echalos un ojo: https://youtu.be/4r1NyQiHm-g https://youtu.be/fYCSYlgkurM ¡Saludos y gracias! B-) From lasizoillo en gmail.com Sun Jul 7 07:00:21 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Sun, 7 Jul 2019 13:00:21 +0200 Subject: [Python-es] Fwd: Consejo sobre reconocimiento de voz In-Reply-To: References: <1fd60226-096c-c69b-da25-47666da77eb9@gmail.com> Message-ID: Buenas, Te contesto sobre el mensaje El dom., 7 jul. 2019 a las 1:23, Turriano () escribió: > > Estoy buscando soluciones para poder meter algunas palabras por audio > ("adelante", "atrás", "derecha", "izquierda", "claxon" o "alarma". Por > ejemplo) y cada una de éstas manejen una salida de los gpios. > Mi intención es hacer una varsión de un carrito de la compra eléctrico, > con el que suelo experimentar con varios sistemas de control. > He probado por infrarrojos (por cierto, que no funcionó) :-( y con mejor > éxito mediante rc y con una botonera y cables directamente conectada a > los motores. > Vosotros que sabéis mucho más que yo: > ¿Qué librerías o qué sistemas podría usar para esto? > > Siempre que he buscado librerías para hacer eso que tu comentas acabo un poco desesperado. Por ejemplo en este post https://realpython.com/python-speech-recognition/ comentan 7 librerias de las cuales solo pocketsphinx permite reconocer voces sin conectarse a internet. SpeechRecognition es un frontend de este último entre otros. El resto carecen de toda utilidad para hacer cosas de robótica sin conexión a internet (que es lo suyo). Mirando pocketsphinx le he visto que tiene como lenguajes ingles, frances, italiano y chino. Español no. También viene con una suite para entrenar idiomas que no me he mirado porque siempre me entra la pereza para hacer lo que quiero hacer, pero tiene pinta de que es lo suyo para tu caso concreto (entrenar un número reducido de hotwords o palabras clave): https://cmusphinx.github.io/wiki/tutoriallm/ En la descripción del paquete SpeechRecognition habla de otra librería que permite trabajar offline: https://pypi.org/project/SpeechRecognition/ Se trata de snowboy. Y parece* que con esta librería también valdría para lo que quieres. En la documentación incluso vienen ejemplos para hacer cosas con la raspberry pi: http://docs.kitt.ai/snowboy/#running-on-raspberry-pi *Aunque no me queda claro de si puede trabajar con más de una hotword (una para cada dirección del carrito, avance y parada) o solo sabe reconocer el siri, ok google, alexa,... correspondiente. Uno de los problemas habituales para poder avanzar en este campo es la ausencia de bancos de datos públicos con los que trabajar. Hay una iniciativa de mozilla para solucionar esto, así que ¡guay si salen de esta lista colaboradores! y ¡más aún si salen colaboradoras! https://voice.mozilla.org/ > Otros sistema que había pensado (aunque por ahora preferiría usar el > primero que he comentado, que me detecte desde ambos lados del carrito, > esquinas derecha e izquierda) y que cuando yo gire, una de las esquinas > deje de detectarme y pare el motor contrario, obligando al carrito a > girar (pues funciona con dos motores y gira parando uno de ellos). > Que te detecte a ti va a ser mucho más fácil que el reconocimiento de voz, pero que no detecte a troyano igual no es tan fácil :-) Un saludo, Javi ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From jcaballero.hep en gmail.com Sun Jul 7 12:31:43 2019 From: jcaballero.hep en gmail.com (Jose Caballero) Date: Sun, 7 Jul 2019 12:31:43 -0400 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: Muchas gracias a todos por los comentarios, soluciones, etc. Se las voy traduciendo a mi colega (no habla ni una palabra de español) y se las voy pasando. Y de paso yo también estoy aprendiendo bastante. Por cierto, por motivos que no vienen al caso, en el curro estamos atascados con python2.7 hasta que nuestro centro de trabajo renueve el contrato con RedHat para EL 8. O sea que aún no he necesitado aprender python3. Viendo el código de Chema... ¿Ahora hay que declarar los tipos? ¿Han convertido python en C++? En fin, parece que tendré que investigarlo. Muchas gracias por todo. Un saludo, Jose From davidmenhur en gmail.com Sun Jul 7 15:45:19 2019 From: davidmenhur en gmail.com (=?UTF-8?B?RGHPgGlk?=) Date: Sun, 7 Jul 2019 21:45:19 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: La declaración de tipos es opcional, pero si los declaras, puedes usar mypy para hacer análisis estático. En Python 2 lo puedes hacer con comentarios: https://mypy.readthedocs.io/en/latest/python2.html Lo bueno es que sólo lo tienes que declarar donde tú quieras. On Sun, 7 Jul 2019 at 18:24, Jose Caballero wrote: > Muchas gracias a todos por los comentarios, soluciones, etc. > Se las voy traduciendo a mi colega (no habla ni una palabra de español) y > se las voy pasando. > Y de paso yo también estoy aprendiendo bastante. > > Por cierto, por motivos que no vienen al caso, en el curro estamos > atascados con python2.7 hasta que nuestro centro de trabajo renueve el > contrato con RedHat para EL 8. > O sea que aún no he necesitado aprender python3. Viendo el código de > Chema... > ¿Ahora hay que declarar los tipos? ¿Han convertido python en C++? En fin, > parece que tendré que investigarlo. > > Muchas gracias por todo. > Un saludo, > Jose > > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Wed Jul 10 04:02:52 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Wed, 10 Jul 2019 10:02:52 +0200 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: El dom., 7 jul. 2019 a las 18:23, Jose Caballero () escribió: > > Por cierto, por motivos que no vienen al caso, en el curro estamos > atascados con python2.7 hasta que nuestro centro de trabajo renueve el > contrato con RedHat para EL 8. > O sea que aún no he necesitado aprender python3. Viendo el código de > Chema... > ¿Ahora hay que declarar los tipos? ¿Han convertido python en C++? En fin, > parece que tendré que investigarlo. > > Python sigue teniendo *tipado dinámico*. El tipado es una ayuda ("*type hint*") para algunas herramientas de análisis estático como *mypy *y otras herramientas de *refactorización*. Nada qué ver con el *tipado estático *de C++. Incluso cuando declaras sobrecarga de funciones (decorador @overload), la función que se llama siempre es la última que definida, como siempre pasaba en python si declaras más de una función con el mismo nombre. La ventaja del tipado opcional es que se puede detectar más tempranamente cualquier llamada a una función con argumentos de tipo erróneo. Si tienes en cuenta que casi todas las funciones en los módulos de la librería estándar ya definen sus tipos, la ayuda para el programador es muy grande. IDEs como Visual Code es capaz de darte ayuda visual y señalar errores de tipado a medida que escribes el código. PD: Python 2 tiene sus días contados. Pronto dejaran de darle soporte herramientas como pip. No lo dejéis estar. -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Mon Jul 15 23:04:52 2019 From: agtugo en gmail.com (AGTUGO) Date: Mon, 15 Jul 2019 20:04:52 -0700 Subject: [Python-es] Reemplazando Jinja2 con f-strings Message-ID: Dada la evaluación dentro de los f-strings, parece natural reemplazar los lenguajes de plantillas, como Jinja2 con f-string, con simplemente unos ajustes, excepto: Convertir de manera limpia los strings a f-strings. La única manera que he encontrado es usar eval, ¿Alguien tiene una idea mejor? Resultado deseado = void hola{ std::cout << "hola\n"}; F-string para generarlo = f"void{saludo}{{std::cout << "{saludo}\n"}};" Ejemplo Jinja = void {{saludo}}{std::cout <<"{{saludo}}\n"};" -- Arturo Muñoz ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From sergio en wikier.org Tue Jul 16 01:26:21 2019 From: sergio en wikier.org (=?UTF-8?Q?Sergio_Fern=C3=A1ndez?=) Date: Mon, 15 Jul 2019 22:26:21 -0700 Subject: [Python-es] Reemplazando Jinja2 con f-strings In-Reply-To: References: Message-ID: Un f-string es código, no un string. Yo no seguiría ese camino... es una mala idea y potencialmente un riesgo. ¿Por qué no seguir con Jinja? On Mon, Jul 15, 2019, 20:05 AGTUGO wrote: > Dada la evaluación dentro de los f-strings, parece natural reemplazar los > lenguajes de plantillas, como Jinja2 con f-string, con simplemente unos > ajustes, excepto: > > Convertir de manera limpia los strings a f-strings. > > La única manera que he encontrado es usar eval, ¿Alguien tiene una idea > mejor? > > Resultado deseado = void hola{ std::cout << "hola\n"}; > F-string para generarlo = f"void{saludo}{{std::cout << "{saludo}\n"}};" > Ejemplo Jinja = void {{saludo}}{std::cout <<"{{saludo}}\n"};" > > -- > Arturo Muñoz > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From lasizoillo en gmail.com Tue Jul 16 03:48:59 2019 From: lasizoillo en gmail.com (lasizoillo) Date: Tue, 16 Jul 2019 09:48:59 +0200 Subject: [Python-es] Reemplazando Jinja2 con f-strings In-Reply-To: References: Message-ID: Buenas, Creo conveniente leer esto antes que nada http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/ El mar., 16 jul. 2019 a las 7:27, Sergio Fernández () escribió: > Un f-string es código, no un string. Yo no seguiría ese camino... es una > mala idea y potencialmente un riesgo. > > ¿Por qué no seguir con Jinja? > Correcto, son potencialmente un riesgo, pero como ponen en el ejemplo sobre todo porque implican extender string.Formatter y que incluso el código que no use f-strings puede verse afectado por el cambio :-O > On Mon, Jul 15, 2019, 20:05 AGTUGO wrote: > >> Dada la evaluación dentro de los f-strings, parece natural reemplazar los >> lenguajes de plantillas, como Jinja2 con f-string, con simplemente unos >> ajustes, excepto: >> >> No, no resulta natural reemplazar un lenguaje de plantillas por algo que no te ofrece una sandbox, sentencias de control, separación entre el parseo del template (se realiza una sola vez y se cachea) y su uso, template loaders personalizables,... Otra cosa es que en tu caso particular no utilices casi nada de lo que te ofrece el sistema de plantillas y puedas quitarte una dependencia extra. Pero creo que sería un caso bastante alejado de la norma. > Convertir de manera limpia los strings a f-strings. >> >> La única manera que he encontrado es usar eval, ¿Alguien tiene una idea >> mejor? >> > Usar string.Formatter, pero si y solo si no te vas a disparar en el pié al hacerlo. > >> Resultado deseado = void hola{ std::cout << "hola\n"}; >> F-string para generarlo = f"void{saludo}{{std::cout << "{saludo}\n"}};" >> Ejemplo Jinja = void {{saludo}}{std::cout <<"{{saludo}}\n"};" >> >> -- >> Arturo Muñoz >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From agtugo en gmail.com Wed Jul 17 20:23:07 2019 From: agtugo en gmail.com (AGTUGO) Date: Wed, 17 Jul 2019 17:23:07 -0700 Subject: [Python-es] Reemplazando Jinja2 con f-strings In-Reply-To: References: Message-ID: La raz'on es eliminar esa dependencia porque nadie de mis colaboradores conoce Jinja2, y en este momento no cuentan con el tiempo para entenderlo. Pero bueno eso ya es otro tema. Pero s'i la mejor soluci'on sigue siendo Jinja On Tue, Jul 16, 2019 at 12:49 AM lasizoillo wrote: > Buenas, > > Creo conveniente leer esto antes que nada > http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/ > > El mar., 16 jul. 2019 a las 7:27, Sergio Fernández () > escribió: > >> Un f-string es código, no un string. Yo no seguiría ese camino... es una >> mala idea y potencialmente un riesgo. >> >> ¿Por qué no seguir con Jinja? >> > > Correcto, son potencialmente un riesgo, pero como ponen en el ejemplo > sobre todo porque implican extender string.Formatter y que incluso el > código que no use f-strings puede verse afectado por el cambio :-O > > >> On Mon, Jul 15, 2019, 20:05 AGTUGO wrote: >> >>> Dada la evaluación dentro de los f-strings, parece natural reemplazar >>> los lenguajes de plantillas, como Jinja2 con f-string, con simplemente unos >>> ajustes, excepto: >>> >>> > No, no resulta natural reemplazar un lenguaje de plantillas por algo que > no te ofrece una sandbox, sentencias de control, separación entre el parseo > del template (se realiza una sola vez y se cachea) y su uso, template > loaders personalizables,... > > Otra cosa es que en tu caso particular no utilices casi nada de lo que te > ofrece el sistema de plantillas y puedas quitarte una dependencia extra. > Pero creo que sería un caso bastante alejado de la norma. > > >> Convertir de manera limpia los strings a f-strings. >>> >>> La única manera que he encontrado es usar eval, ¿Alguien tiene una idea >>> mejor? >>> >> > Usar string.Formatter, pero si y solo si no te vas a disparar en el pié al > hacerlo. > > >> >>> Resultado deseado = void hola{ std::cout << "hola\n"}; >>> F-string para generarlo = f"void{saludo}{{std::cout << "{saludo}\n"}};" >>> Ejemplo Jinja = void {{saludo}}{std::cout <<"{{saludo}}\n"};" >>> >>> -- >>> Arturo Muñoz >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Arturo Muñoz Tolosa ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From pych3m4 en gmail.com Thu Jul 18 06:17:33 2019 From: pych3m4 en gmail.com (Chema Cortes) Date: Thu, 18 Jul 2019 12:17:33 +0200 Subject: [Python-es] Reemplazando Jinja2 con f-strings In-Reply-To: References: Message-ID: El jue., 18 jul. 2019 a las 2:23, AGTUGO () escribió: > La raz'on es eliminar esa dependencia porque nadie de mis colaboradores > conoce Jinja2, y en este momento no cuentan con el tiempo para entenderlo. > Pero bueno eso ya es otro tema. Pero s'i la mejor soluci'on sigue siendo > Jinja > Respondiendo a la pregunta primera, las *f-strings* también se pueden crear con triples comillas (eg: f"""void {saludo}{{std::cout << "{saludo}\n"}};""" ). Pero con cuidado. En tu cadena tienes un caracter de fin de línea. Lo recomendable es usar cadenas *raws* para evitar sorpresas: rf"""void {saludo}{{std::cout << "{saludo}\n"}};""" Las *f-strings* tienen sus limitaciones, que algo se mejorará con los llamados *f-literals*. De todos modos, no se resuelven los problemas de seguridad, inherentes al modo en que se formatean las strings. Si realmente buscas un reemplazo de Jinja para impacientes, mírate los *Templates[1]*. El código anterior se vería así: from string import Template code = Template("""void ${saludo}{std::cout << "${saludo}\n"};""").substitute(saludo="hola") Dentro de lo simple que parece, como primer argumento del *.substitute* se puede pasar un *mapping (aka diccionario)* que puedes programar como un objeto cuyo método __getitem__ procese la sustitución como necesites. Por ejemplo: class Upper(dict): def __getitem__(self, s): return s.upper() upper = Upper() code = Template("""void ${main}{std::cout << "${saludo}\n"};""").substitute(upper) Da como resultado: void MAIN{std::cout << "SALUDO\n"}; Si aún así se queda corto, también se puede derivar la clase Template para adaptarla mejor todavía. Por ejemplo, para cambiar delimitadores, cambiar la expresión regular para detectar patrones a sustituir, etc. Por ejemplo, para usar delimitadores '%% ... %%' y '%%[ ... ]%%': class T(Template): pattern = r""" %%(?: (?P%%) | # repetición del delimitador (?P\w+?)%% | # encontrado patrón %% \[(?P.+?)\]%% | # encontrado patrón %%[ (?P^$) # inválido salto de línea ) """ El delimitador %%..%% encierra únicamente palabras, mientras que %%[..]%% puede delimitar cualquier cosa: code = T(r"""void %%main%%{std::cout << %%[value % 5]%%};""" ).substitute(upper) dará void MAIN{std::cout << VALUE % 5}; [1]: https://docs.python.org/3.7/library/string.html#template-strings > > On Tue, Jul 16, 2019 at 12:49 AM lasizoillo wrote: > >> Buenas, >> >> Creo conveniente leer esto antes que nada >> http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/ >> >> El mar., 16 jul. 2019 a las 7:27, Sergio Fernández () >> escribió: >> >>> Un f-string es código, no un string. Yo no seguiría ese camino... es una >>> mala idea y potencialmente un riesgo. >>> >>> ¿Por qué no seguir con Jinja? >>> >> >> Correcto, son potencialmente un riesgo, pero como ponen en el ejemplo >> sobre todo porque implican extender string.Formatter y que incluso el >> código que no use f-strings puede verse afectado por el cambio :-O >> >> >>> On Mon, Jul 15, 2019, 20:05 AGTUGO wrote: >>> >>>> Dada la evaluación dentro de los f-strings, parece natural reemplazar >>>> los lenguajes de plantillas, como Jinja2 con f-string, con simplemente unos >>>> ajustes, excepto: >>>> >>>> >> No, no resulta natural reemplazar un lenguaje de plantillas por algo que >> no te ofrece una sandbox, sentencias de control, separación entre el parseo >> del template (se realiza una sola vez y se cachea) y su uso, template >> loaders personalizables,... >> >> Otra cosa es que en tu caso particular no utilices casi nada de lo que te >> ofrece el sistema de plantillas y puedas quitarte una dependencia extra. >> Pero creo que sería un caso bastante alejado de la norma. >> >> >>> Convertir de manera limpia los strings a f-strings. >>>> >>>> La única manera que he encontrado es usar eval, ¿Alguien tiene una idea >>>> mejor? >>>> >>> >> Usar string.Formatter, pero si y solo si no te vas a disparar en el pié >> al hacerlo. >> >> >>> >>>> Resultado deseado = void hola{ std::cout << "hola\n"}; >>>> F-string para generarlo = f"void{saludo}{{std::cout << "{saludo}\n"}};" >>>> Ejemplo Jinja = void {{saludo}}{std::cout <<"{{saludo}}\n"};" >>>> >>>> -- >>>> Arturo Muñoz >>>> _______________________________________________ >>>> Python-es mailing list >>>> Python-es en python.org >>>> https://mail.python.org/mailman/listinfo/python-es >>>> >>> _______________________________________________ >>> Python-es mailing list >>> Python-es en python.org >>> https://mail.python.org/mailman/listinfo/python-es >>> >> _______________________________________________ >> Python-es mailing list >> Python-es en python.org >> https://mail.python.org/mailman/listinfo/python-es >> > > > -- > Arturo Muñoz Tolosa > _______________________________________________ > Python-es mailing list > Python-es en python.org > https://mail.python.org/mailman/listinfo/python-es > -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": https://blog.ch3m4.org Buscador Python Hispano: http://busca.ch3m4.org ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From garcia.marc en gmail.com Fri Jul 26 08:35:04 2019 From: garcia.marc en gmail.com (Marc Garcia) Date: Fri, 26 Jul 2019 13:35:04 +0100 Subject: [Python-es] Becas de diversidad en EuroSciPy Message-ID: Hola a todos! Hace un par de dias hemos abierto el plazo para pedir ayuda financiera para asistir a EuroSciPy. Los fondos han sido aportados por NumFOCUS, la EuroPython society y la PSF, a quien agradecemos mucho su generosidad. Si conoceis a alguien a quien le pueda interesar atender EuroSciPy (en Bilbao en Septiembre), y que vaya a enriquecer la diversidad en la conferencia (a todos nos aporta mucho que haya gente de diferentes backgrounds), por favor mandadle esta informacion. Y si podeis informar tambien a vuestros local user groups, seria genial. Para el resto, recordaros que la venta de tickets standards acaba en una semana. Si quedan tickets despues del plazo, que posiblemente no, se podran comprar a late-bird rates. Informacion sobre las ayudas financieras: https://www.euroscipy.org/2019/finaid.html Informacion sobre la conferencia: https://www.euroscipy.org/2019/ Gracias, y nos vemos en Bilbao! ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: From marcelobarbero en arnet.com.ar Mon Jul 29 20:38:09 2019 From: marcelobarbero en arnet.com.ar (Marcelo Barbero) Date: Mon, 29 Jul 2019 21:38:09 -0300 Subject: [Python-es] =?utf-8?q?=C2=BFC=C3=B3mo_generar_una_distribuci?= =?utf-8?q?=C3=B3n_aleatoria=3F?= In-Reply-To: References: <79B67DF0-ADDA-4570-B90A-0CB5EFB5ED6A@gmail.com> Message-ID: <007d07ce-1c44-281c-2b5d-3f8457df1510@arnet.com.ar> Tomando el ejemplo de Chema, se me ocurrió hacer una extensión a la matriz sin complicar mucho el algoritmo. from random import randint matriz_resultado = [0, 0, 0, 0, 0, 0, 0] matriz_modelo = [ [0, 1, 2, 3, 4], [5, 6, 0, 1, 2], [3, 4, 5, 6, 0], [1, 2, 3, 4, 5], [6, 0, 1, 2, 3], [4, 5, 6, 0, 1], [2, 3, 4, 5, 6] ] for n in range(100000): ## esto es para probar con un numero grande for i in range(7): matriz_resultado[matriz_modelo[i][randint(1,5)-1]] += 1 print matriz_resultado Perdón por el retraso, me estaba llegando la lista al spam. Marcelo Barbero From hfoffani en gmail.com Wed Jul 31 09:14:29 2019 From: hfoffani en gmail.com (Hernan Foffani) Date: Wed, 31 Jul 2019 15:14:29 +0200 Subject: [Python-es] cheat sheet unificadas Message-ID: <5DD215D6-9E3C-4122-BAD8-6BBDE4DAB8EA@gmail.com> Dicen los autores: ?la única cheet-sheet que necesitas?. Quizás sea algo conocido (hace un par de años que está disponible) pero yo me enteré hace un par de semanas. No requiere instalación: $ curl cht.sh/python/random+numbers ? Lo interesante es que también acepta consultas en castellano: $ curl cht.sh/python/ordenar+diccionario+por+valores ? Puede instalarse localmente, acepta casi 60 lenguajes de programación, hay plugins para incorporar a diversos editores/IDEs, etc. Mas detalles en https://github.com/chubin/cheat.sh ------------ próxima parte ------------ Se ha borrado un adjunto en formato HTML... URL: ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: Message signed with OpenPGP URL: