A arte Steampunk

Você consegue imaginar o que aconteceria com o mundo se a revolução da informação tivesse ocorrido na era vitoriana? Consegue imaginar como seria nossa tecnologia se ela tivesse evoluído com base na energia a vapor? Sabe aquele filme com tecnologias estranhas que parecem ser de um mundo paralelo e que chegam a ser absurdas e paradoxais perto da nossa história ou realidade? Isto é Steampunk!

Como em todos os movimentos artísticos, há controvérsias na definição do que é Steampunk. Há até quem diga que Steampunk pode surgir de invenções reais que não deram certo (muitas vezes por motivos óbvios). Não é a toa que este tipo de arte se destaca entre as invenções reais apresentadas em encontros de nerds que mexem com hardware como a Maker Faire.

Os aparatos tecnológicos criados neste movimento artístico são alguns dos que mais me atraem e eu não sei o motivo exato. Não são as maluquices com vestuário, música, etc. São apenas os objetos e que até poderiam funcionar. Imagine como seria um submarino, uma moto, um carro, se tivessem sido inventados neste mundo paralelo?

Pois bem, criar estes aparatos é uma arte e o resultado chega a ser impressionante. A seguir alguns trechos de filmes e imagens que em minha opinião estão associados com Steampunk:

Steamboy

Wild Wild West

City of the Lost Children

The Time Machine (1960)

Fantastic World of Jules Verne (1958)

20,000 Leagues Under The Sea (1954)

Fallout 3

Fotos de objetos diversos (Infelizmente sem referências)

1-Steampunk-379

1-Steampunk-381

steampunk10-2

steampunk-webcam

Tom_Banwell_Steampunk_Mask-thumb-600x757-36956

radial

steampunk-watch_1_42KfF_3342

Se você também gosta de ver estes objetos feitos de bronze, cobre, aço, couro, muitas engrenagens e que funcionem com vapor veja também os links abaixo e deixe um comentário neste artigo. Fique à vontade para citar outros exemplos de onde encontrar mais referências desta arte.

Dicas

Posted in Arte, Opinião | Tagged , , , , , | Leave a comment

Horário de Verão e o PHP

Há algum tempo atrás eu publiquei um artigo em outro endereço sobre como atualizar a base de fusos horários do PHP para suportar novas variações do horário de verão no PHP, pois o mantenedor do PECL timezonedb estava um pouco ocupado.

Pois bem. Dia 13/10 o timezonedb foi novamente atualizado. Talvez seja hora de atualizar este componente em seus servidores para obter os novos horários corrigidos.

E se você chegou neste blog através de links quebrados, procurando mais sobre este assunto, eu sinto dizer que não irei verificar se o timezonedb foi realmente atualizado com as datas brasileiras. A dica que eu deixo é que finalmente o governo brasileiro fixou as datas do horário de verão, o que possibilita que o timezonedb não precise ser atualizado anualmente.

Resumo da ópera:

# pecl install timezonedb

ou

# pecl upgrade timezonedb
Posted in Internet, Linux/Unix, PHP, Programação | Tagged , , , , , | Leave a comment

Resumão Rails Summit 2009

Nos dias 13 e 14 de Outubro aconteceu o Rails Summit 2009, um evento focado em assuntos relacionados ao framework para desenvolvimento de sites chamado de Ruby on Rails. Compilei abaixo um brevíssimo resumo sobre cada palestra:

Dia 13/10

  • “Ruby on Rails Insurgency”, Chad Fowler

    Dentre outras coisas Chad falou sobre problemas do mundo real que atrapalham a adoção de novas tecnologias no mundo corporativo e deu dicas de como se defender e advogar novas tecnologias como o Rails. Seguem algumas frases da palestra:

    • “Support contract doesn’t garantee anything”
    • “Stop doing things you know are wrong! STOP!”
    • “Introduce rails/agile gradually, shock therapy is a recipe for failure in the enterprise”

    Em geral eu gostei muito da palestra do Chad. Só não posso dizer o mesmo de quando ele começou a utilizar o exemplo de outras linguagens, como PHP, para dizer que não são linguagens corporativas. Infelizmente foi um exemplo infeliz. O que faz PHP não ser uma linguagem corporativa? E o que faz Ruby ser? Para mim PHP é muito mais corporativo do que Ruby, pela simples taxa de adoção da linguagem no mercado.

  • “On The Edge of Rails Performance”, Gregg Pollack

    Gregg é conhecido pelo seu trabalho naqueles vídeos sobre Rails que imitam os vídeos de marketing da Apple. Em sua palestra ele dá dicas de ferramentas para depuração e otimização de performance de aplicações Rails. Traduzi abaixo a lista de ferramentas disponível no site http://blog.envylabs.com/summit/ que contém a lista das ferramentas que ele citou na palestra. Posso dizer que a maioria delas é muito interessante e vale a pena ser testada:

    Plugins para ActiveRecord para otimização do banco de dados

    • Bullet – Ajuda a reduzir o número de consultas com alertas (no growl).
    • Rails Indexes – Tarefas Rake para encontrar falta de índices.
    • Scrooge – Otimizador de consultas SQL, de forma que você só consulta pelo que sua página precisa.

    Plugins para Rails para prevenir o uso exagerado de memória

    • rack-bug – Barra de ferramentas para depuração de aplicações Rack, implementada como middleware.
    • memorylogic – Adiciona o identificador do processo e utilização de memória no log de sua aplicação Rails.
    • oink – Interpreta o log para encontrar ações que causam um aumento no tamanho da pilha da VM.

    Bibliotecas Ruby que ajudam a escalar

    • rubber – Um plugin capistrano/rails que torna fácil a publicação/gerenciamento/escalonamento de aplicações no EC2.
    • cloud crowd – Gerencia processamento paralelo através de trabalhos que executam em segundo plano.
    • Mad Mimi – Aplicação web de e-mail marketing com uma API incrível.

    As dicas que Gregg apresentou foram certamente muito valiosas, principalmente para quem está começando à desenvolver sites com Rails, assim como eu. Não sei o quanto estas bibliotecas são conhecidas por aí, mas certamente são bastante úteis. O que eu mais gostei foi ver uma das ferramentas utilizarem o Growl para notificar o desenvolvedor quando há algum problema.

  • “Yet Another Ruby Framework”, Carlos Brando

    Carlos Brando apresenta o framework Sociably. Quais foram as motivações para o desenvolvimento deste framework e como ele foi desenvolvido. Os slides desta palestra já estão em seu site, aqui.
    Quando fui assistir a palestra eu imaginava que o Carlos iria mostrar as entranhas do Ruby on Rails. Alias o título original da palestra não era esta que está citada aqui. De uma certa forma eu fiquei um pouco decepcionado com isto. No entanto foi interessante conhecer a forma com que o Sociably foi desenvolvido.

  • “Real-time Ruby for the Real-Time Web”, Ilya Grigorik

    Ilya Grigorik comenta sobre real-time em ruby e tecnologias como XMPP, AMQP, PSHB e WebHooks. Os slides desta palestra podem ser vistos aqui.
    Eu não pude assistir esta palestra pois estava em outra. Infelizmente percebi que havia escolhido a palestra errada e que deveria ter ido assistir esta pois trata de Messaging que é um assunto que particularmente me interessa. Felizmente ela está na web e assim que possível irei assistí-la.

  • “Tarantula: Easy Fuzz Testing for Rails Apps”, Glenn Vanderburg

    Glenn Vanderburg palestra sobre o Tarantula que é uma ferramenta para testes fuzz. Até o momento do fechamento deste artigo, não encontrei a apresentação na Internet, mas encontrei esta página sobre o assunto.

  • “Rails 3.0 generators”, José Valim

    José Valim palestra sobre a adoção do Thor no Rails 3.0 para a criação de generators mais agnósticos quanto às tecnologias selecionadas para BD, testes, etc, em cada aplicação Rails. Encontrei este artigo do José Valim que está diretamente relacionado com a palestra.

    Ao ver esta palestra fiquei animado ao ver que a próxima versão do Rails será muito mais customizável e irá possibilitar que seu sistema sofra menos imposições do que o Rails hoje o faz. Entretanto isso certamente trará alguns efeitos negativos como o aumento da complexidade e quantidade de APIs e plugins para o framework.

  • “Ruby, dynamism and metraprogramming at DSL construction”, Fabio Kung

    Fabio Kung explora as entranhas da linguagem Ruby e exemplificou ao-vivo como criar uma DSL interna nesta linguagem. Seguem links para a palestra e para o código.

  • Para mim esta foi uma das melhores palestras do evento. Mesmo tendo sido uma palestra avançada de Ruby eu pude entender boa parte do que o Fabio Kung estava explicando. De certa forma eu tenho dúvidas se “hackear” o ruby da forma como ele fez seja algo sustentável pois o código não fica muito legível, mas é bom saber o que é possível ser feito com esta linguagem.

  • “RSpec and Cucumber: Beyond the Basics”, David Chelimsky

    David Chelimsky está escrevendo um livro só sobre RSpec e Cucumber e nesta palestra mostra várias dicas sobre estas tecnologias. Infelizmente não encontrei os slides na web.

  • “Agile, beyond Chaos”, Fabio Akita

    Fabio Akita palestra sobre teoria do caos e um monte de outras idéias diversas sobre o assunto e como isto está relacionado com o Manifesto Ágil. Pode-se dizer que é uma palestra beta pois como ele mesmo disse, ainda não possui todas as respostas para a teoria que está formando em sua cabeça. Infelizmente até o momento também não encontrei os slides na web.
    Esta também foi uma das palestras mais interessantes do evento. O Akita sempre traz surpresas e ele não deixou nada a desejar nesta palestra. Um dos pontos interessantes para mim foi a exibição de um breve filme sobre o experimento Asch.

  • “The Future of Ruby & Rails”, Matt Aimonetti

    Matt Aimonetti fala sobre futuras versões do Ruby e do framework Rails. Ele exibe benchmarks sobre as versões demonstrando que teremos excelentes ganhos de performance com estas versões. Uma curiosidade é que ele mencionou que o Ruby 2.0 está previsto para o Natal. Infelizmente também não encontrei slides na web.
    Eu não vi muitas novidades nesta palestra. Muito do que ele falou sobre as novidades pode ser encontrado na web, inclusive era de se esperar que os benchmarks que ele mostrou apresentassem tais resultados.

