terça-feira, 30 de setembro de 2014

Material do SQLSat #325

No fim de semana que passou eu tivemos mais um SQLSat no Brasil, dessa vez em São Paulo. Novamente foi um prazer reencontrar a comunidade técnica e amigos, mas o que me surpreendeu mesmo foi a quantidade de ex-alunos da Nimbus no evento. Isso mostra que nosso público está interessado em aprender continuamente, o que justifica serem excelente profissionais em suas empresas.

Abaixo segue link para download do conteúdo e comentários sobre minhas palestras.

Entendendo o paralelismo no SQL Server
Essa foi a mesma sessão que eu apresentei no SAT de Porto Alegre, mas particularmente eu preferi essa apresentação. Acho que fui mais consistente e passei tudo o que eu queria, com uma excelente recepção por parte do público. A parte chata foi que faltando uns 20 minutos para terminar a sessão, muitas pessoas entraram e minha sala lotou, isso aconteceu porque outra sessão estava atrasada e muitas pessoas acabaram perdendo mais da metade da minha palestra, uma pena.

De qualquer forma abaixo está o conteúdo da palestra e demos, para que todos possam brincar em casa ou no trabalho:

Do MTA ao MCM*, carreira SQL Server e DBA multiplataforma

Última sessão do dia e sobre carreira, expectativa de sala não muito cheia, o que se confirmou... E foi massa! O caráter intimista da sessão possibilitou algumas pessoas falar, conversamos sobre SQL Server, mercado no Brasil, certificações e carreira como DBA. Nem precisa falar que sobrou muita crítica, tanto para empresas como para os profissionais, e como diria o Leka, o nome da sessão deveria se chamar “verdade nua e crua”.


Agora é aguardar o próximo evento e quem sabe ano que vem eu não animo de fazer outro SAT em Brasília...

Abraços,

sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

terça-feira, 15 de julho de 2014

MVP 5.0, copa do mundo, carreira, Nimbus…

Em Julho tive a grata notícia da renovação do meu título de MVP por mais um ano. Sempre rola um frio na barriga esperando o e-mail em 1º de Julho, que é o meu ciclo de renovação, mas correu tudo bem e estou feliz por não ter que alterar minha assinatura de e-mail. Legar também ver que Fabiano Amorim e Diego Nogare renovaram, e tivemos a nomeação do Marcelo Fernandes, outro conhecido da comunidade SQL Server.

Conhecendo os MVPs, meu recente contato com outras tecnologias e a comunidade técnica de SQL Server, digo com certeza: Agradeça por existir uma comunidade tão vibrante em torno de um produto! É muito satisfatório poder participar de encontros técnicos, SQLSats, eventos online e continuamente aprender sobre um produto com diferentes pessoas.

E o que espero para 1º de Julho de 2015? Que eu escreva um post de MVP 6.0, mas quero que a cada ano esse e-mail seja mais “suado”, não porque minhas contribuições vão diminuir, pelo contrário, porque torço para que sempre outros candidatos a MVPs estejam surgindo e contribuindo bastante, para que novos experts surjam e que as discussões fiquem cada vez mais avançadas. Assim vamos criando uma cultura positiva e ajudando uns aos outros.

Em Julho também foi o encerramento da nossa copa do mundo, campeonato que eu vivi intensamente. De um início onde eu não estava me importando (veja P.S.1!), mesmo sendo viciado em jogar futebol, até o dia em que um amigo me liga e diz: comprei os jogos de Brasília, só falta você transferir o dinheiro (de graça não foi, infelizmente! :-)). Depois do primeiro jogo da seleção, da ida ao estádio, de cantar o hino nacional e resolver torcer para valer, eu estava envolvido. E sofri demais na humilhação dos dois últimos jogos, principalmente no 7x1 da Alemanha, em que não saí da frente da televisão até o apito final.

