Uso dos porquês

Por que

Principal Uso: questionamento sobre a razão ou motivo de um determinado acontecimento.

É a junção da preposição por com o pronome interrogativo que. Esta forma é utilizada em dois casos:

  • Se, depois de seu emprego, houver um questionamento sobre a razão ou motivo de um determinado acontecimento;
  • Se pudermos substituir pela expressão pelo(a) ou qual e variações.

Exemplos:

  • A vitória por que lutei está próxima.
  • A vitória pela qual lutei está próxima.
  • Por que (motivo/razão) você não foi ao shopping?
  • Por qual (motivo/razão) você não foi ao shopping.

Por quê

Principal uso: Somente em final da frase.

Essa forma é empregada somente no final da frase, com uso obrigatório do acento em quê.

Exemplos:

  • Ela me chamou, mas não sei por quê.
  • Correr atrás do ônibus por quê?

Porque

Principal uso: Frases afirmativas e respostas explicativas. Também causa ou finalidade.

Essa forma pode ser uma das conjunções subordinativas causais, subordinativas finais ou uma das conjunções coordenativas explicativas. Empregamos tal forma em frases afirmativas e respostas explicativas, que indiquem não só explicação, mas também causa ou finalidade. Podemos substituir a forma por pois ou como.

Exemplos:

  • Faltei à aula porque estava doente.
  • Faltei à aula, pois estava doente.
  • Porque era pequeno, os colegas não chamavam para brincar.
  • Como era pequeno, os colegas não chamavam para brincar.

Porquê

Principal uso: Sentido de razão ou motivo

Forma empregada com o sentido de razão ou motivo. É sempre precedido por artigo ou pronome e também pode variar entre singular e plural, sendo, portanto, um substantivo.

Exemplo:

  • Diga-me o porquê (o motivo) de você não querer ir ao médico.

Fiz uma imagem para ajudar  na memorização.

pirâmide dos porquês

Dicas:

  • Memorize a pirâmide e seu sentido de leitura, de baixo para cima;
  • Os ‘porquês’ intercalam entre com e sem acento;
  • A base da pirâmide começa com o ‘por que’ sem acento e separado;

 

 

Referências:

Organizando uma base de dados de logradouros usando PHP e LibreOffice Calc

Em uma das minhas tarefas do dia a dia, me deparei com esse problema: Como organizar uma base de dados de logradouros(endereços) ?Como eu poderia fazer isso de maneira prática e utilizando ferramentas já disponíveis?

Foi então que resolver usar o PHP e o LibreOffice Calc.

Contexto

Existe um S.I (ERP+CRM) onde é feito a gerência de todos os clientes. Nesse sistema todas as informações do cadastro de pessoa física/jurídica são utilizadas em outras partes do mesmo sistema. O módulo de CRM desse sistema utiliza, em uma de suas funcionalidades, os dados de endereço (cidade, bairro, logradouro) para posicionar o cliente em um mapa.

Hoje tenho acesso ao BD do sistema mas não tenho permissão de escrita. Preciso corrigir os problemas, enviar por ticket para o suporte do sistema e um arquivo CSV para eles fazerem as alterações no BD.

Problemas

Os logradouros cadastrados estão fora do padrão utilizado no mapa onde precisam ser exibidos, com isso é impossível posicionar o cliente no mapa.

Essa é uma lista dos itens que serão corrigidos:

  • Os logradouros que se referem a mesma rua precisam ter a mesma grafia;
  • Abreviações no nome do logradouro;
  • Na grafia dos logradouros que tem números, precisam estar por extenso;
  • Logradouros que tem a numeração de início e fim no nome;
  • Logradouros com números Romanos;

Solução desenvolvida

No primeiro momento, conversando com a equipe do Comercial, me deram a ideia de utilizar o LibreOffice Calc para organizar os dados e fazer as correções.

Obtendo os dados, organizando e fazendo as primeiras correções

Utilizando o LibreOffice Calc:

Obtive os dados acessando o BD PostgreSQL do sistema e executando um SQL. Copiei os resultados para o LibreOffice Calc.

Dei nome as colunas facilitar a  identificação e manipulação, ficou assim:

ID LOGRADOURO CODBAIRRO CEP CODCIDADE

Dar nome as colunas me ajudou na hora de usar a opção Classificar do Calc. Selecionei toda área da tabela onde estava os dados, dentro da opção CLASSIFICAR eu selecionei a coluna LOGRADOURO na opção Chave de classificação 1.

Ainda no Calc, utilizando a opção Localizar e substituir alterei todos os registro que se enquadra nas condições:

TERMO SUBSTITUÍDO POR
R. Rua
R+ESPAÇO Rua
Tv. +ESPAÇO Travessa
RUA+ESPAÇO Rua
Av+ESPAÇO Avenida
Av.+ESPAÇO Avenida
Cel.+ESPAÇO Coronel
Dr.+ESPAÇO Doutor
Gen.+ESPAÇO General
Brig.+ESPAÇO Brigadeiro
Pre.+ESPAÇO Presidente

Obs: Em alguns casos, existe discordância se o logradouro é Rua, Avenida ou Travessa. Isso teve que ser corrigido também.

Utilizando PHP:

Depois de fazer todas as correções manuais comecei a analisar os problemas para identificar quais seriam possíveis de serem resolvidos usando programação em tempo hábil.

O resultado do código desenvolvido está abaixo:

<?php
//ativando os erros
ini_set(‘display_errors’, ‘On’);
//Exibindo todos os erros
error_reporting(E_ALL);

$caminho_do_csv = '/var/www/html/lista-enderecos-mk.csv';
//O parâmetro FILE_TEXT especifica que o arquivo é retornado na codificação UTF-8.
$array_csv = file($caminho_do_csv, FILE_TEXT);
$map_csv = array_map('str_getcsv', $array_csv);

////////// PROBLEMAS PARA RESOLVER
//(Feito) 1- Encontrar um padrão e tudo que estiver a direita desse padrão deve ser apagado. Ex: numeração de inicio e fim no nome da rua.
//(Feito) 2- Retirar os numeros do nome do logradouro. Geralmente os numeros errados estão no final do nome.

//Função para exibir os dados de um mapa de array
// @return Sem terno
function exibe_mapa(Array $mapa_de_array)
{
if($mapa_de_array != NULL)
{
foreach ($mapa_de_array as $key => $valor)
{
print("Posição do Array exteno: ".$key."<br/>");
print("------ID: ".$valor[0]."<br/>");
print("------Logradouro: ".$valor[1]."<br/>");
print("------CODBAIRRO: ".$valor[2]."<br/>");
print("------CEP: ".$valor[3]."<br/>");
print("------CODCIDADE: ".$valor[4]."<br/>");
print('---------------------------------------------------------');
print("<br/>");
};
};
};

//Função para encontrar um padrão de texto em um mapa de array
// @return Sem terno
function encontrar_padrao(String $padrao, Array $mapa_de_array)
{
//percorrer o array para achar o padrão, se for encontrato, o texto é destacado:
//<font color='red'> texto </font>
$qtd_encontrada=0;
foreach ($mapa_de_array as $key => $valor) {
print("Posição do Array exteno: ".$key."<br/>");
print("------ID: ".$valor[0]."<br/>");
if(stripos($valor[1],$padrao) !== false){
print("------Logradouro: <font color='red'>".$valor[1]."</font><br/>");
$qtd_encontrada=$qtd_encontrada+1;
}else{
print("------Logradouro: ".$valor[1]."<br/>");
};
print('---------------------------------------------------------');
print("<br/>");
};
echo 'Total de ocorrências do padrão: '.$qtd_encontrada;
};

//Essa função contem o array com as strings que devem ser desconsideradas na busca por algum tipo de padrão de string.
// @return Retorna 1 se a string passado por parâmetro estever no array e 0 para caso contrário.
function padrao_desconsiderado(String $string)
{
//Array com os padrões que devem ser desconsiderados
$desconsiderar_padrao = array("ms-","MS-","Ms-","Rua ");
foreach($desconsiderar_padrao as $valor)
{
//A pergunta feita no IF é: Algum dos padrões que estão no array coincide com a string passada por parâmetro?
//Em outras palavras: $valor C $string || $valor esta CONTIDO em $string?
if(stripos($string,$valor) !== false){
return 1;
break;
};
};
return 0;
};

//Salvando em um arquivo CSV
// @return Sem terno
function salvando_no_arq_csv(Array $mapa_de_array)
{
//O primeiro parâmetro é o arquivo.csv que eu já criei e dei permissão 777 nele.
$fp = fopen('file.csv', 'w+');
foreach ($mapa_de_array as $key => $valor)
{
fputcsv($fp, $valor);
};

fclose($fp);
};

