sábado, 2 de dezembro de 2017

Javascript: Removendo tags HTML/XML

Dica rápido para remover as tags de HTML ou XML de uma string.

myString.replace(/<(?! *-*\d+)(?:.|\n)*?>/gm, '');

Nota: Como utilizamos Regex para realizar isso, pode-se utiliza a expressão regular para qualquer outra linguagem de programação que utilize Regex.

sexta-feira, 1 de dezembro de 2017

Javascript: Removendo múltiplos espaços

Dica rápido para remover múltiplos espaços de uma string e deixá-los com apenas um espaço em Javascript.

str = str.replace(/ +(?= )/g,'');

Nota: Como utilizamos Regex para realizar isso, pode-se utiliza a expressão regular para qualquer outra linguagem de programação que utilize Regex

quinta-feira, 31 de agosto de 2017

Inglês Técnico: Lista de Termos

Como programador, não é mais do que obrigação nós possuir um certo domínio na língua inglesa. A maioria dos cursos, certificados e conteúdo de qualidade está nesta língua. Entretanto, mesmo assim, alguns termos usados por nós em português podem nos escapar. Por isso que estou criando este post. Essa é uma postagem que vou atualizando conforme a necessidade que vou encontrando ou sugestões (e não se incomode se a lista estiver pequena por ora).

  • Chamado: Service Call, Ticket.
    Ex: Eu vou abrir um chamado.
    I will open a Service Call/ticket
  • {}


sexta-feira, 25 de agosto de 2017

Oracle: Como fazer um "Split" em uma string

O caso é simples: em um parâmetro de uma procedure, eu recebo uma sequencia de números separados por vírgula para ser usado em uma condição IN. Mas o problema é que Oracle não tem uma função que separa os números conforme as vírgulas. Como resolver isso? Você pode fazer o seguinte:

select 
    regexp_substr('SMITH,ALLEN,WARD,JONES','[^,]+', 1, level) 
from dual
connect by 
    regexp_substr('SMITH,ALLEN,WARD,JONES', '[^,]+', 1, level) is not null;

Isso vai separar as os itens em linhas de tabela. Você pode usar essa consulta na condicional do IN para indicar que o campo tem que estar naquela string.

quinta-feira, 24 de agosto de 2017

ASP.NET: Códigos ASP no HTML (ASPX)

As vezes estamos tão no automático que nem lembramos das outras opções que nós deveríamos usar. Foi no caso de eu estar editando um ASPX e inserir um código HTML gerado pelo back code. O problema foi que eu me acostumei a usar o "<%: comando %>", que fez o HTML aparecer no texto. Então vou deixar registrado aqui as outras sintaxes dos outros controles:

  • <% x %>: Indica trecho do código a ser processado no lado do servidor;
  • <%@ x %>: Indica uma Diretiva, ou seja, comandos que indica o que fazer com a página, como importar um script;
  • <%$ x %>: Indica acesso algum recurso, como uma propriedade no webconfig;
  • <%= x %>: Equivale ao comando Response.Write(), ou seja, escreve algo na página;
  • <%# x %>: Indica uma Databinding
  • <%-- x %>: Indica um comentário
  • <%: x %>: Escreve algo na página, mas codificando os caracteres como "<" ou ">" para aparecer na página.
No meu caso, como eu tinha usado a última opção, ele codificou os caracteres que marcavam as tags, fazendo que os mesmos aparecessem. Trocar para o quarto dessa lista resolveu o problema.

quarta-feira, 23 de agosto de 2017

C#/Oracle: Problemas com parâmetros de uma Stored Procedure

