@iamemhn

EM Hernández-Novich

Ask @iamemhn

Sort by:

LatestTop

Previous

Hola, Qué opina del contenido de este texto? https://www.manning.com/books/get-programming-with-haskell

No tengo el libro completo para criticarlo con base.
Los capítulos gratuitos los leí por encima, y no me parecen nada diferentes (más allá del diseño gráfico) de lo que puedes aprender con la literatura libre en línea, o cualquiera de otros libros populares. No hay una manera «rápida» de aprender Haskell que no sea estudiando y practicando.
En cuanto a libros sigo recomendando «Programming in Haskell» de Graham Hutton (2nd. Ed), y «Thinking Functionally with Haskell» de Richard Bird, para los que quieren de una vez aprender a razonar de manera formal sobre sus programas.
Si prefieres material gratuito en línea, busca «Learn you a Haskell», complétalo, y luego busca material sobre los conceptos que te interesen.
Pero practica. Si no practicas haciendo todo con Haskell, no vas a aprender a usarlo más allá de ejercicios de libro.

View more

Qué opina sobre el uso del blockchain para descentralizar y buscar la integridad de los datos en el sistema de registros y notarias del país? Suponiendo el interés de las firmas de abogados en tener un nodo para acelerar la búsqueda de documentos.

Mala idea.
Una de las vulnerabilidades del blockchain está en que si una organización tiene más capacidad de minado que la mitad y un poco más de toda la comunidad, esa organización tiene la posibilidad de controlar cuales transacciones se aceptan y cuales no. Partes interesadas podrían acumular esa capacidad de cómputo y de ese modo impedir que ciertos documentos se registraran oportunamente (o indefinidamente) o bien forjar el registro de documentos.
El blockchain no es la solución al problema. No importa cuándo leas esto. No importa el problema.
Liked by: Marcos Mora

Related users

Que ha pasado con WebGUI?, donde se puede encontrar el paquete .deb? para Debian 9? o ha sido descontinuado el proyecto? Enlaces de guias de instalación e implementación? si todavía sigue?

Nelsin Briz
El desarrollo de WebGUI 7 está fundamentalmente detenido. En el último año se han aplicado algunos parches para mantenerlo funcionando, pero no hay nada nuevo. Así mimso, hay algunos componentes que dependen de módulos que no funcionan bien en versiones modernas de Perl, así que te ves obligado a usar un Perl viejo o no usar esos módulos. Los módulos que no funcionan, no van a funcionar nunca en Perl moderno, así que WebGUI 7 tendría que reescribir sus componentes para nuevos módulos. Reporté ese bug en su momento, pero es un «won't fix» porque ellos corren WebGUI con Perl viejo. Por eso no hay paquete para Debian 9.
Revisa
http://www.webgui.org/
https://github.com/plainblack/webgui
Quizás tengas que instalar WebGUI 8 manualmente. Es la continuación de WebGUI 7 después de todo lo que se aprendió. No tengo intenciones de hacer un paquete Debian para WebGUI 8. La última versión del paquete para Debian estaba en el VCS público del Proyecto Debian -- a partir de allí puedes intentar construir tu propio paquete Debian, quitándole las cosas que simplemente no funcionarán en Debian 9 por lo que expliqué anteriormente.

View more

Liked by: Nelsin Briz
+1 answer Read more

¿Que opinas de JSON WEB Token (JWT) para autenticar usuarios en aplicaciones web? ¿Recomiendas otra forma de hacer la autenticación?

