Como retornar um texto formatado em PascalCase no SQL SERVER

Fala pessoal, tudo em ordem? Espero que sim!
Recentemente precisei aplicar pascal case em textos e cheguei ao código a seguir para atender a necessidade.

Vamos para o script? Go go go ahead 🙂

CREATE FUNCTION dbo.fnPascalCase(@DATA VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @Position INT

SELECT @DATA = STUFF(LOWER(@DATA), 1, 1, UPPER(LEFT(@DATA, 1))),
@Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin)

WHILE @Position > 0
SELECT @DATA = STUFF(@DATA, @Position, 2, UPPER(SUBSTRING(@DATA, @Position, 2))),
@Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin)

SET @DATA = REPLACE(@DATA, ' ','')
RETURN @DATA
END

select dbo.fnPascalCase('quem veio primeiro ovo ou galinha?') as PascalCase

Execute o código e se tudo ocorreu como esperado, será exibido algo parecido com isso:
01

Espero que tenha ajudado, até a próxima. 😉

Fonte: https://stackoverflow.com/questions/4383038/convert-text-in-pascalcase

Resolvendo um ThreadAbortException em aplicações ASP.NET

Fala pessoal, tudo em ordem? Espero que sim!
Hoje quero compartilhar com vocês dicas para evitar ThreadAbortException em projetos ASP.NET.

Entendendo o problema.
Quando temos processamentos demorados em execução para atender a uma requisição HTTP, é normal que o ASP.NET aborte a execução e dispare a exceção “ThreadAbortException” após excedido “90s”, isso quando, a execução não é em modo DEBUG, pois em modo DEBUG o valor padrão é “300000s” então dificilmente será disparado essa exceção em desenvolvimento.

O que podemos fazer para evitar o problema?
Podem existir diversas formas de resolver isso, mas irei citar 3,
1 – Analisar o código responsável pela resposta ao recurso HTTP, identificar se é um processamento que está sendo prejudicado por performance no banco de dados e fazer os ajustes necessários, criando indices ou refatorando o código que realiza a consulta.
2 – Sendo um processo demorado devido as regras que precisam ser executadas, é um forte candidato a colocar em Job para ser processado em background.
3 – Se por algum motivo não tenha tempo suficiente para aplicar as opções 1, 2 ou outras que existam e seu negócio permita o recurso demore, é possível alterar no web.config do projeto aumentando o tempo que o asp.net deve aguardar pelo processamento até que realize um TreadAbortException. Contudo, tal medida pode gerar enfileiramento de requisições no servidor e causar indisponibilidade no serviço web quando chegar no seu limite de processamento.

Como aumentar o tempo da TreadAbortException?
Foi proposital elenca-la como última opção, pois não recomendo você ter um processo HTTP em execução por muito tempo, mas vamos lá, no web.config do projeto inclua/altere a tag “httpRuntime” para um valor em segundos suficiente para aguardar seu processo mais demorado.

ThreadAbortException

Espero que tenha ajudado. 🙂

Abraços e até a próxima.

Fontes:
https://stackoverflow.com/questions/17118236/httpruntime-targetframework-4-5-causes-500-internal-server-error
https://dotnetvisio-msdn.blogspot.com/2013/07/solution-for-thread-being-aborted-call.html

No ENUM como recuperar o texto do atributo Description e um item dado o indice

Importante: Não será apresentando sobre o que é ENUM e por que usar, como criar projeto do tipo ConsoleApplication e classes no visual studio code, pois não é o objetivo do artigo.

Fala pessoal, tudo em ordem? Espero que sim!
Hoje vou compartilhar com vocês um código que costumo usar para recuperar texto do atributo description de um ENUM e um método conversão genérico que recebe o indice do item e converte para um item de um tipo de ENUM informado.

Projeto
O projeto é do tipo ConsoleApplication e será usado o framework .Net Core 3.0
Agora vamos ao código? Go Go Go

Implementação da biblioteca Tools

Criar o projeto do tipo Console Application.

Criar um arquivo Enum.cs e colocar o código:

using System.ComponentModel;

namespace console_libs
{
    public enum Enviroment
    {
        Development = 1,
        [Description("Homologação")]
        Homologation = 2,
        [Description("Produção")]
        Production = 3
    }

    public enum ProcessingStatus
    {
        [Description("Aguardando")]
        Waiting = 1,
        [Description("Processado")]
        Processed = 2,
        [Description("Ocorreu um erro no processamento")]
        Error = 3
    }
}

Criar um arquivo Enumerators.cs e colocar o código:

using System;
using System.ComponentModel;

