Ir ao conteúdo
  • Cadastre-se

herbertbahia

Membro Pleno
  • Posts

    537
  • Cadastrado em

  • Última visita

Tudo que herbertbahia postou

  1. Olá pedro tudo bem? poderia oferecer mais detalhes sobre o que precisa, como está fazendo e o que já conseguiu fazer?
  2. Para criar uma função que faz uma busca no banco de dados e retorna uma condição, você pode usar a linguagem SQL e a biblioteca JDBC (Java Database Connectivity) para se conectar ao banco de dados e executar a consulta.
  3. você pode usar a função zipfile.ZipFile.write() e monitorar o progresso da compressão. import zipfile def zip_files(input_files, output_filename): # Abrir o arquivo zip em modo de gravação with zipfile.ZipFile(output_filename, 'w') as zip_object: # Percorrer a lista de arquivos de entrada for i, file in enumerate(input_files): # Obter o nome do arquivo e o tamanho em bytes file_name = file.name file_size = file.stat().st_size # Adicionar o arquivo ao arquivo zip zip_object.write(file_name) # Atualizar a barra de progresso print(f'{i+1}/{len(input_files)} - {file_name} ({file_size} bytes)') # Testar a função zip_files zip_files(['file1.txt', 'file2.txt'], 'output.zip') O código acima lê a lista de arquivos de entrada, abre um novo arquivo zip em modo de gravação e adiciona cada arquivo ao arquivo zip usando a função zipfile.ZipFile.write(). Em seguida, atualiza a barra de progresso exibindo o número de arquivos processados e o nome do arquivo atual. Você também pode usar a biblioteca tqdm para criar uma barra de progresso mais visualmente atraente. Aqui está um exemplo de como fazer isso: from tqdm import tqdm def zip_files(input_files, output_filename): # Abrir o arquivo zip em modo de gravação with zipfile.ZipFile(output_filename, 'w') as zip_object: # Criar um objeto tqdm para exibir a barra de progresso with tqdm(total=len(input_files)) as pbar: # Percorrer a lista de arquivos de entrada for file in input_files: # Obter o nome do arquivo file_name = file.name # Adicionar o arquivo ao arquivo zip zip_object.write(file_name) # Atualizar a barra de progresso pbar.update(1) # Testar a função zip_files zip_files(['file1.txt', 'file2.txt'], 'output.zip') tqdmé usado para exibir a barra de progresso. A barra de progresso é inicializada com o número total de arquivos e, em seguida, é atualizada a cada iteração do loop usando o métodotqdm.update()`. Você também pode usar a biblioteca click para adicionar opções de linha de comando à sua função, como um modo silencioso para desativar a exibição da barra de progresso. Aqui está um exemplo de como fazer isso: import click @click.command() @click.option('--silent', is_flag=True, help='Desativar a exibição da barra de progresso') def zip_files(input_files, output_filename, silent): # Abrir o arquivo zip em modo de gravação with zipfile.ZipFile(output_filename, 'w') as zip_object: # Verificar se o modo silencioso está ativo if not silent: # Criar um objeto tqdm para exibir a barra de progresso with tqdm(total=len(input_files)) as pbar: # Percorrer a lista de arquivos de entrada for file in input_files: # Obter o nome do arquivo file_name = file.name # Adicionar o arquivo ao arquivo zip zip_object.write(file_name) # Atualizar a barra de progresso pbar.update(1) else: # Percorrer a lista de arquivos de entrada sem exibir a barra de progresso for file in input_files: # Obter o nome do arquivo file_name = file.name # Adicionar o arquivo ao arquivo zip zip_object.write(file_name) # Testar a função zip_files com a opção --silent zip_files(['file1.txt', 'file2.txt'], 'output.zip', silent=True) Neste exemplo, a função zip_files() é decorada com o decorador click.command() para transformá-la em um comando de linha de comando. A opção --silent é adicionada usando o decorador click.option(), que permite desativar a exibição da barra de progresso.
  4. como o @devair1010 disse seu codigo não esta ruim mas e possível fazer algumas melhorias por exemplo: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // para usar isdigit int main(void) { int v[6]; int i, par; char str[10]; // buffer para armazenar a entrada com fgets for (i = 0; i < 6; i++) { printf("Digite um numero par: ", (i + 1)); fgets(str, sizeof(str), stdin); // lê a entrada como string // verifica se a string é composta apenas por dígitos int valid = 1; for (int j = 0; j < strlen(str); j++) { if (!isdigit(str[j])) { valid = 0; break; } } // se a string não é válida, exibe mensagem de erro e lê novamente if (!valid) { printf("Entrada inválida! Digite apenas números.\n"); i--; // decrementa o contador para ler o número novamente continue; // volta para o início do loop } // converte a string para inteiro e armazena no vetor v[i] = atoi(str); // verifica se o número é par if (v[i] % 2 != 0) { printf("O numero deve ser par!\n"); i--; // decrementa o contador para ler o número novamente continue; // volta para o início do loop } } for (i = 5; i >= 0; i--) { printf("%d\n", v[i]); } return 0;
  5. Para atribuir a idade da mulher mais jovem sem usar a gambiarra de atribuir um valor muito alto para a variável menor, você pode inicialmente atribuir um valor muito alto para a variável menorF e, ao mesmo tempo, inicializar a variável menorF como -1. Isso garante que, ao comparar a idade da mulher mais jovem com a variável menorF, a condição de atualização da variável menorF só será satisfeita se a idade for realmente menor do que o valor atual de menorF. Para fazer isso, basta alterar a linha de inicialização da variável menorF para: menorF <- -1 Em seguida, na condição de atualização da variável menorF, você deve verificar se a idade é menor do que o valor atual de menorF e se a idade é maior ou igual a zero. Isso é necessário para garantir que a idade não seja negativa ou zero, o que não faz sentido neste contexto. A condição de atualização da variável menorF ficaria assim: Se(sexo="F") E (IDADE<MENORF) E (IDADE>=0) então menorF <- idade FIMSE Com essas alterações, a variável menorF será atualizada somente quando a idade for realmente menor do que o valor atual de menorF e maior ou igual a zero.
  6. O código estava retornando um "bound method" porque você está tentando chamar uma função como se fosse uma propriedade (sem os parênteses). Para chamar uma função, é necessário usar os parênteses, assim: print(variaveis.valor_x1()) print(variaveis.valor_x2()) Isso vai chamar as funções e retornar os valores corretos. Além disso, no código da classe Variaveis, ambas as funções valor_x1 e valor_x2 possuem o mesmo código. Isso pode ser um erro e pode levar a resultados incorretos. É preciso verificar se o código está correto e, se necessário, corrigi-lo.
  7. Existem várias maneiras de criar uma barra de progresso em Python. Uma forma é usando o módulo tqdm, que fornece uma barra de progresso simples que pode ser usada em um loop. Aqui está um exemplo de como usá-lo: from tqdm import tqdm # Sua função ou método def long_function(): # Faça algo aqui pass # Execute a função com a barra de progresso for i in tqdm(range(1000)): long_function() sso mostrará uma barra de progresso que irá atualizar a cada iteração do loop. Você também pode usar a opção desc para fornecer uma descrição da tarefa sendo realizada. Se você quiser calcular o tempo estimado de execução de uma função, pode usar o módulo timeit para medir o tempo de execução da função. Aqui está um exemplo de como fazer isso: import timeit # Sua função ou método def long_function(): # Faça algo aqui pass # Calcule o tempo de execução da função elapsed_time = timeit.timeit(long_function, number=1) # Imprima o tempo de execução print(f'Tempo de execução: {elapsed_time:.2f} segundos')
  8. Sim, o Visual Studio Code também possui uma funcionalidade semelhante chamada "Refatoração". Ela permite que você altere o nome de uma variável, função ou outro elemento do código de maneira rápida e precisa, atualizando automaticamente todas as referências a ele em todo o projeto. Para usar a refatoração no Visual Studio Code, basta selecionar o elemento que deseja renomear, pressionar a tecla F2 (ou clicar com o botão direito do mouse e escolher "Renomear") e digitar o novo nome. O Visual Studio Code atualizará automaticamente todas as referências ao elemento no projeto. Além disso, o Visual Studio Code também possui outras funcionalidades de refatoração, como a capacidade de extrair uma variável ou função para um novo arquivo ou módulo, ou ainda mover um elemento de um arquivo para outro. Para acessar essas opções, basta clicar com o botão direito do mouse no elemento e escolher a opção "Refatorar" no menu de contexto.
  9. O código corrigido ficaria assim: # Cria uma instância da classe Variaveis variaveis = Variaveis() # Atribui os valores das variaveis variaveis.a = int(input("Insira o valor de A: ")) variaveis.b = int(input("Insira o valor de B: ")) variaveis.c = int(input("Insira o valor de C: ")) # Usa o operador de chamada de método (`.`) para acessar o resultado dos métodos print(variaveis.valor_x1()) print(variaveis.valor_x2()) Isso deve resolver o problema e permitir que você imprima o resultado das chamadas dos métodos valor_x1 e valor_x2.
  10. talvez este exeplo te ajude # Define a função que realiza a operação de soma def soma(a, b): return a + b # Define a função que realiza a operação de divisão def divisao(a, b): return a / b # Define a função que realiza a operação de multiplicação def multiplicacao(a, b): return a * b # Define a função que realiza a operação de subtração def subtracao(a, b): return a - b # Inicia o loop para continuar solicitando operações enquanto o usuário desejar while True: # Solicita ao usuário os valores para as operações valor_a = float(input("Insira o primeiro valor: ")) valor_b = float(input("Insira o segundo valor: ")) # Solicita ao usuário qual operação ele deseja realizar operacao = input("Insira a operação desejada (+, -, *, /): ") # Realiza a operação de acordo com a escolha do usuário if operacao == "+": resultado = soma(valor_a, valor_b) elif operacao == "-": resultado = subtracao(valor_a, valor_b) elif operacao == "*": resultado = multiplicacao(valor_a, valor_b) elif operacao == "/": resultado = divisao(valor_a, valor_b) else: print("Operação inválida") continue # Exibe o resultado da operação para o usuário print("Resultado: ", resultado) # Pergunta ao usuário se ele deseja continuar continuar = input("Deseja continuar? (s/n) ") if continuar == "n": break
  11. Verifique se você está utilizando a versão mais recente do Source Filmmaker e se está atualizando o software sempre que novas atualizações forem lançadas. Isso pode ajudar a garantir que o software esteja otimizado para o seu hardware e funcionando da melhor forma possível. Desative todos os programas que não são necessários enquanto estiver trabalhando com o Source Filmmaker. Isso inclui programas de fundo, como o antivírus, e outros aplicativos que estejam rodando em segundo plano. Ajuste as configurações do Source Filmmaker para usar menos recursos do sistema. Isso pode incluir diminuir a qualidade da imagem, diminuir o número de quadros por segundo (fps) e diminuir a quantidade de detalhes da cena. Certifique-se de que o seu sistema está com pouco espaço livre em disco. O Source Filmmaker pode usar muito espaço em disco durante o processo de renderização, então ter um disco rígido com bastante espaço livre pode ajudar a garantir que o software execute de forma mais suave. Limpe o sistema removendo arquivos desnecessários e desinstalando programas que não são mais utilizados. Isso pode ajudar a liberar espaço em disco e deixar o sistema mais rápido e mais leve. Considere adquirir um hardware mais potente, como uma GPU dedicada ou um processador mais rápido, se você estiver enfrentando problemas de desempenho com o Source Filmmaker. Isso pode ajudar a garantir que o software execute de forma mais suave e rápida.
  12. Existem diversas formas de quebrar um PDF que contém uma única página gigante colada em várias páginas. Uma forma de fazer isso é utilizando o software Adobe Acrobat ou o Adobe Reader, que possuem ferramentas de edição de PDF. Siga os passos abaixo para quebrar o PDF em páginas individuais: Abra o arquivo PDF com o Adobe Acrobat ou o Adobe Reader. Clique no botão "Ferramentas" no canto superior direito da janela do programa. Clique na opção "Organizar Páginas" no menu "Ferramentas". Clique na opção "Dividir" no menu "Organizar Páginas". Selecione a opção "Dividir por intervalo de páginas" e especifique o intervalo de páginas que deseja dividir o PDF. Por exemplo, se você deseja dividir o PDF em páginas individuais, basta especificar o intervalo "1-1". Clique no botão "OK" para dividir o PDF. Outra forma de dividir o PDF em páginas individuais é utilizando um serviço online, como o Smallpdf ou o PDF2Go. Para utilizar um serviço online, basta fazer o upload do arquivo PDF e seguir as instruções fornecidas pelo serviço para dividir o PDF em páginas individuais. Existem também vários outros programas e serviços que permitem dividir um PDF em páginas individuais. Você pode pesquisar por "split PDF" ou "dividir PDF" na internet para encontrar mais opções.
  13. talvez este exemplo te ajude <?php // String de conexão com o banco de dados $dsn = 'mysql:host=localhost;dbname=nome_banco'; $user = 'usuario'; $password = 'senha'; // Cria a instância da classe PDO $pdo = new PDO($dsn, $user, $password); // Escreve a consulta SELECT para realizar a soma dos valores filtrados pelo intervalo de datas $query = "SELECT SUM(valor) FROM tabela WHERE data BETWEEN :data_inicio AND :data_fim"; // Prepara a consulta $stmt = $pdo->prepare($query); // Vincula os valores das variáveis à consulta $stmt->bindValue(':data_inicio', '2022-01-01'); $stmt->bindValue(':data_fim', '2022-01-31'); // Executa a consulta $stmt->execute(); // Armazena o resultado da consulta em uma variável $
  14. A fonte PowerX PX230 de 230W pode suportar uma placa de vídeo Colorful GeForce GT 1030 de 2GB com memória GDDR5 e interface de 64 bits, modelo GT1030 2G V3-V. No entanto, é importante lembrar que a potência mínima recomendada para uma placa de vídeo depende de diversos fatores, como o modelo e a configuração do sistema. É sempre recomendável verificar as especificações da placa de vídeo e da fonte de alimentação antes de realizar qualquer upgrade. Além disso, é importante verificar se a fonte de alimentação possui os conectores de energia compatíveis com a placa de vídeo.
  15. Aqui estão algumas sugestões de livros sobre séries temporais múltiplas que podem ser úteis para quem está começando a estudar Data Science: "Multivariate Time Series Analysis: With R and Financial Applications" de Bernhard Pfaff Este livro é uma introdução ao estudo de séries temporais múltiplas, com foco em aplicações financeiras. Ele aborda tópicos como modelagem e previsão, análise de cointegração e modelos de volatilidade. "Multivariate Time Series Analysis: With Applications in R" de Holger Kantz e Thomas Schreiber Este livro é uma introdução ao estudo de séries temporais múltiplas, com exemplos e exercícios resolvidos em R. Ele aborda tópicos como modelagem e previsão, análise de cointegração, sistemas dinâmicos e processos estocásticos. "Multivariate Time Series Analysis: Methods and Applications" de Neil H. Timm Este livro é uma introdução ao estudo de séries temporais múltiplas, com ênfase em técnicas de análise de séries temporais univariate e multivariate. Ele aborda tópicos como modelagem e previsão, análise de cointegração e modelos de volatilidade. "Multivariate Time Series with R" de Thomas H. B. Anderson Este livro é uma introdução ao estudo de séries temporais múltiplas, com exemplos e exercícios resolvidos em R. Ele aborda tópicos como modelagem e previsão, análise de cointegração, modelos de volatilidade e sistemas dinâmicos. Esses são apenas alguns exemplos de livros que tratam do assunto. Há muitos outros recursos disponíveis
  16. Para criar um algoritmo em Python que permita ao usuário escolher realizar uma nova operação ou sair do programa, você pode seguir os seguintes passos: Defina uma variável para controlar se o programa deve continuar ou sair. Por exemplo: continuar = True Faça um loop infinito, que será interrompido quando a variável continuar for alterada para False. while True: # Código do programa aqui # Verificar se o usuário quer continuar ou sair if not continuar: break Dentro do loop, coloque o código do programa que deve ser executado. Por exemplo, para realizar uma operação de cálculo, você pode ler dois números do usuário e exibir o resultado da operação: num1 = float(input("Digite o primeiro número: ")) num2 = float(input("Digite o segundo número: ")) resultado = num1 + num2 print(f"O resultado é {resultado}") No final do loop, pergunte ao usuário se ele quer continuar ou sair. Você pode fazer isso lendo uma resposta do usuário e alterando a variável continuar de acordo: resposta = input("Deseja realizar uma nova operação? [S/N]") if resposta.upper() == "N": continuar = False O programa vai continuar executando enquanto o usuário responder "S" à pergunta. Quando o usuário responder "N", a variável continuar será alterada para False e o loop será interrompido.
  17. Segue abaixo uma maneira mais fácil de fazer:: Armazene os dados dos jogos em uma estrutura de dados, como uma lista de dicionários. Cada dicionário deve conter as informações de um jogo, como a data, o placar e o time mandante e visitante. Você pode carregar esses dados a partir de um arquivo CSV ou de uma base de dados. Faça um loop na lista de jogos e, para cada jogo, verifique se o time do coração é o time visitante ou o time mandante. Se o time do coração for o time visitante, adicione o jogo à uma lista de jogos ganhos como visitante. Se o time do coração for o time mandante, adicione o jogo à uma lista de jogos ganhos como mandante. jogos = [ { "data": "01/01/2021", "placar": "2x1", "mandante": "Time A", "visitante": "Time B" }, { "data": "03/01/2021", "placar": "1x2", "mandante": "Time C", "visitante": "Time B" }, { "data": "05/01/2021", "placar": "3x1", "mandante": "Time B", "visitante": "Time D" }] time_coracao = "Time B" jogos_ganhos_visitante = [] jogos_ganhos_mandante = [] for jogo in jogos: if jogo["visitante"] == time_coracao and jogo["placar"].split("x") Bons estudos!
  18. Para fazer uma conexão .NET com o banco de dados Oracle 19, você pode seguir os seguintes passos: Baixe e instale o driver Oracle para .NET, disponível no site da Oracle. Esse driver é necessário para que o .NET consiga se conectar ao banco de dados Oracle. Adicione a referência ao driver Oracle para .NET ao seu projeto. Isso pode ser feito adicionando a seguinte linha de código no arquivo de projeto: Copy code <Reference Include="Oracle.ManagedDataAccess" /> Adicione o namespace Oracle.ManagedDataAccess à sua classe. Isso pode ser feito adicionando a seguinte linha de código no início da classe: Copy code using Oracle.ManagedDataAccess.Client; Crie uma string de conexão com os detalhes de acesso ao banco de dados Oracle. A string de conexão deve conter informações como o endereço do servidor, o nome do banco de dados, o nome de usuário e a senha. Aqui está um exemplo de string de conexão: Copy code string connectionString = "Data Source=localhost;User Id=user;Password=password;"; Crie uma instância da classe OracleConnection passando a string de conexão como parâmetro. Copy code OracleConnection connection = new OracleConnection(connectionString); Abra a conexão com o banco de dados chamando o método Open da classe OracleConnection. Copy code connection.Open(); Agora você pode usar a conexão para executar comandos SQL e acessar os dados do banco de dados Oracle. Quando terminar, não esqueça de fechar a conexão chamando o método Close da classe OracleConnection.
  19. O método System.Reflection.Assembly.GetExecutingAssembly().Location.ToString() retorna a localização do arquivo de assembly atualmente sendo executado. Se você está tentando usar esse método no Visual Studio, pode ser que ele não esteja funcionando porque o arquivo de assembly está sendo executado de um lugar diferente daquele esperado. Aqui estão algumas possíveis razões pelas quais o método pode não estar funcionando: 1: O arquivo de assembly está sendo executado de um diretório temporário: Quando você executa o aplicativo no Visual Studio, ele é compilado e colocado em um diretório temporário. Se você estiver tentando acessar a localização do arquivo de assembly a partir do código, ele pode não estar no mesmo local onde o código está sendo executado. 2: O arquivo de assembly está sendo executado em um emulador ou dispositivo móvel: Se você estiver executando o aplicativo em um emulador ou dispositivo móvel, o arquivo de assembly pode estar sendo executado em outro lugar. Nesse caso, o método pode não funcionar como esperado. 3. O arquivo de assembly foi movido ou renomeado: Se você moveu ou renomeou o arquivo de assembly após a compilação, o método pode não conseguir encontrá-lo e, portanto, não funcionar como esperado. Para resolver o problema, você pode tentar descobrir onde o arquivo de assembly está sendo executado e alterar o código para refletir a nova localização. Também pode ser útil verificar se o arquivo de assembly está sendo executado na plataforma esperada (por exemplo, no emulador ou dispositivo móvel). Se você ainda tiver dificuldades, pode ser útil pesquisar online ou perguntar a outros desenvolvedores por ajuda.
  20. Existem várias linguagens de programação que podem ser usadas para desenvolver aplicativos usando o ERP Protheus da TOTVS e o banco de dados SQL Server. Algumas opções populares incluem: C#: C# é uma linguagem de programação orientada a objetos criada pela Microsoft. Ela é amplamente utilizada para desenvolver aplicativos desktop, web e móveis, e é compatível com o banco de dados SQL Server. Java: Java é uma linguagem de programação orientada a objetos amplamente utilizada para desenvolver aplicativos em várias plataformas. Ela é compatível com o banco de dados SQL Server e pode ser usada para desenvolver aplicativos web, desktop e móveis. PHP: PHP é uma linguagem de programação amplamente utilizada para desenvolver aplicativos web. Ela é compatível com o banco de dados SQL Server e pode ser usada para desenvolver aplicativos web usando o ERP Protheus da TOTVS. Python: Python é uma linguagem de programação de alto nível que pode ser usada para desenvolver aplicativos desktop, web e móveis. Ela é compatível com o banco de dados SQL Server e pode ser usada para desenvolver aplicativos usando o ERP Protheus da TOTVS. Essas são apenas algumas das opções disponíveis. A escolha da linguagem de programação dependerá de suas necessidades e preferencias pessoais, bem como da plataforma e do tipo de aplicativo que você está desenvolvendo.
  21. Para criar uma instância de máquina de estados para o animal gato em Java, você pode seguir os seguintes passos: Defina os estados possíveis da máquina de estados. Por exemplo: "dormindo", "comendo", "brincando" e "olhando". Crie uma classe para representar o gato. Essa classe deve conter uma variável de estado que armazene o estado atual do gato. Ela também deve ter métodos para alterar o estado do gato (por exemplo, "dormir()" e "brincar()") e para obter o estado atual do gato (por exemplo, "getEstado()"). Crie uma classe para representar a máquina de estados do gato. Essa classe deve ter uma referência para uma instância da classe do gato e deve ter métodos para alterar o estado do gato de acordo com a lógica da máquina de estados. Por exemplo, se o gato estiver brincando, a máquina de estados pode alterar o estado para "dormindo" após um determinado período de tempo. Use as classes criadas para criar uma instância da máquina de estados do gato e testá-la. Você pode chamar os métodos da máquina de estados para alterar o estado do gato e verificar se o estado é alterado corretamente.
  22. Provavelmente deve ser esta então obrigado
  23. Estou estudando sobre funções de DLLs e achei essa do windows interessante e tentei localiza-la mas não encontrei ja pesquisei em todas pastas do meu computador estou utilizando windows 11 64 bits
  24. Então só resta certificar-se que a base de dados chamada testeprojeto realmente existe no seu banco de dados. caso não existe basta rodar a seguinte query para criação: CREATE DATABASE testeprojeto ; em seguida: USE testeprojeto ;
  25. muito fácil cada desse representa uma classe (classe usuário, classe empréstimo, classe livro e classe exemplar) dentro das classes todos atributos estão com símbolo "-" a esquerda o que significa que o encapsulamento dos atributos é obrigatório para todos então serão todos privates. as linhas e os números fora das classes representam o relacionamento entre as classes assim que se ler um diagrama de classes: 1 usuário tem 0 ou muitos empréstimos empréstimo tem 1 usuário necessita ter 1 lista de emprestimo dentro de usuario adicione: List<Emprestimo> emprestimos necessita ter 1 usuario em emprestimo adicione: Usuario usuario; empréstimo tem 1 exemplar 1 exemplar pode ter 0 ou muitos empréstimos necessita ter 1 exemplar em emprestimo adicione: Exemplar exemplar; necessita ter 1 lista de emprestimo dentro de exemplar adicione: List<Emprestimo> emprestimos 1 ou muitos exemplares podem ter 1 livro 1 livro pode ter 1 ou muitos exemplares necessita ter 1 livro em exemplar adicione: Livro livro; necessita ter 1 lista de exemplares dentro de livro adicione: List<Exemplar> exemplares os outros atributos já estão descritos basta repetilos e como disse estão representados como privados. Pronto sua estrutura será esta assim que a fizer poste aqui para que possa ajudar de mais alguma maneira.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!