@iamemhn

EM Hernández-Novich

Ask @iamemhn

Sort by:

LatestTop

Previous

Estoy comenzando a aprender programación funcional con elixir y leí una respuesta suya donde critica que implementaron despacho dinámico, supongo que se refiere a los "Protocols" ¿Cuál sería la alternativa o enfoque funcional que debería tomar para este caso?

Los protocolos de Elixir son una imitación (con otro nombre) del despacho dinámico de lenguajes Orientados Objetos, injertado en las llamadas de funciones.
El mecanismo de protocolos de Elixir, en efecto, termina haciendo despacho dinámico: el programa tiene que correr y al llegar al punto de la llamada *decidir* a cuál función particular llamar. Lo hace para todos los casos. Sólo para que quede muy claro: eso es *lento* y puede causar errores a tiempo de ejecución en determinadas circunstancias que no son inusuales en programas concurrentes. Por otro lado, tiene que ver con el hecho de correr sobre una máquina virtual (BEAM) cuya noción de tipos requiere verificación dinámica.
No lo pueden hacer mejor, porque no están sobre una plataforma que les permita hacerlo mejor. Están tratando de emular una operación que viene de Orientación a Objetos, sobre una máquina virtual dinámica.
El enfoque puramente funcional con un sistema de tipos completo es utilizar Polimorfismo Paramétrico (como en Haskell), que permite tomar esa decisión a tiempo de compilación para todos los casos en los que se pueda, generando código de *máquina* que llame directamente a la rutina que hace falta.
El sistema de tipos de Elixir es dinámico y un poco mejor que el de Erlang, pero está muy lejos de (y no puede avanzar hasta) el de Haskell por la plataforma subyacente. Es mejor que Erlang y mejor que usar cualquiera de los lenguajes mixtos «populares», pero hasta ahí.
Es similar a la relación entre Scala y Java: la mayor limitación es la JVM, una máquina de pila con muy pocas oportunidades de optimización y la obligación de incluir verificaciones dinámicas..

View more

¿En que año comenzaste a usar linux ? Cuál fue la razón y que distribución fue?

1991. No había distribuciones todavía. Compilé GCC en un AViiON 400, para poder compilar otro GCC que generaba código i386, y entonces poder compilar el kernel y los utilitarios allí para luego transferirlo vía ZMODEM hasta un PC con Windows en el cual hacer los discos de arranque.
Repetí la maniobra pero usando Minix como anfitrión para comparar la calidad de los binarios resultantes.
Después tuve Yggdrasil y Slackware, hasta que me involucré con Debian a finales de 1993.
La razón es la de siempre: Porque Puedo.

Related users

Usas backports en debian estable o solo usas los paquetes de ese repositorio ?

No uso backports en general.
Si me hace falta una versión más nueva de lo que sea, hago el paquete por mi cuenta adaptado a estable, tratando de no incorporar dependencias fuera de estable. Ejemplo concreto: Debian 9 tiene BIND 9.10 pero yo necesito usar BIND 9.11 (y 9.12 muy pronto), de modo que preparo mis propios paquetes.
Los ejes de estabilidad y novedad son ortogonales, y para poder dormir sin sobresaltos hay que transitar el eje de la estabilidad.

Que programa para hojas de cálculo usas como sustito de excel?

No construyo hojas de cálculo.
Si me envían una con datos para procesar, no necesito abrirla porque Text::CSV_XS de Perl, csv-conduit de Haskell, o csvread de Octave, son suficientes.
Cuando me envían alguna que «saca cuentas» y no me queda más remedio que abrirla para interactuar con ella, uso LibreOffice.

¿Qué versión de Debian usas en tu máquina: stable , testing o sid ?

Debian stable. Generalmente paso a testing una o dos semanas después del primer «release freeze» para ayudar a encontrar y corregir defectos en las herramientas que uso habitualmente.

¿Por qué recomienda bastante instalar unbound? ¿Ademas de instalarlo requiere un configuración extra?

