@iamemhn

EM Hernández-Novich

Ask @iamemhn

Sort by:

LatestTop

Previous

¿Cómo un lenguaje que usted considera tan limitado cómo es Go, lo utiliza para su trabajo, aún más de lo que usa C? ¿Cómo elige que lenguajes le funcionan para que tipo de trabajo?

Otras personas escogieron Go, con criterios diferentes a los que yo hubiera aplicado; no era mi selección. El resultado ha sido razonable, considerando las destrezas del grupo y los problemas particulares que hubo que resolver. Lo que está escrito en Go habría sido mucho más difícil de escribir en C, y la ganancia en desempeño no habría sido notable; estaba escrito en Perl, y ha sido más trabajo reescribirlo en particular por la carencia de librerías consistentes en Go, pero la ganancia en desempeño por ahorro de memoria lo ha justificado. Las carencias de Go han complicado otras áreas.
Puedo escribir programas en más o menos 20 lenguajes de programación diferentes. Sin embargo, sólo hay 7 u 8 que realmente me resultan efectivos y simpáticos para trabajar.
Son muchos los criterios para escoger. Uno es saber si voy a trabajar sólo o acompañado, y cuál va a ser la audiencia de la solución en términos de mantenimiento. Después, hay que entender el problema lo suficiente antes de escoger; aquí es donde entra en juego la experiencia y el estudio previo.
Si hay que resolver un problema de procesamiento de datos que están o van a estar en una base de datos, el lenguaje es PL/pgSQL de PostgreSQL, y se escribe *todo* dentro de la base de datos. Prueba superada hace más de una década. Si el problema es de análisis estadístico de esos mismos datos, probablemente quiera usar PL/R. Si los datos están fuera de la base de datos, y nunca van a estar dentro, probablemente use Octave o R, según el tipo de cómputo a realizar.
Para labores de administración de sistemas, transformación de datos, interacción con servicios (SMTP, IMAP, HTTP) seguramente usaría Perl.
Hay cosas que sólo las puedes escribir en un lenguaje. Por ejemplo, para hacer una extensión para PostgreSQL, o un módulo PAM tienes que escribir en C.
Ahora mismo estoy estudiando un problema que es de base de datos, pero el problema es una combinación de manipuación de símbolos y búsqueda exhaustiva. Obviamente lo estoy haciendo en Prolog. Si después resulta «lento», veré cómo lo transformo, pero para ese problema, termina siendo el mejor lenguaje.
Para aplicaciones concurrentes y paralelas, servicios REST puros, o hacer un lenguaje, usaría Haskell.
En todo caso, el fondo es que con un sólo lenguaje no puedes resolver todos los problemas eficaz y eficientemente. Es muy importante en tu vida profesional aprender y dominar más de un lenguaje; a menos que tu deseo sea dedicarte a una, y sólo una cosa, en cuyo caso es probable que con un sólo lenguaje atiendas tus necesidades razonablemente bien.
Finalmente, evita caer en la tentación de pensar que un problema se resuelve con un sólo lenguaje. Hay problemas en los cuales deben participar varios lenguajes, cada uno apropiado para la sección del problema que ataca. El éxito está en tener práctica con tantos lenguajes y paradigmas, que puedas romper cada problema en pedazos que son representables de manera clara y rápida con cada uno.

View more

How to use double-GPU computer optimally?

If you mean multiple discrete GPU cards as, for instance, two or more nVidia cards, the latest driver for Linux makes it really easy to combine them as either a single display for a multi-screen desktop, or as multiple displays for a multi-sessions desktop (two or more sets of separate inputs).
In this scenario, hardware acceleration is always on, thus consuming more power.
If you mean an integrated GPU (Intel) and a discrete accelerated one, it will depend on drivers and actual wiring. I have a Thinkpad T530 with an Intel and an nVidia card. They are wired in such a way thata I can use the Intel card for the LCD and the VGA port, while th enVidia card can use the LCD and the DisplayPort. That means I can use the LCD and an additional monitor, but not three monitors -- unless I have a docking station.
In this scenario, the Intel card is the default one, consuming less power. When I need the GPU power for OpenGL or CUDA, I use `bumblebee` to switch on just the window that needs it, and then turn it off. There's a way to use the nVidia card all the time, but it's a waste of power for the kind of work I usually do.

