Skip to content

Monthly Archives: May 2008

Analogias às propagandas da Microsoft na Linux Magazine

13-May-08

Eu estava debatendo hoje com o meu amigo Marcos Miklos no GTalk a respeito das propagandas da Microsoft na Revista Linux Magazine. Na opinião dele isso está completamente errado, uma vez que a Microsoft não apóia/pratica o Software Livre, e portanto a Linux Magazine não deveria permitir esse tipo de coisa… Eu não concordei e contra-argumentei:

Nesse caso é diferente, é como você entrar na torcida do Flamengo e dizer que o Vasco é o melhor… Não vai adiantar nada! Você só vai perder tempo (e dinheiro, no caso deles) e ainda correr um grande risco de ser enxovalhado. Deixa eles lá, financiando o linux, nem que seja somente a revista… é bom para a gente.

E então eis que surge a pérola:

Imagina você comprando uma Playboy, uma revista para homens, com mulheres nuas, e vendo uma propaganda da G Magazine com um homem mostrando o bilau e dizendo: “Venha para o lado rosa da força, é muito mais legal”.

Hahaha… Simplesmente sensacional a analogia!

Depois ele me disse que essa discussão já estava rolando há algum tempo na Comunidade Linux Brasil e que esse comentário foi feito pelo Gabriel Pnordico. Leiam a discussão porque vale a pena, está bem engraçada! Depois lendo o tópico na íntegra eu encontrei outra pérola como:

É como se você tivesse uma namorada e ela usasse uma camiseta dizendo que ama o padeiro da esquina

dita pelo Lord Heizel.

Django, download e o problema no Internet Explorer 7

09-May-08

Há pouco tempo atrás eu postei aqui no blog como forçar o download de arquivos com Django.

Na época eu havia testado o sistema em todos os navegadores que estavam ao meu alcance (Firefox, Iceweasel, Opera, Epiphany, IE6 e IE7) porém mesmo assim não precisou de muito tempo em ambiente de produção para me contactarem dizendo que o sistema não estava funcionando no IE7 (ué, como assim!? mas eu tinha testado isso!).

Testei novamente e então descobri que na verdade ele funcionava e não funcionava. Hm, ok… mas como assim!? Na verdade ele funcionava perfeitamente no IE7 do Windows 2003 Server, mas não funcionava em nenhum outro e eu dei o azar (ou sorte) de testar justamente nele… no Windows 2003 Server. Nos Windows com problemas (pleonasmo?) o erro que ocorria era o seguinte:

Internet Explorer was not able to open this Internet site.
The requested site is either unavailable or cannot be found. Please try again later.

Ok, um erro muito explicativo… Então vamos ao Google! Depois de muito procurar no Google sem encontrar nenhuma solução, um colega de empresa decidiu comparar os headers de uma aplicação escrita em .NET e que funcionava em qualquer IE, com os headers gerados pela minha aplicação. Chegamos a conclusão de que o problema estava no campo Vary, que aparecia nos headers do Django mas não existia no header da aplicação .NET.

A primeira idéia foi remover o campo manualmente, antes de retornar o response da página:


from django.http import HttpResponse, Http404
from os import path
import mimetypes

def index(request, file=''):
    abspath = path.join('/your/absolute/path', file)
    if not (file and path.exists(abspath)):
        raise Http404()
    mimetype, encoding = mimetypes.guess_type(abspath)
    if mimetype is None:
        mimetype = 'application/force-download'
    response = HttpResponse(open(abspath, 'r').read())
    response['Content-Disposition'] = 'attachment; filename=%s' % file
    response['Content-Type'] = mimetype
    response['Content-Length'] = str(path.getsize(abspath))
    del response['Vary']
    return response

* As linhas em negritos são as linhas que foram alteradas na solução inicial.

Mas não funcionou… O campo Vary continuava aparecendo e com o mesmo valor de antes. Lendo um pouco de documentação, descobrimos que essa diretiva não pode ser alterada diretamente no header da página e também qual era a forma correta de remover esse campo:


from django.views.decorators.cache import cache_control
from django.http import HttpResponse, Http404
from os import path
import mimetypes

@cache_control(private=True)
def index(request, file=''):
    abspath = path.join('/your/absolute/path', file)
    if not (file and path.exists(abspath)):
        raise Http404()
    mimetype, encoding = mimetypes.guess_type(abspath)
    if mimetype is None:
        mimetype = 'application/force-download'
    response = HttpResponse(open(abspath, 'r').read())
    response['Content-Disposition'] = 'attachment; filename=%s' % file
    response['Content-Type'] = mimetype
    response['Content-Length'] = str(path.getsize(abspath))
    return response

* As linhas em negritos são as linhas que foram alteradas na solução inicial.

Ok, agora sim! Tudo funcionando direitinho e em todos os (pseudo-)navegadores!

Como eu não achei nada na internet que ligasse esse problema aos campos Vary do header, acredito que esse post possa ajudar alguém mais que esteja passando pelo menos problema! :)

UPDATE: Em alguns casos a conexão terminava antes de ter baixado todo o arquivo. Esse é um problema do servidor, e para corrigi-lo basta definir a diretiva EnableSendfile do Apache como On. Com essa configuração, também houve uma melhora significativa na taxa de download do servidor (pelo menos no meu caso).

Quero instalar linux, como particionar meu HD?

04-May-08

Apesar deste post ser mais voltado para aquelas pessoas que têm vontade de instalar o linux mas nunca o fizeram, eu acredito que ele pode ser de grande utilidade para todo mundo, inclusive para mim (através dos comentários). Aqui eu mostro a forma como geralmente particiono o meu HD e o porquê de cada configuração.