Estava eu programando no C# em um método que registra um cadastro no Oracle usando uma Stored Procedure. Por algum motivo, eu recebia uma Exception indicando problemas em converter um número e isso estava me incomodando, ainda mais porque as vezes o cadastro era executado com sucesso.
Então fui conferir os dados cadastrados e percebi que alguns dados estavam sendo registrado na coluna errada. Ah! Devo ter errado quando criei o Insert, mas quando fui conferir, estava tudo certo.
Foi então que percebi que o problema estaria nos parâmetros. Eu modifiquei a ordem em que era processado os parâmetros no C#, e a ordem coincidia com os dados trocados.
Foi aí que aprendi que para o Oracle DataAccess, mesmo especificando o nome do parâmetro que está inserindo, o que importa é a ordem dos dados que está sendo inserido.

sexta-feira, 18 de agosto de 2017

Oracle: Adicionando Dias/Horas/Minutos/Segundos ao um campo do tipo DATE

Algum tempo atrás, eu estava com problemas em verificar a diferença entre duas TimeStamps no MySQL. Um dos fatores que registrei foi as inúmeras soluções bizarras que as pessoas fizeram para contornar o problema, que envolviam dividir, e multiplicar os tempos, soma, converte, e dá-lhe gambiarras incompreensíveis. Algo parecido aconteceu comigo agora pouco, mas com Oracle.

O problema foi o seguinte: tenho um dado "Date" e preciso adicionar x minutos. Pesquisei, e a maioria dá uma resposta mirabulante, pega um dia, divide pelo números de segundos de um dia, multiplique por x, converte, desconverte, e fica um código feio, deselegante e cheia de cálculos que se você não sabe do que se trata, vai demorar para entender. Funçando um pouco na documentação, acho algo simples que resolve este problema: a função NUMTODSINTERVAL.

Deixa eu mostrar com um exemplo:

SYSDATE + NUMTODSINTERVAL(60,'MINUTE')

Simples e elegante. O SYSDATE representa o meu dado do tipo DATE, que no exemplo, pega a data e hora do sistema. Adicionando com essa função, na qual estou adicionando 60 minutos. Troca o "+" por "-", você subtrai. E também, no segundo parâmetro, além do 'MINUTE' posso alterar para 'DAY', 'HOUR' e 'SECOND'. Sem converter, sem nada.

Então fica a dica.

quarta-feira, 9 de agosto de 2017

Arquivo de Casos Inexplicáveis: Entity Framework e Stored Procedure

Quando criei esse blog, a intenção é registrar as minhas experiências para consultas futuras. A maioria dos casos são de situações que não é tão fácil de se encontrar, até mesmo na Internet, ou coisas que só a experiência pode te ajudar.
Em todos os casos, existia um problema e uma solução lógica, mas acabou de acontecer comigo,  um problema que resolveu de uma maneira tão inusitada e ilógica, que vale a pena documentar. Mas como é algo que não sei como explicar o motivo, criei essa nova seção: O Arquivo de Casos Inexplicáveis.
Não é a primeira vez que tenho um Caso Inexplicável, mas acho interessante começar a registrá-los. Mas chega de enrolar, e vamos ao caso.

Estava realizando uma modificação em um módulo aqui onde trabalho e precisei modificar uma Stored Procedure num banco SQL Server. Então, para ter certeza que as modificações estavam fazendo efeito, tive a ideia: vou deixar um breakpoint onde é executado a Stored Procedure (SP) no código e verificar o que retorna pelo debugger.
Aí começou meu inferno, depois de atualizar o Entity Framework para aceitar a nova SP, e testar, sempre que tentava visualizar o seu dado, via que a execução deu um erro e quando deixava passar, uma Exception era lançada.
Não entendi nada, deletei a SP, atualizei a Entity Framework e reinseri a SP, para adicioná-la novamente, restaurava o código do repositório, testava a SP no próprio banco de dados, e nada resolvia o erro.
Até que, por um motivo, eu resolvi tirar o breakpoint. A partir daí, o módulo voltava a sua execução normal com a SP modificada. Eu não sei a razão do Entity Framework bugar quando tento depurar, aliás, esses tipos de bugs tem até um nome que o classifica: Heinsenbug, ou seja, a tentativa de eu tentar verificar o problema altera o comportamento do objeto a ser observado.
Entretanto, esse Heinsenbug é um problema do Entity Framework, então, acredito que não tem muito que eu possa fazer.

