Do ASP ao PHP, vim para o lado negro da força!

Buenas povo! Faz tempo que não dedico meu tempo a escrever aqui no O Desenvolvedor, mas pretendo voltar ao ritmo anterior e com algumas mudanças (acompanhando as novidades na minha vida profissional).

Este é um post para apresentar algumas novidades que, de certa forma, guiarão minhas publicações por aqui. A primeira é que não vou dar continuidade aos meus estudos com .NET, e estou reduzindo meu trabalho com o ASP clássico. Isso não quer dizer que encerrarei meus posts sobre a linguagem, mas como estou me dedicando a estudar outras, possívelmente me focarei nelas.

Ah, preciso agradecer ao Leo Caseiro, que me disponibilizou um material excelente sobre .NET quando comecei a estudar!

Espero que este artigo ajude a orientar de alguma forma as pessoas que procuram pela manjada questão: "que linguagem é melhor estudar?"

Vamos aos motivos das minhas mudanças…

 

Porque "desistir" o ASP clássico?

Já fazia algum tempo que eu procurava evoluir, trocar de linguagem de programação, e por isso iniciei meus estudos em .NET. Vamos aos 3 4 motivos que me levaram a "pular fora":

Para aprender alguma coisa nova. E não estou dizendo que sei tudo do ASP, não mesmo. Mas mudar é bom, gosto de mudanças, aprender uma linguagem de programação nova é como começar a estudar um novo idioma, estimula o cérebro, tira noites de sono de uma forma positiva, anima!

Queria mudar porque o ASP está se tornando obsoleto (para muitos, já é) devido a migração para o .NET, que apresenta mais possibilidades e melhor desempenho (dizem, nunca testei realmente).

Comunidade de desenvolvedores muito pequena. Tudo bem que existe o Google, existem fóruns e até uma documentação razoável, mas nada comparado a PHP, por exemplo. Muitas vezes eu quebrava a cabeça para desenvolver determinada funcionalidade, sabendo que em outras linguagens uma centena de desenvolvedores já haviam desenvolvido isso e disponibilizado o código para uso, estudo e alterações.

Dinheiro. Grana. Eu pago licença para utilizar o Windows Server no meu servidor. Eu não consigo bons dll´s gratuitos para manipulação de imagem ou arquivos (pdf´s, planilhas, etc…). Quase tudo é pago, seguindo o "padrão" da tecnologia ASP.

 

Porque não o .NET?

Alguns dos motivos que me fizeram querer mudar do ASP continuam presentes na linguagem .NET, como por exemplo o custo.

A comunidade de desenvolvedores não ser muito grande (ou não gostar de colaborar com o mundo, indo contra a poderosa e adorada "interwebs").

Motivos pessoais: como eu comentei, estou de emprego novo, e por aqui o .Net não é utilizado (pelo menos até onde eu sei).

 

Porque escolhi o PHP?

Pra ser cool.

O primeiro motivo, obviamente, a linguagem aberta, gratuita. Vou economizar um dinheiro considerável por mês pelo simples fato de não precisar pagar licença do Windows no servidor. Isso será a longo prazo, somente depois que eu migrar meu sistema todo de Intranet para o PHP, que vai levar possivelmente mais do que seis meses…

Darth Vader

Para ficar do lado negro da força!*

 

Comunidade gigantesca de desenvovledores e melhor, que adoram compartilhar conhecimentos. A documentação é maravilhosa.

Linguagem ainda em desenvolvimento (agora o PHP 5, estou certo?), sem a necessidade de "extensões" como os dll´s que já me perturbaram no ASP.

Já tinha um conhecimento superficial sobre a linguagem, foi com ela me inseri no mundo do desenvolvimento criando meu primeiro blog e CMS, lá no meu tempo de guri…

Comecei a estudar loucamente MVC, nunca vi um framework gratuito e funcional para ASP, já me indicaram diversos (e aparentemente muito bons) para o PHP!

 

 

É isso… a partir de agora não se assustem se surgir por aqui alguns posts "PHP for dummies", e aceito sugestões de artigos também, viu?

 

 

* o título deste artigo é graças ao tweet do @cleiverrr, quando anunciei meus estudos com o PHP: "lol @gserrano está vindo pro lado negro da força! =D"

Como contar arquivos em uma pasta usando ASP (FSO)

Na intranet de um cliente existe um módulo para distribuição de arquivos para os clientes dele, para isso eu utilizo o File System Object (FSO), que navega pelas pastas especificadas do sistema (onde meu cliente sobe diversos arquivos por FTP), identifica os arquivos e distribui cada arquivo para o respectivo usuário final (o cliente do meu cliente).