E o que a copa e a surra da Alemanha têm a ver com esse blog? Ouvi de uma pessoa que foi apenas um jogo, perdeu e pronto, nada demais... Será??? Discordo, e quem pensa isso acho que poderia aproveitar melhor o contexto e exemplos que lhe são oferecidos. Tivemos uma demonstração do que a aplicação, trabalho em equipe e planejamento podem trazer, que somente a raça ou talento de poucos não ganha jogo (muito menos estilo duvidoso e cabelo pintado!). Quem não consegue traçar um paralelo disso com sua carreira ou trabalho, está realmente perdido.

Muitos querem ser como os campeões Alemães, ganhar excelentes salários, ter destaque nas suas empresas, reconhecimento pelo trabalho bem feito e saborear a maravilhosa sensação depois de grandes conquistas. Porém poucos tem a coragem de correr atrás de um objetivo maior, de aceitar o desafio e tentar se superar, de entender quais são seus defeitos, de pedir ajuda e estar continuamente melhorando. E assim esses serão atropelados por outros profissionais (P.S.2!), equipes ou empresas, e ficarão atordoados, como o time do Brasil ficou, e boa parte da nação também.

São esses momentos que colocam a gente para pensar, todo mundo passa por isso na vida, no meu caso pelo menos uma vez por ano. Depois de um triste episódio no ano passado parei para refletir e decidi experimentar a vida de DBA DB2 no Sicoob, decisão que não me arrependo, porém inevitavelmente diminuiu o ritmo da Nimbus... Situação que está mudando recentemente, também depois de longos períodos de reflexão, e espero que você que aprecia treinamentos diferenciados ministrados por Profissionais, possa aproveitar.

