Páginas

Saturday, December 11, 2010

Tor Project e Sistemas de Anonimato

Fiz um trabalho sobre o Tor Project e Sistemas de Anonimato para o curso de Redes na UFRJ.
Apresentei o trabalho no dia 1 de dezembro, com uma boa sessão hands on.
Depois da solicitação de um amigo, me dei o "trabalho" de colocar aqui no meu site.

Eu deveria compartilhar mais conteúdo que eu produzi nestes anos de universidade...

Thursday, December 2, 2010

Reciclagem de monitor CRT

Visto nesta quarta no Grêmio da COPPE, restaurante na UFRJ.




E tinham mais 2 ou  3 desses.... O que será que vão fazer com monitores LCD?
E o que será que fizeram com os tubos de raios catódicos? Será um novo mega acelerador de partículas?

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.

Sunday, October 17, 2010

Aprendizado de máquina

Curso da Faculdade de Engenharia de Standford sobre Aprendizado de Máquina:

http://see.stanford.edu/see/lecturelist.aspx?coll=348ca38a-3a6d-4052-937d-cb017338d7b1

É possível aprender com os dados?

Tudo começou com a leitura de um post num blog, sobre Online Learning [1], sugestão de um amigo do estágio.
Nos comentários tinha um link para um site com vídeo aulas [2].
Chegando lá, já no primeiro link no topo da página [3] me interessei e comecei a assistir uma aula de uma hora sobre aprendizado semi-supervisionado.

Existem métodos de inferir/formular modelos a partir de um conjunto de dados no qual temos como entrada pares de entrada+saída. São os chamados métodos supervisionados.
Por exemplo, podemos ter como entrada 1000 emails e saber se cada um deles é um spam ou não.

Seria interessante agora inferir coisas a partir dos dados não classificados, classificação não-supervisionada.
Este é o caso quando queremos por exemplo encontrar grupos através de uma função de similaridade.

O aprendizado semi-supervisionado é quando temos alguns dados classificados, e outros não classificados. Ou seja, temos 1000 emails que sabemos distinguir entre spam e não-spam, mais digamos 9000 emails que não sabemos a classificação.

Esses 9000 emails podem ajudar substancialmente a desenvolver um modelo que dado um novo email ele seja classificado corretamente como spam ou não-spam.
Na aula são mostradas duas categorias de problemas, e que tipo de conjunto de dados funcionam bem usando as técnicas apresentadas.
  • Expectation Maximization (EM) [4]
  • Co-training [5]
Essas técnicas me deram uma idéia de como posso classificar tweets como positivos ou negativos a respeito de algum candidato nas eleições 2010 [6], bastando ter algumas amostras de mensagens classificadas positivamente e outras classificadas negativamente.

Fica a sugestão a todos para visitar o videolectures.net e passar algumas horas assistindo a aulas muito interessantes.


[1] http://mark.reid.name/sap/online-learning-in-clojure.html
[2] http://videolectures.net
[3] http://videolectures.net/mlas06_mitchell_sla/
[4] http://en.wikipedia.org/wiki/Expectation-maximization_algorithm
[5] http://en.wikipedia.org/wiki/Co-training
[6] http://www.eleitorando.com.br

Friday, October 8, 2010

Dicionários recursivos

Só por curiosidade, alguém além de mim já fez isso aqui?

Digite no seu interpretador de Python:

d = dict()
d['d'] = d
d
d['d']
d['d']['d']
d = dict()
e = dict()
d['e'] = e
d
e['d'] = d
e
d
d['e']['e']
d['e']['d']