Porque de ese modo dispones y controlas tu caching DNS Resolver privado. Eso hace que no te importe ni afecte la mala configuración de los DNS del ISP, ahorras ancho de banda en consultas DNS, puedes aprovechar DNSSEC, y si tienes un servidor dedicado en el exterior hasta puedes construir una «VPN DNS» para que los ISP ni siquiera puedan interferir tus consultas.
Para usar Unbound como caching resolver, lo único que tienes que hacer es indicar el IP de la máquina que lo tiene. Si lo tienes en un portátil, indicas 127.0.0.1, naturalmente, y configuras el cliente DHCP para ignorar los DNS que suministre el ISP.
Todo está explicado en los manuales.

¿Por que DD-WRT resuelve casi todos sus problemas de «internet».?

Los «routers» y «access points» necesitan software para funcionar. Cada fabricante provee uno diferente (el «firmware»). Todos los routers económicos traen, casi sin excepción, un firmware precioso pero con funcionalidad mediocre o malo, y además no los actualizan con suficiente eficiencia. Eso hace que la experiencia del usuario final sea regular a mala. Y te hacen comprar uno nuevo porque «nueva versión optimizada para redes sociales».
DD-WRT es un firmware basado en Linux, que funciona en la mayoría de los routers, es mucho más versátil, consume menos recursos, y se actualiza con regularidad.
Solamente por el hecho de que DD-WRT incluye un caching resolver, ya te ahorras ancho de banda por no tener que hacer consultas DNS redundantes.
Encima, los firmware comerciales intencionalmente reducen la potencia de las antenas. Con DD-WRT puedes aumentarla al máximo. Uno de mis routers está en el 7 piso y tengo 60% de señal en el jardín de planta baja. El otro router tiene diez años, y es igual de rápido que el primer día.
Aprovechar al máximo el hardware, sólo con Software Libre.

View more

Qué piensa de Whitespace, Brainfuck, Piet y otros lenguajes esotéricos?

Son una maravilla. Demuestran que no por ser Turing-completos resultan prácticos, y que la Turing-completitud se puede encontrar en lugares inesperados para el que no sabe qué buscar. Son lenguajes en donde todo lo computable es programable, pero nada interesante es fácil de escribir.
Tejer es Turing-completo: es una máquina contadora de dos registros. Eso no quiere decir que un lenguaje basado en tejer sería práctico para escribir sistemas operativos, pero hace reflexionar acerca de las herramientas que el humano tiene para «calcular» y «organizar su pensamiento», y cómo todas tienen las mismas limitaciones universales.

¿Cuál es la mejor/más recomendada bibliografía para aprender teoria de categorías? ¿Y para Monads?

Aprendí con dos libros: «Basic Category Theory for Computer Scientists», Benjamin Pierce; y «Categories and Computer Science», R.F.C. Walters.
Me parecieron suficientes, tomando en cuenta que tuve la ventaja de haber estudiado Conexiones de Galois antes de enfrentarme a Teoría de Categorías; no son un requisito, pero tienen parecidos que me ayudaron a ir más rápido.
De todas formas, esos libros son perfectamente accesibles si has estudiado Matemática Discreta y Lógica, aunque tendrás que ir despacio porque son densos: pocas palabras que requiren mucho razonamiento.
Dicen que «Category Theory» de Awodey es muy bueno, pero no lo he revisado. No enseño ese tópico así que no ando averigüando qué libro es más práctico.
Si preguntas por la base matemática de Monads, eventualmente lo estudiarás en Teoría de Categorías. Si preguntas por la aplicación práctica de Monads en Haskell, hasta ahora mi técnica pedgagógica es aprender y dominar Monoid, luego Functor, luego Applicative, y finalmente Monad. «All about Monads» solía ser bastante práctico, antes que Applicative estuviera entre Functor y Monad; «A Fistful of Monads» en Learn You a Haskell también ayuda. Es un tópico amplio que no se aprende en poco tiempo y requiere practicar bastante. Toma en cuenta que *un* Monad, aislado, es relativamente útil; una combinación de transformadores de Monads son mucho más útiles, pero para eso tienes que comprender todos los Monad individuales. Entonces, al principio parece que aprendes cosas sueltas que no son muy útiles, hasta que aprendes a usar transformadores. Y en ese momento te das cuenta que necesitas MonadPlus y MonadFail; y luego aparecen MonadFix y Comonad.
Tienes que estudiarlos todos.

