Arquivo da categoria: Desenvolvimento

User Agent do Internet Explorer 11 muda e quebra um monte de projetos

internet-explorer-stopped-working
Fala galerinha…. Estou sumido a muito tempo aqui do blog… Vou tentar voltar a postar coisas… Serão posts curtos e objetivos, então qualquer dúvida pode me procurar nos comentários… (Preciso arrumar um tempo pra limpar esse layout horroso) :p :p

Hoje, após algumas reclamações de usuários, descobri que o IE 11 mudou seu user agent, e isso quebra vários javascripts.

Verifique o seu projeto e veja se não foi impactado.

Antes um user agent, por exemplo do IE 10 vinha assim:
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)

Então no seu javascript, para verificar se o navegador era IE, você pega o user agent e procura pela string MSIE. Provavelmente era um código assim:
this.navigator.userAgent().match(/MSIE\s([\d]+)/);

Com o novo e belíssimo IE 11, além de bonito e rápido, ele não podia perder a reputação e continuar uma droga… O user agent mudou para:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko

Com isso seu belíssimo javascript retorna que você não está no IE e sua aplicação se comporta de forma completamente diferente.

Para resolver isso, após muita muita pesquisa, forums, stack overflows, confesso que vi soluções que davam vontade de chorar… Então resolvi juntar um pedacinho de cada, e cheguei na seguinte solução:

1
2
3
4
5
6
7
8
9
10
function isIE() {
 return (
  (this.navigator.appName() == 'Microsoft Internet Explorer') ||
  this.navigator.userAgent().match(/MSIE\s([\d]+)/) ||
  (
   (this.navigator.appName() == 'Netscape') &&
   (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(this.navigator.userAgent()) != null)
  )
 );
}

Assim eu consigo fazer 3 verificações antes de dizer que não é IE. Se o navegador se chama “Internet Explorer”, se ele tem uma versão válida de MSIE ou se ele é um Netscape com alguma versão de Trident.

Já estou rodando esse código em produção e o problema foi solucionado. Espero que sirva para mais alguém…

Share

OpenCart: Com o aumento do dolar, veja como atualizar o preço de todos os seus produtos via SQL

opencart-634x250

Com o aumento do dolar, resolvi postar aqui como fazer para aumentar o preço de todos os seus produtos baseado numa porcentagem.

No caso tive que aumentar 0.05% em cima de todos os produtos.

Para fazer isso, você precisa rodar uma linha SQL diretamente no servidor (pode ser feito facilmente pelo phpmysql admin do seu provedor de hospedagem)

UPDATE opencart_product SET price = round(price*1.05,2)

Onde “opencart_product” é o nome da minha tabela de produtos e “1.05” é o valor que quero deixar no produto, no caso 100% + 0.05%.

Você também pode baixar o valor do produto proporcionalmente dessa mesma forma. Se você tirar 10% de todos os produtos a query ficaria assim:

UPDATE opencart_product SET price = round(price*0.9,2)

Espero que essa informação seja útil para você, assim como foi para mim 🙂

Share

Code School vai liberar 48 horas de acesso gratuito aos cursos online

249163_519143868133826_1683470596_n

Em parceria com a New Relic, a Code School está oferecendo 48 horas de acesso gratuito a seu conteúdo.

É uma boa oportunidade para quem quer ver como os cursos são.

O link para acesso direto a promoção é: http://www.codeschool.com/free-weekend

De acordo com o site da code school, a oferta é valida apenas para os dias 25 e 26 de maio/2013.

Então vamos aproveitar essas 48 horas de aprendizado 🙂

Share

Você sabia que dá para usar versões diferentes de ruby na mesma máquina ?

RVM ou Ruby Version Manager é o gerenciador de versões Ruby.

Com ele você pode rodar projetos com rubys diferentes (exemplo: com a versão 1.8.7 e 1.9.3) mantendo os ambientes e as gems instaladas isoladas.

Conheça mais sobre o RVM em: https://rvm.io/

Ou se preferir, pode ir direto para a página de instalação em https://rvm.io/rvm/install/

Um outro bom exemplo de uso do RVM, não é só a utilização de multiplos Rubys, e sim a separação que ele faz entre os projetos.

Você pode criar com o RVM um “Gemset”, que é um grupo isolado onde se instalada as gem de seu projeto. Com isso você pode usar o mesmo ruby, e ter mais de um gemset configurado.

Share

10000 coisas que todos os estudantes de computação deveriam fazer antes da formatura


Esse post é uma tradução do original “10000 things all ICS students should do before graduating”

Resolvi traduzir esse post pois achei a ideia do autor muito boa.