Dia 14/10

  • “MacRuby + HotCocoa”, Richard Kilmer

    Richard Kilmer apresenta MacRuby, que é uma VM Ruby especial para dArthur Zapparoliesenvolvimento de aplicações nativas em Mac OS X (e até aplicações web), e HotCocoa que é uma API em Ruby que simplifica o desenvolvimento de aplicações Cocoa. Eu não consegui assistir a palestra, mas encontrei os slides aqui.

  • “Ruby na ThoughtWorks”, Carlos Villela

    Carlos Villela apresenta as experiências que a ThoughtWorks teve com Ruby nos últimos anos. Sua apresentação é baseada no artigo e apresentação do Martin Fowler que trata do mesmo assunto. Certamente foi uma das palestras que mais obteve perguntas durante o evento.

  • “O que mudou no Ruby 1.9”, Nando Vieira

    Nando Vieira expõe as novidades no ruby 1.9 e dá dicas de como portar seu código para ser compatível com esta versão. A apresentação pode ser encontrada aqui.

  • “Experiências com Ruby”, Pratik Naik

    Pratik Naik conta suas experiências com Ruby. O conteúdo pareceu ser bastante interessante mas infelizmente não consegui compreender muito do que o Pratik estava falando. Os slides estavam com fontes pequenas e o sotaque do Pratik e problemas com o posicionamento do microfone atrapalharam. Para variar também não encontrei os slides, mas aparentemente muito do que está publicado no blog dele, está relacionado com a palestra.

  • “Introdução a Banco de Dados não-relacionais e CouchDB”, Marcos Tapajós

    Marcos Tapajós apresenta o CouchDB e suas experiências com este software. Não é à favor de utilizar APIs que mapeiam o CouchDB como um banco relacional, ou seja, que utilizam ActiveRecord. Recomenda o uso do CouchRest. Veja os slides aqui.

  • “Rails não Escala”, Bruno Miranda e Jeison Seifer

    Bruno Miranda e Jeison Seifer, apresentaram o caso do desenvolvimento do MSN Music Cyloop. Fiz as seguintes anotações sobre os slides: Action Cache, cache-money, Tokyo Tyrant, Scrooge, Counter Cache, Explain, Beanstalkd, Nanite, WebServices, RabbitMQ, Sinatra, Rails Metal, HA Proxy, Nginx Fair Proxy (maxcon=1), Apdex, Cucumber, FakeWeb, Have a QA, Selenium, EM Proxy, Testing with production data. Até o momento também não encontrei slides desta apresentação (talvez porque esteja cheia de vídeos).
    OBS.: Fiquei um pouco incomodado quanto o Bruno disse que iria fazer a palestra em inglês porque “não tinha um bom português técnico”. Isso não fez muito sentido, mesmo que boa parte das pessoas ali não tenham dificuldade com o inglês, mas poxa, um brasileiro falando inglês num evento brasileiro é muito estranho.

  • JRuby in the enterprise world: Using Rails with legacy code“, Leonardo Borges

    Leonardo Borges mostra um tutorial de como integrar código legado em Java com JRuby utilizando Maven.

  • “De Serviço para Produto”, Vinícius Teles

    Vinícius Telles apresenta suas experiências de vida que servem como exemplo para aqueles que pretendem se tornar empreendedores. A principal dica é a de sempre ter uma “Reserva Financeira”, pois como o próprio Vinícius disse “Os problemas vem de ônibus, não vem de taxi”. A palestra pode ser assistida aqui.
    Esta também foi uma das melhores palestras do evento, na minha opinião. Tecnologias qualquer um pode aprender bastando-se procurar a literatura adequada, mas lições de vida não são fáceis de conseguir em livros. O próprio palestrante disse estar incomodado em contar sua trajetória profissional e a única coisa que posso dizer é que cada informação que ele passou é de imenso valor. Foi uma lição de empreendedorismo e sem magia negra. :-)

  • “Controle de versões do jeito certo”, Arthur Zapparoli

    Arthur Zapparoli, ou Arthur Geek, palestra sobre dicas de como utilizar o Git no dia-a-dia, workflow, etc. Os slides podem ser vistos aqui.

  • “Dominando a Arte de Desenvolvimento de Aplicações”, Obie Fernandez

    Obie faz uma analogia do desenvolvimento de aplicações com a arte. Ele trata do assunto com foco nos indivíduos, não nas corporações e mostra que a maestria vem apenas com a prática. Infelizmente não encontrei os slides na web.
    A palestra do Obie foi bastante motivadora, principalmente no quesito prática. Logo depois da palestra dele fiquei com vontade de sentar e programar (exagerando :-) ).
    Particularmente eu acredito que o palestrante tem problemas sérios com hierarquia. Mas isso são outros quinhentos.

Atualização 16/10: Fotos de alguns dos palestrantes podem ser vistas aqui.

Atualização 20/10: Num primeiro momento eu acabei deixando de lado minha opinião sobre o evento e sobre as palestras, então aqui vai. O evento eu achei excelente! É a primeira vez que participo de um evento focado em Rails e só posso dizer que gostei muito. A comunidade é bastante entusiasmada e motivada. Sobre as palestras eu coloquei minhas observações abaixo de cada uma delas que pude assistir.

Posted in Eventos, Opinião, Programação, Ruby, ruby-on-rails | Tagged , , , , | 1 Comment

[Tradução] Horário dos Fazedores, Horário dos Administradores


Nota do tradutor: A seguir uma tradução do texto Maker’s Schedule, Manager’s Schedule do Paul Graham. A tradução não é 100% fiel ao texto original. Procurei adequar o texto à nossa cultura para melhor compreensão. Alguns termos e frases poderiam ter tradução estranha ou ambígua, portanto tentei utilizar os termos que melhor se adequavam ao contexto.

