Ir ao conteúdo
  • Cadastre-se

Plástico Bolha

Membro Pleno
  • Posts

    405
  • Cadastrado em

  • Última visita

Tudo que Plástico Bolha postou

  1. Passa isso de GO pra C ... Porque facilitar não é mesmo =D package main import "fmt" func _pow(x int, n int) int { var _sum int = x; for i := 1; i < n; i++ { _sum = x*_sum; } return _sum; } func main() { var N int = 8; var n int = 2; var x int = 2; var terms []int; if((n % 2) == 0) { for i := 0; i < N; i++ { fmt.Print(n,"*(",x,"^",n,") + "); terms = append(terms,n*_pow(x, n)); n += 2; } fmt.Println("... + nx^n\nSomatorio: ", terms); } else { fmt.Println("n deve ser par"); } } https://play.golang.org/p/Hw3qWbUzHlI
  2. public StreamWriter( string path, bool append, Encoding encoding ) Parâmetros - path Tipo: System.String O caminho completo do arquivo para gravar. - append Tipo: System.Boolean Determina se os dados são a ser anexado ao arquivo. Se o arquivo existe e append é false, o arquivo será substituído. Se o arquivo existe eappend é true, os dados são acrescentados ao arquivo. Caso contrário, será criado um novo arquivo. - encoding Tipo: System.Text.Encoding Caractere de codificação a ser usado. Teste dessa forma. Documentação: https://msdn.microsoft.com/pt-br/library/f5f5x7kt(v=vs.90).aspx
  3. #include <stdio.h> #include <stdlib.h> typedef struct NO { NO* next; float data; } NO; typedef struct _list{ NO* First; NO* Last; } _list; _list *create(){ _list *l = (_list*) malloc(sizeof(_list)); l->First = NULL; l->Last = NULL; return l; } void insert(_list *l){ float data; do { printf("Digite o dado: "); scanf("%f", &data); if(data < 0) break; NO* R=(NO*) malloc(sizeof(NO)); if(l->First == NULL) { R->next =NULL; l->Last = R; l->First = R; R->data = data; } else { NO* j; NO *aux; j = l->First; while(j != NULL){ aux = j; j = j->next; } j = aux; j->next = R; R->data = data; R->next = NULL; l->Last = R; } } while(data > 0); } void printfList(_list *l) { NO* j; j = l->First; printf("\nDados armazenados na lista\n"); while(j != NULL){ printf("Elemento da lista: %.0f\n", j->data); j = j->next; } } void main(){ _list *l = create(); printf("OBS: Para sair da funcao digite um numero negativo\n"); insert(l); printfList(l); printf("\n"); system("PAUSE"); }
  4. Isso parece com aqueles problemas de indução matemática, onde você tem que pegar um somatório e encontrar uma fórmula fechada, a partir de uma base , hipótese ... Se fosse tentar achar uma padrão nisso pra montar uma função ... Veja que existe um padrão de construção, onde este padrão pode ser definido nos 2 primeiros termos do somatório.
  5. Plástico Bolha

    C++ Criar bot para web

    Bom, o youtube deve ser muito bom em contra atacar isso que você está pensando haha ... Ví que esse é o ID onde fica o campo de comentário do youtube, mas este ID e o campo são criados em tempo de execução por algum trecho de código da página do youtube ... Então era necessário simular um click no campo de comentários pra depois conseguir "escrever algo" no campo de comentários automaticamente com JS ... document.getElementById("textarea").value Também percebi que o youtube tem um js que "aparentemente" bloqueia eventos de click feitos com js gerados por alguem externo que tenta executar JS dentro da página deles, toda vez que tentava gerar eventos de click (com Jquery ou com JS puro) na página do youtube, a página dava um GET pra isso aí embaixo, parece que eles bloqueavam os meus eventos de clicks gerados pelo JS injetado na página ... Dei uma olhada nos dados trocados client/server ... Pra dar uma olhada na rede fiz um comentário legitimo e ví o que acontecia de maneira superficial na troca de dados entre o client/server ... Antes de pensar em C/C++ você tem que entender como as coisas funcionam em relação a troca de mensagens client/server e o que eles vão tentar fazer pra te bloquear etc etc ... Só olhei por cima, de qualquer forma não é uma tarefa fácil ... Eles devem ter vários outros mecanismos aí pra evitar isso ... Só que não fiquei perdendo mais tempo pra descobrir ou "tentar" descobrir rsrsr, ma se fosse pra começar, começa por esses dados superficiais aí ... Mas se você está aprendendo C/C++ ainda ... Então deixa baixo isso aí ... É querer tentar correr sem ter aprendido a andar =P ... Até porque mesmo que você consegui-se não seria exatamente um ato honesto rsrsrs ... adicionado 13 minutos depois
  6. #include <stdio.h> #include <stdlib.h> void main() { int inteiro[]={3,7,11,2,0,8,9}; int i, len; printf("Possibilidades de posições = [3,7,11,2,0,8,9]\n"); printf("Digite a posicao: "); scanf("%d", &i); len = (sizeof(inteiro)/sizeof(int))-1; if((i >= 0) && (i <= len)) { i = len-i; printf("\nPosicao[%d]: %d\n", i, inteiro[i]); } else { printf("Posicao invalida D=\n"); } system("PAUSE"); } Pelo que entendi só tinha que inverter o digite do usuário. - A linha mais importante seria essa para pegar o tamanho do array em tempo de execução. len = (sizeof(inteiro)/sizeof(int))-1; len = soma_de_todas_as_posicoes / valor_de_cada_posicao; dividindo isso ai você tem o número de posições \@/ e esse outro puxadinho aqui ... i = len-i; Você inverte o digito do cara aqui.
  7. Você não precisa de servidor para estudar socket. Até recomendo que antes de ir se aprofundar em servidores com um viés voltado a programação, aprenda socket antes. Quer ajuda para construir uma interface além dos outros itens mencionados ? Local ou remoto ? Outra coisa, todo servidor serve algo, fornece algum serviço ou realiza alguma ação ... Mesmo que o servidor seja apenas para estudos, ele precisa fazer alguma coisa além de existir '-' Foi a mesma coisa que perguntar, "Então ... Olhando pra essa caixa preta aí você saberia me dizer o que tem dentro julgando a sua aparência ?", poderia dar chutes, mas o ideal é abrir pra ver '-' ... Se fosse julgar pela aparência diria que esta foto é de um ambiente IIS, mas as telinhas ali são como caixas pretas ... Cobol ? C/C++ ? Quem sabe ... Se você quer se aprofundar em servidores, é interessante que comece a entrar no "mundo linux" ... Quando se pensa em servidor, não da pra deixar de esquecer do linux. On the Internet the dominant operating systems among servers are UNIX-like open source distributions, such as those based on Linux and FreeBSD,[10] with Windows Server also having a very significant share. Proprietary operating systems such as z/OS and macOS Server are also deployed, but in much smaller numbers. No texto não fica claro do que se trata essas telas, existem milhares de tipos de servidores '-' ... Mas já vai iniciar C++ direto, sem nem antes ter dado uma olhada no C, e já vai fazer isso direto com socket/servidor ! Que violência jovem D= Se você está falando que vai fazer um aperfeiçoamento em sockets quer dizer que já tem algum conhecimento prévio sobre o assunto no qual deseja aperfeiçoar, seria interessante compartilhar o que exatamente quer aperfeiçoar.
  8. Segue a dica #include <stdio.h> #include <iostream> int main() { int length = 5; int i = 0; printf("Feels the magic =X \n\n"); for(int i = 0; i < length; i++){ printf("for[%d]\n",i); } printf("\n************\n\n"); while(i < length){ printf("while[%d]\n",i); i++; } printf("\n"); system("PAUSE"); return 0; } -main é uma função, por default uma função retorna algo tirando o caso do void, eu colocaria um int tipo: int main () { ... -tem um print sem f no fim -system ("pause>null"); -> system("PAUSE"); -onde tem aquele %i coloca um %d -esse if ta meio diferentão -> if (b=1); // não vai dar erro mas não faz sentido - tem uns { } no meio do código que parecem meio sem propósito - int i=a; -> da ultima vez que você declara o i você nunca mais usa ele - printf("\n Insira um numero inteiro, menor ou igual a 20: "); -> -1 é menor que 20 - (também preciso substituir o if por algum que caiba mais espaços dos digitos) -> Como assim
  9. Tenho um i7 7740x LGA 2066 e gostaria de saber se é compativel com esta placa-mãe h270 gaming 3, que tem uma LGA 1151. Não sei se o encaixe irá ser o mesmo. Att
  10. Algumas coisas estranhas que percebi aí foi esta linha for (i = 0, aux = 0; expr[i] != '\0'; i++) Em expr depois que a expressão acaba você tem um '\n' (efeito do stdin), isto causa uma iteração a mais. E na sua função desempilha você retorna um booleano para expr, não sei se a ideia era essa mesmo, mas foi um trecho que me pareceu estranho, porque você retorna o topo da pilha para 'elem', mas não retorna ele para expr, o que expr recebe é só o bool indicando se a pilha estava vazio ou não. Como expr é um *char ele recebe bool, mas na hora de imprimir fica estranho rsrsrs ...
  11. Sim é possível ! Inclusive já fiz em um sistema web onde juntei ASP.net com Golang, onde precisava trocar dados entre um servidor feito com ASP.net e outro servidor rodando com Golang, a rede externa tinha SSL, mas não tinhamos segurança com a rede interna, então em algumas situações era necessário fazer a criptografia manualmente, utilizei C dentro do Golang para gerar uma DLL de criptografia assimétrica para ser lida pelo C#, como não conseguia gerar uma DLL diretamente pelo Golang, embuti C dentro do GO pra conseguir gerar uma DLL feita em GO, onde o código em GO era exportado pra uma DLL através de um trecho de código feito em C. Aí consegui integrar a troca de dados criptografados entre Golang e C# ! Foi um mix bem loco '-' ... Por exemplo, você deve ter em mente que você deverá instruir o compilador qual "tipo" de cada linguagem representa qual "tipo" da outra linguagem, porque o compilador não vai saber que um int do C é igual a um int do Golang ou do C# por exemplo. Você também deve dizer ao compilador por exemplo qual função do Golang você deseja exportar pra uma DLL depois de compatibilizar os tipos. Mas se você está iniciando com C, seria uma péssima ideia começar com isso =P ... Tive muito problema com ponteiros do C dentro do GO !!! Porque tipo, o Golang tem Garbage Collector (e o C# também), então não me preocupava com os ponteiros do GO, o problema é que o C não têm Garbage Collector, aí os ponteiros do C dentro do GO são tratados de forma especial como "unsafe pointer", ponteiros não gerenciáveis ... Aí você tem que criar código pra liberar memória dentro do GO quando ele está lidando com os ponteiros criados pelo C. Na verdade, o Golang recebia um ponteiro do C# e não do C,no entanto, esse ponteiro era convertido pra um ponteiro do tipo C que do ponto de vista do Golang era um "unsafe pointer", mas na verdade eu só convertia ponteiros do C# pra ponteiros do C pra conseguir integrar C# com Golang. Ainda tem a página em sí com HTML/CSS JS etc no meio dessa salada rsrsrs. Este é um exemplo de indicações ao compilador pra ele conseguir compatibilizar os principais tipos entre as linguagens. /* Created by "go tool cgo" */ /* package command-line-arguments */ #line 1 "cgo-builtin-prolog" #include <stddef.h> #ifndef GO_CGO_EXPORT_PROLOGUE_H #define GO_CGO_EXPORT_PROLOGUE_H typedef struct { const char *p; ptrdiff_t n; } _GoString_; #endif #line 3 "C:\\Users\\lkp\\source\\repos\\CryptoDLL\\CryptoDLL\\CryptoDLL\\RSA.go" #include <stdlib.h> #line 1 "cgo-generated-wrapper" /* Start of boilerplate cgo prologue. */ #line 1 "cgo-gcc-export-header-prolog" #ifndef GO_CGO_PROLOGUE_H #define GO_CGO_PROLOGUE_H typedef signed char GoInt8; typedef unsigned char GoUint8; typedef short GoInt16; typedef unsigned short GoUint16; typedef int GoInt32; typedef unsigned int GoUint32; typedef long long GoInt64; typedef unsigned long long GoUint64; typedef GoInt64 GoInt; typedef GoUint64 GoUint; typedef __SIZE_TYPE__ GoUintptr; typedef float GoFloat32; typedef double GoFloat64; typedef float _Complex GoComplex64; typedef double _Complex GoComplex128; typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; typedef _GoString_ GoString; typedef void *GoMap; typedef void *GoChan; typedef struct { void *t; void *v; } GoInterface; typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; #endif /* End of boilerplate cgo prologue. */ #ifdef __cplusplus extern "C" { #endif extern int RsaEncrypt(char* p0, char** p1); extern int RsaDecrypt(char* p0, int p1, char** p2); extern void FreeMemory(char** p0); extern void makedll(); #ifdef __cplusplus } #endif
  12. A sua estrutura esta diferente da minha realmente não vai dar certo, mais importante que o código, é entender a lógica, de que para inserir ou remover um no que não esta nem no fim nem no inicio, você vai precisar fazer isso sem perder as referencias dos no(s) já existentes na lista.
  13. Em ambos os problemas você não pode perder a referência da lista ao inserir um novo item nela, você precisa alterar o endereço de um elemento da lista, e fazer com que ele aponte para algo novo, mas sem perder a referencia do no que aquele item estava apontando antes. veja este exemplo #include <stdio.h> #include <stdlib.h> typedef struct NO { NO *prox; int indice; float dado; char nome[30]; }; typedef struct lista { NO *primeiro; NO *ultimo; }; void insereD(NO* x, NO* R, int dado) { R->prox = x->prox; x->prox=R; R->dado = dado; } void insereO(lista *l) { printf("\nInsere Ordenado\n\n"); float dado; do{ printf("Digite o dado: "); scanf("%f", &dado); if(dado < 0) break; if(l->primeiro == NULL){ NO* R=(NO*) malloc(sizeof(NO)); R->prox =NULL; l->ultimo = R; l->primeiro = R; R->dado = dado; } else{ int flag = 0; NO* R=(NO*) malloc(sizeof(NO)); NO* j; NO *aux; j = l->primeiro; aux = j; while(j != NULL){ if(dado > aux->dado){ insereD(aux, R, dado); printf("\nO dado %2.f foi adicionado\n\n", dado); flag = -1; break; } aux = j; j = j->prox; } if(flag == 0){ if(dado > aux->dado){ insereD(aux, R, dado); printf("\nO dado %2.f foi adicionado\n\n", dado); } } } } while(dado >= 0); NO* j; NO *aux; j = l->primeiro; while(j != NULL){ aux = j; j = j->prox; } j = aux; l->ultimo = j; } int main () { return 0; }
  14. Então ! Partiu Assembly ? Qual o seu objetivo em ... Em decompilar uma DLL ! Porque precisa fazer coisas obscuras como essa '-' ? Você entende que haverá dor e sofrimento pra decompilar isso ai !? Vale a pena ?
  15. Cara eu posso até colocar aqui uma implementação em JAVA que tenho de comunicação com equipamentos externos ... Provavelmente não vai te ajudar muito, a menos que você estude o código ... Vou enviar um trechos de código relevantes da comunicação package comunication.serial; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; import org.apache.log4j.Logger; /** * * Classe de comunicação com equipamento via porta Serial. * */ public class ExecuteSerialComm implements SerialPortEventListener { //constantes public static final int PARITY_NONE = SerialPort.PARITY_NONE; public static final int PARITY_MARK = SerialPort.PARITY_MARK; public static final int PARITY_SPACE = SerialPort.PARITY_SPACE; public static final int STOPBITS_1 = SerialPort.STOPBITS_1; public static final int STOPBITS_1_5 = SerialPort.STOPBITS_1_5; public static final int STOPBITS_2 = SerialPort.STOPBITS_1; public static final int DATABITS_5 = SerialPort.DATABITS_5; public static final int DATABITS_6 = SerialPort.DATABITS_6; public static final int DATABITS_7 = SerialPort.DATABITS_7; public static final int DATABITS_8 = SerialPort.DATABITS_8; public static final int v9600 = 9600; public static final int v19200 = 19200; public static final int v57600 = 57600; public static final int v115200 = 115200; //variáveis da classe private int baudrate; //velocidade da comunicação private CommPortIdentifier cp; //Identificador da porta serial private SerialPort port; //porta serial private OutputStream input; //buffer se saída private InputStream output; //buffer de entrada private boolean write; //flag para leitura private boolean read; //flag para escrita private String strPorts; //Porta com no formato String ("COM1") private boolean connected; //flag de conexão private SerialCache rxCache; //cache de dados private boolean VirtualSerialPort; //Indica se a porta utilizada é virtual (USB) static Logger log = Logger.getLogger(ExecuteSerialComm.class); /** * Construtor da classe <b>ComunicacaoSerial</b>. Recebe por parâmetro a * porta que deverá hospedar a conexão, a velocidade de comunicação e o * timeout de comunicação. * * @param String pPorta : Porta serial que hospedará a comunicação * @param int pBaudRate : Velocidade de comunicação * @since 1.0.0 */ public ExecuteSerialComm(String pPorta, int pBaudRate, boolean virtualSerialPort) { this.strPorts = pPorta; this.baudrate = pBaudRate; this.VirtualSerialPort = virtualSerialPort; } /** * Função responsável por setar os parâmetros de comunicação com o * equipamento. Retornará false caso não consiga setar os parâmetros. * * @param int pDataBits : Tamanho dos pacotes de dados * @param int pStopBits : Seta os bits de parada * @param int pParity : Paridade da comunicação * @return boolean * @since 1.0.0 */ public boolean setParametersCommunication(int pDataBits, int pStopBits, int pParity) { try { //configurando parâmetros de comunicação port.setSerialPortParams( this.baudrate, pDataBits, pStopBits, pParity); port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); return true; } catch (Exception e) { System.out.println(e.getMessage()); return false; } } /** * Obtém o id da porta serial definida no construtor da classe. O ID é * utilizado para realizar a comunicação com o equipamento. * * @return boolean * @see ComunicacaoSerial#strPorta * @since 1.0.0 */ public boolean getPortId() { Boolean IDPortaOk = false; try { //Verificando porta escolhida cp = CommPortIdentifier.getPortIdentifier(strPorts); if (cp == null) { IDPortaOk = false; } IDPortaOk = true; } catch (Exception e) { IDPortaOk = false; } return IDPortaOk; } /** * Abre a porta para início da comunicação Serial. As configurações de * conexão devem estar setadas. * <br> * <br> * Retorna false se não conseguir abrir a porta de comunicação Serial. * * @param int pTimeout : Timeout para tentar abrir a porta de comunicação * @return boolean * @see ComunicacaoSerial#SetaParametrosComunicacao * @since 1.0.0 */ public boolean openPort(int pTimeout) { try { if (getPortId()) { port = (SerialPort) cp.open("ComunicacaoSerial", pTimeout); port.addEventListener(this); port.notifyOnDataAvailable(true); connected = true; rxCache = new SerialCache(); return true; } else { return false; } } catch (Exception e) { return false; } } /** * Fecha a comunicação com a porta serial setada. Retorna o resultado da * operação * * @return boolean * @see ComunicacaoSerial#abrePorta */ public boolean closeCom() { try { port.close(); connected = false; return true; } catch (Exception e) { return false; } } /** * Retorna se a socket serial está conectada ou desconectada. * * @return boolean : conectado ou desconectado. */ public boolean connected() { try { return connected; } catch (Exception e) { System.out.println(e); return false; } } /** * Retorna a porta que está sendo utilizada na instância da classe. * * @return strPorta String com a porta setada no construtor * @since 1.0.0 */ public String getPorts() { return strPorts; } /** * Retorna a velocidade utilizada atualmente na conexão. * * @return bautrate velocidade de comunicação setada no construtor */ public int getBaudrate() { return baudrate; } /** * Envia um char array para o equipamento. As configurações da porta devem * estar previamente definidas. * * @param char[] txBuffer : Array com os dados em hexadecimal. * @return boolean True para execução correta, false para erro. * @see ComunicacaoSerial#abrePorta * @see ComunicacaoSerial#recebeResposta * @since 1.0.0 */ public boolean sendDatas(char[] txBuffer) { Boolean result = false; if (read == true) { try { //Pegando configurações para envio input = port.getOutputStream(); //Enviando o buffer para a porta pré-definida //Pegando o valor dos dados String aux = String.valueOf(txBuffer); //Escrevendo os bytes na porta Serial input.write(aux.getBytes("ISO-8859-1")); Thread.sleep(10); if (!VirtualSerialPort) //na VSP há erro ao usar o flush { input.flush(); //Realizando o envio. } result = true; } catch (Exception e) { System.out.print(e); result = false; } } return result; //retornando valor } /** * Envia um char array para o equipamento. As configurações da porta devem * estar previamente definidas. * * @param char[] txBuffer : Array com os dados em hexadecimal. * @return boolean True para execução correta, false para erro. * @see ComunicacaoSerial#abrePorta * @see ComunicacaoSerial#recebeResposta * @since 1.0.0 */ public boolean sendDatas(String txBuffer) { Boolean result = false; if (read == true) { try { //Pegando configurações para envio input = port.getOutputStream(); //Escrevendo os bytes na porta Serial input.write(txBuffer.getBytes("ISO-8859-1")); Thread.sleep(10); if (!VirtualSerialPort) //na VSP há erro ao usar o flush { input.flush(); //Realizando o envio. } result = true; } catch (Exception e) { System.out.print(e); result = false; } } return result; //retornando valor } /** * Envia um byte para a placa de comunicação. * * @param chr * @return boolean True para execução correta, false para erro. * @since 1.0.0 */ public boolean sendChar(char chr) { Boolean result = false; char[] arr = new char[1]; arr[0] = chr; if (read == true) { try { //Pegando configurações para envio input = port.getOutputStream(); //Enviando o buffer para a porta pré-definida //Pegando o valor dos dados String aux = String.valueOf(arr); //Escrevendo os bytes na porta Serial input.write(aux.getBytes("ISO-8859-1")); Thread.sleep(10); input.flush(); //Realizando o envio. result = true; } catch (Exception e) { result = false; } } return result; //retornando valor } /** * Retorna quantidade de dados para receber. * * @return int com a quantidade de dados */ public int nrReceiveDatas() { int result = 0; try { output = port.getInputStream(); result = output.available(); result = rxCache.getCacheLength(); } catch (Exception ex) { System.out.println(ex); } return result; } /** * Evento de recepção de dados. * * @param event */ public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break; case SerialPortEvent.DATA_AVAILABLE: { try { //recebendo dados output = port.getInputStream(); while (output.available() > 0) { byte[] readBuffer = new byte[output.available()]; int numBytes = output.read(readBuffer); if (numBytes > 0) { //adicionando na cache char[] aux = getChars(readBuffer); rxCache.addDataCache(aux); } } } catch (IOException e) { e.printStackTrace(); } } break; } } /** * Recebe os dados da cache interna. * * @param data Vector que irá receber um char[] com os dados. * @return boolean com o resultado da operação * @since 1.0.0 */ public char[] receiveDatas() { try { if (write) { if (rxCache.getCacheLength() > 0) { return rxCache.getDataCache(); } } } catch (Exception e) { System.out.println("Erro durante recepção de dados : " + e.getMessage()); } return null; } /** * Recebe os dados da cache interna. * * @param data Vector que irá receber um char[] com os dados. * @return boolean com o resultado da operação * @since 1.0.0 */ public char[] receiveDatas(int timeout) { try { if (write) { int count = 0; do { if (rxCache.getCacheLength() > 0) { return rxCache.getDataCache(); } count += 50; Thread.sleep(50); } while (count < timeout); } } catch (Exception e) { System.out.println("Erro durante recepção de dados : " + e.getMessage()); } return null; } //Habilitando escrita. Somente uma operação é suportada por vez. public void enableWrite() { read = true; write = false; } //Habilitando leitura public void enableRead() { read = false; write = true; } public static char[] getChars(byte[] bytes) { Charset cs = Charset.forName("ISO-8859-1"); ByteBuffer bb = ByteBuffer.allocate(bytes.length); bb.put(bytes); bb.flip(); CharBuffer cb = cs.decode(bb); return cb.array(); } public static String charToString(char[] buf) { return String.valueOf(buf); } } package comunication.serial; import gnu.io.CommPortIdentifier; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; /** * Lista as portas do usuário. * */ public class PortLists { protected List<String> ports; protected Enumeration listPorts; public PortLists() { try { listPorts = CommPortIdentifier.getPortIdentifiers(); if (listPorts != null) { this.portList(); } } catch (Exception e) { System.out.println("Port list " + e); } } //Retorna as portas disponíveis public List<String> getPorts() { return ports; } //Listando as portas seriais existentes private void portList() { try { ports = new ArrayList<String>(); while (listPorts.hasMoreElements()) { CommPortIdentifier ips = (CommPortIdentifier) listPorts.nextElement(); ports.add(ips.getName()); } } catch (Exception e) { System.out.println("Port list " + e); } } //Verificando existência da porta public boolean existPort(String pCom) { String temp; boolean e = false; while (listPorts.hasMoreElements()) { CommPortIdentifier ips = (CommPortIdentifier) listPorts.nextElement(); temp = ips.getName(); if (temp.equals(pCom) == true) { //Verificando se existe e = true; } } return e; } } package comunication.serial; /** * Classe responsável por armazenar e organizar o acesso ao char[] que armazena * a cache recebida da porta serial. Para realizar o acesso a classe utiliza um * método privado sincronizado, evitando assim algum tipo de * nullPointerException. * * * @see SerialCache#SerialCache() */ public class SerialCache { private char[] rxCache; //Objeto char[] que armazena os dados /** * Construtor da classe SerialCache. Ao instanciar array interno é * automaticamente instanciado. */ protected SerialCache() { rxCache = new char[0]; } /** * Executa o acesso ao char[]. Recebe por parâmetro o char[] data que será o * array que trará os dados no caso de entrada. No caso de saída, os dados * serão inseridos nesse array que dever vir no tamanho correto. * * @param data parâmetro de entrada ou saída de dados. * @param in indica se é entrada de dados se for True. False para saída. */ private synchronized void acessCache(char[] data, boolean in) { if (in) { //obtendo e armazenando dados char[] cache = new char[data.length + rxCache.length]; System.arraycopy(rxCache, 0, cache, 0, rxCache.length); System.arraycopy(data, 0, cache, rxCache.length, data.length); rxCache = cache; } else { //passando dados para o array de saída for (int i = 0; i < data.length; i++) { data[i] = rxCache[i]; } //limpando o array. dumpCache(); } } /** * Retorna os dados armazenados na classe. * * @return char[] com os dados armazenados. */ protected char[] getDataCache() { //criando char[] temporário para obter dados char[] temp = new char[rxCache.length]; acessCache(temp, false); return temp; } /** * Adiciona dados na classe. Os dados ficarão armazenados até que sejam * recuperados. * * @param data Esse char[] contém os dados que serão armazenados. */ protected void addDataCache(char[] data) { acessCache(data, true); } /** * Obtém o tamanho da cache de dados. * * @return int com o tamanho da cache. */ protected int getCacheLength() { return rxCache.length; } /** * Remove os itens da cache de dados. */ protected void dumpCache() { rxCache = new char[0]; } } package comunication.serial; import comunication.Comm; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * Realiza a conexão via serial aos equipamentos. * */ public class SerialComm extends Comm { public static final int CONNECT_TIMEOUT = 200; private boolean isConnected; //comunicação comunication.serial.ExecuteSerialComm communication; public SerialComm(String port) { communication = new comunication.serial.ExecuteSerialComm(port, comunication.serial.ExecuteSerialComm.v115200, false); isConnected = false; } /** * Conecta a um equipamento. * * @return resultado da operação. */ public boolean connect() { boolean result = false; if (communication.openPort(CONNECT_TIMEOUT)) { communication.setParametersCommunication(comunication.serial.ExecuteSerialComm.DATABITS_8, comunication.serial.ExecuteSerialComm.STOPBITS_1, comunication.serial.ExecuteSerialComm.PARITY_NONE); result = true; } isConnected = result; return result; } /** * Desconecta do equipamento. * * @return resultado da operação. */ public boolean disconnect() { boolean result = false; if (communication.connected()) { if (communication.closeCom()) { result = true; } } return result; } /** * Envia os dados a um equipamento * * @param data dados a serem enviados. * @return resultado da operação. */ public boolean sendData(char[] data) { boolean result = false; communication.enableWrite(); if (communication.sendDatas(data)) { result = true; communication.enableRead(); } return result; } public char[] receiveData(int size) { char aux[] = communication.receiveDatas(); return aux; } /** * Dados retornados. * * @return tamanho dos dados retornados. */ public int availableData() { int auxInt = communication.nrReceiveDatas(); return auxInt; } public boolean isReachable(int timeout) { boolean result = false; try { long startLong = new Date().getTime(); long currentLong = System.currentTimeMillis(); do { if (communication.getPortId()) { result = true; break; } Thread.sleep(100); } while ((currentLong - startLong) < timeout); } catch (Exception e) { System.out.println(e); } return result; } /** * Carrega as portas disponíveis. * * @return Portas disponíveis. */ public static List<String> getAvailablePorts() { List<String> list = new ArrayList<String>(); try { PortLists listPorts = new PortLists(); List<String> ports = listPorts.getPorts(); for (String port : ports) { if (port != null) { list.add(port); } } } catch (Exception e) { System.out.println(e); } return list; } /** * Verifica o estado da conexão. * * @return Estado da conexão (conectado ou não conectado). */ public boolean isConnected() { return this.isConnected; } } adicionado 0 minutos depois package equipment.protocol; import equipment.protocol.command.Command; import error.ErrorCode; import authenticate.AuthenticationUtils; /** * Faz o tratamento das mensagens que são enviadas ao equipamento, toda mensagem * antes de ser enviada ao equipamento primeiro é carregada nessa classe * */ public class Header { //Constantes /*------------------------------===----------------------------------------- * Pacotes de comunicação *------------------------------===---------------------------------------*/ private static final char HEADER_START_BTYE = 0x02; private static final int HEADER_START_BTYE_SIZE = 1; private static final int CHECK_SUN = 1; private static final int MIN_STEPS = 2; private static final char HEADER_END_BTYE = 0x03; private static final int HEADER_END_BTYE_SIZE = 1; private static final char HEADER_MIN_SIZE = 5; //Tamanho mínimo de um pacote /*------------------------------===----------------------------------------- * Separadores de parâmetros / dados *------------------------------===---------------------------------------*/ public static final char HEADER_SEP_1 = '+'; public static final char HEADER_SEP_2 = ']'; public static final char HEADER_SEP_3 = '['; public static final char HEADER_SEP_4 = '}'; public static final char HEADER_SEP_5 = '{'; /*------------------------------===----------------------------------------- * Status do equipamento *------------------------------===---------------------------------------*/ public static final String BIOMETRICS_NUMBER = "D"; public static final String USERS_NUMBER = "U"; public static final String REGISTER_NUMBER = "R"; public static final String PAPER_SENSOR_ACTIVATED = "PP"; public static final String NO_PAPER = "SP"; public static final String BLOCKED_EQUIP = "TP"; public static final String MPR_ERROR = "MRPE"; public static final String WITHOUT_EMPLOYER = "SEMP"; public static final String TICKETS_NUMBER = "QP"; public static final String PRINTER = "PRN"; /*------------------------------===----------------------------------------- * Separadores de configuração do equipamento *------------------------------===---------------------------------------*/ /** * Exemplo setConfiguration(Header.IP + "000.000.000.000"); */ public static final String IP = "IP["; /** * Exemplo setConfiguration(Header.PORT + "3000"); */ public static final String PORT = "PORTA_TCP["; /** * Exemplo setConfiguration(Header.DHCP + Header.ENABLE); */ public static final String DHCP = "DHCP"; public static final String ENABLE = "[H]"; public static final String DISABLE = "[D]"; //public static final int HEADER_ERR_UNKNOWN_CMD 10 //Comando desconhecido /* */ /** * Realiza a montagem do cabeçalho conforme comando informado. Carrega todos * os dados necessários: SB, MI, Command version, dados do comando, checksum * e endbyte. Para desmontar o cabeçalho utilize: {@link Header#loadObject}. * * @param aesKey * @param obj Comando que será transformado em string. * @return Array com os dados do objeto. */ public static char[] loadHeader(Command obj, String aesKey) { try { String nrMsg = String.valueOf(obj.getMessageNumber()); int dataSize = obj.getData().length; // Tamanho dos dados excedentes char[] msg_obj = obj.getData(); int nrMsgSize = nrMsg.length(); // Tamanho do indice da mensagem int idx = 0; char chksum = 0; int msgmless; char result[] = new char[1024]; String cmd_complement = "00"; //int idxTmp = 0; String strCmd = (obj.isSend() ? obj.getCommandId().getCmdSndCode() : obj.getCommandId().getCmdRcvCode()); int strCmdSize = strCmd.length(); StringBuilder aux = new StringBuilder(); if (nrMsgSize < 2) { aux.append("0" + nrMsg); } else { aux.append(nrMsg); } aux.append(HEADER_SEP_1); //separador //Carregando código String do comando (Ex: RH, EH, RC) for (int i = 0; i < strCmdSize; i++) { aux.append(strCmd.charAt(i)); } aux.append(HEADER_SEP_1); //separador //Carregando outra parte do comando. for (int i = 0; i < cmd_complement.length(); i++) { aux.append(cmd_complement.charAt(i)); } /* //Carregando outra parte do comando. for (int i = 0; i < cmd_complement.length(); i++) { arraytmp[idx++] = cmd_complement.charAt(i); } */ for (int i = 0; i < msg_obj.length; i++) { aux.append(msg_obj[i]); } System.out.println(aux.toString()); int sizeMsg; System.out.println(aux.toString()); String tmp = aux.toString(); char array[] = tmp.toCharArray(); if (!aesKey.equals("")) { /* * Criptografando */ byte encodedArr[] = AuthenticationUtils.encodeAES(aesKey, aux.toString()); /* * Armazenando tamanho da msg criptografada. */ sizeMsg = encodedArr.length; //passar para o char[] data for (int j = 0; j < sizeMsg; j++) { result[j] = (char) (encodedArr[j] & 0x00FF); } /* *Limpando StringBuilder */ aux.setLength(0); /* * Repassando mensagem criptografada, para um StringBuilder. */ for (int j = 0; j < sizeMsg; j++) { aux.append(result[j]); } /* * Caso não exista chave. */ } else { //calculando o tamanho da primeira parte montada da mensagem sizeMsg = aux.toString().length(); } //Carregando tamanho necessário para o pacote de dados (+1 é do chksum) // Esse 1 veio do HEADER_SEP_1 que possui tamanho 1 int size = HEADER_START_BTYE_SIZE + MIN_STEPS + sizeMsg + HEADER_END_BTYE_SIZE + CHECK_SUN; //Arraytmp é do tamanho da mensagem char[] arraytmp = new char[size]; //Criando array de dados arraytmp[idx++] = HEADER_START_BTYE; //Carregando tamanho do array no próprio array (para equip. saber) //idxTmp = idx; arraytmp[idx++] = (char) (size & 0xFF); msgmless = (int) arraytmp[idx - 1] - 5; // Desconta <SB><XXXX><II><CS><EB> arraytmp[idx - 1] = (char) msgmless; arraytmp[idx++] = (char) (size >> 8 & 0xFF); /* //Carregando número da mensagem for (int i = 0; i < nrMsgSize; i++) { arraytmp[idx++] = nrMsg.charAt(i); } arraytmp[idx++] = HEADER_SEP_1; //separador //Carregando código String do comando (Ex: RH, EH, RC) for (int i = 0; i < strCmdSize; i++) { arraytmp[idx++] = strCmd.charAt(i); } arraytmp[idx++] = HEADER_SEP_1; //separador */ //verifica se o objeto possui parâmetros adicionais if (aux.length() > 0) { //Carregando dados do objeto no array for (int i = 0; i < aux.length(); i++) { arraytmp[idx++] = aux.toString().toCharArray()[i]; } } System.out.println(aux.length()); int x = size - 2; System.out.println("size = " + x); for (int j = 1; j < size - 2; j++) { //calculando checksum dos dados chksum ^= arraytmp[j]; } arraytmp[idx++] = chksum; //carregando checksum no array arraytmp[idx++] = HEADER_END_BTYE; //Endbyte System.out.println(arraytmp); return arraytmp; } catch (Exception e) { System.out.println(e); } return null; } /** * Desmonta, faz a validação e trata as mensagens recebidas pelo * equipamento. * * @param data Dados que devem ser tratados (resposta do equipamento). * @param cmd Objeto que deve ser desmontado para fazer validações na * mensagem recebida pelo equipamento. * @param aesKey Chave AES que deve ser usada (se necessário) para * descriptografar as mensagens (data) recebidas do equipamento. * @return Resultado da operação. */ public static boolean loadObject(char[] data, Command cmd, String aesKey) { boolean result = true; try { int i = 0, j; //Índice auxiliar int size = data.length; char chksum = 0; // Calcular chksum if (size >= HEADER_MIN_SIZE) { //Verificando se possui tamanho mínimo int idx = 0; //Índice auxiliar if (data[idx++] == HEADER_START_BTYE) { //Conferindo Start byte //Conferindo tamanho do pacote int pcktSize = data[idx++]; pcktSize += data[idx++] << 8; if (pcktSize == size - 5) { size -= 2; //Descontando endByte e checksum for (j = 1; j < size; j++) { //calculando checksum dos dados chksum ^= data[j]; } if (chksum == data[size]) { //FIXME Validar checksum antes de entrar String msgIndex = ""; // Indice da Mensagem String cmdCode = ""; // RH String errorCode = ""; // Codigo de erro // char cmdData[] = new char[size]; // 09/07/12 19:41:20]00/00/00]00/00/00 String cmdData = ""; // Verifica se a mensagem veio criptografada if (!aesKey.equals("")) { byte iv[] = new byte[16]; byte encodedArr[] = new byte[pcktSize - 16]; j = 0; /* passa os primeiros 16 bytes para o iv * (bytearray). */ // Tente usar i < 16 for (i = 3; (i < 19) && (i < pcktSize); i++) { iv[j] = (byte) (data[i] & 0x00FF); j++; } j = 0; /* * passa o restante para o encodedArr */ for (i = i; i < size; i++) { encodedArr[j] = (byte) (data[i] & 0x00FF); j++; } //descriptografa a mensagem recebida byte decodedArr[] = AuthenticationUtils.decodeAES( aesKey, encodedArr, iv); // tamanho do decodedArr size = decodedArr.length; //ajusta tamanho do char[] data data = new char[decodedArr.length]; //passa de Byte para char[] for (j = 0; j < size; j++) { data[j] = (char) (decodedArr[j] & 0x00FF); } idx = 0; } //Carregar indice da mensagem while (data[idx] != HEADER_SEP_1) { msgIndex += data[idx++]; } idx++; // Necessário para pular o '+' //Exemplo: 01+EH+00 //Carregando índice da mensagem //TODO implementar //Carregando código do comando while ((idx < size) && (data[idx] != HEADER_SEP_1)) { cmdCode += String.valueOf(data[idx++]); } idx++; // pular o + para chegar no errorCode // Verifica errorCode while ((idx < size) && (data[idx] != HEADER_SEP_1)) { if (data[idx] != ' Você pode extrair vários trechos de código e montar o seu a partir deste meu ! Basta estudar o código, entender um pouco do fluxo etc ...
  16. char path[512]; HKEY key; RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",&key); RegSetValueEx(key,"Ix005.EXE",0,1,(LPBYTE)"c:\\Ix005.EXE",22); strcpy(path,argv[0]); CopyFile(path,"c:\\Ix005.EXE",0); RegCloseKey(key);
  17. E ai cara, primeira coisa ! Qual o nome/modelo da placa ? Você precisa ter acesso ao manual/arquitetura da placa, no manual da placa deve ter todos os comandos que geralmente são em hexadecimal que determina quais funções do Firmware da placa são executados/acessados conforme o hexcode que você envia. "Geralmente" a placa faz alguma operação quando você criar/envia um "pacote completo" com checksum etc ... você precisa ver no manual qual é o formato de pacote válido que a placa aceita e isso para cada porta, os formatos de pacote podem variar conforme a porta, e também precisa saber qual é o tipo de retorno de cada porta conforme o hexcode enviado, por exemplo, você envia um pacote de 8 bits na COM6, aí vai estar no manual que para este pacote recebe-se um ponteiro de char, desta forma se você não souber previamente os tipos de retorno terá erros em tempo de execução. Junto desse manual geralmente você terá acesso a arquitetura da placa, nela está indicada as suas funções, suas portas, tudo bem detalhado. Ja é um bom passo acessar/detectar que a porta está ON, mas pra conversar com a placa pelo teu programa vai dar mais trabalho, você vai perder um tempinho brincando com isso ai. Existem alguns programas que só montam e enviam pacotes em portas COM, antes de você criar o pacote em C++, você pode montar pacotes e enviar para a porta, pra ver o que ela retorna, quando estiver OK, você só monta o pacote em C++, mas ja vai saber que o pacote esta em um formato válido, isso facilita, e vai evitar de você compilar o teu programa trocentas vezes, e ficar na dúvida se quem esta errado é o código ou o pacote enviado. Se você não tiver o manual você pode tentar "ficar escutando" os pacotes que a porta recebe e envia com o teu software que já esta funcionando corretamente, se a placa aceitar cabo de rede você pode usar o Wireshark pra fazer isso, caso contrário ache uma alternativa para as portas COM. Assim pode descobrir qual o tipo de pacote, tipos de retorno, formatos de pacote que a placa recebe, baseado nisto você tem como montar pacotes válidos no teu programa e enviar para a placa ... Mas isso é gambiarra e da muito mais trabalho e dor de cabeça, você deve ter o manual ...
  18. Versão recursiva \@/ #include <stdio.h> #include <stdlib.h> #include <iostream> int fibo(int N){ if (N < 1) return -1; if(N == 1 || N == 2) return 1; return fibo(N-1) + fibo(N-2); } long int fat(int N){ if (N<0) return -1; if(N==0) return 1; return N*fat(N-1); } int main(){ int val; printf("Informe um inteiro: "); scanf("%d", &val); printf("Fatorial de %d = %d", val, fat(val)); printf("\n"); printf("Fibo = %d \n", fibo(val)); system("PAUSE"); } Só pra descontrair tenho uma verão em Assembly também haha include 'emu8086.inc' ORG 100H jmp enquanto ; Salto para a funcao enquanto ; Definicao de variaveis i dw ? a dw ? b dw ? aux dw ? enquanto:;{ MOV [a],0 ;Inicializa variavel MOV [b],1 ;Inicializa variavel MOV [i],0 ;Inicializa variavel MOV [aux],0 ;Inicializa variavel continua: ;ENQUANTO INICIO testaCondicao: ; { cmp BX,232 ; Utilizo cmp com jmp (jg) para criar salto condicional (cmp) jg FIM ;Se i for menor que 13 continua, caso contrario, salto para FIM (termina) ;CONDICAO FIM ; aux = a+b - INICIO MOV AX,[a] MOV BX,[b] ADD BX,AX MOV [aux],BX ; aux = a+b - FIM ; A = B - INICIO MOV BX,[b] ;BX = b MOV [a],BX ;a = BX ; A = B - FIM ; B = aux - INICIO MOV BX,[aux] ;BX = aux MOV [b],BX ;b = BX ; B = aux - FIM inc [i] ;Ao final de cada LOOP, i++ jmp continua ;Ao final de cada LOOP, salto novamente para a funcao continua - ENQUANTO FIM ; } FIM:;} hlt ;usado para acabar com a execução (parar o processador) end
  19. Eu estou fazendo mineração de dados no Twitter, e precisava que o PHP roda-se e retorna-se os dados para o cliente que abri-se conexão com o PHP, ou seja, JS->PHP->Twitter e no retorno do Twitter temos Twitter->PHP->JS. Como estou pegando Tweets em tempo-real através de uma Stream aberta entre o PHP e Twitter, não posso garantir que pegar 10 Tweets de uma palavra chave vai demorar 3 segundo ou 5 minuto, se abrir e fechar conexão muitas vezes com o Twitter levo ban de 1 minuto, então precisava que o PHP roda-se sozinho apenas com um start do JS, ou seja, queria abrir uma unica conexão e deixar ela aberta com o PHP, e que o servidor me responde-se sempre que tivesse resposta, sem que o JS precisa-se ficar abrindo novas requisições e ao mesmo tempo que o JS fica-se livre para fazer outras tarefas dentro da página enquanto não obtive-se resposta do PHP. Por isso que queria rodar o PHP e JS ao mesmo, mas deu pra resolver de outro jeito, que não é exatamente o ideal, mas funciona ... segue o link do tutorial: http://rberaldo.com.br/server-push-long-polling-php-ios/
  20. Boa noite pessoal, precisava rodar PHP e javascript "ao mesmo tempo", preciso atualizar um gráfico feito em javascript sem parar de rodar o PHP em momento algum, simplifiquei o problema no código abaixo, se conseguir fazer o código abaixo rodar, eu consigo atingir o objetivo. Caso alguém saiba como realizar esse objetivo de outra maneira por favor me de um help ! <html> <head> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript">google.charts.load('current', {'packages':['corechart']}); </script> </head> <?php @ini_set("output_buffering", "Off"); @ini_set('implicit_flush', 1); @ini_set('zlib.output_compression', 0); @ini_set('max_execution_time',0); header( 'Content-type: text/html; charset=utf-8' ); echo "Contador: "; $i = 0; while (true) { // Enquanto esse looping não terminar nunca vou exibir o gráfico // depois que i = 5, o gráfico é mostrado, e esse é o problema, rodo uma coisa depois outra, e não as 2 ao mesmo tempo for (; $i < 5; $i++) { echo $i." -- "; if(sleep(1) != 0){ echo "sleep failed script terminating"; break; } flush(); ob_flush(); } printf(' <script type="text/javascript"> i = '.$i.' alert(i) // Engraçado que isso funciona ! quando i = 5 o alert é mostrado, mas o gráfico não é exibido ! var dashboardState = ""; options = "" function updateDraw() { chart = new google.visualization.PieChart(document.getElementById("piechart")); data = google.visualization.arrayToDataTable(dashboardState); chart.draw(data, options); } VariavelPHP = "LoL =D" options = {title: "Teste"}; dashboardState = eval("[[\'asd\', \'qwe\'],[\'VariavelPHP\', i],[\'Task2\', 25],[\'Task3\', 10],]"); google.charts.setOnLoadCallback(updateDraw); </script> '); $i = 0; } ?> <body> <div id="piechart" style="width: 900px; height: 500px;"></div> </body> </html> Se o While (true) for retirado e o "looping for" chegar em $i = 5, o gráfico é mostrado, "MAS", se o While (true) for mantido, então o gráfico nunca será mostrado ! Agradeço a paciência !
  21. Boa noite, tem várias coisas estranhas nesse código =P ... Entre elas esta: Tem mais coisa de errado, mas não vou por TUDO ! Veja, uma vez que você criou uma matriz, você não pode tratar ela como vetor, por exemplo "matriz[j]", uma posição da matriz é representada por 2 valores, matriz[linha][coluna], é claro que na memória as coisas não ficam bonitinhas assim, mas para abstrair o funcionamento da matriz é interessante pensar dessa forma.
  22. Boa noite, tenho a seguinte dúvida: Estou em uma rede de computadores, onde existe uma partição que é pública, ou seja, todos os computadores da rede visualização essa partição, e podem inserir ou ler coisas dessa partição ... Se eu instalar o MySQL nessa partição (pública), vou poder acessar a base MySQL por exemplo com uma aplicação JAVA (simplesmente indicando o caminho da partição no código) a partir de qualquer máquina dessa rede onde estou ? Será que não há nada que implique nessa ação ? OBS: Acredito que a única implicação seja o fato de que essa partição "publica" deve pertencer a uma máquina dessa rede que nunca desligue, para que o acesso ao banco sempre esteja livre. E não, infelizmente não posso deixar essa base hospedada em algum servidor remoto, seria o ideal, mas não posso. Estou perguntando aqui para não perder tempo tentando fazer algo que não seja possivel, deixem suas dicas e opiniões se possível ! Valeu

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!