<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>William Costa Rodrigues - Site Developer | RSS Feed</title>
<link>https://www.wcrodrigues.dev.br</link>
<generator>WCRDS</generator>
<managingEditor>contato@wcrodrigues.dev.br (William Costa Rodrigues)</managingEditor>
<description>Códigos disponíveis no site</description>
<language>pt-br</language>
<copyright>Copyright, 2026, William Costa Rodrigues</copyright>
<ttl>5</ttl><item><title>Criar um cronograma de parcelas, com dia do mês fixo, a partir da primeira data informada</title><link>https://www.wcrodrigues.dev.br/codigos/criar-um-cronograma-de-parcelas-com-dia-do-mes-fixo-a-partir-da-primeira-data-informada</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[from datetime import datetime
from dateutil.relativedelta import relativedelta

def gerar_cronograma_parcelas():
    # --- Entrada de Dados ---
    entrada_data = input(
        "Entre com a data da primeira parcela (DD/MM/AAAA): "
    )  # ex: 20/10/2026
    num_parcelas = int(input("Digite o número total de parcelas: "))  # ex: 12
    # Converte a string de entrada para o formato de data
    data_atual = datetime.strptime(entrada_data, "%d/%m/%Y")
    print(f"\n--- Cronograma de {num_parcelas} Parcelas ---")
    # --- Cálculo e Exibição ---
    for i in range(num_parcelas):
        # Avança os meses um a um com base na data original
        data_parcela = data_atual + relativedelta(months=i)
        print(f"Parcela {i+1:02d}: {data_parcela.strftime('%d/%m/%Y')}")

# Chama e executa a função
gerar_cronograma_parcelas()]]></description><pubDate>Tue, 20 Oct 2026 23:08:11 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/criar-um-cronograma-de-parcelas-com-dia-do-mes-fixo-a-partir-da-primeira-data-informada</guid></item><item><title>Script Python para Cálculo da Percentagem de Sódio Trocável (PST)</title><link>https://www.wcrodrigues.dev.br/codigos/script-python-para-calculo-da-percentagem-de-sodio-trocavel-pst</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[# CALCULADORA DE PERCENTAGEM DE SÓDIO TROCÁVEL (PST)
# Autor: William Costa Rodrigues
# Data: 2026-07-27 21:16:32
# Update: 2026-07-27 22:06:22
import math
print("--- CALCULADORA DE PERCENTAGEM DE SÓDIO TROCÁVEL (PST) ---")

# Entrada da CTC (sempre em cmol_c/dm³)
ctc = float(input("Capacidade de Troca Catiônica total (CTC) em cmol_c/dm³: "))

# Menu de seleção para a unidade do Sódio
print("\nSelecione a unidade do Sódio (Na):")
print("1 - cmol_c/dm³ (Mesma unidade da CTC)")
print("2 - mg/dm³ ou ppm (Comum na folha de micronutrientes)")
opcao = int(input("Digite a opção (1 ou 2): "))

na_original = float(input("Concentração de Sódio (Na): "))

# Execução da conversão se necessário
if opcao == 2:
    # Divide por 230 para converter de mg/dm³ para cmol_c/dm³
    na_cmol = na_original / 230
    print(f"-> Sódio convertido para cmol_c/dm³: {na_cmol:.4f}")
else:
    na_cmol = na_original

# Cálculo final da PST
pst = (na_cmol / ctc) * 100

# Classificação técnica do solo
if pst < 7:
    classificacao = "Solo Normal (Baixo teor de sódio - Isento de riscos)"
elif 7 <= pst < 15:
    classificacao = "Solo em estágio de atenção (Sodicidade moderada)"
else:
    classificacao = "Solo Sódico (Alto risco de degradação física e dispersão)"