View more

Liked by: Israel

¿cual es la diferencia entre C,C++ y C#?¿cual de los 3 es mas importante saber manejar?¿Para quien recomendarías usar cada uno en particular?

C es muy cercano a la máquina, con un sistema de tipos precario, para programar cosas con un nivel muy refinado de control, tanto en la utilización de memoria, como en la eficiencia de ejcución. Tienes que haber aprendido a manejar memoria explícitamente con disciplina, y estar preparado para las sutiles diferencias de implantación de cada compilador de C en cada plataforma. Es el lenguaje típico para escribir kernels, controladores de dispositivo, y en el cual están escritas las más importantes piezas de software de plataforma sin las cuales NADIE podría hacer nada.
C++ nació como un «C con objetos» en cuanto imitó la sintaxis de C, conservó la mayoría de las cosas habituales de C, y la enriqueció con los conceptos de clases y herencia (¡múltiple!), además de incluir despacho dinámico a juicio del programador. A lo largo del tiempo, el lenguaje ha incorporado montones de extensiones y «casos especiales» para cubrir cosas disponibles en otros lenguajes orientados a objetos. Desafortunadamente, una de las cosas que copió de C es el «modelo de valor» y el manejo manual de memoria, lo cual lo hace extremadamente confuso para programadores que no han estudiado el tópico o que han trabajado con lenguajes orientados a objetos mejor diseñados. Muchas aplicaciones complejas están escritas en C++, sin embargo es un lenguaje impráctico para cosas de bajo nivel (ni kernel, ni controladores de dispositivos) y hay muchas herramientas de infraestructura que diseñadas orientada a objeto son demasiado lentas para uso en masa. Tienes otras dificultades horribles derivadas de su manera de representar internamente los valores para compilación separada, y el despacho dinámico es notablemente lento para aplicaciones de alto desempeño. No es imposible, pero cuesta mucho hacerlas rápidas, cuando se puede..
Anécdota: BIND (el DNS «de facto») se escribió en C, el mismo equipo de personal altamente competente en ambos lenguajes quiso re-escribirlo en C++: fue un fracaso en desempeño y en otros aspectos de integración, en buena medida por usar C++.
C# es la respuesta de Microsoft a C++ y Java. Es un lenguaje de plataforma, orientado a objetos, razonablemente estandarizado, que tiene varias implantaciones, comerciales y libres. Fue influenciado por Java, así que ninguno de los dos es particularmente innovador ni cambia treinta años de dificultades en el ámbito orientado a objetos. Si bien hace una década que la evolución de C# se diferenció de Java, en realidad han implantado las mismas ideas (por ejemplo, «generics») de maneras diferentes pero igualmente ineficientes.
Tanto C++ como C# (y Java) no han querido «quedarse atrás» con la moda de la programación funcional, y han incorporado construcciones adaptadas al modelo imperativo. Tienen clausuras, tipos anónimos, entre otras cosas, pero inferiores a las de un lenguaje funcional verdadero.
C y LISP son necesidades para el programador. A mi, después de aprender C++, Java y C# no me enseñaron nada nuevo.

View more

¿Has probado Idris tienes alguna opinión sobre ese lenguaje?

Si. El atractivo principal son los tipos dependientes, y me permitió probarlos en la práctica. No me gusta la evaluación ambiciosa así como algunas particularidades derivadas de ser la primera implantación práctica de ese concepto. Sin embargo, Haskell tendrá tipos dependientes muy pronto, así que el desvío por Idris fue para apreciar el paisaje.
Definitivamente vale la pena dedicarle unas cuantas horas de aprendizaje para los interesados en programación funcional sobre tipos de datos cada vez más sofisticados y poderosos. Si ya sabes usar el sistema de tipos de Haskell, Idris es el futuro que viene a Haskell.

Quién ganaría una batalla, Gokú o Superman? no, ya en serio, si quiero preguntarle algo(particular) sobre un curso del próximo trimestre, por dónde lo puedo contactar? algún correo? el único que encuentro dice que lo prefiere para actividades no relacionadas con la universidad, gracias.