View more

Liked by: Marcos Mora

Hace tres semanas comencé en una empresa que trabaja con go ¿Alguna recomendación y opinión sobre el lenguaje? Me choca un poco el err = nil en todos lados, usando interface{} a lo loco terminan "cargando" un poco el chequeo de tipos y no me simpatiza el manejo de dependencias.

Golang es muy fácil de aprender (como PHP o Python) porque es un lenguaje pequeño tanto en forma como en fondo. También hay nociones de uniformidad de estilo estandarizadas, que son apreciadas por los jefes de proyecto: todo el mundo usa el mismo estilo de código impuesto for gofmt. Finalmente, para ser un lenguaje compilado con memoria automática, el trabajo del recolector de basura es entre decente y bueno porque está diseñado para reducir la latencia de las pausas y no la efectividad de la recolección. Esos aspectos lo hacen muy atractivo para la gente que quiere progresar hacia arriba de la locura que es C o hacia abajo de la demencia que es C++, o de lado de la demencia de Python, Ruby o JavaScript cuando vas a escribir aplicaciones de alto desempeño.
Eso puede ser «lo bueno» del lenguaje. Pero es bueno para el que quiere tener un ejército de echadores de código donde «cualquiera» pueda hacer mantenimiento -- como Google.
Los diseñadores del lenguaje, y la mayoría de sus defensores, piensan que el lenguaje no necesita ningún mecanismo de formas genéricas, y que si tu crees que las necesitas, en realidad lo que tienes que hacer es escribir un generador de código Go para ahorrar tiempo. Basado en mi experiencia, esto no es más que una cultura de ocultar los defectos de diseño (quizás intencionales) del lenguaje dándoles la vuelta con... más trabajo para el echador de código.
El sistema de tipos no es tan fuerte como lo quieren vender y claramente poco flexible. No hay tipos opcionales (como el Maybe de Haskell) por eso el rancho de los nil. No hay tipos suma, ni siquiera como enumeraciones simples. No hay la posibilidad de crear subtipos incompatibles. Entonces, errores triviales que podrías detectar a tiempo de compilación, los tienes que convertir en errores verificados (por el echador de código) a tiempo de ejecución. En mi opinión, es un terrible diseño que refleja bien sea la incapacidad de aplicar los conocimientos de los últimos 20 años en investigación de lenguajes de programación, o la construcción intencional de una herramienta limita en la cual «cualquiera» crea que está usando un lenguaje de tipos fuertes y pueda echar código -- como los empleados de Google.
La inicialización automática es sólo menos mala que en C y la cantidad de código repetido que hay que escribir es vergonzosa. En la distancia escuchas a un «fanático» de Golang decir «pero eso se resuelve con generación de código»...
Estas serían las cosas que me parecen mediocres.
Las herramientas para desarrollar y la estrategia de organización, es simplista e incompleta. No hay debugger ni profiler decente, mucho menos si lo comparas con lo que hay en Haskell, o incluso en Perl.
La decisión de no permitir el versionado de módulos y librerías, dejando ese problema al controlador de versiones, está mal. Las soluciones que ruedan por allí al respecto, son aún peores. Las librerías que encuentras son regulares, y algunas francamente malas.
Suerte.

View more

+1 answer in: “¿En qué consiste tu trabajo actual y qué lenguajes y tecnologías estás utilizando?”

Related users

¿Cuál es la mejor forma de hacer debugging de procedimientos almacenado en PostgreSQL? Hay alguna herramienta en línea de comando parecida a gdb?

Puedes usar pgAdmin, que no es de línea de comandos. No sé si exista alguno para línea de comandos.

