Um pouco de montagem

29 de agosto de 2009 por Prashant · Comentários
Arquivado em: tecnologia

Depois de ler este artigo sobre buffers Lock Free e vendo o uso de CAS (comparar e trocar), me senti como postar o código assembly para fazer o mesmo. Use caso ali era escrever um método nativo e chamá-lo de Java (de volta em 1,5, quando as estruturas de dados concorrentes em Java eram mais ou menos não existe). Sem mais delongas, eu vou liberar o código para você :) . O primeiro é para a CAS ea segunda é para a computação GCD usando o algoritmo de Euclides (este pode ser encontrado em muitos lugares e tutoriais bem).

Compilar e executar instruções gcc file_name.c ; ./a.out

Compare e Swap

   # Include 
  # Include 
 / / Troca - newvalue, comperand é velho / valor esperado
 / *
  * Função realmente faz a coisa seguinte - se o valor no * dest é igual a OldValue, em seguida, substituí-lo por newvalue mais deixá-lo inalterado: não tudo isso atomicamente
  *
  * Há duas opções para o valor de retorno
  * O valor inicial de 1.is * dest e deixam o ônus da fxn chamando a compará-lo com oldval
  * 2.  fazê-lo por aqui e retornar 0 ou 1, esta deve ser mais eficiente
  ** /

 / * Depois transformá-lo em macro * /
 cas int (int * dest, int OldValue, int newvalue) {
	 printf ("(% d,% d,% d)", * dest, OldValue, newvalue);
	 / * Int cas (int dest, int OldValue, int newvalue) {/ *
	 / * Int cas (int dest, int newvalue, int OldValue) {/ *
	 int resultado = 1 ;/ * 1 mostra que cas conseguiram e 0 mostra que ele falhou * /
	 / * Btw precisa definir cc para sobrepor bandeira!  * /
	 volatile__ __ __asm__ (
			 "Movl% 2,%% eax \ n \ t"
			 "Movl% 3,%% ebx \ n \ t"
			 "0% movl%% ecx \ n \ t"
			 "LOCK \ n \ t"
			 "Cmpxchg ebx%%, (%% ecx) \ n \ t" / * deve bloquear ser na mesma linha * /
			 "Jz FEITO \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "FEITO: \ n \ t"
			 : "= M" (dest), "= g" (resultado)
			 : "G" (OldValue), "g" (newvalue), "m" (dest)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, OldValue, newvalue);
	 resultado de retorno;
 }

 / * TODO
  * Escrever outro fxn asm que coloca acima fxn em um loop while e continuar tentando, a menos que ele consegue * /

 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 troca 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));
	 retornar 0;
 }

Notas de formatação - parece marcação de sintaxe wp está adicionando no final, ignorar isso.

GCD

 # Include 
 int mdc (int a, int b) {
     int resultado;
     / * Compute Máximo divisor comum usando o algoritmo de Euclides * /
     volatile__ __asm__ __ ("movl% 1,%% eax;"
                           "Movl% 2,%% ebx;"
                           "Cont.: cmpl $ 0,%% ebx;"
                           "Je FEITO";
                           "Xorl%% edx,% edx%;"
                           "Idivl%% ebx;"
                           "Ebx movl%%%% eax;"
                           "Movl% edx%, ebx%%";
                           "Jmp cont.;"
                           "FEITO: movl% eax%, 0%;": "= g" (resultado): "g" (a), "g" (b)
     );

     resultado de retorno;
 }

 int main () {
     int primeiro, segundo;
     printf ("Entre com dois inteiros:");
     scanf ("% d% d", e em primeiro lugar, e segundo);

     printf ("GCD de% d &% d é% d \ n", primeiro, segundo, mdc (primeiro, segundo));

     retornar 0;
 }

Mundial de críquete Aguarda uma Nova Ordem Mundial

25 de agosto de 2009 por Prashant · Comentários
Arquivado em: Diversos

Depois de uma série que abrange cinco testes e cerca de dois meses, cinzas Inglaterra recuperados.

Vamos falar sobre a equipe vencedora primeiro - a ordem do meio é "médio" se você não quer crítica. Contribuição Greame Swann com o bastão vai contar nada menos do que a contribuição com a bola. Stuart Broad - melhor polivalente foi de arranque não para o teste 5. Andrew Strauss era o batedor apenas consistente e Jimmy Anderson foi o jogador apenas consistente.

Ponto aqui não é para repreender as conquistas do time vencedor, mas para colocar em perspectiva o fato de que, apesar de todos estes, Austrália perdeu. você vai ter que pensar por alguns segundos, se convidados a nomear o seu melhor jogador. Certo, era BW Hilfenhaus. Hauritz superou expectativa toda a gente, mas ainda não era suficientemente bom para ser selecionado para dois dos cinco testes. África do Sul nunca se tornou um batedor mundo sem um spinner de classe mundial, a Austrália não pode ter esperança de ficar um sem um bom o suficiente, pelo menos. Mago deixou o palco e ele não se parece com arte mais, esquecer a magia. Ponting ergue-se entre os mortais e Michael Clarke levanta-se muito frequentemente, mas que faz uma equipe com alguns jogadores muito bons e não um time muito bom.
Cinzas de 2009 será lembrado por Ashes últimos Andrew Flintoff de, a chegada Stuart Broad como um polivalente (se acrescenta um pouco mais do folclore Ashes ao seu início promissor), e um do século estréia mais revelador de todos os tempos por Trott, mas também será lembrado como o ponto onde ifs e buts sobre a supremacia da Austrália foram finalmente para descansar, acabou. Não me interpretem mal eles ainda podem descobrir Mike Hussey ou Stuart Clark, mas você sente a contribuição de todos os grandes nomes do momento em que eles desaparecem. Às vezes eles vêm para lembrá-lo de si em IPL, mas eles ainda não podem ser substituídos. Vamos sinto abençoada por ter visto Warne, McGrath e Gilchrist tocar juntos e sendo apoiado por Waughs, Ponting, Hyden, Martin e Langer.