quinta-feira, 3 de agosto de 2017

C#/Entity Framework: Bug ao atualizar o modelo => Duplicação de Código

Um bug que aconteceu comigo: estava tentando adicionar uma tabela do banco para o modelo, entretanto, quando a tabela é adicionada, ao atualizar os códigos internos do framework, acontecia um bug: basicamente o código gerado ficava duplicado, triplicado, n-plicado.

Descobri que o problema era causado porque a tabela em questão possuía um campo do tipo "TEXT". Alterei a tabela para VARCHAR(4000) e funcionou de boa.

Moral da história: Não use campo do tipo TEXT se for usar Entity Framework.

segunda-feira, 19 de junho de 2017

C#: Desenvolvendo Serviços Windows

Olá, hoje vamos ver como desenvolver serviço para Windows usando o C# no Visual Studio e entender o seu ciclo de vida.

quarta-feira, 14 de junho de 2017

ASP.NET: ThreadAbortException

Olá. Vamos ao caso de hoje: em um projeto que trabalhei de um site em ASP.NET, existe uma página que é basicamente um relatório, contendo uns resumos dos dados de um mês, colocado em um monte de gráficos. Então, em um desses relatórios em que se tinha acumulado muito dados, começou a dar um erro estranho, um “Time Out [Internal Error]”. A princípio achei que era o banco de dados, que deveria ter muitos dados e deu Time Out, mas quando executei, tinha apenas um pouco menos de mil registros, logo não poderia acontecer.


terça-feira, 6 de junho de 2017

Uilidades: Web APIs gratuitos, mas que podem vir a calhar

Você está montando um aplicativo, site, qualquer outra coisa, e você quer testar a funcionalidade deste elemento que você está desenvolvendo, ou até mesmo, incluir dados interessantes. O problema é que as vezes, esses dados são numerosos, ou voláteis demais para manter no aplicativo, ou você só quer para testar, e acaba não valendo o esforço.
Mas não se preocupe, temos algumas soluções para você: vamos listar algumas Web API que podem ser bem úteis:

segunda-feira, 5 de junho de 2017

Utilidades: Ferramenta para Diagramas e Fluxogramas

Para quem precisa de uma ferramenta para criar diagramas e fluxogramas, mas não tem paciência para baixar, instalar, etc, recomendo a ferramenta Draw.io. Ele possui tudo o que um bom editor de diagramas precisa ter, com uma interface fácil de utilizar.

terça-feira, 4 de abril de 2017

Android: Como fazer um Toast

Toast são aquelas mensagens rápidas que o programa emite para notificar algo, mas que não precisa de confirmação ou interação, como por exemplo, uma conexão perdida. Para fazer um toast, segue o método estático makeText da classe Toast:

Toast t = Toast.makeText(context, message, duracao );

onde:

  • context: é o Contexto do aplicativo;
  • message: é a mensagem que deseja ser exibida;
  • duracao: é o tempo que deseja que seja exibida, podendo ser as constante: Toast.LENGTH_SHORT ou Toast.LENGTH_LONG;
Para exibir o Toast, invoque o método show(), e ele aparecerá na tela:

t.show();

segunda-feira, 3 de abril de 2017

Android: Usando o Log

Log provavelmente é uma das coisas mais importante a fazer em um programa, ao mesmo tempo que é um dos mais negligenciados. Um sistema de Log bem feito permite você saber o que aconteceu, onde aconteceu e até como aconteceu. No Android, já existe a classe Log, onde você pode utilizar e o melhor, ainda poderá analisar nas próprias ferramentas de desenvolvimento.

