encuesta, mesa de ping, pubsub, pubsubhub, PubSubHubbub

06 de septiembre 2009 por prashant · Comentarios
Filed under: la tecnología

En caso de que se muestran escépticos, hay un método en la locura más arriba, en el título del post. En los círculos de tecnología, es poco probable que usted no ha oído hablar de PubSubHubbub. En rápidas meses, ha sido uno de los tres habló de las cosas. Otros dos de ser cifrado homomórfico y Google de onda [ 1. ]. Volviendo al puesto actual - los términos en el título de indicar cómo obtener el contenido de otras personas. Siguientes datos sea más claro, si te imaginas las cosas que suceden en lo que respecta a los blogs, a pesar de que no están conceptualmente limita a los blogs.

Sondeo se refiere a la situación en la que los clientes siguen preguntando al servidor si algo nuevo ha llegado. ¿Con qué frecuencia para pedir cambios siempre será un problema con las encuestas muy frecuentes o poco frecuentes también, pero como un lector señaló aquí que una cosa grande, con las encuestas es que el servidor no tiene que mantener el estado.

Ping se refiere al caso en que cuando se publique un artículo, usted (o su software) también actualiza algunas populares (central) los servicios de actualización. Un poco de historia aquí .

El siguiente es PubSub que significa de publicación / suscripción, uno de los primeros terreno de juego ya que se hizo aquí por Evan Henshaw-Plath y Kellan Elliott-McCrea (72 diapositivas, pero vale la pena ir a través). Ejemplo convincente que dio contra la era esto - en una fecha determinada, se arrastró Flickr Friendfeed 2,9 millones de veces para obtener las últimas fotos de 45,754 usuarios, de los cuales 6.721 habían visitado Flickr en las 24 horas y podría haber "potencialmente" ha subido una foto. Tenga en cuenta que lo que proponía no era una nueva tecnología, como ellos señalan "nueva y revolucionaria tecnología de 20 años de edad". Si lo haces para los blogs, a continuación uno de los principales problemas con XMPP - la presencia de sobrecarga de datos, que puede ser tan alta como el 60-70% se puede reducir mucho.

pubsubhub significa publicar centro de suscripción y PubSubHubbub es un protocolo, cuyo núcleo es la idea de pubsubhub. Los editores en la que (dicen los bloggers) actualizar el centro de los cuales (puede haber más de uno los centros, que hablan el uno al otro) se encuentra "en algún lugar de la nube", según el protocolo se puede empujar o tirar de acuerdo con el protocolo, pero el siguiente eslabón de la de la cadena, el centro al cliente (por ejemplo los lectores) que se busque siempre el modelo. Esta página es un buen punto de partida para PubSubHubbub, diapositivas visión general son buenas. Siempre elocuente Anil Dash se describe aquí , como botón de web.
Otros dos lecturas relacionadas son webhooks que es básicamente devoluciones de llamada de http. Github utiliza él, lo mismo ocurre con PayPal para notificaciones asíncronas de pago en el IPN . Lo mismo ocurre con muchos otros. Concepto relacionado es RSSCloud que es otra vez centro de PubSub. Siga este enlace para más detalles.

Usted podría preguntarse ¿cuál es el punto de escribir todo esto aquí, hay dos 1. Estas son las cosas merece la pena conocer, como mínimo, por lo menos y 2. Este blog es PubSubHubbub permitido ahora a través del centro appspot uso de este wordpress plugin de alimentación y también es habilitado a través de FeedBurner PubSubHubbub, enlace aquí
-
[ 1 ]. - Buena lectura introductoria para el cifrado completo homeomorfo es el artículo de Bruce Schneier y la conversación es más o menos la única fuente para Google Wave.

-ACTUALIZACIÓN - Este mensaje se explica cómo la exigencia de devolución de llamada para el servidor público se puede trabajar alrededor de los clientes de escritorio mediante el uso de puerta de enlace XMPP (por PubSubHubbub).

Un poco de ensamblaje

29 de agosto 2009 por prashant · Comentarios
Filed under: la tecnología