Hoje, muitos alunos de análise de sistemas, ciência da computação, engenharia da computação, e outros cursos da área, estão sendo formados com base em tecnologias antigas e ultrapassadas…

Por exemplo, creio que 80% de uma turma de um último período em analise de sistemas, não vai saber que a linguagem Ruby existe, ou muito menos a definição de TDD (Coisas que são utilizados hoje em dia em empresas grandes como a Globo.com).

Digo isso pois já entrevistei muitos candidatos para estágio, e o nível do pessoal está ainda bem no básico. Mesmo sabendo que para estagiar, você não precisa “saber nada”, existe algumas coisas que podem te ajudar a “se classificar melhor” numa seleção técnica.

Então abaixo segue a lista na integra retirada do blog mencionado acima:

0000 – Registrar seu próprio domínio
0001 – Instalar o Apache web server e configura-lo de uma forma não tão simples (Por exemplo, múltiplos sites rodando no mesmo apache)
0010 – Instale o WordPress e mantenha seu próprio Blog. Escreva bem os seus posts e regularmente. Uma boa escrita é uma habilidade fundamental para dominar esta profissão.
0011 – Rode seu próprio site na sua casa ou numa empresa de hospedagem.
0100 – Crie pelo menos uma aplicação web LAMP (Linux, Apache, Mysql, PHP). Seria legal se escrevesse duas. Uma em PHP e outra em Python…. Ou em Ruby (LAMR ?? haha)
0101 – Tenha seu próprio servidor (físico ou virtual) na nuvem
0110 – Instale o VMWare/Virtualbox ou equivalente para poder rodar mais de um sistema operacional em seu laptop
0111 – Configure seu roteador da sua cada para servir um site ou alguns arquivos do computador da sua casa para os seus amigos acessarem…
1000 – Use um sniffer de pacote (Wireshark) para aprender e ver as requisições de rede que são feitas entre seu computador e um jogo on-line favorito.
1001 – Faça contribuições a projetos open-source.
1010 – Desenvolva um aplicativo que use pelo menos umas das APIs Web mais populares como a do Facebook Connect ou do Google.
1011 – Habilite o Google Adsense em seu blog ou site, e ganhe um pouco de dinheiro baseado no tráfego virtual.
1100 – Compilar um projeto de código aberto complicado a partir do zero. Tente o FFMpeg por exemplo !
1101 – Ler obras de literatura e, além de desfrutar a leitura, preste muita atenção à forma como o autor conta a história e faz uso das palavras. Os programas devem ser tão cuidadosamente escritos como aquelas obras de arte!
1110 – Obter-se envolvido em um projeto de software onde os requisitos mudam no meio – cerca de 0,01% dos projetos pessoais e cerca de 99,99% dos projetos do mundo real, assim que encontrar um deste último tipo, concluir o projeto com a paciência e ter capacidade de aceitar críticas de forma construtiva.
1111 – Escrever um aplicativo usando Map-Reduce. Executá-lo no Google app-engine ou na Amazon EC2.

Eu particularmente teria adicionado na lista mais alguns pontos:

– Colocar todo código desenvolvido em algum “controle de versão” (Exemplo: Git)
– Estudar sobre testes automatizados e desenvolver utilizando a técnica TDD
– Considerando que a maioria das empresas utilizam um linux em seus servidores de produção, estudar conceitos básicos de unix e saber dar um ssh de um servidor para outro, por exemplo.

Espero que as dicas sirvam para alguns estudantes 🙂 Não deixe de ler o post original na integra: http://tagide.com/blog/2011/06/things-ics-students-should-do-before-graduating/

Share

GitHub alerta sobre vulnerabilidade no gerenciamento das chaves SSHs

Através de um email recebido hoje a tarde (dia 07/03/2012) o GitHub informa sobre uma vunerabilidade que permitia que através de um ataque, a alteração de chaves SSHs dos projetos.

Isso permitia que o atacante pudesse fazer clone/pull/push nos repositórios… A vulnerabilidade foi fechada dia 04 de março de 2012 as 5:53 PM UTC.

Como forma de precaução, todas as chaves SSHs foram desabilitadas e você deve entrar no link: https://github.com/settings/ssh/audit para conferir e liberar as chaves SSHs cadastradas.

Para que isso não aconteça novamente, o email ainda informa que para adicionar novas chaves, agora é necessário informar a senha e um email é enviado avisado que uma nova chave foi adicionada. Em sua conta também irá ter um registro de alterações para poder analisar uma possivel atividade suspeita.

Então é isso… Olhem suas contas e confiram se está tudo ok…

GitHub, Espero que não aconteça de novo =)

