Novos recursos do C# 6.0 – interpolação de strings

A versão 6.0 do C# introduziu um novo recurso “Interpolação de String”, que nos oferece maior controlo no formato de strings e de forma mais fácil.

Antes desse recurso quando queríamos fazer isso tínhamos de usar marcadores numerados como {0}, que tinham que estar alinhados com argumentos fornecidos separadamente:

string str = String.Format("{0} trabalha na empresa {1}", nomeUsuario, nomeEmpresa);

Interpolação de strings permite-nos colocar as expressões corretas no seu lugar:

string str = "\{nomeUsuario} trabalha na empresa \{nomeEmpresa}";

Ou simplesmente

string str = $"{nomeUsuario} trabalha na empresa {nomeEmpresa}";
Podemos usar também especificadores de alinhamento e formatos opcionais:
string str = $"{nomeUsuario,30} trabalha na empresa {nomeEmpresa} à {anosEmpresa:D3} ano{s}";

Podemos também usar qualquer expressão com variáveis como:

string str = $"{nomeUsuario} que trabalha na empresa {nomeEmpresa} é {(anosEmpresa > 5 ? "elegível para promoção" : "não elegível para promoção")}";

Observem que a expressão condicional está entre parênteses, de modo que a condição não se confunde com um especificador de formatação da string.

Então, espero que gostem deste novo recurso do C# 6.0 e que comecem a usar a interpolação de strings.

Como e quando usar o Parallel.ForEach em vez Foreach?

Antes de mais, uma pequena explicação do que é um loop foreach e um Parallel.ForEach Foreach loop: 1. As iterações são feitas por ordem sequencial uma a uma; 2. É executado numa única Thread; 3. Está definido em todas as versões do framework .NET; 4. Execução lenta; Parallel.ForEach: 1. Execução ocorre de forma paralela; 2. Parallel.ForEach utiliza múltiplas Threads; 3. Parallel.ForEach foi definido apenas na versão .NET 4.0 e superiores; 4. Execução rápida;

Quando usar o Parallel.ForEach

O principal motivo para o uso do PFX é programação paralela: tirando partido dos processadores multicore para acelerar um processamento código intensivo. Um desafio em tirar partido dos multicores é a lei de Amdahl, que afirma que o ganho de desempenho que pode ser obtido melhorando uma determinada parte do sistema é limitado pela fração de tempo que essa parte é utilizada pelo sistema durante a sua operação. Por exemplo, se apenas dois terços do tempo de execução de um algoritmo é parallelizable, podemos nunca ultrapassar um ganho de desempenho três vezes – mesmo com um número infinito de núcleos. Isto porque, o ganho depende de dois fatores: 1. Fração de melhoria (Fm): fração de tempo da computação que pode tirar proveito da melhoria feita. Esta fração é sempre menor ou igual a 1. 2. Ganho de execução (Ge): ganho obtido com a melhoria na parte específica modificada do sistema. Este ganho é sempre maior que 1. Então, antes de prosseguir, convém verificar se o gargalo está realmente no código parallelizable. Também vale a pena considerar se o código precisa ser dessa intensidade computacional, visto que muitas vezes a otimização é a abordagem mais fácil e eficaz. Há um senão uma vez que algumas técnicas de otimização podem tornar mais difícil de paralelizar código. Os ganhos mais fáceis vêm com o que é chamado  de problema”Embaraçosamente Paralelo” (Embarrassingly Parallel), isto é, um problema que sua solução pode ser dividida em várias partes independentes, sem que seja necessária uma sincronização entre elas para chegar à solução final. Problemas, ou sistemas, embaraçosamente paralelos permitem que tarefas sejam executadas simultaneamente com pouca ou nenhuma necessidade de inter-coordenação. Exemplos incluem muitas tarefas de processamento de imagem, abordagens de força bruta em matemática ou criptografia. Um exemplo de um problema não embaraçosamente paralelo (Non Embarrassingly Parallel) consiste em implementar uma versão otimizada do algoritmo quicksort.