Uma razão pelo qual os fazedores não gostam muito de reuniões é que eles estão num ritmo diferente das outras pessoas. Reuniões lhes custam mais.

Existem dois tipos de horário, as quais eu chamarei de horário do administrador e horário do fazedor. O horário do administrador é para chefes. Ele está consubstanciado no tradicional livro de compromissos, com cada dia sendo cortado em intervalos de uma hora. Pode-se bloquear diversas horas para uma única tarefa, se necessitar, mas por padrão muda-se o que está fazendo a cada hora.

Quando você utiliza o tempo desta forma, é meramente um problema prático encontrar-se com alguém. Encontrar um horário vago em sua agenda, reservá-lo, e pronto.

A maioria das pessoas poderosas estão no horário do administrador. É o horário do comando. Mas há outra forma de utilizar o tempo que é comum entre pessoas que fazem coisas, como programadores ou escritores. Geralmente eles preferem utilizar o tempo em unidades de meio-período, pelo menos. Você não pode escrever ou programar bem em unidades de hora. Isto mal é tempo suficiente para começar.

Quando se está operando no horário do fazedor, reuniões são um desastre. Uma única reunião pode acabar com a tarde toda por quebrá-la em dois pedaços sendo cada uma muito pequena para fazer algo complexo. Além disso você deve lembrar de ir à reunião. Isto não é problema para alguém no horário do administrador. Sempre há algo diferente ocorrendo na próxima hora; a única questão é o quê. Mas quando alguém no horário do fazedor tem uma reunião, ele deve raciocinar a respeito desta.

Para alguém no horário do fazedor, ter uma reunião é como lançar uma exceção. Ele não só meramente faz você alternar de uma tarefa à outra; ele muda a forma na qual você trabalha.

Eu percebo que uma reunião afeta o dia todo. Uma reunião normalmente acaba com no mínimo metade do dia, por quebrar uma manhã ou uma tarde. Além disto há eventualmente um efeito cascata. Se sei que a tarde será quebrada, é ligeiramente menos provável que inicie algo ambicioso na manhã. Sei que isto pode soar hipersensível, mas se você é um fazedor, pense em seu próprio caso. Você não acorda pela manhã com o pensamento de que terá o dia todo livre para trabalhar, com nenhuma reunião marcada? Bem, isso significa que você ficará igualmente deprimido quando do contrário. E projetos ambiciosos são por definição próximos do limite de sua capacidade. Uma pequena redução na moral é suficiente para matá-los.

Cada tipo de horário funciona bem por si só. Problemas surgem quando elas se encontram. Como a maioria dos poderosos operam no horário do administrador, eles estão na posição para fazer todos ressoarem em sua frequência, caso queiram. Mas os mais espertos restringem-se, se souberem que algumas das pessoas trabalhando para eles precisam de longos períodos contíguos de tempo para trabalhar.

Nosso caso é um pouco incomum. Quase todos os investidores, incluindo todos os VCs que conheço, operam no horário do administrador. Mas a Y Combinator funciona no horário do fazedor. Rtm, Trevor e eu o fazemos porque sempre fizemos, e Jessica faz também, principalmente, porque ela está em sincronia conosco.

Eu não ficaria surpreso se mais empresas começassem a ser como nós. Suspeito que os fundadores podem ser cada vez mais capazes de resistir, ou ao menos procrastinar, a sua própria transformação em gerentes, assim como à poucas décadas atrás eles passaram a ser capazes de resistir à troca do jeans pelos ternos.

Como nós fazemos para aconselhar muitas startups a utilizar o horário do fazedor? Utilizamos a ferramenta clássica para simular o horário do administrador dentro do horário do fazedor: horas de escritório. Diversas vezes por semana eu separo algumas horas para me encontrar com os fundadores que nós financiamos. Estas horas estão no final do meu dia de trabalho. Também escrevi um programa de assinaturas que garante que todos os compromissos dentro de um dado conjunto de horas do escritório estão agregados no final. Como elas vêm ao final do meu dia, reuniões nunca são uma interrupção. (A menos que o expediente deles termine ao mesmo tempo que o meu, a reunião presumidamente interromperá o deles, mas desde que eles criaram o compromisso isto deve valer a pena para eles.). Durante períodos ocupados, as horas de escritório geralmente ficam longas o suficiente ao ponto de comprimir o dia, mas elas nunca o interrompem.

Quando nós estávamos trabalhando em nossa própria startup, na década de 90, evoluí outro truque para particionamento do dia. Eu costumava programar do jantar até cerca de 3 horas da manhã todos os dias, porque durante a noite ninguém poderia me interromper. Então eu dormia até cerca das 11 horas da manhã, e vinha e trabalhava até o jantar no que eu chamava de “negócios”. Eu nunca pensei nestes termos, mas em efeito eu tinha dois expedientes por dia, um no horário do administrador e um no horário do fazedor.

Quando se está operando no horário do administrador você pode fazer algo que você nunca quer fazer no horário do fazedor: você pode ter reuniões especulativas. Você pode encontrar alguém somente para se conhecerem. Se você tem um espaço vazio em sua agenda, porque não? Talvez vocês possam se ajudar de alguma forma.

Pessoas de negócios no Vale do Silício (e em todo o mundo) têm reuniões especulativas todo o tempo. Eles estão efetivamente livres se você está no horário do administrador. Estes são tão comuns que há até uma linguagem distinta para propô-las: dizendo que você quer “tomar um café”, por exemplo.

Entretanto encontros especulativos são terrivelmente onerosos se você está no horário do fazedor. O que nos coloca em uma espécie de vínculo. Todos assumem que, como outros investidores, nós utilizamos o horário do administrador. Então eles nos introduzem para algo que pensam que nós devemos cumprir, ou nos enviam um e-mail propondo um café. Neste ponto nós temos duas opções, nenhuma delas boa: nos encontramos com eles, e perdemos metade de um dia de trabalho; ou tentamos evitar o encontro com eles, e provavelmente ofendê-los.

Até recentemente não estava claro em nossas mentes qual era a origem do problema. Nós somente presumimos que tínhamos que igualmente explodir nossos horários ou ofender as pessoas. Mas agora que percebi o que está acontecendo, talvez exista uma terceira opção: escrever algo explicando os dois tipos de horário. Talvez eventualmente, se o conflito entre o horário do administrador e o horário do fazedor passe a ser largamente compreendido, isto será menos do que um problema.

Aqueles de nós que estão no horário do fazedor estão dispostos a se comprometer. Nós sabemos que devemos ter algumas das reuniões. Tudo o que perguntamos daqueles que estão no horário do administrador é que eles compreendam o custo.

Agradecimentos à Sam Altman, Trevor Blackwell, Paul Buchheit, Jessica Livingston, and Robert Morris por lerem rascunhos deste texto.

Relacionados:

Posted in Dissertações, Opinião, Traduções | Tagged , , , , , , , | Leave a comment

Google Chrome OS

Antes de tudo quero deixar claro que sou um grande admirador da empresa Google e de muitos de seus produtos. Digamos que dentre tudo o que eles sabem o que mais me impressiona é a forma como planejam seus produtos e a forma como cresceram organizadamente e com planejamento focado em crescimento. O simples fato de que são os maiores e conseguem lidar com boa parte do tráfego de toda a Internet sem grandes problemas é prova disto.

Recentemente o Google anunciou o lançamento do Google Chrome OS. Como era de se esperar o hype foi absurdamente exagerado para esta notícia.

Algumas pessoas chegam ao ridículo de falar que este sistema operacional vai dominar o mundo ou vai matar o Windows ou o Linux, ou o [coloque aqui o sistema operacional que lhe vem à mente]. Para abafar um pouco a poeira ou levantar um pouco mais, aqui vão algumas indagações minhas a respeito:

Agora vai minha parcela de suposições a respeito do Google Chrome OS:
Será um sistema operacional baseado no Linux, com quase nenhum aplicativo instalado além do próprio navegador Google Chrome com alguns plugins como o próprio Google Gears.

O Google e a Internet

