segunda-feira, 30 de abril de 2012

Treinamento Oficial de Zabbix na Unirede - Minhas Impressões

De 09 à 13 de Abril de 2012 estive em Porto Alegre realizando o treinamento oficial em Zabbix na Unirede, várias pessoas me pediram para escrever um post sobre o assunto, o treinamento foi o primeiro em português, aberto ao público, já havia acontecido de forma fechada em alguns órgãos que contrataram esse modelo de turma fechada.

Foram 02 módulos:
ZABBIX Certified Specialist - 3 Dias.
ZABBIX for Large Environments - 2 Dias.

Resposta curta: Sim vale a pena fazer o treinamento, você vai aprender muita coisa, mesmo já tendo um bom tempo de vivência com o Zabbix.

Agora vamos a resposta longa, como cheguei nessa conclusão? São vários detalhes que me chamaram a atenção e que fizeram o treinamento valer a pena, vou listando como eles vão surgindo na minha mente, sem um sequencia pré-estabelecida, isto é um blog ;-)

Infra-Estrutura:
Foi alugada uma sala em local excelente no centro de Porto Alegre, uma sala simples, mas eficiente, mesas com um notebook cada uma, com a opção de você poder usar o seu próprio equipamento, o que me agradou de cara, pois podia ficar com a cópia das VMs, realizar anotações e checar meus e-mails de vez em quando, com tranquilidade pois era o MEU note, e eu sei o que tem rodando nele.

Projetor e ar condicionado compatíveis com nossas necessidades, 2 banheiros, água e café o dia todo a disposição. Coffe Break também compatível, apesar de não ter ficado aquela sensação de "nossa tinha uma mesa de 3 metros com 25 opções de salgados, 12 de bebidas e 18 de doces", também não tenho do que reclamar, tinha água, café, suco, doces e salgados, todos muito saborosos. o Coffe era servido de manhã e de tarde.

Material Didático:
Esse é o ponto mais fraco, a "apostila" são os slides que o instrutor utiliza impressos coloridos 4 por folha, mas esse material é fornecido pela ZABBIX SIA, eles apenas traduziram, fica claro para quem frequenta o fórum, mas principalmente para quem faz o treinamento que a ZABBIX SIA é uma empresa focada no produto dela, o Alexei é centralizador, e isso reflete em tudo, para um bom nerd, isso basta como material, mas como alunos esperamos algo melhor, se o livro "Zabbix 1.8 Network Monitoring - Rihards Olups" fosse oferecido junto com o treinamento, acredito que já resolveria o problema.
Acredito que falte ao Alexei uma postura mais Mark Zuckerberg, se ele quer ficar programando, não tem problema, mas contrate pessoas competentes para fazer o resto: Marketing, Parcerias, Material Didático, etc.

Conteúdo do Curso:
Só posso falar do curso que eu fiz, mas vou me arriscar a falar um pouco sobre o que eu imagino que rolou nos outros treinamentos.
Quem tem um pouco de maturidade sabe que marcas, nomes de empresas, tradições e etc, tem seu valor até um certo ponto apenas, o que realmente faz diferença, e faz o sucesso de uma marca, empresa, tradição e etc, são as pessoas, as pessoas fazem a diferença. Eu imagino que nos treinamentos anteriores realizados pelo Alexei e por pessoas da ZABBIX SIA eles mantiveram a linha nerd da empresa, ou seja, o treinamento foi excelente, mas tudo dentro do planejado, mostrando a ferramenta da maneira que ela foi planejada e executada, típico da maior parte do mundo, mas não do Brasil, novamente isso é muito bom em muitas situações, mas não em todas, e se foi assim, acredito que meu treinamento foi melhor.

O brasileiro é conhecido pelo seu "jeitinho", isso tem um lado perjorativo que eu odeio, tento combater e não aceito de maneira alguma. Mas tem o seu lado positivo, o brasileiro é inovador, criativo e mestre em usar algo para um fim totalmente diferente do que o proposto pelo projetista. E isto se aplica à Gerencia de redes também, as normas são importantes, mas entre deixar a rede parada e colocar um hub, ou fazer um "varal", usar um micro que tava jogado como roteador temporário, você pode ter certeza que qualquer profissional no Brasil escolhe a segunda opção, pessoas de outras culturas geralmente não tem essa visão, eles não vão tomar essa iniciative pois ela viola a norma.

