<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marcus Andrade</title>
    <description>The latest articles on DEV Community by Marcus Andrade (@madrade1472).</description>
    <link>https://dev.to/madrade1472</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1010586%2F70d7c5e2-5f42-422d-b2e5-21df053aee27.jpeg</url>
      <title>DEV Community: Marcus Andrade</title>
      <link>https://dev.to/madrade1472</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madrade1472"/>
    <language>en</language>
    <item>
      <title>Como Conectar ao Azure Table Storage e Manipular Dados com PySpark</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Tue, 13 Aug 2024 02:11:54 +0000</pubDate>
      <link>https://dev.to/madrade1472/como-conectar-ao-azure-table-storage-e-manipular-dados-com-pyspark-5fba</link>
      <guid>https://dev.to/madrade1472/como-conectar-ao-azure-table-storage-e-manipular-dados-com-pyspark-5fba</guid>
      <description>&lt;p&gt;Neste artigo, vamos explorar como conectar ao Azure Table Storage, realizar consultas para extrair dados específicos e, em seguida, utilizar o PySpark para manipular e exibir esses dados em um formato tabular. Este guia é ideal para desenvolvedores e engenheiros de dados que trabalham com grandes volumes de dados no Azure e querem aproveitar a flexibilidade do PySpark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Configuração do Ambiente&lt;/strong&gt;&lt;br&gt;
Antes de começarmos, é necessário configurar algumas bibliotecas e informações de acesso. Neste exemplo, utilizamos as seguintes bibliotecas:&lt;/p&gt;

&lt;p&gt;azure.data.tables: Para conectar e interagir com o Azure Table Storage.&lt;br&gt;
pandas: Para manipulação de dados (caso necessário).&lt;br&gt;
pyspark.sql: Para manipulação de dados utilizando PySpark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Configurando as Credenciais de Acesso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para acessar o Azure Table Storage, você precisará do nome do ambiente de acesso e da chave da conta, que são armazenados em variáveis para garantir a segurança:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;account_name = "seu_ambiente_acesso"
account_key = "sua_chave"
table_name = "tabela_a_qual_deseja"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Conectando ao Azure Table Storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O primeiro passo é estabelecer a conexão com o Azure Table Storage. Para isso, criamos uma connection_string e utilizamos o TableServiceClient para iniciar a conexão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from azure.data.tables import TableServiceClient
from azure.data.tables import TableClient

def get_table_data():
    connection_string = f"DefaultEndpointsProtocol=https;AccountName={account_name};AccountKey={account_key};TableEndpoint=https://{account_name}.table.core.windows.net/;"
    table_service = TableServiceClient.from_connection_string(conn_str=connection_string)
    table_client = table_service.get_table_client(table_name)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Filtrando e Selecionando Colunas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma vez conectado, podemos realizar consultas no Azure Table Storage. No exemplo abaixo, filtramos os dados para obter apenas as entidades que possuem PartitionKey igual a '2024-08-02'. Além disso, selecionamos colunas específicas para extrair apenas os dados que são relevantes para a nossa análise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  query_filter = "PartitionKey eq '2024-08-02'"
    columns = ['PartitionKey','RowKey','client','depot','margin_max','max_comparable_price','min_comparable_price','product','validity_date','volume_tier']
    entities = table_client.query_entities(query_filter, select=columns)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Convertendo Dados para DataFrame do PySpark&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Após recuperar os dados do Azure Table Storage, convertemos as entidades em um DataFrame do PySpark. Isso é útil para manipular grandes volumes de dados de forma eficiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rows = [entity for entity in entities]
    from pyspark.sql import SparkSession
    spark = SparkSession.builder.appName("AzureTable").getOrCreate()
    df_spark = spark.createDataFrame(rows)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;6. Exibindo os Dados&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Finalmente, podemos exibir os dados no formato tabular utilizando o método show() do PySpark. Neste caso, optamos por mostrar até 40 registros sem truncar os valores das colunas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    df_spark.show(n=40, truncate=False)

    return df_spark

# Chamando a função para obter os dados e exibir
get_table_data()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>LangFuse - Overview</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Sun, 14 Jul 2024 03:56:45 +0000</pubDate>
      <link>https://dev.to/madrade1472/langfuse-overview-2lda</link>
      <guid>https://dev.to/madrade1472/langfuse-overview-2lda</guid>
      <description>&lt;p&gt;LangFuse&lt;/p&gt;

&lt;p&gt;LangFuse é uma ferramenta desenvolvida para observabilidade de linguagens naturais (NLP – Natural Language Process).&lt;br&gt;
Possui como seu objetivo base e premissa principal que as empresas monitorem seus modelos de linguagem assim utilizados tal como modelos para métricas de latência e também como precisão de recursos.&lt;br&gt;
 O LangFuse proporciona visibilidade detalhada sobre como os modelos estão operando e quais integrações ocorrem no momento do processamento onde podem haver problemas  ou áreas correlatas.&lt;/p&gt;

&lt;p&gt;Às principais funcionalidades do LangFuse retiradas do seu site : &lt;a href="https://langfuse.com/" rel="noopener noreferrer"&gt;https://langfuse.com/&lt;/a&gt;, estão compostas por: &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoramento de Desempenho&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;-Acompanhamento em tempo real das métricas de desempenho dos modelos de linguagem.&lt;/p&gt;

&lt;p&gt;-Identificação de gargalos de desempenho e problemas de latência.&lt;br&gt;
&lt;strong&gt;Análise de Uso&lt;/strong&gt;:&lt;br&gt;
-Insights sobre como os modelos estão sendo utilizados pelos usuários.&lt;br&gt;
-Rastreamento de interações para entender melhor os padrões de uso e comportamento.&lt;br&gt;
&lt;strong&gt;Gestão de Recursos&lt;/strong&gt;:&lt;br&gt;
-Monitoramento do uso de recursos computacionais.&lt;br&gt;
-Identificação de oportunidades para otimização de recursos e redução de custos.&lt;br&gt;
&lt;strong&gt;Detecção de Anomalias&lt;/strong&gt;:&lt;br&gt;
-Ferramentas para identificar comportamentos anômalos ou inesperados nos modelos.&lt;br&gt;
-Alertas automáticos para problemas críticos.&lt;br&gt;
&lt;strong&gt;Relatórios e Visualizações&lt;/strong&gt;&lt;br&gt;
-Ferramentas de visualização para facilitar a interpretação dos dados.&lt;/p&gt;

&lt;p&gt;Com a ferramenta podemos também efetuar o processo de criação e customização de alguns painéis para podermos verificar o andamento e processamento de toda nossa aplicação.&lt;/p&gt;

&lt;p&gt;Existe um contexto de mercado muito forte referente a utilização do langfuse no mercado tecnológico, onde, grandes empresas que operam com grandes volumes de dados (BigData, DW), com linguagens naturais tal como a própria OpenAI (GPT), e utilização de ChatBot’s, assistentes virtuais (Watson IBM) como exemplo, e serviços vinculados a atendimento ao cliente, tal como automações que rodam em cores de WhatsAps, e atendimentos robóticos com persona humanizada, odem se beneficiar significativamente do LangFuse. Ele é particularmente útil em ambientes onde a confiabilidade e a eficiência dos modelos de linguagem são críticas para a operação.&lt;/p&gt;

