Wednesday, June 29, 2011

Queremos Trending Topics em Portugal #TTinPortugal

Os Trending Topics ou TTs são uma lista em tempo real dos nomes mais postados no Twitter pelo mundo todo. Valem para essa lista as hashtags (#) e nomes próprios.
O recurso de Trending Topics usa por padrão a abrangência total (worldwide), mas também é possível filtrar por países como Argentina, Australia, Brasil, Canada, Estados Unidos, Italia, Alemanha, Espanha, Reino Unido e outros, ou cidades como Boston, Londres, Los Angeles, Miami, Nova York, Rio de Janeiro, São Paulo e outras.
No entanto Portugal está excluído desta lista. Não é possível filtrar os TT por Portugal, apesar de a comunidade de Portugal no twitter já ter uma dimensão bastante apreciável.
Assim foi lançada uma iniciativa que visa obter visibilidade para a hashtag #TTinPortugal com intenção de efectuar pressão junto do twitter:
Se achas que Portugal deve estar nos filtros dos Trending Topics, associa-te à iniciativa.


Alerta: evita fazer SPAM. É mais efectiva uma utilização racional que abranja muitos utilizadores do que uma quantidade enorme de tweets por um único utilizador.


Já se obtiveram alguns resultados, para além de users incomodados com tanto tweets e alguns utilizadores que ficaram impossibilitados de tweetar.

É discutível o efeito que uma iniciativa destas possa ter. Primeiro é bastante difícil fazer com que a hastag #TTinPortugal chegue aos TT worldwide. Segundo, mesmo que chegue nada nos indica que o Twitter verá e fará alguma coisa.

Monday, June 13, 2011

Conduzir um kart para iniciantes

Registo aqui um conjunto de dicas para ajudar quem se quiser iniciar no karting para efeitos recreativos. Para competição é outra história :)
Assume-se aqui que se usa os karts de aluguer, normalmente 270cc 4T com variador (tipo as scooters) com cerca de 6cv, os mais indicados para iniciantes. Dependendo da pista e da afinação atingem cerca de 80km/h. Estão disponíveis na maior parte dos kartódromos por cerca de 1€/min.

Vestuário:
- Não tendo um fato de macaco usar jeans justos (mas não apertados) e uma camisola de manga comprida (devido às queimadelas dos cotovelos no motor). Não usar roupa nova pois o mais certo é ficar suja de óleo. Nada de cordões, fitas, etc que possam ficar presos.
- Ténis macios sem cordões largos (para não ficarem presos).
- Se tiver cabelo comprido prenda-o.
- Luvas, mesmo as de BTT sem dedos são melhor que não usar luvas.
- Óculos (por ex. escuros) velhos, a viseira dos capacetes dos kartódromos costuma estar muito riscada e a areia e borracha que salta da pista faz doer os olhos.

Quando:
- Escolher um dia em que não esteja muito calor. Chuva e pista molhada/húmida são completamente de evitar. Condução com pista molhada é outra história :)
- Escolher uma altura em que estejam poucos karts em pista, principalmente os de aluguer. É mais seguro andar em pista com os karts de competição que normalmente sabem-se comportar em pista.

Preparação:
- Dentro das boxes manter-se sempre atento ao lado da entrada. Levar com um kart nos tornozelos não tem piada.
- Ouvir com atenção os conselhos que o responsável no kartódromo lhe dê (o que pode e não pode fazer, regras especiais, etc).
- Hidrate-se antes e depois de andar de kart.
- Familiarize-se com o kartódromo: curvas, entrada/saída das boxes, etc.

Algumas regras gerais:
- A pista só tem um sentido. NUNCA andar no sentido errado. No caso de fazer um pião e ficar em sentido contrário deve primeiro verificar se pode fazer um U em segurança e só depois fazê-lo.
- As boxes têm uma entrada e uma saída. Use-as na ordem correcta. Para todos os efeitos as boxes SÃO pista, portanto aplicam-se as mesmas regras.
- Ao entrar na pista verifique se o pode fazer em segurança.
- 20 ou 30 metros antes de sair da pista (e antes de levantar o pé do acelerador) levante e mantenha erguido o braço até entrar nas boxes para assinalar aos outros pilotos. Dentro das boxes páre no local que lhe indicarem.
- Na maior parte dos kartódromos avisam quando o tempo está para terminar (normalmente de braço no ar). Dê mais uma volta completa e entre nas boxes.
- Se por acaso se despistar ou fizer um peão NÃO SAIA DO KART. O sítio mais seguro para estar é dentro do kart. Levante o braço para assinalar a sua situação para os outros pilotos e para o responsável pelo kartódromo. Aguarde por ajuda.
- Se quiser dizer a um piloto atrás de si que o deve passar aponte com o dedo (e braço esticado) o lado pelo qual o piloto o deve passar. Analogamente, se outro piloto lhe indicar passagem deve fazê-lo pelo lado que ele indicar.
- Os karts não são carrinhos de choque. Bater contra outro kart, mesmo com as protecções, dói!