Nós vimos tudo que estava previsto no material, e não era pouca coisa, acredito que apenas o primeiro treinamento deveria durar os 5 dias, pois o conteúdo é muito corrido, a quantidade de labs é pequena frente ao conteúdo e alguns assuntos como relatórios, por exemplo, nem fazem parte do conteúdo programático. O segundo treinamento em 2 dias está ótimo.

O Instrutor:
Deixei para falar por último do instrutor, pois como já disse no tópico anterior o que faz a diferença são as pessoas, o Luciano Alves é um cara mega comprometido com o Zabbix e com o trabalho que a Unirede desenvolve, eles são parceiros da ZABBIX SIA, responsáveis pela tradução do Manual em Português, e da área em Português do Fórum oficial, além é claro, dos Treinamentos Oficiais em Português.

A experiência que a Unirede e o Luciano possuem na ferramenta fizeram toda a diferença no treinamento, minhas anotações convertidadas para um arquivo de texto sem formatação, geraram 4 páginas em formato A4.

O comprometimento que o Luciano teve de almoçar TODOS os dias com o pessoal do curso, procurar outras opções para conhecermos vários locais, descer e participar de todos os coffe breaks, nos levar para jantar em uma churrascaria típica, com apresentação de dança típica gaúcha, vai muito além do papel de instrutor ou do representante de uma empresa que só quer vender seu produto.

Além disso ele nunca se recusou a abordar algo que não fazia parte do treinamento oficial, de responder dúvidas, que para muitos eram simples, mostrou vários exemplos de ferramentas e abordagens que eles fazem no Zabbix, discutiu várias idéias de como utilizar o Zabbix para atender demandas de clientes que não foram pensadas pelos desenvolvedores. Como, por exemplo, fornecer ao diretor da empresa uma visão do negócio em camadas, que ajudam na tomada de decisões, e não detalhes técnicos que só interessam ao operador.

Um dos participantes só fez o primeiro treinamento e passou os outros dois dias na Unirede acompanhando o trabalho do pessoal, um amigo e eu fomos visitar a Unirede.

Enfim o Luciano fez toda a diferença no treinamento!

Algumas Fotos do Treinamento:
Galera que fez o treinamento - Foto Oficial

Luciano durante o treinamento

Enéas concentrado no detalhe da foto

Luciano durante o treinamento

Luciano durante o treinamento

Treinamento Especialista Certificado 1º Dia

 
 Luciano durante o treinamento

Como a Unirede classifica os níves de alertas

Treinamento Especialista Certificado 2º Dia

Treinamento Especialista Certificado 3º Dia

Treinamento Zabbix para grandes Ambientes

Unirede

Eu e o Luciano na Unirede

Apostila do Treinamento Gerenciamento de Redes com SNMP

Atualização 22/08/2012 - Disponibilizada versão 2 da apostila.

Em 2007 meu amigo Conrado Pinto Rebessi, ministrou no FLISOL Campinas uma palestra intitulada "Gerenciamento de Servidores Linux Utilizando SNMP", nesta época eu usava o Nagios ou Cacti, não me lembro, para gerenciar a rede onde trabalhava e sempre enroscava no SNMP, antes da palestra dele, e das milhões de conversas posteriores a ela, eu não entendia aquele monte de números estranhos (OIDs) e nem o por que eu deveria usar SNMP e não o agente da ferramenta. No ano seguinte ao fazer minha especialização, um dos professores o Ranieri Marinho de Souza, me passou um material sobre teoria de gerencia de redes.

Desde essa época eu nunca mais parei de estudar gerência de redes, foram muitas horas lendo, testando, consultando man pages, documentação oficial do Net-SNMP e claro, conversando com o Conrado.

De 2007 até hoje muita coisa mudou, inclusive o fato de eu ter me tornado Professor das matérias de Gerência de Redes I e II na Graduação e Pós Graduação da Faculdade Policamp.