E avisem seus amigos para revalidarem as chaves lá no github ou não conseguirão dar pull/pushes 😉

Share

Ubuntu 11.10 com Ruby on Rails + Nginx + Mysql de forma simples

Andei procurando na internet por algum script para fazer uma instalação mais “automatizada” de um ambiente Ruby on Rails numa máquina virtual (VPS) rodando Ubuntu 11.10

Depois de pesquisar muito, só encontrei referências detalhadas  para ubuntu 10.* ou então alguns blogs sugerindo algumas linhas de comando apenas.

Como eu já estava terminando um projeto de um site e precisava de um ambiente de produção, resolvi fazer um script (em bash), onde eu tivesse o controle de tudo que iria acontecer de forma segura e eficaz.

O script está disponível no meu github, use como quiser =)

Lembrando que só testei no Ubuntu 11.10, a instalação instala e configura o seguinte:
– Ruby 1.9.2-p290
–  Nginx Upload Module 2.2.0
– Nginx 1.1.12 
– iptables para as portas principais de ssh(22), http(80), https(443), dns(53)
– Mysql (versão estável do apt-get do ubuntu)
– Postfix (versão estável do apt-get do ubuntu)
– Gem Bundler (última versão pelo rubygems)

Com isso, basta configurar o domínio da sua aplicação corretamente na configuração do nginx, fazer o deploy e ser feliz! =)

Link do projeto: https://github.com/rafaelbiriba/Ubuntu-VPS-Builder 

Abaixo segue uma cópia do código que eu coloquei no git assim você pode tirar suas dúvidas pelos comentários… Caso decida usar o script, baixe ele pelo link do github. Não use o código abaixo pois o mesmo pode já estar desatualizado!

Modo de usar no servidor:
$ chmod +x vps_builder.sh
$ ./vps_builder.sh seudominio.com 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/bin/bash
# "Automated VPS Setup for Ubuntu 11.10 - Rails with Nginx"
#
# Created by: Rafael Biriba - www.rafaelbiriba.com - [email protected]ail.com
# https://github.com/rafaelbiriba/Ubuntu-VPS-Builder/
#
# USAGE:
#
# $ chmod +x vps_builder.sh
# $ ./vps_builder.sh yourdomain.com"
 
echo "Updating before all"
apt-get update && apt-get upgrade -y
 
echo "Set Hostname"
 
echo $1 > /etc/hostname
echo "127.0.0.1 $1" >> /etc/hosts
hostname -F /etc/hostname
 
echo "Set Timezone"
 
ln -sf /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime
 
echo "Install Essencials"
 
apt-get install build-essential zlib1g-dev libreadline6-dev libssl-dev wget git-core sudo -y
 
echo "Install Ruby 1.9.2"
 
mkdir ~/tmp && cd ~/tmp
wget http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.2-p290.tar.gz
tar xzvf ruby-1.9.2-p290.tar.gz
cd ruby-1.9.2-p290
./configure
make
make install
cd ~
rm -rf ~/tmp
 
echo "Install Passenger and Nginx"
 
mkdir ~/tmp && cd ~/tmp
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.21.tar.gz
tar xzvf pcre-8.21.tar.gz
cd pcre-8.21
./configure && make && make install
cd ~/tmp
 
wget http://nginx.org/download/nginx-1.1.12.tar.gz
wget http://www.grid.net.ru/nginx/download/nginx_upload_module-2.2.0.tar.gz
tar xzvf nginx-1.1.12.tar.gz
tar xzvf nginx_upload_module-2.2.0.tar.gz
 
gem install passenger
apt-get install libcurl4-openssl-dev -y
passenger-install-nginx-module --prefix=/opt/nginx --nginx-source-dir=/root/tmp/nginx-1.1.12 --extra-configure-flags=--add-module='/root/tmp/nginx_upload_module-2.2.0'
#passenger-install-nginx-module --auto --auto-download
cd ~
rm -rf ~/tmp
 
cd ~
wget https://raw.github.com/rafaelbiriba/Ubuntu-VPS-Builder/master/ubuntu_11-10_desktop/nginx-init.sh
cp nginx-init.sh /etc/init.d/nginx
rm nginx-init.sh
chmod +x /etc/init.d/nginx
/usr/sbin/update-rc.d -f nginx defaults
/etc/init.d/nginx start
 
echo "Configure iptables"
 
apt-get install iptables
 
tee /etc/init.d/firewall <<ENDOFFILE
#!/bin/bash
 
