Compilando o LLVM como uma biblioteca no Mac OS X 10.6

January 15th, 2011 § 0 comments § permalink

Esses dias andei brincando um pouco com o projeto ruby-llvm, cujo propósito é criar bindings em Ruby para o LLVM usando o Ruby-FFI. Para aprender sobre o projeto, adicionei alguns testes para a funcionalidade já existente e corrigi alguns pequenos problemas.

Para fazer isso, eu precisei compilar a biblioteca compartilhada do LLVM, que na maioria das plataformas é algo trivial. De fato, normalmente só é necessário especificar o flag abaixo no script de configuração:

./configure --enabled-shared

Eu uso o brew, na verdade, mas o princípio é o mesmo:

brew install llvm --shared

Entretanto, a compilação acima, embora passe limpa no Mac OS X, resulta nos seguintes erros quando a biblioteca é carregada no Ruby-FFI:

dyld: loaded: /Users/<user>/llvm/2.8/lib/libLLVM-2.8.dylib
dyld: lazy symbol binding failed: Symbol not found: 
    __ZN4llvm2cl6Option11addArgumentEv
  Referenced from: /Users/<user>/llvm/2.8/lib/libLLVM-2.8.dylib
  Expected in: flat namespace

dyld: Symbol not found: __ZN4llvm2cl6Option11addArgumentEv
  Referenced from: /Users/<user>/llvm/2.8/lib/libLLVM-2.8.dylib
  Expected in: flat namespace

Trace/BPT trap

Depois de algumas investigações e uma troca de e-mails com Takanori Ishikawa, eu cheguei ao seguinte patch que resolve o problema e permite que o LLVM seja compilado limpa e corretamente como uma biblioteca compartilhada:

diff --git a/Makefile.rules b/Makefile.rules
index 9cff105..44d5b2d 100644
--- a/Makefile.rules
+++ b/Makefile.rules
@@ -497,7 +497,7 @@ ifeq ($(HOST_OS),Darwin)
   # Get "4" out of 10.4 for later pieces in the makefile.
   DARWIN_MAJVERS := $(shell echo $(DARWIN_VERSION)| sed -E
's/10.([0-9]).*/\1/')

-  SharedLinkOptions=-Wl,-flat_namespace -Wl,-undefined,suppress \
+  SharedLinkOptions=-Wl,-undefined,dynamic_lookup \
                     -dynamiclib
   ifneq ($(ARCH),ARM)
     SharedLinkOptions += -mmacosx-version-min=$(DARWIN_VERSION)

As opções acima mudam os namespaces para o padrão de dois níveis do OS X e a resolução de nomes para acontecer em tempo de execução.

Usar essas opções não parecer ter causado qualquer problema em outras partes do LLVM mas eu estou curioso para entender porque não são usadas por padrão pelo projeto, especialmente considerando que muitos outros projetos fazem justamente isso como descobri depois. De fato, as opções anteriores parecem ser um legado dos dias pré-10.3 do Mac OS X. De qualquer forma, fiz essa pergunta na lista LLVM-dev.

Enquanto isso, o patch funciona para mim. Também disponibilizei uma versão modificada para o brew. YMMV.

Sobre jedis, ninjas e samurais

January 8th, 2011 § 14 comments § permalink

Geeks de todos os tipos adoram se colocarem como os equivalentes tecnológicos de alguma sociedade guerreira–real ou imaginada–que exiba uma quantidade excessiva de coolness no dia-a-dia. Eu não posso culpar ninguém que faz isso porque eu também já fiz a mesma coisa muitas vezes.

É claro, eu nunca gostei tanto de Star Wars. Sendo um fã de Star Trek, eu sempre considerei Star Wars como algo que você superava quando crescia–bom para crianças, mas não para muito além disso (por favor, sem ameaças de morte, estou brincando–bem, nem tanto assim). Star Wars é fantasia e Star Trek é ciência. Claro, os Jedi são muito mais legais e eu preferiria andar com um sabre de luz do que com um phaser mas me dê um torpedo quântico qualquer dia ao invés de qualquer arma do Império ou da República.

E há sempre os samurais–aquela velha escola, valorosa, sempre envolvida em negócios por conta de honra, muitas vezes sem qualquer esperança de sucesso. De Seven Samurai a The Last Samurai–e não dá para esquecer os livros do Eiji Yoshikawa–nós ocidentais sempre admiramos a forma como esses guerreiros japoneses se conduziam, considerando o seu Caminho do Guerreiro como algo a aspirar.

