Sobre macaca, macaca-de-auditório, macacal, macacão, macacar, macacarecuia, macacaria, macaco, macacoa*, macaco-adufeiro, macaco-aranha, macaco-barrigudo, macaco-cabeludo, macaco-da-meia-noite, macaco-da-noite macaco-de-bando, macaco-de-cheiro, macaco-inglês, macaco-japonês, macaco-narigudo, macaco-patrona, macaco-prego, macaco-prego-do-peito-amarelo e TI.

sábado, fevereiro 02, 2013

A venda de ingressos para o Mineirão e o despreparo técnico das empresas envolvidas



Motivado pela despreparo e desrespeito ao torcedor durante a venda de ingressos para o clássico Atlético x Cruzeiro, do qual eu também fui vítima, resolvi ressuscitar o blog e dar meus dois 2 cents sobre o assunto.

São dois assuntos chave que tento esclarecer aqui de forma mais didática possível: 1 permitir o acesso simultâneo sem necessidade de fila virtual , 2 evitar a duplicidade de ingressos.

Na Engenharia de software os requisitos se dividem em dois: funcionais e não funcionais. Os requisitos funcionais são aqueles que detalham o que um sistema deve fazer em termos de objetivos de negócio, por exemplo, o usuário deve poder escolher o assunto durante a compra. Já os requisitos não funcionais definem como o sistema deve ser comportar. Entre os requisitos não funcionais estão usabilidade, disponibilidade, segurança etc. São os requisitos não funcionais que interessam para esse nosso assunto aqui.