&lt;p&gt;Abaixo temos algumas imagens da aplicação do processo : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf62zm775uqhzbilpvxi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf62zm775uqhzbilpvxi.png" alt="Image description" width="601" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Segue abaixo alguns pontos relacionados sobre os prompt’s que podem ser utilizados tal como OpenAI (Davinci)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sbxirlbycjotmj10dsn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5sbxirlbycjotmj10dsn.png" alt="Image description" width="601" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O mesmo prompt torna-se muito similar aos promt’s da empresa OpenAI (ChatGPT)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdltlsdg3ihb1i3obgdt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdltlsdg3ihb1i3obgdt.png" alt="Image description" width="558" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em uma pesquisa Mercadológica sobre o tema podemos obter algumas explicações sobre cada tema : &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python SDK&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: SDK para a linguagem de programação Python.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Desenvolvedores podem utilizar este SDK para integrar a ferramenta central com aplicativos Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JS/TS SDK&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: SDK para JavaScript e TypeScript.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Permite a integração com aplicações web desenvolvidas em JavaScript ou TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAI SDK&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: SDK fornecido pela OpenAI.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Facilita a integração com os serviços e modelos de IA da OpenAI.&lt;br&gt;
&lt;strong&gt;Langchain&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Ferramenta para construção de pipelines de processamento de linguagem natural.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Utilizada para criar fluxos de trabalho complexos envolvendo NLP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Llama-Index&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Ferramenta de indexação e consulta para dados processados por modelos de linguagem.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Permite a criação de índices eficientes para busca e recuperação de informações.&lt;br&gt;
&lt;strong&gt;LiteLLM (proxy)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Proxy leve para modelos de linguagem.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Facilita a integração com modelos de linguagem de forma otimizada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Haystack&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Framework de pesquisa de código aberto.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Utilizado para construir sistemas de busca e recuperação de informações robustos&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Descrição&lt;/strong&gt;: Interface de Programação de Aplicações.&lt;br&gt;
&lt;strong&gt;Utilização&lt;/strong&gt;: Fornece endpoints para integração direta via chamadas de API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conexões&lt;/strong&gt;&lt;br&gt;
Cada aplicabilidade mostrada acima, está vinculada a um core de inteligência artificial ao qual poderá ser usado ou não de acordo com a sua necessidade ou promt dentro das comunicações com sua API.&lt;/p&gt;

&lt;p&gt;Abaixo trago alguns pontos fortes referente a utilização da ferramenta através de estudo Mercadológico levantado.&lt;/p&gt;

&lt;p&gt;Estudo Mercadológico sobre a Utilização do LangFuse no Mercado Atual (2024)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pontos Fortes (Prós)&lt;/strong&gt;&lt;br&gt;
1.Flexibilidade de Integração&lt;br&gt;
  &lt;strong&gt;Exemplo&lt;/strong&gt;: LangFuse pode ser integrado com diversas ferramentas e plataformas, facilitando seu uso em diferentes ambientes de TI.&lt;br&gt;
2.Monitoramento em Tempo Real&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Empresas podem detectar e resolver problemas de desempenho imediatamente, minimizando o tempo de inatividade.&lt;br&gt;
3.Análise Detalhada de Uso&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: LangFuse oferece insights profundos sobre como os modelos de linguagem são utilizados, permitindo melhorias baseadas em dados concretos.&lt;br&gt;
4.Otimização de Recursos&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Com a gestão eficiente de recursos, as empresas podem reduzir custos operacionais.&lt;br&gt;
5.Detecção Precoce de Anomalias&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Identificação e correção de comportamentos anômalos antes que causem problemas maiores.&lt;br&gt;
6.Relatórios Personalizáveis&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Relatórios detalhados e dashboards personalizáveis ajudam na tomada de decisões estratégicas.&lt;br&gt;
7.Suporte a Diversas Linguagens de Programação&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Compatível com SDKs de Python, JavaScript/TypeScript, facilitando a integração em diferentes stacks de desenvolvimento.&lt;br&gt;
8.Escalabilidade&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: LangFuse é projetado para escalar conforme a demanda da empresa cresce, suportando grandes volumes de dados.&lt;br&gt;
9.Redução de Riscos&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Com a mitigação de erros com o uso de monitoramento de desempenho, os riscos com mão de obra e monitoramento core são reduzidos pela metade.&lt;br&gt;
10.Melhoria Contínua&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: As análises detalhadas permitem um ciclo contínuo de feedback e aprimoramento dos modelos de linguagem.&lt;/p&gt;

&lt;p&gt;Agora listando alguns pontos para a Não utilização da Ferramenta;&lt;/p&gt;

&lt;p&gt;Pontos Fracos (Contras)&lt;br&gt;
11.Curva de Aprendizado&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Implementar e usar todas as funcionalidades do LangFuse pode ser desafiador para equipes sem experiência prévia.&lt;br&gt;
12.Custo de Implementação&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Os custos iniciais para configurar e integrar LangFuse podem ser altos, especialmente para pequenas empresas.&lt;br&gt;
13.Complexidade na Integração&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Integrar LangFuse com sistemas existentes pode exigir tempo e recursos significativos.&lt;br&gt;
14.Dependência de Terceiros&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: A confiabilidade do LangFuse pode depender de outros serviços de terceiros com os quais está integrado.&lt;br&gt;
15.Necessidade de Manutenção Contínua&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Ferramentas de monitoramento e análise como LangFuse requerem manutenção contínua para garantir precisão e eficiência.&lt;br&gt;
16.Impacto na Performance&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: O monitoramento em tempo real pode adicionar uma carga adicional aos sistemas, afetando sua performance.&lt;br&gt;
17.Complexidade de Dados&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Analisar e interpretar grandes volumes de dados coletados pode ser complexo e exigir habilidades especializadas.&lt;br&gt;
18.Segurança de Dados&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Garantir a segurança dos dados monitorados e analisados por LangFuse pode ser um desafio adicional.&lt;br&gt;
19.Customização Limitada&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Algumas empresas podem encontrar limitações na personalização das funcionalidades do LangFuse para atender necessidades específicas.&lt;br&gt;
20.Dependência de Infraestrutura&lt;br&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: LangFuse pode exigir uma infraestrutura robusta para funcionar de maneira ideal, o que pode ser um problema para empresas com recursos limitados.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automação de Coleta de Dados de CNPJ com Python utilizando ReceitaWS</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Mon, 08 Jul 2024 18:45:34 +0000</pubDate>
      <link>https://dev.to/madrade1472/automacao-de-coleta-de-dados-de-cnpj-com-python-utilizando-receitaws-5e39</link>
      <guid>https://dev.to/madrade1472/automacao-de-coleta-de-dados-de-cnpj-com-python-utilizando-receitaws-5e39</guid>
      <description>&lt;p&gt;Neste artigo, vamos explorar como automatizar a coleta de dados de CNPJ usando Python. Utilizaremos a API da ReceitaWS para obter informações detalhadas sobre cada CNPJ e armazenaremos esses dados em um arquivo CSV. Este guia é voltado para desenvolvedores que desejam automatizar a extração e armazenamento de informações de CNPJ.&lt;/p&gt;

&lt;p&gt;Bibliotecas Utilizadas&lt;br&gt;
requests: Para fazer requisições HTTP à API da ReceitaWS.&lt;br&gt;
pandas: Para manipulação e formatação de dados.&lt;br&gt;
time: Para controlar o intervalo entre as requisições e respeitar os limites da API.&lt;br&gt;
Código Completo&lt;/p&gt;

&lt;p&gt;Utilizando &lt;a href="https://receitaws.com.br" rel="noopener noreferrer"&gt;https://receitaws.com.br&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import requests
import pandas as pd
import time