Finalmente, há também os ninjas ou shinobi. Não muito populares hoje em dia, mas houve um tempo em que eram a febre entre a população mais jovem. Como os samurais, a arte deles também era baseada em princípios de honra e dever–embora, no seu auge, eles fosse mais equivalentes a guerrilhas ou equipes Black Ops do que o modelo mais Special Forces dos samurais.

Mas uma coisa que todas ordens tem em comum é que elas eram bem monásticas, baseadas em códigos estritos sobre como proceder, treinamentos estritos ao longo dos anos e especialmente, disciplina–em muitos casos, com o peso da honra coibindo qualquer relação além da com os companheiros de armas.

Como geeks geralmente gostamos de nos comparar essas ordens porque elas são, bem, fascinantes, e sempre estavam fazendo coisas além no normal, com seus procedimentos arcanos para lidar com situações acima do que uma pessoa normal poderia encontrar.

Mas há algo que é sempre esquecido sobre essas ordens–como mencionado acima, elas eram primariamente e acima de tudo sobre disciplina; sobre um modo de vida ordenado que permitia com que a pessoa se concentrasse no que realmente importava. Tanto o treinamento histórico e real dos samurais e shinobi quanto o imaginado, inspirado pelos anteriores, dos Jedi exigia um compromisso com a disciplina que supera qualquer outra coisa que a pessoa precisaria fazer no curso de sua existência como membro dessas ordens. E, acima de tudo, requeria compromissos entre o possível e desejado e o necessário.

O que me traz ao meu ponto.

Nos últimos quatro ou cinco anos, eu fui parte de quase dez times diferentes. Já vi equipes sucederem a falharam, se recuperaram e continuarem, se unirem e se tornaram grandes, acabarem e seguir com suas vidas. Em resumo, fui parte de um número enorme de situações em que pude participar ou observar como times interagem e fazem as coisas acontecerem.

E em todos esses anos, uma das coisas mais importantes que separou os times ruins ou medianos dos grandes times foi a disciplina, que geralmente a parte mais desprezada nos exemplos que os fãs desses grupos tentam emular quando escolhem seus heróis.

É um tanto irônico que pessoas professem gostar tanto de metodologias ágeis porque estas criam ordem do caos através de times auto-gerenciáveis–times que não precisam de muita direção para fazer e acontecer, times que não precisam ser monitorados continuamente para garantir que estão indo na direção certa–esqueçam de que gerar ordem do caos exige disciplina.

A verdade é que agilidade em times só acontecem naqueles que são disciplinados e que entendem o que se ganha e o que se perde quando um projeto tem que ser cumprido. Sim, agilidade tem tudo a ver com encarar mudanças mas isso só significa que você tem que conseguir trabalhar muito bem com seus pares e com a organização como tudo–entendendo o que está mudando e quais são os meio-termos a serem alcançados–para realizar seus objetivos. Mudança sem contexto, sem disciplina, só gera caos. E isso é que muitos parecem esquecer quando se encantam com o Scrum e suas disciplinas irmãs.

Eu estava falando com um amigo outro dia e estávamos discutindo o fato de que muitos programadores usam a desculpa do ADD para procrastinarem ou para justificar distrações. Geeks, ele estava dizendo, são notórios pela sua baixa capacidade de atenção.

Eu acho–e disse para ele–que o contrário é o correto. Os verdadeiros geeks são disciplinados o suficiente para manter o seu foco e continuar no que estão fazendo a despeito das distrações. Você precisa ser muito focado se quer depurar aquele heisenbug que está mantendo você acordado nas últimas 40 horas, fazendo com que seu servidor capote a cada hora e meia. Você precisa de disciplina para continuar afundando na documentação, indo e voltando para encontrar aquela informação elusiva de permitirá que você otimize a sua rotina para que ela rode em massas de dados enormes. E você precisa de um senso forte de direção para participar de um time sem controle gerencial direto em um ambiente que está mudando continuamente.

Em resumo, disciplina é o que separa os diletantes dos artesãos. É que faz as coisas acontecerem e que realmente cria grandes times. Não quer dizer que você tenha que ser um mala sobre horários, procedimentos ou qualquer coisa assim. Não significa que você não possa se divertir ou que tenha que seguir passos ordenados toda vez que vai fazer alguma coisa. Mas significa que você tem que praticar e pensar e se focar até que isso se torna uma segunda natureza, até que você se torne um mestre no que está fazendo.

E isso é o que ninjas e samurais e Jedi fazem. Eles não param, não correm quando a proverbial situação fica preta. Eles–você sabe–simplesmente vão lá e fazem, e fazem bem.

Fazendo aquilo com o Groupon