Después de leer este artículo acerca de tampones de bloqueo libres y viendo el uso de CAS (comparar e intercambiar), me sentí como publicar el código en ensamblador para hacer lo mismo. El caso de uso sobre lo que había que escribir un método nativo y lo llaman de Java (de nuevo en 1,5, cuando las estructuras de datos concurrentes en Java eran más o menos inexistente). Sin más preámbulos, voy a liberar el código en que :) . En primer lugar es para el CAS y el segundo es para la informática GCD utilizando el algoritmo de Euclides (éste se puede encontrar en muchos lugares y tutoriales, así).

Compila y ejecuta las instrucciones de gcc file_name.c ; ./a.out

Compara y Swap

   # Include 
  # Include 
 / / Cambio - nuevovalor, comperand es viejo / valor esperado
 / *
  * Función que realmente hace lo siguiente - si el valor en * dest es igual a oldValue continuación, sustituirla por otra nuevovalor dejarlo como está: hacer todo esto de forma atómica
  *
  * Hay dos opciones para el valor de retorno
  * El valor inicial de 1.is * dest y dejar la carga de la FXN llamando al compararlo con OLDVAL
  * 2.  hacerlo aquí y devolver 0 o 1, esto debe ser más eficiente
  ** /

 / * Después se convertirá en macro * /
 cas int (int * dest, int oldValue, int nuevo_valor) {
	 printf ("(% d,% d,% d)", * dest, oldValue, newvalue);
	 / * Int CAS (int dest, int oldValue, int nuevo_valor) {* /
	 / * Int CAS (int dest, int nuevovalor, int oldValue) {* /
	 int resultado = 1 ;/ * 1 muestra que el CAS tuvo éxito y 0 muestra que fallaron * /
	 / * Por cierto necesidad de establecer cc para vapulear la bandera!  * /
	 __asm__ volatile__ __ (
			 "Movl% 2,%% eax \ n \ t"
			 "Movl% 3,%% ebx \ n \ t"
			 "0 movl%,%% ecx \ n \ t"
			 "Lock \ n \ t"
			 "CmpXchg ebx%%, (%% ecx) \ n \ t" / * debe de cierre puede ser en la misma línea * /
			 "HECHO jz \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "HECHO: \ n \ t"
			 : "= M" (destino), "= g" (resultado)
			 : "G" (oldValue), "g" (nuevo_valor), "m" (destino)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, oldValue, newvalue);
	 return resultado;
 }

 / * TODO
  * Escribir otro FXN asm que pone por encima de FXN en un bucle while y seguir intentando si no logra * /

 int main () {
	 int a = 5, b = 6;
	 int * c = (int *) malloc (sizeof (int));
	 * C = 6;
	 / * Int c = 6; * /
	 printf ("% d \ n", CAS (c, b, b));
	 printf ("% d \ n", CAS (c, b, a));
	 printf ("% d \ n", CAS (c, a, a));
	 printf ("% d \ n", CAS (c, b, b));
	 * C = 6;
	 / * C = 5; * /
	 printf ("valor de cambio de c * a% d \ n", * c);
	 printf ("% d \ n", CAS (c, b, b));
	 printf ("% d \ n", CAS (c, b, a));
	 printf ("% d \ n", CAS (c, a, a));
	 printf ("% d \ n", CAS (c, a, b));
	 printf ("% d \ n", CAS (c, b, a));
	 return 0;
 }

Notas de formato - parece marcador wp sintaxis es la adición de al final, ignorar eso.

GCD

 # Include 
 int mcd (int a, int b) {
     int resultado;
     / * Calcular máximo común divisor mediante el algoritmo de Euclides * /
     __asm__ volatile__ __ ("movl% 1,%% eax;"
                           "Movl% 2,%% ebx;"
                           "Cont: CMPL $ 0,%% ebx;"
                           "Je Hecho";
                           "Xorl%% edx,%% edx;"
                           "Idivl%% ebx;"
                           "Movl% ebx%,%% eax;"
                           "Movl%% edx, ebx%%;"
                           "Jmp cont;"
                           "HECHO: movl%% eax, 0%;": "= g" (resultado): "g" (a), "g" (b)
     );

     return resultado;
 }

 int main () {
     int primer segundo,;
     printf ("Introduzca dos enteros:");
     scanf ("% d% d", y en primer lugar, y segundo);

     printf ("El MCD de% d &% d es% d \ n", primero, segundo, mcd (primero, segundo));

     return 0;
 }

rubíes para crear un revestimiento de hash

20 de agosto 2009 por prashant · Comentarios
Filed under: la tecnología

Ayer, mientras pasaba por uno de mis viejos programas, encontré este escrito por mí hace algún tiempo:

#begin magic
hash=Hash[*CGI.unescape(raw_text).split('&').map{|x| b=x.split("=");b.push(nil) if b.size==1;b}.flatten]
#end magic

Para matar a algunos de suspenso que me revelan que raw_text parece

 

, A la derecha que se ha reducido de reconocimiento de pago de PayPal.

Por encima de la línea en caso de rotura de las piezas se lee mejor:

  unescaped_array = CGI.unescape (raw_text). split ('&')
   unescaped_array unescaped_array.collect = {| x | b = x.split ("="); b.push (cero) si b.size == 1, b}
   flattened_array = unescaped_array.flatten
   hash = hash [* flattened_array] 

Vamos a hacer los pasos individuales en el IRB:

  irb (main):. 009:0> = unescaped_array CGI.unescape (raw_text) split ('&')    

 => ["Éxito", "mc_gross = 10,00", "protection_eligibility = no elegible", "payer_id = U7PPJJ4TSJ47E", "impuestos = 0.00", "payment_date = 09:45:30 10 de julio 2009 PDT", "payment_status = Pendiente "]                                                                         

 irb (main): 013:0> = unescaped_array unescaped_array.map {| x | b = x.split ("="); b.push (cero) si b.size == 1, b}  

 => [["Éxito", nil], ["mc_gross", "10.00"], ["protection_eligibility", "no elegible"], ["payer_id", "U7PPJJ4TSJ47E"], ["impuesto", "0.00"] , ["payment_date", "09:45:30 10 de julio 2009 PDT"], ["payment_status", "Pendiente"]]                               

 irb (main): 014:0> = flattened_array unescaped_array.flatten     

 => ["Éxito", nula ", mc_gross", "10.00", "protection_eligibility", "no elegible", "payer_id", "U7PPJJ4TSJ47E", "impuesto", "0.00", "payment_date", "09:45: 30 de julio 10, 2009 PDT "," payment_status "," Pendiente "]
 irb (main): 015:0>
 hash = hash [* flattened_array]
 => {"Impuesto" => "0.00", "payment_status" => "Pendiente", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "el éxito" => nil ", payment_date" = > "09:45:30 10 de julio 2009 PDT", "protection_eligibility" => "no elegible"} 

Por cierto, * se llama operador de splat en Ruby

Otra forma de crear hash a partir de "matriz de pares" es el uso de la inyección:

  hash = [[1,2], [3,4]] inyectar ({}). {| resultado, el elemento | resultado [element.first] = resultado [element.last];} resultado 

Hay una manera más :) Escribir un bucle, que voy a dejar como un ejercicio para los lectores!

Este es un caso poco uso sin relación de la creación de hash a partir de las matrices:

  irb (main): 005:0> [1,2,3,4,7,9] group_by {| x | x <5.?  : Menor :: mayor}

 => {: Menor => [1, 2, 3, 4],: mayor => [7, 9]} 

Puede hacer más cosas, básicamente resultado de la manzana se utiliza como clave de ese elemento en el hash resultante.

gmail, mutt y msmtp solución

17 de agosto 2009 por prashant · Comentarios
Filed under: la tecnología

Si utiliza mutt y smtp para acceder a Gmail. Esta es una noticia (mala). Chicos cool de Google volvió a cambiar de certificado. Ah, ¿le pregunto - ¿cómo se lo conocerá? Mutt simple comenzó a quejarse de certificado no válido al intentar utilizar msmpt, infame "msmtp: la verificación de certificados TLS falló:. El certificado no tiene un emisor conocido ' me saludó en la pantalla.

Para cruzar confirmar -
Sólo tiene que ejecutar después de

$ msmtp --serverinfo --host=smtp.gmail.com --tls=on --port=587 --tls-certcheck=off

En lugar de Servidor Thawte viejo te después en el segmento de emisor
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Afortunadamente solución es simple, esto es lo que tiene que hacer en debian

# apt-get install ca-certificates
# dpkg -s ca-certificates|grep Version
Version: 20090814

Después de esto sólo cambiar la línea siguiente en usted ~ /. Msmtprc

tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem

tls_trust_file /certs/Thawte SSLWeb Server Roots/thawte Premium Server CA/Thawte Premium Server CA.pem

a

tls_trust_file /usr/share/ca-certificates/mozilla/Equifax_Secure_CA.crt

La fusión de los hashes de los archivos de conf YAML

31 de julio 2009 por prashant · Comentarios
Filed under: la tecnología

YAML es muy útil para escribir archivos de configuración. Principal ventaja es que, se lee como archivo de texto. Esto funciona muy bien si su fichero de configuración es plana (sin jerarquía) y no tiene repeticiones.
Si su archivo de configuración tiene repeticiones, entonces tiene sentido para separar los elementos y volver a usarlos. Lo que quiero decir es esto - digamos que su archivo de configuración es la siguiente:

  el desarrollo:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret
 producción:
   input_location: common_input
   output_location: dev_location
   mail:
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret 

Suponiendo que el código anterior en / tmp / test.yml aquí es cómo se puede leer en Python y Ruby
$cat readyml.py

 #! / Usr / bin / python env
 pprint de importación pprint como pp
 # Debian en el que instalar python-YAML
 de la carga de importación YAML, load_all, volcado
 hash = carga (open ('/ tmp / test.yml'))
 pp (hash ['desarrollo']) 


$ cat readyml.rb

  #! / Usr / bin / env ruby
 require 'pp'
 hash = YAML :: load (File.open ('/ tmp / test.yml'). leer)
 pp hash ['desarrollo'] 

aquí hay una mano un trazador de líneas de la versión de Ruby
$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]' o puedes intentar lo mismo en el IRB o la consola de python.

