Author: mullerfs

  • Coletando Malha Municipal do Brasil no IBGE

    O Objetivo aqui será plotar dados das fronteiras das regiões brasileiras através de arquivos shapefiles coletados do IBGE.

    A página web onde os links foram encontrados é este aqui e os últimos disponíveis são de 2021.

    Importando bibliotecas do Python

    from datetime import datetime
    
    #necessárias para o download dos arquivos
    import requests
    
    #necessárias para processas os dados geoespaciais
    import pandas as pd
    import geopandas as gpd
    import matplotlib.pyplot as plt
    

    Definindo os dados

    Neste artigo, construimos um dicionário com os links que encontramos no site do IBGE.

    arquivos = {
        'brasil': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Pais_2021.zip',
        'rga':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_RG_Intermediarias_2021.zip',
        'rgi':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_RG_Imediatas_2021.zip',
        'rgme':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Mesorregioes_2021.zip',
        'rgmi':'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Microrregioes_2021.zip',
        'uf': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_UF_2021.zip',
        'mun': 'https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2021/Brasil/BR/BR_Municipios_2021.zip'
    }

    Baixando arquivos

    for i in arquivos:
        arquivo = i+".zip"
        remote_url = arquivos[i]
        
        print("Coletando: "+remote_url)
        data = requests.get(remote_url)
        with open("./inputs/"+arquivo, 'wb') as file:
            file.write(data.content)

    Plotando as Regiões brasileiras

    Agora que baixamos todos os arquivos, vamos plotar alguns exemplos

    Arquivo de Estados (UF)

    df = gpd.read_file('zip://inputs/uf.zip')
    df.head()
    df[df['NM_REGIAO']=='Nordeste'].plot()

    Municípios

    df = gpd.read_file('zip://inputs/mun.zip')
    df.head()
    df[df['SIGLA']=='MG'].plot(column="NM_MUN",cmap="YlGnBu")

    Para ver o notebook:


  • Coletando Dados de Cobertura da Anatel

    Neste Post criaremos scripts em python para coletar e processar dados geoespaciais de cobertura das Operadoras disponibilizados publicamente pela Anatel.

    Baixaremos todos os arquivos das operadoras e consolidaremos em um único arquivo geoespacial, acrescentaremos algumas colunas para enriquecer os dados iniciais.

    A Anatel disponibiliza os dados de cobertura das operadoras neste link aqui.

    Carregando bibliotecas

    Utilizaremos as bibliotecas Request e BeautifulSoup para coletar os dados que baixaremos via html pois precisaremos buscar por tags e classes no HTML

    Utilizaremos a biblioteca geopandas para analisar e salvar os dados processados.

    from datetime import datetimeimport reimport requestsfrom bs4 import BeautifulSoupfrom urllib.request import Request, urlopenimport pandas as pdimport geopandas as gpd
    Carregando bibliotecas

    Baixando página da Anatel

    BASE_URL="http://sistemas.anatel.gov.br"req = Request(BASE_URL+ "/se/public/cmap.php")html_page = urlopen(req)soup = BeautifulSoup(html_page, "lxml")
    Baixando página da Anatel

    Iremos armazenar os dados dos links em um Dataframe identificando operadora, tecnologia e a última data de atualização conforme informado pela Anatel.

    columns=['texto','operadora','tecnologia','last_update','url','arquivo']df = pd.DataFrame(columns=columns)#Loop que encontra todas as Tags <li> da página da Anatelfor link in soup.find_all("li"):	#Coleta do nome do arquivo detectando a div entidade        texto = link.find("div",{"class":"tec_entidade"})        #Coleta da data de atualização pela tag small    last_update = link.find("small")        #Coleta do link do arquivo para download via tag <div> e <a>    url = link.find("div",{"class":"download_shp"}).find("a")        #limpando e dividindo texto    if texto:        texto = texto.getText()        tecnologia = texto.split("_")[0].upper()        operadora = texto.split("_")[1].upper()            #limpando o campo data    if last_update:        last_update = last_update.getText().split(":")[1].split(")")[0].strip()        last_update = datetime.strptime(last_update, "%d/%m/%Y")        #tratando URL    if url:        url = link.find("div",{"class":"download_shp"}).find("a").get("href")    row = [texto,operadora,tecnologia,last_update,url,None]        df.loc[len(df)] = row
    #filtrar apenas linhas cuja url não é vaziafor index,row in df[df['url'].notna()].iterrows():        #construindo nome do arquivo para salvar em disco    arquivo = row['operadora']+"_"+row['tecnologia']+".zip"    df.loc[index,'arquivo'] = arquivo        #construindo url de download    remote_url = BASE_URL + row['url']        #download do arquivo    print("Coletando: "+remote_url)    data = requests.get(remote_url)    with open("./inputs/"+arquivo, 'wb') as file:        file.write(data.content)

    Abrindo arquivos e consolidando dados num arquivo único

    listdf = []for index,row in df[df['url'].notna()].iterrows():    gdf = geopandas.read_file('zip://inputs/'+row['arquivo'])    gdf= gdf.explode()    gdf['operadora'] = row['operadora']    gdf['tecnologia'] = row['tecnologia']    gdf['last_update'] = row['last_update']    gdf['tecnologia'] = row['tecnologia']    listdf.append(gdf.copy())    rdf = gpd.GeoDataFrame(pd.concat( listdf, ignore_index=True))rdf.to_file("cobertura.geojson", driver='GeoJSON')

  • Execute menos Software

    Se tem algo que aprendi nestes anos suportando e criando produtos de tecnologia é que menos é mais.

    Aqui vai algumas dicas que funcionaram para mim:

    • Se for desenvolver, escolha tecnologias padrões de mercado
    • Não caia na armadilha de achar que tecnologias de código aberto, ou soluções on premise significam “sem custo” ou “mais barato”
    • Terceirize atividades que não agregam valor para o produto.

    Se for desenvolver, escolha tecnologias padrões de mercado

    Imagino que isso se repita em todos os setores de produção, mas a indústria de Telecomunicações em particular tem aversão a “última versão de software”. Ninguém quer pagar o pato de ser o primeiro a descobrir um novo bug enquanto há uma fila de clientes reclamando em todos os canais de atendimento.

    Não me entenda mal, usar novas tecnologias é bastante empolgante e muitas das vezes pode até significar diferenciais para seu produto, mas softwares e tecnologias bem consolidados que todos estão usando é uma ótima aposta, terá ótimo suporte de empresas e fóruns no mercado, além de não correr o risco de ser o primeiro a encontrar um bug que ninguém mais resolveu.

    Código Aberto nem sempre é “sem custo” e On Premise nem sempre é “mais barato”

    Então você fez o trabalho de casa, colocou suas opções numa matriz de decisão e escolheu um software aberto para implementar certas funcionalidades no seu produto, até levou em conta a dica anterior e escolheu uma versão estável.

    Você está levando em conta o custo de operar por si mesmo esse software?

    Existe um abismo entre provar um conceito (PoC) para o cliente utilizando ferramentas Opensource e desenvolvimento interno com dois estagiários, 2 desenvolvedores full-stack, 1 especialista em sistemas Operacionais, 1 em redes de computadores é criar um ambiente de produção que esteja pronto para a carga de trabalho, com alta disponibilidade, segurança, em conformidade com LGPD, gerenciamento de Alarmes e observabilidade  adequada.

    Muitas das vezes desenvolver internamente o produto requererá também atividades laterais como:

    • Criação de uma equipe de Operação e Suporte em tempo integral para monitorar a saúde do seu sistema
    • Manter o conhecimento original do desenvolvimento vivo entre sua equipe. O mercado de TI rotaciona muito as cadeiras, o conhecimento do time que implantou aquele software de código aberto persistiu a informação nas suas ferramentas de gestão de conhecimento.
    • E conforme o produto cresce e ganha escala, problemas acontecem, bugs aparecem. Quando você menos esperar verá que seu Squad de produto estará afogado em resolver problemas e pouco envolvido em desenvolver novas funcionalidades e novos valores para o produto

    Terceirize atividades que não agregam valor para o produto

    Se você chegou até aqui, essa dica talvez é chover no molhado, mas não quero ficar com a consciência pesada de não comentar.

    Durante o processo de criação de seus produtos e conforme sua empresa vai evoluindo de uma Startup para uma Empresa de crescimento e por fim alcançando uma Empresa consolidada com um produto forte pode ser que seu time de tecnologia se perca pelo caminho.

    Certifique-se que seu time não esteja em alguma dessas armadilhas:

    • O Backlog de atividades só possui Correções de Bugs e nenhuma Funcionalidade nova, que agregue valor ao produto
    • O Time passa mais tempo preocupado em implementar uma esteira de CI/CD perfeita que pensando em como entregar alguma coisa que o Cliente goste.
    • O time passa mais tempo preocupado em “instalar, manter e garantir” do que em “evoluir, criar e inovar”

    Não me leve a mal, tudo isso é importante, e provavelmente consequência do desenvolvimento interno, mas isso é atividade indiferente para o seu Cliente. Você está mantendo um time de vários Engenheiros e Desenvolvedores na sua estrutura que deveria ser enxuta para criação do produto.

    Terceirize esses serviços!

    • Terceirize a administração dos ambientes para empresas especialistas em suporte de código aberto
    • Terceirize até mesmo o desenvolvimento de funcionalidades para empresas especialistas em Fábrica de Software.

    Foque seu time de alto desempenho apenas em AUMENTAR O VALOR do seu produto.


  • SIP: Uma breve explicação

    Session Initiation Protocol (SIP) é um protocolo de sinalização de redes criado para estabelecer, modificar e terminar sessões de multimídia em uma rede IP como diriam os mais técnicos.

    Em outras palavras: Um protocolo feito para fazer chamadas de voz e vídeo através da internet

    Um ditado popular diz que andorinha sozinha não faz verão e esse é o caso do protocolo SIP. Por si só ele não provê serviços, nem controla fluxos de mídia, nem sequer é capaz de fazer negociações de codecs.

    Para uma solução completa de comunicação geralmente  é utilizado em conjunto com outros protocolos como os abaixo:

    SIP: Controle de chamada.

    SDP: Encapsulado dentro do SIP, serve principalmente para fazer as negociações de codecs.

    RTP: Usado para transportar fluxos de mídia

    Exercício mental

    Vamos fazer um analogia totalmente estranha num universo mais estranho ainda, mas que fará sentido no final 😀

    1. Você é brasileiro e fala fluentemente Inglês e Espanhol
    2. Você precisa conversar com o João que fala Alemão, Inglês e Chinês
    3. Você não conhece o João
    4. Você sabe onde o João mora

    Agora continuando a aventura nesse universo paralelo:

    • Você vai até a casa do João e bate na porta dele e diz Oi! em português, Hi! em inglês e Hola!  em spanhol.
    • João, tranquilamente apesar da sua esquisitice, responde Hallo! em alemão, Hi! inglês e em chinês.
    • Você percebe que João disse Hi! em inglês, um cumprimento que você conhece, e então começa uma conversa com João nesta língua.

    Nesse exercício, ir até a casa do João representa uma das funções da sinalização SIP que curiosamente possui o nome INVITE. (não vamos entrar no mérito de você ter se auto-convidado para a casa do João)

    Dizer oi em três línguas diferentes para tentar descobrir qual língua o João fala, ele responder com outras línguas e por fim você decidir que inglês é a linguagem comum entre vocês é uma negociação de codec e é a tarefa do protocolo SDP

    O Ar foi o meio que você usou para passar o som da sua voz para se comunicar com o João, esse é o papel do protocolo RTP e a sua voz saindo de sua boca e entrando nos ouvidos do João é o que chamamos de fluxo de mídia.

    PS: Não venham reclamar que eu poderia utilizar inúmeros exemplos mais fáceis. 

    Obrigado, espero que tenha sido uma forma de compreender o papel destes 3 protocolos do mundo Voip.