Com poucos arquivos a distribuição acontece tranquilamente, os arquivos são movidos para a pasta de cada usuário, cada usuário recebe uma notificação por e-mail com o link para a área de login do sistema com acesso aos arquivos. Porém todo o servidor tem um limite para execução de scripts e muitas vezes simplesmente aumentar esse limite de tempo de execução não é recomendável, pois se alguma coisa der errado (como um loop infinito) vai ficar sobrecarregndo o servidor.

New Folder

Isso sim é organizar os documentos em pastas

 

Começaram a acontecer problemas quando existiam muitos arquivos para mover, pois além da listagem de todos os arquivos o sistema segue uma lógica para identificar de qual usuário é cada arquivo para que a distribução seja feita de forma correta.

A solução para não retornar o erro de limite de tempo excedido e não aumentar loucamente este limite (o usuário certamente vai achar que deu erro quando uma página demorar demais para carregar) foi limitar o número de arquivos movimentados por vez, isso permite dar um feedback entre a "paginação" evitando que o usuário pense que o aplicativo travou ou deu erro e clique repetidamente em botões da interface. Eles gostam disso.

Segue uma parte da solução que adotei.

 

Como contar quantos arquivos tem em uma pasta utilizando o FSO?

Quando procurei informações de como contar quantos arquivos existiam em uma pasta a maioria envolvia um loop por todos os arquivos, e isso me lembrou minha experiência com POG: Não programe isso!

Twittei para ver se alguém conhecia uma solução melhor do que um loop, @chrisloki@cleiverrr e @alinedecampos responderam com idéias/sugestões, não achei nenhuma documentação completa do FSO (ok, só dei uma googleada básica) mas resolvi testar algumas coisas como UBound (para pegar o índica mais alto de uma array) e depois um count.

O UBound não funciona, o array de arquivos não pode ser tratado como um normal, mas existe o comando COUNT no FSO, segue abaixo o script para contar quantos arquivos existem em uma pasta:

 

dirtowalk = "../web_users/gssolutions/arquivos/"

Set fs = CreateObject("Scripting.FileSystemObject")

Set f = fs.GetFolder(server.mappath(dirtowalk))

Set fc = f.Files

total = fc.count

response.write "Total de arquivos na pasta " & dirtowalk & ": " & total

 

É isso aí, um simples .count no "array" de arquivos retorna o número de arquivos dentro da pasta. Caso existam subpastas, você teria que criar um loop para ir navegando e somando os arquivos dentro de cada subpasta…

Mais funcional e elegante do que um "For Each arquivo In fc"!

Obrigado a todos os que ajudaram e responderam meus pedidos de socorro no twitter, espero ter ajdado também! 🙂

Como permitir que subdomínios leiam os Cookies do domínio principal em ASP

Criei o And After para dominar o mundo e me tornar um milionário da internet, para isso conto com a ajuda dos donos do mundo (Bia, Chris e recentemente o Cristian). 

As idéias foram crescendo, Um dos projetos está sendo desenvolvido em um subdomínio, mas por padrões de segurança um cookie só pode ser lido pelo domínio que o criou, então os cookies ficam inacessíveis para os subdomínios.

Cookies

Se você não sabe NADA sobre cookies recomendo as leituras:

Como criar e ler cookies em ASP

Classe para gravar e ler cookies – por javascript

 

Para permitir que todos os subdomínios consigam ler o cookie precisamos apenas adiconar a propriedade domain na hora de criar o cookie.

 Por exemplo, tenho um cookie chamado odesenvolvedor que foi criado pelo domínio andafter.org e quero permitir que o subdomínio testes.andafter.org consiga ler este cookie, quando eu gerar o cookie adiciono a seguinte linha:

 

Response.Cookies("odesenvolvedor").domain = "andafter.org"

 

Neste cado o atributo domain permite que todos os subdomínios de andafter.org tenham acesso ao domínio.

Todo poderosoTodo poderoso

"That”s the way the cookie crumbles"*

"E é assim que o biscoito é repartido"*

 

Simples e fácil, agora posso dominar o mundo utilizando diversos subdomínios!

Espero que isso tenha ajudado, sugestões, dúvidas e críticas nos comentários 🙂

 


 

Para quem não lembra no filme Todo Poderoso, esta é a "assinatura" do âncora que se torna deus, interpretado por Jim Carrey. Via Wikiquote