# Exibição do resultado na tela
print("\n================ RESULTADO ================")
print(f"Valor da PST calculada: {pst:.2f}%")
print(f"Classificação: {classificacao}")
print("===========================================")]]></description><pubDate>Mon, 27 Jul 2026 21:31:49 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/script-python-para-calculo-da-percentagem-de-sodio-trocavel-pst</guid></item><item><title>Script Python para Cálculo da Razão de Adsorção de Sódio (RAS)</title><link>https://www.wcrodrigues.dev.br/codigos/script-python-para-calculo-da-razao-de-adsorcao-de-sodio-ras</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[# Calculadora de Razão de Adsorção de Sódio (RAS)
# Autor: William Costa Rodrigues
# Data: 2026-07-27 21:16:32
# Update: 2026-07-27 21:16:32
import math

print("--- CALCULADORA DE RAZÃO DE ADSORÇÃO DE SÓDIO (RAS) ---")
print("Selecione a unidade dos seus dados:")
print("1 - meq/L ou mmol_c/L (Padrão)")
print("2 - cmol_c/dm3 (Exige conversão)")

opcao = int(input("Digite o número da opção (1 ou 2): "))

# Leitura individual dos elementos da área
print("\n--- INFORME OS DADOS DA ÁREA ---")
na = float(input("Concentração de Sódio (Na): "))
ca = float(input("Concentração de Cálcio (Ca): "))
mg = float(input("Concentração de Magnésio (Mg): "))

# Tratamento da unidade e conversão se necessário
if opcao == 2:
    na_calc = na * 10
    ca_calc = ca * 10
    mg_calc = mg * 10
else:
    na_calc = na
    ca_calc = ca
    mg_calc = mg

# Cálculo da fórmula matemática da RAS
ras = na_calc / math.sqrt((ca_calc + mg_calc) / 2)

# Classificação do risco de sodificação
if ras < 10:
    risco = "Baixo Risco"
elif 10 <= ras < 18:
    risco = "Risco Moderado"
elif 18 <= ras <= 26:
    risco = "Alto Risco"
else:
    risco = "Risco Muito Alto"

# Exibição do resultado final
print("\n================ RESULTADO ================")
print(f"Valor da RAS: {ras:.2f}")
print(f"Classificação: {risco}")
print("===========================================")]]></description><pubDate>Mon, 27 Jul 2026 21:30:45 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/script-python-para-calculo-da-razao-de-adsorcao-de-sodio-ras</guid></item><item><title>List RBL (Real-time Blackhole List) Check</title><link>https://www.wcrodrigues.dev.br/codigos/list-rbl-real-time-blackhole-list-check</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[function RBL_Check($ip)
    {
        try {
            $rblurl = 'http://rbl-check.org/rbl_api.php?ipaddress=' . trim($ip);
            $boom = fopen($rblurl, "r");
            $rbl = stream_get_contents($boom);
            fclose($boom);
         $lines = explode("\n", $rbl);
            $table = "<table class='table table-bordered table-striped'><thead><tr>
        <th>Nome</th><th>Servidor</th><th>Website</th><th>Status</th>
        </tr></thead><tbody>";
            foreach ($lines as $index => $line) {
                $table .= "<tr>";
                $cols = explode(";", $line);
                foreach ($cols as $col) {
                    if ($col == 'notlisted') {
                        $table .= "<td class='text-center'><i class='fas fa-check-circle text-success'></i></td>";
                    } else if ($col == 'listed') {
                        $table .= "<td class='text-center'><i class='fas fa-check-circle text-danger'></i></td>";
                    } else if (str_contains($col, "http")) {
                        $table .= "<td><a href='" . htmlspecialchars($col) . "' target='_blank'>" . htmlspecialchars($col) . "</a></td>";
                    } else if ($col == 'nowebsite') {
                        $table .= "<td>Sem Website</td>";
                    } else {
                        $table .= "<td>" . htmlspecialchars($col) . "</td>";
                    }
                }
                $table .= "</tr>";
            }
            $table .= "</tbody></table>";
            echo $table;
        } catch (\Throwable $th) {
            throw $th;
        }
    }]]></description><pubDate>Thu, 29 Jan 2026 22:54:26 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/list-rbl-real-time-blackhole-list-check</guid></item><item><title>JQuery LowerCase</title><link>https://www.wcrodrigues.dev.br/codigos/jquery-lowercase</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[$(document).ready(function() {
  var $myDiv = $('#myDiv');
  var originalText = $myDiv.text();
  var lowercaseText = originalText.toLowerCase();
  $myDiv.text(lowercaseText);
});]]></description><pubDate>Sun, 25 Jan 2026 13:54:55 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/jquery-lowercase</guid></item><item><title>Finalizar processos (Kill) com PID em Linux </title><link>https://www.wcrodrigues.dev.br/codigos/finalizar-processos-kill-com-pid-em-linux </link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[Lista all proccess with PID put command
top