def get_cnpj_data(cnpj):
    """
    Faz uma requisição à API da ReceitaWS para obter dados do CNPJ.

    Args:
        cnpj (str): O número do CNPJ a ser consultado.

    Returns:
        dict: Dados do CNPJ em formato JSON se a requisição for bem-sucedida.
        None: Se a requisição falhar.
    """
    url = f"https://receitaws.com.br/v1/cnpj/{cnpj}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None

def process_cnpj_data(cnpj_list):
    """
    Processa uma lista de CNPJs, obtendo os dados de cada um e respeitando o limite de requisições da API.

    Args:
        cnpj_list (list): Lista de números de CNPJ a serem consultados.

    Returns:
        list: Lista de dados de CNPJ obtidos da API.
    """
    data = []
    for cnpj in cnpj_list:
        cnpj_data = get_cnpj_data(cnpj)
        if cnpj_data:
            data.append(cnpj_data)
        time.sleep(20)  # Espera 20 segundos entre cada requisição para respeitar o limite de 3 requisições por minuto

    return data

def format_data_for_sql(data):
    """
    Formata os dados de CNPJ em um DataFrame do pandas, adequado para exportação.

    Args:
        data (list): Lista de dados de CNPJ obtidos da API.

    Returns:
        pandas.DataFrame: DataFrame com os dados formatados.
    """
    df_rows = []
    for item in data:
        row = {
            'cnpj': item.get('cnpj', ''),
            'nome': item.get('nome', ''),
            'fantasia': item.get('fantasia', ''),
            'logradouro': item.get('logradouro', ''),
            'numero': item.get('numero', ''),
            'complemento': item.get('complemento', ''),
            'cep': item.get('cep', ''),
            'bairro': item.get('bairro', ''),
            'municipio': item.get('municipio', ''),
            'uf': item.get('uf', ''),
            'telefone': item.get('telefone', ''),
            'email': item.get('email', ''),
        }
        df_rows.append(row)

    df = pd.DataFrame(df_rows)
    return df

def save_to_csv(df, file_name='cnpj_data.csv'):
    """
    Salva o DataFrame em um arquivo CSV.

    Args:
        df (pandas.DataFrame): DataFrame contendo os dados de CNPJ.
        file_name (str): Nome do arquivo CSV a ser salvo.
    """
    df.to_csv(file_name, index_label='ID')

if __name__ == "__main__":
    cnpj_list = [
        '10869047000140', #CNPJ GERADO PELO 4DEVS
        # Adicione mais CNPJs conforme necessário
    ]

    cnpj_data = process_cnpj_data(cnpj_list)
    df = format_data_for_sql(cnpj_data)
    save_to_csv(df)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicação do Código&lt;br&gt;
Função get_cnpj_data(cnpj):&lt;/p&gt;

&lt;p&gt;Faz uma requisição à API da ReceitaWS com o CNPJ fornecido.&lt;br&gt;
Retorna os dados em formato JSON se a requisição for bem-sucedida, ou None se falhar.&lt;br&gt;
Função process_cnpj_data(cnpj_list):&lt;/p&gt;

&lt;p&gt;Itera sobre uma lista de CNPJs, chamando get_cnpj_data para cada CNPJ.&lt;br&gt;
Respeita o limite de requisições da API, esperando 20 segundos entre cada requisição.&lt;br&gt;
Retorna uma lista de dados de CNPJ.&lt;br&gt;
Função format_data_for_sql(data):&lt;/p&gt;

&lt;p&gt;Formata os dados de CNPJ em um DataFrame do pandas, com colunas relevantes para armazenar informações.&lt;br&gt;
Prepara os dados para exportação.&lt;br&gt;
Função save_to_csv(df, file_name='cnpj_data.csv'):&lt;/p&gt;

&lt;p&gt;Salva o DataFrame em um arquivo CSV, com o nome especificado.&lt;br&gt;
Bloco if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;"::&lt;/p&gt;

&lt;p&gt;Define uma lista de CNPJs para processamento.&lt;br&gt;
Chama as funções para processar os dados e salvar em um arquivo CSV.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Conectando ao Azure Blob Storage com Python para Listar Arquivos em um Diretório</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Mon, 08 Jul 2024 12:27:15 +0000</pubDate>
      <link>https://dev.to/madrade1472/trabalhando-com-o-azure-blob-storage-synapse-para-leitura-de-arquivos-em-um-blob-3o0o</link>
      <guid>https://dev.to/madrade1472/trabalhando-com-o-azure-blob-storage-synapse-para-leitura-de-arquivos-em-um-blob-3o0o</guid>
      <description>&lt;p&gt;Neste artigo, vou mostrar como você pode se conectar ao Azure Blob Storage usando o Python e listar arquivos em um diretório específico. Vamos utilizar bibliotecas como azure.storage.blob e mssparkutils para interagir com o serviço de armazenamento e obter segredos do Azure Key Vault.&lt;/p&gt;

&lt;p&gt;Configurações Iniciais&lt;br&gt;
Primeiramente, precisamos definir algumas configurações iniciais, como o nome do container, o caminho relativo dos arquivos e o serviço vinculado que vamos usar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`from azure.storage.blob import BlobServiceClient
import json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Configurações iniciais
blob_container_name = 'container_aqui'  # seu nome do container
blob_relative_path_enriched = 'caminho_aqui'  # caminho com barra no final
linked_service_enriched = 'Linked_service_aqui'  # seu linked service
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obtendo Propriedades do Key Vault&lt;br&gt;
Vamos utilizar o mssparkutils para obter as propriedades do Key Vault e a chave de acesso necessária.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`# Obtendo propriedades do Key Vault
ls_keyvault = mssparkutils.credentials.getPropertiesAll('Linked_service_aqui')
converter_dic_kv = json.loads(ls_keyvault)

# Coletando o endpoint do Key Vault
end_point_kv = (converter_dic_kv['Endpoint'].split("/"))[2]
kv_name = (end_point_kv.split("."))[0]

# Obtendo a chave de acesso do Key Vault
access_key = mssparkutils.credentials.getSecret(kv_name, 'seu_storage_aqui', 'Linked_service_aqui')
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configurando o Cliente do Blob Storage&lt;br&gt;
Agora que temos a chave de acesso, vamos configurar o cliente do Blob Storage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Obtendo propriedades do linked service
ls_enriched = mssparkutils.credentials.getPropertiesAll(Linked_service_aqui_enriched)
converter_dic_enriched = json.loads(ls_enriched)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Coletando o endpoint do linked service
end_point_enriched = (converter_dic_enriched['Endpoint'].split("/"))[2]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Configurando o cliente do Blob Storage
storage_account = end_point_enriched.split(".")[0]
print(f"Storage Account: {storage_account}")
print(f"Access Key: {access_key[:4]}...{access_key[-4:]}")  # Mostrar apenas início e fim da chave por segurança
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;blob_service_client = BlobServiceClient(account_url=f"https://{storage_account}.blob.core.windows.net", credential=access_key)
container_client = blob_service_client.get_container_client(blob_container_name)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Função para Listar Arquivos&lt;br&gt;
Vamos criar uma função para listar os nomes dos arquivos em um diretório específico no Blob Storage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def list_files_in_directory(container_client, directory_path):
    """ Função para listar os nomes dos arquivos em um diretório específico """
    try:
        print(f"Tentando acessar o container: {container_client.container_name}")
        blob_list = container_client.list_blobs(name_starts_with=directory_path)
        file_names = [blob.name for blob in blob_list]
        if not file_names:
            print(f"Nenhum arquivo encontrado em {directory_path}.")
        return file_names
    except Exception as e:
        print(f"Erro ao listar arquivos no diretório especificado: {e}")
        return []

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Listando os Arquivos&lt;br&gt;
Agora podemos usar a função list_files_in_directory para listar os arquivos no diretório especificado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Listando os nomes dos arquivos no diretório especificado
print(f"Tentando listar arquivos no diretório: {blob_relative_path_enriched}")