Indo para a frente, África do Sul será sempre uma equipa muito boa, mas eles precisam ganhar semifinais e ser mais consistente em torno do globo, do Paquistão permanecerá enigmático brilhante, indianos armas jovens provavelmente vai achar difícil de encher os sapatos de antecessores extraordinárias. Sri Lanka deve continuar a mostrar lampejos de arte em artesanato. Mas, vamos ter de esperar algum tempo antes de ter um time todo para fora dominante ou antes de um capitão reclama de falta de concorrência, como Steve Waugh fez uma vez.

Em uma nota relacionada - vamos saudar o regresso da Asif, ele tem um inferno lote de potencial, vamos esperar para ver alguns dos que e igualmente bem-vindos Andy Flower no awatar novo, certo que você não pode manter os homens bons para baixo por muito tempo.

ruby forros para criar um hash de

20 de agosto de 2009 por Prashant · Comentários
Arquivado em: tecnologia

Ontem ao atravessar um dos meus programas antigos, encontrei este escrito por mim algum tempo atrás:

#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 um pouco de suspense, deixe-me revelar que raw_text parece

 

, Direito que foi cortado da confirmação de pagamento paypal.

Acima da linha se quebrado em partes lê melhor:

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

Vamos fazer os passos individuais no irb:

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

 => ["SUCESSO", "mc_gross = 10,00", "protection_eligibility = inelegíveis", "payer_id = U7PPJJ4TSJ47E", "imposto = 0,00", "payment_date = 09:45:30 10 de julho de 2009 PDT", "payment_status = Pendente "]                                                                         

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

 => [["SUCESSO", nil], ["mc_gross", "10,00"], ["protection_eligibility", "não elegíveis"], ["payer_id", "U7PPJJ4TSJ47E"], ["imposto", "0.00"] , ["payment_date", "09:45:30 10 de julho de 2009 PDT"], ["payment_status", "Pendente"]]                               

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

 => ["SUCESSO", nil, "mc_gross", "10,00", "protection_eligibility", "não elegíveis", "payer_id", "U7PPJJ4TSJ47E", "imposto", "0.00", "payment_date", "09:45: 30 10 de julho de 2009 PDT "," payment_status "," Pendente "]
 irb (main): 015:0>
 hash = Hash [* flattened_array]
 => {"Imposto" => "0,00", "payment_status" => "Pendente", "payer_id" => "U7PPJJ4TSJ47E", "mc_gross" => "10,00", "SUCESSO" => nil, "payment_date" = > "09:45:30 10 de julho de 2009 PDT", "protection_eligibility" => "não elegíveis"} 

BTW, * é chamado de operador splat em ruby

Outra maneira de criar hash de "matriz de pares 'é usar injetar:

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

Não é mais uma maneira :) Escreva um loop, que eu vou deixar como um exercício para os leitores!

Aqui está um caso de uso pouco independente de criação de hash a partir de matrizes:

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

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

Você pode fazer mais coisas, basicamente resultado do bloco é usado como a chave para esse elemento no hash resultante.

correção gmail, mutt e msmtp

17 de agosto de 2009 por Prashant · Comentários
Arquivado em: tecnologia

Se você usa o mutt e SMTP para acessar o Gmail. Aqui está uma notícia (ruim). Rapaziada do Google mudou novamente certificado. Oh, se você perguntar - como ele sabe? Mutt simples começou a reclamar sobre o certificado mal ao tentar usar msmpt, infame "msmtp: verificação do certificado TLS falhou:. O certificado não tem um emissor conhecido" cumprimentou-me na tela.

Para cruzar confirmar -
Basta executar o seguinte

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

No lugar do Servidor Thwate velho agora você se seguindo no segmento emissor
Issuer:
Common Name: Google Internet Authority
Organization: Google Inc
Country: US

Felizmente correção é simples, aqui está o que você precisa fazer no debian

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

Após isso apenas alterar a linha seguinte em você ~ /. 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

para

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

Git e Pesquisa Incríveis

15 agosto de 2009 por Prashant · Comentários
Arquivado em: Diversos

Aqui estão dois links para pesquisa de git (sistema de controle de versão) e comunidade (gerenciador de janelas) impressionante. Se você usar qualquer um deles, por favor, tire algum tempo para preencher o questionário. Pense nisso como a maneira mais simples de contribuir de volta para o software que você usa.
Aqui estão os links:

Git - http://www.survs.com/survey?id=2PIMZGU0&channel=Q0EKJ3NF54

Awesome - http://www.survs.com/survey?id=8BVEV3FO&channel=BH07CQ040D

Nota - (como encontrado nas páginas mas na parte inferior :) ) -
"Se você tiver cookies ativados, você pode sempre apresentar levantamento parcialmente cheio, e retornar às suas respostas em tempo mais tarde, completando mais tarde."