Exemplo de uso do Parallel.ForEach

O exemplo a seguir demonstra claramente a diferença entre o loop foreach e o Parallel.ForEach.

using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace ExemploParallelForEach {
    class Programa {
        static void Main() {
            string[] cores = {
                "Rosa",
                    "Laranja",
                    "Castanho",
                    "Amarelo",
                    "Preto",
                    "Branco",
                    "Cinza",
                    "Azul",
                    "Verde",
                    "Vermelho"
            };
            Console.WriteLine("loop foreach \n");
            var sw = Stopwatch.StartNew();
            foreach(string color in colors) {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            }
            Console.WriteLine("loop foreach tempo de execução = {0} segundos\n", sw.Elapsed.TotalSeconds);
            Console.WriteLine("Parallel.ForEach");
            sw = Stopwatch.StartNew();
            Parallel.ForEach(colors, color = > {
                Console.WriteLine("{0}, Thread Id= {1}", color, Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(10);
            });
            Console.WriteLine("Parallel.ForEach() tempo de execução = {0} segundos", sw.Elapsed.TotalSeconds);
            Console.Read();
        }
    }
}

Loop foreach tempo de execução = 0.1054376 segundos Parallel.ForEach tempo de execução = 0.055976 segundos

Java VS DOT NET

Não é de hoje nem de ontem que a rivalidade entre java vs dot net é levantada. Como Mac VS Windows, Sporting VS Benfica, cada um tende a defender aquilo que gosta.

Eis aqui um trailer de um filme que poderia prometer muito 😛

Enviar Notificações por Email de Erros de Imagens Com jQuery e PHP

É sempre bom corrigir os links das imagens quebradas o mais rapidamente possível, porque pode prejudicar a credibilidade de um site. E pior ainda é ter um utilizador a falar sobre isso. Utilizando o jQuery e o PHP, podes fazer com a tua página envie notificações por email desses erros.

O PHP

if(isset($_POST['imagem']))
{
	$para = 'erros@TeuDominio.com';
	$de = 'noreply@TeuDominio.com';
	$assunto = 'Imagem com Link Quebrado';
	$conteudo = "Foi detectada uma imagem com o link quebrado!\\n\\nEndereço da Imagem:  ".stripslashes($_POST['imagem'])."\\n\\nQue está na página:  ".stripslashes($_POST['pagina']);
	$resultado = mail($para,$assunto,$conteudo,'De: '.$de."\\r\\n");
	die($resultado);
}

Mantenho o email simples e directo ao que pretendo, ou seja, conter o atributo src da imagem e a página que foi solicitada.

O jQuery

$(document).ready(function() {
	$('img').error(function() {
		$.post('ajax-erro-imagem-jquery.php', {
			imagem: $(this).attr('src'),
			pagina: window.location.href
		}, function() {
			//Esconde a imagem?
		});
	});
});

Por cada imagem, esperamos o evento. Quando acontece algum erro com a imagem, se ela não aparecer, uma chamada AJAX acciona o script PHP.

Claro que, se a página tiver muito tráfego, até que corrijas o link da imagem, irás receber vários emails. Podes, no entanto, optar por guardar o erro numa tabela da Base de Dados e verifica-la regularmente, ou criar uma pequena secção no BackOffice para a gerir.

Mudar de Domínio mas Manter o Tráfego – HTACCESS Redirect 301

Mudar de domínio é uma grande decisão, e por vezes muitas pessoas não o fazem com medo de perder tráfego no seu site. Porém é possível, através de um simples ficheiro .htaccess manter os utilizadores, RSS Feed, e tráfego oriundo de motores de pesquisa.

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://novodominio.com/$1 [R=301,L]

O ficheiro .htaccess acima, quando colocado no antigo domínio redirecciona o utilizador para o mesmo URL mas no novo domínio.

Rápido, simples e funcional usando a funcionalidade do Redirect 301.