Tenga en cuenta que en el fragmento de código anterior, todo es distinto de ubicación de salida es la misma en el desarrollo y la parte de producción. Aquí es donde identificador de nodo yml viene a rescatar. La idea es sencilla tiene un conjunto de valores predeterminados y reemplazar ellos en lugar diferente.
Usted podría separarla de la siguiente manera:

  por defecto y por defecto:
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: emisor
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret
 el desarrollo:
   <<: * Los valores por defecto
 producción:
   <<: * Los valores por defecto
   output_location: prod_location 


$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

Grande, que funciona (tm)!.
Podría decirse que negocian un poco de claridad a un poco de magia. Aquí hay una pequeña explicación: &, * y <<: y que es etiqueta de anclaje puede ser entendido como identificador de nodo, * es la referencia de nodo y <<: es sinónimo de fusión de hash.

Para más detalles vea bien las especificaciones YAML o wikipedia
Hasta aquí todo bien, pero hay un problema aquí, estas fusiones hash no son recursivos. Lo que significa es lo siguiente: digamos que usted desea tener el nombre del remitente para el correo diferentes en dos ambientes, usted puede estar tentado a hacer lo siguiente:

  por defecto y por defecto:
   input_location: common_input
   output_location: dev_location
   mail:
     sender_name: emisor
     smtp_server: su_servidor
     de inicio de sesión: your_login
     contraseña: top_secret
 el desarrollo:
   <<: * Los valores por defecto
   mail:
     sender_name: sender_dev
 producción:
   <<: * Los valores por defecto
   output_location: prod_location
   mail:
     sender_name: sender_prod 