Durante o desenho da arquitetura candidata para o software deve-se levantar e estimar qual será o volume de acessos simultâneos e como será o comportamento do usuário durante a utilização do sistema. Não é uma tarefa trivial porque é difícil prever o comportamento humano, mas é possível.  Em casos que a disponibilidade do sistema é um fator crítico, pode-se usar técnicas de avaliação de sistemas computacionais. Essas técnicas consistem em realizar a modelagem matemática do sistema e utilizar distribuições estáticas para mensurar seu comportamento durante carga. O professor Virgílio Almeida (http://homepages.dcc.ufmg.br/~virgilio/site/) daqui da UFMG é uma das referências desse assunto no mundo. Essa etapa do projeto vai te dar a dimensão da infraestrutura e da arquitetura de software necessárias para suportar os requisitos de desempenho.

Primeiro problema: Garantir que tudo mundo tenha acesso ao recurso sem precisar enfileirar as pessoas.

A fila não é uma má solução do ponto de vista computacional. Quando não se tem a infra adequada pode ser a forma mais simples de garantir a disponibilidade de um serviço, mas isso não quer dizer que não existam outras soluções. Uma solução muito comum (e até barata) é criar um cluster computacional. Invés de utilizar um servidor parrudão, utiliza-se milhares de pequenos computadores que realizam o trabalho paralelamente. Com o advento da computação nas nuvens, ficou mais fácil criar um cluster de baixo custo que pode crescer sobre demanda utilizando infraestrutura de terceiros. Os mais comuns são a AWS da Amazon e o Rackspace. Eu os utilizo em meus projetos com bastante sucesso.

Uma vez que você tem diversos servidores trabalhando em paralelo é necessário disponibilizar um cara que vai controlar e distribuir a carga entre os servidores. Normalmente utiliza-se load balances (balanceadores de carga). O LB mantém um pequeno número de usuários em uma dessas maquininhas. Para isso existe o conceito de afinidade, que normalmente é feito por IP ou cookie. Isso significa que o load balance redireciona X usuários para um servidor Y e todas as requisições X serão para Y. Ou seja, a carga fica balanceado. Isso por si só já é uma arquitetura suficiente para manter a disponibilidade. Para mais usuários, adiciona-se mais nós ao cluster.

Segundo problema: Garantir atomicidade das transações
O que queremos aqui e evitar a duplicidade. Temos dois problemas:  a transação que vai realizar a mudança no estado do sistema (confirmar sua compra, por exemplo) deve ser atómica. Ou seja, se ela começa, ou ela é completada totalmente ou ela é abortada. O tal commit/rollback. Um exemplo clássico é transferência entre contas correntes. Se  acontecer um problema no meio do caminho, o sistema do banco deve garantir que o dinheiro que saiu volte para a conta de destino. O segundo problema é garantir o acesso sincronizado na região crítica do sistema. A região critica é uma área do sistema que não pode ser modificada por mais de uma transações (na verdade thread) ao mesmo tempo. Existem diversas técnicas para proteger o acesso a regiões críticas. A mais simples de todas (que é ensinada em qualquer curso de computação) é a criação de semáforos. Enquanto alguém está usando a região crítica, todos os outros ficam esperando para entrar.

Devemos considerar que por se tratar de um sistema distribuído o controle de transação é mais complexo que num sistema comum, mas existem diversas soluções para isso.

Espero ter dado minha pequena contribuição sobre o assunto, as soluções que citei acima são apenas algumas das possibilidades. Resumindo o que eu penso: Infelizmente a equipe de TI que cuidou desse caso não estava preparada para tal. Aproveito para deixar dois papers que respaldam minhas considerações:




Um Abraço

sábado, agosto 28, 2010

Not yet


This is a test.

sexta-feira, julho 17, 2009

TraceMonkey: Tutorial on Trace Compilation

We are creating a Tutorial on Trace Compilation.

Marcadores:

segunda-feira, abril 27, 2009

Google Summer of Code 2009

I had a project accepted for Google Summer of Code 2009. I will work with Mozilla TraceMonkey trying to improve its register allocator.

“ TraceMonkey adds native‐code compilation to Mozilla’s JavaScript engine (known as “SpiderMonkey”). It is based on a technique developed at UC Irvine called “trace trees”, and building on code and ideas shared with the Tamarin Tracing project. The net result is a massive speed increase both in the browser chrome and Web‐page content. ”

This project has two mains challenges: To increase execution speed of compiled JavaScript by avoiding spilling and to produce better native code. Click here to view the project proposal.

As Google Summer of Code requirements, everyone has to use a blog to communicate with his or her mentor and other people involved. Instead of creating other blog I opted for using this old plain space. Speaking about mentors, Dave Mandelin will be my mentor (check out his blog to know more about TraceMonkey)

Fernando Pereira is another important piece of this project. Besides being my co-adviser here at LLP, he developed the Register Allocation by Puzzle Solving technique that I will code in TraceMonkey.

So, Join me this winter for coding!

Marcadores:

quinta-feira, abril 16, 2009

Besteirinha I

Como trocar o conteúdo de duas variáveis sem usar um temporário?

Assim:

a = a + b
b = a - b
a = a - b

Ou Assim:

a = a xor b
b = a xor b
a = a xor b

Apesar de divertido, usar uma variável temporária é bem mais barato.

segunda-feira, março 02, 2009

Script de Backup

Algumas pessoas me cobraram o grande período sem posts. Pois bem. Prometo postar com mais freqüência.

Para começar, um script que mostra todo o poder do applescript.

A idéia era fazer um script que compactasse uma pasta e enviasse o arquivo compactado para minha conta do gmail. Afinal existe lugar melhor para um backup do que na nuvem? Dei uma pesquisada na internet, achei algumas coisas interessantes juntei tudo e saiu o que você pode ver abaixo.

O que o script faz?

Verifica se a maquina tem conectividade com a internet, compacta uma pasta predefinida e envia o arquivo compactado para o gmail.

O Script


set pingresult to do shell script "ping -c 1 google.com;echo -n"
set paras to number of paragraphs in pingresult

if paras < 5 then display alert "Script de Backup"
message "Sem internet não tem backup!"
else set question to display dialog ¬
"Hora do Backup!" with title ¬
"Script de Backup"
buttons {"Agora não. Tô com pressa!", "Claro!"}
default button 2
set answer to button returned of question
if answer is equal to "Claro!" then
tell application "Mail" to activate
do shell script
"cd ~;mkdir transfer ;
tar -czf transfer/`date +%Y-%m-%d`.tgz #pasta-origem/*"
set p to do shell script "ls -t1 ~/transfer |head -1"
set target_file to "/Users/#seu-usuario/transfer/" & p

tell application "Mail"
set newMessage to make new outgoing message with properties ¬
{subject:"[BKP] " & target_file, content:"Backup automatico"}

tell newMessage
make new to recipient at beginning of to recipients with properties ¬
{address:"#seu-login@gmail.com"}

tell content
make new attachment with properties {file name:target_file} ¬
at after the last word of the last paragraph
end tell
end tell
send newMessage
display alert "Script de Backup" message
"Arquivo foi colocado na caixa de saida"
end tell

do shell script "cd ~;rm -rf transfer"
end if
end if




O que você precisa fazer para ele rodar?

1 - Cole ele no script editor.
2 - Substitua as tags começadas por # pelas suas informações.
3 - Se você não é usuário do mail.app (meu caso) configure sua conta do gmail desmarcando a opção de checar e-mail automaticamente. Também marque para limpar e-mails enviados quando sair.


Esse script é uma adaptação de coisas achadas aqui e aqui.

Até a próxima!

terça-feira, setembro 16, 2008

Evoluir sim, Quebrar jamais

Evoluir sim, Quebrar jamais

Java ou .net? Quem estava no mercado na virada do século deve ter vivido está situação. Muitas empresas montaram grupos para analisar qual caminho seguir. Mesmo as empresas que tinha seus produtos baseados em tecnologia Microsoft fizeram essa pergunta. Java ou .net? Em muitos casos, o que levou esse questionamento não eram questões estritamente funcionais. O fato é que todos estavam cansados de ter que adaptar seus códigos toda vez que uma nova release era lançada.

Backward Compatibility, ou simplesmente compatibilidade reversa é o termo utilizado para designar alguma coisa que sofreu ou sofrerá evoluções sem deixar de ser compatível com seu legado. Java prometia backward compatibility e quem comprou se deu bem porque Java cumpriu o que prometera. Até as clássicas besteiras feitas nas constantes da awt.color onde a própria Sun violou o Java Code Convetions nos idos do JDK1.2 continuam lá. Por que? Oara não quebrar a compatibilidade dos programas que foram escritos naquela época.

Quem migrou para .net nas primeiras versões sabe que seus códigos não são compatíveis com a versão atual. Até aí tudo bem, A Microsoft sempre foi assim e nunca escondeu que não iria mudar. Quem tem código em ASP 3.0 que se prepare, dizem que o próximo IIS não os rodará mais.

O que me deixa chateado é o Rails sofrer desse mal. Eu sei que Rails não é uma plataforma (alguns acham equivocadamente o contrário) e que comparar Rails com Java ou .net é no mínimo injusto da minha parte. Sei também que evoluir é preciso, mas não concordo com a quebra de compatibilidade introduzida a partir da versão 2.0.

Tudo bem que as alterações nem foram tão grandes assim, mas e as centenas de tutoriais que foram escritos que deixaram de funcionar de um dia para o outro? Isso dificulta a curva de aprendizado de novos programadores. Tenho experimentado isso. Várias pessoas que querem iniciar com Rails perdidas porque aquilo que estão tentando fazer simplesmente não funciona. Outro ponto, até mais importante que esse: Confiança quebrada. O que será que vai acontecer com minha base de código quando a 3.0 vier? Vai tudo para o espaço?

Não se engane. Adoro novidades. Por isso mesmo quero utilizar meu tempo com coisas novas e não para ficar portando código que funcionava bem e que simplesmente deixou de funcionar.

ps: Achei que o título do post lembrava o nome desse filme tosco.

domingo, agosto 10, 2008

Limplex: O Verdadeiro MacBook Killer

Toda vez que surge um produto de vanguarda a indústria fica alvorecida esperado um novo cara que vai enterrar aquele que é a atual referência. O exemplo mais clássico é o do iPhone e seus iPhone killers. Pois bem, eu descobri o verdadeiro MacBook Killer, no sentido mais amplo do Killer: Limplex.

Limplex é um produto nacional para realizar limpeza de computadores. Ouvir falar bem dele em um blog e resolvi desencardir meu notebook branco. O preço era convidativo, pouco mais de 8 reais numa loja virtual.

Desliguei o notebook e segui as instruções da embalagem:

MODO DE USAR: Aplica-se uma pequena quantidade de produto em movimentos circulares, com a esponja que se encontra dentro do pote, removendo-o em seguida com pano. Use sempre um pano branco, para que não haja risco do pano soltar tinta.

Humm. Parece legal. Na embalagem a única advertência era essa:

ATENÇÃO:Não aplicar sobre superfícies envernizadas e enceradas. Conserve fora do alcance de crianças e dos animais domésticos, em local fresco e sombreado. Em contado com os olhos, lavá-los com água abundante. Se ingerido, procure imediatamente um médico.

Fiz a limpeza externa do case ele ficou zero. Perfeito. Será que posso limpar o teclado também? A foto na embalagem é de uma mão limpando um teclado. Então deve poder! Também não tem nenhuma restrição no modo de uso e o produto traz em fontes grandes “Limpeza a seco”. Vamos em frente. O teclado ficou brilhando.

Hora de ligar. Dedo no Power. Nada. Cinco segundos no Power Nada. Botãozinho da bateria para conferir a carga. Três leds piscando. Tentei de tudo. Segui todos os procedimentos do suporte da Apple e nada. Achei o verdadeiro MacBook killer. Basta uma aplicação para seu notebook ir para o saco.

Fica a dica: Muito cuidado na hora de limpar seu notebook. Mais cuidado ainda se seu notebook for um frágil MacBook. Mais vale um note encardido na mão do que um brilhando no armário.

sábado, julho 05, 2008

StarLogo 1.0

Quando criança, ficava digitando umas listagens de BASIC no MSX que vinha no seu manual. Não sabia o que cada comando fazia, apenas digitava para ver se acontecia alguma coisa. E nunca acontecia. Demorei uns dois anos para descobrir que depois de digitar eu tinha que dar o comando "Run" que era acionado pela tecla F4. A minha maior graça era quando a listagem digitada desenhava alguma coisa na tela, mas eram muitas horas de frustração para um quadradinho monocromático na tela.

Aos 13 por ironia, a primeira linguagem de programação que eu quase aprendi foi Python. Não foi por escolha, sem querer achei um tutorial na internet e a instalação foi fácil. Digo por ironia porque isso foi em 96 e o Visual Basic e o Delphi reinavam eu fui logo me envolver como uma linguagem dinâmica. Claro que eu não sabia o que era uma linguagem dinâmica.

Fui fazer o segundo grau técnico em informática e nessa época os tutoriais de Python já tinham acabado e eu acabei aprendendo VB. O que de certa forma foi legal porque finalmente eu entendi aqueles comandinhos do BASIC.

No primeiro ano, a disciplina que eu mais gostava era a de programação e a linguagem utilizada era LOGO. A primeira coisa que pensei quando eu vi aqueles comandos para mexer a tartaruga foi que isso era coisa para criança (e era mesmo). Tupetudo como sempre, perguntei para o professora porque é a linguagem que agente ia usar era LOGO? Estava doido para aprender C e eu ia ficar um ano fazendo uma tartaruga andar?
Pacientemente a professora me explicou que apesar da tartaruga, LOGO tinha todos os conceitos que ela gostaria de ensinar nessa disciplina cujo objetivo era apresentar uma linguagem procedural.

Aceitei a tartaruga e me divertir muito com ela. Hoje recebi um e-mail avisando que o StarLogo atingiu a maioridade. Saiu a versão 1.0. O StarLogo é uma evolução dos conceitos do LOGO para um ambiente tridimensional. Você vai ligando os blocos que se comunicam via mensagens (isso te lembra alguma coisa?) para fazer o tartaruga e um monte de outros personagem ganharem vida em um universo 3D. Essa nova versão traz um monte de novidade. Se na época do BASIC eu tivesse o LOGO talvez teria sido uma criança mais feliz! Volte a ser criança. Baixe o StarLogo e divirta-se.


quarta-feira, abril 23, 2008

FISL 9.0

Juro que estava com preguiça de escrever, achei que ninguém estava interessado, mas como me cobraram (Jesus e Jânio) segue o que eu achei do FISL 9.0:

Ano passado o evento foi da FIRGS que fica um pouco afastado da cidade. Esse ano o evento foi na PUC, bem mais perto. O balcão para retirada da credencial foi dividido em filas pela inicial do nome. A fila de J-M estava enorme, Depois de quase uma hora na fila o sistema deu pau e a organização liberou a entrada. A tarde voltei para pegar a credencial e depois de mais meia hora de fila descubro que eu devia te pegado a fila dos R's. Mesmo de manhã não tinha fila nenhuma para os R's. Isso é que dar ter 3 nomes. Tem hora que até eu mesmo confundo.

Exceto por esse pequeno transtorno e pela inconstância da rede wifi, o resto foi muito bom. O clima é o mais legal da feira. Na área que fica concentrada os grupos de usuários, o pessoal fica esparramado pelo chão. Cada um com seu note. As palestras em geral foram boas. Assisti 18. Segue em ordem de preferência com um breve comentário sobre elas:

18 - Django para desenvolvimento Web - Christiano Anderson
Essa nem consegui acabar de ver, vários problemas técnicos aconteceram e o palestrante não consegui dar seu recado.

17 -Kernel Open Session - Theodore Ts'o
Esta foi uma sessão aberta de perguntas sobre o Kernel. Em alguns momentos eu boiei completamente.

16 - Enabling Real-Time Rich Internet Application with Apache Derby and Comet - Francois Orsini e Jean Francois Arcand
Essa começou legal, mas quando o segundo palestrante começou a falar tive dificuldades de entender seu inglês com sotaque francês.

15 - Desenvolvimento ágil de software com XP e Scrum - Guilherme Chapiewski
A sala estava lotada o que demonstra o grande interesse no assunto, mas faltou ritmo à apresentação. Tinha expectativa de mais visto que o autor mantém um ótimo blog que recorrentemente trata desse assunto.

14 - JBoss Drools: Mudando as regras do jogo - Fenando Meyer
A palestra foi legal, mas o tempo corrido não permitiu que o exemplo fosse devidamente explicado.

13 - Ganeti - Cluster-based virtualization management software - Micheal Hanselmann
O Ganeti parece ser bacana e ajudar bastante no gerenciamento, porém o palestrante só recomendou seu uso para aplicações mais leves.

12 - Firefox in Brazil and Beyond - Crris Hofmann
Foi legal ver o crescimento do Firefox. Apesar de não ser uma palestra técnica foi bem interessante.

11 - Open solutions for distributed systems development - Rodrigo Damazio
O cara mostrou alternativas open-source para os já famosos GFS e Bigtable. Legal!

10 - Memory Leaks in Java Applications - Different Tools for Different Types of Leaks - Gregg Sporar
Muito pertinente o assunto. Foram mostradas várias ferramentas que ajudam na identificação de memory leaks em Java.

9 - Kernel
- How to write a device driver - Kristen Accardi
A palestrante demonstrou a criação de um driver para controlar uns leds ligados na paralela. Até que não é muito complicado não!

8 - OpenOffice.org programmabillity - at a glance - Jurgen Schmidt
Eu já tinha sofrido uma vez que programei uma integração com o OpenOffice e a apresentação serviu para esclarecer algumas dúvidas que tinham ficado deste então.

7 - Sapos Piramidais, episodio XII: "Pontes" de PI. - Pedro Rezende
Juro que só fui nessa palestra porque achei o nome muito curioso. Valeu a pena. O palestrante é um professor antenado e fez um resumo dos movimentos políticos que aconteceram no mundo do software livre no último ano. Bem bacana.

6 - Modern Graphics in Qt - Andreas Hanssen
Apesar do foco ser o Qt o cara deu várias dicas importantes sobre a construção de interfaces gráficas. Os exemplos que ele mostrou em Qt eram espetaculares.

5 - Internet sob ataque - Sérgio Amadeu
Até concordo que o Sérgio Amadeu seja xiita, mas devo confessar que gosto das coisas que ele fala. A palestra estava lotada e acho que o tema que ele abordou (Empresas de infra-estrutura interferindo na camada de aplicação) é extremamente relevante.

4 - The Smalltalk Seaside Web Framework - Randal Schawartz
Fantástico. Foram apenas 35 minutos, mas tempo suficiente para já ter me feito instalar o Squeak.

3 - O Fantasma do Espectro - Sérgio Amadeu e Gustavo Gindre entre outros.
Fui um debate legal sobre o modelo de concessão de espectro. Gostei da idéia do Open Espectro.

2 - Large Scale PHP - Rasmus Ledorf
Apesar do tema ser “large scale” o cara falou muito de segurança de aplicações Web. Gostei muito dessa palestra.

1 - Fun and software livre! - Return of the Jedi! - Jon "maddog" Hall
O papai Noel simplesmente detonou. Já tinha o assistido outras duas oportunidade, mas nenhuma chegou perto dessa. Fui divertida e empolgante, o pessoal presente entrou em êxtase no auditório. “Parecia” um culto religioso.

Eu continuo sem entender...
Foi a maior concentração de macs que já vi. Você pode pensar: “Tudo bem, o macbook pro é o melhor hardware para se rodar Windows deve ser também o melhor para rodar o Linux”. Fiz questão de cada vez que eu via um mac dar uma olhadinha no canto superior esquerdo da tela. A maça sempre estava lá. Algumas azuis e na maioria das vezes pretas (geeks são early adopters!), não vi nenhum mac rodando outra coisa senão o OS X. Nada contra o OS X, que aliais é o meu OS preferido (depois do MCP), o fato e que eu continuo sem entender porque Apple pode?

O FISL 10.0 promete. Parece que vai ser no final de Junho. Pode ir se preparar para o frio.

Já ia me esquecendo das fotos.

quarta-feira, abril 09, 2008

MiniServer - Baixe e envie arquivos do seu celular para o PC via WiFi

Pretendo começar a falar mais sobre os aplicativos bacanas que utilizo no meu E61. A maioria deles também deve funcionar nos outros celulares Nokia com Symbian S60 3rd Edition.

O primeiro deles é uma grande quebra-galho, trata-se do MiniServer, um pequeno executável que sobe um servidor HTTP no seu PC (Windows) e te permite enviar e receber arquivos do celular via WiFi. Sua utilização é bem simples, basta executar o mineserver.exe no PC e escolher qual a pasta que será compartilhada com o telefone. No celular aponte seu browser para o endereço IP do PC e você terá uma interface para baixar e enviar seus arquivos. O programa é pequeno é pode ser baixado aqui.

Procurei um aplicativo semelhante para o Mac e não encontrei. Como a idéia dele é muito simples, não gastei nem 20 minutos para implementar um semelhante em Ruby on Rails. O único inconveniente é que para roda-lo é necessário ter o Ruby e o Rails instalado, mas para usuários do Leopard isso nem é tanto problema já que eles já vem instalados. Se alguém se interessar e só pedir que eu mando.

terça-feira, fevereiro 26, 2008

GPS - Quem tem boca vai a Roma

Em uma viagem recente aluguei junto com o carro um GPS modelo Airis T92A.

O objetivo de ter o GPS em mãos era claro, eu gostaria de ir em lugares que eu não tinha a mínima idéia de onde eram e inocentemente pensei que bastava o GPS. Não bastou.

Contextualizando

A cidade era Salvador, a escolha da locadora Hertz se deu exclusivamente porque era a única que tinha GPS com mapas da cidade. Ao fazer a reserva escolhi a loja mais próxima do hotel que estávamos. A Hertz tem três lojas em Salvador, uma no aeroporto, e duas na mesma avenida que se chama Octavio Mangabeira, uma numa ponta e outra na outra. A Hertz não tem opção de incluir o GPS na reserva feita na internet sendo necessário posterior contato por telefone para associar o GPS a reserva. Assim o fiz.

Quando peguei o táxi no hotel em direção a locadora o taxista disse a avenida era bastante extensa e pediu pelo radio o telefone da loja. Ele mesmo ligou, confirmou pelo telefone o endereço e o numero da loja. A confirmação apontou para uma loja que ficava próxima ao aeroporto e bem distante do hotel. Fiquei desconfiado já que eu tinha olhado no mapa e escolhido a loja que ficava mais perto do hotel e eu mesmo liguei para a loja confirmando o número:

- O numero daí é 3370?
- Sim senhor, é sim.
- Mas fica perto do Aeroporto?
- Sim senhor, fica sim.
- Ok. Obrigado

Segue então. 40 minutos depois, chegamos a loja:

- Bom dia, eu fiz uma reserva...
- Senhor, não existe nenhuma reserva em seu nome.
- Como
assim não?
- A reservado do senhor foi para outra loja nessa mesma rua.
- O que? Mas eu liguei confirmando, o numero aqui não é 3370?
- Não, aqui é 40.
- Ahhhhh?
- ....(Podem imaginar a discussão que se sucedeu)
- Mas eu não posso pegar o carro aqui, não? Esta no caminho da onde estou indo (Litoral norte)
- Sim, mas não temos GPS nessa loja, senhor. Você pode pegar o carro e ir até a loja que o senhor fez a reserva e retirar o GPS.
- Mas como eu vou chegar na outra loja se o GPS era justamente para me dar os caminhos?
- Não sei não senhor.


Pegamos outro táxi e seguimos 30 minutos até a outra loja na mesma rua.

- Bom dia, eu fiz uma reserva...
- Sim senhor, seu carro está pronto.
- Ahhh que ótimo.
5 minutos depois...
-Cadê o GPS?
- Que GPS?
- O que eu reservei.
- Não consta nenhuma reserva de GPS não senhor. GPS só na loja do Aeroporto.
- O que?????

Contei toda estória para a mulher que foi bastante compreensiva e reconheceu o erro e me ofereceu um upgrade para compensar o problema. Aceitei de bom agrado, claro, mas não resolvia, como eu ia chegar ao aeroporto de carro, numa cidade desconhecida e que tem um dos trânsitos mais pervertidos que já tinha visto? Quem tem boca vai a Roma e também ao aeroporto. Assim fomos.

Pegamos o bendito GPS e pensamos: Agora e só ir para a praia. Não foi.
Setei o endereço de onde eu queria ir. Já sabia que o caminho era pela linha verde que passa pertinho do aeroporto. Logo na saída do aeroporto o GPS me manda virar a direita, obedeci e cai dentro de um estacionamento de uma empresa de táxi, em seguida me mandou pegar a direita de novo. Era uma viela de terra que mal passava uma carroça. O sinal amarelo acendeu e eu voltei para a rua que eu tinha saído porque tinha visto placas indicando a estrada. Peguei a estrada e ele começou a me mandar sair da estrada. Que diabos! Pensei. Eu sabia que meu primeiro destino era 50km distante por essa estrada. Por um lapso de subserviência a maquina resolvi atender o que ele queria.

- Deve ser um atalho. Justifiquei.

- Humm. Respondeu secamente minha namorada que já estava irritada por perder parte da manhã de sol por causa do GPS.

-Vire a esquerda em 800 metros.

-Vire a direita em 500 metros.

O GPS me mandou para uma quebrada que não da para descrever e nesse momento aprendi a primeira lição:

Primeira lição: Quem manda é você. Se o GPS te mandar entrar num beco não entre. O bobo aqui entrou.

Desliguei o maldito. Procurei um lugar seguro e perguntei para um taxista o caminho e fui embora até o meu destino, sem o GPS fácil, fácil.

- Como vamos voltar? Você sabe chegar no hotel? Ela perguntou.

- Hotel. Humm... Hotel, sei não.

- Vamos tentar o GPS de novo quem sabe agora ele não funciona.

E ele não funcionou. Não consegui setar o endereço do hotel e então coloquei um ponto arbitrário no bairro que ficava o hotel. Se conseguíssemos chegar lá era só perguntar de novo. Quase anoitecendo pegamos a estrada e quando chegamos dentro da cidade o sujeito insistia em me mandar sair da avenida em que eu estava, mas dessa vez depois de ter aprendido a 1ª lição não sai. A cidade é bem sinalizada e resolvi seguir as placas e chegamos no hotel numa boa.

Claro que como um bom geek não me daria por vencido.

-Porque você está tirando o GPS do carro?

-Vou levar ele para o quarto.

-O que? Você não desistiu ainda não? Não acredito.

Enquanto ela tomava banho, eu ainda com os pés cheio de areia peguei o manual do bichinho. Ele tava todo configurado errado, o sujeito que estava anteriormente com ele tinha configurado para priorizar o tempo de calculo de rota invés da precisão. Além disso, quando eu setei o endereço eu não especifiquei a cidade, nesse caso ele calcula o mais próximo do ponto atual, por infeliz coincidência as duas cidades tinham praias com o mesmo nome.

Segunda lição: Leia o manual antes de usar.

No resto do final de semana o GPS foi muito útil, fui aprendendo a lidar com ele aos poucos, ignorando as contramãos que ele me mandava e sempre acompanhando as placas para ver se estava no rumo certo. Até ela se surpreendeu:

- É. Até que ele acertou dessa vez.

sexta-feira, janeiro 04, 2008

BH Coding Dojo

Se você não é um code monkey e mora nas redondezas de Belo Horizonte preste a atenção:


Dia 19 de Janeiro acontece à primeira reunião do BH Coding Dojo. A idéia é reunir gente que gosta de programar independente da linguagem. Na primeira sessão acontecerá um PreparedKata onde um alguém levará uma solução baseada em TDD ou BDD para ser discutida com a galera. Nas próximas reuniões a idéia e que role um RandoriKata com participação de todos.

Quando e Onde

Dia 19-Jan-2008 às 10:00, na Solin, Av. Raja Gabáglia, 3348.


Exibir mapa ampliado

A entrada é franca, mas o espaço é limitado por isso cadastre-se na lista DOJO-BH para garantir seu lugar.

quinta-feira, dezembro 13, 2007

Post Atrasado: Minas on Rails

Aconteceu o primeiro Minas on Rails, excelente iniciativa do pessoal que com muita garra e pouco dinheiro conseguiram organizar um bom evento em tão curto espaço de tempo. Eu cheguei tarde e perdi todas as palestras da manhã. Queria muito ter assistido a palestra do TaQ e pelo que me falaram eu não teria me arrependido.

Gostei de mais de ver o pessoal da PUC lá: Jânio, Gustavo, Jesus, Davison, Arruda, Pablo e Breno. Até me sinto de certa forma responsável por ter martelado pouco RoR na cabeça desse povo nos últimos dois anos. Vejam um dado inútil: Se o publico total que compareceu ao evento foi de 100 pessoas, então éramos 8% do total, o que é bem expressivo e mostra o interesse do pessoal na plataforma.

Gostei de mais de conhecer pessoalmente o TaQ e o Ronaldo Ferraz. Os caras são minhas referências brasileiras no assunto e além do mais os sujeitos são muito bacanas. Diria até que o papo com os caras estava tão bom que a corrida até confins durou metade do usual.

Melhor do que tudo isso foi mesmo poder encontrar com meu POJO amigo Diogenes. Já tinha uma cara que agente não se encontrava pessoalmente e como sempre conversar com esse sujeito é muito bom!

Das palestras que vi a que mais gostei foi a do Vinicius Telles sobre um case que envolve RoR e XP. O ritmo da palestra foi perfeito e o cara manda muito bem. Ele deu várias dicas de coisas muito simples que são muito bem vindas mesmo para que não segue todas as regras do XP.

Momento surreal do dia: Ao deixarmos o TaQ no embarque em Confis, uma menina(que pelo jeito trabalha lá) pediu carona até BH. Não neguei, afinal voltávamos eu, o Diógenes e o Ronaldo e sobrava um vaga no carro. Não me importo de dar carona, principalmente quando não estou sozinho já que me sinto mais seguro. Na volta embarcamos num papo ultra geek percorrendo uma dúzia de linguagens de programação diferentes, de Smalltalk a IO, passando por Haskell e Prolog. Ao descer do carro ela fez uma confissão, disse que era a primeira vez que ela voltava de carona de Confis sem dizer uma única palavra. Duas coisas pipocaram na minha cabeça depois disso: 1º Como deve ser para uma pessoa normal passar 50 minutos dentro de um carro escutando aquele papo ultra nerd? 2º Será que a mocinha estava acostumada a vim recebendo cantadas no seu trajeto diário e se espantou quando foi completamente ignorada?

Que venha o próximo Minas on Rails.

quinta-feira, novembro 15, 2007

Android SDK

O Google liberou está semana o SDK do Android, uma plataforma completa e open source para desenvolvimento de softwares para telefones celulares. Já instalei e comecei a brincar! Algumas coisas já me chamaram atenção positivamente: A facilidade de se criar interfaces gráficas, o renderizador do browser que vem no emulador e a qualidade da documentação que já esta disponível no site do projeto. Neste documento, por exemplo, tem várias dicas para se melhorar a performance dos aplicativos do Android. As dicas são tão boas que algumas delas podem facilmente ser aplicadas em outras plataformas embarcadas e também no desenvolvimento do dia-a-dia.

Siga aqui para os primeiros passos com o Android.

terça-feira, setembro 11, 2007

Emo Killer

Outro dia meu sobrinho de 12 anos me chamou para ver um vídeo que ele tinha feito. Pensei que tivesse gravado alguma coisa com a WebCam. Fiquei surpreso com o que vi. Ele tinha feito uma sobreposição usando o PaintBrush e gravado o áudio com o Voice Recorder. O resultado, como não poderia ser diferente, ficou bastante rudimentar, mas me fez refletir sobre como é imenso o domínio da tecnologia por essa nova geração. A tecnologia que para nós é fim, para eles é naturalmente um meio de expressão.




domingo, setembro 09, 2007

Code Contest Mega Sena: Resultados

Para organizar melhor os códigos que foram feitos para o Code Constest da Mega Sena criei este novo post.

Alguns desses códigos não respeitam a regra da unidade léxica da linha, mas eles são tão criativos que quem se importa? Se vocês se importarem eu tiro.

Uma Linha:

Bernado Rufino fez em Ruby

Array.new(100000){rand(60)+1}.inject(Hash.new(0)){|hash, i| hash if hash[i] += 1}.invert.sort.reverse[0..6].each{|t, n| puts "#{n}repeated #{t} times"}



Walter Cruz fez em Python

x = [item for item in sorted([(k, len(list(g))) for k, g in groupby(sorted([randrange(1,61) for item in xrange(0,100000)]))],key=itemgetter(1),reverse=True)][:6]rint(x)



Diogo Carrion fez em JavaScript

for (var i, array = new Array(), j = 0; j < i =" Math.round(59" j ="=">


Rafael fez duas em C++

int main() { for(int freq[] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60},i = 0; i == 100000 ? printf("%d %d %d %d %d %d\n", freq[59]%100,freq[58]%100, freq[57]%100, freq[56]%100, freq[55]%100,freq[54]%100)*0 : 1;sort(freq, freq+sizeof(freq)/sizeof(int)), i++,freq[rand()%60]+=100); }



int main() {for(vector<> v(60,0),i(0,0); i[0] == 100060 ? printf("%d %d %d %d %d %d\n", v[59]%70, v[58]%70, v[57]%70, v[5 6]%70, v[55]%70, v[54]%70)*0 : 1; v[i[0] <>


Rodrigo Fenrrir fez Python

sorted([ (x.count(k),k) for x in [[ random.randint(1,60) for z in xrange(100000) ]] for k in xrange(1,61) ], reverse=True)[:6]


Rodrigo(deixou comentário) fez em Perl

for (1..100001) { ($_ == 100001) ? print join(" ", (sort { $h{$b} <=> $h{$a} } keys %h)[0..5]) . "\n": $h{int(rand()*60+1)}++ }


Duas Linhas:

Náiron J. C. G fez em JavaScript

for(var i,ra=new Array(),j=0 ; j<10000 i="Math.round(59*Math.random())+1,ra[i]=">


Três Linhas:

ZehOliveira fez em IO

h := Map;
100000 repeat(if(h hasKey(n := Random value(1, 60) round asString), h atPut(n, h at(n)+1), h atPut(n, 1)))
h asList sortBy(block(f, s, f at(1) > s at(1))) slice(0, 6) foreach(k, writeln(k at(0), " --> ", k at(1)))


O Daniel Martins fez em Groovy e em SmallTalk

def hist = [:], v
100000.times{hist[v = 1 + Math.random() * 60 as int] = !hist[v] ? 1 : hist[v] + 1}
println hist.keySet().toList().sort{-hist[it]}[0..5].join(‘,’)


| s |
s := ((OrderedCollection withAll: ((1 to: 100000) collect: [:each | 60 atRandom])) groupBy: [:each | each] having: [:each | true]) asSortedCollection: [:a :b | b size <>

sábado, agosto 25, 2007

Code Contest: Em tempos de Mega Sena Acumulada

Um pequeno desafio:

Escrever em qualquer linguagem de programação um programa que realize 100.000 sorteios de um numero entre 1 e 60 e mostre na tela os 6 mais freqüentes.

Ganha quem fizer o programa com o menor numero de linhas possíveis, lembrando que a linha considerada é a linha da unidade léxica da linguagem, portanto a seguinte linha em Java seria considerada duas: int i =0; sysout(i);

Fiz com 3 linhas em Ruby:

hist = Hash.new(0)
100000.times{|e| hist[1 + rand(60)] += 1}
hist.sort{|a,b| b[1]<=>a[1]}.to_a.slice(0,6).each{|e| puts "#{e[0]} --> #{e[1]}"}


Será possível fazer em menos linhas com Python, Groovy, Haskell ou Prolog? Em Ruby da pra fazer com menos? Citei essas porque acho quase impossível fazer com menos do que isso com Java, C/C++ ou C#, mas se alguém quiser provar o contrario...

Update II

Para ficar mais organizado novas Contribuições estão sendo postadas aqui.

Update

O ZehOliveira do GUJ fez com 3 linhas na interessantísima IO (Valeu Zé!):

h := Map;

100000
repeat(if(h hasKey(n := Random value(1, 60) round asString), h atPut(n, h at(n)+1), h atPut(n, 1)))

h asList sortBy(block(f, s, f at(1) > s at(1))) slice(v, 6) foreach(k, writeln(k at(0), " --> ", k at(1)))

O Daniel Martins também fez com 3 linhas em Groovy e em SmallTalk(Value Daniel!):

def hist = [:], v
100000
.times{hist[v = 1 + Math.random() * 60 as int] = !hist[v] ? 1 : hist[v] + 1}
println hist.keySet().toList().sort{-hist[it]}[0..5].sort().join(‘,’)


| s |
s
:= ((OrderedCollection withAll: ((1 to: 100000) collect: [:each | 60 atRandom])) groupBy: [:each | each] having: [:each | true]) asSortedCollection: [:a :b | b size < style="">].
1 to: 6 do: [:each | Transcript show: ((s at: each) at: 1); cr]


E os grandes vencedores até agora são o
Walter Cruz e o Bernado Rufino Perder eles não perdem, só se inventarem a meia linha. O caras fizeram em uma inacreditável linha:

Versão em Python do Walter Cruz:

x = [item for item in sorted([(k, len(list(g))) for k, g in groupby(sorted([randrange(1,61) for item in xrange(0,100000)]))],key=itemgetter(1),reverse=True)][:6]
print(x)

Versão em Ruby do Bernado Rufino:
Array.new(100000){rand(60)+1}.inject(Hash.new(0))
{|hash, i| hash if hash[i] += 1}.invert.sort.reverse[0..6].each{|t, n| puts "#{n}
repeated #{t} times"}
Por problemas no layout( que ja passou da hora de ser revisto) tive que quebrar a linha, mas acreditem é uma só;

segunda-feira, agosto 13, 2007

IIS: Creating a cookie affinity load balancer with Apache mod_proxy and IIS


by Rodrigo Sol and Sérgio Junqueira


Apache’s mod_proxy and mod_proxy_balancer are a good choice to create a load balancer for your web application. When we needed to configure it for our IIS ASP 3.0 application we did not find any document to help us. There are many tutorials that explain how to accomplish it using JBoss or Tomcat as back end servers, but not for Microsoft IIS.

In our architecture we use one server running Apache as load balancer and three back end servers running the IIS application.

Remember: Using only one server for load balancing means that you have a single point of failure in your system. Another Apache server will be added soon to avoid this problem.

Configuration for the Apache Load Balancer Server:

1 – Download Apache 2.3

2 – Turn on the following modules in httpd.conf:

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so

LoadModule proxy_http_module modules/mod_proxy_http.so

LoadModule proxy_ftp_module modules/mod_proxy_ftp.so


3 – Configure the load balancer in httpd.conf:

Order deny,allow
Allow from all

ProxyPreserveHost On
ProxyPass / balancer://mycluster/ lbmethod=byrequests stickysession=BALANCEID nofailover=ON
ProxyPassReverse / balancer://mycluster/

BalancerMember http://your-server-node1/ route=node1
BalancerMember http://your-server-node2/ route=node2

4 – Save httpd.conf and start Apache. Tip: Enable debug log mode to see relevant log events about mod_porxy_balancer.

Configuration for each IIS Application node:

1 – Open IIS Administration Console

2 – Open your website or virtual directory properties

3 – Choose HTTP Header tab

4 – Click into ADD button

5 – Type “Set-Cookie” in the Custom Header Name.

6 – Type “BALANCEID=mycluster.node1; path=/;” in the Custom Header Value

7 – Click OK. Repeat these steps for each node in your cluster. Don’t forget to change the custom header value to the corresponding node id. For node2 use “mycluster.node2”.

There is an important undocumented point. In order put cookie affinity to work it is necessary to use a dot before the node id suffix in the cookie value. If you try to create the cookie inside the ASP application using the Response.Cookie method, URLEncode will be automatically called. This will change all dots in the cookie value into the “%2E” string and will cause cookie affinity to fail. This problem does not happen in ASP.net.

sexta-feira, julho 06, 2007

Don't be Evil

Quando uma empresa decide a plataforma que seu sistema vai rodar nem de longe ela imagina o impacto que isso pode ter na vida de um simples usuário.

Faço um curso de inglês on-line na Global English, o Internet Explorer é pre-requisito para o site, isso por si só já é uma coisa chata, mas nada que o IE Tab para o Firefox não resolva.

O problema de verdade começou depois que misteriosamente o IE parou de executar audio no formato ASF, sem isso eu não consigo usar o site. Pra resolver tentei de tudo: Upgrade no Windows Media Player, instalação de codecs, remoção de codecs.

Nada deu certo. Cheguei a conclusão que pra funcionar só mesmo formatando.

Olha só, meu PC ta redondinho e eu vou ter que formata-lo só por causa de um maldito curso de inglês que usa ASF. E isso já tem quase uns dois meses. No final de cada mês ele me mandam um e-mail falando que todo progresso que fizer nessa semana será incluído no relatório mensal de desempenho que vai para o meu gerente. Como assim? Vocês não me deixam entrar!

Alguns dias atrás me lembrei que existia uma versão descontinuada do IE pro OS X e vi uma luz no fim do túnel. Pura ilusão (veja mensagem na imagem abaixo).











Não seja mal GlobalEnglish.