For instance, to kill a process with SIGTERM, execute the following:
kill -15 [PID]

SIGTERM (Signal 15). This signal asks for a process to terminate. The process can capture this signal, perform cleanup operations, and then exit. By default, the kill command sends SIGTERM if no other signal is specified.
SIGKILL (Signal 9). It forcefully kills a process. The process cannot capture or ignore this signal, which results in an immediate termination. It should be used as a last resort when a process doesn’t respond to SIGTERM.
SIGINT (Signal 2). This is typically sent when you press Ctrl + C in the terminal. It interrupts a process and is usually used to stop a process running in the foreground.
SIGHUP (Signal 1). Sent to a process when its controlling terminal is closed and often used to reload configuration files.
SIGQUIT (Signal 3). Causes a process to terminate and produce a core dump file for debugging.
SIGSTOP (Signal 19). Pauses a process without killing it, similar to pressing Ctrl + Z in the terminal.
SIGCONT (Signal 18). Continues a process that was stopped by SIGSTOP or Ctrl + Z.]]></description><pubDate>Sat, 24 Jan 2026 00:51:16 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/finalizar-processos-kill-com-pid-em-linux </guid></item><item><title>Comandos Python para Servidor Linux </title><link>https://www.wcrodrigues.dev.br/codigos/comandos-python-para-servidor-linux </link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[Listar a versões Python instaladas
pyenv versions

Setar a versão global do Python
pyenv global 3.X.X

Para confirmar que a alteração foi feita, execute:
python -V
python --version

Atualizar Versão pip
python -m pip install --upgrade pip

Instalar versão específica do pacote bcrypt
pip install bcrypt==4.2.0 ]]></description><pubDate>Sat, 24 Jan 2026 00:48:55 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/comandos-python-para-servidor-linux </guid></item><item><title>Permitir escrita no raiz do site em Linux (Ubuntu)</title><link>https://www.wcrodrigues.dev.br/codigos/permitir-escrita-no-raiz-do-site-em-linux-ubuntu</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[sudo chown -R www-data:www-data /var/www/* ]]></description><pubDate>Sat, 24 Jan 2026 00:46:46 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/permitir-escrita-no-raiz-do-site-em-linux-ubuntu</guid></item><item><title>Ocultar div automaticamente com tempo</title><link>https://www.wcrodrigues.dev.br/codigos/ocultar-div-automaticamente-com-tempo</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[<script>
    $(document).ready(function () {
        $("#DivMsg").fadeTo(10000, 4000).slideUp(4000, function () {
            $("#DivMsg").slideUp(10000);
        });
    });