Permite comprobar

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
nil
$

Vaya, algo salió mal, el problema como se mencionó anteriormente es que la combinación hash no es recurrente y si bien la fusión de lo reemplazó de correo electrónico de forma predeterminada por correo de la producción que tiene una sola llave. Solución / es trabajo en torno a desenrollar un nivel más:

  common_settings: & common_settings
 input_location: common_input
 output_location: dev_location
 mail_defaults: & mail_defaults
  sender_name: emisor
   smtp_server: su_servidor
   de inicio de sesión: your_login
   contraseña: top_secret

 por defecto y por defecto:
   <<: * Common_settings
   mail:
     <<: * Mail_defaults
 el desarrollo:
   <<: * Los valores por defecto
 producción:
   <<: * Los valores por defecto
   mail:
     <<: * Mail_defaults
     sender_name: sender_prod

Vamos a comprobar de nuevo

$ ruby -rpp -e 'pp YAML::load(File.open("/tmp/a.yml"))["development"]["mail"]["login"]'
"your_login"
$

¿Sabía usted que usted tiene un nivel de más de anidación, así que definitivamente se puede desenrollar un nivel más, pero entonces se convierte en un desastre. Por lo tanto, si usted no está tratando de escribir la solución a las torres de Hanoi en un archivo de conf, es mejor restucture conf a cavar en YAML o alguna otra cosa. Pero eso es la llamada de todos modos.