Which ThinkPad can I buy with double GPU?

Any T series can be customized to use a dual Intel and nVidia setup.

Cómo haces control de versiones de los procedimientos almacenados en PostgreSQL? Escribes los SP en archivos de texto en directorio que sea un repositorio GIT y los importas por línea de comando?

Esa es una excelente pregunta, para la cual no hay una respuesta precisa sobre el problema general. Tu intuición sirve de línea base para controlar las versiones de cada procedimiento por separado, pero eso no basta a menos que tu aplicación sea notablemente simple.
Cuando el sistema ya está en producción sólo los cambios más triviales se pueden manejar así. La mayoría de las veces los cambios serán algo como «remplazar los procedimientos A y B, por los procedimientos A', C, D y E». Ese cambio no puedes manejarlo procdimiento por procedimiento, y debe ser atómico en el nivel más alto que es la base de datos, porque la funcionalidad de A+B ,debe ser reemplazada por la funcionalidad de A'+C+D+E en *una* sola operación. Para eso, uso un mecanismo que despliega cambios al *esquema* completo, y los controla como un «parche al esquema» que además se aplica en una transacción. Además, tienes que llevar control sobre *cuales* parches has aplicado a la base de datos para que no te falte ninguno y no *reapliques* un parche que ya estaba, sobre todo si dicho cambio altera el modelo o las tablas. Sin entrar en detalles, la idea es que la base de datos tiene historia sobre los parches aplicados, y los parches son una transacción con un preámbulo que determina si el parche ya fue instalado o no.
Puedes automatizar el despliegue, pero no puedes automatizar la confección del parche. Es un problema interesante porque roza los márgenes de lo que es computable y lo que no.

View more

Liked by: Andreth Salazar

What's the point in selfsigning your gpg keys?

A signature provides a certain level of trust, that a given key was generated by the person it claims to be from. No one can forge a signature unless in possession of the signer's secret key. So, a self-signature at least is a proof that a user ID has not been tampered with. This also prevents a particular form of Denial of Service attack when your key is sent to a public keyserver without your self-signature. Finally, if you add IDs to to your keys, self-signing them helps «introduce» them in a somewhat formal way to users who already have your key and update it adding said identity.
I trust no keys whatsoever unless the exchange happens in person. And I expect the keys to be self-signed, and hopefully signed by people I trust (a very very small set that sometimes include me).

You have many revoked gpg keys. Why?

Because they used algorithms that are deemed fragile nowadays.

¿En qué consiste tu trabajo actual y qué lenguajes y tecnologías estás utilizando?

Servicios de DNS y correo electrónico seguros, incluso en redes hostiles.
Operaciones de un Internet Registry para TLDs. Participar en el desarrollo, mantenimiento y operación de los servidores EPP y WHOIS propios, toda la parafernalia alrededor de DNS redundante y seguro, toda desplegada como paquetes Debian hechos a la medida.
Hay muchas cosas en PostgreSQL (todo en procedimientos alamacenados), Perl, Golang y C, en ese orden. La lista de herramientas esarga; en todo caso, para todo lo que hay que hacer aquí rara vez hay respuestas en Google, pero usualmente le podemos preguntar directamente a los autores del software que estamos usando, porque somos nosotros, o están a uno o dos grados de separación.
Es entretenido y retador porque en general no se pueden cometer errores y no hay espacio para improvisar. Es el tipo de trabajo que no tiene un resultado visible en términos de íconos, animaciones, «interfaz intuitiva», ni elementos visuales de cara al usuario, sino que requiere comprender a fondo los RFC relevantes, implantarlos al pie de la letra, y mantenerlos operando preparados para cualquier incidente.
Es hacer que funcionen las «páginas blancas» de internet para varios dominios gTLD, o los dominios/correo de organizaciones que han aprendido que los «hosting» usualmente hacen un trabajo barato al respecto (en precio y en calidad) y no tienen las capacidades para operar su propia plataforma de manera confiable.
Tengo la fortuna de compartir tiempo con dos personas que tienen la más amplia experiencia posible en estos temas; en total creo que sumamos casi 80 años/hombre de experiencia. Eso nos permite aprender de las fortalezas que tiene cada uno, y toda reunión termina siendo muy productiva. Ahora estamos en la exploración de nuevas herramientas para resolver problemas, y seguramente Haskell tendrá oportunidad de incorporarse -- ya lo usamos via PostgREST, el punto es desarrollar servicios principales. Nada de cosas «de moda» o «populares»; una cosa es la herramienta popular y otra es la mejor.
Y siempre está el trabajo de seguir aprendiendo, así que encontré un grupo de entusiastas de la Programación Funcional, y nos reunimos una vez a la semana para compartir ideas y comparar notas. Es importante educar y educarse.

