quinta-feira, 3 de dezembro de 2020

O básico de Python 3

Python foi desenvolvido por Guido van Rossum no início dos anos 1990 e sua versão mais recente é 3.7.1, podemos simplesmente chamá-lo de Python3. Python 3.0 foi lançado em 2008. e é uma linguagem interpretada, ou seja, não é compilado e o intérprete verifica o código linha por linha. Este artigo pode ser usado para aprender os fundamentos da linguagem de programação Python.

Portanto, antes de prosseguirmos ... vamos fazer a tradição "HelloWorld" mais popular e, portanto, comparar a sintaxe do Python com C, C ++, Java (eu peguei essas 3 porque são as linguagens mais famosas e mais usadas).

# Código python para imprimir na tela "Hello World" 
# nada mais para escrever.. viu como python é simples.
  
print("Hello World")

Nota: Por favor, note que Python para seu escopo não depende das chaves ({}), em vez disso, ele usa recuo para seu escopo.

Agora avançando vamos começar nossos fundamentos do Python. Estarei cobrindo o básico em algumas pequenas seções. Basta passar por eles e, acredite, você aprenderá o básico do Python com muita facilidade.

Introdução e configuração

Se você estiver no sistema operacional Windows, baixe o Python clicando aqui e agora instale a partir da configuração e no menu iniciar digite IDLE.IDLE, você pode considerá-lo um IDE do Python para executar os scripts do Python.

Será algo assim: 


 

Se você estiver em um sistema Linux/Unix, basta abrir o terminal e, em 99% dos sistemas operacionais linux, o Python vem pré-instalado com o sistema operacional. Basta digitar ‘python3’ no terminal e pronto.

Deve aparecer algo como isso: 


 

O ">>>" representa o shell python e está pronto para receber comandos e código Python.

Variáveis e Estruturas de Dados

Em outras linguagens de programação como C, C++ e Java, você precisará declarar o tipo de variáveis, mas em Python você não precisa fazer isso. Basta digitar a variável e quando os valores forem dados a ela, ele saberá automaticamente se o valor dado seria um int, float ou char ou mesmo uma String.

Código:

# Declarando variáveis em python
myNumber = 3
print(myNumber) 
  
myNumber2 = 4.5
print(myNumber2) 
  
myNumber ="helloworld"
print(myNumber) 

Saída:

3
4.5
helloworld

Veja como é simples, basta criar uma variável e atribuir a ela qualquer valor que você quiser e então usar a função de impressão para imprimi-la. Python tem 4 tipos de estruturas de dados integradas, a saber, lista, dicionário, tupla e set.

Lista é a estrutura de dados mais básica em python. Lista é uma estrutura de dados mutável, ou seja, os itens podem ser adicionados à lista posteriormente após a criação da lista. É como se você fosse fazer compras no mercado local e fizesse uma lista de alguns itens e, mais tarde, você pudesse adicionar mais e mais itens à lista. A função append() é usada para adicionar dados à lista.

Código:

# programa python para ilustrar uma lista 
  
# cria uma lista vazia
nums = []  
  
# adiciona dados a lista
nums.append(21) 
nums.append(40.5) 
nums.append("String") 
  
print(nums) 

Saída:

[21, 40.5, String]

Entrada e saída

Nesta seção, aprenderemos como obter informações do usuário e, portanto, manipulá-las ou simplesmente exibi-las. A função input() é usada para obter a entrada do usuário.

# Programa pytho para ilustrar
# como solicitar dados ao usuário
name = input("Entre com seu nome: ")  

print("Olá,", name) 

Saída:

Entre com seu nome: Ana
Olá, Ana

Código:

# Programa para obter a entrada do usuário
  
# aceitando um inteiro do usuário
# o tipo de retorno da função input() é string,
# então precisamos converter a entrada em inteiro

num1 = int(input("Entre com o primeiro número: ")) 
num2 = int(input("Entre com o segundo número: ")) 
  
num3 = num1 * num2 
print("O produto dos números informados é: ", num3) 

Saída:

Entre com o primeiro número: 6
Entre com o segundo número: 9
O produto dos números informados é:  54

Seleção

A seleção em Python é feita usando as duas palavras-chave ‘if’ e ‘elif’ e else (elseif)

# Programa python para ilustrar
# declarações de seleção
  
num1 = 34
if(num1>12): 
    print("Num1 é bom") 
elif(num1>35): 
    print("Num2 não é booommm....") 
else: 
    print("Num2 é ótimo!") 

Saída:

Num1 é bom

Funções

Você pode pensar em funções como um monte de código que se destina a realizar uma tarefa específica em todo o script Python. Python usou a palavra-chave ‘def’ para definir uma função.

Sintaxe:

def função_nome(argumentos):
    # conpo da função

Código:

# Programa para ilustrar
# funções
def hello(): 
    print("Olá") 
    print("Olá de novo")

# chama a função hello
hello() 
  
# chama a função de novo 
hello()

Saída:

Olá
Olá de novo
Olá
Olá de novo

Agora, como sabemos, qualquer programa começa com uma função ‘principal’ ... vamos criar uma função principal como em muitas outras linguagens de programação.

Código:

# programa python para ilustrar
# uma função principal
def obter_inteiro(): 
    resultado = int(input("Entre com um número inteiro: "))
    
    return resultado
  
def função_principal(): 
    print("A função principal começou") 
  
    # chama a função obter_inteiro
    # e guarda o resultado da função obter_inteiro
    # na variável saída
    saída_de_obter_inteiro = obter_inteiro()      
    print(saída_de_obter_inteiro) 
  
# Verifica se esse é o arquivo principal
# e se for chama a função função_principal()
if __name__=="__main__": 
    função_principal() 

Saída:

A função principal começou
Entre com um número inteiro: 8
8

Iteração (Looping)

Como o nome sugere, um looping fica executando a mesma coisa continuamente. Usaremos o loop ‘for’ por ser o mais popular.

Código:

# programa python para ilustrar
# o uso do loop for

for step in range(5):     
    print(step) 

Saída:

0
1
2
3
4

Modulos

Python possui uma biblioteca de módulos muito rica que possui várias funções para realizar muitas tarefas.

A palavra-chave ‘import’ é usada para importar um módulo específico para o seu código Python. Por exemplo, considere o seguinte programa.

Código:

 
# importa o modulo math
import math 
  
def Main(): 
    num = -85
  
    # fabs é usado para obter o valor absoluto
    # de um decimal
    num = math.fabs(num)  
    print(num) 
      
      
if __name__=="__main__": 
    Main() 

Saída:

85.0

Esses são alguns dos princípios básicos da linguagem de programação Python e estarei cobrindo os tópicos de Python de nível intermediário e avançado em meus próximos artigos.

Traduzido por Acervo Lima de Python 3 basics.
Artigo escrito por prabaltiwari09, tejshreelavatre, Kiran Kotari e kainanjali80.

Introdução à linguagem Python

Python é uma linguagem de programação de alto nível de uso geral amplamente usada. Foi criado por Guido van Rossum em 1991 e posteriormente desenvolvido pela Python Software Foundation. Ele foi projetado com ênfase na legibilidade do código e sua sintaxe permite que os programadores expressem seus conceitos em menos linhas de código.

Python é uma linguagem de programação que permite trabalhar rapidamente e integrar sistemas com mais eficiência.

Existem duas versões principais do Python: Python 2 e Python 3. Ambas são bastante diferentes.

Começando com a programação em Python:

Encontrar um interpretador

Antes de iniciarmos a programação Python, precisamos ter um interpretador para interpretar e executar nossos programas. Existem alguns interpretadores online como IDE GeeksForGeeks, ideone ou codepad que podem ser usados para executar programas Python sem instalar um interpretador no seu computador. Mas o mais comum é instalar um interpretador na sua máquina. E isso pode ser feito tanto no Windows, Linux e Mac.

Windows: Existem muitos intérpretes disponíveis gratuitamente para executar scripts Python como IDLE (Integrated Development Environment) que vem junto com o software Python baixado de http://python.org/.

Linux: Python vem pré-instalado com distros populares de Linux, como Ubuntu e Fedora. Para verificar qual versão do Python você está executando, digite “python” no emulador de terminal. O interpretador deve iniciar e imprimir o número da versão.

macOS: geralmente, o Python 2.7 vem com o macOS. Você terá que instalar manualmente o Python 3 em http://python.org/.

Escrevendo nosso primeiro programa

Basta digitar o código a seguir após iniciar o interpretador.

Código:

# começo do Script

print("Acervo Lima") 

# fim do Scripts 

Saída:

Acervo Lima

Vamos analisar o script linha por linha.