Sou funcionário da Unicamp, e já existe há alguns anos a cultura de treinamentos internos, ou do funcionário realizar um treinamento externo e replicar isso aos funcionários, mas a AFPU tem intensivado, incentivado e profissionalizado essas iniciativas. Algumas pessoas foram convidadas a realizar treinamentos, algumas pessoas, como eu, apresentaram uma proposta, e uma série de treinamentos voltados para a formação e especialização do profissional Administrador de Redes tem sido ofertados.

A apostila aqui disponível é o resultado de tudo que está escrito acima.

Abraços,
André Déo - 30/04/2012

quarta-feira, 4 de abril de 2012

O que dá para aprender sobre Python em 02:30 hs?

Introdução:
OK, Ok, eu sei que vai depender do contexto, de quem está ensinando, de quem está aprendendo, do propósito da aula, etc.

Vou contextualizar para vocês:
Turma de Sistemas de Informação e Análise e Desenvolvimento de Software, 3º Semestre, experiência de linguagem de programação anterior: C.

Objetivo:
Demonstrar o quanto Python é fácil e versátil.

Sobre o Professor:
A aula sobre Python foi ministrada pelo meu amigo e especialista na linguagem João S. O. Bueno <gwidion at gmail dot com>

Qualquer absurdo escrito abaixo é responsabilidade minha, já que essas são minhas anotações e o João pode ter dito banana e eu escrevi tamarina.


Diferenças entre as linguagens:
C --> Compilado
Python --> Bit Code --> Acessa a VM e depois acessa o Hardware
Java --> Bit Code --> Acessa a VM e depois acessa o Hardware

C e Java --> Linguagens Estáticas
Python, Php, Javascript --> Dinâmicas

Python você não declara as variáveis para depois usar, você cria e sai usando. Surgiu em 1991

Sites sobre Python:
http://python.org e http://www.python.org.br

Começando a brincadeira:
Estavamos em um laboratório com CentOS 5, e a versão do python bem desatualizada, mas vamos em frente.