O Google é uma empresa de Internet e ela nunca deixará de ser isso. O máximo que ela pode fazer é tentar mudar o rumo da computação para que tudo fique nas nuvens, ou seja, na Internet. Se ela lançar algum produto que não tenha nenhuma relação com a Internet, estará deixando de ser o Google. Esta informação é um pré-requisito importante para entender o restante do texto.

Sistemas Operacionais

Me arrisco a dizer que os computadores sempre precisarão de um Sistema Operacional cheio de drivers (estáveis ou não) e de programas que rodem em código nativo da CPU. Por outro lado, mudar este modelo não é impossível, mas é comercialmente inviável. Uma solução para isto seria alguma empresa criar uma CPU que execute diretamente o bytecode de uma máquina virtual conhecida, como a JVM, e que consiga gerenciar a memória internamente. Porém os interesses comerciais certamente atrapalhariam esta evolução.

Mas qual a vantagem de se padronizar isso? A principal delas é a padronização, ou seja, praticamente acabar com o termo “multiplataforma” pois sendo assim tudo (o que é compilado em bytecode) deveria rodar em qualquer processador. Não sei se os benefícios disto seriam tão bons ao ponto de compensar os problemas que teríamos com a falta de inovação no setor de processadores. Deixando as utopias de lado, isto não é viável num mundo capitalista.

Navegadores

Com a evolução dos navegadores, puxada principalmente pelo Mozilla Firefox, a World Wide Web deixou de ser apenas um conglomerado de páginas de hipertexto, applets Java e JavaScript lento, e passou a ser uma plataforma de computação viável para aqueles aplicativos que estávamos acostumados a instalar em nossos computadores.

Hoje temos o Firefox, Safari, Chrome e Opera. Todos estes com os melhores e mais modernos recursos para possibilitar a evolução desta nova plataforma. Se a Internet fosse dominada por eles a vida de quem desenvolve para a Web seria muito mais agradável. No entanto existe uma pedra no sapato de todos que se chama Microsoft Internet Explorer. Esse software atrasado, retrógrado, que deturpa todo e qualquer padrão da Internet (leia-se: W3C, RFC, etc) – que sozinho pode ser o responsável por aumentar consideravelmente o prazo no desenvolvimento de projetos web em uma porcentagem considerável – infelizmente ainda é o navegador predominante pelo simples fato de que vêm junto com o Microsoft Windows.

A estratégia

Aí é onde entra a estratégia da Google para acabar com este legado de sites que só funcionam em Internet Explorer e deste browser que está empatando a evolução da plataforma. Além das campanhas contra o IE e do exército de navegadores competitivos, criar um sistema operacional livre do IE é a meta de algumas empresas além do Google, mas até o momento nenhuma iniciativa conseguiu desestituir este império ultrapassado. É só uma questão de tempo…

Plataforma?

Eu não pretendo entrar em detalhes sobre os benefícios das aplicações na “nuvem” ou das aplicações “online” ou chame como quiser, principalmente porque a maioria dos benefícios são possíveis sem a necessidade de um navegador como plataforma para tal. Minha indagação aqui é que estão colocando cada vez mais “responsabilidade” em cima dos navegadores e eles têm limites. É como se estivessem virando o estômago do avesso sendo a parte de fora o sistema operacional e a parte de dentro os aplicativos e navegadores.

Os navegadores até conseguem fazer isto, mas às custas de que? Cada vez necessitamos de mais processador, mais memória, só para conseguir fazer o que o coitado do Sistema Operacional já fazia antes.

A seguir uma comparação bem básica de um sistema tradicional com a tal da plataforma web, temos isto:

Arquitetura Tradicional

Arquitetura Tradicional

Arquitetura com Plataforma Web

Arquitetura com Plataforma Web

Hardware é toda parafernália eletrônica que constitui seu computador.

Kernel é o coração do sistema operacional. Muito basicamente ele é o grande maestro que controla o hardware e junto com os drivers e firmwares controla as peculiaridades de cada fabricante e modelo de componente.

Firmware é o software que acompanha o hardware. Podemos incluir aí as BIOSes, EFI, OpenFirmware, etc.

Shells são as interfaces primárias dos sistemas operacionais. Podemos incluir aí os tradicionais shells de linha de comando do Unix/Linux (bash, csh, etc) e os mais populares Windows Explorer e o Finder do Mac OS X.

Aplicativos de Sistema são os programinhas que acompanham o sistema operacional e que servem para alguma coisa mas que não são requisitos para que o sistema funcione.

Aplicativos são os softwares aplicados que normalmente não acompanham o sistema operacional. São os tais programas que as pessoas utilizam quando estão trabalhando e fazendo algo “útil” no computador. Podemos incluir aí os editores de texto, compiladores, planilhas eletrônicas, etc.

A grande diferença entre as duas arquiteturas é que na primeira os aplicativos são nativos, ou seja, são feitos para serem executados dentro de seus sistemas operacionais específicos, e na segunda os aplicativos são feitos para serem executados dentro dos navegadores, quase que independente do que tem abaixo do navegador, ou seja, o sistema operacional.

Sendo assim, não acham que as pessoas que desenvolvem os navegadores não precisam ser tão bons quanto as pessoas que desenvolvem os sistemas operacionais? Será isto é uma realidade hoje? Eu posso estar enganado, mas algo me diz que não (leia-se conhecimento tácito).

Privacidade

Minha principal preocupação a respeito desta nova plataforma é a privacidade. À medida que as pessoas e empresas tornarem os aplicativos web parte do seu dia-a-dia a empresa responsável pelo aplicativo web deterá todas as informações ali colocadas e poderá fazer o que bem entender com elas.

Em um mundo computacional cheio de big brothers qual será a moeda? Quem controlar a informação poderá controlar o mundo. E onde ficam as políticas antitrust?

Conclusão

Como mais um profissional da área eu estou bastante curioso a respeito deste sistema. Não posso dizer o mesmo por pessoas que são apenas usuários de computadores. O que isto vai mudar para elas? Tirem suas próprias conclusões e façam seus comentários… ;-)

Posted in Google, Internet, Opinião | Tagged , , , , , , , , , , , , | Leave a comment

Falando algo em todas as vozes do Mac OS X

Quem já não perdeu um bom tempo fuçando no sintetizador de voz do Mac OS X?

Pra facilitar a vida de quem quer ver como é o sintetizador falar uma determinada frase com todos os timbres de voz eu fiz o script abaixo. É só colocar num arquivo plain-text, dar permissão de execução e rodar o comando com qualquer coisa como parâmetro que ele sairá falando.

#!/bin/bash
for i in `ls -1 /System/Library/Speech/Voices/`
do
 voice=`echo $i | cut -d. -f1 | sed 's/\([a-z]\)\([A-Z]\)/\1 \2/g'`
 echo "$voice is saying \"$@\""
 say -v "$voice" "$@"
done

Exemplo de execução:

$ ./falatudo.sh Hello World
Posted in Apple, Programação, Shell | Tagged , , , , | Leave a comment

Netatalk: DB_VERSION_MISMATCH

Recentemente me deparei com um mal comportamento do meu “Time Capsule” feito em casa. Quando tentava acessar os compartilhamentos pelo Finder, ele não conseguia conectar. Nos logs apareciam erros como este:

cnid_open: dbenv->open (rw) of /Volumes/Storage/.AppleDB failed:
DB_VERSION_MISMATCH: Database environment version mismatch

Foi então que percebi que na última atualização do Gentoo, o BerkeleyDB havia sido atualizado. O que fiz então foi recompilar o netatalk com o comando abaixo:

# emerge netatalk

E então remover os diretórios .AppleDB do storage:

# find /Volumes/Storage -name '.AppleDB' -exec rm -rfv {} \;

Isto resolveu o problema.

Posted in Apple, Armazenamento, Linux/Unix | Tagged , , , , , , | Leave a comment

Interação Natural – Computação Pervasiva

Estava fuçando no Vimeo e me deparei com este vídeo. Fiquei extasiado com a idéia genial e a produção do vídeo “Hi” que faz parte de um projeto de interação natural chamado Multitouch-Barcelona.