file_names = list_files_in_directory(container_client, blob_relative_path_enriched)

# Verificando se a lista de arquivos não está vazia
if not file_names:
    print("Nenhum arquivo encontrado no diretório especificado.")
else:
    # Exibindo os nomes dos arquivos
    print(f"Arquivos encontrados no diretório {blob_relative_path_enriched}:")
    for file_name in file_names:
        print(file_name)

print("Processo finalizado.")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isto podemos listar todos os dados dentro de um blob utilizando um notebook com Synapase junto a Microsoft Azure.&lt;/p&gt;

&lt;p&gt;Agradecimento Especial à André Luiz dos Santos Junior pelo apoio na solução : &lt;a href="https://www.linkedin.com/in/andrelsjunior/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/andrelsjunior/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agradecimento Especial à Adilton Costa Anna pelo apoio na solução : &lt;a href="https://www.linkedin.com/in/adiltoncantos/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/adiltoncantos/&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Excluir Cursos no Google Classroom Usando a API do Google</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Mon, 03 Jun 2024 12:42:48 +0000</pubDate>
      <link>https://dev.to/madrade1472/como-excluir-cursos-no-google-classroom-usando-a-api-do-google-255p</link>
      <guid>https://dev.to/madrade1472/como-excluir-cursos-no-google-classroom-usando-a-api-do-google-255p</guid>
      <description>&lt;p&gt;Neste artigo, vamos documentar como usar a API do Google Classroom para listar e excluir cursos. Vamos detalhar o passo a passo necessário para configurar e executar o código Python que realiza essas operações.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passo a Passo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autenticação:&lt;/strong&gt; O código verifica se o arquivo token.json existe para utilizar credenciais armazenadas previamente. Caso contrário, ele inicia o fluxo de autenticação OAuth 2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listar Cursos:&lt;/strong&gt; O código chama a API do Google Classroom para listar todos os cursos disponíveis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Excluir Curso:&lt;/strong&gt; O código solicita o ID do curso a ser excluído e chama a API para excluir o curso especificado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Execução&lt;/strong&gt;&lt;br&gt;
Execute o Script: Execute o script Python.&lt;br&gt;
Autenticação Inicial: Se for a primeira execução, você será redirecionado para uma página de login do Google para conceder permissões ao aplicativo.&lt;br&gt;
Listar Cursos: Após a autenticação, o script listará todos os cursos disponíveis.&lt;br&gt;
Excluir Curso: Insira o ID do curso que você deseja excluir.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Conta do Google:&lt;/strong&gt; Certifique-se de ter uma conta do Google.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Cloud Project:&lt;/strong&gt; Crie um projeto no &lt;a href="https://console.cloud.google.com/"&gt;Google Cloud Console&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API do Google Classroom:&lt;/strong&gt; Ative a API do Google Classroom para o seu projeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credenciais OAuth 2.0:&lt;/strong&gt; Configure as credenciais OAuth 2.0 para o seu projeto.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Configuração do Ambiente
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instale as bibliotecas necessárias:&lt;/strong&gt; Execute o comando abaixo para instalar as bibliotecas necessárias.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Crie um arquivo &lt;code&gt;credentials.json&lt;/code&gt;:&lt;/strong&gt; Baixe as credenciais OAuth 2.0 do Google Cloud Console e salve-as como &lt;code&gt;credentials.json&lt;/code&gt; no diretório do seu projeto.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Código Python
&lt;/h2&gt;

&lt;p&gt;Aqui está o código completo para listar e excluir cursos no Google Classroom:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
python
import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# Escopos necessários para listar cursos, adicionar alunos e professores, criar e excluir cursos no Google Classroom
SCOPES = [
    "https://www.googleapis.com/auth/classroom.courses",
    "https://www.googleapis.com/auth/classroom.courses.readonly",
    "https://www.googleapis.com/auth/classroom.rosters"
]

def main():
    """
    Código usado para excluir um curso do Google Classroom.
    """
    creds = None
    if os.path.exists("token.json"):
        creds = Credentials.from_authorized_user_file("token.json", SCOPES)
    # Vai pedir autenticação 
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                "credentials.json", SCOPES
            )
            creds = flow.run_local_server(port=0)
        # Salva as credenciais e mostra os cursos
        with open("token.json", "w") as token:
            token.write(creds.to_json())

    try:
        service = build("classroom", "v1", credentials=creds)

        # Lista todos os cursos disponíveis
        list_courses(service)

        # Solicita o ID do curso a ser excluído
        course_id = input("Digite o ID do curso a ser excluído: ")
        delete_course(service, course_id)

    except HttpError as error:
        print(f"An error occurred: {error}")

def list_courses(service):
    try:
        # Chama a API Do classroom para ver os cursos
        results = service.courses().list(pageSize=1000).execute()
        courses = results.get("courses", [])

        if not courses:
            print("No courses found.")
            return

        # Mostra na tela o nome dos cursos criados e salas
        print("Courses:")
        for course in courses:
            print(f'{course["name"]} (ID: {course["id"]})')

    except HttpError as error:
        print(f"An error occurred: {error}")

def delete_course(service, course_id):
    try:
        service.courses().delete(id=course_id).execute()
        print(f"Course with ID {course_id} deleted successfully.")
    except HttpError as error:
        print(f"An error occurred: {error}")

if __name__ == "__main__":
    # Apagar o arquivo token.json para forçar a reautenticação
    if os.path.exists("token.json"):
        os.remove("token.json")
    main()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Adição de Alunos ao Google Classroom com Python</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Mon, 20 May 2024 14:35:56 +0000</pubDate>
      <link>https://dev.to/madrade1472/adicao-de-alunos-ao-google-classroom-com-python-4jjg</link>
      <guid>https://dev.to/madrade1472/adicao-de-alunos-ao-google-classroom-com-python-4jjg</guid>
      <description>&lt;p&gt;Olá pessoal tudo bem?,&lt;br&gt;
Conteúdo com objetivo de explicar passo a passo o funcionamento de um script Python que autentica um usuário, lista cursos no Google Classroom e permite a adição de alunos aos cursos. Este script utiliza várias bibliotecas da API do Google para autenticação e acesso ao Google Classroom.&lt;/p&gt;

&lt;p&gt;E com isto nos é exibido também o ID da sala criada.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Bibliotecas Utilizadas :&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;os.path: Para verificar a existência de arquivos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;google.auth.transport.requests.Request: Para fazer solicitações de autenticação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;google.oauth2.credentials.Credentials: Para gerenciar credenciais OAuth 2.0.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;google_auth_oauthlib.flow.InstalledAppFlow: Para gerenciar o fluxo de OAuth 2.0.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;googleapiclient.discovery.build: Para construir o serviço de API do Google.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;googleapiclient.errors.HttpError: Para tratar erros da API do Google.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

Escopos necessários para pesquisa de módulos de ensalamento :