Autenticación e Identificación es sólo una de las aplicaciones de JWT.
Seguramente será la aplicación más popular, porque para el desarrollador web promedio, JWT es bastante más fácil de usar que X.509, y es bastante más estructurado que usar cookies y «la fuelsa». Nunca va a ser tan expresivo como SAML, pero es más práctico porque cabe en un encabezado. Todo esto es poniéndome en el lugar del desarrollador web promedio que está escribiendo la aplicación web (¡disruptiva!) promedio (¡tendencia!, RT para que se entere el mundo).
De mi comentario anterior puedes entrever que usar autenticación X.509, posiblemente empleando una CA de segundo piso controlada por el operador de la aplicación, es la manera que recomiendo para autenticar. Sin embargo, sólo sirve para autenticación e identificación.
Con JWT puedes hacer algunas cosas más, en particular para el intercambio de información, firmada digitalmente cuando menos, cifrada asimétricamente cuando más, entre el cliente y la aplicación. Esto hace que tu aplicación pueda funcionar prácticamente sin dejar rastros en el lado del cliente, si diseñas correctamente.
Herramientas como el «debugger» que está en [1] son muy buenas. Hay una extensión JWT que corre dentro de PostgreSQL, así que el URL puede llegar directo dentro de la base de datos gracias a PostgREST, minimizando metidas de pata cortesía de lenguajes con sistemas de tipo y parsers débiles. Estamos usando eso para una plataforma autocontenida cuya única interface es REST, y nos está funcionando muy bien.
Buena parte de las ventajas de JWT dependen de que el parser JSON del lado de la aplicación sea correcto y robusto. Hay montones de parsers JSON medio y mal hechos, en todos los lenguajes, porque el desarrollador promedio cree que las expresiones regulares son suficientes para hacer un parser. Entonces, si piensas usar JWT, presta mucha atención al parser JSON del lado de la aplicación (la que hace «cosas», no la que «agita las manos» para la interfaz de usuario), de manera que haga todo lo que tiene que hacer según el RFC-7519.
[1] https://jwt.io/

View more

Qué herramienta recomendarías para integración contínua, Jenkins "hace el trabajo" pero a mi parecer bastante mal

Nunca he necesitado integración continua/

Qué tan pesado es para un desktop environment mantener en el status bar un par de monitores del sistema? (carga de disco, cpu time, etc)

No lo sé, porque nunca los he usado, pero gratis no es. Mientras más instrumentación tengas, y con más frecuencia, más van a consumir e interferir. Sobre todo porque como son gráficos, van a generar montones de eventos a pantalla.
Personalmente sólo monitoreo los servidores y con agentes colectores que no necesitan interfaz gráfica. Otra máquina se dedica a consolidación y graficación por demanda. Si necesito ver «en vivo», seguramente voy a conectarme con SSH y correr un comando en el shell (ps, iostat, vmstat, iftop, htop, pgtop, iptraf, tantas que hay...).
Liked by: Marcos Mora

¿Con qué frecuencia dibujas?

Con la frecuencia con que juego Pictionary o cualquier variante de juegos de ingenio que requiere transmitir ideas visualmente.
O sea, casi nunca.
El otro momento es cuando quiero comunicarme con algún niño pequeño que todavía está más interesado en colores e imágenes, que en palabras. Dibujar todos los animalitos de granja, algunas caricaturas neutrales, y que los niños las reconozcan, imiten las voces, o las completen de colores.
Exceptuando una materia, en todas las demás siempre había láminas con todos los dibujos necesarios. En la restante, todo era a pizarra así que había una cantidad razonable de diagramas y esquemas visuales. En ese sentido, y a la fecha en que escribo esto, la última vez que dibujé fue en Septiembre 2017, las últimas clases de CI3725 en la USB.

Estudio para la última entrevista de un proceso de reclutamiento que, de hacerlo bien, me llevaría lejos del comunismo. He entendido lo que me han pedido; sin embargo, hay un tópico que no logro internalizar bien y es la diferencia entre SQL/NoSQL. ¿Bajo qué escenario NoSQL es preferible a SQL?

La única razón para usar NoSQL es no saber usar PostgreSQL en toda su extensión.
Liked by: Marcos Mora

Que concepto te costo mas para que tus estudiantes asimilasen?