Augusto Hidalgo
Ganaría aquel que Chuck Norris permita.
La dirección de correo contacto para temas académicos siempre la indico durante la primera clase. Es la misma que podrías encontrar en la página http://iamemhn.link/cursos/
Una vez que se aprueba un curso conmigo, se recibe el «santo y seña» para preguntar cosas por allí.

Qué sabe y qué opina sobre WebAssembly?

No mucho más que lo que dice su página web. Parece otra «máquina de pila virtual» para correr en los navegadores y así tener más complejidad del lado cliente. La primera fue Java para correr applets en el navegador y el fracaso técnico y comercial es evidente; veremos si la segunda vez lo hacen mejor.

Si fuera a escribir un juego en Haskell: ¿Dónde sería un buen punto para empezar? (Además del inicio) ¿ Es el lenguaje provechoso para eso?

No escribo juegos, así que mi experticia es limitada en cuanto al status quo. Puedo hacer una lista de las destrezas no artísticas y las herramientas que harían falta. En principio:
- HOpenGL es el API de OpenGL en Haskell. Si usas OpenGL en C/C++, no solamente te va a resultar familiar, sino que amarás el hecho de no tener que escribir glBegin() ni glEnd() nunca más o que las operaciones gráficas sean valores de primera clase y se puedan componer.
- OpenAL es un API para controlar dispositivos de audio y emitir a través de ellos los sonidos necesarios (waveforms o MIDI), incluyendo ubicación espacial, efecto Doppler, etc.
- Waveforms are waveforms are waveforms y no hay mucho que hacer allí, pero si trabajas música (una partitura digital) puedes usar Euterpea para manipularlas como un tipo de dato algebraico.
- Necesitas dominar Monads y Monad Transformers. Ambas librerías lo requieren y el juego necesariamente va a trabajar con un Monad compuesto.
- Seguramente tendrás que aprender programación concurrente en Haskell, pero usando Memoria Transaccional (STM) y Canales Transaccionales, para olvidarte de deadlocks, starvation y condiciones de carrera.

Para este punto, puedes hacer cosas «pico y pala». Como siempre, es mejor tener una librería de un nivel un poco más alto. En este sentido sé que existen:
- hsSDL (y otras más, no sé cuál será la «preferida»), que permite aprovechar SDL. SDL encapsula gráficos, audio, entrada/salida, en un sólo API.
- Yampa, que permite aprovechar Programación Funcional Reactiva (de hecho, fue el primer ejemplo de FRP aplicada, del cual todo el mundo ha copiado ideas). Aprender a usar Yampa tiene como hito previo aprender Arrow, una generalización de Monad.
- Estructuras de datos especializadas para particionamiento eficiente del espacio, tanto para determinar presencia, como para transformaciones. No basta con tomar, digamos, kd-trees e «imitarlos imperativamente». Seguramente hay librerías disponibles para eso.
Si alguien que lee piensa «pero yo uso el software X que hace todo eso», estoy seguro que es así y por eso suelo decirle a la gente que no tienes que estudiar Computación para hacer juegos, sino guionista, artista y camarógrafo. Si estudias Computación sabes cómo funciona una de esas herramientas, e inclusive cómo hacerlas (que fue lo que yo estudié -- nada de Maya ni Blender), para que otros disfruten expresándose.
Piensa si lo que quieres es hacer juegos o hacer una herramienta para hacer juegos. Son dos niveles diferentes de discurso, y dos conjuntos diferentes de habilidades. Ambas necesarias en el mundo.
Comienza por leer
https://wiki.haskell.org/Game_Development
y sigue desde allí.
Si es provechoso o no, requiere contemplar tantas dimensiones que no puedo opinar. Busca en Youtube las opiniones de Carmack al respecto.
Quizás el @chiguire en Twitter tenga más cosas que decir, y estoy seguro que estará dispuesto a orientarte

View more

Si tenemos un lenguaje L1 turing completo, puedes hacer un compilador escrito en L1 para cualquier otro lenguaje turing completo?