Dos mesmos criadores também há o vídeo “Multitouch Space Invaders Demo”. Mais uma vez a idéia me surpreendeu. É um excelente exemplo do que o futuro nos reserva no que diz respeito à computação pervasiva. Hoje são apenas idéias apresentadas em forma de arte. Amanhã algum Steve Jobs do mercado vai olhar para isto e encontrar um uso comercial para isto.



Posted in Computação, Experiência do Usuário, Opinião | Tagged , , , , , , , , | 1 Comment

Lançado NVIDIA CUDA TOOLKIT e SDK 2.2

No dia 8 de Maio a NVIDIA lançou a versão 2.2 do Toolkit CUDA e SDK. Esta nova versão inclui uma lista enorme de novas funcionalidades. Com esta versão o CUDA também passou a suportar Windows 7.

Veja a lista dos novos recursos: Visual Profiler para a GPU, a interoperabilidade com OpenGL foi melhorada, Texture from Pitch Linear Memory, Zero-copy, Pinned Shared Sysmem, Asynchronous memcopy on Vista, Hardware Debugger for the GPU, Exclusive Device Mode.

Não cheguei a analisar todas as novas funcionalidades, mas de cara já dá para perceber que deve estar bem mais fácil desenvolver para CUDA com esta versão devido aos novos recursos de profiling e debugging.

Para mais informações, acesse o site da NVIDIA no link abaixo (em inglês):

http://www.nvidia.com/object/io_1241818437037.html

Posted in CUDA | Tagged , , , , , | Leave a comment

NAS feito em casa, parte 3 – Time Machine

No primeiro artigo da série descrevi o hardware desde Time Capsule feito em casa. No segundo artigo da série descrevi o processo de instalação e configuração do servidor.

Neste artigo irei descrever o processo de configuração do Time Machine para utilizar o Time Capsule de pobre. É aqui que entram os inconvenientes do Time Capsule feito em casa. Ele não funciona exatamente como o Time Capsule original e por isto é necessário fazer alguns passos a mais para que cumpra seu propósito.

Time Machine

O Time Machine por padrão só utiliza dispositivos de armazenamento conectados localmente (via USB ou Firewire) ou o Time Capsule. É necessário configurar uma opção escondida nele para que possibilite a escolha de outros dispositivos como armazenamento dos backups. Para fazer isto, abra um Terminal e execute o comando abaixo. É necessário repetir este comando em todos os Macs que for utilizar o servidor de Time Capsule feito em casa:

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

Deixe um Terminal aberto e uma conexão SSH aberta direta com o servidor. Fique no diretório ~usuario/.TimeMachine que mais tarde será utilizado pelo Time Machine para gravar a imagem do backup.

$ ssh root@Atomix
# cd ~herbert/.TimeMachine

Com o Finder, conecte no compartilhamento apropriado do Time Machine para seu usuário. Lembre-se de que o usuário e a senha são os mesmos que foram criados no servidor Linux e cadastrados na configuração do Netatalk. Veja na foto abaixo qual é o compartilhamento que eu acessei:

É necessário conectar no compartilhamento antes de configurar o Time Machine pela primeira vez

É necessário conectar no compartilhamento antes de configurar o Time Machine pela primeira vez

Agora abra o System Preferences, escolha a opção Time Machine e clique no botão Change Disk. Uma lista com os dispositivos aceitos aparecerá. Se seguiu o artigo 2 conforme descrito, dentre elas deverá aparecer um item com o nome do usuário que está acessando o servidor seguido da palavra TimeCapsule e o nome do servidor entre parênteses, conforme a imagem abaixo. Após a seleção clique em Use for Backup:

Selecione o compartilhamento apropriado para o Time Machine de seu usuário

Selecione o compartilhamento apropriado para o Time Machine de seu usuário

Agora o Time Machine tentará efetuar a inicialização. Enquanto ele inicializa, no terminal SSH que está conectado no servidor, fique listando o conteúdo do diretório ~usuario/.TimeMachine até que apareça um arquivo/diretório com a extensão .sparsebundle. Copie o nome do arquivo para um editor de texto e remova o .tmp que faz parte do nome, como no exemplo abaixo:

Silver Surfer_0a1e5ba8b8c1.tmp.sparsebundle

… se torna …

Silver Surfer_0a1e5ba8b8c1.sparsebundle

Este será o nome do arquivo da imagem que deverá ser criada manualmente, pois o Time Machine não conseguirá criá-la automaticamente e acusará um erro. O nome é composto do nome do Mac que fará seus backups remotos, seguido pelo endereço MAC de sua placa de rede e a extensão do arquivo.

Lembra quando mencionei os problemas de compatibilidade do AFP 3.2 e o Netatalk 2.0.3 no artigo 2? Então. É disso que eu estava falando. ;-)

Para criar a imagem sparsebundle abra o Disk Utility, clique em New Image e utilize como nome de arquivo em Sabe As o nome da imagem sparsebundle sem o .tmp que foi gerado anteriormente. Salve a imagem no Desktop em Where. Em Volume Name coloque algo como “Backup of NomeDoComputador”. Em Volume Size, recomendo colocar um tamanho que seja no mínimo 2x o tamanho do HD do Mac. Em Volume Format utilize Mac OS Extended (Journaled). Em Encryption utilize none. Em Partitions utilize Single partition – Apple Partition Map, e em Image Format utilize sparse bundle disk image. Utilize a imagem abaixo como referência.

Crie a imagem sparsebundle com o Disk Utility

Crie a imagem sparsebundle com o Disk Utility

Após preencher tudo, clique em Create. Um arquivo sparsebundle será criado em seu Desktop e imediatamente será montado no Finder. Desmonte a imagem “Backup of NomeDoComputador” e mova o arquivo sparsebundle criado para o servidor no compartilhamento do TimeMachine para o usuário em questão. No meu caso ele ficou dentro do compartilhamento “herbert TimeMachine”.

Pronto. Agora o Time Machine conseguirá efetuar os backups automaticamente. O primeiro backup geralmente é o maior deles e demora um bocado dependendo da conexão entre seu Mac e o servidor. Eu recomendo fazer o primeiro backup através de uma conexão Ethernet Gigabit. Os próximos backups, quanto mais próximos uns dos outros, menor será a quantidade de informações a ser transferida e, portanto, serão mais rápidas.

O Time Machine tenta fazer backups automáticos em períodos curtos. O servidor deverá estar ligado para isto. Caso não esteja o Time Machine ignora e não faz nenhum backup. Ele só irá reclamar se passar mais do que 7 dias do último backup.

Não é necessário montar os compartilhamentos de rede para o Time Machine funcionar. Ele mesmo detecta tudo e monta/desmonta o que for preciso. ;-)

Recomendo deixar a opção “Show Time Machine status in the menu bar” habilitada. Desta forma um ícone que lembra o símbolo da Skol ficará no menu do Mac. Quando o Time Machine estiver trabalhando, este ícone ficará girando. Através dele também é possível saber a data e hora do último backup, bem como forçar o Time Machine para fazer os backups. Também é possível entrar no Time Machine para recuperar arquivos quando necessário.

Por enquanto é só. Futuramente pretendo escrever sobre atualizações do Netatalk, e talvez até experimentar utilizar um Hackintosh ao invés de Linux como servidor de Time Machine.

Posted in Apple, Armazenamento, Linux/Unix | Tagged , , , , , | Leave a comment

NAS feito em casa, parte 2 – o Software

No primeiro artigo sobre este assunto eu mencionei a lista de componentes de hardware. Neste artigo irei descrever brevemente o processo de configuração do NAS/Time Capsule de pobre. Caso queira mais informações a respeito de cada processo, verifique as referências no final deste artigo.

Gentoo Linux

Preferencialmente utilizo normalmente Gentoo Linux para servidores. É uma distribuição muito bem projetada e organizada. Seu modelo de configuração e manutenção é bastante consistente e fácil de manter. O único ponto negativo a meu ver é a demora para instalar softwares pois estes devem ser compilados. Esta demora pode ser amenizada com o uso de ccache no portage.

