javascript prototype vs __proto__

Siempre me surge la misma duda, la miro, me entero, y me vuelvo a olvidar.

¿Cuál es la diferencia entre prototype y __proto__?

Tras leer el artículo JavaScript. The Core por Dmitry Soshnikov para conocer la diferencia (como hice yo), este diagrama de dicho artículo  lo resume bien:

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

Mi explicación simplicada:

  • __proto__ es el atributo que se consulta en tiempo de ejecución para ver a qué se accede si la instancia no posee dicho atributo. Por así decirlo, es la cadena de mando en la ejecución de métodos (y acceder a atributos) de instancias.
    En el diagrama, la instancia “b” hereda de “Foo” (__proto__ -> Foo.prototype) que a su vez hereda de “Object” (__proto__ -> Object.prototype).
  • prototype es un atributo que poseen las funciones que van a servir como constructor de objetos, y dicho atributo es el que se establecerá a __proto__ a las instancias. Por así decirlo, prototype es la definición de la clase.
  • new lo que hace es: crea la variable (por ejemplo “b”), y asigna “__proto__ = Clase.prototype” (pongo clase en cursiva porque en javascript no son clases)

De este modo vemos en el diagrama que Foo tiene prototype y __proto__:

  • Como Foo es una función, su __proto__ hace referencia a Function.
  • pero como Foo se va a utilizar como si fuera una clase, para instanciar objetos, tiene un prototype que va a ser la definición de la “clase“, a la que hacen referencia __proto__ de las instancias.

Detalles a mayores:

  • Los atributos/métodos en prototype son compartidos en modo lectura por todas las instancias. El motor de javascript se encarga de “convertir” b.x en b.__proto__.x cuando b no posee él mismo el atributo x.
  • Cuando modificas b.x del diagrama, el motor de javascript hace una copia (copy-on-write), de manera que b pasa a tener él mismo un atributo “x” diferente a __proto__.x. Las siguientes veces que accedas a b.x, el motor no lo transformará en b.__proto__.x, sino que tomara el valor del propio atributo de b.
    constructor-proto-chain-copy-on-write
  • Si se quiere tratar un atributo de clase (atributos estáticos, vamos) como tal, hay que hacer referencia siempre a b.__proto__.x, y al modificar esta variable de esta manera sí que se modifica para todas las instancias (que también han de acceder al valor mediante b.__proto__.x).

Más información en StackOverflow.

Ghostbusters (2016) atacada por misóginos. Un análisis cualitativo desde la estadística

Hoy se estrena en España la película “Ghostbusters”, pero antes de que la gente lo vea, realizo este analísis a priori sobre los datos que hay en Filmaffinity. En este momento tiene la siguiente puntuación:

Puntuación de Ghostbusters antes de que se estrene en España

Ghostbusters (2016)

siendo la frecuencia: [14, 4, 14, 55, 87, 59, 41, 25, 23, 100]

Lo primero que salta a la vista es la doble moda. Para los que no lo tengáis fresco, la moda es el valor que más se repite. He aquí un ejemplo:

Indiana Jones y el reino de la calavera de cristal

Indiana Jones y el reino de la calavera de cristal

Y como se puede observar, la de Ghostbusters tiene dos modas (sí, la del 1 es un poco mayor) muy separadas: una en el 1, y la otra en el 6. Casi todas las películas, y prácticamente todas las que tienen una candidad considerable de puntuaciones (>300 a ojímetro) tienen una distribución Normal o una Chi Cuadrado:

Normal

Normal

Chi Cuadrado

Chi Cuadrado

Comento que la distribución normal de la captura tiene mucha kurtosis: tiene mucho pico y es alargada. No es la típica que se ve en el instituto.

 

 

 

 

 

 

 

 

Tras comprender este detalle, miramos de nuevo la gráfica de Ghostbusters y cae de cajón que tiene algo raro. Tiene dos modas separadas por la mitad del rango de valores. ¿Cuál es la razón?

Algunos argumentan: “Me ha destrozado la infancia”. Pues mirando otras películas que destrozan la infancia, ninguna tiene dos modas. La de Indiana Jones 4 de antes, no tiene a penas unos, tiene una sola moda y una distribución equilibrada. O como por ejemplo esta otra:

Operación de apendicitis

Operación de apendicitis

La pregunta es bien sencilla. ¿Por qué tiene dos modas? Es fácil ver cómo hay dos gráficas superpuestas:

Normal + Exponencial inversa

Normal + Exponencial inversa

Se superponen una distribución Normal, y una distribución Exponencial Inversa (que es similar a una Chi Cuadrado sin grados de libertad).

Normalmente las películas en Filmaffinity parten de una sobrevaloración en el estreno, pero sin duda afirmo que Ghostbusters parte de una infravaloración. Si bien muchas películas tienen una normal con un poco más de peso hacia el lado negativo, en este caso muchas de las notas más bajas probablemente sean por la exponencial inversa (también en valoraciones 2 y 3), de modo que la media real debería ser superior a 6.

Ninguna de las películas que he ojeado al azar que están en la categoría remake tienen doble moda, así que no es algo de echarle la culpa a los remakes. Enlace al listado de remakes aquí.

Seguro que hay alguna pelicula más con dobre moda, pero habría que mirar individualemente el motivo. Si alguien encuentra películas con bastantes votos (más de 300 a ser posible) con doble moda muy separadas, que me lo indique en los comentarios y comentamos cuál podría ser el motivo.

¿Cuál es la razón de que tenga doble moda, y por lo tanto una media infravalorada? No lo sé a ciencia cierta, pero opino que no es otra cosa más que misoginia. El estudio estadístico formal y sociológico lo dejo para mentes más capacitadas.

— Actualización:

Tras ver la película puedo decir que me gustó mucho, y con toda seguridad quienes han votado 1 son simple y llanamente misóginos.

El día después del estreno la gráfica ha cambiado:

Al día siguiente

Al día siguiente

Antes: [14, 4, 14, 55, 87, 59, 41, 25, 23, 100]

Ahora: [16, 6, 21, 78, 100, 66, 42, 26, 21, 65]

Diferencia: [+2, +2  +7, +23, +13, +7, +1, +1, -2, -35]

Sin lugar a dudas, parece ser que los misóginos se retractan, cosa de la que me alegro, supongo que por presión social de aquellos que tengan como contactos en Filmaffinity. Queda muy mal mostrar claramente que eres un misógino.

Vemos también que el mayor incremento es la valoración del 7 (“Buena”), y que los misóginos como mínimo están distribuidos en los valores 1 y 2 (y yo creo que también hay en el 3 y 4), siendo una evidencia de que modelar a los misóginos con una exponencial inversa sería acertado.

Juegos malos de Steam con valoración “Mixed”

Un poco de humor:

Hay un efecto que se ve los juegos de Steam, y es que si un juego es malo de cojones, la gente lo valora positivamente de broma hasta que pasa de tener una puntuación “horrible” a “opiniones variadas” (~50% positivas).

Ejemplos los tenemos en las valoraciones positivas de varios juegos como por ejemplo:

Se ven cosas como:

Valoración MixedValoración MixedValoración MixedValoración Mixed

 

 

 

Repositorios por defecto de maven

Yo añado estos dos a settings.xml cuando creo un perfil con repositorios, ya que en este caso deja de acceder a los repositorios por defecto:

 

Cómo configurar sendmail para que utilice Gmail para enviar correos

Configuramos las credenciales en /etc/mail/auth/client-info :

Donde el usuario no es obligatorio que lleve “@gmail.com”.

En la contraseña, si usas el carácter “%” es encesario escaparlo con otro “%”, de manera que hay que poner “%%”.

Creamos el fichero client-info.db compilado, y les ponemos permisos de sólo lectura:

Añadimos a sendmail.mc casi al final de todo la configuración:

(para los certificados habrá que buscar por internet, porque no recuerdo cómo era)

Se puede especificar el fichero client-info en vez de client-info.db.

Y compilamos sendmail.mc:

Después de eso podemos hacer una prueba de envío:

Si tenemos algún problema con la autenticación nos dirá algo como:

y si descodificamos el código en base64 que contiene la cadena de autenticación con el usuario y la contraseña, nos indicará qué credenciales está enviando.