</script>]]></description><pubDate>Tue, 14 Oct 2025 00:20:56 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/ocultar-div-automaticamente-com-tempo</guid></item><item><title>Abertura arquivo pdf em Dialog Modal (BS e JQuery)</title><link>https://www.wcrodrigues.dev.br/codigos/abertura-arquivo-pdf-em-dialog-modal-bs-jquery</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[/*
Utiliza bootstrap v 5.X e Jquery v3.7.X
*/
(function (a) {
    a.createModal = function (b) {
        defaults = { title: "", message: "Leitor de PDF", closeButton: true, scrollable: false };
        var b = a.extend({}, defaults, b);
        var c = (b.scrollable === true) ? 'style="min-width: 600px; max-height: 620px;overflow-y: auto;"' : "";
        html = '<div class="modal fade bs-example-modal-lg" id="ModalPDF">';
        html += '<div class="modal-dialog modal-xl">';
        html += '<div class="modal-content">';
        html += '<div class="modal-header bg-primary">';
        if (b.title.length > 0)
        { html += '<h4 class="modal-title">' + b.title + "</h4>" }
        html += '<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>';
        html += "</div>";
        html += '<div class="modal-body" ' + c + ">";
        html += b.message;
        html += "</div>"; html += '<div class="modal-footer">';
        if (b.closeButton === true) { html += '<button type="button" class="btn btn-primary" data-dismiss="modal">Fechar</button>' }
        html += "</div>";
        html += "</div>";
        html += "</div>";
        html += "</div>";
        a("body").prepend(html);
        a("#ModalPDF").modal().on("hidden.bs.modal", function () { a(this).remove() })
    }
})(jQuery);


$(function () {
    $('.view-pdf').on('click', function () {
        var pdf_link = $(this).attr('href');     
        var iframe = '<object type="application/pdf" data="' + pdf_link + '" width="100%" height="400">No Support</object>'
        $.createModal({
            title: 'Leitor de PDF Plugin',
            message: iframe,
            closeButton: true,
            scrollable: false
        });
        return false;
    });
})
]]></description><pubDate>Tue, 14 Oct 2025 00:18:22 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/abertura-arquivo-pdf-em-dialog-modal-bs-jquery</guid></item><item><title>Coeficiente de Correlação no R</title><link>https://www.wcrodrigues.dev.br/codigos/coeficiente-de-correlaao-no-r</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[Antes de realizarmos os cálculos, vamos a expliação sobre a função cor.test(args) do R. 
cor.test(x, y,
         alternative = c("two.sided", "less", "greater"),
         method = c("pearson", "kendall", "spearman"),
         exact = NULL, conf.level = 0.95, continuity = FALSE)
x, y
Vetores numéricos. x e y devem possuir mesmo tamanho (na=nb.)

alternative
Indica a hipótese alternativa e deve ser uma das opções "two.sided", "greater" ou "less". Você pode especificar apenas a letra inicial. A opção "greater" corresponde à associação positiva, "less" à associação negativa.

method
Uma cadeia de caracteres indicando qual coeficiente de correlação deve ser usado para o teste. As opções podem ser "pearson", "kendall" ou "spearman", pode ser abreviado.

exact
Valor lógico indicando se um p-value exato deve ser computado. Usado para o tau de Kendall e o rho de Spearman. O valor padrão (NULL).

conf.level
Nível de confiança para o intervalo de confiança retornado. Atualmente, só é usado para o coeficiente de correlação de Pearson, se houver pelo menos 4 pares completos de observações.

continuity
Lógico: se for TRUE (verdadeira), uma correção de continuidade é usada para o tau de Kendall e para o rho de Spearman quando não é calculada exatamente. 



Correlação de Pearson no R
#cria uma matriz de dados para as variáveis x (idade estudante) y (notas de matemática)
xa=c(16,17,16,15,15,15,16,18,17,17)
ym=c(57,45,72,78,53,63,86,98,59,71)
#realizar o teste de correlação entre as duas variáveis
cor.test(xa,ym,method="pearson")

#cria uma matriz de dados para as variáveis y (notas de biologia) (x já foi setado acima)
yb=c(83,37,41,84,56,85,77,87,70,59)
#realizar o teste de correlação entre as duas variáveis
cor.test(xa,yb,method="pearson")