SCOPES = [
    "https://www.googleapis.com/auth/classroom.courses.readonly",
    "https://www.googleapis.com/auth/classroom.rosters"
]



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Função Principal&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Definição e Objetivo&lt;/strong&gt;&lt;br&gt;
A função main() é responsável por gerenciar todo o fluxo de autenticação e execução das ações principais do script:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

def main():
    """
    Código usado para poder criar e exibir as salas do Google criadas e adicionar alunos aos cursos e exibir também o ID do curso criado.
    """



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Autenticação&lt;/strong&gt;&lt;br&gt;
Verificação de Credenciais Existentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Verifica se o arquivo token.json (contendo credenciais salvas) existe.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se existir, carrega as credenciais a partir desse arquivo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

creds = None
if os.path.exists("token.json"):
    creds = Credentials.from_authorized_user_file("token.json", SCOPES)




&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;*&lt;em&gt;A token JSON é gerada na hora de autorizar o aplicativo para tal, existe uma, as tokens são diferentes das chaves criadas no ambiente *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;**Autenticação e Renovação de Credenciais:&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Se as credenciais não existem ou são inválidas, o script solicita autenticação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Utiliza o fluxo de autenticação OAuth 2.0 para obter novas credenciais e salva em token.json.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

if not creds or not creds.valid:
    if creds and creds.expired and creds.refresh_token:
        creds.refresh(Request())
    else:
        flow = InstalledAppFlow.from_client_secrets_file(
            "credentials.json", SCOPES
        )
        creds = flow.run_local_server(port=0)
    with open("token.json", "w") as token:
        token.write(creds.to_json())



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;*&lt;em&gt;Construção do Serviço e Listagem de Cursos&lt;br&gt;
*&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;**Construção do Serviço:&lt;/p&gt;

&lt;p&gt;**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa as credenciais para construir o serviço da API do Google Classroom.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

service = build("classroom", "v1", credentials=creds)



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Listagem de Cursos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Chama a API para listar até 1000 cursos. (lembrando que este valor de 1000, foi utilizado de exemplos, mas você pode definir qual valor quiser).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verifica se há cursos e imprime os nomes e IDs dos cursos encontrados.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

results = service.courses().list(pageSize=1000).execute()
courses = results.get("courses", [])

if not courses:
    print("No courses found.")
    return
print("Courses:")
for course in courses:
    print(f'{course["name"]} (ID: {course["id"]})')



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Adição de Aluno ao Curso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solicitação de Dados do Usuário:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solicita ao usuário o ID do curso e o e-mail do aluno a ser adicionado.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

course_id = input("Digite o ID do curso para adicionar um aluno: ")
student_email = input("Digite o e-mail do aluno: ")



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Chamada da Função de Adição:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chama a função add_student_to_course passando o serviço, o ID do curso e o e-mail do aluno.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

add_student_to_course(service, course_id, student_email)




&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tratamento de Erros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qualquer erro na execução da API é capturado e impresso no console.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

except HttpError as error:
    print(f"An error occurred: {error}")



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Função para Adicionar Aluno&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Definição e Execução&lt;/p&gt;

&lt;p&gt;A função add_student_to_course adiciona um aluno a um curso específico:&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

def add_student_to_course(service, course_id, student_email):
    try:
        student = {
            'userId': student_email
        }
        student = service.courses().students().create(courseId=course_id, body=student).execute()
        print(f"Student {student_email} added to course {course_id}")
    except HttpError as error:
        print(f"An error occurred: {error}")



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Passos&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Criação do Corpo da Requisição:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define o corpo da requisição com o e-mail do aluno.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

student = {
    'userId': student_email
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Chamada da API para Adicionar o Aluno:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa a API do Classroom para adicionar o aluno ao curso.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

student = service.courses().students().create(courseId=course_id, body=student).execute()



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Execução do Script&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ao executar o script, ele primeiro remove qualquer arquivo token.json existente para forçar a reautenticação, garantindo que as credenciais estão atualizadas:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

if __name__ == "__main__":
    if os.path.exists("token.json"):
        os.remove("token.json")
    main()



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;CÓDIGO COMPLETO&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

import os.path
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# Escopos necessários para listar cursos e adicionar alunos no Google Classroom
SCOPES = [
    "https://www.googleapis.com/auth/classroom.courses.readonly",
    "https://www.googleapis.com/auth/classroom.rosters"
]

def main():
    """
    Código usado para poder criar e exibir as salas do Google criadas e adicionar alunos aos cursos.
    """
    creds = None
    if os.path.exists("token.json"):
        creds = Credentials.from_authorized_user_file("token.json", SCOPES)
    # Vai pedir autenticação 
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                "credentials.json", SCOPES
            )
            creds = flow.run_local_server(port=0)
        # Salva as credenciais e mostra os cursos
        with open("token.json", "w") as token:
            token.write(creds.to_json())

    try:
        service = build("classroom", "v1", credentials=creds)

        # Chama a API Do classroom para ver os cursos deixar em 1000
        results = service.courses().list(pageSize=1000).execute()
        courses = results.get("courses", [])

        if not courses:
            print("No courses found.")
            return
        # Mostra na tela o nome dos cursos criados e salas
        print("Courses:")
        for course in courses:
            print(f'{course["name"]} (ID: {course["id"]})')

        # Adicionar aluno ao curso
        course_id = input("Digite o ID do curso para adicionar um aluno: ")
        student_email = input("Digite o e-mail do aluno: ")
        add_student_to_course(service, course_id, student_email)

    except HttpError as error:
        print(f"An error occurred: {error}")

def add_student_to_course(service, course_id, student_email):
    try:
        student = {
            'userId': student_email
        }
        student = service.courses().students().create(courseId=course_id, body=student).execute()
        print(f"Student {student_email} added to course {course_id}")
    except HttpError as error:
        print(f"An error occurred: {error}")

if __name__ == "__main__":
    # Apagar o arquivo token.json para forçar a reautenticação
    if os.path.exists("token.json"):
        os.remove("token.json")
    main()



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exibição de Imagem com ID dos Cursos&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7ntdf05de2jw6qh484g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw7ntdf05de2jw6qh484g.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Instalando Docker, Docker -CE em VM-CORE UBUNTU</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Wed, 29 Nov 2023 02:44:13 +0000</pubDate>
      <link>https://dev.to/madrade1472/instalando-docker-docker-ce-em-vm-core-ubuntu-31dc</link>
      <guid>https://dev.to/madrade1472/instalando-docker-docker-ce-em-vm-core-ubuntu-31dc</guid>
      <description>&lt;p&gt;Fala galera tudo bem? &lt;/p&gt;