La mayoría de los estudiantes tiene problemas (y miedos) manejando estructuras recursivas y expresando soluciones de problemas recursivos. Me parece que es más por el vicio de la programación imperativa (seguir instrucciones tomando nota de los cambios), que por lo complicado del concepto.
Independientemente de que la preparación matemática sea buena o no, no deberían tener problema, porque no hay nada más humano que reducir un problema grande, a problemas más pequeños. Al menos humanos acostumbrados a resolver problemas en lugar de copiar soluciones.
Esa dificultad hace que cualquier cosa que descanse en recursión les resulte «mágica» o «mística», sin necesidad. Así que lo que está encima, como es razonar con infinitos, máquinas que simulan máquinas, autoreferencia efectiva, y autoreferencia paradójica, requiere más paciencia.
Quizás si aprendieran a escribir con recursión antes que con iteración les iría mejor. Es una lástima que los lenguajes más populares «hablen mal» de la recursión simplemente porque tienen implantaciones pobres, o ausentes, tanto de tipos recursivos como de recursión de cola.

View more

¿Como recomiendas cifrar los datos en una base de datos en PostgreSQL? ¿A nivel de archivos? ¿Por columna? ¿Ambos?

Si tienes temor de que te roben el disco que tiene los datos, tienes que hacer cifrado en reposo. Para eso, lo mejor es utilizar LUKS para cifrar la partición /var/lib/postgresql.
No tiene sentido cifrar archivo por archivo, porque eso te obligaría a tener la llave disponible en memoria por demasiado tiempo, y en espacio usuario.
En general tiene poquísimo sentido cifrar cosas dentro de la base de datos. Tiene más sentido proteger información con funciones de una vía (hashes) o garantizar la integridad de un dato (hashes, otra vez).
Si vas a proteger credenciales (claves, códigos de acceso), lo mejor es usar hashes con pgcrypto, usando varias iteraciones. De ese modo, el usuario puede presentar la credencial y se verifica el hash dentro de la base de datos.
Si tienes un campo texto y quieres garantizar que no se pueda cambiar una vez ingresado, tienes que usar una firma digital (un hash), pero usando un elemento de información que esté fuera de la base de datos, en manos del interesado en prevenir la modificación. En este caso, tendrías que usar criptografía de llave pública en la aplicación, para que el usuario entregue el payload cifrado con su clave privada, y la base de datos contenga la llave pública. De ese modo la base de datos puede comprobar que lo que suministra el usuario es legítimo de origen. Esto suele ser bastante complicado, porque requiere destreza en el usuario final y fineza en la aplicación.
Hasta ahora nunca he necesitado almacenar información cifrada dentro de la base de datos. Nunca usaría cifrado simétrico, porque eso implica que el secreto compartido tiene que circular desde afuera de la base de datos adentro, o guardarse en claro dentro de la base de datos, y eso ya lo hace ridículo.

View more

Liked by: Marcos Mora

Compilers output should not be deterministic? Why is the binary output not equal when compiling again?

Yes, regarding code and programming semantics. Not necessarily, regarding the binary blob output.
In most cases the ouput is different, because the memory map is different. This is done to randomize the starting address for TEXT, DATA, and STACK segments, thus preventing some easy attacks if generated code were identical.
In other cases, implementation specific pseudo-random renaming rules, as in C++, can change internal symbol tables and force reordering of code. Finally, there are languages with undefined and/or unspecified behavior for some constructs, that can produce these differences -- for instance, using float/double literals in your code, can trigger generation of different code depending on the particular instruction chosen by the compiler.

A line from your favorite song

My favorite song does not have lyrics.
The less lyrics, the better for me. Honorable mention to
«One of these days I'm going to cut you into little pieces»

Y qué rol, o quién se encarga en la conexión de realizar el CREATE USER? Un user con suficientes permisos? O Postgres posee algo particular para eso?