Pré-requisitos

  1. É necessário saber utilizar Linux. Meu propósito aqui não é ensinar todas as tecnologias envolvidas, mas sim, mostrar como configurar o NAS para funcionar parcialmente como um “Time Capsule”;
  2. Linux 2.6.28 ou mais recente. Não testei com versões inferiores;
  3. Netatalk 2.0.3 ou mais recente. Não testei com versões inferiores;
  4. Avahi 0.6.24 ou mais recente. Não testei com versões inferiores;

Primeiros passos

  1. Instalar o Gentoo Linux. A instalação pode parecer complicada, pois por padrão é praticamente toda manual. Existe a opção de utilizar o instalador gráfico existente no LiveCD, mas por uma questão de gosto pessoal eu não utilizo. Para saber mais veja aqui. Eu instalei o Gentoo Linux inteiro no Compact Flash. Como o Compact Flash estava configurado para ser Master no canal IDE, durante toda a instalação ele foi acessado através do dispositivo /dev/hda.
  2. Já que o Compact Flash é um pouco lento para escrita, para otimizar a compilação de programas criei uma partição tmpfs para o diretório de compilação do portage. Meu fstab inclui a linha abaixo:
    1. shm            /var/tmp/portage    tmpfs    nodev,uid=250,gid=250    0 0
  3. Configurei o kernel apropriado para a placa D945GCLF incluindo alguns acessórios USB que pretendo utilizar no futuro (bluetooth e webcam). Se estiver utilizando a mesma placa e quiser poupar tempo, baixe aqui a configuração pronta do kernel 2.6.28 para a placa mãe Intel D945GCLF. Para utilizar a configuração, é só descompactar com gunzip e movê-la para o arquivo .config dentro do diretório de código fonte de seu kernel atual (/usr/src/linux) e prosseguir com a compilação e instalação do kernel. Se estiver utilizando um kernel mais recente, não tem problema, é só utilizar o comando make oldconfig e responder as questões que estiverem faltando configurar.
    1. ATENÇÃO: A configuração de kernel que utilizo não tem habilitado o uso de dispositivos IDE, o que faz com que o Compact Flash seja acessado através do dispositivo /dev/sda ao invés de /dev/hda. Considere isto quando for editar o arquivo /etc/fstab e quando for configurar o Grub.

Configuração do RAID

A placa mãe que utilizei não possui recursos de RAID via hardware, portanto fiz RAID-1 via software com o próprio Linux e mdadm. Para configurar o RAID, faça o seguinte:

  1. Instale o mdadm no Gentoo
    1. emerge mdadm
  2. Crie apenas uma partição em cada um dos HDs de 1.5TB com o tamanho máximo possível. Normalmente eu utilizo o cfdisk para fazer isto:
    1. cfdisk /dev/sdb
    2. cfdisk /dev/sdc
  3. Configure o RAID-1 (espelhamento) com mdadm:
    1. mdadm --create --verbose /dev/md0 --level=1 \
          --raid-devices=2 /dev/sdb1 /dev/sdc1
    2. A combinação de kernel e mdadm que utilizei faz a detecção automática do RAID durante o boot. Isto faz com que não seja necessário nenhum outro passo de configuração do RAID, além do mencionado acima;
    3. Recomendo aguardar o término da reconstrução do RAID-1. Com o hardware que utilizei, a reconstrução levou cerca de 3 horas para terminar. Para saber o estado da reconstrução, monitore o arquivo /proc/mdstat;
  4. Formate a partição do RAID-1 com seu sistema de arquivos preferido. Eu utilizei ext3 neste momento, mas pretendo migrar para ext4 após algumas versões novas de kernel. ;-)
    1. mke2fs -j /dev/md0
  5. Crie o ponto de montagem de sua partição de armazenamento. Eu utilizei um padrão semelhante ao do Mac OS X, criando em /Volumes/Storage:
    1. mkdir -p /Volumes/Storage
  6. Configure o /etc/fstab para montar automaticamente a partição de armazenamento. A linha do meu fstab ficou conforme o exemplo abaixo, já com algumas opções de otimização:
    1. /dev/md0  /Volumes/Storage   ext3   noatime   0 0
  7. Neste ponto recomendo um reboot do servidor, para que seja um teste se as partições serão montadas como esperado.

Netatalk

O Netatalk implementa o protocolo AFP (Apple Filing Protocol) que é um protocolo de rede que oferece serviços de tranferência de arquivos para o Mac OS X. Para aqueles que não estão acostumados com o AFP, ele serve o mesmo propósito que o protocolo SMB da plataforma Windows e o protocolo NFS da plataforma Unix.

Mas então porque não utilizar SMB ou NFS para o Time Capsule? Em teoria todos estes deverão funcionar, no entanto a utilização de AFP trará algumas vantagens futuras, quando o Netatalk 2.1 for lançado.

Compatibilidade do Netatalk com Mac OS X Leopard

A atual versão do Netatalk (2.0.3) implementa a espeficação do AFP 3.1. O Mac OS X Leopard implementa o AFP 3.2. Apesar da diferença ser pequena, é o suficiente para complicar um pouco a configuração desde Time Capsule de pobre. O AFP 3.2 implementa alguns comandos internos novos que só serão implementados na versão 2.1 do Netatalk. Segundo algumas listas de discussões estas funções já foram implementadas no código fonte da árvore HEAD do desenvolvimento do Netatalk. Se quiser arriscar esta versão, será necessário baixar o código através do CVS.

Apesar desta incompatibilidade, é possível utilizar perfeitamente o Netatalk 2.0.x como servidor AFP para o Time Machine. As únicas ressalvas são:

  1. O primeiro backup do Time Machine exige uma intervenção manual para criar uma imagem sparsebundle. Quando chegar a hora irei mostrar como se faz;
  2. Não deixe o disco encher. Alguns rumores espalhados por fóruns na Internet advertem que se o disco encher o backup se auto destruirá. Mais informações aqui. Futuramente pretendo adotar uma das soluções encontradas para evitar este problema e caso consiga, documentarei neste blog.

Instalação e Configuração

  1. Instale o netatalk no Gentoo:
    1. emerge netatalk
  2. Crie o usuário guest que será utilizado sempre que algum Mac tentar conectar no servidor sem utilizar usuário e senha. Este passo não é obrigatório, mas é interessante deixar alguns compartilhamentos acessíveis para visitas, como por exemplo o diretório de Downloads ou de Músicas:
    1. useradd -d /Volumes/Storage/Guest -m -g users -s /bin/false guest
  3. Adicione a linha abaixo no /etc/netatalk/afpd.conf. Esta é a única linha de configuração no arquivo. As demais linhas do arquivo são apenas comentários:
    1. - -transall -uamlist uams_randnum.so,uams_dhx.so,uams_guest.so
          -nosavepassword -advertise_ssh -guestname "guest"
  4. Altere as linhas abaixo do arquivo /etc/netatalk/netatalk.conf conforme exemplificado:
    1. ATALKD_RUN=no
    2. PAPD_RUN=no
    3. CNID_METAD_RUN=yes
    4. AFPD_RUN=yes
    5. TIMELORD_RUN=no
    6. A2BOOT_RUN=no
    7. AFPD_GUEST=guest
  5. Crie os usuários que terão seu diretório home no storage, bem como o diretório de seus backups do Time Machine:
    1. useradd -d /Volumes/Storage/Herbert -m -g users -s /bin/false herbert
    2. passwd herbert
    3. mkdir ~herbert/.TimeMachine/
  6. Configure os compartilhamentos do Netatalk no arquivo /etc/netatalk/AppleVolumes.default. A primeira linha configura o compartilhamento do diretório home de cada usuário. Dependendo de qual usuário utilizar na autenticação via Finder, aparecerá seu respectivo home. A segunda linha configura o diretório .TimeMachine que será utilizado como raiz para os backups:
    1. ~/ "$u" allow:herbert cnidscheme:cdb options:usedots,upriv
    2. ~/.TimeMachine "$u TimeMachine" allow:herbert,fulano
          cnidscheme:cdb options:usedots,upriv
  7. (opcional) Configure outros compartilhamentos, como Downloads, um diretório Shared (compartilhado) para troca de arquivos, etc:
    1. /Volumes/Storage/Downloads $b allow:herbert,fulano,ciclano,guest
          cnidscheme:cdb options:usedots,upriv
    2. /Volumes/Storage/Shared $b allow:herbert,fulano,guest
          cnidscheme:cdb options:usedots,upriv
  8. Execute o netatalk e configure-o para inicializar automaticamente no boot:
    1. /etc/init.d/atalk start
    2. rc-update add atalk default