No dia 24 do último mês foi lançada a versão 8.04 do Ubuntu, chamada de Ubuntu Hardy. Nessas épocas, onde geralmente as pessoas (re)instalam suas máquinas, uma pergunta que se torna bastante comum é: Quero instalar o linux, como particionar meu HD?

Para instalar o linux você precisa a princípio de duas partições, uma para o sistema em si e outra que trabalha como memória virtual, chamada de swap. Porém essa estrutura pode ser modificada para garantir maior confiabilidade e organização. O linux permite que você trabalhe com um sistema distribuído em várias partições e dessa forma, você pode instalar o seu sistema utilizando o / em uma partição, o /home em outra, o /var em outra e por ae vai.

No meu computador, sempre (pelo menos nos últimos anos) utilizo quatro partições organizadas como segue abaixo:

Partições

O exemplo acima foi criado em uma máquina virtual contendo 8.6GB de disco e 512MB de RAM.

Antes de falarmos sobre as partições, vamos comentar algumas outras coisas importantes.

  • Em todas as partições eu utilizo sistema de arquivos ext3 ao invés do reiserfs. Apesar de ambos possuírem journaling, apenas o ext3 faz journaling dos dados dos arquivos.
  • Há muito tempo atrás eu criava uma partição extendida para colocar todas as outras partições do linux dentro. Hoje em dia, eu só uso essas 4 partições, por isso não há necessidade para tanto. Hoje eu prefiro colocar minhas 3 partições de dados como primárias e mante-las na MBR, mas se você possui um outro sistema na sua máquina (como o Windows, por exemplo) é legal fazer isso para deixar tudo o que é do linux junto numa mesma partição extendida.

Mas agora chega de bla-bla-bla e vamos ver o porquê das coisas.

Primeira partição: /boot

No linux, o diretório /boot é o local onde ficam armazenados os arquivos do boot loader do sistema operacional, como o kernel por exemplo. Além de tornar o sistema mais organizado, a separação do diretório /boot evita que você fique sem acesso ao sistema operacional por falta de espaço livre no HD.

Como os arquivos do boot loader não são muito pesados, eu costumo usar apenas 100MB para essa partição, que me permite armazenar umas 3 ou 4 versões de kernel. Já vi pessoas usando desde 50MB até mesmo 200MB para essa partição. Podemos tomar esses três valores como aceitáveis, uma vez que isso depende do número de kernels que você pretende manter disponíveis no seu sistema.

Segunda partição: swap

Sobre a memória swap, é muito comum ouvir que o seu tamanho deve ser sempre o dobro da memória RAM… Ok, legal! Mas porque? Na prática, isso não é uma verdade absoluta. O tamanho da swap tem relação direta com a quantidade de memória RAM da sua máquina e o com o workload máximo. Entretanto o linux é desenvolvido para utilizar a maior quantidade possível de memória RAM, fazendo cache da memória livre. Então vamos assumir que utilizar dobro da memória RAM é um valor aceitável, mesmo sendo um pouco acima do acima do necessário na maior parte dos casos.

A partição de swap trabalha como memória virtual para o sistema operacional, tendo uma alta carga de IO. Então colocar a partição de swap no início do disco traz um ganho de performance para da máquina, uma vez que em teste as primeiras sessões do disco são acessadas de forma mais rápida.

Terceira partição: /

Agora temos o / do sistema operacional em si, sem segredos. Talvez os únicos dois pontos a serem comentados aqui é o tamanho e a separação do /home.

Com relação ao tamanho, em geral não precisa ser muito grande. No exemplo acima eu usei 3,5GB que é o espaço que está sendo utilizado atualmente pelo / do meu computador. Eu sempre utilizo 10GB e nunca tive problemas com falta de espaço, mas se você costuma baixar muitos jogos ou algum outro software que seja grande, pode aumentar o espaço dessa partição conforme a sua necessidade.

A separação do /home é comentada abaixo.

Quarta partição: /home

Como todos puderam perceber, eu monto o / e o /home em partições separadas… Mas porque? Primeiro, porque fica mais organizado, simples assim! Segundo porque quando uma nova versão do Ubuntu for lançada, eu não preciso mais (a não ser que eu realmente queira) formatar essa minha partição. Eu posso instalar a nova versão na partição correspondente ao meu / e configurar para que ela utilize o /home que já está particionado (sem formatar), dessa forma logo após a instalação eu terei uma versão nova do linux com todas as minhas configurações pessoais do sistema antigo. Legal né!? :)

Mais opções…
Caso sua máquina vá trabalhar como servidor de banco de dados, é comum criar uma partição /var separada para armazenar os dados do banco. Você ainda pode utilizar sistemas de arquivos diferentes em cada uma das partições (nesse caso é bom conhecer bem as pecualiridades de cada um dos sistemas de arquivos), como por exemplo, no nosso caso do banco de dados, você poderia utilizar reiserfs para melhorar o desempenho. O importante é que cada caso é um caso e a solução que pode ser boa para um, pode não satisfazer outro.

Bom, esse é um post bem básico mostrando como eu particiono o meu computador.
Como você particiona o seu? O que faz de diferente? O que faz de melhor? Conta ae… :)

UPDATE: No comentáros foram adicionadas várias informações interessantes em resposta a outros usuários. Portanto vale a pena conferir a sessão abaixo, que contém informações de como configurar o seu sistema para utilizar sua partição /home antiga por exemplo.