start(){
# Accepting all connections made on the special lo - loopback - 127.0.0.1 - interface
iptables -A INPUT -p tcp -i lo -j ACCEPT
 
# Rule which allows established tcp connections to stay up
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
 
# DNS:
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
 
# HTTP e HTTPS:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
 
# Block others ports
iptables -A INPUT -p tcp --syn -j DROP
iptables -A INPUT -p udp --dport 0:1023 -j DROP
 
}
stop(){
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
}
 
case "\$1" in
"start") start ;;
"stop") stop ;;
"restart") stop; start ;;
*) echo "start or stop params"
esac
ENDOFFILE
 
chmod +x /etc/init.d/firewall
update-rc.d firewall defaults 99
/etc/init.d/firewall start
 
echo "Install MySQL"
 
apt-get install mysql-server mysql-client libmysqlclient-dev -y
 
echo "Install postfix"
 
# Install type: Internet Site
# Default email domain name: example.com
apt-get install postfix mailutils telnet -y
/usr/sbin/update-rc.d postfix defaults
/etc/init.d/postfix start
 
echo "Install gem bundler"
 
gem install bundler
 
echo "VPS Setup Complete"

Qualquer dúvida, estamos aí para trocar ideias 😉

___________________________________________________

Atualização 1 – 07/fev/2012:

Agradeço ao leitor Laércio pelo contato via email, reportando um problema, onde se o ubuntu estiver muito desatualizado, o script não roda direito. Com isso adicionei lá no github e no exemplo acima os comandos apt-get update e apt-get upgrade para atualizar o ubuntu antes de fazer qualquer coisa. Obrigado mais uma vez Laércio !

Share

Raptcha: Um captcha simples para aplicações Rails

 

Humor: Robôs lendo o captcha

Captcha é um teste de desafio cognitivo, utilizado como ferramenta anti-spam. O que acontece é que um script automatizado (um robô), não consegue ler o texto embaralhado nas imagens. Isso faz com que seja uma excelente ferramenta para combater o spam ou prevenir que scripts tenham acesso a determinadas áreas.

Recentemente tive que procurar uma gem (um pacote do rubygems) de captcha para minha aplicação rails, mas que fosse a mais simples possível e sem nenhuma dependência externa.

Vi que a mais utilizada é a gem recaptcha, que utiliza a estrutura da API do google de captcha (google.com/recaptcha). Para resolver o meu problema ela não serve, já que o meu projeto vai rodar em máquinas sem acesso a internet.

Então ao continuar a busca por uma boa gem de captcha, recebi a recomendação de usar o Raptcha.

O Raptcha é realmente muito simples de configurar e de usar. Ele usa o Image Magick para renderizar as imagens em tempo real.

Em alguns casos isso pode ser um problema, mas no caso da minha aplicação, não havia necessidade de cachear as imagens.

Ao lado temos um exemplo do uso do raptcha.

Você pode conferir a documentação de instalação pelo link: https://github.com/ahoward/raptcha

Quando estava fazendo os meus testes, tive dificuldade para fazer as letras do captcha aparecer. Se isso acontecer, tente instalar o pacote GhostScript. Se você estiver usando o ubuntu, o imagemagick e o ghostscript tem no synaptic. Se você usa macbook, ambos os pacotes podem ser instalados pelo repositório do brew (não sei se tem no ports).

Um outro problema que eu tive que resolver, foi implementar o botão de gerar outro captcha. Infelizmente o raptcha não da suporte nativo a isso. Mas pode ser facilmente resolvido usando Ajax. O que eu fiz foi colocar no controller um render partial como mostra o código a seguir:

1
2
3
4
5
6
7
8
9
10
11
class RaptchaController < ApplicationController
 
  def index
    Raptcha.render(controller=self, params)
  end
 
  def get_form
    render :partial => "form"
  end
 
end

E no partial “form” ficou assim:

1
<%= raw Raptcha.input %>

Dessa forma, a chamar a url: http://localhost:3000/raptcha/get_form obtemos o retorno de todo o form do raptcha:

1
2
3
4
5
6
7
8
<div class="raptcha">
   <img class="raptcha-image" src="/raptcha?e=DaROXGWrRTrLdYXmJ05iKg" alt="Imagem de validação" width="242" height="68" />
 
   <label><img id="captcha-reload" title="Recarregar imagem" src="/images/mini-reload.gif" alt="" />Digite as letras acima:</label>
 
   <input class="raptcha-input box" name="raptcha[t]" type="textarea" />
   <input class="raptcha-word" name="raptcha[w]" type="hidden" value="DaROXGWrRTrLdYXmJ05iKg" />
   <input class="raptcha-timebomb" name="raptcha[b]" type="hidden" value="nEZ-sQYpOFC2YIE2qhAjeQ" /></div>