Correlação de Spearman
#cria uma matriz de dados para as variáveis x (notas de matamática) y (notas de biologia)
xm=c(57,45,72,78,53,63,86,98,59,71)
yb=c(83,37,41,84,56,85,77,87,70,59)
#realizar o teste de correlação entre as duas variáveis
cor.test(xm,yb,method="spearman", exact=T) ]]></description><pubDate>Thu, 02 Oct 2025 21:25:08 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/coeficiente-de-correlaao-no-r</guid></item><item><title>Criando Gráficos Básicos com R</title><link>https://www.wcrodrigues.dev.br/codigos/criando-graficos-basicos-com-r</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[#Para usar o pacote plot não há necessidade de carregar a biblioteca (Library), pois esta já é padrão do R, mas para usar ggplot2 há a necessidade de carrega-la atavés do comando library(ggthemes). Caso não tenha ela instalada processa da seguinte forma: insira o comando install.packages("ggthemes").
#Biblioteca ou pacotes
#Serão utilizados o seguintes pacotes plot, ggplot2 e o ggthemes. No script será careegados os pacotes individualmente, por exemplo, library("ggplot2"), library("ggthemes"),library("vegan").
## Cria os conjuntos de dados x e y
##Conjunto de dados X
cx=c(12,15,45,32,36,32,21,21,14,52)
##Conjunto de dados Y
cy=c(5400,2500,3600,900,1500,1100,1400,1800,1800,1100)
##Converte o conjunto de dados cx e xy em uma data frame (matriz)
Data=data.frame(cx,cy)
##Plota o gráfico. Detalhe apara a função sort(), que
plot(sort(cx),sort(cy), xlab="Idade", ylab="Renda", type="o", main="Idade vs renda",sub="Ano de 2016")


##Carrega o pacote ggplot2 e ggthemes
library(ggplot2)
library(ggthemes)

ggplot(Data, aes(x=cx,y=cy)) + geom_point() + 
  stat_smooth(method = 'lm', aes(colour = 'Linear'), se = FALSE) +
  stat_smooth(method = 'lm', formula = y ~ poly(x,2), aes(colour = 'Polynomial'), se= FALSE) +  
  stat_smooth(method = 'nls', formula = y ~ a * log(x) +b, aes(colour = 'Logarithmic'), se = FALSE, start = list(a=1,b=1)) +
  stat_smooth(method = 'nls', formula = y ~ a*exp(b *x), aes(colour = 'Exponential'), se = FALSE,start = list(a=1,b=1)) +
  theme_base() +  scale_colour_brewer(name = 'Trendline', palette = 'Set2') +  
  stat_smooth(method="loess",se=FALSE) ]]></description><pubDate>Sun, 28 Sep 2025 20:53:20 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/criando-graficos-basicos-com-r</guid></item><item><title>Calculando a média, variância e desvio padrão no R</title><link>https://www.wcrodrigues.dev.br/codigos/calculando-a-média-variancia-e-desvio-padrao-no-r</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[#atribuindo a variável dados o conjunto de valores
dados =c(1,6,3,3,9,3.5,5.2,2.5)
#Calculando a média e atribuindo o valor a variável media1, calculando a variância e o desvio
media1= mean(dados); media1
var(dados)
desvio=sqrt(var(dados))
desvio ]]></description><pubDate>Sun, 28 Sep 2025 20:46:36 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/calculando-a-média-variancia-e-desvio-padrao-no-r</guid></item><item><title>CyberPanel error 500 Pannel Login</title><link>https://www.wcrodrigues.dev.br/codigos/cyberpanel-error-500-pannel-login</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[Run in Terminal with root user

systemctl restart lscpd.service

systemctl status lscpd.service

sh <(curl https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/preUpgrade.sh || wget -O - https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/preUpgrade.sh)