Lo puede hacer el DBA. Lo puede hacer un usuario con privilegios. Lo puede hacer un usuario sin privilegios especiales con acceso a un procedimiento almacenado con privilegios.
El sistema de roles de PostgreSQL fue diseñador en particular para permitir eso, tanto para roles individuales como grupales. Ojalá más gente se leyera los manuales.
+1 answer in: “Me parece muy interesante lo de usar los usuarios de postgres para autentificar pero necesito una explicacion mas basica: digamos que tengo una pagina web que tiene una informacion cualquiera (mis datos personales) como autenticaria eso con postgresql? Tendria que consultar la trabla usuarios?”

¿El err != nil de go no es lo mismo que el {ok, Val} | {error, Reason} de Erlang?

Erlang es un lenguaje diseñado a mitad de los 80, que corre sobre una máquina virtual, en el cual las tuplas son valores de primera clase manejadas en el heap. Técnicamente, la función retorna un valor, que es una referencia a la estructura en memoria. Esto hace que la secuencia de llamada y retorno sea idéntica en todos los casos, compacta, y muy eficiente de generar.
Una función en Erlang puede retornar una tupla de tamaño arbitrario: dos, tres, cuarenta y dos, todos los elementos que necesites -- pero siempre lo hace con un apuntador único. Retornar tuplas de dos elementos donde el primero tenga el átomo 'ok' o 'error' es una convención establecida -- han podido usar 'all_great_dude' y 'my_bad'.
Golang es un lenguaje diseñado en este siglo, que compila a código de máquina, en el cual las tuplas no existen. No son valores de primera clase. Los paréntesis son adornos sintácticos. Técnicamente, la función va a retornar varios valores por separado, los dos primeros en registros del procesador, y el resto metidos en la pila. Eso hace que la secuencia de llamada sea diferente en cada caso, sea costosa en plataformas con pocos registros (como Intel y AMD), y consume ciclos adicionales para el despeje de la pila.
Una función en Golang puede retornar muchas cosas en la pila. Puede retornar un apuntador a un registro en el heap. Pero no retorna tuplas, porque en Golang no existen las tuplas anónimas.
Al igual que como pasó con la convención en Erlang, existe la convención en Golang de retornar dos valores, uno para indicar si el retorno es «normal» y otro para describir la anormalidad o bien ocupar espacio si todo fue normal. Esa convención ni siquiera es original, es copiada de er... lang.
Considerando que Erlang se diseñó en una época en la cual los lenguajes no tenían tipos suma, y Golang se inventó después de que tenemos décadas sabiendo que los tipos suma (y los tipos producto) son un necesidad fundamental, en mi opinión esas construcciones son muy diferentes: una refleja lo mejor que se podía hacer a finales de los 80 en un lenguaje dinámico, y la otra refleja miopía en el diseño de lenguajes combinado con subestimar las habilidades de los programadores.
Un tipo suma, como Maybe o Either en Haskell, balancea lo mejor de ambos mundos: devuelves un valor, de manera eficiente, y no tienes que hacer una convención sino un sistema de tipos completo.
Finalmente, Erlang tiene excepciones completas, de modo que la recuperación de control de flujo se puede hacer de manera estructurada usando manejadores de excepciones, y es una opción reportar la situación anómala usando la convención de tuplas.
Golang no tiene excepciones. Sólo tiene esa convención.
A veces hay construcciones que al ojo no entrenado parecen idénticas. Eso es precisamente lo que los diseñadores de lenguajes mediocres quieren que la gente piense. Golang decidió ignorar cosas aprendidaes en diseño de lenguajes; prefieriendo ser populares para hacer bulto.

View more

Any good photos manager for linux? I don't want to serve google my photos to sort them, organize, etc...

shotwell seems good enough

Me parece muy interesante lo de usar los usuarios de postgres para autentificar pero necesito una explicacion mas basica: digamos que tengo una pagina web que tiene una informacion cualquiera (mis datos personales) como autenticaria eso con postgresql? Tendria que consultar la trabla usuarios?