&lt;p&gt;Trazendo para vocês aqui hoje um passo a passo de como instalar o DOCKER para podermos trabalhar em vm's com interface core juntamente ao sistema operacional Linux Ubuntu.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Neste primeiro momento inicie sua VM e vá até o console de comandos ou xTERMINAL ou TERMINAL, como assim preferir chamar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qPcON9oJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8p41p6simvrjz5meejk4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qPcON9oJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8p41p6simvrjz5meejk4.png" alt="Image description" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Após início de sua VM necessitamos utilizar o comando:
&lt;code&gt;sudo su&lt;/code&gt;
apenas para podermos acessar às pastas raízes
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I9QbaqaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c80168qc3e4fue5qgtt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I9QbaqaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c80168qc3e4fue5qgtt9.png" alt="Image description" width="714" height="122"&gt;&lt;/a&gt;&lt;br&gt;
Após digitar e pressionar enter ficará desta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EDOY56ZD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80wz44oj857dcj195inp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EDOY56ZD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80wz44oj857dcj195inp.png" alt="Image description" width="594" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora criar uma pasta para nossa instalação e Projeto&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criando nossa pasta mkdir nome_da_sua_pasta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qz58n4vi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1weyxka9frf41e46e209.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qz58n4vi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1weyxka9frf41e46e209.png" alt="Image description" width="709" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após este processo vamos listar o diretório com o comando LS&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0SNIQcvV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsl98ozcyw37scu0yt26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0SNIQcvV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rsl98ozcyw37scu0yt26.png" alt="Image description" width="693" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos navegar para nosso diretório agora com o comando cd nome_da_sua_pasta&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rZE4JdOO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s2yem1tb6h4lm8kzlkar.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rZE4JdOO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s2yem1tb6h4lm8kzlkar.png" alt="Image description" width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Removendo quaisquer vestígios do Docker&lt;/p&gt;

&lt;p&gt;Vamos garantir que não possuímos nenhum vestígio do Docker instalado em nosso equipamento ou VM com o seguinte comando :&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get remove docker docker-engine docker.io containerd runc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Podemos verificar que foi removido todo e qualquer conteúdo referente ao docker &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1IciHFcn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mpn0qhhsgynrcni0sous.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1IciHFcn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mpn0qhhsgynrcni0sous.png" alt="Image description" width="800" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos instalar os componentes necessários para instalar o Docker:&lt;br&gt;
&lt;code&gt;sudo apt-get install apt-transport-https ca-certificates curl software-properties-common&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--C8lWb7wi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7lqbbz867uksktpg3d7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--C8lWb7wi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7lqbbz867uksktpg3d7.png" alt="Image description" width="800" height="196"&gt;&lt;/a&gt;&lt;br&gt;
Agora vamos instalar os componentes e chaves necessárias&lt;br&gt;
&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br&gt;
sudo apt-key fingerprint 0EBFCD88&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--huIWwuCY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6b4bzojxpmcv825xfy2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--huIWwuCY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6b4bzojxpmcv825xfy2p.png" alt="Image description" width="800" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AmktAahc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbigkc6m0t18c0ljq6xs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AmktAahc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wbigkc6m0t18c0ljq6xs.png" alt="Image description" width="800" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora iremos adicionar o repositório necessário:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br&gt;
sudo apt-key fingerprint 0EBFCD88&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5Bfz3uae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e5r8l0ti05vg9am6tade.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5Bfz3uae--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e5r8l0ti05vg9am6tade.png" alt="Image description" width="800" height="98"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, adicionando o repositório APT&lt;br&gt;
&lt;code&gt;sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"&lt;br&gt;
 sudo apt-get update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7J4_QwKn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q2tks53cn362jtg7jjgm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7J4_QwKn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q2tks53cn362jtg7jjgm.png" alt="Image description" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;aguarde a instalação.... &lt;br&gt;
Em seguida atualize &lt;br&gt;
&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s1DxRxH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vip7cruak5txeqj1y0ux.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s1DxRxH9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vip7cruak5txeqj1y0ux.png" alt="Image description" width="800" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos instalar o nosso Docker&lt;br&gt;
&lt;code&gt;sudo apt-get install docker-ce&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AYs-pzqJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bma6cfuf97q4ar3n8rnp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AYs-pzqJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bma6cfuf97q4ar3n8rnp.png" alt="Image description" width="800" height="157"&gt;&lt;/a&gt;&lt;br&gt;
Pressione Y, para confirmar a instalação.&lt;br&gt;
e aguarde &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XVFaoJgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nq22gij8r16rp4as9abs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XVFaoJgG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nq22gij8r16rp4as9abs.png" alt="Image description" width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E vamos completar a instalação com o Docker Compose&lt;br&gt;
&lt;code&gt;sudo curl -L "https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose&lt;br&gt;
sudo chmod +x /usr/local/bin/docker-compose&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AZf0mAIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dguooyuvl2d7r816qak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AZf0mAIS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7dguooyuvl2d7r816qak.png" alt="Image description" width="800" height="63"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isto podemos ver a versão que foi instalada.&lt;br&gt;
&lt;code&gt;docker --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RHYJpXVj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/og2chk9id3ywqwkt2axe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RHYJpXVj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/og2chk9id3ywqwkt2axe.png" alt="Image description" width="800" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora de antemão vamos iniciar nosso docker com o comando docker compose up&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_Y5FK6WN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6wyjiomrgaoapcouyb5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Y5FK6WN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6wyjiomrgaoapcouyb5b.png" alt="Image description" width="800" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3HS0TzJN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8voqxz8j9uavtan7hu18.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3HS0TzJN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8voqxz8j9uavtan7hu18.png" alt="Image description" width="800" height="413"&gt;&lt;/a&gt;&lt;br&gt;
Aguarde o download das informações e o push&lt;/p&gt;

&lt;p&gt;E pronto nosso docker foi iniciado &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y0KrtLVN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afhb72i2gc294j2jpj78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y0KrtLVN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/afhb72i2gc294j2jpj78.png" alt="Image description" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para finalizar o processo basta utilizar o comando &lt;br&gt;
&lt;code&gt;docker compose down&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oDW8MEnr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w4a3pw7xg50clu6jdl6z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oDW8MEnr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w4a3pw7xg50clu6jdl6z.png" alt="Image description" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get remove docker docker-engine docker.io containerd runc&lt;br&gt;
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common&lt;br&gt;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br&gt;
sudo apt-key fingerprint 0EBFCD88&lt;br&gt;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"&lt;br&gt;
sudo apt-get update&lt;br&gt;
sudo apt-get install docker-ce&lt;br&gt;
sudo useradd -g docker ${USER}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obrigado por ficarem até aqui !!&lt;br&gt;
Abraços &lt;br&gt;
Marcus Andrade&lt;br&gt;
TEC-IT BETTER SOLUTION FOR YOUR DATA&lt;/p&gt;

</description>
      <category>engineer</category>
      <category>dataengineering</category>
      <category>ubuntu</category>
      <category>linux</category>
    </item>
    <item>
      <title>CARGA DE DADOS PYTHON PARA MYSQL USANDO MOVIDESK</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Tue, 19 Sep 2023 19:31:50 +0000</pubDate>
      <link>https://dev.to/madrade1472/carga-de-dados-python-para-mysql-usando-movidesk-b31</link>
      <guid>https://dev.to/madrade1472/carga-de-dados-python-para-mysql-usando-movidesk-b31</guid>
      <description>&lt;p&gt;Neste processo irei demonstrar o código de como consumir e enviar dados para dentro de um banco MySQL para que seja consumido dados através de uma aplicação chamada MoviDesk.&lt;/p&gt;

&lt;p&gt;Movidesk, ferramenta de ITSM utilizada para podermos acompanhar os chamados de nossa companhia.&lt;/p&gt;

&lt;p&gt;O processo abaixo já está completo e funcional, comentado, necessitamos apenas alterar as conexões e nomes para podermos dar sequência nas cargas para o banco.&lt;/p&gt;