Outras soluções
Edit nano /usr/local/CyberCP/CyberCP/settings.py
and remove the line that contains “configservcsf”
systemctl restart lscpd.service]]></description><pubDate>Sat, 27 Sep 2025 09:39:25 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/cyberpanel-error-500-pannel-login</guid></item><item><title>Error: retry time not reached for any host for</title><link>https://www.wcrodrigues.dev.br/codigos/error-retry-time-not-reached-for-any-host-for</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[cd /var/spool/exim/db
rm -f retry retry.lockfile
rm -f wait-remote_smtp wait-remote_smtp.lockfile
service exim restart ]]></description><pubDate>Sat, 27 Sep 2025 09:31:31 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/error-retry-time-not-reached-for-any-host-for</guid></item><item><title>PHPMailer: SMTP Error: Could not connect to SMTP host</title><link>https://www.wcrodrigues.dev.br/codigos/phpmailer-smtp-error-could-not-connect-to-smtp-host</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[The PHPMailer wiki has a section on this:

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting#php-56-certificate-verification-failure

The suggested workaround is including the following piece of code:

$mail->SMTPOptions = array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
)
);

This should work for PHPMailer 5.2.10 (and up).

Note: Obviously, and also as suggested in that wiki, this should be a temporary solution! ]]></description><pubDate>Sat, 27 Sep 2025 09:27:11 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/phpmailer-smtp-error-could-not-connect-to-smtp-host</guid></item><item><title>Separar nome e sobrenome em duas colunas</title><link>https://www.wcrodrigues.dev.br/codigos/separar-nome-e-sobrenome-em-duas-colunas</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[#Splitting a single column (name) into two (forename, surname) in SQL
SELECT 
TRIM(SUBSTRING(name,1, LENGTH(name)- LENGTH(SUBSTRING_INDEX(name, ' ', -1)))) AS firstname, 
SUBSTRING_INDEX(name, ' ', -1) AS lastname FROM tablename]]></description><pubDate>Sat, 27 Sep 2025 09:23:50 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/separar-nome-e-sobrenome-em-duas-colunas</guid></item><item><title>Converter campo de tabela com maiúscula e minúscula</title><link>https://www.wcrodrigues.dev.br/codigos/converter-campo-de-tabela-com-maiuscula-e-minuscula</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[UPDATE tabela SET campo=CONCAT(UPPER(SUBSTRING(campo FROM 1 FOR 1)),(SUBSTRING(campo FROM 2)))]]></description><pubDate>Sat, 27 Sep 2025 09:21:42 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/converter-campo-de-tabela-com-maiuscula-e-minuscula</guid></item><item><title>Removing Query String from URL by using jquery (working with issue)</title><link>https://www.wcrodrigues.dev.br/codigos/removing-query-string-from-url-by-using-jquery-working-with-issue</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[&lt;script&gt;
var uri = window.location.href.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}
&lt;/script&gt;
]]></description><pubDate>Sat, 27 Sep 2025 09:17:57 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/removing-query-string-from-url-by-using-jquery-working-with-issue</guid></item><item><title>Generating a random &amp; unique 8 character string using MySQL </title><link>https://www.wcrodrigues.dev.br/codigos/generating-a-random-unique-8-character-string-using-mysql</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[select concat(substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*13, 1),
substring('!@#$%^~&*()_+-=', rand()*13, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*13, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*13, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*13, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*13, 1),
substring('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', rand()*13, 1),
substring('!@#$%^~&*()_+-=', rand()*13, 1)
) as LicensePlaceNumber;]]></description><pubDate>Fri, 26 Sep 2025 18:38:41 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/generating-a-random-unique-8-character-string-using-mysql</guid></item><item><title>Criando um Captcha Alternativo em PHP</title><link>https://www.wcrodrigues.dev.br/codigos/criando-um-captcha-alternativo-em-php</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[private function captcha($width, $height, $fontsize, $stringsize)
{
        try {
            if (isset($_SESSION["captcha"])) {
                unset($_SESSION["captcha"]);
            }
            $imagem = imagecreatetruecolor($width, $height) or die("Can't create image!"); // define a largura e a altura da imagem
        
            //você deve ter essa ou outra fonte de sua preferencia em sua pasta
            $font = "fonts/KaushanScriptRegular.ttf"; //Local
        
            $black = imagecolorallocate($imagem, 0, 0, 0); // define a cor preta
            $white = imagecolorallocate($imagem, 255, 255, 255); // define a cor branca
            $randcolor = imagecolorallocate($imagem, rand(0, 255), rand(10, 200), rand(0, 255)); // define a cor amarela
            $roxo = imagecolorallocate($imagem, 184, 14, 164); // define a cor roxa
            $pixel_color = imagecolorallocate($imagem, 0, 55, 255);
            imagefill($imagem, 0, 0, $white);
            imagecolortransparent($imagem, $white);
            imagefilledrectangle($imagem, 0, 0, $width, $height, $white);
            for ($i = 0; $i < 10000; $i++) {
                imagesetpixel($imagem, rand() % $width, rand() % $height, $randcolor);
            }
            for ($i = 0; $i < 10; $i++) {
                imageline($imagem, 0, rand() % $height, $width, rand() % 100, $roxo);
            }
        
            //define a captcha conforme a quantidade de letras definidas no parametro $stringsize=8;
            
            $captcha = substr(str_shuffle("ABCDEFGHIJKLMNPQRSTUVYXWZ123456789"), 0, ($stringsize));
            $_SESSION["captcha"] = $captcha; // atribui para a sessao a captcha gerada
            for ($i = 1; $i <= $stringsize; $i++) {
                imagettftext(
                    $imagem,
                    $fontsize,
                    rand(-25, 20),
                    ($fontsize * $i),
                    ($fontsize + 10),
                    $black,
                    $font,
                    substr($captcha, ($i - 1), 1)
                );
                // atribui as letras a imagem
        
            }
            
            imagepng($imagem) or die("Can't create image!"); // gera a imagem
        
            imagedestroy($imagem); // limpa a imagem da memoria
        } catch (\Throwable $th) {
            throw $th;
        }
}

]]></description><pubDate>Thu, 25 Sep 2025 00:35:37 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/criando-um-captcha-alternativo-em-php</guid></item><item><title>Sorteio de nome com Python</title><link>https://www.wcrodrigues.dev.br/codigos/sorteio-de-nome-com-python</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[#Crie um arquivo texto chamado names.txt e inclua os nomes, um por linha, por exemplo
Antonio Carlos
Pedro Cardonso
Walter Salles
Pepeu Gomes
Caetano Veloso
Antonio Tabet
Gregorio Duvuvier
Fernanda Montenegro
Fernanda Lima
Marina Lima
Maria Betânia
Liniker
Pitty
Leci Brandão