É bem interessante ver:
In [17]: d['e']['d']
Out[17]: {'e': {'d': <Recursion on dict with id=4321969824>}

Tuesday, September 21, 2010

De volta ao Brasil, e de volta a ativa...

Depois de 11 meses em Portugal e 1,5 no Brasil como guia turístico, estou de volta.
Ontem comecei a trabalhar na Intelie, que certamente será fonte de grande aprendizado e diversão.

Na universidade (UFRJ) estou fazendo disciplinas interessantes, e pretendo fazer alguns posts sobre elas.

Também estou de volta ao DojoRio, evento que dei início e participei sempre até minha ida para o exterior.
E o dojo me trouxe muita satisfação. Ele cresceu para além de minhas expectativas, vários amigos estão fazendo palestras sobre o mesmo, e outras pessoas tem nos seguido e iniciado outros dojos pelo Brasil (e também pelo Rio, onde tivemos uma grande multiplicação).

Amanhã estarei lá na Lapa para mais um! O endereço é Rua Teotônio Regadas 26 sala 603 - Lapa, ao lado da Sala Cecília Meireles, próximo ao Metrô.

Monday, June 28, 2010

Utilização do disco usando du e awk

Hoje escrevi algumas linhas no shell para me ajudar a identificar onde estavam as coisas mais pesadas na hierarquia...

Fica aqui como possível referência futura:

  • Listar/calcular tamanho para 2 níveis de diretórios 
du -k -d2 . | awk '{printf "%-40s %4.1f MB\n", $2, $1/1024}' | sort

  • Ver os 15 maiores diretórios
du -k * | sort -nr | head -n 15

  • Ver apenas diretórios com mais de 1 MB
du -k -d3 main | awk '{ if ($1 >= 1024) printf "%-40s %4.1f MB\n", $2, $1/1024}' | sort 

Sunday, June 27, 2010

Novo layout

Sei que o blog anda abandonado... os tempos aqui em Lisboa não são convidativos a bloggar muito :D
Infelizmente meu tempo aqui está chegando ao fim. Já não tenho mais aulas.

Hoje resolvi fazer uma limpeza no visual do blog. Espero ter mais alguma novidade em breve.
O antes e o depois:



Optei por usar um modelo com menos cores, alarguei o espaço para as postagens, rearrumei os widgets, renomeei títulos que sugeriam o nome antigo do blog, "LifeAtMyMind". E então, estou no caminho certo?
Gostei de ver "novidades" (que possivelmente já são bem antigas) no Blogger, como possibilidade de criar páginas fixas e mostrar só o início da postagem com um link "ler mais". Também usei o novo editor de modelo e gostei, apesar de visualmente ele ser totalmente diferente da interface padrão do Blogger.

Monday, April 19, 2010

Como encontrar arquivos usando o GNU find e ignorando alguns diretórios

Esta dica foi tirada de um comentário anônimo em http://www.linux.com/archive/feed/49304.
Fica aqui para referência futura...

Algumas vezes queremos usar o GNU find para procurar por arquivos recursivamente. O problema é quando queremos excluir alguns diretórios da busca. O jeito é usar mais de uma condição. Por exemplo:

find / -path '/proc' -prune -o -path '/dev' -prune -o -name foo.txt

Este comando procura por arquivos chamados "foo.txt" na raiz de sistema, ignorando tudo em /proc e /dev. O '-o' é um "ou" e o '-prune' faz com que o find ignore o caminho encontrado.


Original em inglês:
Sometimes you may want to exclude parts of the directory tree. It took me a while to figure out how to do this because it isn't very intuitive.
If you wanted to search for foo.txt but don't want to descend into /proc or /dev you can do this
find / -path '/proc' -prune -o -path '/dev' -prune -o -name foo.txt

The '-o' means 'or', so there in this case there are three conditions, separated by 'or', which will cause find to take action. The first two is when the path is '/proc' or '/dev' the action find will take is to prune them from the search path. The third condition is when the name is foo.txt. In this case find will print, since no other action is specified.

Thursday, January 21, 2010

Sons, muitos sons! Com Python :D

Pois é, tive um dia de domingo agradável, programando!
A turma do Dojo Rio está tocando o projeto opensource Dojotools para reunir ferramentas para facilitar nossas vidas durante as sessões de coding dojo.
Para dar minha pequena contribuição para minha diversão, e prejuízo de meus ouvidos, passei a tarde arrumando o sound_alarm. Este script surgiu de diversas brincadeiras que já havia feito para reproduzir som com Python no Windows e no Ubuntu.
Juntei coisas que eu já tinha, refatorei, produzi algumas "melodias" para perturbar quem se aproxima de mim, e taquei no github.

Ontem testei o script no Mac e não funciona. Pelo menos aqui no Macbook Pro não tem /dev/audio, e não descobri como tocar sons em diferentes frequências como consigo no Linux e Windows.

Eis que se alguém tiver uma solução pro Mac OSX ela é apreciada :D