quarta-feira, 23 de outubro de 2013

Big Data, e eu com isso?

Esse ano (2013) fui um dos coordenadores da Trilha Big Data no TDC (The Developers Conference).

Big Data é um dos meus estudos que tenho feito.

Muita coisa pode-se falar sobre o conceito. Então, fui convidado para palestrar em Leme para alguns estudantes da região, e escolhi esse tema para falar.

Seguem os slides:

quarta-feira, 14 de agosto de 2013

AWS Summit 2013

Seguindo o post sobre Cloud Computing, fiz uma apresentação das palestras assisitidas no AWS Summit 2013 em São Paulo.



segunda-feira, 5 de agosto de 2013

Cloud Computing: Criar um site estático na AWS (Amazon)

Uma das facilidades de hoje em dia é você poder ter quantas máquinas quiser, sem realmente precisar comprar uma.

A nuvem te proporciona isso, a chamada cloud computing.

Cloud Computing



Não vou explicar o conceito de Cloud Computing aqui, mas imagine você precisar testar uma aplicação em um servidor de uma OS específica, de uma versão específica, em uma máquina física específica. Teoricamente você teria que comprar uma máquina, certo? Com a "nuvem", isso não será necessário. Utilizando a Amazon (AWS) por exemplo, você pode ter a máquina, testar e depois descartá-lo.

Existe alguns tipos de serviço na nuvem:

IaaS - Infrastructure as a Service: quando se utiliza uma percentagem de um servidor, geralmente com configuração que se adeque à sua necessidade.
PaaS - Plataform as a Service: utilizando-se apenas uma plataforma como um banco de dados, um web-service, etc. (p.ex.: Windows Azure).
SaaS - Software as a Service: uso de um software em regime de utilização web (p.ex.: Google Docs , Microsoft SharePoint Online).

AWS (Amazon Web Service)



A AWS (http://aws.amazon.com/) é uma das mais completas plataformas para se beneficiar da Nuvem. 

Dentro dela existe vários serviços como:
  • Amazon Simple Storage Service (S3)
  • Amazon CloudFront 
  • Amazon SimpleDB
  • Amazon CloudWatch
  • Amazon Virtual Private Cloud (VPC)
  • Amazon DynamoDB
  • Amazon Elastic Compute Cloud (EC2)
  • Amazon Elastic MapReduce
  • e muitas e muitas outras....
Não vou explicar cada uma delas, pois além de serem muitas, a Amazon lança serviços frequentemente. Alguns serviço vou explicar abaixo ao criar um site estático.

Para ajudar mais ainda, ao cadastrar na AWS, você ganha vários serviços de graça. Dá uma olhada em:


Criar um site estático na AWS

Para criar um site estático na AWS, é preciso enteder alguns serviços:
  • Amazon Simple Storage Service (S3) - Esse é um serviço de armazenamento. Ou seja aqui é que vamos armazenar todos os arquivos estáticos, como o css, js, imagens, etc.
  • Amazon CloudFront - É um serviço web para distribuição de conteúdo. Os arquivos são entregues aos usuários finais usando uma rede global de pontos de presença.

S3



O primeiro passo é entrar no serviço S3 através da console:













1) Crie um bucket no S3 para seus logs
Buket-name: meuprojeto-log (nome do diretório onde vão estar os logs)
Region: São Paulo
Clique em Create e não em Set Up Logging






2) Crie outro bucket no S3
Buket-name: meuprojeto (nome do diretório do seu projeto, do seu site estático)
Region: São Paulo
Clique em: Set Up Logging

Ative o: Enabled
Target Bucket: Referencie ao bucket criado no passo 1
Target Prefix: s3_meuprojeto (ou um prefixo da sua preferência para indentificá-lo)



Não é necessario mudar as configurações dos bucket (permissões) nesse momento se for usar o cloud front.

3) Coloque os arquivos estáticos (html, js, css, imagens, etc) no diretório criado no passo 2

Cloud Front

Entre no serviço Cloud Front


5) Clique em Create Distribution


- Escolha: Download