namespace console_libs.Tools
{
    public static class Enumerators
    {
        public static string GetDescription(this Enum value)
        {
            //Recuperando o tipo do enum
            var enumType = value.GetType();
            
            //Recuperando o nome do item do enum
            var field = enumType.GetField(value.ToString());

            //Recuperando o texto do enum
            var attributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false);

            //Senão tiver declarado o atributo Description é retornado o nome do item do enum
            return attributes.Length == 0 ? value.ToString() : ((DescriptionAttribute)attributes[0]).Description;
        }

        public static T GetEnum(string index) where T : Enum
        {
            //Dado o tipo do enum, é realizado o parse para um item válido dado o indice informado.
            return (T)Enum.Parse(typeof(T), index);
        }


    }
}

Na class program.cs do projeto console adicionar o código para testar as implementações:

static void Main(string[] args)
        {
            Console.WriteLine("/**********************************************************************************************/");
            Console.WriteLine("");
            Console.WriteLine("******** Retornando o Texto contido no atributo \"Description\" ou nome do item do ENUM *********");
            Console.WriteLine("");
            Console.WriteLine($"Texto do atributo \"Description\" do enum \"Enviroment.Homologation\" é {Enumerators.GetDescription(Enviroment.Homologation)}");
            Console.WriteLine("");
            Console.WriteLine($"Texto do atributo \"Description\" do enum \"Enviroment.Production\" é {Enumerators.GetDescription(Enviroment.Production)}");
            Console.WriteLine("");
            Console.WriteLine($"Para o enum \"Enviroment.Development\" foi retornado o nome do item que é {Enumerators.GetDescription(Enviroment.Development)} e não um texto, por que não foi declarado um atributo atributo \"Description\" a ele.");
            Console.WriteLine("");            
            Console.WriteLine("/**********************************************************************************************/");
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("/**********************************************************************************************/");
            Console.WriteLine("");
            Console.WriteLine("******** Retornando o item do enum fornecendo o indice e tipo de ENUM *********");
            Console.WriteLine("");
            Console.WriteLine($"Para o indice 1 do tipo \"ProcessingStatus\", retornou o {Enumerators.GetEnum("1")}");
            Console.WriteLine($"Para o indice 2 do tipo \"Enviroment\", retornou o {Enumerators.GetEnum("2")}");
        }

Agora vamos compilar o projeto pelo terminal executando:

dotnet build console-libs.csproj

Vai aparecer algo parecido com a imagem a seguir:
DotNet_Build

Agora vamos excutar o projeto pelo terminal executando:

dotnet console-libs.dll

Vai aparecer algo parecido com a imagem a seguir:
DotNet_Run

Código-Fonte: https://github.com/joaopauloit/libraries-helpers-csharper

Fontes:
https://docs.microsoft.com/pt-br/dotnet/core/tools/dotnet-new?tabs=netcore22
https://docs.microsoft.com/pt-br/dotnet/core/tools/dotnet-build
https://docs.microsoft.com/pt-br/dotnet/core/tools/dotnet-run?tabs=netcore30

Testes unitários com Tape em NodeJS

Importante: O objetivo aqui não é ensinar sobre Teste Unitário, TDD, NodeJS e bibliotecas usadas (além de Tape e Tape-Spec), mas qualquer dúvida entre em contato.

Fala pessoal, estava pesquisando sobre alguns componentes no NodeJS que auxilie na escrita de testes unitários e encontrei o Tape, então vou compartilhar com vocês o que aprendi. =)

O que é o Tape?
É um módulo npm que interpreta e executa testes unitários em JS.

Qual projeto vamos usar?
O projeto de exemplo será o “text-algorithms”, caso não o conheça, ele é destinado para a implementação de algoritmos para texto e vamos escrever testes para validar o algoritmo de palindromo.

Instalando o módulo Tape
No diretório raiz do projeto, digite o comando a seguir no terminal para instalar o Tape no projeto:
“npm install tape –save-dev”

Algo parecido com a imagem a seguir será exibido:
Npm-Install-Tape

Execute também o comando para intalação do módulo “tape-spec”:
“npm install tap-spec –save-dev”

Algo parecido com a imagem a seguir será exibido:
Npm-Install-Tape-Spec

Escrevendo o primeiro teste
Primeiro vamos criar um arquivo chamado “palindromo.test.js” e uma index.tst.js, a “index.tst.js” será acionada no terminal e vai executar o teste contido na “palindromo.test.js” que valida o algoritmo de palindromo com alguns asserts.
O diretório do projeto após as modificações, vai ficar assim:
DiretorioProjectUnitTestTextAlgorithmPalindromo

Agora vamos configura o package.json para quando for executado o comando “npm test” o node entenda que deve ser executado o arquivo “index.test.js”, o arquivo package.json vai ficar assim:

{
  "name": "textalgorithms",
  "version": "1.0.0",
  "description": "Text Algorithms",
  "main": "./bin/index.js",
  "scripts": {
    "test": "node ./bin/index.test | tap-spec"
  },
  "author": "João Paulo R. S.",
  "license": "MIT",
  "bin": {
    "textAlgorithms": "./bin/index.js"
  },
  "dependencies": {
    "boxen": "^4.0.0",
    "chalk": "^2.4.2",
    "tap-spec": "^5.0.0",
    "yargs": "^13.2.4"
  },
  "devDependencies": {
    "tape": "^4.11.0"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/joaopauloit/text-algorithms.git"
  },
  "bugs": {
    "url": "https://github.com/joaopauloit/text-algorithms/issues"
  },
  "homepage": "https://github.com/joaopauloit/text-algorithms#readme"
}

Foi incluido após o paipe o “tap-spec”, para que o módulo tap-spec seja executado para deixar o resultado do teste colorido e formatado.

O código da para testar o palindromo vai ficar no arquivo “palindromo.test.js” e será:

const test = require('tape')
const palindromo = require('../algorithms/palindromo')

function validatePalindromo(){
	test('Verificar se é palindromo', (t) => {
		t.assert(palindromo.isPalindromo("ovo") === true, "Ovo é um palindromo")
		t.assert(palindromo.isPalindromo("Test set") === true, "Test set é um palindromo")
		t.assert(palindromo.isPalindromo("To idiot") === true, "To idiot é um palindromo")
	 	t.assert(palindromo.isPalindromo("casa") === false, "Casa não é um palindromo")
	 	t.end()
	})
}

module.exports = {validatePalindromo}

Como podemos ver, na linha 4 foi declarado uma function chamada “validatePalindromo” que irá executar os asserts do teste declarado como “Verificar se é palindromo” para validar a function “isPalindromo” do arquivo “..algorithms/palindromo.js”, depois de declarados os asserts e acionado a function “end” para encerrar o teste.

O código para acionar o teste da “index.test.js” será:

const test = require('tape')
const palindromoTest = require('./tests/palindromo.test')

palindromoTest.validatePalindromo();

Na linha 1 estamos importando o módulo tape, na linha 2 importando o código da palindromo.test e na última linha executamos a function “validatePalindromo”.

Executando o teste
Para executar o teste, no diretório raiz do projeto, digite:
“npm test”

Se tudo ocorrer como esperado, será exibido algo parecido com isso:
ResultadoUnitTestPalindromo

Espero ter ajudado.
Abraços e até a próxima 😉

Links

Código-Fonte: https://github.com/joaopauloit/text-algorithms
Tape: https://www.npmjs.com/package/tape

Algoritmo simples para verificar um palíndromo

Importante: O objetivo aqui não é ensinar sobre NodeJS e as bibliotecas usadas, mas qualquer dúvida, vamos esclarecendo nos comentários.

Fala pessoal, recentemente estava conversando com um amigo sobre padrões de texto e ele citou um que eu não conhecia, que é o “Palíndromo”, mas o que é? É uma palavra, frase ou qualquer sequencia que seja possível ler da direita para esquerda ou da esquerda para a direita. Exemplo: ovo, asa, rir e etc. Então resolvi escrever uma aplicação console em JavaScript para identificar esse tipo de padrão =)

Vamos para o código? Go go go ahead 🙂

const chalk = require("chalk");
const boxen = require("boxen");

const boxenOptions = {
 padding: 1,
 margin: 1,
 borderStyle: "round",
 borderColor: "green",
 backgroundColor: "#555555"
};

// const msgBox = boxen( greeting, boxenOptions );
// console.log(msgBox);

const yargs = require("yargs");

const options = yargs
 .usage("Use: -w ")
 .option("w", { alias: "word", describe: "Digite uma palavara", type: "string", demandOption: true })
 .argv;

// const greeting = 'Hello, ${options.name}!';

// console.log(greeting);

var CheckIsPalindromo = function(word){

	if(!word){
		var greeting = chalk.white.bold('Digite uma palavra!');
	}
	else{

		var wordInverse = '';	
		for (var i = word.length; i >= 0; i--) {
		  wordInverse += word.charAt(i);
		}

		if(wordInverse == word){
		  var greeting = chalk.white.bold(`${wordInverse} é um palindromo!`);
		}
		else{
		  var greeting = chalk.white.bold(`${wordInverse} não é um palindromo!`);
		}
	}
	var msgBox = boxen( greeting, boxenOptions );
	console.log(msgBox);
}

CheckIsPalindromo(options.word);

Executando a aplicação no console temos os resultados a seguir:

rirEhPalindromo

ovoEhPalindromo

casaNaoEhPalindromo

Espero que tenha gostado. Abraços e até a próxima 😉

Links

Código-Fonte: https://github.com/joaopauloit/text-algorithms
Palindromo: https://pt.wikipedia.org/wiki/Pal%C3%ADndromo
Command-Line: https://developer.okta.com/blog/2019/06/18/command-line-app-with-nodejs

Resolvendo um HTTP 400 – Bad Request (Request Header too long) retornado por uma API em IIS

Fala pessoal, tudo em ordem? Espero que sim!
Hoje quero compartilhar com vocês uma dica para um problema que solucionei há alguns dias atrás de “Request Header too long”, que no inicio estava sendo mascarado como CORS pelo navegador, mas por que mascarado? Por que na api já estava desabilitado o CORS e mesmo assim estava dando erro de CORS e conversando com um amigo ele disse que nem sempre pode ser CORS e que seria melhor eu efetuar um teste mais a fundo e verificar de fato qual era o retorno que a api estava dando, então eu fiz o teste no POSTMAN e para nossa surpresa o erro era um HTTP 400 – Bad Request (Request Header too long).

Entendendo o problema.
Uma API hospedada em um servidor IIS estava com um tipo de HEADER para alguns usuários que o dado ultrapassava esses 16k, segundo o que pesquisei na internet é apontado que o IIS possui uma limitação de até 16k para armazenamento de dados no HEADER, ultrapassando isso é retornado o erro HTTP 400 – Bad Request Header too long.

O que foi feito para resolver?
Como não dava para diminuir o HEADER, tinhamos que estudar alguma maneira de aumenta-lo, após algumas pesquisas encontrei um material na internet que ajudou com um procedimento simples, mas que requer atenção nas etapas, após aplicado, efetuamos o teste e o problema foi solucionado.

Passos para solucionar o problema:

1. Abra o programa o editor de registros do windows, (Executar -> regedit.exe)
2. Abra o nó “HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters”.
3. No painel a sua direita, clique com o botão direito e selecione novo DWORD value.

regedit-01

4. Colocar o nome “MaxFieldLength”, valor “65534”, selecionar como base o Decimal e clique em OK.

regedit-02.png

5. Crie outro DWORD value usando mesmo procedimento com o nome “MaxRequestBytes”, valor “415028” e clique em OK.

regedit-03

6. Feche o editor de registro e abra como administrador o prompt de comando (i.e. right-click, run as administrator)
7. Digite o comando “net stop http”, confirme e aguarde o término do comando.
9. Digite o comando “net start http“ e aguarde o término do comando.
10. Digite o comando “iisreset”e aguarde o término do comando.
11. Teste agora, o IIS agora vai permitir um request superior aos 16k.

Espero que tenha ajudado. 🙂

Abraços e até a próxima.

Fonte:
https://docs.secureauth.com/pages/viewpage.action?pageId=14778828
https://support.microsoft.com/en-us/help/2020943/http-400-bad-request-request-header-too-long-response-to-http-request

Permissões em arquivo no Linux

Fala pessoal, tudo em ordem? Espero que sim!
Recentemente estava estudando sobre permissões em sistemas de arquivo linux (UNIX) e gostaria de compartilhar com vocês o que aprendi. Bora? Go Go Go 🙂

O que é CHMOD?
O comando chmod permite alterar as permissões de arquivo.

Como que funciona as permissões?
As permissões são controladas por dono, grupo ou todos, sendo para leitura, escrita ou execução.
Conforme tabela seguir:

| dono | grupo | todos|
| 4 2 1 | 4 2 1 | 4 2 1|
| r w x | r w x | r w x|
| 7 | 7 | 7 |

Como que executo o chmod?

Para o arquivo que se deseja conceder a permissão, você faz a soma de cada grupo de numeros.
(4+2+1) (4+2+1) (4+2+1) se for para todos ficando 7 7 7 e se deseja apenas leitura
(4+0+0) (4+0+0) (4+0+0) 4 4 4.

Executando “chmod 777 arquivo.txt” será concedido ao dono, grupo e todos, leitura, escrita e execução sobre o arquivo.
Se por acaso “chmod 700 arquivo.txt” será concedido ao dono para leitura, escrita e execução sobre o arquivo, entretanto grupo e todos não teram permissão.

Se eu quiser fazer um permissionamento recursivo (todos os arquivos no diretório e pastas)?

chmod -R 777 *

Neste exemplo o * indica tudo presente no diretório.

Espero que tenha ajudado. 🙂

Abraços e até a próxima.

Fonte: https://www.astro.princeton.edu/docs/chmod