$ python
Python 2.4.3 (#1, Feb 22 2012, 16:06:13)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-52)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

Soma:
>>> 2+2
4

Exponenciação:
>>> 2 ** 4
16

Criar uma string:
>>> 'qualquer coisa'
'qualquer coisa'
>>> "qualquer coisa"
'qualquer coisa'
>>>

Definindo Variáveis:
>>> a=10
>>> a
10

>>> a="deo"
>>> a
'deo'


>>> a="faculdade "
>>> b="politecnica"
>>> a+b
'faculdade politecnica'

Não posso somar texto com número:
>>> "50" + 50
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects
>>>

Converter dados:
>>> int("10")+20
30

Transformei o texto em inteiro e somei, poderia ter lido de um arquivo texto por exemplo.

Inverso do anterior:
>>> str(20)+"20"
'2020'

Importar a biblioteca para manipulação de comandos do SO:
>>> import os

Mostra o arquivo que contem as funções:
>>> os
<module 'os' from '/usr/lib/python2.4/os.pyc'>

Listar os arquivos do diretório corrente:
>>> os.listdir(".")
['.redhat', '.nautilus', '.viminfo', 'upgrade.log.syslog', '.mysql_history', 'install.log.syslog', '.ICEauthority', '.eggcups', '.gconf', '.bashrc', '.thumbnails', '.dmrc', '.tcshrc', '.recently-used', '.evolution', '.config', '.gnome2_private', '.recently-used.xbel', '.bash_logout', '.cshrc', '.gnome', '.gstreamer-0.10', '\npolicamp\nping www.polysolve.com\nPS1=C:z> ', '.xsession-errors', '.metacity', 'Desktop', '.bash_profile', 'install.log', '.gtkrc-1.2-gnome2', 'anaconda-ks.cfg', '.themes', '.icons', '.Trash', '.esd_auth', '.mozilla', '.gnome2', '.gconfd', 'upgrade.log', '.bash_history', '.openoffice.org2.0']

Pegando informações de um vetor:
>>> arquivos=os.listdir(".")
>>> arquivos[0]
'.redhat'

>>> arquivos[20]
'.gnome'

Arquivos 0,1,2:
>>> arquivos[0:3]
['.redhat', '.nautilus', '.viminfo']

Lista em Python:
>>> b=[1,2,3]
>>> b
[1, 2, 3]

>>> b[0]
1

Em Python tudo são objetos, por isso o "+" se comporta de uma maneira para texto e outra para número.
Chamando métodos:
os.listdir

os --> módulo
listdir --> método


Convertendo para maiúsculas:
>>> b="policamp"
>>> b.upper()
'POLICAMP'
>>> b
'policamp'

>>> arquivos[30]
'.themes'
>>> arquivos[30].upper()
'.THEMES'

Lista de todos os métodos disponíveis para o objeto, uso o dir.
>>> dir (b)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

strip remove espaços em branco:
>>> c = " campinas "
>>> c
' campinas '
>>> c.strip()
'campinas'

Verificar se todos são alfanuméricos: isalpha:
>>> "abcd".isalpha()
True
>>> "abcd5".isalpha()
False

Multiplicar string:
>>> "qwe"*5
'qweqweqweqweqwe'

Ver tamanho da string:
>>> a="Policamp campinas - teste"
>>> len(a)
25
>>> len(b)
25000000

Ver objeto da string:
>>> b[1]
'o'
>>> b[0:100]
'Policamp campinas - testePolicamp campinas - testePolicamp campinas - testePolicamp campinas - teste'
>>>

Programa que pega uma url e conta quantas imagens tem o site (string img):
>>> import urllib
>>> html=urllib.urlopen("http://www.seufuturonapratica.com.br/portal/index.php?id=99").read()
>>> len(html)
55162
>>> print html[0:100]
<!DOCTYPE html
        PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
        <meta http-equiv="Con
>>> html.count("<img")
179

Achar a primeira ocorrencia:
>>> html.find("<img")
4207

Exibir a url:
>>> print html[4207:4350]
<img src="typo3temp/menu/1f118291ac.gif" width="200" height="20" border="0" alt="Avalia��o Institucional" /></a><a href="index.php?id=3036" onf
>>>

LIVRO: O Mínimo Absoluto Que Todo Desenvolvedor De Software Absolutamente, Positivamente Precisa Saber Sobre Unicode E Conjuntos de Caracteres (Sem Desculpas!)
 
Fonte: http://local.joelonsoftware.com/wiki/O_M%C3%ADnimo_Absoluto_Que_Todo_Desenvolvedor_De_Software_Absolutamente,_Positivamente_Precisa_Saber_Sobre_Unicode_E_Conjuntos_de_Caracteres_%28Sem_Desculpas!%29

>>> print html[4207:4350].decode("latin1")
<img src="typo3temp/menu/1f118291ac.gif" width="200" height="20" border="0" alt="Avaliação Institucional" /></a><a href="index.php?id=3036" onf

Existe o método encode também, além do encode.

Quero pegar todas as url:

split corta o texto:
>>> c="abc, def, fgh"
>>> c.split(",")
['abc', ' def', ' fgh']

>>> imagens=html.split("<img")
>>> len(imagens)
180
>>> print imagens[1]
 src="typo3temp/menu/1f118291ac.gif" width="200" height="20" border="0" alt="Avalia��o Institucional" /></a><a href="index.php?id=3036" onfocus="blurLink(this);"  >
>>> print imagens[2]
 src="typo3temp/menu/3c997a0c3b.gif" width="200" height="20" border="0" alt="CPA" /></a><a href="index.php?id=5811" onfocus="blurLink(this);"  >

O For do python percorre elementos de uma sequencia:
>>> for letra in "palavra":
...    print letra * 3
...
ppp
aaa
lll
aaa
vvv
rrr
aaa

Nao preciso abrir chaves, mas preciso identar...


Posso cortar dados de uma string também:
>>> "policamp"[2:]
'licamp'

Mostrou a URL de todas as imagens:
>>> for tag in imagens[1:] :
...    print tag.split('"')[1]
...

Para aprender uma linguagem precisamos aprender 3 coisas:
for, if e como definir uma função:

IF:
>>> a =1
>>> if a == 1:
...   print "a vale 1"
... else:
...   print "nao"
...
a vale 1

Definir a Função:
>>> def soma (a, b):
...    return a + b
...
>>> soma(4, 5)
9
>>> soma("a", "b")
'ab'
>>> soma("a", 5)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in soma
TypeError: cannot concatenate 'str' and 'int' objects

>>> def testa(a) :
...    if a == 1:
...       print "a vale 1"
...    elif a < 5:
...       print "a eh menor que cinco"
...    else:
...       print "a eh grande"
...
>>> testa(1)
a vale 1
>>> testa(5)
a eh grande
>>> testa(4)
a eh menor que cinco

$ vi alo.py
# coding:utf-8

print "alô mundo"

$ python alo.py
alô mundo

Capturar dados:
$ vi alo.py
   
# coding:utf-8

nome = raw_input("seu nome ? ")
print "seu nome é", nome

$ python alo.py
seu nome ? André
seu nome é André

Pegar dados na sequencia inversa:
>>> a = [10,20,40]
>>> a[-1]
40
>>> a[-2]
20
>>> "abcde"[-1]
'e'

Programa que pergunta a url e baixa as imagens:
$ vi alo.py
   
# coding:utf-8
import urllib
def salva_imagem(url):
    try:
        dados = urllib.urlopen(url).read()
    except:
        print "erro para ", url
        return
    nome = url.split("/")[-1]
    arq = open(nome, "wb")
    arq.write(dados)
    arq.close()

def acha_urls(html):
    tag_imagens = html.split("<img")[1:]
    res = []
    for tag in tag_imagens:
        url = tag.split('"')[1]
        res.append(url)
    return res
   
pagina = raw_input("URL da qual baixar imagens: ")
html = urllib.urlopen(pagina).read()
imagens = acha_urls(html)
for imagem in imagens:
    print imagem
    salva_imagem(imagem)
   
Python com Interface Gráfica:
>>> import gtk

>>> janela = gtk.Window()
>>> botao = gtk.Button("Ok")

>>> def clicado(*args):
...         print "click"
...
   
>>> janela.add(botao)
>>> janela.show()
>>> botao.show()
>>> botao.connect("clicked", clicado)
>>> gtk.mainloop()

Como instalar bibliotecas no Python:
 
Ele tem um gerenciador de pacotes dele:
# yum install python-setuptolls.noarch

Instalar a biblioteca de Games para Python:
# easy_install pygame

py2exe --> Gera um "exe" do seu ".py" para distribuir para os usuários finais.

.pyc --> python compilado, geralmente o .py esta no mesmo diretorio

Na declaração da função ou na criação do programa, se na primeira linha eu usar
""" --> Documentação de help
bla bla bla
"""" --> Fechei a documentação

Igual o <<Label
bla bla bla
Label --> Em Shell Script

Ver o help:
>>> import os
>>> help(os)
q --> para sair

Orientação a objetos em Python:
>>> class Pessoa(object):
...     pass
...
>>> p = Pessoa()
>>> p
<__main__.Pessoa object at 0xb7b78eac>
>>> p.nome = "Joao"
>>> p.nome
'Joao'

>>> class Pessoa(object):
...     def __init__(self, nome="", idade=None):
...         self.nome = nome
...         self.idade = idade
...     def __repr__(self):
...         return "Pessoa: " + self.nome
        def maior_de_idade(self):
            if self.idade is None:
               raise Exception("Idade nao definida")
            return self.idade >= 18
...
>>> p = Pessoa()
>>> p
Pessoa:
>>> p = Pessoa("Daniel")
>>> p
Pessoa: Daniel
>>> p.nome
'Daniel'
>>> p.idade
>>> p.idade = 23
>>> p.idade
23
>>> p.idade = 18
>>> p.maior_de_idade()
True
>>> p2 = Pessoa("Luciana")
>>> p2
Pessoa: Luciana
>>> p2.maior_de_idade()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 9, in maior_de_idade
Exception: Idade nao definida

Livros sobre Python:
http://www.python.org.br/wiki/AprendaMais

Bom, foi essa a experiência que eu tive em 02:30 hs de aula de Python. Espero que seja tão útil para quem ler quanto foi para mim!

Obrigado João.