Enviando e-mail em ASP (CDO) utilizando o Google Apps

Desde que migrei para o novo servidor que estou gerenciando optei por fornecer os benefícios do Google Apps para todos os meus clientes, principalmente pela poderosa ferramente de e-mail (Gmail) que de longe é o melhor sistema de webmail que eu já testei.

Como resolvi utilizar este como único servidor de e-mails, tive que fazer alterações nos scripts de envio de e-mail, newsletter, contato, etc. dos sites dos clientes, como demorei um pouco para descobrir porque não estava funcionando acho que este pode ajudar quem está com o mesmo problema.

 

Enviando e-mail em ASP utilizando o Google Apps

Muito bem, é um script simples mas que me tomou algum tempo pois eu havia esquecido de habilitar o SSL. Não esqueça de usar um e-mail do seu domínio como remetente, criar a conta de e-mail (cerifique logando no webmail) e habilitar o uso de SMTP pelo painel do Google Apps.

Feito isso, é só utilizar o código abaixo alterando apenas as configurações para sua conta.

 

Dim objCDOSYSMail
Dim objCDOSYSCon
Set objCDOSYSMail = Server.CreateObject("CDO.Message")
Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
"Aqui estava o meu problema: SSL tem que ser TRUE!
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
"o e-mail completo que você utiliza no google apps (não esqueça de habilitar SMTP no painel fo Google apps!
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "[email protected]"
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha"
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
objCDOSYSCon.Fields.update
Set objCDOSYSMail.Configuration = objCDOSYSCon
objCDOSYSMail.From = "Newsletter And After
objCDOSYSMail.To = "Nome <[email protected]>"
objCDOSYSMail.Subject = "And After - Newsletter Junho"
objCDOSYSMail.HtmlBody = email
objCDOSYSMail.Send
Set objCDOSYSMail = Nothing
Set objCDOSYSCon = Nothing 

 

 

 

Limite de envios

O Google libera o envio de apenas 500 e-mails por conta para evitar o uso indevido do Google Apps, por isso você pode utilizar duas ou mais contas se for necessário o envio de Newsletter assim. Por exemplo, crie as contas:

Assim você pode realizar o disparo de 2.000 mensagens a cada 24h, configurando cada grupo de usuário para ser atendido por uma conta de e-mail. 🙂

 

 

Espero que ajude, para o envio em PHP também é necessário habilitar o SSL (óbvio…) mas não vou me arriscar no código, se alguém quiser compartilhar publique-o no And After 🙂

Protegendo de Hotlink com Isapi Rewrite

Quanto eu estava em São Paulo semana passada aconteceu pela primeira vez algo que eu sabia que cedo ou tarde aconteceria: excedi meus 25gb mensais no Photobucket.

Se você quer apenas o código para a proteção de imagens pelo ISAPI Rewrite vá para o final deste post.

A primeira coisa que pensei foi em pagar e manter uma conta pro, mas se eu já tenho um ótimo serviço de hospedagem não existia motivo real para eu pagar alguém para manter minhas imagens. Bom, existia um único motivo: o comodismo. Mas uma coisa que aprendi com minha pouca experiência de vida é que quando se trata de programação, cliente, design e servidor o comodismo é um senhor tiro no pé e que logo trará problemas.

Estou pensando no desenvolvimento de um álbum de imagens no And After e ter as imagens no servidor não so agilizará o processo como também me dará segurança e eficiência para fazer backups, alterações e gerenciamento desse novo sisteminha que pretendo implementar.

Ótimo, fiz transferência de parte das imagens (foi bem menos doloroso do que parece) e fui ativar a proteção hotlink¹ e descobri que não existia proteção hotlink para a minha conta.

Sabendo da disponibilidade do Isapi Rewrite no meu servidor (utilizo para as urls amigáveis do And After) fui pesquisar sobre o assunto, finalmente a resposta:

 

Proteção de hotlink com ISAPI Rewrite

No seu arquivo httpd.ini adicione essas quatro linhas:

#protegendo hotlink
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://1.*).*
RewriteRule .*.(?:gif|jpg|png) /block.gif [I,O]

Neste caso os formatos protegidos em todo o site são: gif, jpg e png. Você pode proteger outros formatos adicionando-os na última linha do código.

 


¹ Hotlink é quando um site "rouba" suas imagens. Utiliza suas imagens, flashs ou outro tipo de conteúdo no site sem baixar o arquivo e enviar para outro servidor. Quando o usuário visualiza a imagen dentro do outro site, ela é requisitada do seu servidor, causando consumo para você.