Arquivos de Autor: Fabricio Leotti

Há bastante tempo eu (lonefreak) e krateria temos batido cabeça tentando entender porque uma aplicação em Rails, que rodava tranquila com Mongrels estava com problemas de lentidão no Apache (em ambos os casos dentro de um FreeBSD. Hoje, enfim, encontramos a solução.

Ao que parece, todo o problema residia na forma como o FastCGI, módulo utilizado pelo Apache, estava tendo problemas para iniciar uma instância do módulo, estivesse ele em modo Dynamic, Static ou External. Depois de fuchar e mexer um bocado, acabamos topando com este tutorial, realmente muito útil e que sugere a utilização de outro módulo, o fcgid. E não é que funcionou mesmo?

E foi relativamente simples de resolver. Leve em consideração que já tínhamos aqui um ambiente estável rodando Rails no Apache, com FastCGI, apenas muito lento. Então as mudanças não foram tantas. Instalamos o pacote do fcgid pelo ports e não pelo gem (o que por si só pode salvar você de muita dor de cabeça) e usamos a biblioteca fcgi_handler, ao invés da fcgi (com ou sem rubygems), como indicado no tutorial.

O fcgid não foi muito comentado e há pouca documentação disponível, mas pareceu muito mais robusto e estável que o FastCGI. Além disso, nos livrou do problema de tentar o Rails com o LigHTTPD.

See ya

Ao tentar subir um serviço no Windows, pode aparecer uma mensagem indicando que o serviço iniciou e parou, e que muitos serviços fazem isso por não terem tarefas a realizar naquele momento. Não se deixe enganar por esse engano estúpido de tratamento de erro do Windows.

Vá ao event log e procure pelo erro ao subir o serviço. Se encontrar algo desse tipo:

Service cannot be started. System.Configuration.ConfigurationErrorsException: Configuration system failed to initialize —> System.Configuration.ConfigurationErrorsException: Invalid character in the given encoding. Line 4, position 33. (C:\path\to\service\config.exe.config line 4) —> System.Xml.XmlException: Invalid character in the given encoding. Line 4, position 33.
at System.Xml.XmlTextReaderImpl.Throw(Exception e)
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32& charsCount)
at System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount)
at System.Xml.XmlTextReaderImpl.ReadData()
at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type, Int32& outStartPos, Int32& outEndPos)
at System.Xml.XmlTextReaderImpl.ParseCDataOrComment(XmlNodeType type)
at System.Xml.XmlTextReaderImpl.ParseComment()
at System.Xml.XmlTextReaderImpl.ParseElementContent()
at System.Xml.XmlTextReaderImpl…

Trata-se certamente do encoding do arquivo de configuração em questão (ou qualquer outro arquivo envolvido no processo). Talvez você tenha alterado o encoding acidentalmente ao editar o arquivo, ou então algum desenvolvedor já tenha repassado o artigo pra você com o encoding incorreto.

Enfim, basta que você altere o encoding do(s) arquivo(s) (nesse caso, utilizei o encoding UTF-8, que deve funcionar na maioria das vezes) e voilá.

Service started successfully.

Particularmente eu gosto de usar o ActiveState Komodo para esta tarefa, mas existem montes de aplicativos para se fazer isso.

See ya

Forçar o download de um arquivo numa aplicação rails, ao invés de deixar o conteúdo ser carregado no navegador é bastante simples.

Tenho visto em vários fóruns uma centena de workarounds utilizando headers bem conhecidos, ou então um header um pouco mais obscuro, que a princípio daria mais velocidade e segurança ao download, mas que só funciona se você roda sua aplicação no Apache ou no Lighttpd, pois usa o mod_xsendfile.

Contudo, o próprio rails possui um método para lidar facilmente com isso, o send_file.

Neste caso eu mantive o caminho e mimetype da imagem em banco de dados após fazer o upload dela. Cobrirei o tópico upload em outro post mais pra frente. Assim, para utilizar o send_file, basta colocar em seu controller:



class MyController < ApplicationController
def downloadFile
# encontra os dados do arquivo procurado através de seu id
@file = myFile.find(params[:id])
# pega o nome do arquivo
filename = #{File.basename(@file.path)}
# pega o mimetype do arquivo
mimetype = @file.mimetype
# veja que o parâmetro disposition está com o valor attachment
send_file "#{RAILS_ROOT}/caminho/do/arquivo/" + filename,
:type => mimetype,
:disposition => 'attachment'
end
# outros métodos de sua classe controller
(...)
end

Com isso, o navegador não é redirecionado para outra página, removendo a necessidade de utilizar headers e o arquivo é enviado para download, já com mimetype reconhecido.

See ya

Por tempo demais adiei a criação desse blog. Tempo demais. Mas como terei ajuda e contribuição, então vamos lá.

Da minha parte o que você vai ver neste blog são descobertas e experimentos com programaçã, sysadmin, etc… Além das sempre pitorescas histórias de usuários que estariam melhores se estivessem mortos.

Se você sabe o que é sentir uma vontade incontinente de programar, de instalar aquele programa, de testar aquele SO, ou então já teve vontade de matar gerentes, coordenadores, desenvolvedores e usuários, seja muito bem vindo.

A idéia do /dev/beleza é ser um blog comunitário, aberto. Idéias e experimentos virão com o tempo. Meu antigo blog continua lá, abandonado. O conteúdo do /dev/beleza será bem diferente, pode apostar.

See ya

O IIS tem, por padrão, o tamanho de 200k para qualquer requisição feita por páginas ASP. Uma requisição de upload por exemplo, pode facilmente ultrapassar esse valor. Sendo assim, é possível configurar o IIS para utilizar outros valores.

Para tanto basta entrar, via prompt do DOS na pasta aInetPubAdminScripts e rodar o seguinte comando:

adsutil set w3svc/AspMaxRequestEntityAllowed 1024000

O valor 1024000 representa o limite de 1MB para a requisição. A resposta no prompt deve ser:

AspMaxRequestEntityAllowed : (INTEGER) 1024000

See ya

PS: ok, esse é mais um post de teste do que qualquer outra coisa. Colocar logo de cara um post de windows é foda, eu sei.