Ir para conteúdo
Propaganda

Gristony

Suporte
  • Total de Posts

    21
  • Registro em

  • Última visita

  • Dias Ganhos

    3

Other groups

Gristony ganhou no último dia 31 de Julho 2024

Gristony teve o conteúdo mais curtida!

Sobre Gristony

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

Gristony's Achievements

Enthusiast

Enthusiast (6/14)

  • One Year In
  • Dedicated
  • Collaborator Rara
  • Very Popular Rara
  • One Month Later

Emblemas Recentes

230

Reputação

  1. Seu cliente deve ter alterações, provavelmente a src que você compilou não é a original do seu cliente.
  2. Solução Kondrah Alpha Multi Proxy Este guia foi escrito por @Michael Orsino, com agradecimentos e crédito a @Alpha - atribuição total no final. Nível de dificuldade: Difícil – Este guia pressupõe conhecimento de Linux, firewalls, C++ e Lua. Tempo de leitura: Aprox. 10 minutos Devido ao aumento da frequência de ataques DDoS com resgate contra nossa comunidade nos últimos meses, decidi escrever este guia na esperança de que ele ajude você a proteger seu jogo e fornecer a melhor experiência aos seus jogadores. O que é isto? Este guia explica como implementar o sistema proxy escrito pelo @Kondrah para OTClientv8. (Observação: o recurso do lado do cliente também foi portado e lançado para OTClient Redemption por @Gesior.pl). Este guia pode ser usado para resgate OTCv8 e OTC. O guia faz referência a um repositório externo que contém o aplicativo proxy de back-end criado pelo @Kondrah, com importantes correções de bugs do Alpha que abordam alguns problemas importantes que estavam presentes no software original. Se você atualmente executa a versão e configuração desta solução instalada por @Gesior.pl, desde que entenda o que ele fez, este guia pode ser usado para simplificar sua infraestrutura. De agora em diante, estarei me referindo a este sistema como Alpha Proxy. O que isso faz? O uso desse sistema proxy permite que o cliente do jogo estabeleça e mantenha conexões com vários servidores proxy de encaminhamento simultaneamente e envie e receba pacotes de jogos nos dois melhores. Com a configuração completa descrita neste guia, o servidor de jogo de back-end permanece desconhecido do público e, portanto, não pode ser atacado diretamente. Além disso, os jogadores se beneficiam da redundância de rotas ao serem conectados a vários servidores proxy de encaminhamento, reduzindo o risco de atrasos e desconexões. Em muitos casos, os jogadores também se beneficiarão do roteamento otimizado para latência para o servidor do jogo, graças ao uso de locais e provedores estratégicos de proxy avançado. Pré-requisitos Um servidor de jogos rodando no Linux (Este guia assumirá TFS1.4 e Ubuntu 24.04) Um mínimo de dois outros servidores Linux para atuar como proxies de encaminhamento (tecnicamente, você poderia usar o Windows para isso, mas ... não) Um IP desconhecido/secreto para o seu back-end (a máquina do servidor do jogo) Seu servidor web deve ser proxy (por exemplo, pela cloudflare) e/ou em uma máquina separada (para que seu IP de back-end permaneça oculto o tempo todo) Portas necessárias abertas nos firewalls de todos os servidores. Você pode usar o que quiser, mas para este guia usaremos o seguinte: Servidor de jogo de back-end (IP secreto): 7100 TCP (ouvinte HAProxy para login) 7200 TCP (ouvinte HAProxy para status) 7300 TCP (ouvinte de proxy alfa) Para uma camada extra (provavelmente desnecessária) de segurança, restrinja as portas acima para permitir apenas cada um dos endereços IP do proxy de encaminhamento Servidores proxy de encaminhamento: 7100 TCP (ouvinte HAProxy para login) 7200 TCP (ouvinte HAProxy para status) 7300 TCP (ouvinte HAProxy para jogo) Nota: Se o seu servidor já estiver ativo e/ou seu IP já for público, você tem duas opções: Prepare-se para migrar para um novo servidor com um novo IP (fácil, sem necessidade de novos conhecimentos), ou; Compre um endereço IP secundário para o seu servidor, se disponível (também é fácil, mas exigirá algum conhecimento novo para configurar sua máquina para usar os dois endereços IP. Seu provedor pode fornecer um guia ou usar o chatGPT para obter instruções). Se você seguir esse caminho, configurará o sistema proxy apenas para o novo endereço IP e, uma vez pronto, para habilitá-lo, desativará (negará todos os ipv4 ativados) o firewall de borda de rede de endereço IP original. Quantos, com quem, quanto e onde Para que valha a pena implementar essa configuração, você precisa de pelo menos 2 servidores proxy de encaminhamento, no entanto, a recomendação típica é de pelo menos 5. Embora tecnicamente a configuração possa ser executada com apenas 1, se você puder pagar apenas 1, existe um método muito mais fácil do que este, confira este tópico: Solução de túnel de proxy | Com passagem de IP do cliente Para manter as coisas simples, recomendo que você fique com grandes provedores de hospedagem que oferecem hospedagem VPS muito acessível, como OVH e Hetzner. Para aqueles um pouco mais avançados, você também pode considerar AWS, GCP, etc. Se você quiser levar as coisas ainda mais longe, sinta-se à vontade para me enviar uma mensagem. Você não precisa gastar muito nesses servidores proxy avançados. Eles não usarão muita energia ou largura de banda, então normalmente você deseja obter o VPS mais barato que a empresa oferece. Isso pode parecer algo como 1vCore + 1 GB de RAM por US$ 5/m. Para aproveitar ao máximo essa configuração, você deve distribuir geograficamente seus servidores proxy avançados com referência à sua base de jogadores. Mais importante, porém, você vai querer pelo menos 1 servidor proxy de encaminhamento o mais próximo possível do seu servidor de jogo de back-end. Minhas recomendações rápidas para locais de proxy de encaminhamento seriam: Vint Hill, EUA (OVH) e/ou Beauharnois, CA (OVH) Londres, Reino Unido (OVH) Varsóvia, PL (OVH) Falkenstein, DE (Hetzner) e/ou Nuremberg, DE (Hetzner) Miami, EUA (Gcore) Vamos começar! 1. Alterações de origem do TFS Existem muitas alterações de origem para direcionar cada edição individual nesta postagem, então, em vez disso, criei um arquivo de patch para o TFS1.4 (anexado). As alterações não são particularmente complicadas, se você usar uma versão diferente do TFS (ou OTX, TVP, etc.), ainda poderá acompanhar e fazer essas alterações manualmente. Com as alterações de origem compiladas com sucesso, você pode atualizar seu config.lua da seguinte maneira: LUA: ip = "127.0.0.1" -- important, do not change statusIP = "123.456.78.9" -- set this to your closest forward proxy server IP bindOnlyGlobalAddress = true -- important, do not change loginProtocolPort = 7171 gameProtocolPort = 7172 statusProtocolPort = 7171 2. Configuração do cliente Supondo que você ainda não tenha massacrado seu módulo para forçar diferentes IPs e portas, não há muito que você precise fazer para preparar o cliente. Os jogadores se conectarão ao servidor de login normalmente e o servidor de login passará todas as informações necessárias para o cliente. É possível 'codificar' os IPs do proxy de encaminhamento no cliente, e é isso que muitos optam por fazer porque é 'mais fácil', no entanto, essa não era a configuração pretendida e não é tão flexível quanto enviar a lista de proxy durante o login (que é o que faremos, supondo que você tenha seguido as alterações do TFS na seção 1). 3. Configuração de proxy de encaminhamento Como o nome sugere, essa configuração é para cada um de seus servidores proxy de encaminhamento. $ $ $ $ $ $ Importante : substitua pelo seu IP de back-end real! Dica: Pressionar -> enquanto estiver no vim o levará ao topo do arquivo e, em seguida, excluirá tudo no arquivo, permitindo que você cole imediatamente (normalmente no modo 'i'nput). Se a pasta estiver recuando automaticamente, pressione -> -> e tente novamente.client_entergamesudo apt updatesudo apt-get updatesudo apt upgradesudo apt install haproxysudo vim /etc/haproxy/haproxy.cfgBACKENDIPggwgright-clickesc:set: paste Código: global chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults timeout connect 4s timeout client 50s timeout server 50s # login connections listen l1 bind 0.0.0.0:7100 mode tcp server srv1 BACKENDIP:7100 send-proxy-v2 # game connections listen l2 bind 0.0.0.0:7200 mode tcp server srv2 BACKENDIP:7200 send-proxy-v2 # status connections listen l3 bind 0.0.0.0:7300 mode tcp server srv3 BACK ENDIP:7300 send-proxy-v2 $ sudo systemctl restart haproxy 4. Configuração de proxy reverso Você também configurará uma instância do HAProxy em seu servidor de back-end para ouvir e lidar com conexões de servidor de login + status. $ sudo apt install haproxy $ sudo vim /etc/haproxy/haproxy.cfg Código: global chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults timeout connect 4s timeout client 50s timeout server 50s # login connections listen l1 bind 0.0.0.0:7100 accept-proxy mode tcp server srv1 127.0.0.1:7171 send-proxy-v2 # status connections listen l2 bind 0.0.0.0:7300 accept-proxy mode tcp server srv1 127.0.0.1:7171 send-proxy-v2 $ sudo systemctl restart haproxy 5. Alpha Proxy Este é o aplicativo que irá ouvir e lidar com cada uma das conexões de jogo proxy proxy por seus servidores proxy avançados, é onde a maior parte da mágica acontece. Compile o aplicativo proxy: $ $ $ $ Crie um arquivo de serviço para garantir que o Alpha Proxy esteja sempre em execução. Certifique-se de atualizar o seguinte:git clone [email protected]:thatmichaelguy/alpha-proxy.gitmkdir build && cd buildcmake ..makesystemd ExecStart caminho para corresponder ao do seu binário Alpha Proxy compilado WorkingDirectory caminho para corresponder ao diretório binário do Alpha Proxy User & Group campos, se necessário O primeiro parâmetro do binário é a porta de escutaExecStart O segundo parâmetro do binário é o máximo de conexões por IP (4 proxies = 4 conexões por IP por cliente aberto)ExecStart $ sudo vim /usr/lib/systemd/system/alpha-proxy.service Código: [Unit] Description=Alpha Proxy After=network.target Wants=network-online.target [Service] Type=simple ExecStart=/path/to/the/proxy/build/alpha-proxy 7200 20 WorkingDirectory=/path/to/the/proxy/build/ Restart=always User=ubuntu Group=ubuntu LimitCORE=104857600 LimitNOFILE=50000 [Install] WantedBy=default.target $ sudo systemctl daemon-reload $ sudo systemctl start alpha-proxy $ sudo systemctl enable alpha-proxy 6. Banco de dados A etapa final é criar uma tabela em seu banco de dados para seus servidores proxy - é aqui que o servidor de login lerá. Ajuste a consulta abaixo para corresponder aos endereços IP de seus servidores proxy de encaminhamento. - A coluna pode ser utilizada para desativar temporariamente um proxy, se desejado. - A coluna pode ser usada para ajustar como o cliente escolherá servidores proxy, você pode querer usá-la se houver limitações de largura de banda em alguns de seus servidores proxy de encaminhamentoINSERTdisabledpriority SQL: CREATE TABLE `proxies` ( `id` int(11) NOT NULL, `host` tinytext NOT NULL, `port` smallint(5) UNSIGNED NOT NULL DEFAULT 0, `priority` smallint(5) UNSIGNED NOT NULL DEFAULT 0, `disabled` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 ); ALTER TABLE `proxies` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT ADD PRIMARY KEY (`id`) USING BTREE, ADD KEY `disabled` (`disabled`) USING BTREE; INSERT INTO `proxies` (`id`, `host`, `port`, `priority`, `disabled`) VALUES (1, '123.456.78.9', 7200, 0, 0), (2, '123.456.78.8', 7200, 0, 0), (3, '123.456.78.7', 7200, 0, 0), (4, '123.456.78.6', 7200, 0, 0), (5, '123.456.78.5', 7200, 0, 0); Conformidade com o Otservlist O Otservlist tem exigido que servidores populares forneçam informações adicionais para ajudar a manter a integridade das contagens de jogadores exibidas na lista de servidores. Isso não é realmente uma preocupação com a privacidade, pois nenhum dado pessoal está associado ao . Este não é o tópico para discutir como você se sente sobre isso de qualquer maneira, é apenas onde você aprende a cumpri-lo. O Otservlist solicita uma saída do comando para ajudar a verificar se a quantidade de jogadores que você relata como online é congruente com a quantidade de conexões ativas e se você está respeitando o limite de 4 jogadores relatados como online por endereço IP. Ao usar vários servidores proxy nessa configuração, você precisa fornecer a saída solicitada de cada servidor proxy, bem como do servidor de jogo de back-end. Eu escrevi um script simples que você pode executar em um intervalo com cron para buscar cada saída do comando e despejá-la em um diretório especificado em seu servidor web. O script também edita seu IP de back-end do . Opcionalmente, você pode restringir o acesso a este diretório por IP ou por senha para que apenas otservlist possa acessá-lo - o chatGPT provavelmente pode ajudá-lo a conseguir isso.lsoflsoflsoflsoflsof Para gerar a saída lsof.log em um intervalo em seus servidores proxy de encaminhamento, configure um cronjob como o seguinte: * * * * * sudo lsof -nP -i :7300 > /tmp/lsof.log && md5sum /tmp/lsof.log > /tmp/lsof.md5 Para gerar a saída lsof.log em um intervalo no servidor de back-end, configure um cronjob como o seguinte (observe que esse comando edita o IP do back-end, desde que você o atualize conforme necessário): * * * * * sudo lsof -nP -i :7300 | sed 's/123.456.78.9/BACKEND_IP/g' > /tmp/lsof.log && md5sum /tmp/lsof.log > /tmp/lsof.md5 Para puxar todos os arquivos para o seu servidor web, você pode usar um script como abaixo Observe que se você escolheu diferentes portas de escuta de proxy de encaminhamento ou proxy alfa, não se esqueça de atualizar essas portas nos cronjobs acima para que a saída lsof esteja correta: Bash: #!/bin/bash PASSWORD="password123" # to simplify things, we are using the same password for each forward proxy server. If you use SSH keys, you could modify this script to not require the sshpass utility # Array of remote file (lsof.log) and local destination directory pairs # Format: "user@host:/remote/path/to/file /local/path/to/destination" FILES_TO_RETRIEVE=( "[email protected]:/tmp/lsof.log /var/www/lsof.comain.com/lsof-ovh01.log" "[email protected]:/tmp/lsof.md5 /var/www/lsof.comain.com/lsof-ovh01.md5" ) for entry in "${FILES_TO_RETRIEVE[@]}"; do REMOTE_FILE=$(echo "$entry" | awk '{print $1}') LOCAL_PATH=$(echo "$entry" | awk '{print $2}') sshpass -p "$PASSWORD" scp "$REMOTE_FILE" "$LOCAL_PATH" if [[ $? -ne 0 ]]; then echo "Failed to retrieve $REMOTE_FILE" else echo "Successfully retrieved $REMOTE_FILE" fi done Site Se o seu site depende do protocolo de status para status e/ou contagem online, você precisará atualizar o IP/PORTA que ele está usando para se adequar à sua nova configuração (observe que alguns sites extraem isso diretamente de um config.lua) Créditos @Kondrah: Desenvolvedor do aplicativo proxy de back-end, do recurso de proxy otclient e das alterações necessárias do TFS para reunir tudo @Alpha: Correções de bugs no aplicativo proxy de back-end e me ensinaram como implementar o sistema (da maneira certa) @ Gesior.pl: Portando o recurso de proxy do cliente para OTClient Redemption (e colocando em seus próprios esforços para ajudar as pessoas a implementar este sistema) @Michael Orsino: Escrevendo este guia Doações Se você achou este guia útil e se sente inclinado, pode direcionar quaisquer doações para Michael Orsino e/ou Alpha Footnotes Aparentemente, este sistema de proxy também pode ser usado com clientes reais do Tibia, no entanto, não estou familiarizado com isso. Ref: feat: sistema proxy OTCv8 por @ Gesior.pl · Solicitação de pull #978 · mehah/otclient ([Hidden Content]) Há uma solicitação de pull de rascunho para implementar as alterações do servidor de jogos no TFS. Eu não o revisei, e as alterações que instruo aqui podem diferir desse PR. Ref: proxy OTCv8 + HAProxy por @ Gesior.pl · Solicitação de pull #4860 · otland/servidor esquecido ([Hidden Content]) proxy1.4.patch
      • 29
      • Like
      • Thanks
      • Confused
  3. AULA ANTERIOR Palavras-chave em Lua 1. function A palavra-chave function é usada para definir uma função em Lua. Com ela, você cria um bloco de código que pode ser executado quando chamado. Exemplo: function saudacao(nome) print("Olá, " .. nome) end saudacao("João") -- Imprime "Olá, João" Uso: Define uma função chamada saudacao que recebe o parâmetro nome e imprime uma saudação. 2. end A palavra-chave end é usada para finalizar o bloco de código de uma estrutura, como funções, condições (if), laços (for, while) e outras construções em Lua. Exemplo: if true then print("Isso é verdadeiro!") end Uso: O end fecha o bloco if, indicando o final da estrutura condicional. 3. if, else, elseif Essas palavras-chave são usadas para criar estruturas de controle condicional em Lua. Elas permitem que você execute diferentes blocos de código dependendo de condições. if: Testa uma condição. elseif: Usado para testar condições adicionais quando a condição do if falha. else: Define um bloco de código que será executado caso todas as condições anteriores falhem. Exemplo: local numero = 10 if numero > 20 then print("Maior que 20") elseif numero == 10 then print("É igual a 10") else print("Menor que 10") end Uso: Testa a condição do if, e se não for verdadeira, testa o elseif. Se nenhuma das condições for verdadeira, executa o else. 4. while A palavra-chave while é usada para criar um laço de repetição que continua executando enquanto a condição for verdadeira. Exemplo: local contador = 1 while contador <= 5 do print(contador) contador = contador + 1 end Uso: O laço vai continuar enquanto a variável contador for menor ou igual a 5. 5. for A palavra-chave for é usada para criar um laço de repetição. Lua oferece duas formas de laço for: numérico e genérico. for numérico: Usado para repetição com um intervalo de números. Exemplo de laço for numérico: for i = 1, 5 do print(i) end Uso: O laço vai de 1 a 5, imprimindo os números. for genérico: Usado quando você precisa iterar sobre uma tabela ou lista. Exemplo de laço for genérico: local lista = {10, 20, 30} for index, valor in ipairs(lista) do print(index, valor) end Uso: Itera sobre os elementos de uma tabela (lista), retornando o índice e o valor de cada elemento. 6. repeat A palavra-chave repeat é usada para criar um laço que continua a execução até que a condição seja verdadeira. É similar ao while, mas a verificação da condição acontece depois da execução do bloco. Exemplo: local contador = 1 repeat print(contador) contador = contador + 1 until contador > 5 Uso: O laço repeat executa pelo menos uma vez, e depois repete até a condição contador > 5 ser verdadeira. 7. break A palavra-chave break é usada para interromper um laço ou uma estrutura de repetição (como for, while, ou repeat). Exemplo: for i = 1, 10 do if i == 5 then break end print(i) end Uso: O laço será interrompido quando i for igual a 5. 8. continue A palavra-chave continue é usada para pular a iteração atual de um laço e passar para a próxima. Exemplo: for i = 1, 5 do if i == 3 then continue end print(i) end Uso: Quando i for igual a 3, a execução da iteração será pulada, e o próximo número será impresso. 9. local A palavra-chave local é usada para declarar variáveis locais dentro de um bloco de código. Uma variável local só pode ser acessada dentro do bloco onde foi definida. Exemplo: local numero = 10 print(numero) -- 10 Uso: A variável numero é local ao escopo em que foi declarada. 10. return A palavra-chave return é usada para retornar valores de uma função. Quando a execução de uma função atinge um return, ela é encerrada e o valor é enviado de volta para quem chamou a função. Exemplo: function somar(a, b) return a + b end local resultado = somar(5, 7) print(resultado) -- Imprime 12 Uso: A função somar retorna a soma de a e b, e o valor é capturado na variável resultado. 11. and e or As palavras-chave and e or são operadores lógicos em Lua, usados para fazer comparações entre expressões. and: Retorna verdadeiro se ambas as condições forem verdadeiras. or: Retorna verdadeiro se pelo menos uma das condições for verdadeira. Exemplo: local x = 10 local y = 20 if x < 15 and y > 10 then print("Ambas as condições são verdadeiras") end if x < 15 or y < 10 then print("Pelo menos uma condição é verdadeira") end Uso: and exige que ambas as condições sejam verdadeiras, e or retorna verdadeiro se pelo menos uma condição for verdadeira. 12. nil A palavra-chave nil é usada para indicar a ausência de valor ou para remover valores de variáveis. Exemplo: local variavel = nil print(variavel) -- Imprime nil Uso: Define que a variável não tem valor ou foi desfeita. 13. not A palavra-chave not é usada para inverter o valor lógico de uma expressão. Ou seja, se a expressão for true, o not a transforma em false e vice-versa. Exemplo: local ativo = false if not ativo then print("Não está ativo!") end Uso: Inverte o valor de ativo (de false para true). Resumo Essas são as principais palavras-chave que você vai usar no Lua para controlar o fluxo do seu código, criar funções e declarar variáveis. Cada uma tem seu papel e pode ser usada em diferentes contextos para atingir o comportamento desejado no seu programa. PROXIMA AULA
  4. AULA ANTERIOR Funções em Lua Em Lua, funções são blocos de código que realizam uma tarefa específica e podem ser reutilizadas em diferentes partes do código. Funções permitem que você evite repetir o mesmo conjunto de instruções várias vezes e ajudam a tornar o código mais organizado e legível. Estrutura de uma Função Uma função em Lua pode ser definida de duas formas: Função nomeada: Quando você define uma função com um nome explícito, usando a palavra-chave function. Função anônima: Quando você cria uma função sem nome e a armazena em uma variável. Vamos explicar ambos os casos. 1. Função Nomeada Uma função nomeada é declarada com a palavra-chave function, seguida pelo nome da função, e depois a lista de parâmetros entre parênteses (caso a função precise de parâmetros). Após o corpo da função, utilizamos a palavra-chave end para indicar o fim da função. Exemplo: -- Função que soma dois números function somar(x, y) return x + y end -- Chamando a função local resultado = somar(3, 4) print(resultado) -- Imprime 7 Explicação: function somar(x, y): Define a função chamada somar, que recebe dois parâmetros: x e y. return x + y: A função retorna a soma de x e y. somar(3, 4): Aqui chamamos a função somar, passando 3 e 4 como argumentos. O retorno da função é armazenado na variável resultado, que é então impresso. 2. Função Anônima (Sem Nome) Uma função anônima não tem um nome explícito e pode ser armazenada em uma variável. Esse tipo de função é útil quando você deseja criar uma função para usar apenas uma vez ou quando precisa passar uma função como argumento para outra função. Exemplo: -- Função anônima atribuída a uma variável local soma = function(x, y) return x + y end -- Chamando a função local resultado = soma(3, 4) print(resultado) -- Imprime 7 Explicação: local soma = function(x, y): Cria uma função anônima que soma dois números, e a armazena na variável soma. soma(3, 4): Chama a função usando a variável soma, passando 3 e 4 como argumentos. Funções e Parâmetros Funções em Lua podem receber parâmetros (também chamados de argumentos) que são valores passados para a função quando ela é chamada. Esses parâmetros permitem que a função trabalhe com valores dinâmicos, variando conforme a entrada. Exemplo com múltiplos parâmetros: -- Função para calcular a área de um retângulo function calcularAreaComprimentoLargura(comprimento, largura) return comprimento * largura end -- Chamando a função com 2 argumentos local area = calcularAreaComprimentoLargura(5, 3) print(area) -- Imprime 15 Explicação: comprimento e largura são os parâmetros da função. calcularAreaComprimentoLargura(5, 3) passa os valores 5 e 3 como argumentos para a função. Funções e Retorno de Valores As funções em Lua podem retornar um ou mais valores. O valor retornado pode ser capturado pela chamada da função e usado em outras partes do código. Exemplo com múltiplos valores retornados: -- Função que retorna dois valores function calcularSomaEDiferença(x, y) local soma = x + y local diferença = x - y return soma, diferença -- Retorna dois valores end local resultadoSoma, resultadoDiferenca = calcularSomaEDiferença(7, 3) print("Soma:", resultadoSoma) -- Imprime "Soma: 10" print("Diferença:", resultadoDiferenca) -- Imprime "Diferença: 4" Explicação: return soma, diferença: A função retorna dois valores — a soma e a diferença de x e y. local resultadoSoma, resultadoDiferenca =: Ao chamar a função, os dois valores retornados são armazenados em duas variáveis (resultadoSoma e resultadoDiferenca). Funções Como Parâmetros Em Lua, você pode passar funções como parâmetros para outras funções. Isso é muito útil para implementar comportamentos personalizados. Exemplo: -- Função que recebe outra função como parâmetro function aplicarOperacao(funcao, x, y) return funcao(x, y) end -- Função de soma local soma = function(a, b) return a + b end -- Usando a função 'aplicarOperacao' e passando a função 'soma' como parâmetro local resultado = aplicarOperacao(soma, 3, 4) print(resultado) -- Imprime 7 Explicação: aplicarOperacao(funcao, x, y): Recebe uma função e dois valores x e y. soma: A função soma é passada como um parâmetro para a função aplicarOperacao. Funções Recursivas Uma função pode chamar a si mesma, o que é chamado de recursão. Funções recursivas são úteis para resolver problemas que podem ser divididos em subproblemas menores (por exemplo, cálculo de fatorial ou busca em árvores). Exemplo de função recursiva (fatorial): -- Função recursiva para calcular fatorial function fatorial(n) if n == 0 then return 1 else return n * fatorial(n - 1) -- Chama a função novamente com n - 1 end end print(fatorial(5)) -- Imprime 120 Explicação: fatorial(n): A função chama a si mesma com o valor n - 1 até atingir o caso base (n == 0), quando o fatorial de 0 é definido como 1. fatorial(5): Chama a função recursivamente até o cálculo do fatorial de 5. Resumo Funções são blocos de código que podem ser reutilizados e podem retornar valores. Em Lua, você pode definir funções nomeadas ou anônimas. Funções podem receber parâmetros e retornar valores (inclusive múltiplos valores). Funções podem ser passadas como parâmetros para outras funções. Funções recursivas são funções que se chamam para resolver problemas de forma repetitiva. Com essas explicações, agora você tem uma visão completa sobre como funcionam as funções em Lua e como utilizá-las de maneira eficaz no seu código! PROXIMA AULA
  5. AULA ANTERIOR O que é uma Variável? Uma variável é um espaço na memória do computador onde podemos armazenar um valor. Esse valor pode mudar ao longo da execução do programa, por isso o nome "variável". Em programação, utilizamos variáveis para armazenar dados temporários que serão manipulados pelo código. Cada variável tem um nome (identificador) e um tipo de dado associado, como número, texto (string), etc. Por exemplo: local nome = "João" -- Aqui, 'nome' é a variável que armazena o valor "João" local idade = 25 -- 'idade' é a variável que armazena o número 25 Em Lua, as variáveis podem ser classificadas em globais e locais (ou não globais). A principal diferença entre elas está no escopo de onde elas podem ser acessadas e modificadas. 1. Variáveis Globais As variáveis globais podem ser acessadas e modificadas de qualquer lugar do código, ou seja, elas têm um escopo global. Quando você cria uma variável global, ela é visível em qualquer função ou parte do programa, desde que não tenha sido sobrescrita por uma variável local com o mesmo nome. Em Lua, todas as variáveis são globais por padrão se você não usar a palavra-chave local. Exemplo de variável global: nome = "João" -- Variável global function saudacao() print("Olá, " .. nome) -- Acessando a variável global end saudacao() -- Imprime "Olá, João" Características das variáveis globais: São acessíveis de qualquer lugar no código. Podem ser modificadas em qualquer parte do programa. Se você não tomar cuidado, elas podem ser sobrescritas ou usadas sem querer, o que pode gerar erros no código. 2. Variáveis Locais (Não Globais) As variáveis locais têm um escopo restrito ao bloco de código em que são definidas, como dentro de uma função, um laço ou um if. Elas só podem ser acessadas dentro desse bloco e não interferem nas variáveis globais de mesmo nome. Para declarar uma variável como local, você deve usar a palavra-chave local. Exemplo de variável local: function saudacao() local nome = "Maria" -- Variável local print("Olá, " .. nome) -- Acessando a variável local end saudacao() -- Imprime "Olá, Maria" print(nome) -- Erro: nome é uma variável local e não existe fora da função Características das variáveis locais: São acessíveis apenas dentro do bloco de código em que são definidas (como dentro de funções, laços, etc.). Não podem ser acessadas ou modificadas fora do seu escopo. São úteis para evitar conflitos e garantir que variáveis não interfiram entre diferentes partes do código. Por que usar variáveis locais? Usar variáveis locais é uma boa prática de programação, pois: Evita conflitos: Como variáveis globais podem ser sobrescritas acidentalmente, o uso de variáveis locais ajuda a manter o código mais seguro e organizado. Melhora a performance: Lua acessa variáveis locais mais rapidamente do que globais, porque a busca por variáveis locais é mais eficiente. Tipos de Variáveis em Lua Em Lua, as variáveis podem armazenar vários tipos de dados. Lua é uma linguagem dinâmica e não exige que você defina o tipo de variável explicitamente. O tipo de uma variável é determinado pelo valor que ela armazena. Aqui estão os principais tipos de variáveis em Lua: 1. Números Lua tem um único tipo numérico chamado number, que pode ser um número inteiro ou de ponto flutuante. Exemplo: local idade = 25 -- Inteiro local altura = 1.75 -- Ponto flutuante 2. Strings As strings são usadas para representar texto. Podem ser declaradas com aspas simples ou duplas. Exemplo: local nome = "João" -- String local saudacao = 'Olá, Mundo!' -- Outra forma de string 3. Booleanos O tipo boolean tem apenas dois valores: true (verdadeiro) e false (falso). Exemplo: local ativo = true local usuarioValido = false 4. Tabelas As tabelas (ou tables) são o tipo de dados mais versátil em Lua. Elas podem ser usadas para representar arrays, dicionários, objetos e muito mais. Exemplo: local pessoa = { nome = "Maria", idade = 30, altura = 1.65 } print(pessoa.nome) -- Imprime "Maria" 5. Funções Funções são um tipo de variável em Lua. Elas podem ser armazenadas em variáveis e passadas como parâmetros. Exemplo: local funcao = function(x, y) return x + y end print(funcao(3, 4)) -- Imprime 7 6. Nil O tipo nil é utilizado para representar a ausência de valor. Se uma variável é atribuída a nil, isso indica que ela não tem valor definido. Exemplo: local vazio = nil print(vazio) -- Imprime nil Resumo das Principais Diferenças Compreender a diferença entre variáveis globais e locais, bem como os tipos de variáveis em Lua, é essencial para escrever código limpo, eficiente e livre de erros. PROXIMA AULA
      • 1
      • Like
  6. Introdução à Programação e Lógica de Programação A programação é o processo de criar instruções que um computador pode seguir para realizar tarefas específicas. Essas instruções são escritas em linguagens de programação, como Python, Java, C, JavaScript, entre outras. A programação é uma habilidade fundamental no mundo atual, pois é usada para desenvolver desde aplicativos simples até sistemas complexos. A lógica de programação, por sua vez, é a base que nos permite criar algoritmos eficientes e corretos. Ela envolve raciocínio lógico e a capacidade de resolver problemas de maneira estruturada e eficiente. Vamos ver alguns conceitos básicos que são essenciais tanto para a programação quanto para a lógica. 1. Algoritmos Um algoritmo é uma sequência de passos bem definidos que resolve um problema. Em programação, criamos algoritmos para realizar tarefas específicas. Por exemplo, um algoritmo para calcular a soma de dois números seria: Leia os dois números. Some os dois números. Exiba o resultado. Esses passos podem ser implementados em várias linguagens de programação, mas a lógica por trás deles é a mesma. 2. Estruturas de Controle As estruturas de controle ajudam a controlar o fluxo de execução do programa. Elas permitem que o programa tome decisões ou repita ações. As principais estruturas de controle são: Condicionais (if, else😞 Usadas para tomar decisões baseadas em condições. Exemplo: if idade >= 18 then print("Você é maior de idade.") else print("Você é menor de idade.") end Laços de repetição (for, while😞 Permitem repetir um conjunto de instruções várias vezes. Exemplo com for: for i = 0, 4 do print(i) end 3. Variáveis e Tipos de Dados As variáveis são espaços na memória onde podemos armazenar valores. Cada valor armazenado em uma variável tem um tipo, como números inteiros, reais, texto (strings), entre outros. Exemplo: nome = "João" -- String idade = 25 -- Inteiro altura = 1.75 -- Float 4. Funções Funções são blocos de código que realizam uma tarefa específica e podem ser reutilizados em diferentes partes do programa. Elas ajudam a organizar o código e tornar o desenvolvimento mais eficiente. Exemplo de função: function saudacao(nome) print("Olá, " .. nome .. "!") end saudacao("Maria") 5. Entrada e Saída A interação com o usuário é um aspecto importante da programação. Podemos obter entradas do usuário e exibir resultados. Exemplo de entrada e saída: io.write("Qual é o seu nome? ") nome = io.read() print("Olá, " .. nome .. "!") 6. Lógica de Programação A lógica de programação é o processo de estruturar soluções para problemas de forma eficiente e clara. Isso envolve: Pensamento algorítmico: A capacidade de dividir um problema em passos menores e mais simples. Raciocínio lógico: O uso de operadores lógicos (como "E", "OU", "NÃO") para combinar condições e decisões. Exemplo de raciocínio lógico: idade = 20 tem_carro = true if idade >= 18 and tem_carro then print("Você pode dirigir.") else print("Você não pode dirigir.") end 7. Testes e Depuração Testar e depurar o código é uma parte essencial da programação. Testes ajudam a garantir que o código funcione corretamente, enquanto a depuração (ou debugging) ajuda a identificar e corrigir erros no código. Esses são apenas alguns dos conceitos básicos para começar a entender a programação e a lógica. Com o tempo, você vai aprofundar seus conhecimentos e começar a escrever programas mais complexos. A chave para aprender programação é praticar, testar diferentes códigos e resolver problemas de maneiras criativas! PROXIMA AULA
      • 3
      • Like
  7. AULA ANTERIOR Aqui vai um tutorial detalhado sobre como funciona o LuaScript, com foco em conceitos básicos e exemplos para você começar. 1. O que é Lua? Lua é uma linguagem de script leve e embutida, frequentemente usada para adicionar funcionalidades e controle a programas maiores. Ela é projetada para ser simples de aprender e rápida de usar, oferecendo alto desempenho e fácil integração com outros sistemas. É uma linguagem baseada em paradigmas imperativo, procedural e funcional. Características principais do Lua: Leve e rápida: Lua é projetada para ser pequena e de alto desempenho. Fácil de integrar: Lua pode ser facilmente integrada em outros programas, como jogos e softwares. Simples e flexível: Tem uma sintaxe clara e fácil de aprender. Garbage collection: Possui gerenciamento automático de memória. 2. Como Funciona o LuaScript? O LuaScript geralmente funciona como um código embutido dentro de um programa maior. Ele permite que o programador ou usuário adicione comportamentos e automatizações sem alterar diretamente o código-fonte principal do programa. Exemplo de Uso: Jogos: Em um jogo, Lua pode ser usada para criar scripts que definem regras do jogo, interações dos personagens, eventos, etc. Automatização: Lua pode ser utilizada para automatizar tarefas em programas que a suportam. 3. Instalação e Ambiente de Execução Para usar Lua, você pode configurar um ambiente local de desenvolvimento ou usar uma plataforma que suporte LuaScript (como Unity, Roblox, Garry’s Mod, ou World of Warcraft). Instalar Lua no seu computador: Baixar o interpretador Lua: Acesse o site oficial do Lua: [Hidden Content] Baixe a versão mais recente (geralmente no formato .tar para Linux ou .zip para Windows). Configuração: Extraia o arquivo em um diretório desejado. Configure as variáveis de ambiente para facilitar a execução do Lua a partir do terminal. Executar Lua no terminal: Abra o terminal ou prompt de comando. Navegue até o diretório onde o Lua foi extraído. Execute o comando lua para iniciar o interpretador. Exemplo de Código Básico em Lua: print("Olá, Lua!") Esse código simples imprime a mensagem "Olá, Lua!" na tela. 4. Fundamentos do LuaScript Agora vamos explorar alguns dos conceitos básicos para criar um LuaScript. Variáveis e Tipos de Dados Lua tem tipos de dados simples, como strings, números, booleans, tabelas (equivalentes a arrays ou dicionários), e funções. -- Declaração de variáveis local numero = 10 -- número local texto = "Olá" -- string local verdade = true -- booleano Estruturas de Controle Lua suporta as principais estruturas de controle, como if, for, e while. -- Estrutura condicional if numero > 5 then print("Número maior que 5") else print("Número menor ou igual a 5") end -- Laço for for i = 1, 5 do print(i) end Funções Em Lua, funções são de primeira classe, ou seja, podem ser atribuídas a variáveis, passadas como parâmetros e retornadas. -- Função simples function saudacao(nome) return "Olá, " .. nome end print(saudacao("João")) Tabelas (Arrays ou Dicionários) Tabelas são a estrutura de dados fundamental em Lua e podem ser usadas como arrays ou dicionários. -- Array (tabela de índices numéricos) local lista = {1, 2, 3, 4} print(lista[1]) -- Imprime 1 -- Tabela de chave-valor (dicionário) local pessoa = {nome = "Carlos", idade = 30} print(pessoa.nome) -- Imprime "Carlos" 5. concat (concatenar) A função table.concat é usada para concatenar (juntar) os elementos de uma tabela em uma única string. Ela junta os elementos de um array, usando um delimitador opcional entre os elementos. Sintaxe: table.concat(table, sep, start, end) table: A tabela que contém os elementos a serem concatenados. sep (opcional): O separador entre os elementos. O padrão é uma string vazia (""). start (opcional): O índice de início da concatenação (padrão é 1). end (opcional): O índice final da concatenação (padrão é o último índice da tabela). Exemplo: local frutas = {"maçã", "banana", "laranja"} local resultado = table.concat(frutas, ", ") print(resultado) -- saída: maçã, banana, laranja Neste exemplo, os elementos da tabela frutas são concatenados, separados por uma vírgula e um espaço. 6. explode (dividir) Em Lua, não há uma função nativa chamada explode, mas podemos usar a função string.gmatch ou string.split para dividir uma string em uma tabela, o que é semelhante à funcionalidade de explode em outras linguagens. Exemplo de explode com string.gmatch: function explode(str, sep) local t = {} for match in (str..sep):gmatch("(.-)"..sep) do table.insert(t, match) end return t end local texto = "maçã,banana,laranja" local resultado = explode(texto, ",") for i, v in ipairs(resultado) do print(i, v) end -- saída: -- 1 maçã -- 2 banana -- 3 laranja Neste exemplo, a função explode divide a string texto em substrings usando a vírgula como delimitador e armazena o resultado em uma tabela. 6. Depuração e Erros em Lua A depuração no Lua pode ser feita utilizando a função print() para verificar valores e o comportamento do código. Além disso, Lua fornece funções como assert() e pcall() para lidar com erros. -- Exemplo de tratamento de erro local sucesso, erro = pcall(function() error("Algo deu errado!") end) if not sucesso then print("Erro detectado: " .. erro) end 7. Referências e Bibliotecas O Lua possui diversas bibliotecas que podem ser usadas para realizar tarefas específicas, como manipulação de strings, entrada/saída de arquivos e manipulação de tabelas. Biblioteca de strings: local str = "lua scripting" print(string.upper(str)) -- Converte para maiúsculas Manipulação de arquivos: -- Abrindo um arquivo para escrita local arquivo = io.open("exemplo.txt", "w") arquivo:write("Olá, Mundo!") arquivo:close() 8. As metatables são um dos conceitos mais poderosos e flexíveis do Lua. Elas permitem que você defina o comportamento de tabelas de uma maneira muito mais avançada. Com elas, você pode controlar operações como soma, subtração, acesso a índices e até mesmo a criação de novos métodos personalizados para suas tabelas. O que são Metatables? Uma metatable é uma tabela especial associada a outra tabela. Ela permite que você defina o comportamento de uma tabela quando determinadas operações são realizadas sobre ela, como acesso a índices (via __index), aritmética (via __add, __sub, etc.), ou a manipulação de outros comportamentos. A metatable não muda a tabela original, mas define um conjunto de regras de como ela deve se comportar em situações específicas. 9. Como Funciona a Metatable? Quando você tenta realizar uma operação em uma tabela que tem uma metatable definida, o Lua verifica se há uma função específica na metatable para lidar com essa operação. Se a função estiver presente, ela será chamada em vez de usar o comportamento padrão. Exemplo básico: -- Criando uma tabela local t = {} -- Criando uma metatable local mt = { __index = function(table, key)return "Chave não encontrada: " .. key end } -- Associando a metatable à tabela setmetatable(t, mt) print(t.nome) -- Chave não encontrada: nome No exemplo acima, quando tentamos acessar t.nome, como essa chave não existe na tabela, o Lua chama a função definida no campo __index da metatable, que retorna a string "Chave não encontrada: nome". 2. Campos Comuns em Metatables Alguns campos são muito comuns em metatables e permitem a personalização de diferentes operações: __index Usado quando tentamos acessar uma chave que não existe na tabela. Pode ser uma função ou uma tabela. Exemplo: se você acessar um índice não existente, o Lua irá buscar a chave no valor de __index. local pessoa = {nome = "João"} local mt = { __index = function(t, key) if key == "idade" then return 30 end return "Chave não encontrada" end } setmetatable(pessoa, mt) print(pessoa.nome) -- João print(pessoa.idade) -- 30 print(pessoa.sobrenome) -- Chave não encontrada __newindex Define como novos índices (chaves) são adicionados ou alterados na tabela. Ao tentar atribuir um valor a uma chave inexistente, o Lua verifica o campo __newindex. lua Copiar local pessoa = {} local mt = { __newindex = function(t, key, value) print("Tentando adicionar a chave: " .. key .. " com o valor: " .. value) rawset(t, key, value) -- Usa rawset para evitar um loop infinito end } setmetatable(pessoa, mt) pessoa.nome = "Carlos" -- Tentando adicionar a chave: nome com o valor: Carlos __add, __sub, __mul, etc. (Operadores Aritméticos) São usados para redefinir o comportamento de operações aritméticas em tabelas. Exemplo: redefinir o operador + para que você possa somar duas tabelas (somando seus valores). local t1 = {1, 2, 3} local t2 = {4, 5, 6} local mt = { __add = function(t1, t2) local result = {} for i = 1, #t1 do result[i] = t1[i] + t2[i] end return result end } setmetatable(t1, mt) setmetatable(t2, mt) local t3 = t1 + t2 -- Agora, usamos o operador + com nossas tabelas! for i, v in ipairs(t3) do print(v) -- Imprime 5, 7, 9 end __call Permite que você defina o comportamento de uma tabela quando ela é "chamada" como se fosse uma função. Exemplo: uma tabela que age como um contador quando chamada. local contador = { valor = 0, __call = function(t) t.valor = t.valor + 1 return t.valor end } setmetatable(contador, contador) print(contador()) -- 1 print(contador()) -- 2 print(contador()) -- 3 __tostring Permite que você defina como uma tabela será convertida para uma string quando você usar tostring() ou print(). local ponto = {x = 10, y = 20} local mt = { __tostring = function(t) return "Ponto (" .. t.x .. ", " .. t.y .. ")" end } setmetatable(ponto, mt) print(ponto) -- Ponto (10, 20) 3. Funções Relacionadas às Metatables getmetatable Retorna a metatable de uma tabela. local t = {} local mt = {} setmetatable(t, mt) print(getmetatable(t)) -- Exibe a metatable associada à tabela t setmetatable Associa uma metatable a uma tabela. Caso a tabela já tenha uma metatable, ela será substituída. local t = {} local mt = {__index = function() return "A chave não existe!" end} setmetatable(t, mt) print(t.chave) -- A chave não existe! 4. Usos Comuns de Metatables Otimização de buscas em tabelas: Usando metatables, você pode controlar de maneira eficiente como as chaves de uma tabela são acessadas, otimizando a busca em grandes estruturas de dados. Implementação de classes e objetos: Embora Lua não tenha suporte nativo para classes, você pode criar um modelo de objeto utilizando metatables. Isso é feito atribuindo um comportamento de objeto a uma tabela e utilizando as funções da metatable para representar os métodos da classe. Impedir modificações em tabelas: A metatable pode ser usada para restringir a modificação de tabelas, tornando-as somente leitura. 5. Exemplo Prático: Simulação de Objetos com Metatables Vamos simular um modelo simples de classe em Lua usando metatables. -- Criando um "objeto" de ponto local Ponto = {} Ponto.__index = Ponto -- Método para criar um novo Ponto function Ponto.new(x, y) local self = setmetatable({}, Ponto) self.x = x self.y = y return self end -- Método para mostrar o ponto function Ponto:mostrar() print("Ponto: (" .. self.x .. ", " .. self.y .. ")") end -- Criando uma instância de Ponto local p1 = Ponto.new(10, 20) p1:mostrar() -- Ponto: (10, 20) Conclusão O LuaScript é uma poderosa ferramenta para personalizar e automatizar tarefas em programas que a suportam. Sua sintaxe simples, flexibilidade e alto desempenho a tornam uma escolha popular para sistemas embarcados, jogos e outros aplicativos. Ao entender como Lua funciona e como integrá-la a outros programas, você pode criar soluções incrivelmente eficientes e personalizadas. As metatables em Lua são uma das características mais poderosas da linguagem, permitindo que você controle como suas tabelas se comportam em várias operações. Usando metatables, você pode implementar desde simples personalizações, como controlar o acesso a chaves não existentes, até sistemas mais complexos, como a criação de objetos e a definição de operadores personalizados. Ao entender como as metatables funcionam, você pode aproveitar ao máximo o poder de personalização e flexibilidade do Lua.
      • 8
      • Like
      • Thanks
  8. O Git é uma ferramenta de controle de versão amplamente utilizada no desenvolvimento de software, e sua adoção traz diversos benefícios. Aqui estão algumas razões principais para usar o Git: Controle de versão: O Git permite que você acompanhe e registre todas as mudanças feitas no código ao longo do tempo. Isso facilita o retorno a versões anteriores do projeto, caso algo dê errado, e mantém um histórico claro do que foi alterado e por quem. Trabalho em equipe: Com o Git, múltiplos desenvolvedores podem trabalhar simultaneamente no mesmo projeto sem sobrescrever o trabalho uns dos outros. Ele permite que todos trabalhem em diferentes partes do código e, posteriormente, integrem suas alterações de maneira eficiente. Ramos (Branches): O Git possibilita criar "ramificações" ou branches, permitindo que você desenvolva novas funcionalidades ou corrija bugs sem interferir no código principal. Após testar, as mudanças podem ser integradas ao ramo principal (master ou main). Colaboração remota: Usando plataformas como GitHub, GitLab ou Bitbucket, o Git facilita o trabalho colaborativo, permitindo que desenvolvedores compartilhem código com outros membros da equipe, além de possibilitar o controle e revisão de contribuições via pull requests. Gerenciamento de conflitos: Quando várias pessoas alteram o mesmo trecho de código, o Git ajuda a identificar e resolver esses conflitos, garantindo que todas as modificações sejam preservadas. Rastreabilidade: O Git permite associar cada alteração do código a um comentário ou mensagem explicando o motivo da mudança. Isso proporciona um histórico de decisões, tornando o processo de desenvolvimento mais transparente. Desempenho: O Git é muito rápido, pois opera de forma local e não depende de servidores externos para a maioria das operações. Isso melhora a eficiência do trabalho, principalmente em projetos maiores. Backup e segurança: Ter um repositório Git, especialmente quando combinado com um repositório remoto (como o GitHub), serve como um backup constante do código, evitando perdas acidentais. Facilidade de integração com ferramentas: O Git se integra bem com outras ferramentas, como ferramentas de integração contínua (CI) e entrega contínua (CD), além de outros sistemas de gerenciamento de projetos. Popularidade e comunidade: Git é uma das ferramentas mais utilizadas no mundo do desenvolvimento de software, o que significa que você terá acesso a uma enorme base de conhecimento, tutoriais e uma comunidade ativa para tirar dúvidas e aprender. Por todos esses motivos, o Git é considerado uma ferramenta essencial para desenvolvedores, independentemente do tamanho do projeto ou da equipe envolvida. Ele torna o desenvolvimento mais ágil, organizado e seguro. Esses são os comandos básicos mais comuns usados para trabalhar com o Git. 1. git clone Descrição: Usado para copiar um repositório remoto para o seu computador. Sintaxe: git clone <url-do-repositório> Exemplo: git clone [Hidden Content] 2. git add . Descrição: Adiciona todas as alterações (novos arquivos e modificações) no diretório de trabalho à área de stage (preparação para o commit). Sintaxe: git add . O ponto (.) significa "todos os arquivos modificados" no diretório atual. Exemplo: git add . Caso queira adicionar um arquivo específico: git add nome-do-arquivo 3. git commit Descrição: Cria um commit (salva as mudanças na branch atual). Sintaxe: git commit -m "Mensagem do commit" Exemplo: git commit -m "Corrigido bug na página de login" 4. git push Descrição: Envia seus commits locais para o repositório remoto (como GitHub, GitLab, etc.). Sintaxe: git push <nome-do-remote> <nome-da-branch> Exemplo: Para enviar alterações para a branch main de um repositório remoto chamado origin: git push origin main Resumo do fluxo básico: Clonar um repositório: git clone [Hidden Content] Fazer alterações (editar ou adicionar arquivos). Adicionar as mudanças: git add . Criar um commit com uma mensagem descritiva: git commit -m "Descrição do que foi feito" Enviar as alterações para o repositório remoto: git push origin nome-da-branch Para criar uma nova branch no Git, siga os seguintes passos: Abra o terminal (ou Git Bash, dependendo do seu sistema operacional). Navegue até o repositório onde você deseja criar a nova branch usando o comando cd: cd caminho/para/seu/repositório Crie a nova branch com o comando git branch: git branch nome-da-nova-branch Onde nome-da-nova-branch é o nome que você deseja dar à nova branch. Troque para a nova branch com o comando git checkout: git checkout nome-da-nova-branch Ou, a partir do Git 2.23, você pode usar o comando git switch: git switch nome-da-nova-branch (Opcional) Para criar e já alternar para a nova branch em um único comando, você pode usar: git checkout -b nome-da-nova-branch Ou: git switch -c nome-da-nova-branch Agora, você está na nova branch e pode começar a fazer alterações nela! Se você quiser ver todas as branches disponíveis no seu repositório, use: git branch
  9. Tópico Aprovado e Movido para a Área Correta
  10. No proprio título tem a versão da src. 0.3.6 a pura mesmo.
  11. Solução rows de salvamento, enviado pelo grupo do WhatsApp do dev, pelo Daniel. solução: ```bool DBInsert::addRow(const std::string &row) { if (!m_multiLine) // executes INSERT for current row return m_db->executeQuery(m_query + "(" + row + ")"); m_rows++; int32_t size = m_buf.length(); // adds new row to buffer if (!size) m_buf = "(" + row + ")"; else if (size > 8192) { if (!execute()) return false; m_rows++; m_buf = "(" + row + ")"; } else m_buf += ",(" + row + ")"; return true; }```
×
  • Criar Novo...