Linha 1: [# começo do Script] Em Python, os comentários começam com um #. Esta declaração é ignorada pelo interpretador e serve como documentação para nosso código.

Linha 2: [print("Acervo Lima")] Para imprimir algo no console, a função print() é usada. Esta função também adiciona uma nova linha após a impressão de nossa mensagem (ao contrário de C). Observe que no Python 2, “print” não é uma função, mas uma palavra-chave e, portanto, pode ser usada sem parênteses. No entanto, no Python 3, é uma função e deve ser chamada entre parênteses.

Linha 3: [# Script termina] Este é apenas outro comentário como na linha 1.

Traduzido por Acervo Lima de Python Language Introduction.
Artigo escrito por shivamsaraswat, lalitshankarch.

quinta-feira, 1 de outubro de 2020

Juntando tabelas em uma base de dados relacional com SQL

Photo by Tim Johnson on Unsplash

No primeiro post sobre a linguagem SQL fomos apresentados ao conceito de bancos de dados relacionais e a um aplicativo que nos possibilita armazenar dados em tabelas relacionadas. Nessas tabelas os dados são armazenados em colunas e cada linha dessas colunas guardam os valores de um elemento. Com a linguagem SQL podemos fazer uma junção de linhas de uma tabela com outra tabela.
Com o modelo relacional construirmos tabelas que eliminam dados duplicados, são mais flexíveis na consulta para obter dados especificísticos e fáceis de manter.

Vinculando tabelas usando JOIN

Podemos juntar tabelas durante uma consulta com a declaração JOIN ... ON (Existem outras variações que veremos mais a frente). Usamos essa declaração para vincular uma tabela a outra durante uma consulta. Desse modo usamos valores correspondentes em colunas que especificamos em ambas as tabelas. A sintaxe que vamos usar é essa:

SELECT *
FROM tabela_a JOIN tabela_b
ON tabela_a.coluna_a = tabela_b.coluna_b

Esse exemplo é parecido com a sintaxe básica da declaração SELECT. A diferença é que utilizamos JOIN para fornecer duas tabelas e não somente uma. Depois do ON é onde especificamos as colunas que queremos combinar os valores. O resultado dessa declaração é que realizamos uma consulta nas duas tabelas e retornamos as linhas onde o valor da coluna coluna_a seja igual ao valor da coluna coluna_b.
O uso mais comum da cláusula ON é procurar por colunas com valores iguais, mas também é possível realizar consultas com outras expressões onde o resultado seja verdadeiro ou falso.

Relacionando tabelas com colunas-chave

Vamos imaginar o seguinte cenário: Você é um analista de dados e acabou de ser contratado para analisar os gastos com folha de pagamento por departamento. Você faz o pedido dos dados que vai precisar esperando receber uma tabela parecida com essa:

depart localizacao nome     sobrenome salario
------ ----------- -------- --------- -------
RH     São Paulo   Daniela  Silva     62450
RH     São Paulo   Everton  Oliveira  59300
AD     Fortaleza   Fábio    Feitosa   87654
AD     Fortaleza   Dénis    Reis      87654

Mas não é o que você recebe. Você acaba de receber dois arquivos csv, cada um representando uma tabela. Analisando essas tabelas você percebe que as colunas colaboradores e departamentos se destacam.
Usando o código abaixo vamos criar essas duas tabelas e encontrar o melhor jeito de juntar os dados das tabelas. Se não souber criar uma tabela veja os tutoriais anteriores.

CREATE TABLE departamentos (
	departamento_id BIGINT AUTO_INCREMENT,
	departamento VARCHAR(100),
	cidade VARCHAR(100),
	CONSTRAINT departamento_chave PRIMARY KEY (departamento_id),
	CONSTRAINT depart_cidade_u UNIQUE (departamento, cidade)
);

CREATE TABLE colaboradores (
	colaboradores_id BIGINT AUTO_INCREMENT,
	nome VARCHAR(100),
	sobrenome VARCHAR(100),
	salario INTEGER,
	departamento_id BIGINT REFERENCES departamentos (departamento_id),
	CONSTRAINT colaboradores_chave PRIMARY KEY (colaboradores_id),
	CONSTRAINT colabo_depart_unique UNIQUE (colaboradores_id, departamento_id)
);

INSERT INTO departamentos (departamento, cidade)
VALUES
	('RH', 'São Paulo'),
	('AD', 'Fortaleza');

INSERT INTO colaboradores (nome, sobrenome, salario, departamento_id)
VALUES
	('Erique', 'Silva', 62500, 1),
	('Fabiana', 'Oliveira', 59300, 1),
	('Eveline', 'Reis', 83000, 2),
	('Daniela', 'Ferreira', 95000, 2);

Podemos notar que as duas tabelas que acabamos de criar seguem o modelo proposto por Codd em que cada tabela descreve atributos de uma única entidade, nesse exemplo sobre os colaboradores e os departamentos. Fazendo uma consulta simples vemos que o conteúdo da tabela departamentos é esse:

SELECT * FROM departamentos;
+-----------------+--------------+-----------+
| departamento_id | departamento | cidade    |
+-----------------+--------------+-----------+
|               2 | AD           | Fortaleza |
|               1 | RH           | São Paulo |
+-----------------+--------------+-----------+
2 rows in set (0.003 sec)

A coluna departamento_id é a chave primária da tabela, definimos isso na linha cinco. Isso quer dizer que os valores dessa tabela não podem ser repetidos e não devem ser nulos (deve ser adicionado algum valor). Para não precisarmos adicionar um valor para a coluna departamento_id adicionamos a cláusula AUTO_INCREMENT. Desse modo quando for adicionado uma nova linha a tabela, a coluna departamento_id será acrecida de um valor crescente. Adicionamos a restrição PRIMARY KEY porque cada departamento é único, não existe dois RH numa empresa. Nos próximos tutoriais vamos aprender mais sobre restrições (CONSTRAINT).
Se você realizar uma consulta simples na tabela de colaboradores o conteúdo deve ser esse:

SELECT * FROM colaboradores;
+------------------+----------+-----------+---------+-----------------+
| colaboradores_id | nome     | sobrenome | salario | departamento_id |
+------------------+----------+-----------+---------+-----------------+
|                1 | Erique   | Silva     |   62500 |               1 |
|                2 | Fabiana  | Oliveira  |   59300 |               1 |
|                3 | Eveline  | Reis      |   83000 |               2 |
|                4 | Daniela  | Ferreira  |   95000 |               2 |
+------------------+----------+-----------+---------+-----------------+
8 rows in set (0.003 sec)

A coluna colaboradores_id é utilizada para identificar cada funcionário. Para saber em qual departamento um funcionário trabalha temos a colunas departamento_id. Os valores dessa coluna fazem referência aos valores da coluna departamento_id da tabela departamentos. Essa referência a outra coluna em outra tabela é chamada de chave estrangeira. Uma restrição com chave estrangeira usando referência (REFERENCES) só nos permite adicionar um valor se esse valor já estiver presente na coluna estrangeira, no nosso caso na coluna departamento_id. Isso quer disser que para adicionar o valor 1 na coluna departamento_id da tabela colaboradores esse valor já deve estar presente na coluna departamento_id da tabela departamentos.
Outra restrição é a UNIQUE. Utilizamos UNIQUE para definir que a tabela não pode ter valores repetidos. Agora você deve estar pensando que UNIQUE e PRIMARY KEY são a mesma coisa, mas isso não é verdade. Existem duas diferenças entre as duas. A primeira é que uma tabela só pode ter uma coluna PRIMARY KEY enquanto a mesma tabela pode ter várias colunas UNIQUEs. E a segunda diferença é que uma coluna UNIQUE aceita o valor nulo. Vamos aprender mais sobre essa restrição em outro tutorial.
Nesse momento você deve estar pensando pra que serve essas restrições, além de complicar a sua vida. E a resposta é bem simples: Não permitir a entrada de dados duplicados. Se cada departamento e cidade são únicos porque duplicar esses valores. Se tivéssemos recebidos os dados do jeito que queríamos inicialmente era isso que ia acontecer. Não tem problema ter dados duplicados numa tabela com quatro valores como a nossa, ou quatro mil. Mas agora imagine um banco de dados com milhares de linhas. Agora temos um problema: estamos desperdiçando espaço para armazenar valores duplicados.
Agora que você sabe o básico de como as tabelas podem se relacionar, vamos dar uma olhada em como juntá-los em uma consulta.

Consultando várias tabelas usando JOIN

Quando realizamos uma consulta com JOIN o banco de dados nos retorna uma tabela com as linhas das tabelas lado a lado. Isso para cada linha que a condição passada depois da cláusula ON seja verdadeira. Ainda podemos filtrar os resultados dessa consulta com a cláusula WHERE.
As consultas usando JOIN são parecidas com a sintaxe básica de uma consulta simples com SELECT. A diferença é que usamos JOIN … ON para selecionar as tabelas e as variações de JOIN para definir os critérios da junção.
Vamos começar com um exemplo simples. Para a nossa primeira consulta utilizando JOIN queremos os dados de todas as colunas onde os valores de departamento_id (da tabela colaboradores) e departamento_id (da tabela departamentos) sejam iguais.

SELECT *
FROM colaboradores JOIN departamentos
ON colaboradores.colaboradores_id = departamentos.departamento_id;
+------------------+---------+-----------+---------+-----------------+-----------------+--------------+-----------+
| colaboradores_id | nome    | sobrenome | salario | departamento_id | departamento_id | departamento | cidade    |
+------------------+---------+-----------+---------+-----------------+-----------------+--------------+-----------+
|                2 | Fabiana | Oliveira  |   59300 |               1 |               2 | AD           | Fortaleza |
|                1 | Erique  | Silva     |   62500 |               1 |               1 | RH           | São Paulo |
+------------------+---------+-----------+---------+-----------------+-----------------+--------------+-----------+
2 rows in set (0.002 sec)

Nessa busca foi retornado apenas duas linhas, mesmo fazendo a consulta nas duas tabelas, isso acontece porque definimos uma condição para a busca. E a condição é o valor das colunas colaboradores_id das duas tabelas serem iguais.
É possível fazer uma consulta nas duas colunas sem definir uma condição. Desse modo as tabelas serão apresentadas uma do lado da outra. Para isso use a declaração SELECT * FROM tabela1 JOIN tabela2;.
Utilizando a cláusula ON ou não você vai perceber que a tabela com menos linhas vai se repeti até que as duas tabelas tenham o mesmo número.

JOIN

Utilizamos JOIN ou INNER JOIN quando queremos consultar duas ou mais tabelas que tenham uma tabela em comum. No exemplo anterior, as tabelas colaboradores e departamentos tinham a coluna colaboradores_id em comum. Para os nossos próximos exemplos vamos usar essa tabela:

CREATE TABLE escola_esquerda (id INT, escola_esquerda VARCHAR(50));

CREATE TABLE escola_direita (id INT, escola_direita VARCHAR(50));

INSERT INTO escola_esquerda (id, escola_esquerda)
VALUES
	(1, 'COLEGIO CONTATO MACEIO'),
	(2, 'COLEGIO HARMONIA'),
	(3, 'ESC COLEGIO LATO SENSU'),
	(4, 'COLEGIO OBJETIVO'),
	(5, 'ESC AQUARELA ENSINO E CULTURA');
	
INSERT INTO escola_direita (id, escola_direita)
VALUES
	(1, 'COLEGIO CONTATO MACEIO'),
	(2, 'COLEGIO HARMONIA'),
	(3, 'ESC COLEGIO LATO SENSU'),
	(5, 'ESC AQUARELA ENSINO E CULTURA'),
	(6, 'ESC COLEGIO VITORIA');

Veja um exemplo utilizando JOIN:

SELECT *
FROM escola_esquerda JOIN escola_direita
ON escola_esquerda.id = escola_direita.id;
+------+-------------------------------+------+-------------------------------+
| id   | escola_esquerda               | id   | escola_direita                |
+------+-------------------------------+------+-------------------------------+
|    1 | COLEGIO CONTATO MACEIO        |    1 | COLEGIO CONTATO MACEIO        |
|    2 | COLEGIO HARMONIA              |    2 | COLEGIO HARMONIA              |
|    3 | ESC COLEGIO LATO SENSU        |    3 | ESC COLEGIO LATO SENSU        |
|    5 | ESC AQUARELA ENSINO E CULTURA |    5 | ESC AQUARELA ENSINO E CULTURA |
+------+-------------------------------+------+-------------------------------+
4 rows in set (0.167 sec)

Você deve utilizar o JOIN quando os dados estiverem bem estruturados e uma relação entre as tabelas. Para retornar os valores das duas tabelas use outro tipo de JOIN.

LEFT JOIN e RIGHT JOIN

Utilizamos LEFT JOIN e RIGHT JOIN quando queremos que todos os elementos de uma tabela apareçam na consulta. Por exemplo, você quer que todos os elementos da tabela escola_esquerda apareçam na consulta, assim usamos LEFT JOIN. Os elementos da tabela escola_direita que não tiverem um correspondente na tabela escola_esquerda apareceram em branco (NULL). O mesmo vale para RIGHT JOIN. Veja um exemplo de utilização dos dois JOIN:

SELECT *
FROM escola_esquerda LEFT JOIN escola_direita
ON escola_esquerda.id = escola_direita.id;
+------+-------------------------------+------+-------------------------------+
| id   | escola_esquerda               | id   | escola_direita                |
+------+-------------------------------+------+-------------------------------+
|    1 | COLEGIO CONTATO MACEIO        |    1 | COLEGIO CONTATO MACEIO        |
|    2 | COLEGIO HARMONIA              |    2 | COLEGIO HARMONIA              |
|    3 | ESC COLEGIO LATO SENSU        |    3 | ESC COLEGIO LATO SENSU        |
|    5 | ESC AQUARELA ENSINO E CULTURA |    5 | ESC AQUARELA ENSINO E CULTURA |
|    4 | COLEGIO OBJETIVO              | NULL | NULL                          |
+------+-------------------------------+------+-------------------------------+
5 rows in set (0.004 sec)

SELECT *
FROM escola_esquerda RIGHT JOIN escola_direita
ON escola_esquerda.id = escola_direita.id;
+------+-------------------------------+------+-------------------------------+
| id   | escola_esquerda               | id   | escola_direita                |
+------+-------------------------------+------+-------------------------------+
|    1 | COLEGIO CONTATO MACEIO        |    1 | COLEGIO CONTATO MACEIO        |
|    2 | COLEGIO HARMONIA              |    2 | COLEGIO HARMONIA              |
|    3 | ESC COLEGIO LATO SENSU        |    3 | ESC COLEGIO LATO SENSU        |
|    5 | ESC AQUARELA ENSINO E CULTURA |    5 | ESC AQUARELA ENSINO E CULTURA |
| NULL | NULL                          |    6 | ESC COLEGIO VITORIA           |
+------+-------------------------------+------+-------------------------------+
5 rows in set (0.001 sec)

RIGHT JOIN e LEFT JOIN são usados quando você precisa que todos os elementos de uma tabela apareçam, quando você quer comparar duas tabelas procurando por dados ausentes e quando você precisa saber quais elementos de uma tabela não tem correspondentes na outra tabela.

Usando NULL para encontrar linhas com valores ausentes

Podemos descobrir quais são os valores ausentes numa consulta usando WHERE com NULL. Por exemplo, no exemplo acima a nossa consulta retorna um valor NULL, podemos usar esse valor para descobrir quais são as linhas que não têm correspondentes na outra tabela. Veja como fazer isso:

SELECT *
FROM escola_esquerda LEFT JOIN escola_direita
ON escola_esquerda.id = escola_direita.id
WHERE escola_direita.id IS NULL;
+------+------------------+------+----------------+
| id   | escola_esquerda  | id   | escola_direita |
+------+------------------+------+----------------+
|    4 | COLEGIO OBJETIVO | NULL | NULL           |
+------+------------------+------+----------------+
1 row in set (0.001 sec)

Com esse exemplo descobrimos que o valor 4 da coluna id da tabela escola_esquerda não tem um correspondente na tabela escola_direita.
Obs: Quando for trabalhar com o valor NULL use sempre IS porque NULL = NULL retorna NULL e NULL IS NULL retorna 1.

quinta-feira, 24 de setembro de 2020

Matemática básica e estatística com SQL


Se o seu banco de dados incluir algum tipo de dados do tipo inteiro, decimais ou pontos flutuantes é provável que você vai precisar realizar alguns cálculos com esses dados. Por exemplo, se você precisar saber qual é o valor da soma de todos os elementos de uma coluna, ou você precise adicionar um valor a cada elemento de uma coluna ou linha. Felizmente podemos fazer essas tarefas utilizando a linguagem SQL. Com ela podemos realizar desde operações matemáticas básicas a estatísticas avançadas.
Nesse tutorial, vamos iniciar no básico das operações matemáticas e avançar para as funções matemáticas mais complexas e iniciar em estatística. O dataset que vamos usar pode ser baixado aqui.
Veja abaixo como importar esses dados:

MariaDB [(none)]> create database meu_db;
Query OK, 1 row affected (0.151 sec)

MariaDB [(none)]> use meu_db;
Database changed
MariaDB [meu_db]> create table censu_2015
    -> (CensusTract INT,State VARCHAR(15),County VARCHAR(15),
    -> TotalPop INT,Men INT,Women INT,
    -> Hispanic FLOAT,White FLOAT,Black FLOAT,
    -> Native FLOAT,Asian FLOAT,Pacific FLOAT,
    -> Citizen INT,Income FLOAT,IncomeErr FLOAT,
    -> IncomePerCap FLOAT,IncomePerCapErr FLOAT,Poverty FLOAT,
    -> ChildPoverty FLOAT,Professional FLOAT,Service FLOAT,
    -> Office FLOAT,Construction FLOAT,Production FLOAT,
    -> Drive FLOAT,Carpool FLOAT,Transit FLOAT,
    -> Walk FLOAT,OtherTransp FLOAT,WorkAtHome FLOAT,
    -> MeanCommute FLOAT,Employed INT,PrivateWork FLOAT,
    -> PublicWork FLOAT,SelfEmployed FLOAT,FamilyWork FLOAT,
    -> Unemployment FLOAT);
Query OK, 0 rows affected (0.914 sec)

MariaDB [meu_db]> LOAD DATA LOCAL INFILE
    -> 'C:/Users/user/acs2015_census_tract_data.csv'
    -> INTO TABLE censu_2015
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY '\n'
    -> IGNORE 1 LINES;
Query OK, 74001 rows affected, 65535 warnings (8.923 sec)
Records: 74001  Deleted: 0  Skipped: 0  Warnings: 97104

Operações matemáticas

Nos primeiros exemplos vamos utilizar as operações básicas que você aprendeu na escola. Na tabela abaixo é mostrado as operações que vamos utilizar com mais frequência.

Operador Operação
+ Adição
- Subtração
* Multiplicação
/ Divisão sem resto
%, MOD(x, y) Modulo ou resto
^ Exponenciação
SQRT(x) Raiz quadrada

Esses operadores podem ser utilizados com números, como numa calculadora, ou com valores em tabelas. Nesse tutorial vamos mostrar os dois.

Tipos de dados e matemática

Quando estiver trabalhando com operações matemáticas é importante saber o tipo de dado onde essas operações serão aplicadas. Não ter conhecimento do tipo de dado pode resultar num erro ou numa operação indesejada.
Aplicando uma operação entre dois números, o resultado retornado segue o padrão abaixo:

  • Dois inteiros retorna um inteiro.
  • Um NUMERIC com outro retorna um NUMERIC.
  • Qualquer operação com um float retorna um float.

Mas com a exponenciação e a raiz quadrada isso não acontece. A operação de raiz quadrada pode retornar um número de ponto flutuante mesmo quando a operação é com um inteiro e a exponenciação pode retornar um inteiro.

Adição, subtração e multiplicação

Até o momento utilizamos a declaração SELECT para recuperar dados de uma tabela. Nesse tutorial vamos utilizá-lo em conjunto com os operadores para realizar operações matemáticas. Vamos começar com as operações de adição, subtração e multiplicação.

MariaDB [(none)]> SELECT 2 + 2;
+-------+
| 2 + 2 |
+-------+
|     4 |
+-------+
1 row in set (0.038 sec)

MariaDB [(none)]> SELECT 9 - 2;
+-------+
| 9 - 2 |
+-------+
|     7 |
+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT 3 * 4;
+-------+
| 3 * 4 |
+-------+
|    12 |
+-------+
1 row in set (0.007 sec)

Não temos surpresas aqui. Como esperado dois mais dois é quatro, nove menos dois é sete e, como sempre, três vezes quatro é doze. O resultado é mostrado numa coluna, mas não se preocupe, nenhuma tabela está sendo alterada.

Divisão, modulo e raiz quadrada

Na divisão, o resultado sempre será um número de ponto flutuante. Isso porque o operador de divisão faz a divisão exata. Já o operador módulo retorna o resto de uma divisão. Esse operador realiza uma divisão e retorna o resto dessa divisão. Se a divisão for exata o resto é zero, do contrário, o resto será um inteiro. A função de raiz quadrada retorna a raiz quadrada do número passado como parâmetro. Veja um exemplo de utilização:

MariaDB [(none)]> SELECT 9 / 2;
+--------+
| 9 / 2  |
+--------+
| 4.5000 |
+--------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT MOD(9,2);
+----------+
| MOD(9,2) |
+----------+
|        1 |
+----------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT 9 % 2; -- O mesmo da declaração acima
+-------+
| 9 % 2 |
+-------+
|     1 |
+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT SQRT(9);
+---------+
| SQRT(9) |
+---------+
|       3 |
+---------+
1 row in set (0.001 sec)

Ordem das operações

Nas expressões matemáticas existe uma ordem em que as operações devem ser feitas. No SQL é a mesma coisa. Por exemplo, qual operação deve ser executada primeiro? A subtração ou a multiplicação? Por isso é importante saber qual operação deve ser aplicada primeiro para atingir o resultado esperado. Essa é a ordem de prioridade dos operadores:

  1. Funções. No caso a função SQRT().
  2. Multiplicação, divisão e módulo.
  3. Adição e subtração.

Seguindo essa ordem as funções serão executadas primeiro, depois a multiplicação, divisão e módulo e, por último, a adição e subtração.
Se em algum momento você precisar a operação de adição ocorra antes da multiplicação, você pode alterar essa ordem de prioridade com parênteses. No exemplo abaixo, o resultado é diferente para cada declaração. Isso porque foi alterada a prioridade das operações.

MariaDB [(none)]> SELECT 5 + 4 * 9;
+-----------+
| 5 + 4 * 9 |
+-----------+
|        41 |
+-----------+
1 row in set (0.003 sec)

MariaDB [(none)]> SELECT (5 + 4) * 9;
+-------------+
| (5 + 4) * 9 |
+-------------+
|          81 |
+-------------+
1 row in set (0.060 sec)

Operações com colunas

Agora que já aprendemos como utilizar os operadores na linguagem SQL vamos aprender a usar esses mesmos operadores com valores em colunas. Quando usamos esses operadores em colunas a operação é realizada em cada linha da tabela.

MariaDB [meu_db]> SELECT State AS 'Estado',
    -> County AS 'Município',
    -> Asian AS 'Asiático',
    -> Hispanic AS 'Hispanico',
    -> Hispanic + Asian AS "Total de Hispânicos e Asiáticos"
    -> FROM censu_2015
    -> WHERE  State = 'Kansas';
+--------+--------------+----------+-----------+---------------------------------+
| Estado | Município    | Asiático | Hispanico | Total de Hispânicos e Asiáticos |
+--------+--------------+----------+-----------+---------------------------------+
| Kansas | Allen        |        0 |         3 |                               3 |
| Kansas | Allen        |      1.5 |         1 |                             2.5 |
| Kansas | Allen        |        0 |       0.1 |             0.10000000149011612 |
| Kansas | Allen        |      1.3 |       6.3 |              7.6000001430511475 |
| Kansas | Allen        |        0 |       5.9 |               5.900000095367432 |
| Kansas | Anderson     |        0 |       0.5 |                             0.5 |
| Kansas | Anderson     |        0 |       0.3 |             0.30000001192092896 |
| Kansas | Wyandotte    |        0 |       7.7 |               7.699999809265137 |
| Kansas | Wyandotte    |        0 |        44 |                              44 |
| Kansas | Wyandotte    |     16.5 |      33.4 |              49.900001525878906 |
| Kansas | Wyandotte    |      2.3 |      28.9 |              31.199999570846558 |
+--------+--------------+----------+-----------+---------------------------------+
770 rows in set (0.130 sec)

Essa não é a saída completa da busca, na sua máquina deve está bem maior. Mas, para o nosso proposito vai servir. Vamos começar explicando o código linha por linha. Na primeira linha selecionamos a coluna “State” e demos um apelido para ela (Estado). Fizemos a mesma coisa na linha dois, três e quatro. Depois pedimos para o gerenciador do banco de dados fazer a soma da coluna Hispanic e Asian e, como nas linhas anteriores, demos um apelido a essa coluna – Lembre-se que cada consulta retorna os dados organizados em colunas. Na linha seis informamos onde esses dados devem ser procurados. E por último fazemos uma filtragem dos dados com WHERE. Com a declaração WHERE estamos dizendo que só queremos os dados das colunas State, County, Asian e Hispanic onde o valor da coluna State seja igual a Kansas.
Com esse exemplo fica fácil perceber como as operações funcionam em tabelas. Como exercício tente realizar as outras operações e mudar o estado.

Porcentagem

Para o nosso próximo exemplo vamos descobrir qual é a porcentagem de homens no estado do Texas. Para isso vamos precisar saber a quantidade total da população e a quantidade total de homens. Nosso banco de dados já tem essas informações.
Veja como descobrir a porcentagem de homens no estado do Texas no exemplo abaixo:

MariaDB [meu_db]> SELECT State AS 'Estado',
    -> SUM(Men) AS 'Total Homens',
    -> SUM(Women) AS 'Total Mulheres',
    -> (SUM(Men) * 100) / (SUM(Men) + SUM(Women)) AS 'Porcentagem de Homens'
    -> FROM censu_2015
    -> WHERE State = 'Texas';
+--------+--------------+----------------+-----------------------+
| Estado | Total Homens | Total Mulheres | Porcentagem de Homens |
+--------+--------------+----------------+-----------------------+
| Texas  |     13171316 |       13367298 |               49.6308 |
+--------+--------------+----------------+-----------------------+
1 row in set (0.316 sec)

Nesse exemplo usamos a função SUM() para somar todos as linhas das colunas Men e Women, lembre-se que estamos somando apenas os valores das linhas que tenham o valor Texas na coluna State. Depois utilizamos as operações de multiplicação, divisão e soma para descobrir a porcentagem de homens no estado do Texas (Regra de três).

Função de soma e médias

As duas funções mais utilizadas na análise de dados são a SUM() e AVG(). Isso porque a função SUM() faz a soma de todas as linhas de uma coluna, como vimos no exemplo anterior. E a função AVG() retorna o valor médio de uma coluna numérica. O que a função AVG() faz é somar todos os valores de uma coluna e depois dividir pelo número de linhas. Veja um exemplo de utilização das duas funções abaixo:

MariaDB [meu_db]> SELECT AVG(TotalPop) FROM censu_2015;
+---------------+
| AVG(TotalPop) |
+---------------+
|     4325.5915 |
+---------------+
1 row in set (1.760 sec)

MariaDB [meu_db]> SELECT SUM(TotalPop) FROM censu_2015;
+---------------+
| SUM(TotalPop) |
+---------------+
|     320098094 |
+---------------+
1 row in set (0.168 sec)

Com a função AVG() descobrimos que a média dos valores da coluna TotalPop é 4325.5915 e com a função SUM() descobrimos que o total da soma da coluna TotalPop é 320098094.

domingo, 30 de agosto de 2020

O que é um contêiner web?

Imagem de Pexels por Pixabay

Um contêiner web é o componente de um servidor da web que interage com servlets Java. Um contêiner da web gerencia o ciclo de vida dos servlets; ele mapeia uma URL para um servlet específico, garantindo que o solicitante tenha direitos de acesso relevantes.
O contêiner web implementa o aspecto do componente da web da arquitetura de engenharia Java; ele especifica um ambiente de tempo de execução para vários componentes, como segurança, simultaneidade, transação e implantação.


Os servlets Java não têm um método main() definido, portanto, um contêiner é necessário para carregá-los. O servlet é implantado no contêiner.
Vejamos o que acontece quando um cliente envia uma determinada solicitação que requer interação com o servlet:

  • O cliente envia uma solicitação a um servidor web.
  • O servidor da web, que contém um servlet, envia essa solicitação ao contêiner.
  • O contêiner passa a solicitação para o respectivo servlet.
  • Os métodos de servlet são carregados.
  • O servlet entrega a resposta relevante ao contêiner, que a passa para o servidor. Eventualmente, a resposta chega ao cliente.

Fonte: What is a web container?
Licença: Creative Commons -Attribution -ShareAlike 4.0 (CC-BY-SA 4.0)

quinta-feira, 27 de agosto de 2020

Como você escreve um Dockerfile?

Photo by Jonas Smith on Unsplash

Um Dockerfile é um documento de texto (sem uma extensão de arquivo) que contém as instruções para configurar um ambiente para um contêiner do Docker. Você pode construir uma imagem Docker usando um Dockerfile.
O comando docker build . constrói uma imagem Docker usando o Dockerfile no diretório em que este comando é executado.
Aqui está um exemplo de arquivo docker:

# Usando a imagem oficial do Ubuntu como uma imagem pai
FROM ubuntu:latest

# Configurando o diretório de trabalho para /app
WORKDIR /app

# Copie o conteúdo do diretório atual para o contêiner em /app
COPY . /app

# Obtendo as atualizações para o Ubuntu e instalando o Python em nosso ambiente
RUN apt-get -y update  && apt-get install -y python

# Execute app.py quando o contêiner for iniciado
CMD ["python", "app.py"]

O Dockerfile é explicado linha por linha abaixo:

# Usando a imagem oficial do Ubuntu como uma imagem pai
FROM ubuntu:latest

A maioria dos arquivos docker começa a partir de uma imagem "pai". A imagem pai é adicionada por meio da palavra-chave FROM. Sua imagem se baseia na imagem principal. Adicionamos a imagem oficial do Ubuntu usando FROM ubuntu:latest.

# Configurando o diretório de trabalho para /app
WORKDIR /app

Em seguida, você define o diretório de trabalho em seu contêiner com WORKDIR. WORKDIR /app define o diretório atual para /app quando o contêiner começa a ser executado.

# Copie o conteúdo do diretório atual para o contêiner em /app
COPY . /app

Até agora, temos o Ubuntu OS em nosso ambiente com o diretório atual definido como /app. Agora, queremos transferir nossos próprios arquivos de fora para o contêiner. Fazemos isso usando COPY . /app em que o comando COPY copia todos os arquivos de nosso diretório atual (aquele que contém o Dockerfile) para o /app. Nosso contêiner conterá agora o Ubuntu OS e os arquivos de nosso diretório local com o diretório de trabalho definido como ./app. É isso aí! O contêiner terá apenas as coisas que você especificar.

# Obtendo as atualizações para o Ubuntu e instalando o Python em nosso ambiente
RUN apt-get -y update  && apt-get install -y python

O comando RUN é executado quando construímos a imagem e quaisquer dependências ou pacotes adicionais são geralmente instalados usando o comando RUN. Assumimos que temos a imagem do sistema operacional que especificamos e construímos outros pacotes sobre ela.

# Execute app.py quando o contêiner for iniciado
CMD ["python", "app.py"]

O CMD especifica o comando que é executado quando iniciamos o contêiner.
Nota: Você pode inserir comentários em seu Dockerfile usando #.

Fonte: How do you write a Dockerfile?
Licença: Creative Commons -Attribution -ShareAlike 4.0 (CC-BY-SA 4.0)

segunda-feira, 24 de agosto de 2020

Introdução ao Docker2 - compor e empacotar um aplicativo Spring Boot no Docker

Imagem de Pexels por Pixabay

Introdução

No artigo anterior, vimos o que é o Docker, como os contêineres são úteis como uma nova tendência de devOps e aprendemos a diferença entre contêineres e imagens. Também aprendemos sobre Dockerfile.
Agora, aprenderemos sobre o comando docker-compose e como executar um aplicativo SpringBoot de um contêiner local. Mas, antes de fazer isso, precisamos empacotar um aplicativo SpringBoot com o Docker. Vamos ver como fazer.

Dockerizing um aplicativo SpringBoot

A primeira coisa que faremos é obter um aplicativo básico baseado em SpringBoot que podemos encaixar. Para esse propósito, podemos usar o aplicativo básico que vem com o andaime Spring ao usar o Spring Initializr no IntelliJ, e podemos adicionar um endpoint muito simples que retornará uma mensagem de saudação no formato JSON.
Não importa se você não tem o Spring Initializr, desde que você possa expor um endpoint e consultá-lo por meio do objeto de teste mockMvc ou de uma ferramenta como o Postman. Para referência, aqui está nossa estrutura de pacote de aplicativo:

Você pode notar que o Dockerfile é colocado na pasta raiz de todo o projeto. Este será o arquivo usado para controlar todos os detalhes da nossa imagem, sua especificação.
Em seguida, o arquivo será usado para criar uma imagem Docker e, a partir dessa imagem, quando estiver efetivamente em execução, teremos nosso contêiner.
Para encaixar nosso aplicativo SpringBoot (ou qualquer aplicativo), é necessário especificar em nosso Dockerfile tudo o que precisamos para executar nosso aplicativo. Precisa ser, em essência, uma descrição em camadas de todas as etapas que tomaríamos para construir e executar nosso aplicativo, localmente, em um formato que pode ser:

  • reproduzível: um Dockerfile deve sempre resultar na mesma imagem depois de executado e totalmente especificado. Qualquer pessoa que usar essa imagem sempre obterá exatamente a mesma funcionalidade.
  • independente do ambiente: em essência, o poder do Docker depende do fato de que muitos serviços de infraestrutura e devOps agora o suportam em seus pipelines de desenvolvimento para que, sempre que um envio de novo código para um branch especificado acontecer, ele acione uma reconstrução completa de a imagem do Docker. Em seguida, os desenvolvedores podem usá-lo via docker-compose perfeitamente ou a imagem mais recente estará disponível em um registro para ser exposta como um micro-serviço para o mundo via nginx, etc.

Uma vez que a única coisa que realmente precisamos para iniciar o aplicativo SpringBoot após o término da compilação é o arquivo .jar contendo o código compilado, contanto que usemos uma imagem Java base para construir a nossa, podemos envolver nosso aplicativo SpringBoot em um Contêiner do Docker definindo o ponto de entrada como executando o arquivo .jar:

FROM openjdk:8
COPY target/greeter-*.jar greeter.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","greeter.jar"]

Portanto, construímos nossa imagem a partir de uma imagem base Java 8 openJDK e, em seguida, copiamos o arquivo JAR (que precisa existir em nossa máquina local no mesmo nível de pasta de destino e o próprio Dockerfile) de nosso sistema local para o diretório raiz do contêiner.
Em seguida, expomos a porta 8080 do contêiner para ficar disponível para o exterior. Esta é a mesma porta do serviço SpringBoot; caso contrário, o contêiner não saberá onde o serviço está sendo executado.
Por fim, chamamos o Java para iniciar nosso serviço a partir do JAR que acabamos de copiar para o contêiner de nossa máquina local. Isso significa que, ao iniciar um contêiner a partir da imagem construída por meio deste Dockerfile, iniciaremos efetivamente o aplicativo SpringBoot.

O comando docker-compose

O Dockerfile nos permite especificar o que é necessário para construir uma imagem.
docker-compose é um comando que nos permite especificar e iniciar vários serviços compostos de muitas imagens Docker juntos, de forma coordenada, enquanto nos permite especificar qual imagem usar para qual serviço e garantir que os serviços sejam iniciados corretamente. Também nos permite definir as variáveis de ambiente que são expostas como tal no contêiner em execução.
Vamos supor que nosso aplicativo exige autenticação de nome de usuário e senha em nosso endpoint. Para definir essas variáveis, podemos escrever um arquivo docker-compose.yml que colocamos no mesmo nível que o Dockerfile, e lá, podemos especificar de qual Dockerfile construir o contêiner, qual imagem usar (ambos para local cria e usa imagens remotas), que atende a composição de contêineres que usará e as variáveis de ambiente necessárias.
Um simples docker-compose.yml poderia ser:

version: '3'
services:
  web:
    build: .
    ports:
      - "8080:8080"
  environment:
    - username="User"
    - password="Pass"

Definimos um serviço chamado web que é construído a partir do Dockerfile no diretório atual, expõe a porta 8080 para o exterior e o serviço em execução no contêiner também está na porta 8080.
Em seguida, definimos as variáveis de ambiente disponíveis para nosso serviço, assim como definimos em um arquivo application.properties ou em um shell.
Para usar este arquivo para iniciar um contêiner, simplesmente fazemos:
docker-compose -f <caminho para compor o arquivo> -d up
Isso usará o arquivo de composição para construir e instanciar nosso contêiner e iniciar o serviço configurado com esse ambiente.
-d garante que o contêiner continue em execução em segundo plano e o inicializa.
O Compose permite aos desenvolvedores extrair uma imagem localmente em suas máquinas, executá-la e testá-la localmente, o que é muito útil.

Conclusão

Vimos o que é docker-compose, como ajuda os desenvolvedores a testar certas funcionalidades e como isola questões em um ambiente controlado. Também vimos o que é necessário para empacotar um aplicativo SpringBoot com Docker.

Fonte: Intro to Docker 2- Docker-compose and packaging a SpringBoot application by Bruno Oliveira
Licença: Creative Commons -Attribution -ShareAlike 4.0 (CC-BY-SA 4.0)