- Origin Domain Name: referencie o bucket criado (meuprojeto do passo 2), ou se for referenciar fora utilize o dominio de origem (meuprojeto.com.br)
- Origin ID: um nome
- Viewer Protocol Policy: HTTP e HTTPS
- Object Caching: Ao ativar o “Customize” abrirá o campo “minimum TTL”
- Minimum TTL: Coloque em segundos (tempo de cache)
- Forward Cookies: None (imporoves caching) - já que serão objetos estáticos
- Forward Query Strings: No (improves caching)
- Restrict Viewer Access (Use Signed URLs) - nesse local coloque Yes para que os usuário apenas acessem o Cloud Front, e nunca pelo S3 (irá mudar as permissões do S3, que comentei no item 2)
- Trusted Signers: self
- Price Class: Use All Edge Location
- Alternate Domain Names(CNAMEs): Aqui coloque o dominio do seu projeto meuprojeto.com.br - dominio que o usuario irá digitar
- SSL Certificate: default cloud certificate
- Default Root Object: não preencha
- Logging: on (aqui irá habilitar todos os logs de usuários que visitaram a página)
- Bucket for Logs: Referencie o buket criado acima (ex: meuprojeto-log, criado no item 1)
- Log Prefix: cf_meuprojeto (ou qualquer outro prefixo para identificá-los)
- Cookie Logging: off
- Comment: apenas se quiser escrever algo para lembrar



6) Pronto! Agora é só esperar o serviço ir pro ar e testar. Normalmente demora entre 5 a 10 minutos!

quarta-feira, 17 de julho de 2013

Autenticar SSH sem senha

Esse post é mais uma dica que uso há algum tempo, e que algumas pessoas ainda não conhecem. Mas que ajuda muito no dia a dia.

SSH

Antes de mais nada, sabe o que é SSH?

SSH (Secure Shell) é um protocolo para login remoto seguro, ou seja um protocolo que visa fazer a comunicação entre dois hosts distantes através de um autenticação segura e em seguida troca de dados utilizando algoritmos de chave simétrica. Diferente de outras ferramentas como rsh, rcp, rlogin e telnet, o SSH codifica toda a comunicao.


Problema

Uma das coisas mais chatas é ficar acessando ssh e colocar a senha. Principalmente se você tem vários servidores para acessar, e faz isso com muita frequência, ou seja várias vezes ao dia.

Solução

Uma forma de contornar isso é utilizar o:
ssky-keygen e ssh-copy-id


Como Fazer?

Criar as Chaves na máquina local

1) Crie um par de chaves RSA (uma chave privada e uma chave pública) para autenticação, digitando:

 ssh-keygen -t rsa  

2) Será solicitado o local para armazenar a chave.


*Importante: Se você tem várias chaves criadas para cada servidor, é nesse passo que você terá que alterar o nome. Exemplo. Em vez de dar um "ENTER", digite:

 /home/alexandre/.ssh/id_rsa_outroservidor  


3) Será solicitado logo em seguida seu passphrase ou "frase secreta". É uma senha para indentificar que você é o proprietário da chave criada:


*Importante: Guarde essa senha que será usada posteriormente

Após isso sua chave será criada. 2 arquivos serão criados no diretório informado acima:
- id_rsa que é a chave privada
- id_rsa.pub que é a chave pública




Copiar as Chaves para o servidor remoto

Agora será necessário copiar sua chave no servidor remoto:

4) Para fazer a cópia digite:

 ssh-copy-id -i ~/.ssh/id_rsa.pub user@server  

O que ele faz é copiar a chave pública (dá um append) dentro do arquivo "authorized_key". Ou seja ele automatiza esse passo.

5) Será solicitado passphrase (o mesmo que você digitou no passo 3)

6) Pronto! Você já estará acessando seu servidor remoto sem senha. É só testar:


 ssh user@server  

Obs:
Se a chave pública estiver em outro diretório ou você nomeou ele de outra forma passe o parâmetro i:
 ssh -i /home/alexandre/.ssh/id_rsa_outroservidor user@server  


Importante!
Não esqueça de dar as devidas permissões principalmente no servidor que você irá acessar:
chmod 600 /home/servidor/.ssh/authorized_key
chmod 700 /home/servidor/.ssh/


