Un poco de ensamblaje
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
# Includeint 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; }
Mundial de cricket Espera un Nuevo Orden Mundial
Después de una serie que abarca cinco pruebas y aproximadamente dos meses, las cenizas de Inglaterra recuperados.
Vamos a hablar sobre el equipo que gana primero - el orden del medio es "medio" si no quiere críticas. Contribución Greame de Swann con el bate contará nada menos que la contribución con el balón. Stuart Broad - el mejor arranque fue todo más redondo no para la prueba de quinto. Andrew Strauss fue el bateador consistente y sólo Jimmy Anderson fue el único jugador de bolos consistente.
El punto aquí no es para reprender a los logros del equipo ganador, sino para poner en perspectiva el hecho de que a pesar de todo esto, Australia perdió. tendrás que pensar por unos segundos, si se le pide llamar a su mejor jugador de bolos. Correcto, BW fue Hilfenhaus. Hauritz superó las expectativas everbody, pero todavía no era lo suficientemente bueno para ser seleccionado para dos de las cinco pruebas. Sudáfrica nunca se convirtió en un batidor mundo sin un control de número de clase mundial, Australia no puede aspirar a seguir siendo uno sin que uno lo suficientemente bueno uno por lo menos. Mago dejó el escenario y no se ve como el arte más, olvidar la magia. Ponting se yergue entre los mortales inferiores y Michael Clarke se pone de pie muy a menudo, pero que los hace un equipo con muy buenos jugadores y no es un equipo muy bueno.
Ashes 2009 será recordado por las cenizas últimos Andrew Flintoff, la llegada de Stuart Broad como todo más redondo (si añade folclore un poco más cenizas a su prometedor comienzo), y uno del siglo debut más elocuente de todos los tiempos por Trott, pero también será recordado como el punto donde peros sobre la supremacía de Australia fueron finalmente puso a descansar, se acabó. No me entiendas mal que todavía se puede descubrir Mike Hussey o Stuart Clark, pero se siente la contribución de todos los grandes del momento en que éstos van a faltar. A veces vienen a recordarle a sí mismos en la IPL, pero aún no pueden ser reemplazados. Vamos siento bendecido por haber visto Warne, McGrath y Gilchrist jugando juntos y con el apoyo de Waughs, Ponting, Hyden, Martin y Langer.
De cara al futuro, Sudáfrica seguirá siendo siempre un equipo muy bueno, pero que necesitan para ganar las semifinales y ser más coherente en todo el mundo, Pakistán seguirá siendo enigmática brillante, indios chicos jóvenes, probablemente le resultará difícil llenar los zapatos de predecesores extraordinarias. Sri Lanka debe seguir para mostrar atisbos de arte en el arte. Pero, tal vez tengamos que esperar algún tiempo antes de contar con un equipo dominante, todos fuera o antes de un capitán se queja de la falta de competencia, como Steve Waugh hizo una vez.
En una nota relacionada - demos la bienvenida a la vuelta de Asif, que tiene un montón infierno de potencial, esperemos a ver algo de eso y también la bienvenida a Flor de Andy en el awatar nueva, a la derecha no se puede mantener a los hombres buenos por mucho tiempo.
rubíes para crear un revestimiento de hash
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
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
Git y Encuesta Impresionante
Aquí hay dos enlaces para el reconocimiento por parte de git (sistema de control de versiones) y de la comunidad impresionante (gestor de ventanas). Si utiliza cualquiera de estos, por favor saque algo de tiempo para rellenar el cuestionario. Piense en ello como la forma más sencilla de contribuir al software que utiliza.
Aquí están los enlaces:
Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54
Impresionante - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D
Nota - (como se encuentra en esas páginas pero en la parte inferior
) -
"Si tienes las cookies habilitadas, siempre se puede presentar la encuesta parcialmente lleno, y regresar a sus respuestas en el momento más tarde, completando más tarde."



































