Páginas

Saturday, November 27, 2010

Paralelismo em Clojure: Threadpool produtor - consumidor

Ontem fiz uma pequena implementação rascunho de uma fila consumida por threads de processamento em Clojure.
Eu havia feito algo similar em Python para encontrar nomes de usuário disponíveis no Twitter.
Tive dificuldade em encontrar uma forma canônica de fazer isso, sem querer me meter muito no mundo Java.

Por fim deixo o código aqui como lembrança do meu feito.

(def *mul* 1)
    
(defn slow-task [v] (Thread/sleep (* @#'*mul* v)) v)

(def history (ref []))

(defn init-items [stream]
    (let [items-stream (ref stream)]
        (fn get-item []
            (dosync
                (let [f (first @items-stream)]
                        (alter history conj [(count @items-stream) f])
                        (alter items-stream rest)
                        f)))))

(defn worker []
    (doall
        (for [x (repeatedly get-item) :while x]
            (try
                (slow-task x)
                (catch Exception _ :put-item-back-to-queue)))))
    
(defn process-all [n-workers]
    (doall
        (for [x (range n-workers)]
            (future (worker)))))
    
(defn main [n-tasks n-workers time-mult]
    ; set multiplier for sleep
    (def *mul* time-mult)
  
    ; clear history
    (dosync (alter history empty))
  
    ; set number of tasks to process
    (def get-item (init-items (take n-tasks (cycle [1 7 2 3]))))
    (sort-by (fn [[k v]] k) (doall (into [] (map (fn [T] [(reduce + T) T]) (time (doall (map deref (process-all n-workers)))))))))

(main 100 20 100)


;------ alternativa ainda não explorada --------
(def producer (seque 1 (cycle (range 10))))

(doseq [o (take 10 producer)]
  (println "consumer:" o)
  (Thread/sleep 1000))

O código acima foi fruto de uma experimentação no REPL. Acabei usando a ideia depois num de nossos projetos na Intelie.
Agradeço ao pessoal que postou nesta thread do grupo de usuários de Clojure e este post no guj.

Friday, November 26, 2010

Linguagens usadas no DojoRio

Fiz uma pequena lista das linguagens que usamos em cada dojo de 2010.


-- javascript (8) ------------------------------------------------------------
20100210: proxima vitima
20100505: romanos
20100519: pedra papel tesoura
20100602: caminho
20100707: reais por extenso
20100721: 3n+1
20100804: ascii
20100818: url rewrite


-- perl (1) ------------------------------------------------------------------
20101124: inteiros para romanos


-- php (4) -------------------------------------------------------------------
20100714: espiral
20100728: palindromos
20100811: game of life
20100908: cheque o xeque


-- python (14) ----------------------------------------------------------------
20100106: sql
20100203: tennis
20100224: metadojo
20100324: jogo da velha
20100428: reversi
20100512: automato
20100623: roleta romana
20100825: datas
20100929: espiral
20101006: espiral
20101013: fizzbuzz
20101027: espiral
20101103: forca
20101117: forca


-- ruby (10) ------------------------------------------------------------------
20100113: gols
20100127: abastecimento dagua
20100303: detetive
20100414: HomeRange
20100526: saving time
20100609: cheque o xeque
20100616: jokenpo
20100630: validador
20100915: encaixotar
20101020: Espiral


-- shell (2) -----------------------------------------------------------------
20100901: fizzbuzz
20100922: url

E aí, o que acham?

Estou no rumo certo do TDD e Baby Steps?

Costumamos falar destes termos toda semana no DojoRio, mas imagino que nem todos de fato compreendem os termos para além das traduções pro português e mais alguma idéia superficial ou distorcida do que seja.

Isto não é um ataque, e sim um convite a reflexão para que cada um faça um "self-check"...

E aí, será que posso melhorar a qualidade do meu código? Será que faço TDD de verdade, ou só estou enrolando ou me enganando? Esses tais passos de bebê são úteis pra mim? Estou fazendo a coisa certa?

Graças ao link que o Berrondo mandou pra lista de emails recentemente (numa retrospectiva do que rolou na última quarta), vi que o Aniche fez boas considerações sobre este ponto:

http://www.aniche.com.br/2010/11/cuidado-com-seus-baby-steps/

Na quarta, depois do nosso randori normal de toda quarta, tivemos um kata do Juan Bernabó mostrando como ele ataca o problema de transformar números arábicos em romanos sem pensar! Isso mesmo, sem pensar. Sem parar de fazer o simples processo de escrever testes, identificar padrões e refatorar.

Confira o resultado do kata:
http://code.google.com/p/dojo-rio/source/browse/#svn/trunk/2010/20101124 - inteiros para romanos - perl

Thursday, November 25, 2010

Vendo netbook HP Mini 210-1000EW


Pessoal,

No meado de dezembro viajo para a Europa para tirar umas longas férias. Vou visitar minha namorada (que conheci no intercâmbio que fiz em Lisboa no último ano), e aproveitar para visitar o máximo de cidades que for possível. Será Strasbourg, Frankfurt, Cracóvia, Dortmund, Bratislavia, Olomouc, etc.

Vou precisar investir uma grana nessa empreitada. Com isso, meu netbook HP Mini 210-1000EW terá pouca utilidade (largar ele aqui em casa na poeira?!). Não tenho uma lojinha que nem o Vinícius, mas também quero passar pra frente esse netbook que tem menos de 3 meses de muito pouco uso.

Ele é um pouco melhor do que os modelos HP Mini encontrados aqui no Brasil. Tem HD de 250 GB, 1 GB DDR2 (facilmente pode virar 2GB), bastante compacto com tela de 10.1" e resolução 1024x600, bluetooth, wifi, leitor de cartões 5x1, câmera, e o melhor é a bateria de 6 células que dura de verdade entre 5 e 6 horas.
O teclado é US (não tem ç), e é com as teclas espaçadas como nos Macs. Tem também um leitor de SIM card que permite usar para conectar à Internet com 3G.

Além de ser pequeno e fácil de carregar, sua autonomia permite até que você saia de casa e não leve o carregador! Mas se quiser levar, ele também é bem pequeno e leve.


Este netbook tem um mini sistema operacional chamado HP Quick Web que boota em poucos segundos e permite ouvir músicas, ver fotos, navegar na internet, ler email, tudo sem esperar o boot do Windows ou outro sistema operacional.

Veja as fotos do HP Mini que pode ser seu
HP Mini 210-1000EW


Dê sua oferta em netbook.rodolfocarvalho.net.
Para qualquer dúvida, envie um email para netbook-arroba-rodolfocarvalho.net

Sunday, November 21, 2010

Leituras

Estou lendo:
  1. Practical Clojure (parei um pouco além da metade)
  2. On the cruelty of really teaching computing science (há um bom tempo pra começar, mas agora com PDF no celular fica mais fácil...)
  3. Crush it (obrigado @Israel!)
  4. On Lisp
  5. Land of Lisp (excelente)
  6. Structure and Interpretation of Computer Programs (leitura obrigatória... estou començando agora, depois de muito tempo que ficou na fila... mais uma vez, leitura no celular!)
  7. The Moon Is a Harsh Mistress (ainda pra começar... desisti de ouvir o audiobook)

Tem mais coisa que vai surgindo... mas esta foi a listinha que enviei num email outro dia :D

Criando uma conta no Twitter

Tem sido difícil tirar um tempinho para blogar. Estes dias estou lendo um livro que o Israel me emprestou, e finalmente de alguma forma me convenci a criar uma conta no Twitter. Não para ficar perdendo meu tempo falando onde estou, ou que a pizza chegou atrasada, ou que isso ou aquilo. O interesse é apenas "educacional", já que a plataforma é de fato interessante.

É claro, entrar no jogo nesta altura do campeonato não é nada fácil... Opções como "rhcarvalho" ou "rodolfocarvalho" já foram tomadas meses ou anos atrás. E já que iria ficar com um nome de usuário pouco significativo, resolvi que este nome deveria ser curto.

Foi fácil perceber que todos os nomes com apenas 1 caracter já existiam. Com exceção do "i", mas mesmo assim não consegui criar um conta com o nome de usuário "i".

Ontem acabei desistindo de criar a tal conta. E hoje, sábado, escrevi um pequeno script em python para verificar todos os nomes possíveis com 2 ou 3 letras que ainda estivessem disponíveis.

Descobri que nada seria possível com 2 letras, e existiam 3112 opções com 3 letras. Destas, 1 era composta apenas por dígitos, e 5 eram compostas apenas por letras.
As contas compostas apenas por letras eram: ['xjv', 'txp', 'dzz', 'qfw', 'hqc']
Destas, nenhuma me interessa...

Mas o número... o número com 3 dígitos é a minha nova conta no Twitter! @201

201 é um número bacana!

Quanto ao script, usei meu conhecimento adquirido com web crawling multithread para viabilizar um "ataque de força bruta" a API do Twitter usada na verificação de disponibilidades de nomes.