Outras dicas

1) Hostname
Para gerenciar todos os servidores remotos é complicado.
Você pode criar hostname atrelado ao IP, modificando o arquivo:

 sudo vi /etc/hosts  

Colocando IP e depois o hostname.
Assim fica mais fácil lembrar dos servidores.




2) Gerenciador de SSH
Outra dica para não se perder, é usar uma aplicação que é um menu de conexões SSH.

Temos o SSHMenu para GNOME, e achei o Shuttle para Mac.

Ele é simples, pois é só editar um arquivo de configuração (um arquivo Json).




Se tiverem mais dicas, dá uma comentada. Sempre é bom termos opções e saber como outros desenvolvedores trabalham.

quarta-feira, 27 de fevereiro de 2013

CoffeeScript por que não?


Comecei recentemente a usar o CoffeeScript e gostei bastante.



Resumidamente o CoffeeScript é uma linguagem de script que compila para JavaScript.

A vantagem do CoffeeScript sobre o JavaScript é a inserção de uma série de syntatic sugars e também uma sintaxe mais limpa e concisa que a do JavaScript, por exemplo:
  • Blocos através de identação (igual ao Python)
  • Retorno implicito de funções
  • e etc.
Há uma certa polêmica em torno do CoffeeScript e para mim a mais pertinente de todas se refere ao fato do CoffeeScript introduzir o conceito de Heranças sendo que o JavaScript não funciona assim. Acho que a decisão de se vale ou não a pena usar cabe a você sempre testar e se não gostar tirar.

Um outro ponto é em relação ao código JavaScript que é gerado pelo compilador do CoffeeScript, em muitos casos o código compilado é muito legível e bem "escrito"

Eu ainda tenho dificuldade com o JavaScript e se você é como eu já digo que CoffeScript de jeito algum significa que você deve deixar de tentar aprender o JavaScript.
Muito pelo contrário muitas vezes olhando o código CoffeeScript compilado em Javascript você pode  até mesmo aprender como se faz um bom JavaScript.

Você pode testar mesmo usando o website do CoffeScript, e ainda é possível escrever o código e ver a compilação do javascript no próprio browser.
http://coffeescript.org/

quarta-feira, 26 de dezembro de 2012

Tutorial do Maven para Android

O Maven é uma ferramenta de gerenciamento de projetos, com ela você pode gerenciar as dependências de seu projeto, automatizar relatórios, execução de testes e etc.

É muito popular em Java mas há também um plugin para usá-lo para gerenciar também um projeto Android.

Pré-requisitos
  1. JDK 1.6 +
  2. Android SDK
  3. Maven 3.0.3 +
  4. Eclipse Indigo ou Juno
Primeiramente é necessários configurar a variável de ambiente ANDROID_HOME apontado para o diretório em que está o seu Android SDK, no meu é a seguinte:

export ANDROID_HOME=$HOME/dev/android-sdk

Adicione essa variável em seu path bem como os sub-diretórios $ANDROID_HOME/platform-tools $ANDROID_HOME/tools, exemplo:

export PATH=$PATH:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools

Para o Windows seria algo como 
%ANDROID_HOME%\tools e %ANDROID_HOME%\platform-tools

Integração com o Eclipse

Para o Maven para android funcionar bem com o eclipse é necessária a instalação do plugin M2E-Android.

Abra o eclipse e no menu superior escolha Help > Eclipse Marketplace.
Busque por Android M2E.
Clique em Install no item Android Configurator for M2E.
Next, next next e finish...
Reinicie o Eclipse.
Pronto seu plugin já deve estar instalado

Criando um projeto com o Maven

É possível criar um projeto Android pelo maven usando o Eclipse, eu pessoalmente prefiro criar na linha de comando.


mvn archetype:generate \
  -DarchetypeArtifactId=android-release \
  -DarchetypeGroupId=de.akquinet.android.archetypes \
  -DarchetypeVersion=1.0.8 \
  -DgroupId=com.blogspot.runnerdtalks\
  -DartifactId=MavenTest \
  -Dplatform=10 \
  -Dpackage=com.blogspot.runnerdtalks.maventest