#No Script Python insira as seguitnes linhas de comando

import random

with open('names.txt', "r", encoding='utf-8') as file:
    print(f"? Analisando: names.txt")
    namelist= file.read().splitlines()
    print(f"? Randomizando nomes para sorteio  ")
    sorteado= random.choice(namelist)
    print(f"? Sorteado: {sorteado}")
    
    
#Salve o script, com um nome sugestivo tipo corteio_aleatorio.py e rode no prompt do Python ou Terminal do VSCode     ]]></description><pubDate>Tue, 23 Sep 2025 19:52:26 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/sorteio-de-nome-com-python</guid></item><item><title>Add Security Headers Apache and PHP</title><link>https://www.wcrodrigues.dev.br/codigos/add-security-headers-apache-and-php</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[# Add Security Headers
.htaccess

<IfModule mod_headers.c>
# Protect against XSS attacks
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options: nosniff
Header set Strict-Transport-Security: max-age=31536000; includeSubDomains
Header set Referrer-Policy: strict-origin-when-cross-origin
</IfModule>

PHP
header("X-XSS-Protection: 1; mode=block");
header("X-Content-Type-Options: nosniff");
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
header("Referrer-Policy: strict-origin-when-cross-origin");
]]></description><pubDate>Tue, 23 Sep 2025 17:17:34 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/add-security-headers-apache-and-php</guid></item><item><title>Verificando cabeçalhos de segurança em seu site</title><link>https://www.wcrodrigues.dev.br/codigos/verificando-cabecalhos-de-seguranca-em-seu-site</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[import requests
import socket
import ssl
from urllib.parse import urlparse