View more

+1 answer Read more

Ahora que guido se retira ¿No has pensado postularte como nuevo BDFL de Python? xD

Hay suficientes Guidos en la comunidad de Python.

¿Qué es mejor instalar en una laptop con una ram de 2gb, procesador de doble nucleo modelo intel celeron n2805 de 1.46GHZ y arquitectura x86_64, un debian de 32 bits o debian de 64 bits?

Si no te interesa tener Google Chrome, instala el de 32 bits y ahorrarás un poco de RAM. Puedes usar Chromium en lugar de Chrome y la experiencia es razonable.
Si necesitas Google Chrome, no te queda más remedio que instalar el de 64 bits.
Compra RAM.

What would you do with a dog with three balls?

Don't risk it. Walk him and pitch to the cat instead.

What is the longest you've ever gone without any sleep?

I can't sleep on planes. I simply can't.
Once I missed a connecting flight at São Paulo on account of fog. This changed a bearable Buenos Aires - São Paulo - Caracas, 9 hour trip, into a horrible Buenos Aires - São Paulo - Rio de Janeiro - Miami - Caracas, sleepless 29 hour trip. This includes ground transportation and my complete inability to nap during daytime.
I got free meals and my bags arrived, though.

Qué tan estúpido sería dividir nuestro parser del Lenguajes II en partes, una para cada su-bgramática? En particular, uno para la gramática principal que cuando le toque, llame a un parser para la gramática de expresiones de tipos? (Hay manera de estructurar mejor el .y a ser consumido por Happy?)

En una escala de 0 a 10, donde 0 es comer tierra y 10 es evangelizar con «El Capital», esa idea es un sólido 14.
Un reconocedor LALR como el que tienes que implantar, es naturalmente monolítico, y su única división es por grupo sintático de manera que puedas reusar lo más posible. Si piensas que romperlo en pedazos te va a permitir terminar más rápido, no sólo debiste haber empezado antes a escribirlo, sino que además estás perdiendo tiempo en lugar de aceptar lo que tienes que hacer y hacerlo.
Si estuvieras haciendo un parser LL con combinadores en Haskell, se puede discutir acerca de lo conveniente o no, sólo si el lenguaje es muy complicado. El lenguaje que estás implantando en la cadena no es complicado. No, no lo es. No, no insistas, no lo es.
Anda a escribir tu parser...

Tengo una CPU con un procesador AMD sempron, le instalé xubuntu 16.04 de 32 bits, iba muy bien para reproducir video a calidad 1080p, pero luego de que mi hermano la cambio de lugar dejó de mostrar fluidez en la reproducción y comenzó a ralentizarse el video en general. ¿A que se puede deber esto?

Mala ventilación. El procesador se calienta y reduce la velocidad. Si la tarjeta de video es integrada, el recalentamiento de la RAM también influye.
Puedes comprobar esa teoría incorporando monitoreo de temperatura en todos los sensores y comparando en las dos ubicaciones.

Podría colocarle un CSS sencillo a su sitio web? Se vería mejor con líneas de texto acotadas (como hace latex, por ejemplo).