//Solução do problema 2
// @return Retorna o mapa de Array com os campos editados
function problema2(String $padrao, Array $mapa_de_array)
{
//percorrer o Array para achar o padrão.
//Depois eu edito a posição do array onde foi achado o padrão e salvo o novo texto editado;
$novo_mapa_de_array = $mapa_de_array;
foreach ($mapa_de_array as $key => $valor) {
if(stripos($valor[1],$padrao) !== false){
//posição onde foi encontrado o padrão
$posicao = stripos($valor[1],$padrao);
//Copiando o o valor(Array) que
$array_temp = $novo_mapa_de_array[$key];
$array_temp[1] = substr($array_temp[1],0,$posicao);
$novo_mapa_de_array[$key] = $array_temp;
};
};
return $novo_mapa_de_array;
};

//Função para encontrar um padrão que atende a expresão regular passada por parâmetro
// @return Retorna um mapa de Array com o texto corrigido
function problema3(String $expressao, Array $mapa_de_array)
{
//Variável que salva temporáriamente um mapa de array com os padrões encontrados;
$matches;
// Novo Array que será retornado contendo o texto editado
$novo_mapa_de_array = $mapa_de_array;

//percorrer o Array para achar o padrão, se for encontrato o padrão é excluido;
foreach ($mapa_de_array as $key => $valor)
{
//IMPORTANTE: a expressão precisa estár entre barras -> EX: /[0-9]/
if(preg_match('/'.$expressao.'/',$valor[1]))
{
if(padrao_desconsiderado($valor[1]) == 0){
preg_match('/'.$expressao.'/',$valor[1],$matches, PREG_OFFSET_CAPTURE);
$temp = $matches[0];
$array_temp = $novo_mapa_de_array[$key];
$array_temp[1] = substr($valor[1],0,$temp[1]);
$novo_mapa_de_array[$key] = $array_temp;
}else{
print_r("Valor: ".$valor[1]."<br/>");
printf("Variável temp[0] padrão: ".$temp[0]."<br/>");
printf("Variável temp[1] posição: ".$temp[1]."<br/><br/>");
}
}
};
return $novo_array_de_mapa;
};

//Resolve problema 2
//padrão para achar as ruas que tem a numeração de inicio e fim no nome
$padrao = ' - ';

//Resolve Problema 3
//Para achar numeros que estão no final do nome da rua
$expressao_problema_3 = '[0-9]{2,5}$';

$corrigido = problema2($padrao, $map_csv);

$corrigido2 = problema3($expressao_problema_3,$corrigido);

salvando_no_arq_csv($corrigido2);

?>

Ferramentas básicas utilizadas no Linux

Essa é a lista das ferramentas que mais utilizo no dia a dia para trabalhar com Linux. Ela será atualizada com o tempo.


whoami – Mostra em qual usuário você está logado.

whoami

sudo – Executar comando com permissões de outros usuário.

-u  -> Estou especificando que quero utilizar as permissões do usuário joca;

Vou executar o comando ifconfig com as permissões do usuário joca.

sudo -u joca ifconfig

tail – Mostrar as últimas partes de um arquivo.

-f  -> Mostra as últimas linha adicionadas ao arquivo em tempo real.

O comando tail serve para mostrar as últimas partes de um arquivo. Por padrão ele exibe as últimas 10 linhas.

Fazendo teste eu percebi que ele não serve para você acompanhar arquivos normais como um arquivo.txt.

tail -f /var/log/syslog

ps – informações sobre os processos

Mostra informações sobre os processos que estão executando na máquina. Diferente do top, ele não recarrega as informações da tela.

aux – Mostra todos os processo executando no computador.

ps aux

killall – Matar todos os processos com um determinado  nome.

killall nome_do_processo

cat –  Exibir o conteúdo de um documento sem precisar abri-lo.

cat php.ini

grep – Filtrar resultados

-n – Vai mostrar a linha do comento onde ele encontrou o padrão especificado
error_log  -> É o texto pelo qual estou filtrando a saída do comando CAT.

cat php.ini | grep -n error_log

cp – Copiar arquivos

-rf  -> Caso acontece algum erro você pode usar esses parâmetros para forçar a cópia (f) recursivamente (r).

cp /home/arthu/Downloads/foto-gatinho.jpg /home/arthu/Imagens/

tree – Mostrar a estrutura do diretório em árvore

-a  -> Todos os arquivos são impressos. Por padrão, a árvore não imprime arquivos ocultos (aqueles que começam com um ponto . )

tree -a

cp e vm – renomear arquivo

cp  -> O que na realidade você está fazendo é gerar uma cópia do arquivo com um nome diferente.

cp teste.html teste.php

mv -> Ele criará o novo arquivo teste.php e excluirá o teste.html

