Jump to content

Kleverson Cruz

Pessoal da TecnoSpeed
  • Contagem de Conteúdo

    68
  • Ingressou

  • Última visita

  • Dias Ganhos

    6

Tudo que foi postado por Kleverson Cruz

  1. Olá. A forma mais simples de gerar um link publico é hospedar o seu HTML em um servidor, há muitas alternativas gratuitas, mas minha favorita é o GitHub Pages.
  2. Oi pessoal, tudo bem? Recentemente, tive a oportunidade de participar do quadro "Papo de Desenvolvedor" no canal da Casa do Desenvolvedor no YouTube. Foi uma conversa introdutória sobre a linguagem de programação C#, e também exploramos se ainda é válido começar a estudar essa linguagem. 🤓 Durante o bate-papo, compartilhei minha perspectiva sobre o uso do C#, tanto na criação de interfaces quanto nos sistemas e projetos que estou desenvolvendo atualmente. Ficarei feliz se vocês quiserem conferir mais detalhes sobre nossa conversa: Estou à disposição para possíveis dúvidas que possam surgir!
  3. Opa Fernando, beleza? Vou tentar passar a minha visão sobre as suas dúvidas: Tem bastante conteúdo para criação e publicação de apps nas lojas de aplicativos. Com um pouco de experiência, uma boa ideia e MUITO tempo é possível criar uma aplicação e publica-la. O salário vai depender muito da experiência que você possui. Se você possui uma longa experiência com uma tecnologia poderá negociar salários maiores. Manter uma carreira dentro de uma empresa é o método mais consistente de possuir uma fonte de renda, mas nada impede que desenvolvedores atuem como freelancers em outros projetos . Geralmente grandes aplicações são desenvolvidas e mantidas por dezenas de pessoas, então dificilmente um único desenvolvedor conseguirá dar conta de tudo, ainda mais considerando que há muitas áreas diferentes, como front-end, back-end, sre, dba e etc .
  4. Opa, tudo bem? Utilizei o Azure Pipelines apenas com pipelines NodeJS, mas acredito que não seja muito diferente com Wordpress. Vamo lá: 1. Configure o repositório. Vá para o Azure DevOps. Selecione seu projeto ou crie um novo. 2. Configurar o arquivo azure-pipelines.yml No diretório raiz do seu projeto, crie um arquivo chamado "azure-pipelines.yml". Este arquivo vai ser preenchido com as instruções da sua pipeline. trigger: - master # Indica que a pipeline será disparada sempre que houver commit na branch master pool: vmImage: 'ubuntu-latest' steps: - task: NodeTool@0 inputs: versionSpec: '16.x' displayName: 'Install Node.js' - script: | npm install npm build displayName: 'Install and Build' # Esse é um exemplo básico de pipeline que utiliza NodeJS. # Modifique e adicione mais etapas conforme necessário, como build da aplicação, execução de teste, cópia de arquivos e etc. Na documentação do azure devops tem mais alguns modelos de yaml que podem ser úteis. 3: Commit e Push Com o repositório clonado localmente adicione o código do seu projeto WordPress e faça push para o Azure Repos. 4: Ative a Pipeline No Azure DevOps, vá para "Pipelines" no menu e clique em "New Pipeline" e escolha o repositório onde está o azure-pipelines.yml. Por fim clique em "Run" para executar a pipeline. A construção do arquivo yaml vai depender de como sua aplicação está construída e hospedada. Por exemplo, se os arquivos do site precisam disponíveis de forma estática num servidor web, você pode criar uma etapa na pipeline que faça uma conexão FTP com o servidor e copie todos os arquivos do Azure Repos. Espero ter ajudado de alguma forma 😉
  5. Olá. Dei uma olhada no JS que já tem e parece que está bem definido o funcionamento no tabuleiro 3X3. Para conseguir um 4X4 basta modificar os array 'winPatterns' com os padrões corretos de vitória no 4x4, aumentar o tamanho do array 'gameBoard' e por fim ajustar o HTML com os novos elementos. O código parece bem estruturado então deve conseguir incrementar a lógica sem muitos problemas.
  6. Olá As versões comerciais do Intellij possuem o período trial de 30 dias, porém tem disponível a versão community totalmente gratuita: https://www.jetbrains.com/idea/download/?section=windows
  7. Olá. O Google fornece uma API para pesquisas customizadas onde é possível obter imagens: https://developers.google.com/custom-search/v1/overview?hl=pt-br Em C# você pode consumir da seguinte forma: usign var client = new HttpClient(); var url = "https://customsearch.googleapis.com/customsearch/v1?cx=[IdMecanismoPesquisa]&key=[API_KEY]&searchType=image&q=Coca Cola&num=1"; var request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("Accept", "application/json"); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); A partir dessa requisição será obtido a resposta: ... "items": [ { "kind": "customsearch#result", "title": "Coca-Cola - Wikipedia", "htmlTitle": "<b>Coca</b>-<b>Cola</b> - Wikipedia", "link": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e8/15-09-26-RalfR-WLC-0098_-_Coca-Cola_glass_bottle_%28Germany%29.jpg/1200px-15-09-26-RalfR-WLC-0098_-_Coca-Cola_glass_bottle_%28Germany%29.jpg", "displayLink": "en.wikipedia.org", "snippet": "Coca-Cola - Wikipedia", "htmlSnippet": "<b>Coca</b>-<b>Cola</b> - Wikipedia", "mime": "image/jpeg", "fileFormat": "image/jpeg", "image": { "contextLink": "https://en.wikipedia.org/wiki/Coca-Cola", "height": 2128, "width": 1200, "byteSize": 283763, "thumbnailLink": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJyEDVQYqZINpelmoCLYQPCr6MQXd1m9-6goF80ivqcAhL-84dXFEQwYY&s", "thumbnailHeight": 150, "thumbnailWidth": 85 } } ] ... A documentação descreve os passos para obter o token de acesso e id do mecanismo de pesquisa programável. Importante notar que há uma limitação de uso gratuito de 100 consultas por dia. Uma outra alternativa é utilizar o pacote HtmlAgilityPack para realizar a extração das imagens a partir do HTML das páginas do Google, mas isso vai exigir um bom conhecimento em técnicas de webscraping.
  8. Olá O estilo parece estar definido corretamente, é possível que você não esteja aplicando ao elemento no HTML. Em index.html verifique se foi informado: <header class="banner">
  9. Olá Davi, tudo bom? O problema no seu código é o uso da função Array.of. Para resolver seu problema você pode chamar a Array.from diretamente: function getArrayWithLength(string) { return Array.from(string); } console.log(getArrayWithLength("Hello JS Arrays")); //Saida: //[ // 'H', 'e', 'l', 'l', // 'o', ' ', 'J', 'S', // ' ', 'A', 'r', 'r', // 'a', 'y', 's' //]
  10. Opa @porter, beleza? Ao executar JsonConvert.DeserializeObject, ele retornará um objeto genérico (object). Isso significa que você não terá um tipo específico para trabalhar e acessar os dados do JSON. Para conseguir acessar os valores você pode criar uma classe equivalente ao JSON e especificar o tipo de objeto para o qual deseja desserializar informando o argumento no método DeserializeObject: NotaFiscal notaFiscal = JsonConvert.DeserializeObject<NotaFiscal>(content); string idDaNota = notaFiscal.id; Outra opção é usar os tipos dynamic(não tão recomendado, pois não há verificação de tipo rs): dynamic jsonData = JsonConvert.DeserializeObject(content); string status_processamento = jsonData.retorno.status_processamento;
  11. Se a intenção é transformar a imagem retangular em um quadrado, você pode usar a propriedade overflow: hidden para esconder as partes excedentes da imagem e ajustar o tamanho da imagem usando CSS. <div class="quadrado"> <img src="sua-imagem.jpg" alt="Imagem Retangular"> </div> .quadrado { width: 200px; /* Largura desejada do quadrado */ height: 200px; /* Altura desejada do quadrado */ overflow: hidden; /* Para cortar as partes excedentes da imagem */ } .quadrado img { width: 100%; height: 100%; object-fit: cover; /* Ajusta a imagem para preencher o quadrado */ }
  12. Opa @robert, beleza? Consegue postar o trecho do código? Pela imagem não é possível identificar o problema.
  13. Opa @Killberly, beleza? Sim, você pode criar um contador dentro de uma função, porém você deve criar a variável fora do loop. function exemplo() { var contador = 0; for (var c = 1; c <= 10; c++) { contador = c; } return contador; } var resultado = exemplo(); console.log(resultado);
  14. Opa @jcvilanova, beleza? Não tenho experiência com PHP, mas posso ajudar com esse problema de forma mais conceitual rs. Em C# eu tenho o Razor Pages onde é possível criar uma página HTML e inserir informações compiladas. Por exemplo: <p>...@DateTime.Now nesta cidade de...</p> Então seria possível criar uma pagina HTML com o texto fixo, informações dinâmicas, exportar para PDF e realizar a impressão. Isso também pode ser feito usando apenas HTML e JS, mas acredito que você possa seguir um caminho parecido em PHP.
  15. Não tenho muita experiência com os serviços da hostinger, mas dando uma olhada na página de hospedagem compartilhada parece que só é possível hospedar sites. Pra manter uma aplicação aplicação em execução você precisa ter um servidor e para isso eles oferecem uma solução de VPC que pode resolver seu problema.
  16. Geralmente, as hospedagens gratuitas impõem um limite de tempo que uma aplicação pode ficar em execução. Uma alternativa que pode ser interessante é utilizar sua função em uma solução serverless, como AWS Lambda ou Azure Functions. Nesse tipo de serviço, é possível configurar para que sua aplicação seja executada a cada 30 segundos sem a necessidade de manter e custear um servidor 24 horas.
  17. Para obter apenas o valor da primeira propriedade do objeto JSON sem a chave, você pode acessá-lo diretamente pelo índice: document.write(passedArray[1][0]);
  18. O erro 404 indica que o endereço que está tentando acessar não existe no servidor. Em qual momento você está pegando o erro?
  19. Opa, tudo bem? Ao abrir HTML no navegador é possível utilizar as ferramentas de desenvolvimento(F12) para analisar erros. Quando tentei executar a função somar obtive o erro: "Uncaught ReferenceError: n2 is not defined" Ou seja, você não definiu a variável n2 antes de usa-la. var n1 = Number(tn1.value) var n1 = Number(tn2.value) //Atribuindo valor para n1, mas deveria ser n2 var s = n1 + n2 Atribuir valor corretamente na variável n2 deve deixar seu código funcional var n1 = Number(tn1.value) var n2 = Number(tn2.value) var s = n1 + n2
  20. Pode ser que haja algum erro na formatação dos números. Mas apenas analisando o código não consegui identificar um erro. O valor obtido em row["preco_pedido"] é um número valido? É possível que o DB esteja retornando um valor diferente do esperado.
  21. O principal erro em seu código está na função meu_callback onde será obtido os elementos que tenham exatamente os ids: rua, bairro, cidade, uf. Ou seja, sempre será utilizado os elementos definidos no HTML. Acredito que essa seja a melhor forma de fazer seu código funcional: Modifiquei o HTML e defini o id no grupo_endereco e adicionei o atributo "data-grupoid" no input cep. <!DOCTYPE html> <head> <title>Teste</title> <script src="script.js"></script> </head> <body> <div id="endereco"> <div class="grupo_endereco" id="campo1"> <button type="button" onclick="adicionarCampo()">+</button> <br><br> <input type="text" name="cep[]" id="cep" data-grupoid="campo1" maxlength="9" placeholder="CEP" onblur="pesquisacep(this);" onkeypress="$(this).mask('#####-###');"><br> <input type="text" name="rua[]" id="rua" placeholder="Rua"> <input type="text" name="numero[]" id="numero" placeholder="n"> <input type="text" name="complemento[]" id="complemento" placeholder="Complemento"> <input type="text" name="bairro[]" id="bairro" placeholder="Bairro"> <input type="text" name="cidade[]" id="cidade" placeholder="Cidade"> <input type="text" name="uf[]" id="uf" placeholder="UF"> </div> </div> </body> </html> Criei uma variável global para definir qual é o grupo de endereço que está sendo modificado. Essa variável será utilizada nas outras funções para manipular os elementos. Também adicionei o atributo data-grupoid e função onBlur nos elementos gerados dinamicamente. var controleCampo = 1 var grupoAtual function adicionarCampo() { controleCampo++ // console.log(controleCampo); document .getElementById('endereco') .insertAdjacentHTML( 'beforeend', '<br><div class="grupo_endereco" id="campo' + controleCampo + '"><button type="button" id="' + controleCampo + '" onclick="removerCampo(' + controleCampo + ')"> - </button><br><br><input type="text" name="cep[]" id="cep" data-grupoid="campo' + controleCampo + '" maxlength="9" placeholder="CEP" onblur="pesquisacep(this);"><br><input type="text" name="rua[]" id="rua" placeholder="Rua"><input type="text" name="numero[]" id="numero" placeholder="n"><input type="text" name="complemento[]" id="complemento" placeholder="Complemento"><input type="text" name="bairro[]" id="bairro" placeholder="Bairro"><input type="text" name="cidade[]" id="cidade" placeholder="Cidade"><input type="text" name="uf[]" id="uf" placeholder="UF"></div>' ) } function removerCampo(idCampo) { document.getElementById('campo' + idCampo).remove() } function limpa_formulario_cep() { grupoAtual.querySelector('#rua').value = '' grupoAtual.querySelector('#bairro').value = '' grupoAtual.querySelector('#cidade').value = '' grupoAtual.querySelector('#uf').value = '' } function meu_callback(conteudo) { if (!('erro' in conteudo)) { grupoAtual.querySelector('#rua').value = conteudo.logradouro; grupoAtual.querySelector('#bairro').value = conteudo.bairro grupoAtual.querySelector('#cidade').value = conteudo.localidade grupoAtual.querySelector('#uf').value = conteudo.uf } else { limpa_formulario_cep() alert('CEP não encontrado.') } } function pesquisacep(input) { // Obtém o ID definido no atributo data-grupoid. var grupoId = input.getAttribute('data-grupoid') // Define a variável global grupoAtual com o elemento do grupo. grupoAtual = document.getElementById(grupoId) var valor = input.value var cep = valor.replace(/\D/g, '') if (cep != '') { var validacep = /^[0-9]{8}$/ if (validacep.test(cep)) { grupoAtual.querySelector('#rua').value = '...' grupoAtual.querySelector('#bairro').value = '...' grupoAtual.querySelector('#cidade').value = '...' grupoAtual.querySelector('#uf').value = '...' var script = document.createElement('script') script.src = 'https://viacep.com.br/ws/'+ cep + '/json/?callback=meu_callback' document.body.appendChild(script) } else { limpa_formulario_cep() alert('Formato de CEP inválido.') } } else { limpa_formulario_cep() } } Não ficou muito bonito, mas está funcional hehe
  22. Você pode definir uma classe CSS para ser utilizada por múltiplos elementos da seguinte forma: h2, h3 { color: blueviolet; } Outra alternativa é criar um seletor para o estilo e decorar seus elementos H2 e H3 .titulo { color: red; }
  23. A lógica parece estar correta, talvez seja um erro nesse aplicativo. Em outro compilador também obtém false?
  24. Ambos são notebooks muito semelhantes, mas eu pessoalmente iria no Asus e se estiver dentro do orçamento vale a pela pegar a versão 16GB dele.
  25. Oi, pessoal! Tudo bem? Hoje gostaria de compartilhar com vocês um guia sobre como utilizar a API PlugNotas para emitir Notas Fiscais de Serviço Eletrônicas (NFS-e) de forma prática. Com um único JSON é possível emitir notas de forma simplificada, independentemente do padrão de webservice ou da cidade de prestação. Acesso à API: Antes de iniciar o processo, verifique se você possui a chave de API necessária para autenticar suas requisições. Para este guia, vamos utilizar o ambiente Sandbox da API PlugNotas, que oferece respostas fixas e permite testes sem a necessidade de informar um prestador devidamente credenciado. Endpoint utilizado será: https://api.sandbox.plugnotas.com.br/ Informe o token 2da392a6-79d2-4304-a8b7-959572c7e44d no cabeçalho x-api-key como autenticação para todas as suas requisições. Cabeçalho x-api-key preenchido com token de sandbox Caso esteja utilizando o ambiente de produção, o endpoint será: https://api.plugnotas.com.br/ Para obter o token de produção, siga os passos descritos na documentação: Obtendo o Token Certifique-se de ajustar o endpoint e o token de acordo com o ambiente que você está utilizando. Agora, vamos prosseguir com os passos para emitir uma NFS-e. Cadastrar certificado: O primeiro passo é cadastrar um certificado digital. Para isso, utilize a rota POST /certificado e inclua na requisição um form-data contendo o arquivo do certificado e a respectiva senha. A obrigatoriedade do certificado pode variar de acordo com cada prefeitura ou webservice. Caso queira verificar se uma cidade utiliza certificado, você pode utilizar a rota GET /nfse/cidades. O arquivo do certificado deve ser informado em corpo no formato form-data. Cadastrar prestador: Agora vamos realizar o cadastro do prestador enviando uma requisição POST para a rota /empresa. No corpo da requisição, além dos dados básicos da empresa, inclua o campo "nfse" com as configurações de número de RPS (Recibo Provisório de Serviços), ambiente de emissão e autenticação da prefeitura. Certifique-se também de incluir o campo "certificado" com o ID obtido no passo anterior, para vincular o certificado ao cadastro do prestador. { "cpfCnpj": "71073473000167", "inscricaoMunicipal": "8214100099", "simplesNacional": true, "regimeTributario": 1, "razaoSocial": "Tecnospeed S/A", "certificado": "64b58c5405f34cdce812efc1", "endereco": { "bairro": "Zona 01", "cep": "87020025", "codigoCidade": "4115200", "estado": "PR", "logradouro": "Duque de Caxias", "numero": "882", "tipoLogradouro": "Avenida", "codigoPais": "1058", "complemento": "17 andar", "descricaoCidade": "Maringá", "descricaoPais": "Brasil", "tipoBairro": "Zona" }, "nfse": { "ativo": true, "tipoContrato": 0, "config": { "producao": true, "rps": { "lote": 1, "numeracao": [ { "numero": 1, "serie": "RPS" } ] }, "prefeitura": { "login": "teste", "senha": "teste123" } } } } Emitir NFS-e Após o cadastro do prestador, você estará pronto para emitir uma NFS-e. Para isso, envie uma requisição POST para a rota /nfse, incluindo um JSON com as informações da nota de serviço. Vamos destacar algumas das propriedades obrigatórias que compõem esse JSON Prestador: Deve ser informado o CPF/CNPJ e outros dados relevantes do prestador de serviço, conforme necessário. Por padrão serão utilizados os dados do cadastro realizado previamente. Tomador: Nesse campo, devem ser fornecidos os dados do tomador do serviço, como CPF/CNPJ, razão social, endereço e e-mail. Serviço: Aqui, serão informados os detalhes do serviço prestado, como código, discriminação, valor a ser cobrado e impostos aplicáveis. Com os campos devidamente apresentados podemos montar o JSON: [ { "prestador": { "cpfCnpj": "82186217000100" }, "tomador": { "cpfCnpj": "99999999999999", "razaoSocial": "Empresa de Teste LTDA", "email": "teste@plugnotas.com.br", "endereco": { "descricaoCidade": "Maringa", "cep": "87020100", "tipoLogradouro": "Rua", "logradouro": "Barao do rio branco", "tipoBairro": "Centro", "codigoCidade": "4115200", "complemento": "sala 01", "estado": "PR", "numero": "1001", "bairro": "Centro" } }, "servico": [ { "codigo": "14.10", "codigoTributacao": "14.10", "discriminacao": "Descrição dos serviços prestados", "cnae": "7490104", "iss": { "tipoTributacao": 7, "exigibilidade": 1, "aliquota": 3 }, "valor": { "servico": 1 } } ] } ] A emissão da NFS-e é um processo assíncrono. Você receberá um protocolo e um ID que serão utilizados para consultar a situação da nota posteriormente. Se não houver erros de validação em sua requisição, você receberá a seguinte resposta: { "documents": [ { "id": "64b5445a47188375a92f6414" } ], "message": "Nota(as) em processamento", "protocol": "22535d12-b458-4b12-b5d2-37c46f1f01ae" } Consultar NFS-e Após a emissão é necessário enviar uma requisição GET para /nfse/consultar/{idouprotocolo} a fim de verificar a situação da nota emitida. Essa consulta permitirá obter informações sobre o status atual da NFS-e. Durante o processo de consulta, você pode encontrar os seguintes status: PROCESSANDO: Indica que a nota está em processamento. Nesse caso, é necessário realizar consultas subsequentes até obter a situação final da nota. REJEITADO: Caso ocorra algum erro durante a emissão da nota, você receberá esse status juntamente com o motivo da rejeição. Analise a mensagem de erro, ajuste os dados do JSON de envio e tente a emissão novamente. CONCLUÍDO: Indica que a NFS-e foi devidamente autorizada. No ambiente Sandbox, todas as emissões resultarão em sucesso. Ao consultar uma nota concluída, você receberá os seguintes dados: [ { "id": "64b5445a47188375a92f6414", "emissao": "17/07/2023", "situacao": "CONCLUIDO", "prestador": "82186217000100", "tomador": "99999999999999", "valorServico": 1, "numeroNfse": "22143", "serie": "LAL", "lote": 290008, "numero": 7, "codigoVerificacao": "5278FE6A7", "autorizacao": "17/07/2023", "mensagem": "RPS Autorizada com sucesso", "pdf": "https://api.sandbox.plugnotas.com.br/nfse/pdf/64b5445a47188375a92f6414", "xml": "https://api.sandbox.plugnotas.com.br/nfse/xml/64b5445a47188375a92f6414" } ] Exportar NFS-e Após consultar a NFS-e e obter a situação "CONCLUÍDO", você pode exportar a nota nos formatos PDF ou XML. Para isso, basta realizar as seguintes operações: Para exportar o PDF da nota, faça uma requisição GET para /nfse/pdf/{idNota}. Isso permitirá que você obtenha o arquivo PDF contendo os dados da NFS-e. Para exportar o XML da nota, faça uma requisição GET para /nfse/xml/{idNota}. Isso permitirá que você obtenha o arquivo XML gerado pela prefeitura. PDF obtido ao exportar. E assim concluímos o guia de utilização da API PlugNotas para emissão de NFS-e. Espero que este guia tenha sido útil e fornecido todas as informações necessárias para você começar a utilizar a API em seus projetos. Caso queira explorar mais detalhes, exemplos e informações adicionais, recomendo que consulte a documentação completa, disponível no seguinte link: Documentação API PlugNotas
×
×
  • Create New...