Hay aplicaciones que se conectan a la base de datos siempre con el mismo usuario, que generalmente tiene todos los privilegios sobre la base de datos. Eso no es una buena idea, por razones variadas de supervisión, auditoría, y seguridad. Insisten desarrollando su propio sistema de control de acceso y auditoría, que siempre es incompleto, inseguro, e inconsistente; además de ser una insensatez pudiendo aprovechar lo que PostgreSQL ya ofrece.
El primer paso es que cada conexión se haga con un usuario diferente; así, para cada usuario que tenga que conectarse, harás un CREATE USER en PostgreSQL, de manera que sus credenciales sean controladas por la base de datos directamente. Estudia el sistema de roles de PostgreSQL para aprender a hacer esto.
El segundo paso es que todos los objetos de la base de datos tengan permisos granulares. La manera más inteligente de hacer eso es crear un rol «sin login» X, al cual le otorgas los permisos relevantes (GRANTs). Luego, a cada usuario del sistema le otorgas o le revocas X según necesites. Eso simplifica la auditoría y control, porque los usuarios concretos no tienen permisos directos, sino a través de los roles abstractos.
El tercer paso es identificar aquellos escenarios en los cuales un usuario necesita insertar/modificar/borrar filas, pero no puedes permitirle acceso a toda la tabla por privacidad/protección. En ese caso, creas un procedimiento almacenado que haga las modificaciones, le otorgas al rol abstracto permiso para ejecutarlo, y defines el procedimiento con privilegios de creador -- esto es, va a correr como si fuera el dueño de la tabla.
Finalmente, emplea vistas y Set-Returning FUNCTIONS para dejar dentro de la base de datos las consultas complejas, de modo que la aplicación sólo tenga que hacer un SELECT, en lugar de llevar la lógica del lado local.
Para algunas aplicaciones tendrás una tabla `usuarios` que contiene, en efecto la identidad del usuario. Sin embargo sus credenciales y control de acceso serán manejados por la base de datos. De ese modo, quitarle acceso a un usuario es cuestión de ponerle NOLOGIN a su role, o retirarlo de un rol privilegiado.
Más aún, usando SET ROLE puedes cambiar de usuario (o cambiar el conjunto de privilegios) por sesión. Eso lo pueden hacer los procedimientos almacenados, de modo que puedes darle/quitarle privilegios al usuario según el flujo de ejecución.
Si lo haces bien, eventualmente toda la aplicación queda dentro de la base de datos, y el frontend que le pongas es irrelevante, porque la base de datos se cuida a si misma. Eso la hace más robusta, fácil de mantener en el tiempo, y tolerante a desarrolladores web junior.

View more

+1 answer Read more

Hola, ¿Entre Debian y Ubuntu cual ofrece mejor rendimiento para Desktop y Laptop? Cual sacara mayor ventaja a equipo que no es de alta prestación para programar

Compáralos y saca tus propias conclusiones.

¿Qué documentación o libros recomiendas para aprender de forma practica sobre el protocolo dns, su correcta configuración y seguridad?

El Administrators Reference Manual (ARM) de BIND9.y los 90+ RFC disponibles. Hay varios RFC obsoletos, y el ARM te indica cuáles son los relevantes.
El libro «DNS and BIND» de O'Reilly, incluso en su 5ta. edición, está vergonzosamente desactualizado e incluye muchas cosas que hoy en día son malas prácticas, además que no incluye todas las buenas prácticas. Ni lo abras. Se escribió antes que existiera el ARM.
Liked by: Marcos Mora

Do I need anything else on the backend of my webapp besides postgres and postgrest?

You'd probably want NGINX to act as reverse proxy for PostgREST, and serve static content (CSS, JS, images, media).
You'll need logging, monitoring, and Point in Time recovery backups. Monitoring trends will tell you when to add service load balancing with SSL termination, database replication, and possibly a connection multiplexer for PostgreSQL.
Liked by: Marcos Mora

Como tengo contraseñas largas con bcrypt? Está bien hacer `brypt(SHA256(clave))` ?