&lt;p&gt;`import requests&lt;br&gt;
import pymysql&lt;/p&gt;

&lt;h1&gt;
  
  
  Conexão com o banco de dados
&lt;/h1&gt;

&lt;p&gt;conn = pymysql.connect(host='SEU IP OU NOME DO SERVIDOR', user='USUARIO DO AMBIENTE', password='SENHA DO AMBIENTE', db='NOME DA SUA DATABASE')&lt;br&gt;
cursor = conn.cursor()&lt;/p&gt;

&lt;h1&gt;
  
  
  Consumir a API
&lt;/h1&gt;

&lt;p&gt;response = requests.get("URL DE CHAMADA DO SEU GET")&lt;br&gt;
data = response.json()&lt;/p&gt;

&lt;p&gt;try:&lt;br&gt;
    for ticket in data:&lt;br&gt;
        for client in ticket['clients']:&lt;br&gt;
            for action in ticket['actions']:&lt;br&gt;
                cursor.execute("""&lt;br&gt;
                    INSERT INTO TicketsSummaryConsolidado &lt;br&gt;
                    (ticket_id, ticket_origin, ticket_ownerTeam, ticket_createdDate, ticket_subject, ticket_urgency, ticket_status,&lt;br&gt;
                    client_id, client_personType, client_profileType, client_businessName, client_email, client_phone,&lt;br&gt;
                    action_id, action_type, action_origin, action_description, action_htmlDescription, action_status, action_justification, action_createdDate, action_isDeleted)&lt;br&gt;
                    VALUES &lt;br&gt;
                    (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)&lt;br&gt;
                    ON DUPLICATE KEY UPDATE&lt;br&gt;
                    summary_id = summary_id -- Isto é apenas um placeholder; você não está realmente atualizando nada.&lt;br&gt;
                    """, &lt;br&gt;
                    (ticket['id'], ticket['origin'], ticket['ownerTeam'], ticket['createdDate'], ticket['subject'], ticket['urgency'], ticket['status'],&lt;br&gt;
                     client['id'], client['personType'], client['profileType'], client['businessName'], client['email'], client['phone'],&lt;br&gt;
                     action['id'], action['type'], action['origin'], action['description'], action['htmlDescription'], action['status'], action['justification'], action['createdDate'], action['isDeleted']))&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Commitar as inserções
conn.commit()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;finally:&lt;br&gt;
    # Fechar conexão&lt;br&gt;
    cursor.close()&lt;br&gt;
    conn.close()`&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>python</category>
      <category>movidesk</category>
    </item>
    <item>
      <title>Enviando SMS utilizando Python e Twilio</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Mon, 06 Mar 2023 14:54:48 +0000</pubDate>
      <link>https://dev.to/madrade1472/enviando-sms-utilizando-python-e-twilio-2m42</link>
      <guid>https://dev.to/madrade1472/enviando-sms-utilizando-python-e-twilio-2m42</guid>
      <description>&lt;p&gt;Olá pessoal tudo bem?, neste pequeno post irei mostrar para vocês como podemos automatizar o envio de SMS utilizando o Twilio !!&lt;/p&gt;

&lt;p&gt;Site para acesso ao &lt;a href="https://www.twilio.com/pt-br/"&gt;Twilio &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então vamos lá, primeiro passo devemos criar nossa conta junto a plataforma Twilio .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HDKLAZk---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ak69wpb29fwiessecsri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HDKLAZk---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ak69wpb29fwiessecsri.png" alt="Image description" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após criar nossa conta e escolhermos os serviços desejados tal como, utilizar aplicações para bot e envio de SMS com python.&lt;/p&gt;

&lt;p&gt;Vamos fazer a seguinte estruturação:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Acessar a plataforma da Twilio e buscar nossas credenciais chaves de API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ao acessarmos a conta seremos direcionados para o painel principal, ao qual devemos buscar nossa Account SID e também nossa &lt;br&gt;
Auth Token (como mencionamos outras vezes, tokens, podem ser estilo Bearer, e afins).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E buscar também nosso Twilio Phone, para podermos disparar as mensagens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PtMnXjhj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ysmbk2x5vj41mzvb3d5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PtMnXjhj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ysmbk2x5vj41mzvb3d5p.png" alt="Image description" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isto, vamos abrir nosso VSCODE, e vamos criar dois arquivos chamados : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keys.py e Main.py&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L8ywtMoB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vqobpc165ziyh9lbpq8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L8ywtMoB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vqobpc165ziyh9lbpq8w.png" alt="Image description" width="124" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No arquivo Key.py vamos estruturar todas as nossas chamadas e também onde iremos adicionar nossa Account SID e também o AuthToken&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;vamos começar da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;account_sid = 'Insira aqui sua Account SID'
auth_token = 'Insira aqui sua Seu Token'

twilio_number = 'Insira aqui o registro do seu número twilio'
target_number = 'Insira aqui o número ao qual deseja enviar a SMS'

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ficando então da seguinte forma: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--928wdVAp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5or524c5ogi36his1zt1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--928wdVAp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5or524c5ogi36his1zt1.png" alt="Image description" width="489" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos ao conteúdo MAIN.PY&lt;/p&gt;

&lt;p&gt;Vamos primeiro efetuar a instalação da lib twilio&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install twilio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Suh91a0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xyca291grj3ffo70m1s7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Suh91a0u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xyca291grj3ffo70m1s7.png" alt="Image description" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feito isto, vamos agora montar nossa estrutura:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from twilio.rest import Client

import keys


client = Client(keys.account_sid, keys.auth_token)
message = client.messages.create(

    body="Insira aqui o que deseja que seja enviado ao destinatário",
    from_=keys.twilio_number,
    to=keys.target_number



)

print(message.body)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isto agora iremos enviar nossa SMS &lt;/p&gt;

&lt;p&gt;Ao executar, caso tenha feito corretamente verá da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zdnwrjpD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u8d6f9bqzvay3q2p2v05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zdnwrjpD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u8d6f9bqzvay3q2p2v05.png" alt="Image description" width="800" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E em seu celular chegará desta forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--duFUMeCO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2x5tcwppeeqm7tbmpgcr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--duFUMeCO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2x5tcwppeeqm7tbmpgcr.png" alt="Image description" width="397" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E ao acessarmos o Twilio novamente podemos verificar todas as mensagens enviadas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--330HTONe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swkyhr9h1aypkzqw3eyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--330HTONe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swkyhr9h1aypkzqw3eyv.png" alt="Image description" width="784" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado, por lerem e acompanharem este passo a passo.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como Integrar ChatGPT + SAP</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Sun, 26 Feb 2023 15:24:17 +0000</pubDate>
      <link>https://dev.to/madrade1472/como-integrar-chatgpt-sap-2jki</link>
      <guid>https://dev.to/madrade1472/como-integrar-chatgpt-sap-2jki</guid>
      <description>&lt;p&gt;ara conectar o ChatGPT ao SAP, você pode seguir os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Determine o tipo de integração necessária: o SAP é um sistema complexo com várias funcionalidades e módulos. Determine qual é o objetivo da integração com o ChatGPT para definir os requisitos específicos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selecione a plataforma de chatbot: existem várias plataformas de chatbot disponíveis, incluindo Dialogflow, Botpress, Microsoft Bot Framework e outros. Escolha a plataforma que melhor atenda às suas necessidades e habilidades.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure o chatbot: uma vez que você escolha a plataforma de chatbot, configure-o para atender às necessidades de integração. Configure a lógica do chatbot e suas ações, assim como as APIs e integrações que serão usadas para conectar o chatbot ao SAP.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure a integração com o SAP: utilize as APIs do SAP para conectar o chatbot. As APIs mais comuns são as APIs REST e OData. As APIs permitem que o chatbot se comunique com o SAP para realizar ações específicas, como consultar dados, criar pedidos, verificar status, entre outros.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teste a integração: teste a integração para garantir que tudo está funcionando conforme o esperado. Verifique se as respostas do chatbot estão corretas, se as ações do SAP são realizadas corretamente, e se o fluxo de conversação está de acordo com o esperado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implemente o chatbot: após o teste, implemente o chatbot em um ambiente de produção. Teste novamente para garantir que tudo está funcionando corretamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitore e atualize: monitore o chatbot para garantir que ele está funcionando conforme o esperado e atualize-o conforme necessário para garantir que ele permaneça relevante e eficaz.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esses são os passos básicos para conectar o ChatGPT ao SAP. É importante lembrar que a integração pode ser complexa e pode exigir habilidades específicas de desenvolvimento. Se necessário, busque a ajuda de um desenvolvedor ou consultor experiente em integração de sistemas.&lt;/p&gt;