Por favor escribe el apellido Turing en mayúsculas, siempre.
Tener «un lenguaje L1 Turing completo» es equivalente a decir que tengo una definición para ese lenguaje — un papel. Hace falta tener una implantación concreta de ese lenguaje (interpretada o compilada) y con ella puedo implantar cualquier otro lenguaje.
C11 es el lenguaje y GNU GCC es una implantación. Con GNU CC (el compilador) puedo escribir un interpretador o un compilador para cualquier otro lenguaje, Turing completo (Pascal, C, C++) y, por supuesto, inferiores (lenguajes que no sirven para escribir programas, como HTML o CSS).
Ahora bien, hay lenguajes para los cuales sólo se puede escribir un interpretador, pues tienen construcciones que no pueden resolverse estáticamente. Por ejemplo, LISP y Perl tienen evaluación dinámica de expresiones: para esos lenguajes no puedo escribir un compilador en el sentido que sólo podría compilar las partes estáticas del lenguaje, cosa que para esos lenguajes sería una pérdida de flexibilidad. El interpretador puede ser puro o basado en alguna máquina virtual, pero sigue siendo un interpretador.

View more

Que opinión tiene sobre los hackers?

Los que corresponden a las definiciones (1) a (7), ambas inclusive, en
http://www.catb.org/jargon/html/H/hacker.html
son una maravilla, y enriquecen al mundo con lo que hacen, cualquiera sea el área en que se desempeñen, porque viven con pasión la adquisición de conocimiento y la resolución de problemas interesantes.
Los que corresponden a la definición (8), los que se hacen llamar a si mismos así porque creen que corresponden con la definición (8), y la gente que usa la definición (8) peyorativamente, me parecen lamentables. Aún más lamentables los que después de leer ese documento siguen usando el término «hacker» de manera inapropiada.
Comparar un delincuente informático con personas como Linus, Larry o Eric, es una increíble desubicación.

¿Has utilizado Domain Driven Design? ¿Qué herramientas, técnicas o métodos utilizas para desarrollar software?

No.
No programo «para terceros», no programo «aplicaciones tradicionales» de cara a un usuario «final», y la gente que revisa o aprovecha lo que programo, usualmente soy yo o es alguien técnico. Es un lujo.
Test Driven Design/Development salpicado de «lo más conveniente» según el problema, cuando es OOP. con una gran dosis de separación entre identidad y comportamientos (para que sea no-jerárquica y no perder tiempo). También uso Test Driven Design/Development para procedimientos almacenados imperativos, aunque la realidad es que casi siempre los efectos de borde los efectúa SQL.
Type Driven Design, Extreme Currying Composition with Higher Order, Context-Driven Application, Transformadores, y Domain Specific Models & Languages para FP. Sólo con tipos estáticos, porque cualquier otra cosa sería incivilizada.
Memoria Transaccional o Modelo de Actor para concurrencia y paralelismo, siempre en lenguajes funcionales — la vida es muy corta para usar hilos tradicionales.
Algebra relacional, mucha práctica y mucho profiling, para definir modelos relacionales y objeto-relacionales.

View more

Que desktop environment utilizas a diario? Por qué? O prefieres sólo usar la terminal de texto? Hubo un desnejoramiento técnico en el salto de gnome 2 a gnome 3?

Marcos Mora
XFCE4. «Porque puedo». La realidad es que uso el ambiente gráfico para tener decenas de terminales abiertos, uno o dos VIM en modo gráfico, y dos navegadores (con secuencias rápidas al estilo VI, naturalmente). Los estudiantes pueden atestiguar que cuando conecto el videobeam uso xrandr para activar la pantalla externa en lugar de como-se-llame-la-aplicación-gráfica-que-lo-hace.
Desde el principio nunca me gusto KDE y GNOME era atractivo por ligero. Desafortunadamente, GNOME3 siguuió la carrera de la complicación, y ha terminado consumiendo demasiados recursos activos y pasivos, siendo bastante más opaco que antes, y no me resulta eficiente. Lo bueno es que usando Linux construyo el ambiente de trabajo a la medida de mis necesidades y a la altura de mis destrezas.

Next

Language: English