Esse archetype gerará um projeto com algumas configurações extras para permitir que o app seja publicado no Google Play.

Ao usar esse archetype serão criados 2 projetos, um chamado MavenTeste para o aplicativo e outro chamado MavenTest-it para os testes do aplicativo criado.
Esse archetype já possui configurações que possibilitam a publicação do aplicativo também no Google Play, ainda existem outros archetypes com menos opções pré configuradas, é possível encontrar esses outros archetypes neste link aqui

Importando o Projeto para dentro do Eclipse.

No eclipse vá em File > Import > Existing Maven Projects escolha o diretório do projeto recém criado e selecione só os dois projetos filhos.



E Finish

Se o projeto estiver reclamando da falta dos diretórios src/test/java crie eles e de um refresh no projeto pelo eclipse.

Para adicionar dependências é só editar seu pom.xml como um projeto Maven normal, depois clique com o botão direito em seu projeto vá em Maven > Update Project.

Lembrando que se um dia precisar compartilhar este projeto com seus amigos ou subir no repositório, sempre remover os arquivos do eclipse e os binários de seu SCM.

Referências

Maven Android Plugin
M2E Android
Android Maven Archetypes



sábado, 11 de agosto de 2012

Python

No encontro que tivemos no Utils.runNerdTalks(10), falamos sobre Python.

É difícil falar de uma linguagem, porque tem muita coisa a se falar.

O que posso dizer, é que é a linguagem que mais estou usando ultimamente, e a cada dia descubro coisas novas, e interessantes.

Python 

O Python é uma linguagem de programação de alto nível, interpretada, imperativa, orientada a objetos, de tipagem dinâmica e forte. O código é aberto, e multiplataforma.

Ela foi criada por Guido van Rossum, que não por acaso trabalha hoje na Google (uma das empresas mais conhecidas que utilizam Python).

Apesar do nome estar associado ao réptil píton, a linguagem veio em homenagem ao grupo humorístico britânico Monty Python.


Always Look on the Bright Side of Life

1) Instalação

O Python já vem instalado em vários sistemas operacionais como Linux e Mac. Caso não tenha instalado na máquina acesse aqui.

Hoje ele está na versão 3, mas utilizamos a versão 2.7 para exemplificar. A versão 3 tem quebra de compatibilidade com a versão 2.7



Para verificar a versão do Python na máquina digite:
python --version

2) Começando a brincar

Para abrir um shell interativo, digite
python

Abrirá algo como:


Dentro dele, pode-se digite:
x = 1
y = 1
resultado = x + y
print resultado


Note que diferentemente de Java, nós não atribuimos o tipo para as variáveis. Assim sendo posso também fazer:
x = "Alexandre "
y = "Uehara"
resultado = x + y
print resultado


Isso é o começo para brincarmos com o Python (em um shell interativo). Aliás caso queiram, pode instalar também o iPython (o qual recomendo bastante).


3) Bibliotecas

Para instalar o iPython e outras bibliotecas, recomendo instalar pelo easy_install ou pip. Eles são gerenciadores de bibliotecas (tal como apt-get e RubyGems).

Lembrando que em Python muitas bibliotecas já vem como padrão, não precisando instalar bibliotecas de terceiros.

Exemplo:
Caso eu queira instalar o virtualenv, digite:
sudo easy_install virtualenv
ou

sudo pip install virtualenv

Aliás o virtualenv, é uma ferramenta para termos várias versões de python em sua máquina. Semelhante ao RVM em Ruby.

4) Escrevendo um programa

4.1) Hello World
Para escrever um Hello World, crie um arquivo, helloworld.py
Dentro dele escreva:
print Hello World

Só isso? Sim, só isso. Depois disso, digite no terminal:
python helloworld.py

4.2) Hello World executável
Dentro do mesmo arquivo adicione na primeira linha:
#!/usr/bin/python

Depois dê permissão de executável ao arquivo:
chmod ugoa+x helloworld.py

E, execute:
./helloworld.py

Simples!!!