</description>
      <category>sap</category>
      <category>api</category>
      <category>odata</category>
    </item>
    <item>
      <title>PowerFX - Pelo ChatGPT</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Sun, 26 Feb 2023 14:50:17 +0000</pubDate>
      <link>https://dev.to/madrade1472/powerfx-pelo-chatgpt-191b</link>
      <guid>https://dev.to/madrade1472/powerfx-pelo-chatgpt-191b</guid>
      <description>&lt;p&gt;Este artigo foi criado utilizando uma chamada via python usando Anaconda + JupyterNoteboook, a fins de educação e testes de comunicação com a API, (ressalto que este conteúdo não foi de autoria própria e sim de uma chamada via python utilizando chatgpt)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import openai
import os

openai.api_key = os.environ["sua chave de API aqui"]

def generate_response(prompt):
    completions = openai.Completion.create(
        engine="davinci",
        prompt=prompt, &amp;lt; sua pergunta aqui
        max_tokens=2048,
        n=1,
        stop=None,
        temperature=0.7,
    )
    message = completions.choices[0].text
    return message.strip()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acima a chamada utilizada&lt;/p&gt;

&lt;p&gt;A linguagem PowerFX é uma linguagem de programação de baixo código criada pela Microsoft. Ela foi projetada para permitir que usuários e desenvolvedores criem aplicativos e fluxos de trabalho de forma rápida e fácil, sem a necessidade de habilidades avançadas de codificação.&lt;/p&gt;

&lt;p&gt;PowerFX é baseado na linguagem de programação Excel, utilizando fórmulas e funções para criar expressões que definem o comportamento dos aplicativos. Isso torna a linguagem fácil de entender para usuários familiarizados com planilhas do Excel.&lt;/p&gt;

&lt;p&gt;Uma das principais vantagens da PowerFX é sua facilidade de uso. Ela permite que usuários e desenvolvedores criem aplicativos simplesmente arrastando e soltando componentes e conectando-os com expressões. Além disso, ela é altamente integrada com o Microsoft Power Platform, permitindo que os aplicativos criados na PowerFX sejam facilmente implantados em uma variedade de serviços e plataformas, incluindo o Microsoft Teams e o Dynamics 365.&lt;/p&gt;

&lt;p&gt;A PowerFX também é altamente escalável e extensível. Ela pode ser usada para criar aplicativos simples de uma única página ou aplicativos complexos de várias páginas com recursos avançados, como banco de dados e integração com outras ferramentas e serviços.&lt;/p&gt;

&lt;p&gt;Uma das principais limitações da PowerFX é que ela é uma linguagem relativamente nova e, portanto, não possui a mesma quantidade de recursos e documentação disponíveis como outras linguagens de programação mais estabelecidas. No entanto, a Microsoft está investindo em recursos para aumentar a adoção da linguagem, incluindo tutoriais, documentação e uma comunidade ativa de usuários e desenvolvedores.&lt;/p&gt;

&lt;p&gt;Em resumo, a PowerFX é uma linguagem de programação de baixo código que oferece uma maneira fácil e rápida de criar aplicativos e fluxos de trabalho para usuários e desenvolvedores sem habilidades avançadas de codificação. É altamente integrada com o Microsoft Power Platform e pode ser usada para criar aplicativos simples e complexos com recursos avançados. Embora seja relativamente nova, a Microsoft está investindo em recursos para aumentar sua adoção e expandir sua funcionalidade.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>mysql</category>
      <category>database</category>
      <category>sql</category>
    </item>
    <item>
      <title>O que é o protocolo GraphQL?</title>
      <dc:creator>Marcus Andrade</dc:creator>
      <pubDate>Sun, 26 Feb 2023 14:30:47 +0000</pubDate>
      <link>https://dev.to/madrade1472/o-que-e-o-protocolo-graphql-phk</link>
      <guid>https://dev.to/madrade1472/o-que-e-o-protocolo-graphql-phk</guid>
      <description>&lt;p&gt;O protocolo GraphQL é uma linguagem de consulta de API e ambiente de tempo de execução, criado pela equipe do Facebook em 2012. Ele foi projetado para ser uma alternativa mais eficiente e flexível aos protocolos tradicionais de API, como o REST. Desde então, o GraphQL foi adotado por muitas empresas, incluindo grandes empresas de tecnologia, como GitHub, Shopify e Twitter.&lt;/p&gt;

&lt;p&gt;O GraphQL permite que os clientes solicitem apenas os dados necessários em uma única solicitação, em vez de várias solicitações para diferentes endpoints como no REST. Com o GraphQL, os clientes podem especificar as informações de que precisam e a estrutura dos dados retornados, em vez de receber todas as informações disponíveis em uma API.&lt;/p&gt;

&lt;p&gt;Isso é possível devido ao sistema de tipos de dados do GraphQL, que permite definir os tipos de objetos e campos em uma API. Cada tipo de objeto pode ter vários campos, que podem ser escalares (como números ou strings) ou referências a outros objetos. Com o GraphQL, os clientes podem especificar quais campos de um objeto eles precisam, e a API retornará apenas esses campos.&lt;/p&gt;

&lt;p&gt;Por exemplo, suponha que uma API forneça informações sobre usuários e suas postagens. Usando o GraphQL, um cliente pode solicitar todas as postagens de um usuário específico e apenas os campos que são relevantes, como o título e a data da postagem. A solicitação seria semelhante a esta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TnjTv9Fd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mf638f5jnyex63mxzqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TnjTv9Fd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mf638f5jnyex63mxzqx.png" alt="Image description" width="647" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A resposta seria um objeto JSON contendo apenas os campos solicitados:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XwgBR2yz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmd7xrzq8rlo60hx41yo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XwgBR2yz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xmd7xrzq8rlo60hx41yo.png" alt="Image description" width="652" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O GraphQL também oferece recursos avançados, como fragmentos, que permitem que os clientes reutilizem partes de uma consulta em várias solicitações, e variáveis, que permitem que os clientes enviem valores dinâmicos para uma consulta.&lt;/p&gt;

&lt;p&gt;Em resumo, o protocolo GraphQL é uma linguagem de consulta de API que permite que os clientes solicitem apenas os dados necessários em uma única solicitação. Ele oferece recursos avançados, como tipos de dados, fragmentos e variáveis, para tornar as consultas mais eficientes e flexíveis. Com sua adoção crescente, o GraphQL está se tornando uma ferramenta essencial para o desenvolvimento de API moderno.&lt;/p&gt;

</description>
      <category>api</category>
      <category>javascript</category>
      <category>graphql</category>
    </item>
  </channel>
</rss>