A Blowfish no le importa si la clave es de un caracter o de 200; obliga a tu usuario a introducir claves más largas. El procedimiento para generar el hash siempre es el mismo: generas una sal al azar, y luego usas bcryp(). Lo que proopones no está bien (porque no hace falta, ya que no agrega nada) hacer el SHA256.
Si usas pgcrypto, para generar los hashes de los usuarios dentro de la base de datos, el proceso es simple:
crypt("la clave aqui", gen_salt('bf', 8))
y de allí sale el hash que tienes que guardar en la base de datos, o comparar contra el que ya está guardado en la base de datos.
Si tu aplicación calcula los hashes fuera de la base de datos, entonces tienes que:
1. Generar una sal al azar para cada clave nueva (eso incluye cambio de clave).
2. Usar esa sal con bcrypt para generar el hash. Debes guardar tanto el hash como la sal, porque la salaes particular para recalcular.
La idea general es
hash = bcrypt( "clave", generar_sal())
y el hash contendrá el algoritmo, las iteraciones, la sal, y el hash de la clave.
Hay gente que piensa que esa solución es «compleja», «rara», «impráctica» o «innecesaria». Esa gente suele usar soluciones como:
1. Usar SHA1 o MD5 y guardar eso en la base de datos; los «avanzados» usan SHA256. Esos algoritmos son rápidos así que es fácil atacarlos tanto para acceder al sistema como para crear un DoS en determinadas circunstancias (busca «rainbow tables» y verás qué fácil es).
2. Guardan el SHA1( sal fija + password). Como la sal es fija, se reduce al problema anterior con «claves más largas».
3. Generan una sal fija por usuario (eso mitiga 1 y 2), y guardan SHA1/SHA256(sal del usuario + password). Atacar SHA1/SHA256 por fuerza bruta, sin saber la sal, es completamente viable; sabiendo la sal, perdiste.
No seas como esa gente que no se ha enterado que MD5, SHA1 y SHA256 no fueron diseñados para hash de passwords. Usa Blowfish a través del API de tu lenguaje.

View more

Está bien que los usuarios de mi webapp sean usuarios de la base de datos también? Para no tener que manejar parte del problema de autenticación

Esa es la forma más robusta de hacerlo. Además de que el control de identificación y autenticación descansa en PostgreSQL, recibes beneficios adicionales como, por ejemplo, limitar el número de conexiones por usuario. De ese modo, es trivial que la base de datos mantenga una sola conexión por usuario, o N conexiones a usuarios que «pagan más».
Liked by: Marcos Mora

Como implementar user/pass en una app web? En el servidor solo se guardan los salted hashes. Uso SSL. Donde debería generar los hashes? En el servidor o también (doble) en el cliente? Veo mucha discusión online al respecto, qué opina usted?

Sea que la conexión es HTTP+SSL. Si no lo es, no hagas nada más hasta que lo sea.
Entonces no hay problema en pasar el texto claro de la clave hasta un procedimiento almacenado en PostgreSQL que hace el hash aprovechando pgcrypto crypt() y aplica Blowfish con varias iteraciones.
Aún más bonito si el cifrado está en un TRIGGER para INSERT y UPDATE, así que simplemente «metes la clave».
Puntos extra si detectas y dejas pasar directamente hashes RFC-2307 precalculados, permitiendo así la migración de claves «legadas» de sistemas basados en LDAP, AD, y formas «creativas» de PAM.
La gente que implanta hashes del lado del cliente se enfrenta con algunos problemas. El primero es que los generadores locales no tienen suficiente entropía, así que la sal no es realmente aleatoria («no entiendo, ergo no importa»). El segundo es que generar un buen hash tiene que ser lento para evitar ataques por fuerza bruta; en los lenguajes populares del lado del cliente, implantar un hash con varias iteraciones es notablemente lento («es muy lento, usa una cosa más simple»). El resto de los problemas está en dos ligas: los que almacenan esos hashes, por descuido o por idiotez, en el material local de la aplicación (cache o cookies); los que les preñan el lenguaje del lado cliente con una librería de intercepción. No seas esa gente.

View more

Liked by: ORCC Marcos Mora

Next

Language: English