January 2nd, 2011 § 6 comments § permalink

Há uma grande discussão acontecendo agora sobre o modelo de negócios do Groupon. Depois que a empresa recusou a oferta de aquisição do Google, a pergunta que todo mundo está se fazendo é se os donos o Groupon são insanos ou brilhantes, tão confiantes no seu modelo de negócios e na habilidade do mesmo de ir além de qualquer oferta que o Google possa fazer–e isso depois da oferta ter sido dobrada duas vezes.

John Battelle é um dos que pensam que o Groupon fez a escolha certa. Ele escreve:

Good sources have told me that Groupon is growing at 50 percent a month, with a revenue run rate of nearly $2 billion a year (based on last month’s revenues). By next month, that run rate may well hit $2.7 billion. The month after that, should the growth continue, the run rate would clear $4 billion.

Battelle atribui isso a uma combinação de fatores: relacionamentos, localização e timing–veja o artigo para uma explicação maisprofundo do que torna o Groupon quase que irresistível para pequenos negócios. E como ele nota em seu artigo, a run-rate demonstrada até agora pelo Groupon é o triplo do que o próprio Google experimentou em seus anos iniciais.

Eu estava conversando com um amigo outro dia sobre compras coletivas e ele disse que o maior problema que afetaria e eventualmente mataria o modelo de negócios dessas empresas seria o churn, isto é, o fato de que muitas dessas ofertas estão criando problemas para os pequenos negócios usando a plataforma. De fato, há dezenas de histórias sobre pessoas sendo maltratadas porque chegaram com um cupom do Groupon ou equivalente local e o negócio em questão já estava irritado por estar perdendo dinheiro com esses clientes. Eu escutei várias dessas histórias em primeira mão e em muitos casos, os donos tinham calculado incorretamente o que podiam ou deveria oferecer e ficaram descontendes com a experiência com um todo, consequentemente se tornando menos e menos interessados em trabalhar novamente com compra coletiva.

Eu acredito que o churn que estamos vendo é somente uma conseqüência da forma como novos mercados funcionam. Se o Battelle está correto–e eu acredito que sim–o churn se tornará cada vez menor à medida que os negócios encontrem seus sweet spots no ecossistema. Eu não vejo porque, por exemplo, o Groupon não possa oferecer uma ferramenta que permita que os negócios entrem com alguns parâmetros e depois deduza o preço relativamente ideal para uma certa oferta. De fato, isso nunca vai ser exatamente precisa mas dará aos negócios usando a plataforma uma maneira de evitar os problemas mais extremos.

Em última instância, porém, eu acredito que o Groupon será bem sucedido porque está mudando a forma como as pessoas se relacionam com os negócios locais. Recentemente, falando com dois outros amigos, eles me contaram como os clones locais estão tendo um impacto em seus padrões de compra.

Um deles, divorciado, nos seus quarenta, disse que não janta fora mais a menos que tenha um cupom. Esses cupons o estão ajudando a aumentar o price point dos seus gastos e, consequentemente, melhorar os locais que ele pode freqüentar. Com a ajuda dos cupons, ele está indo para locais mais caros mais vezes por semana. Essa é uma mudança grande que está beneficiando o meu amigo e os pontos que ele gosta. Como os negócios estão se tornando mais cuidados e aumentando os gastos colaterais, como bebidas e outros–algo perfeitamente aceitável–isso faz com que o resultado seja proveitoso para todos envolvidos.

O outro amigo, com seus trinta anos, disse que que compras coletivas estavam na verdade ajudando que ele transasse mais. Ele é solteiro e está usando uma variedade de cupons–restaurantes, spas, roupas, pequenos itens–para impressionar e interessar mulheres. Ele ainda está usando uma quantidade considerável de dinheiro mas o Groupon e seus similares estão fazendo com que ele gaste esse dinheiro de forma mais eficiente em direção ao seu objetivo–que, sejamos sinceros, incluem no momento transar tantas vezes quanto possível no menor período de tempo. E é quase auto-evidente pela forma que mercados funcionam que qualquer coisa que ajude pessoas a conseguirem mais sexo–ou encontram qualquer medida de satisfação sexual–está em condições muito melhores de ser bem sucedido.

E aqui você tem o resumo final: pessoas estão fazendo mais sexo com o Groupon. E isso torna a sua posição mais forte ainda. Battelle está correto–do ponto de vista dos pequenos negócios–e meu amigo também está correto–do ponto de visto do consumido.

E dos dois modos, o Groupon vence.

Where am I?

You are currently viewing the archives for January, 2011 at Superfície Reflexiva.