Condução:
- O kart tem dois pedais: no pé direito o acelerador e no pé esquerdo o travão. Cuidado com o travão no início pois o pé esquerdo usualmente tem pouca sensibilidade para travar (está habituado à embraiagem).
- A direcção é directa, ou seja, vira muito pouco e não é assistida. Prepare-se para fazer força.
- Nas curvas evite pendurar-se no volante. O peso do corpo deve ser suportado pela bacquet (banco). Encoste-se à bacquet do lado exterior da curva.
- Na primeira volta habitue-se com os pedais e direcção.
- Quando já tiver alguma experiência lembre-se de aquecer os pneus uma ou duas voltas. A diferença de aderência entre um pneu frio e um quente é muito grande.
- A travagem deve ser feita enquanto se vai a direito antes da curva. Nunca travar no meio de uma curva.
- Para fazer uma curva aproxime-se pelo lado exterior da mesma a travar. Deixe de travar e comece a virar, mantendo pelo menos meio acelerador, de forma a passar pelo apex da curva (o "bico" da curva) de forma a terminar a curva no exterior. Depois de passar o apex aumente gradualmente o acelerador de forma a ir acelerador a fundo quando terminar a curva. Ver imagem seguinte.
- Se houver outros karts em pista com pilotos mais experimentados tente fazer as mesmas trajectórias que eles. Lembre-se, está a aprender.
- Se o kart fugir de traseira, tente compensar virando o volante para o lado que o kart está a fugir (o chamado contra-brecar). Esta é uma manobra que demora muito tempo a aprender. Não desista por inicialmente fazer uns piões :)
- Nunca trave e acelere ao mesmo tempo.
- As ultrapassagens têm normalmente lugar em dois sítios: depois de uma curva ou na travagem para uma curva. Depois de uma curva é a ultrapassagem mais simples: fez a curva melhor e ultrapassa em aceleração. A ultrapassagem na travagem é mais complicada: normalmente não tem a linha óptima e precisa de travar mais tarde que o adversário. Evite fazer este tipo de ultrapassagem nas primeiras vezes que andar.
- Mantenha-se na trajectória. Normalmente o resto da pista está suja com pedaços de borracha (os "berlindes"). Evite sujar os pneus pois perdem aderência.

Boas corridas!

Sunday, May 8, 2011

O piloto que conquistou os nossos corações

Faz hoje 29 anos morria o melhor piloto da história da Fórmula 1.
Sim, o melhor. Nenhum outro tinha a garra e o génio de Gilles Villeneuve. Mais: o piloto mais genuíno que a Fórmula 1 conheceu.
Gilles Villeneuve
Não venceu campeonatos. Aliás, venceu poucas corridas. Para ele isso eram coisas secundárias.
Gilles Villeneuve era único piloto que disputava todas as posições, todas as curvas, todos os centimetros de pista. Não importava se tinha material pior que os adversários. Não importava segurar pontos numa corrida. Não importava poupar o material. Nada disso importava. Para ele o importante era correr, era disputar, era ultrapassar os oponentes. Para ele o carro era um objecto que era para ser explorado até passar o limite.
E por isso era amado pelos fãs.
A imagem de marca: passar os limites
Três exemplos que mostram a genialidade do pequeno canadiano.
Treinos do GP USA Leste de 1979: chuva torrencial, pista completamente alagada. O colega de equipa Jody Scheckter (campeão em título) faz o melhor tempo e comenta que não consegue espremer nem mais um décimo. Gilles Villeneuve entra em pista e tira 11 segundos ao tempo do colega.
GP Canadá de 1981: mais uma vez com chuva faz metade da prova com o nariz do carro a tapar-lhe a visão, mas para ele não tinha qualquer importância. Continuava a pilotar e a ultrapassar com a cabeça inclinada para o lado. O nariz acabou por cair e Villeneuve acabou no pódio em terceiro.
Villeneuve com o nariz partido
Mas talvez ele seja mais conhecido pelo GP França de 1979. A prova foi vencida pelo piloto da Renault Jean-Pierre Jabouille. Foi a primeira vitória da Renault. Foi a primeira vitória de um motor turbo.
Mas nada disso interessou. Pois tivemos o privilégio de assistir à mais épica batalha de toda a história da Fórmula 1. Sim, foi uma batalha, entre Gilles Villeneuve e René Arnoux pela segunda posição. É impossível descrever por palavras a genialidade do canadiano:


Faz hoje 29 anos morria o melhor piloto da história da Fórmula 1.
Mas continua nos corações de todos os seus fãs. Mas continua no meu coração.

Thursday, April 21, 2011

Só para quem pensa que sabe C ou C++

Considere-se a expressão (***********printf)(&0["olá mundo!"]);
Isto é legal em C ou C++? Se sim, o que faz?


Notas iniciais:
  1. O operador * (deferenciar um ponteiro) é associativo à direita, ou seja: **a é o mesmo que *(*a);
  2. Uma função quando não está em contexto de ser invocada (ou seja, não tem parenteses à frente) converte-se num ponteiro para a função, ou seja: f é o mesmo que &f;
  3. Uma string constante ("entre aspas") é implementada como um array;
  4. O 'valor' de uma string constante é o endereço do seu primeiro elemento;
  5. O primeiro elemento de qualquer array em C é o de ordem 0 (zero);
  6. A prioridade do operador [] (indexação de array) é superior à prioridade do operador & (obtenção de endereço), ou seja: &a[b] é o mesmo que &(a[b])
  7. O operador [] (indexação de array) é comutativo, ou seja: a[b] é a mesma coisa que b[a]. A razão deste facto é que por definição a[b] é o mesmo que *(a+b), como a soma é comutativa é o mesmo que *(b+a) o que é o mesmo que b[a];
1ª parte: (***********printf)

Por 2) printf é o mesmo que &printf.
Logo, e tendo em atenção 1), *&printf é o mesmo que printf.
Por recursão conclui-se que (***********printf) é o mesmo que printf.

2ª parte: &0["olá mundo!"]

Aplicando 6) fica: &(0["olá mundo!"]).
Pela comutatividade 7) fica: &("olá mundo!"[0])
Tendo em conta 3), "olá mundo!"[0] é o primeiro caracter da string.
Logo aplicando & obtemos o endereço do 1º caracter.
Mas por 4) isso é o mesmo que ter a string "olá mundo!"

Conclusão:

O código inicial é o mesmo que printf("olá mundo");

Monday, April 18, 2011

Build process from hell

Ano de 2004. Um software que estava a ser desenvolvido por uma empresa austríaca e que foi transferido para a minha equipa.
Não usavam source control. Havia registo de bugs (cerca de 500 bugs abertos).
2 milhões de loc, 50 MB de sources e cerca de 6000 ficheiros em Visual C++ 6.0.
1 exe e 52 DLLs, portanto 53 projects dentro do Visual C++. Carradas de dependências entre módulos mas nenhuma indicada no Visual C++.
Como era feito o build process?
Com base nos ficheiros alterados adivinhava-se quais os targets a fazer build.
No caso de erro em alguns dos builds, tinha de se tentar por outra ordem.
No caso de várias tentativas (com várias ordenações) falharem era preciso mudar os settings e forçar o build. Normalmente eram várias DLLs que tinham dependências circulares. Ou seja: A dependia de B; B dependia de C; e C dependia de A. A solução era forçar a criação de A (ignorando erros), depois fazer build a B e a C, depois apagar A e fazer-lhe build novamente (desta vez sem forçar).
Um pesadelo completo! Digamos que com sorte conseguia-se compilar num dia(!) de trabalho.

Depois de um mês de trabalho a identificar todas as dependências e a automatizar o processo de build conseguimos colocar o processo de build fully automatic.
Ficou só a demorar 4h a compilar tudo...

Saturday, April 16, 2011