Em um mundo de constantes mudanças, principalmente para quem vive na área de tecnologia, o dia de amanhã vai trazer novas surpresas. Cabe a você decidir se quer estar preparado e receber uma boa notícia, ou continuar achando que a vida é injusta e que o jeitinho brasileiro vai resolver tudo na hora H, como funcionou extremamente bem na copa do mundo. :-(

Um grande abraço de um geek que continuamente pensa que não sabe merda nenhuma, mas acredita que está indo no caminho certo, e quer aproveitar com intensidade o que essa vida tem a oferecer.

sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br


P.S.1: Temos muita coisa errada nesse país, que muito dinheiro foi desperdiçado e roubado para essa copa do mundo acontecer, mas não vou entrar nesse mérito aqui. Acho que temos sim que lutar por melhorias e que muito começa em casa, sendo um processo paulatino, mas que ainda batalharemos por muitas mudanças.

P.S.2: Mas fique tranquilo que mesmo com profissionais melhores, você não ficará sem emprego, pois o mercado é uma mãe! O déficit de profissionais gera vaga para todo mundo, então qualquer um zé mané tem vaga hoje, mas quem sabe essa situação não muda...

sábado, 14 de junho de 2014

Novas turmas na Sr. Nimbus

Pessoal, recentemente anunciamos duas turmas do treinamento Mastering SQL Server 2012 (onde já pretendo falar um pouco das novidades do SQL Server 2014), uma para Brasília e outra para São Paulo:
·         Brasília – Noturno – 04/08 a 15/08
·         São Paulo – Integral – 22/09 a 26/09
Além disso, o Fabiano Amorim publicou um novo treinamento de performance, chamado “SQL Server Performance with nowait”, que já está bombando e você pode se inscrever aqui: http://www.srnimbus.com.br/calendario/sql25_spout2014/. Mais detalhes ele publicou no blog dele http://blogfabiano.com/2014/05/29/treinamento-tuning-em-so-paulo-outubro-2014/.
Já temos muitas reservas para os treinamentos, então acessem o link acima e façam a sua reserva.
Abraços,
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

SQLSat #325 - São Paulo

Como muitos já devem saber em Setembro teremos mais um SQLSat no Brasil, dessa vez em São Paulo. Acho que o evento dispensa apresentações, mas se você não sabe muito sobre os SQLSats recomendo que visite o site: http://www.sqlsaturday.com/.
Na semana anterior eu estarei em SP ministrando o treinamento Mastering SQL Server 2012 (antigo Internals) e aproveitei para submeter três sessões, que ainda não formam aprovadas (espero que no máximo duas sejam aprovadas, senão estou lascado!).

Título: Database Engine Internals: SQL Server x DB2
Descrição: Profissionais de banco de dados deveriam conhecer o funcionamento da engine de seu banco de dados, para poder tirar o máximo de proveito dos recursos e não somente usar as ferramentas disponíveis. O objetivo desta sessão é fazer um comparativo entre a engine do SQL Server e a do DB2, mostrando as semelhanças e os pontos fortes e fracos de cada uma delas, explorando assuntos como gerenciamento de memória, processamento de requisições, lock manager, entre outros aspectos. Idealmente o profissional já deve possuir experiência com bancos de dados relacionais e saber que na sessão não será defendido um produto ou o outro, mas sim uma análise imparcial. (http://www.sqlsaturday.com/viewsession.aspx?sat=325&sessionid=23469)

Título: Entendendo o paralelismo no SQL Server
Descrição: Um assunto recorrente em discussões sobre SQL Server é o uso do paralelismo, e sempre fica a pergunta, é bom ou ruim? Nessa sessão vamos ver detalhes do paralelismo no SQL Server, configurações que influenciam seu uso (MAXDOP = 1?), entender o famoso wait type CXPACKET e analisar diversas consultas paralelas. Ao fim da sessão você vai poder olhar para o paralelismo com um olhar crítico e realista! (http://www.sqlsaturday.com/viewsession.aspx?sat=325&sessionid=23468)

Título: Do MTA ao MCM*, carreira SQL Server e DBA multiplataforma
Descrição: Nesta sessão vamos conversar e, provavelmente, discutir um pouco sobre o mercado de SQL Server. Além de discutir quais são as atividades relacionadas ao SQL Server, vamos entender quais são as vagas que andam em destaque, o valor e caminho da certificação e a realidade de se tornar um DBA multiplataforma. (http://www.sqlsaturday.com/viewsession.aspx?sat=325&sessionid=23470)

A primeira sessão é a novidade que trago para esse SQLSat, onde se aprovada pretendo fazer um fast deep dive nas engines do SQL Server e DB2, comparando aspectos que considero mais relevantes. Acredito que ainda estou longe de saber detalhes do DB2 como eu sei do SQL Server, mas o exercício de ministrar a palestra e a preparação sempre me ajuda a estudar mais. Se você espera que eu vá ficar lá defendendo o SQL Server, está enganado. Será um comparativo direto e sem preconceito, mas claro que vou expor minha opinião sobre diversos assuntos.
A segunda sessão que submeti é sobre paralelismo e é a mesma que fiz no SQLSat em Porto Alegre, que foi classificada como a segunda melhor sessão do evento (para os curiosos, a sessão do Fabiano Amorim foi classificada como a melhor! #DisputaNimbus). Gostei bastante da sessão que montei, mas pretendo melhorar algumas coisinhas para SP.
Por fim a última sessão é voltada para carreira e baseada na sessão que fiz no SQLSat de Brasília no ano passado, claro que com as devidas atualizações, novas impressões e muito criticismo.
O SQLSat não é um evento que deve passar em branco. Então veja tudo sobre o evento no site: http://www.sqlsaturday.com/325/eventhome.aspx
Abraços,
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

segunda-feira, 31 de março de 2014

DB2 trap problem determination

Durante minha vida profissional pude observar muitas análises ruins quando se está tentando determinar a causa raiz de um problema. O x da questão usualmente não é a qualidade técnica do profissional, mas sim a metodologia adotada detalhar a situação para se criar uma linha de eventos válida, somada a uma frequentemente falta de paciência em varrer os logs e analisar com calma as evidências.
Pensando nisso eu escrevi um pequeno passo a passo para uma identificação de causa raia que fiz em uma instância do DB2 que uso para meus testes, onde sem querer esbarrei em um bug do DB2. Espero que sirva como um bom exemplo de análise, independente do produto que você trabalha.

Cenário: em meu ambiente de laboratório eu notei que uma instância do DB2 recorrentemente parava de funcionar na madrugada, sendo necessário um db2start para coloca-la operacional.

Como fiz a análise...

1.      Partindo de um momento perto do horário em que o serviço foi interrompido analisa-se o diaglog, onde encontro uma entrada muito importante:

2014-03-26-00.43.45.477605-180 I38149015A601        LEVEL: Error
PID     : 9475                 TID : 4383345469712  PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000           DB   : HCOREDB
APPHDL  : 0-10765              APPID: *LOCAL.db2inst1.140326052243
AUTHID  : DB2INST1             HOSTNAME: db2luti
EDUID   : 5674                 EDUNAME: db2agent (HCOREDB) 0
FUNCTION: DB2 UDB, base sys utilities, sqleagnt_sigsegvh, probe:1
MESSAGE : Error in agent servicing application with coor_node:
DATA #1 : Hexdump, 2 bytes
0x000003FC9380996C : 0000

2.      Em seguida começamos a ver diversas entradas no diretório do FODC (First Ocurrence Data Capture). Analisando o diretório FODC temos N diretórios com o timestamp do trap, o de nosso interesse é FODC_Trap_2014-03-26-00.43.45.300571_0000.
3.      Neste diretório temos diversos artefatos que foram gerados, mas para essa análise o que nos interessa é o arquivo com trap, que é um snapshot do estado do DB2 quando o stack dump foi capturado (*.trap.txt).
a.      Neste caso foi gerado o 9475.5674.000.trap.txt;
b.      Notem o PID e EDUID destacados no diaglog, o nome do arquivo do trap é iniciado pelo process ID do db2sysc no Linux e o EDU ID do agente;

4.      O arquivo do trap tem diversas informações, entre elas a stack que fica um pouco chata de ler por conta dos nomes gerados pelo compilador. Então para analisar o arquivo e limpar o nome dos métodos, peçam ajuda ao c++filt:

cat 9475.5674.000.trap.txt | c++filt | less

a.      Signal #11 Indica um erro inesperado (9 é o SIGKILL, 2 é o SIGINT, etc..;)

Signal #11 (SIGSEGV): si_addr is 0x000003FC2640A000, si_code is 0x00000002 (SEGV_ACCERR:Invalid permissions for mapped object.)

b.      A entrada <POFDisassembly>  (POF = Point Of Failure) é o método que estava sendo executado quando o problema aconteceu.

<POFDisassembly>
sqldHashZValue32(int, sqlz_value**, sqld_sortkey**) + 0x0116   (/home/db2inst1/sqllib/lib64/libdb2e.so.1)

c.       Isso já dá um ótimo filtro de pesquisa no Google ou Bing, tentem: db2 10.1 “sqldHashZValue32”
                                                              i.      De cara a primeira saída é interessante: http://www-01.ibm.com/support/docview.wss?uid=swg1IC92798 (IC92798: RUNNING MULTIPLE CONCURRENT SAMPLED DETAILED INDEX RUNSTATS MIGHT CAUSE A SERVER ABEND OR INACCURATE INDEX STATISTICS)

d.      Na APAR temos o detalhamento do problema e stack trace de interesse:

sqloEDUCodeTrapHandler
sqldHashZValue32
sqlis_touch_page
sqliProcessColStats
sqlischs
sqlistat
sqldIndexStats
sqlrLocalRunstats

e.      Para garantir que se trata do mesmo problema, vamos comparar a stack no arquivo de trap:

0x000003FFFAAC4888 sqloEDUCodeTrapHandler + 0x0250 (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FC93809DF0 address: 0x3fc93809df0
0x000003FFF8BB97D6 sqldHashZValue32(int, sqlz_value**, sqld_sortkey**) + 0x0116
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFC8A92 sqlis_touch_page(unsigned long, schs_cluster_data*) + 0x00ca
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFB0C46 address: 0x000003FFFBFB0C46 ; dladdress: 0x000003FFF74C9000 ; offset in lib: 0x0000000004AE7C46 ;
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFB5B32 sqliProcessColStats(schs_data*, SQLI_CB*, unsigned int*) + 0x052e
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFB7314 sqlischs(SQLI_CB*, SQLD_ISTAT*, SQLD_CSTAT*, SQLD_TSTAT*, schs_data*, int) + 0x0e4c  (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFC143CF2 sqlistat(sqeAgent*, SQLD_CCB*, unsigned int, SQLD_IXCB*, SQLD_ISTAT*, SQLD_CSTAT*, SQLD_TSTAT*) + 0x100e
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFF8CBA094 sqldIndexStats(sqeAgent*, unsigned short, unsigned short, unsigned char, unsigned short, int, unsigned int, SQLD
_ISTAT*, SQLD_TSTAT*, char*, int, char*, int, unsigned int, bool&) + 0x0b58
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFAF28004 sqlrLocalRunstats(sqlrr_cb*, sqlrrstring*, sqlrrstring*, sqlrrstring*, ….

f.        Coincidência? A APAR diz que o problema foi corrigido no fix pack 3, e qual a nossa situação.

Ø  db2level

db2inst1@db2luti:/db2/db2inst1/diaglog> db2level
DB21085I  This instance or install (instance name, where applicable: "db2inst1") uses "64" bits and DB2 code release "SQL10012" with level identifier "0203010E".
Informational tokens are "DB2 v10.1.0.2", "s121127", "IP23396", and Fix Pack "2".

g.      Analisando a CRONTAB do servidor db2luti temos um agendamento marcado para executar todos os dias exatamente 00:43h. Que bate exatamente com o timestamp do diaglog (00.43.45.477605).

43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb1
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb2
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb3
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb4


Conclusão

O agendamento que eu criei para testar variações da rotina de runstats é executada em cinco bancos de dados no mesmo horário, o que nos coloca no cenário do bug. Como paliativo podemos alterar o agendamento, mas a solução definitiva é aplicar o Fix Pack 3 do DB2.

Claro que a análise em si levou mais tempo, pois foi necessário varrer em maior detalhe o diaglog, correlacionar eventos, analisar a APAR, entre outros. É esse cuidado que muitos não têm e como resultado são feitas análise incorretas, onde já vi sugestão de se aplicar fix em que a mensagem de erro é igual, mas com uma stack totalmente diferente, o que significa não se tratar do mesmo problema.

Para quem está procurando material de referência, infelizmente não tenho um link específico, mas participei de um bom seminário em 2013 no IDUG em Barcelona (http://www.idug.org/emea2013) chamado “DB2 LUW Problem Determination and Troubleshooting Workshop”, com o Pavel Sustr e Samir Kapoor. Eles estarão presentes no IDUG 2014 em Phoenix (que acontecerá agora me Maio), então se estiverem por lá eu recomendo participar deste workshop de um dia.

Espero que o exemplo seja útil, não para esse caso em si, mas para ilustrar um pouco a prática na análise de problemas. Espero postar aqui mais casos de análise.

Abraços,

sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

terça-feira, 18 de março de 2014

PASS Summit para Brazucas

OBS: já comprei minha passagem e estarei no PASS Summit 2014!

Atendendo pedidos escrevo esse post, que espero que esse seja um living post, com diversas atualizações e dicas para Brasileiros que irão ao PASS Summit em Seattle, pois é um lugar que conheço razoavelmente bem...
·         PASS Summit 2013: http://www.sqlpass.org/summit/2013/Sessions.aspx
·         PASS Summit 2014: http://www.sqlpass.org/summit/2014/RegisterNow.aspx
·         Meus posts do PASS Summit 2012:
A viagem
Seattle não fica ali na esquina, então se prepare para uma viagem cansativa. A menos que você pegue alguma promoção eu espero que gaste entre R$ 2.500,00 e R$ 3.500,00 na passagem aérea, se tiver milhas para gastar, melhor. O aeroporto que você quer é Seattle Tacoma International Airport (Sigla: SEA - http://www.portseattle.org/Sea-Tac/Pages/default.aspx).
Para quem sai de Brasília a Delta oferece os melhores trechos, sendo o melhor BSB – Atlanta – Seattle (média de 17 horas de viagem). Vale ressaltar que o trecho dentro dos EUA é longo, com mais que 4 horas, e as refeições usualmente pagas. Então aproveito os minutos no aeroporto de entrada nos EUA para comprar alguma coisa para comer e já faço um teste com o cartão de crédito, para ver se foi liberado para uso no exterior.
Outra coisa que gosto de fazer é sair na sexta-feira de noite e chegar sábado de manhã em Seattle, assim eu aproveito o fim de semana antes do evento. Costumo voltar no voo de sábado, para chegar domingo cedo no Brasil, curtir a família e descansar para a segunda-feira.
O evento
O Summit tem 3 dias de duração com sessões diversas, precedido por 2 dias de pre-con (pagos à parte, US$ 495 cada). Idealmente você compra seu ingresso com bastante antecedência (se comprar até o fim desse ano o Summit de 2015 o desconto é muito bom!) e também as pre-sessions, que costumam ter de altíssimo nível. Não deixe de comprar o DVD Set com as gravações do evento, que para participantes costuma sair por US$ 195,00 e muito legal, pois usualmente existe colisão de horário entre grandes sessões.
O evento acontece no centro de convenções da cidade, o Washington State Conference Center (http://www.wscc.com/), que é um lugar grande, bem localizado e que acomoda muito bem um evento desse porte.
Caso você não vá participar da pre-con, pode procurar outros eventos, com o SQLSaturday que costuma acontecer nas redondezas de Seattle ou SQL in the City da RedGate (http://sqlinthecity.red-gate.com/), que torço para acontecer neste ano.
Dicas para aproveitar ao máximo o evento
TODO
Carro
Durante o evento é besteira você ficar com o carro, a menos que queria sair de noite para lugares mais longes, porém no centro de Seattle tem muita coisa legal para fazer, então minha recomendação é para pegar um carro antes ou depois do evento. Aí você deve considerar se o seu hotel tem incluso estacionamento, pois alguns cobram uma taxa (ex.: US$ 15) pela diária do estacionamento.
Outra dica é ficar atendo a lugares onde se pode estacionar e horários permitidos, pois é normal ficarmos sabendo de história onde amigos tomaram multa. Eu nunca tomei, mas bastou empresar um dia o carro que tomaram uma por mim! Hehehehe
Como o aluguel da semana é relativamente barato, muitos acabam optando por ficar a semana inteira com o carro. Se você optar por isso, ao invés de pagar a diária do GPS, por um pouco mais você compra um GPS novo e fica com ele para você.
Hospedagem
Ao lado do evento existem hotéis excelentes, como o Sheraton, Hilton, Crowne, Westin e W hotel, todos muito bons, mas um pouco salgado ($$$).
No meu caso eu costumo ficar nos hotéis pertos do Space Needle, que tem um bom custo benefício e são relativamente perto do centro de convenções (8 a 10 quarteirões – 15 a 20 minutos de caminhada). Alguns deles (busque por “<nomedoHotel> by the space needle”):
·         Travelodge: http://www.travelodgeseattlecenter.com/
Além do estacionamento duas outras coisas que sempre checo é o café da manhã e política de entrega de pacotes, pois alguns hotéis cobram para guardar e entregar suas encomendas.
Clima
TODO
Compras
Esse aqui Brasileiro curte:
·         Eletrônicos: Bestbuy que nada, eu gosto de ir à Frys, que é uma loja de eletrônicos imensa que tem perto do aeroporto de Seattle (SEA-TAC) - http://www.frys.com/.
·         Seattle Premium Outlet: aaaaahhhh, outlets, ruim né? O de Seattle fica longe da cidade, então recomendo ir de carro.
o   Faça seu cadastro no site, imprima as promoções e pegue o cupom book, que dá bons descontos no outlet.
·         Toys r’us e Baby r’us: para quem tem filho é parada obrigatória e existem lojas espalhadas ao redor de Seattle.
Não vou esticar aqui mais lojas, se quiserem mais dicas peçam.
O que visitar e conhecer
TODO – Provavelmente a parte mais longa deste post

Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br