Neste ponto já é possível acessar os compartilhamentos via rede, mas somente através do Command-K no Finder (ou menu Go -> Connect to Server…).

Avahi

Avahi é um daemon de descoberta de serviços de rede e fará com que o servidor apareça automáticamente no Finder. Para instalá-lo, siga os passos descritos abaixo:

  1. Habilite opções de compilação do avahi:
    1. echo net-dns/avahi howl-compat mdnsresponder-compat dbus \
          >> /etc/portage/package.use
  2. Compile o avahi:
    1. emerge avahi
  3. Crie o arquivo /etc/avahi/services/afpd.service e coloque o conteúdo abaixo:
    1. <?xml version="1.0" standalone='no'?>
      <!DOCTYPE service-group SYSTEM "avahi-service.dtd">
      <service-group>
      	<name replace-wildcards="yes">%h</name>
      	<service>
      		<type>_afpovertcp._tcp</type>
      		<port>548</port>
      	</service>
      	<service>
      		<type>_device-info._tcp</type>
      		<port>0</port>
      		<txt-record>model=AirPort</txt-record>
      	</service>
      </service-group>
      
  4. Execute o avahi e configure-o para executar automaticamente na inicialização do servidor:
    1. /etc/init.d/avahi-daemon start
    2. rc-update add avahi-daemon default

Pronto! Em alguns instantes o Finder de seu Mac deverá exibir o servidor na lista do menu lateral esquerdo. :-)

Sugestões

Caso queira utilizar este storage com Windows, recomendo a instalação do Samba e sua configuração de forma que permita acessar os compartilhamentos da mesma forma que o Netatalk foi configurado.

Em seguida…

No próximo artigo desta série irei descrever o processo para configurar o Time Machine de forma que consiga utilizar o servidor para efetuar seus backups.

Referências

http://www.kremalicious.com/2008/06/ubuntu-as-mac-file-server-and-time-machine-volume/

http://episteme.arstechnica.com/eve/forums/a/tpc/f/942005082731/m/370002065931?r=782005065931#782005065931

http://en.gentoo-wiki.com/wiki/RAID/Software

http://www.gentoo-wiki.info/HOWTO_Share_Directories_via_AFP

http://en.gentoo-wiki.com/wiki/Share_Directories_using_AFP

http://en.wikipedia.org/wiki/Apple_Filing_Protocol

Posted in Apple, Armazenamento, Linux/Unix | Tagged , , , , , , , , , | 1 Comment

NAS feito em casa, parte 1 – o Hardware

Na atual modernidade, a maioria de nossas atividades são armazenadas de forma digital. São documentos, fotos, músicas, programas, etc, todos guardados num pequeno dispositivo. É muita responsabilidade para um dispositivo eletrônico que é sensível o bastante para parar de funcionar sem aviso prévio, e é o que acontece normalmente.

Já fazia algum tempo que eu mantinha em casa um pequeno servidor Linux para armazenar cópias dos arquivos mais importantes. No entanto era tudo muito simples e nada era automatizado. Por sorte eu não precisei utilizar o backup por conta de alguma falha de hardware. Por outro lado, como hoje eu utilizo notebook na maior parte do tempo, estou mais suscetível a falhas de hardware.

Antes de utilizar Mac eu nunca havia me interessado por softwares de backup para automatizar este processo. Nenhum deles me pareceu confiável o bastante para funcionar quando mais se precisa deles. Foi aí então que eu conheci o Time Machine, que acompanha o Mac OS X Leopard. Além de ter uma interface muito simples, ele funciona muito bem para o dia-a-dia. No entanto ele só faz backup num dispositivo externo ligado ao computador (HD externo USB/Firewire) ou num dispositivo chamado de Time Capsule que é vendido pela Apple ao custo de US$ 499 para 1TB de espaço. E isto lá nos EUA. Ao trazer para cá um aparelho destes chega a ter seu custo proibitivo para muitas pessoas.

E eu só precisava de um servidor com mais espaço em disco, pois o que tinha não dava para fazer backup de todos os computadores daqui de casa. Com um pouco de tempo pude juntar as peças para montar o que será meu maior dispositivo de armazenamento pessoal que já tive até hoje.

A lista de compras:

TOTAL: Um storage que terá 50% mais espaço e mais confiabilidade do que o Time Capsule de 1TB por um valor ~30% menor.

OBS.: O Time Capsule de maior capacidade existente hoje possui apenas 1 HD interno de 1TB, ou seja, se este HD falhar, vai tudo para a cucuia. Se quiser economizar e colocar apenas 1 HD também, este mesmo storage sairá bem mais barato (~55% menor), mas correrá o mesmo risco.

Apesar do Time Capsule ser um roteador Wifi e um mini switch Ethernet, não é este o propósito do meu próprio Time Capsule. Alias, ter todos estes componentes num produto único, só vai dar mais dores de cabeça quando apresentar alguma falha e você ficar sem storage e sem wifi ao mesmo tempo. Eu ainda prefiro ter estas funções separadas, mesmo ao custo de mais espaço físico.

Além da vantagem de ter 1 HD a mais para espelhamento, montei o projeto de forma que o sistema operacional fique instalado no Compact Flash, facilitando upgrades futuros, gastando menos energia em stand-by, etc.

Desta pequena-grande lista, vale a pena fazer uma menção honrosa à placa mãe. É uma placa de baixo custo da Intel, já com processador Intel Atom 230 embutido. Acredite se quiser, mas o processador só tem um dissipador de calor em cima. Quem está abaixo do cooler é o northbridge da placa mãe. Seu desempenho é muito satisfatório para a finalidade e seu consumo de energia tão baixo que o conjunto todo (com HDs) não vai gastar mais do que 45W.

A única reclamação que deixo registrada é com a documentação que acompanha a placa mãe. Além de ser ruim de manusear, pois se trata de um imenso papel dobrado diversas vezes, contém alguns erros grosseiros como o encontrado na imagem abaixo, que podem atrapalhar e/ou atrasar a montagem, principalmente quando os cabos não possuem bons referenciais:

Erro no manual da Intel D945GCLFBR

Erro no manual da Intel D945GCLFBR

Como já tinha um gabinete com fonte, resolvi aproveitá-lo. Ele não se parece nada com um NAS, mas certamente é o melhor no quesito dissipação de calor, justamente pelo espaço interno.

Seguem algumas fotos dos componentes:

Adaptador CF2IDE e Compact=

Adaptador CF2IDE e Compact Flash

Placa mãe e HDs

Placa mãe e HDs

Intel D945GCLFBR

Intel D945GCLFBR

Placa mãe já montada num gabinete ATX

Placa mãe já montada num gabinete ATX

Não irei entrar em detalhes sobre como montar as peças do hardware. Alias se pretende fazer o mesmo montando um dispositivo destes, é pré-requisito saber montar computadores, instalar Linux e utilizar pelo menos o vim.

Por enquanto é tudo. No próximo post irei documentar o processo de configuração do Linux para que se torne um NAS / Time Capsule.

Atualização 02/08/2010: Após ter algumas falhas estranhas com o CF, resolvi trocá-lo por uma HD IDE que estava sobrando aqui em casa. Hoje tenho 3 HDs no computador e configurei o tempo de sleep dos HDs de armazenamento para um valor baixo. Hoje eu também utilizo este computador com outras finalidades, como ver vídeos via DLNA com o PS3 Media Server, armazenar backups de CDs e DVDs, etc. Eu não tenho costume de deixá-lo ligado direto pois não faz sentido, mesmo gastando relativamente pouca energia.

Posted in Armazenamento, Hardware, Linux/Unix, Programação | Tagged , , , , , , , , | 8 Comments