Mi sitio web se presenta como quiero que se presente y cumple con el propósito que necesito que cumpla.
Una de las ventajas del CSS es que puedes escribir tu propio conjunto CSS y aplicarlo sobre cualquier sitio web para que se vea como tu quieres. Entonces, escribe el CSS que crees que haría que el sitio se vea como tú prefieres, e indícale a tu navegador que lo aplique sólo cuando visitas mi página. Así satisfaces tu gusto, sin imponerlo a los demás.

Cuales han sido lenguajes interesantes que llegaron a hacer tus estudiantes para la cadena de Lenguajes de la USB?

Los lenguajes que se escriben en la cadena de lenguajes no son interesantes. Los estudiantes tiene ninguna experiencia diseñando lenguajes, muy poca experiencia implantando uno, muestran una enorme capacidad de subestimar la complejidad del proyecto, y quieren intentarlo todo. Ese es el riesgo de darles razonable libertad de diseñar, que es necesario para que salgan de su zona de confort y aprendan.
Si todos los estudiantes tuvieran que hacer el mismo lenguaje, adecuadamente calibrado para sus destrezas, y enfocado exclusivamente en el «destino», sería menos educativo y todos terminarían compartiendo ideas, técnicas, y código sin sufrir un cambio en su manera de comprender la ciencia de la computación. Y seguramente dirían que el proyecto que mandé es «inhumano» cuando en realidad es un proyecto para gente de mente.
Lo interesante es ver cómo los estudiantes tratan de resolver creativamente el atolladero, sorteando los obstáculos inesperados que ellos mismos se pusieron, y ver si logran aprender que la ignorancia es audaz.
Por otro lado, y sin lugar a duda, escribir el compilador de la cadena de lenguajes es, por bastante, el proyecto de programación más complejo, intenso, y satisfactorio que hay en toda la carrera de pregrado. Combina conocimientos de todas las materias obligatorias, de la materia propiamente dicha, requiere creatividad, habilidad para planificar y trabajar en equipo, y trabajo constante.
Al final, todos los estudiantes quisieran haber hecho cosas diferentes, tomar decisiones diferentes, haber pensado más antes de escribir, probado mejor las cosas, y sacrificado novedad por estabilidad. Para mi es más interesante que los estudiantes hablen de sus lenguajes como creaciones que les hayan hecho cuestionar lo que saben, lo que pueden hacer, lo que deben hacer, y la manera de cooperar.
No estuve allí para ver lenguajes interesantes, sino para los estudiantes se interesaran en la complejidad de implantar un lenguaje, fuesen dueños de su producto, y corran con las consecuencias de su compromiso. Ojalá les haya servido para apreciar aún más la profesión y la importancia de pensar, comunicarse, y cooperar, antes de sentarse a escribir código por escribirlo.

View more

Asumiendo suficiente dinero (no para botar, pero sí para invertir bien), y tuvieras que comprar una ThinkPad, la pides "con todo" (32GB, i7 8thGen, etc) o why not

La vida de un laptop con Unix se alarga teniendo la máxima cantidad de RAM que puedas pagar, luego el disco más rápido posible, y por último el procesador más veloz. Así, lo primero es ponerle toda la RAM que le quepa, luego disco SSD, y finalmente el procesador con más núcleos que pueda pagar.
Hay un punto aparte para la tarjeta de video, que tiene que ser nVidia para poder usar el GPU para cómputo y OpenGL. Desde que existen, compro los modelos que tienen doble tarjeta: Intel integrada para ahorrar batería y nVidia combinada.
Un laptop con mucha RAM siempre será más conveniente que uno con menos RAM y procesadores más rápidos.
Liked by: Marcos Mora

Which celebrity would you like to meet?

I've already met Penn & Teller. Next in line is Jerry Seinfeld.

Se puede comenzar a aprender computación y específicamente programación después de los 40 años de edad? Existen casos de informáticos exitosos que hayan comenzado a una edad "madura" o simplemente es imposible si no se empezó a programar de adolescente?

Next

Language: English