No Android, temos os seguintes níveis de log:

  • WTF: significa "What a Terrible Failure", serve para criar um log com informação de erros que nunca deveria ocorrer durante a execução. Executando esse tipo de log, o programa será encerrado. Pode ser executado pelo método estático Log.wtf(string tag, string message)
  • Error: Indica um erro. Pode ser executado pelo método estático Log.e(string tag, string message);
  • Warn: Indica um aviso. Pode ser executado pelo método estático Log.w(string tag, string message);
  • Info: Indica uma informação. Pode ser executado pelo método estático Log.i(string tag, string message);
  • Debug: Indica uma informação de depuração. Pode ser executado pelo método estático Log.d(string tag, string message);
  • Verbose: Usado quando precisa de dados muito pontuais. Pode ser executado pelo método estático Log.v(string tag, string message);
Mais informações, ver a documentação.

quinta-feira, 30 de março de 2017

JQuery e Checkbox

Dos tipos que a tag "<input>" pode assumir, um dos mais excêntricos é o Checkbox. Não importa se usa PHP, .NET, Javascript e é claro que no JQuery não foi diferente. Usar o método "val" não vai verificar se ele foi selecionado nem alterar o estado dele. Enfim, como tratar esses dados?

Para verificar se o checkbox está checkado ou não:
$("#checkboxX").is(':checked')

Para mudar a seleção do checkbox:
 $("#checkboxX").prop('checked', true);
 $("#checkboxX").prop('checked', false);

quarta-feira, 29 de março de 2017

JQuery: Verificando se o elemento existe

Estava eu, trabalhando com um formulário dinâmico quando deparo na seguinte situação: precisava iterar por uma série de elementos, mas não tinha como saber de antemão quantos elementos tem. Como os ids eram gerados num padrão, é fácil mapear, mas eu precisava achar um ponto de parada. Aí que a coisa complicou: o JQuery não retorna um null, false, ou algo que identifique que tal elemento não existe.

Pesquisando, encontrei uma gambiarra para isso, já que o JQuery não diz diretamente se o elemento existe, mas você ainda pode tentar acessar o elemento ou alguma propriedade, estas sim vão retornar um null ou undefined ou qualquer valor equivalente ao false numa condicional.

O código que verifica se um elemento JQuery existe ou não é o seguinte:

if($("#elementoX")[0]){
  //O elemento existe
}else{
  //O elemento não existe
}

terça-feira, 14 de fevereiro de 2017

Guia Rápido: CSV

O que é CSV?
Comma-Separated Values (Valores Separado por Vírgula) é um formato de texto utilizado para representar planilhas. É muito utilizada principalmente para importação/exportação de dados entre um aplicativo de planilha eletrônica e algum outro aplicativo.

Estrutura
Cada linha do arquivo de texto é uma linha da planilha. Os valores de cada coluna da linha são separadas por um caractere separador. Apesar do nome CSV dar a entender que o separador é uma vírgula, qualquer caractere pode ser usado como separador.

Exemplo:
Um arquivo CSV com 4 colunas e 5 linhas.

E-mail,Nome,Sobrenome,Ramal
machado@autorbrasileiro.com.br,Machado,Assis,123
clarisse@autorbrasileiro.com.br,Clarisse,Linspector, 124
amado@autorbrasileiro.com.br,Jorge,Amado,125
coelho@autorbrasileiro.com.br,Paulo,Coelho,126

sexta-feira, 6 de janeiro de 2017

DataTables: Modificar cabeçalho de uma coluna

Olá, pessoas! Mais uma dica de programação, hoje para quem utiliza o plugin DataTables para JQuery, Existe alguns tipos de tabelas que me deparei em que o cabeçalho dele muda de acordo com algum parâmetros. Por exemplo, quero ver dados de um período de 3 meses a partir do mês X, e depois quero ver os mesmos dados só que a partir do mês Y. O fato é que para atualizar os dados é fácil, entretanto, o plugin não atualiza o cabeçalho da tabela, sendo que isso precisa fazer manualmente. Bem, para isso achei um algoritmo fácil que resolve o problema.