CUDA no Max OS X

CUDA é uma arquitetura para computação paralela em GPUs da NVIDIA. Basicamente é um conjunto de ferramentas e uma linguagem C para programar as GPUs da NVIDIA.

Há suporte para Linux, Windows e Mac OS X, tanto em 32 bits como em 64 bits.

Para instalar no Mac OS X, segui os seguintes passos.

Requerimentos

Hardware

Software

Baixe os seguintes itens no endereço: http://www.nvidia.com/object/cuda_get.html

  • CUDA toolkit: CUDA Toolkit 2.1 for Mac OS X
  • CUDA SDK: CUDA SDK 2.1 code samples for Mac OS X

Instalando

  1. Primeiro instale o Toolkit. Clique na opção Customized e certifique-se de que todas as opcões estão habilitadas:
  2. cuda-toolkitReinicie seu computador, conforme a instalação do Toolkit solicitou;
  3. Instale o SDK
  4. Para compilar os exemplos que acompanham o SDK, é necessário adicionar as seguintes linhas no seu arquivo ~/.bash_profile. Normalmente este arquivo não existe, então é necessário criá-lo. Para isto utilize seu editor de texto puro preferido, coloque as linhas abaixo e salve no seu diretório home com o nome .bash_profile:
    export PATH=/usr/local/cuda/bin:$PATH
    export DYLD_LIBRARY_PATH=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH

Testando

Para compilar os exemplos do SDK, abra um Terminal e:

$ cd /Developer/CUDA
$ make
$ make dbg=1
$ make emu=1
$ make emu=1 dbg=1

As opções acima irão criar diretórios variados em /Developer/CUDA/bin/darwin/ com diversas versões dos binários de exemplo. Para deixar mais claro, dbg compila versões para debug e emu compila versões que rodam sob emulação na própria CPU. Embora nos leve a crer que seja possível executar estes exemplos sem uma GPU da NVIDIA, é um mero engano. Num teste realizado com um MacBook sem GPU NVIDIA, nem em modo emulado executou.

Benchmark

A seguir um pequeno benchmark comparando a uma simulação n-body com GPU e sem GPU (modo emulado):

$ cd /Developer/CUDA
$ bin/darwin/release/nbody -benchmark -n=1000
Run "nbody -benchmark -n=<numBodies>" to measure perfomance.

1000 bodies, total time for 100 iterations: 47.264 ms
= 2.116 billion interactions per second
= 42.316 GFLOP/s at 20 flops per interaction

$ bin/darwin/emurelease/nbody -benchmark -n=1000
Run "nbody -benchmark -n=<numBodies>" to measure perfomance.

1000 bodies, total time for 100 iterations: 5305.616 ms
= 0.019 billion interactions per second
= 0.377 GFLOP/s at 20 flops per interaction

Apesar do modo emulado provavelmente ser mais lento do que um código desenvolvido especialmente para CPUs, dá para se ter uma boa noção do poder de processamento das GPUs. Os resultados mostraram que a GPU foi cerca de 112x mais rápida do que a CPU!

Eye Candy

Um pouco de “doce para os olhos”. Aqui rodei o exemplo nbody e capturei sua tela:

$ cd /Developer/CUDA
$ bin/darwin/release/nbody

cuda-nbody1

Referências

Posted in CUDA, HPC | Tagged , , , , , | 2 Comments

Barra de status no GNU Screen

GNU Screen é um gerenciador de janelas “tela-cheia” para terminais. Seu uso em geral agiliza a administração remota de servidores pelo simples fato de ser necessário abrir apenas uma conexão SSH e através desta se pode ter vários terminais.

Uma outra vantagem em utilizar o GNU Screen, é deixar o gerenciador e retomá-lo sempre que precisar. Isso significa que você pode desconectar do servidor e deixar o gerenciador aberto com todas as “janelas” e processos rodando. Não só traz um benefício proposital, mas também pode salvar seu dia caso não tenha uma conexão estável com o servidor remoto.

Por estas e outras razões eu sempre utilizo GNU Screen quando possível (quando está instalado no servidor remoto).

No entanto por padrão ele não é muito amigável pois não exibe nenhuma informação na tela, sendo necessário utilizar atalhos de teclado para ver quais janelas estão abertas.

Após muito fuçar (e isso já faz um bom tempo) eu consegui criar uma configuração padrão, para meus Screens, que mostra uma barra de informações na parte inferior da tela.

A configuração abaixo pode ser colocada no /etc/screenrc ou no ~/.screenrc. Dependendo de onde colocar, ela valerá para todo o sistema ou somente para o usuário corrente, respectivamente.

vbell off
hardstatus off
backtick 1 1200 1200 whoami
caption always "%{= cW} %c | %l | %-Lw%{= bW}%65> [%n] %t %f* %{-}%+Lw%<"

A partir deste exemplo, você pode personalizar sua barra de status da forma que quiser. São dezenas de opções que ao invés de citar aqui, recomendo que leia no manual do próprio screen (man screen).

Veja como ficou:

captura de tela do terminal rodando screen

captura de tela do terminal rodando screen

Observe que no rodapé do terminal encontra-se várias informações: Relógio, Load Average e a lista de janelas. A janela atual aparece destacada em azul.

É isso aí… ;-)

Posted in Linux/Unix, Shell | Tagged , , , , , | Leave a comment

Instalando Erlang no Mac OS X Leopard


Fanboy

Recentemente migrei para o mundo Mac com a compra de um MacBook Pro. Embora seja um equipamento caro, ao se comparar com outros notebooks com a mesma capacidade de hardware ele chega até a ser mais barato. Compare com um Sony Vaio com as mesmas especificações. Sendo assim, preferi investir num Mac que geralmente atinge melhor valor de revenda do que um PC.

Erlang

Erlang é uma linguagem de programação funcional criada pela Ericsson em 1987 que tem foco em concorrência, sistemas distribuídos e tolerância a falhas. Ultimamente vêm se tornando muito conhecida graças a seus recursos de concorrência e ao foco da computação em paralelismo ao invés de mais ciclos de processamento para escalabilidade.

Para prosseguir com meus breves estudos de Erlang, resolvi instalá-lo no Mac. Cheguei a pensar em instalar ele numa máquina virtual VMware ou Parallels, mas isso envolveria a aquisição destes softwares. Além disso eu não estaria aproveitando 100% do hardware para testar a capacidade do Erlang.

Bom, vamos ao que interessa.

Requisitos

Compilar e instalar

Eu criei uma pasta dentro do home do meu usuário e deixei lá dentro tudo o que precisei para compilar o Erlang.

Os comandos abaixo estão de acordo com as versões que utilizei. Caso utilize uma versão diferente, faça as devidas alterações nos nomes de arquivos e diretórios. Caso descubra alguma particularidade da versão, fique à vontade para comentar no final deste post.

$ tar xvzf otp_src_R13A.tar.gz
$ cd otp_src_R13A
$ ./configure --enable-hipe --enable-smp-support --enable-threads
$ make
$ sudo make install

Para testar o Erlang:

$ erl

Você verá algo assim:

Erlang R13A (erts-5.7)  [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7  (abort with ^G)
1>

Para sair pressione Ctrl-C e depois escolha a opção (a) e pressione ENTER.

BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a

O caminho padrão de instalação (prefix) é /usr/local. Caso queira utilizar outro prefixo, é necessário utilizar a opção –prefix no comando configure.

Documentação

Para instalar a documentação em formato man, utilize o seguinte comando:

$ sudo tar xvzf otp_doc_man_R13A.tar.gz -C /usr/local/share

Para testar a documentação:

$ man erl

Testando

Para testar se o básico está funcionando, crie um arquivo chamado hello.erl com o código abaixo. A palavra werld é um trocadilho de world com erlang:

-module(hello).
-export([hello_werld/0]).

hello_werld()->
    io:format("Hello WErld ~n").

Para compilar e executar o teste:

$ erl -compile hello
$ erl -noshell -s hello hello_werld -s init stop

That’s all folks… ;-)

Posted in Erlang, Escalabilidade, Programação | Tagged , , | Leave a comment