def get_ssl_expiry_date(hostname):
    context = ssl.create_default_context()
    with socket.create_connection((hostname, 443)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            ssl_info = ssock.getpeercert()
            return ssl_info['notAfter']

def check_security_headers(headers):
    required_headers = [
        'Content-Security-Policy',
        'Strict-Transport-Security',
        'X-Content-Type-Options',
        'X-Frame-Options',
        'X-XSS-Protection',
        'Referrer-Policy',
        'Permissions-Policy'
    ]
    missing = [h for h in required_headers if h not in headers]
    return missing

def check_site_security(url):
    print(f"? Analisando: {url}")
    try:
        response = requests.get(url, timeout=10)
        parsed_url = urlparse(url)
        hostname = parsed_url.hostname
        ip = socket.gethostbyname(hostname)
        print(f"? IP: {ip}")
        print(f"? Status code: {response.status_code}")
        print(f"? Verificando SSL...")
        ssl_expiry = get_ssl_expiry_date(hostname)
        print(f"   ? Certificado SSL expira em: {ssl_expiry}")
        print("? Verificando headers de segurança...")
        missing_headers = check_security_headers(response.headers)
        if missing_headers:
            print("   ⚠ Headers de segurança ausentes:")
            for h in missing_headers:
                print(f"     - {h}")
        else:
            print("   ✅ Todos os principais headers de segurança estão presentes.")

        print("✅ Análise passiva concluída.")
    except Exception as e:
        print(f"❌ Erro na análise: {e}")

# Execute a análise
check_site_security("https://www.wcrodrigues.dev.br/")]]></description><pubDate>Mon, 22 Sep 2025 18:15:19 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/verificando-cabecalhos-de-seguranca-em-seu-site</guid></item><item><title>Virtual Environments and Packages </title><link>https://www.wcrodrigues.dev.br/codigos/virtual-environments-and-packages</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[You can also install a specific version of a package by giving the package name followed by == and the version number:
python3 -m pip install requests==2.6.0

If you re-run this command, pip will notice that the requested version is already installed and do nothing. You can supply a different version number to get that version, or you can run python -m pip install --upgrade to upgrade the package to the latest version:

python3 -m pip install --upgrade requests

python3 -m pip uninstall followed by one or more package names will remove the packages from the virtual environment.

python3 -m pip show will display information about a particular package:

python3 -m pip show requests ]]></description><pubDate>Sat, 20 Sep 2025 22:49:45 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/virtual-environments-and-packages</guid></item><item><title>Alterar permissões de arquivos, diretórios e subdiretórios via comando Linux</title><link>https://www.wcrodrigues.dev.br/codigos/alterar-permissoes-de-arquivos-diretorios-e-subdiretorio-via-comando-linux</link><author>contato@wcrodrigues.dev.br (William Costa Rodrigues)</author><description><![CDATA[Arquivos
find /home/wwgvaa/tmp -type f -exec chmod 644 {} \;
Diretório
find /home/wwgvaa/tmp -type d -exec chmod 755 {} \;

Maior segurança
Arquivos
find /home/wwgvaa/tmp -type f -exec chmod 640 {} \;
Diretório
find /home/wwgvaa/tmp -type d -exec chmod 750 {} \; ]]></description><pubDate>Sat, 20 Sep 2025 22:44:25 -0300</pubDate><guid>https://www.wcrodrigues.dev.br/codigos/alterar-permissoes-de-arquivos-diretorios-e-subdiretorio-via-comando-linux</guid></item></channel>
</rss>