4.3) Blocos == Identação
O que torna o Python simples de ler, entender e dar manutenção é que não existe blocos com chaves "{" e "}" como no Java. Os blocos são as próprias identações.

 Exemplo: crie um programa chamado:
- nome.py
#!/usr/bin/python
if nome == "Alexandre":
  print nome
else:
  print "outro nome"

Veja que colocamos 2 espaços depois do if, e depois do else. Dê novamente a permissão de executável ao arquivo, e execute.

4.4) Classes 
Apesar da linguagem ser orientada a objetos como vocês puderam ver anteriormente, não precisamos utilizá-lo dessa maneira.

Mas o legal, é realmente usá-lo como OO. Para criar uma classe:
class Empregado()
  def __init__(self, nome):
    self.nome = nome
  def printNome(self, mensagem="Meu nome é: "):
    print mensagem + self.nome

Mas o que é esses montes de "self". É... realmente não é elegante, mas é como se fossem os vários "this" do Java.

E o "__init__"?? É o construtor da classe.

 E o "mensagem=" no método "printNome". O "mensangem=" é o argumento do método, mas com um valor default. Isso é para faciliar a sobrecarga de métodos. Lembrando que não é necessário colocar um valor default para ele..

É possível também passar ao método os argumentos em qualquer ordem, passando o nome do argumento:

#!/usr/bin/python
# -*- coding: utf8 -*-
class Empregado():
  def __init__(self, nome):
    self.nome = nome
  def printNome(self, mensagem="Meu nome é: ", mensagemfinal="."):
    print mensagem + self.nome + mensagemfinal

def main():
  empregado = Empregado("Alexandre")
  empregado.printNome(mensagemfinal="!!!")

if __name__ == "__main__":
    main()


Veja que adicionamos na 2a. linha o encoding.
E para iniciar o programa, colocamos o main.

4.5) Bibliotecas
Para chamar uma biblioteca é só chamar o import:
#!/usr/bin/python
# -*- coding: utf8 -*-
import unittest
ou
#!/usr/bin/python
# -*- coding: utf8 -*-
import os
print os.getcwd()

Veja que acima, nós adicionamos a biblioteca "unittest" e na outra o "os".
Ah! E como dá para perceber, o "unittest" vem como padrão no Python. Muito legal! hahah!!!!

Caso não queira importar tudo, pode-se chamar:
#!/usr/bin/python
# -*- coding: utf8 -*-
from datetime import timedelta
d = timedelta(microseconds=-1)
print d
Importando apenas o timedelta do datetime

4.6) "Grandes poderes trazem grandes responsabilidades."
A linguagem Python deixa você fazer muitas coisas, que outras linguagens não deixam, como acesso a atributos protected.

Ou seja, não é uma linguagem "burocrática", entãããããããão tome cuidado com o que você vai fazer.

Usos da Linguagens

O Python é poderoso. Há muitos tipos de uso como:
- em scripts
- web, usando Frameworks como, Django, FlaskZope, etc
- CMS, como Plone
- Sistemas embarcados
- Games, usando por exemplo o  PyGame, PyOpenGL
- Jython - Python rodando na JVM
- IronPython - para .NET
- Procesamento de imagens - PIL - Python Imaging Library
- Interfaces Gráficas - PyGTK, PyQt
- etc.

Conclusão

Gostaria de escrever muito mais coisa sobre a linguagem, mas o post já está ficando comprido demais. O que escrevi foi o básico e bem superficial. Abaixo ficará algumas fontes, para quem se interessar mais. Ou entre em contato comigo no @AleUehara

E por último digite no interpretador python:
import this


The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Fontes: 

Site Oficial - Python
Python Brasil
Evento Python Brasil
Wikipedia - Python
Django Brasil
Python - Google Groups
Google Python Style Guide
Code Academy
Learn Python

- Livros
Dive into Python
Livros de Python
6 Livros Gratuitos Aprenda a Programar (em pt-br)
Tutorial de Python (em pt-br)

- Curso
Globalcode - Academia Python

- Video
Introducing Python
Show me Do
Python Brasil [5]

- Aplicativo no iPhone
Python for iOS

- Curiosidade
Mandelbrot in Python