Un poco de redirección de shell

10 de mayo 2009 por prashant · Comentarios
Filed under: la tecnología

Así es como lo hacemos normalmente la redirección de shell
$ ./pgm.sh args >out.txt 2>err.txt
Yo quería que modificar un poco y ejecutar de la siguiente manera
$ ./pgm.sh args
con el requisito de que la producción y el error debe ir a un nombre de fichero en el interior pgm.sh calcula sobre la base de argumentos. Un caso ilustrativo podría ser cuando la fecha es parte de args. Así que le gustaría stdout para ir a decir / su / directorio / pgm_out_YYYYMMDD.txt 1

El problema con la forma estándar de reorientar N>file.txt es decir, la asociación de descriptor de fichero n al archivo.txt, es que funciona sólo para el proceso de nueva forma de horquilla y no para el proceso actual.
tan
$ echo hi 1>out.txt ; echo hii . enviará hola a out.txt, pero se imprimirá hii a la salida estándar 2

Aquí es donde exec viene a nuestro rescate. Si a esto añadimos exec 1>somefile.txt entonces la salida del resto de la secuencia de comandos ir a algun_archivo.txt

$ cat test.sh
#!/usr/bin/env bash
exec 1>out.txt
echo hi
echo hii
$. / Test.sh redirigirá alta, así como a la hii out.txt

Al igual que redirigir stdout stderr, así como vamos a hacer algo como esto
cat test2.sh
exec 1>out.txt
exec 2>err.txt
echo out text
echo 1>&2 err text
somenoneexitent command
ls -ld /tmp

Ahora que se acerca de nuevo al punto original de volver a dirigir a algún archivo desde el interior de la concha, digamos que el programa calcula el nombre del archivo en algunos OUTFILE variable, podríamos haber hecho exec 1>$OUTFILE

Eso resuelve el problema actual. Pero usted puede tener gusto de ir a través del ejemplo siguiente, que logra el "acceso aleatorio" del archivo de script de shell. Ejemplo es de aquí
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890

Con los comentarios, este código es autoexplicativo.
-
1 También se puede hacer por $ ./pgm.sh args >pgm_out`date +%Y%m%d` pero la idea es generar este nombre de archivo basado en una lógica en el programa en sí.
2 1 1> out.txt es redundante, pero aclara que aquí estamos redirigiendo FD 1

Para escalar o no escalar a

11 de enero 2009 por prashant · Comentarios
Filed under: la tecnología

Al hablar de división horizontal de bases de datos, DHH de ROR fama sugiere eso la ampliación puede esperar, sin duda esperar hasta el punto de sus necesidades empresariales lo requieran. Su artículo definitivamente tiene sentido para las configuraciones de los pequeños dicen que recién se inician. No quiere decir que en el arranque debes escribir programas de demostración, pero teniendo en cuenta que sólo hay 24 horas en un día en que debe centrarse en servir a decir que 1000 usuarios de una forma más satisfactoria que perder el sueño por preocuparse por cómo va mi solicitud de manejar la carga de los 13.142 millones usuarios. Si usted recibe los muchos usuarios sabrán cómo escalar. Por escalabilidad startups es un buen problema para resolver un problema, pero mucho mejor tener, me refiero a cualquier puesta en marcha le encantaría encontrarse con este problema!

En otro relacionado con el artículo de Jeremy Zawodny escribe no debe depender de el señor Moore, si usted tiene problemas de escalabilidad.

Debido a que estos artículos se refieren a la ley de Moore no puedo dejar de escribir que la ley de Moore debe ser uno de la ley más generalizada en Ciencias de la Computación. A partir de su predicción original acerca de la densidad de transistores, esta ley está citado en cualquier parte te encuentras con un crecimiento exponencial.