mv teste.html teste.php

scp – Copiar arquivos para um diretório remoto

-r  -> Especificando recursividade na cópia. Ele vai copiar todos os arquivos contidos na pasta de origem.

/home/arthu/teste  -> Pasta/arquivo de origem.

:/var/www/html     -> Pasta de destino

scp -r /home/arthu/teste root@192.168.1.3:/var/www/html/

Informações sobre Distribuição e kernel linux

arthu@arthu-linux ~ $ cat /etc/*-release
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=19
DISTRIB_CODENAME=tara
DISTRIB_DESCRIPTION="Linux Mint 19 Tara"
NAME="Linux Mint"
VERSION="19 (Tara)"
ID=linuxmint
ID_LIKE=ubuntu
PRETTY_NAME="Linux Mint 19"
VERSION_ID="19"
HOME_URL="https://www.linuxmint.com/"
SUPPORT_URL="https://forums.ubuntu.com/"
BUG_REPORT_URL="http://linuxmint-troubleshooting-guide.readthedocs.io/en/latest/"
PRIVACY_POLICY_URL="https://www.linuxmint.com/"
VERSION_CODENAME=tara
UBUNTU_CODENAME=bionic
arthu@arthu-linux ~ $ uname -a
Linux arthu-linux 4.15.0-33-generic #36-Ubuntu SMP Wed Aug 15 16:00:05 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
arthu@arthu-linux ~ $ cat /proc/version
Linux version 4.15.0-33-generic (buildd@lcy01-amd64-024) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #36-Ubuntu SMP Wed Aug 15 16:00:05 UTC 2018

dmidecode – Mostrar a informações sobre o hardware e software da máquina

dmidecode -t 1

-t  -> Este parâmetro especifica um filtro por type, o número seguinte é argumento do type que você quer ver. Para mais informações de tipos veja o manual do aplicativo.


history – Exibe os últimos comandos executados no terminal.

history

MTR – Ferramenta gráfica/terminal para teste utilizando o traceroute

mtr google.com

df – Analisar o uso de espaço em disco

df -h

du – Visualizar o tamanho de arquivos e pastas

du -sh /caminho/da/pasta

hostnamectl – Alterar o nome da maquina (hostname)

hostnamectl set-hostname novo-nome

link – Cria um hard link entre arquivos

O exemplo abaixo irá criar na pasta /var/ um link para o arquivo arquivo-real.txt

sudo link ~/arquivo-real.txt /var/link-para-arquivo.txt

dmesg – Útil para analisar o kernel ring buffer, e especialmente para verificar se os firmwares foram carregados corretamente. Exemplo de firmware não carregado corretamente:

[ 20.251831] sof-audio-pci-intel-tgl 0000:00:1f.3: error: tplg request firmware intel/sof-tplg/sof-hda-generic-1ch.tplg failed err: -2
[ 20.251833] sof-audio-pci-intel-tgl 0000:00:1f.3: you may need to download the firmware from https://github.com/thesofproject/sof-bin/
[ 20.251835] sof-audio-pci-intel-tgl 0000:00:1f.3: error: failed to load DSP topology -2
[ 20.251836] sof-audio-pci-intel-tgl 0000:00:1f.3: ASoC: error at snd_soc_component_probe on 0000:00:1f.3: -2
[ 20.251841] skl_hda_dsp_generic skl_hda_dsp_generic: ASoC: failed to instantiate card -2

Nesse caso a solução foi entrar na pasta /lib/firmware/intel/sof-tplg/ e descompactar o arquivo do firmware:

sudo unzstd sof-hda-generic-1ch.tplg.zst

Se o firmware não existir, você pode tentar baixar via pacote linux-firmware:

sudo apt install linux-firmware

timedatectl – Configurar data e hora
Listar o timezones:

timedatectl list-timezones

Setar um timezone:

sudo timedatectl set-timezone America/Campo_Grande

Procurando arquivos no Linux com o FIND

comando find

Eu estava com dificuldade para encontrar um arquivo dentro de um diretório cheio de pastas, então pesquisando achei esse post que ensina como usar o aplicativo find no linux.

Comando:

arthu-linux / # find . -name nome-do-arquivo.txt

.   ->  Vai pesquisa no diretório onde você está. Se eu trocar para qualquer outro caminho,como /home/arthu/Downloads, ele vai pesquisar dentro desse caminho.

name   ->  parâmetro que indica que vamos pesquisar exatamente pelo nome especificado a seguir.

Documentação da ferramenta: http://man7.org/linux/man-pages/man1/find.1.html