Como transformar o seu carro num verdadeiro veículo de competição

  • Tambores dos travões de trás pintados de vermelho
  • Lenços nos encostos de cabeça de preferência com a bandeira nacional made in China
  • Coletes fluorescentes nas costas dos bancos
  • Autocolante "Turbo"
  • Autocolante "Penelope"
  • Autocolante "Tuning não é crime"
  • CD pendurado no espelho retrovisor
  • Fita de casamento na antena suja de pelo menos 3 meses
  • Caixa de lenços de papel marca Continente no tablier
  • Ponteira de escape dupla Devil (interior vermelho)
  • Águia no capot
  • Aileron traseiro tipo tábua de passar a ferro
  • Película autocolante escura nos vidros (de preferência com bolhas de ar)
  • Cão Abana-Abana no tabuleiro traseiro
  • Cachecol de Portugal no cimo do pára-brisas
  • Autocolante racing na tampa do depósito de combustível a imitar fibra de carbono com parafusos falsos
  • Faróis de nevoeiro (desalinhados)
  • 3 (mínimo) pirilampos mágicos no tablier
  • Placa no tablier a dizer "Fátima" e com a imagem de uma santa
  • Íman para segurar o telemóvel
  • Autocolante Milupa "Crianças a bordo"
  • Autocolante negro no faróis da frente com dois buracos redondos
  • Capa para o volante com cores berrantes
  • Capas para os bancos com bolas de madeira
  • Letras dos pneus pintadas de branco
  • Extintor (avariado) debaixo do banco
  • Terço pendurado no retrovisor
  • Porta CDs na consola
  • Alhetas nas escovas limpa pára-brisas
  • Ventoinha (não muito grande) no tablier 
  • Faróis traseiros pintados de preto
  • Autocolantes na traseira sentido obrigatório (esquerda) e sentido proibido (direita)
  • Ferradura na grelha presa com arame de enfardar
  • Suporte para reboque com bola de ténis verde
  • Pintar o espaço da coluna entre os vidros de preto
  • Pequeno espelho para o ângulo morto
  • Almofadinhas para o cinto de segurança vermelhas
  • Bloco de notas com ventosa e caneta Bic (pode ser laranja ou cristal) presa por uma mola
  • Fita anti-electricidade estática a pelo menos 5cm do chão
  • Naperon rendilhado no tabuleiro traseiro
  • Coisa feita em renda para o tabuleiro traseiro com um rolo de papel higiénico dentro

Thursday, April 14, 2011

É uma software house portuguesa concerteza!

Há coisas que me fazem confusão. Uma empresa com dez programadores e não usa source control?? Com vários milhares de loc (lines of code)?

- "Source control só complica, nós fazemos uns ZIPs..."
- "Bug tracking? Vamos mandando uns emails..."
- "Ambiente de desenvolvimento? Ambiente de testes? O que é isso? Nós vamos ao produtivo e alteramos..."
- "Rollback? O que é isso?"
- "Backups? Ah e coiso, de vez em quando faço uns ZIPs..."
- "Eu sei lá se dá para fazer restore a partir de um ZIP. Nunca foi preciso..."
- "Onde guardo os ZIPs de backup? Estão lá num directório na mesma máquina..."
Começo a explicar o que é source control:
- "branches? tags? Ui isso é muito complicado!"
- "Deployment? Então, copio para lá os ficheiros que foram alterados!"
- "Versões? Tenho file_v1.pl, file_v2.pl, file_v3.pl e vou mudando os nomes..."
- "Bateria de testes? Então, o programador faz sempre um teste ou dois quando está a programar..."
- "Testes regressivos? O que é isso??"
- "Coding standards? O que é isso?"
- "Como é que quer que eu saiba quando, por quem e porque razão esta linha de código foi alterada?"
- "Levantamento de requisitos? Troca-se uns mails com o cliente..."
- "Especificação? Para quê? Faz-se o software e logo se vê se era aquilo que o cliente queria..."
- "Claro, o programador é que desenha o user interface..."
- "Design? Para quê? O programador que escolha umas cores que fiquem bem..."
- "Gestão do projecto? Então, os programadores dividem as coisas entre eles. Depois vão à reunião com o cliente para saber o que falta..."
- "Como é que quer que eu saiba se o projecto está ontime? Na deadline logo vemos se está tudo feito ou não..."
- "Qualidade de software? Só tenho aquele papel ali na parede de HST, é isso?"
- "Bugs fechados? São aquelas coisas que o cliente já não chateia mais..."
- "Se este projecto dá lucro? Sei lá. Os programadores trabalham das 9-5 em tudo. No fim do ano a contabilidade diz-me se tive lucro"
- "Orçamento? Então, calculo a olho na primeira vez que converso com o cliente..."
- "Milestones? O que é isso?"
- "Arquitectura do sistema? O que é isso?"

As empresas de outras áreas (não de software) também trabalham assim?