Então basta você colocar uma ação no botão #captcha-reload e obter um novo form por ajax e substituir o form antigo na página de sua aplicação. Fazendo assim, você poderá recarregar o seu captcha quantas vezes precisar…

Então é isso… Se você precisa de uma solução simples para o captcha em seu projeto, experimente o Raptcha usando as dicas acima… 😉

Share

The Wilderness Downtown: Experimento do Google usando HTML5

Apesar de ser um experimento já antigo, resolvi blogar assim mesmo, pois algumas pessoas ainda não o conhecem…

The Wilderness Downtown foi um projeto experimental do google, lançado em 2010, usando HTML5 e o navegador Chrome.

O projeto é simplesmente fantástico, baseado essencialmente em JavaScript, HTML5, Canvas, SVG, Google Street View e na API do Google Maps.

Tudo começa ao informar um endereço real. A partir das imagens do Google Maps e Street View, o vídeo de um rapaz correndo abre em uma das abas, e na outra, a posição de onde o rapaz está correndo aparece na região que você informou.

Enquanto isso, alguns pássaros voam sobre os mapas e até pelo video, sendo que eles são animações feitas no canvas. Note que na tela inicial (onde você informa o endereço) os pássaros são sensíveis a posição do mouse. Então, se você tentar toca-los, eles irão mudar de direção… 🙂

Durante a exibição, você poderá fazer um desenho e inclusive podendo utilizar as letras do teclado para escrever algo. A cada tecla pressionada, uma animação de máquina de escrever é reproduzida  logo a baixo. O mais impressionante disso tudo, é que depois que passam alguns segundos, os pássaros voltam voando e pousam em todas as linhas que você fez no desenho.

Você pode acessar e conferir tudo em: http://www.thewildernessdowntown.com/ (recomenda-se o uso do navegador Chrome)

Share

WordPress: Cuidados e dicas para atualizar a versão para 3.1

http://www.wordpress.org/

Foi lançado hoje a versão 3.1. Dentro das principais mudanças, temos:

  • Linkagem interna: Permite você ao escrever um post, procurar e linkar um outro post que você já tenha publicado. Essa funcionalidade é muito importante quando você quiser linkar um texto à algo que já foi falado em outro post.
  • Barra de adminstração: Adiciona uma barra similar ao que o WordPress.com usa. Quando você estiver logado, essa funcionalidade vai disponibilizar alguns atalhos úteis enquanto navega pelo blog.
  • Telas de Adminstração em Ajax: Torna a navegação, busca e etc… mais simples já que não haverá necessidade de atualizar toda a página para cada ação realizada.
  • Dentre outras funcionalidades… Veja mais no release notes da versão 3.1.

Antes de você ficar animado e partir para a atualização, existe alguns pontos que merecem sua atenção…

Antes de fazer qualquer coisa, faça o backup do seu blog. Já postei aqui o que aconteceu quando eu não fiz o backup do meu blog. Backups nunca são demais, afinal é melhor prevenir.

Outro detalhe a ser observado, é que alguns plugins podem não ser compativeis com a nova versão. Na época que foi lançada a versão 2.8 eu falei sobre isso.

O ideal para você que quer fazer o update, é verificar na página de cada plugin se ele já é compatível. Para isso, acesse: http://wordpress.org/extend/plugins/ , busque pelos seus plugins e verifique se em: “Compatible up to” ele já foi testado na versão 3.1

Eis alguns exemplos: Google XML Sitemaps e All in One SEO Pack (compatível até 3.0.5)…

Dica de como atualizar testando tudo de uma só vez:

No horário que seu blog tiver menos acessos (exemplo: De madrugada), faça um backup completo (um .zip dos arquivos e um .sql do banco é suficiente, ou então o backup disponível no Cpanel).

Depois faça a atualização e teste tudo. Se alguma coisa não funcionar, analise bem o problema, tome nota e depois restaure o blog usando o backup gerado.

Agora que você já descobriu qual o plugin não está funcionando, basta pesquisar por uma solução e repetir o procedimento até que o seu blog esteja funcional na nova versão 😉

Boa sorte para você que vai atualizar… Eu já testei e descobri que vou ter que trocar vários plugins pois alguns deles são antigos e deixaram de funcionar.

Vale ressaltar também que até a data em que esse POST foi escrito, a versão BR do wordpress ainda não tinha a 3.1 disponível.

Se houver alguma alteração sobre isso, eu posto aqui… 😉

==========================================
Atualização – 24/fev/2011

WordPress 3.1 disponível na versão BR: http://br.wordpress.org/



==========================================

All in One SEO Pack
Share