quinta-feira, 18 de setembro de 2014

Java 9: Última lista de funcionalidades

Introdução

imageO Java 8 teve o seu lançamento em Março 2014 e teremos entrado no habitual ciclo de 2 anos para um novo lançamento. O Java 9 irá, alegadamente, ser lançado em 2016.

A comunidade OpenJDK está fervilhante e acaba de ser publicada uma lista inicial de JEPs (JDK Enhancement Proposals) para a nova versão e alguns JSRs (Java Specification Requests) já estão a ser trabalhados.

Algumas das principais novidades são: o projecto Jigsaw, melhorias significativas de desempenho e algumas APIs muito aguardadas, como atualizações da Process API, JSON como parte do java.util e uma API para tratamento de dinheiro.

Para aqueles que queiram estar na crista da onda, os builds do JDK 9 já estão disponíveis aqui.

Nota: este artigo refere-se à lista de funcionalidades actualizada até 09-Set-2014

Conteúdo

Projecto Jigsaw - código fonte modular

O objetivo do Projecto Jigsaw é tornar o Java mais modular e dividir o JRE em componentes interoperáveis​​. Esta JEP é o primeiro de quatro passos para o Jigsaw e não vai alterar a estrutura actual do JRE e JDK. O objetivo deste passo é reorganizar o código fonte do JDK em módulos, melhorar o sistema de build para compilar módulos e impor limites aos módulos, em tempo de compilação. O Jigsaw foi originalmente planeado para o Java 8, mas foi adiado e redirecionado para o Java 9.

Mais sobre a JEP 201

Actualizações Process API

Até agora tem havido uma capacidade limitada para o controlo e gestão de processos do Sistema Operativo com o Java. Por ex., hoje, para fazer algo tão simples como obter o PID do processo hoje, é necessário aceder a código nativo ou usar algum tipo de workaround. Pior do que isso, será necessária uma implementação diferente para cada plataforma, de modo a garantir que está a receber o resultado certo.

O objectivo é ter algo como isto (que também suporte todos os sistemas operativos):

System.out.println ("O pid é" + Process.getCurrentPid ());

A actualização vai estender a capacidade do Java interagir com o sistema operativo: novos métodos diretos para lidar com PIDs, nomes de processos e estados, capacidade de enumerar JVMs e processos e muito mais.

Mais sobre a JEP 102

JSON API leve

Já existem alternativas disponíveis para lidar com o JSON em Java. A novidade com esta API é que o JSON se tornaria parte integrante da linguagem, seria leve e usaria os novos recursos do Java 8. Para além disso, o JSON seria disponibilizado directamente através do package java.util (Ao contrário do JSR 353, que usa um package externo ou outras alternativas).

Mais sobre a JEP 198

API para divisas e dinheiro

Após uma nova API de Data e Hora, introduzida no Java 8, a nova versão irá trazer uma nova API oficial para representar, transferir e efectuar cálculos com dinheiro e divisas. Para saber mais sobre esta API, deve consultar o projecto JavaMoney no GitHub. Eis alguns destaques:

- Dois novos tipos: Money e FastMoney:

Money amt1 = Money.of(10.1234556123456789, "USD"); // Money is a BigDecimal
FastMoney amt2 = FastMoney.of(123456789, "USD"); // FastMoney is up to 5 dec places
Money total = amt1.add(amt2);

- Formatar dinheiro de acordo com o país:

MonetaryAmountFormat germanFormat =
    MonetaryFormats.getAmountFormat(Locale.GERMANY);

System.out.println(germanFormat.format(monetaryAmount)); // 1.202,12 USD

Mais sobre o JSR 354

Melhorias de gestão de Locks

A contenção de locks é um gargalo de desempenho em muitas aplicações multi tarefa em Java. A proposta foca-se em melhorar o desempenho dos monitores de objectos Java, medido por diferentes benchmarks.

Este tipo de testes de stress puxam a JVM ao limite e tentam determinar a taxa de transferência máxima que se pode alcançar, geralmente em termos de mensagens por segundo. A ambiciosa métrica de sucesso para esta JEP é uma melhoria significativa em 22 benchmarks diferentes. Se o resultado for alcançado, estas melhorias de desempenho serão incluídas no Java 9.

Mais sobre a JEP 143

Cache de código segmentada

Outra melhoria de desempenho no Java 9 vira do compilador JIT. Quando certas áreas de código são executadas rapidamente, a JVM compila-as para código nativo e armazena-as na cache de código. Esta proposta visa segmentar a cache de código para diferentes áreas de código compilado, de forma a melhorar o desempenho do compilador.

Em vez de uma única área, a cache de código será dividida em 3:

  • O código que vai ficar para sempre na memória cache (interno à JVM / código non-method)
  • Tempo de vida curto (código perfilado, específico a um determinado conjunto de condições)
  • Potencialmente de longa vida (código não perfilado)

Mais sobre a JEP 197

Smart Java Compilation – fase 2

A ferramenta Smart Java Compilation, ou sjavac, foi trabalhada pela primeira na JEP 139, a fim de melhorar a velocidade de construção do JDK por ter o compilador javac a ser executado em todos os núcleos. Nesta proposta, entra na Fase 2, onde será melhorada e generalizada para que possa ser usada como padrão e construir outros projetos que não apenas o JDK.

Mais sobre a JEP 199

Outras novidades prováveis

Para além das funcionalidades anteriores, que já estão a ser desenvolvidas, é provável a inclusão das seguintes:

- Cliente HTTP 2 (JEP 110)

- Projecto Kulla - REPL in Java (Read Evaluate Print Loop)

quarta-feira, 17 de setembro de 2014

C# 6.0 (vNext) – Novas funcionalidades

Introdução

Vai-se aproximando o lançamento da nova versão da linguagem C# 6.0 (vNext) e muitos já estarão a pensar se devem adoptar a nova versão de imediato ou se devem aguardar algum tempo até ver se vale mesmo a pena.

Para dar uma ajuda, temos hoje um artigo sobre algumas das características e novas funcionalidades do C# vNext [1].

Para começar, a primeira novidade é que o novo compilador será open source. É verdade! Já se pode obter o código fonte da nova plataforma .NET Compiler Platform (“Roslyn”). A Microsoft já está a disponibilizar no CodePlex duas versões preview da nova plataforma de compiladores, uma para o Visual Studio 2013 e outra em conjunto com a versão preview também do seu novo IDE de desenvolvimento. Ambas as versões podem ser obtidas aqui.

[1] actualizadas até 10-Set-2014

Conteúdo

Primary Constructors

Os primary constructors são uma abreviação sintática para a criação de um construtor que automaticamente atribui valores a variáveis privadas de instância.

Actual

public class Point
{
    private int x, y;

    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

vNext

public class Point(int x, int y)
{
    private int x, y;
}

Melhorias nas Auto Properties

As melhorias consistem numa abreviação sintática para a criação de auto properties readonly e inicializadores.

Actual

public class Pessoa
{
    private string _nome = "Henrique";
    private string _apelido ="Rodrigues";

    public string Nome
    {
        get { return _nome; }
        set { _nome=value; }
    }

    public string Apelido
    {
        get { return _apelido; }  
    }
}

vNext

public class Pessoa
{
    public string Nome { get; set; } = "Henrique"

    public string Apelido { get; } = "Rodrigues"
}

Utilização de membros Static

Mais uma abreviação sintática, que permite utilizar os membros estáticos de uma classe (mesmo os extension methods) sem necessitar de referenciar explicitamente a classe. Basta indicá-la numa expressão using.

Actual

using System;

namespace vNext
{
    public class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hellow World");
        }
    }
}

vNext

using System.Console;

namespace vNext
{
    public class Program
    {
        static void Main(string[] args)
        {
            //usar o mtodo writeLine da classe Console
            //sem especificar o nome da classe
            WriteLine("Hellow World");
        }
    }
}

Expressões de declaração

Mais uma abreviação sintática, que permite declarar uma variável no meio duma expressão.

Actual

long id;
if (!long.TryParse(Request.QureyString["Id"], out id))
{ }

vNext

if (!long.TryParse(Request.QureyString["Id"], out long id))
{ }

Inicialização de Índices e de Dicionários

Nota: os inicializadores de índices (Index Initializers) – sinal $ - já tinham sido previamente previstos, mas não funcionam na CTP atual.

A inicialização de dicionários e outros objectos com indexadores é pouco elegante. Temos agora uma melhoria sintática que permite fazer esta inicialização duma forma mais clara.

Actual

Dictionary<string, string> antigo = new Dictionary<string, string>()
    {
        { "Portugal", "Lisboa" },
        { "Angola", "Luanda" },
        { "EUA", "Washington" }
    };

vNext

Dictionary<string, string> novo = new Dictionary<string, string>()
    {
        ["Portugal"] = "Lisboa",
        ["Angola"] = "Luanda",
        ["EUA"] = "Washington"
    };

Melhorias no tratamento de Excepções 

No tratamento de excepções, temos duas novidades:

  • Filtros de excepção (Exception Filters)
  • Chamadas assíncronas em blocos catch (await)

Exception Filters

try
{
    throw new Exception("Eu");
}
catch (Exception ex) if (ex.Message == "Tu")
{
    // este bloco no executa
}
catch (Exception ex) if (ex.Message == "Eu")
{
    // este bloco executa
}

await em blocos catch

try
{
    DoSomething();
}
catch (Exception)
{
    await LogService.LogAsync(ex);
}

Conclusões

Ao considerar apenas estas alterações de linguagem, percebemos que não há nada de particularmente revolucionário no C# 6.0. A grande novidade é mesmo a do compilador ser disponibilizado como open source.

Esta versão não vai revolucionar a codificação do C#, mas isso não significa que não tenham sido feitos progressos reais na eliminação de algumas ineficiências de codificação. Depois de se começar a usar estas novas funcionalidades, no dia-a-dia da programação, rapidamente se vão tornar como certas, como um dado adquirido.

Referências

http://msdn.microsoft.com/en-us/magazine/dn683793.aspx

https://roslyn.codeplex.com/

Language feature implementation status

C# feature descriptions

sábado, 6 de setembro de 2014

Super-Homem vs Batman: a versão Agile

Eu costumava ser o Super-Homem.

Eu podia fazer o que quisesse, e ninguém me dizia que estava errado. E por um bom motivo: geralmente eu NÃO estava errado.

Eu não nasci Super-Homem. Eu trabalhei muito para chegar lá. Eu aprendi muito. Eu liderava pelo exemplo. E quando me tornei na pessoa mais inteligente do sítio, aquele que realmente realiza coisas, eu tornei-me no Super-Homem.

E deixem-me dizer-vos uma coisa, sabia muito bem!

Mas é bom para o negócio?

Todos temos a noção do chamado “factor autocarro” - o número de pessoas que, se for atropelado por um autocarro, pára um projecto. Os Super-Homens tendem a deter o conhecimento que as outras pessoas não têm. Talvez seja ego ou competição, ou talvez seja apenas porque os outros não querem deter esse conhecimento. As pessoas estão seguras de que, se acontecer alguma coisa, o Super-Homem vai aparecer e salvar o dia. Só que às vezes, o Super-Homem não está. E então temos problemas.

 

Mas ainda pode ser pior.

O Super-Homem pode estar errado. E quando o Super-Homem comete um erro, ele pode ser um erro crucial para a organização.

Se o nosso Super-Homem é um arquitecto, e ele tomar uma má decisão de arquitectura para todo o projecto, pode custar milhões. Ou, se ela é uma team-leader e decidir aplicar um novo processo na equipa, um mau processo pode causar à equipa diminuir o ritmo e, por vezes, desagregar-se.

Bendito companheiro, Batman!

Nenhum de nós é à prova de erro. Mesmo se nós próprios ou os outros nos digam o contrário..

O Agile propõe ciclos curtos de feedback. O feedback é um bom começo, mas não é o suficiente.

As pessoas chegam ao trono do Super-Homem devido à sua especialização. Nós tendemos a valorizar a especialização em ambientes baseados em conhecimento. Para conseguirmos discutir alguma coisa com o Super-Homem, precisamos subir suficientemente alto, até ao seu nível, ou pelo menos a um nível em que ele repare em nós e leve a nossa opinião a sério.

Em suma, nós não precisamos do Super-Homem. Precisamos é do Batman e Robin.

Mas isto não é fácil, sob o ponto de vista organizacional. Imagine quanto tempo levou para fazer um super-herói, e trazê-lo para este nível. Agora temos dois?

Isto funciona como em qualquer outro sistema com um único ponto de falha. É pura gestão de risco. Se estiver ciente do risco, então pode agir.

As organizações que gerem bem os seus riscos, não só sabem quem são os seus super-homens, como também colocam pessoas fortes e inteligentes ao lado deles, para incentivar a discussão e para contrariar os seus superpoderes.

O Super-Homem pode não gostar, mas não faz mal. Afinal, você precisa é do Batman.

 

Tradução livre do artigo “Superman vs. Batman: The Agile Version”, de Gil Zilberfeld.

5 Hábitos que causam Stress (e como quebrá-los)

Levante a mão se no final de cada dia se sente esgotado(a).

Entre o trabalho, a casa e a vida, a realidade é que a maioria de nós acaba por andar a correr na maior parte do dia. No caso das mulheres é muitas vezes pior, com as tarefas extra a que estão, normalmente, obrigadas.

A questão é que estamos “stressados”.

Apesar de ter sido demonstrado que algum “stress intermitente" pode aumentar a produtividade e ajudar o cérebro a adaptar-se, o stress crónico pode afetar a saúde e aumentar o risco de obesidade, doenças cardíacas e depressão.

É claro que todos nós nos queremos sentir mais relaxados e calmos – isto é um dado adquirido, mas o difícil é saber por onde começar. Neste artigo damos uma ajuda.

Apresentamos 5 hábitos do quotidiano diário que podem causar stress desnecessário, bem como alguns ajustes que irão ajudá-lo(a) a relaxar e sentir-se melhor.

Procrastinação

A questão

Quando adia alguma coisa, o suspense de iniciar a tarefa cresce e cresce. Nem sequer consegue aproveitar o tempo livre extra antes de começar a trabalhar, porque está a agonizar sobre ter que começar.

A correcção

Em vez de ver o que quer que seja que está a procrastinar como uma uma tarefa enorme, tente dividi-la em pequenos pedaços. Certifique-se que o primeiro passo seja tão pequeno que já não pareça assustador.

Se tem vindo a adiar, p.ex., controlar o valor em dívida do seu cartão de crédito, o primeiro passo pode ser fazer o login no site do banco e ver o saldo. Se começar o seu dia a dar início a uma grande tarefa, ficará surpreendido(a) com o quão produtivo o resto do dia será.

Excesso de Agendamento

A questão

Conheço bem este hábito. Costuma deixar zero minutos de margem de manobra na sua já sobrecarregada agenda e, inevitavelmente, algo não vai correr a 100%. O metro está uns minutos atrasado, apanhou demasiado trânsito, ou uma chamada arrasta-se tempo demais e agora está atrasado(a) para o resto do dia. A parte engraçada é que, como com qualquer hábito, nós continuamos a fazer e a fazer o mesmo. É automático.

A correcção

Pratique o deixar algum espaço na sua agenda e programação diária.

Cinco minutos extra podem parecer muito tempo e salvar-nos de nos sentir como se estivéssemos a correr atrás das tarefas, o dia inteiro. Aqueles que se vão reunir consigo também vão agradecer quando conseguir realmente chegar a tempo.

Excesso de Pensamento

A questão

Quando somos confrontados com uma decisão, grande ou pequena, queremos fazer a escolha "certa". Por vezes, a pesquisa e diligência ajudam-nos a escolher bem, mas, independentemente da decisão, o que não nos faz bem é matar a cabeça durante horas e pode-nos causar uma grande quantidade de stress desnecessário.

A correcção

Defina um limite de tempo para cada decisão e, em seguida, desligue-se completamente do assunto. Pode analisar decisões passadas para fins de evolução e aprendizagem, mas por outra razão, não olhe para trás! Ruminar sobre o que poderia ter dito ou ter feito de forma diferente não muda o que aconteceu e desperdiça energia e tempo precioso. A definição de um limite de tempo e cumpri-lo tornará a tomada da decisão muito menos stressante.

Questionar-se

A questão

Nós tomamos uma decisão da melhor maneira possível, com as informações de que dispomos. Aquilo que sabe, pode mudar e evoluir à medida que aprende mais sobre as circunstâncias e se vai sentindo mais confortável com o que você está a fazer.

A correcção

Saiba que está a fazer a escolha certa para si, naquele momento e isso é tudo o que pode fazer! Questionar-se não vai mudar o que está feito e pode deixá-lo(a) louco(a).

Tentar ser perfeito(a)

A questão

O objetivo de crescer e de se tornar melhor é uma coisa, mas a perfeição é uma meta impossível de atingir, que nunca vai acontecer.

A correcção

Porquê gastar tempo a agonizar sobre aquele 1% que não é perfeito, ao invés de desfrutar o sucesso dos 99% que estamos a fazer bem?

Pratique o perdão e dê a si próprio(a) margem para a imperfeição.

 

Se qualquer um destes hábitos lhe soar familiar, dê pequenos passos para alterá-los e reduzir significativamente o stress. Seja paciente consigo mesmo(a), especialmente se for um(a) perfeccionista.

É preciso tempo para desenvolver um novo hábito e deve aplaudir-se pela mudança positiva que está fazer para reduzir o seu stress e daqueles à sua volta.


Tradução livre do artigo “5 Habits Causing You Stress — and How to Break Them”, de Ashley Feinstein.

sexta-feira, 5 de setembro de 2014

Porque é que os drives amovíveis ainda usam FAT32?

Prosseguindo nesta temática dos Sistemas de Ficheiros, apresentamos mais um pequeno artigo que ajuda a esclarecer uma questão prática importante.

O Microsoft Windows XP começou a usar o sistema de ficheiros NTFS como padrão para as suas unidades internas por volta de 2001. Mais de 12 anos depois, por que é que as Pen Drives USB, cartões SD e outros drives removíveis continuam a usar o FAT32?

Isto não é um erro dos fabricantes. Estas unidades podem ser formatadas num sistema de ficheiros diferente, como o NTFS, mas, provavelmente, vai querer mantê-las formatadas em FAT32.

Porque é que a Microsoft inventou o NTFS? 

A Microsoft criou o NTFS para melhorar o FAT32. Para percebermos porque o Windows utiliza o NTFS, vamos analisar alguns dos problemas do FAT32 e como o NTFS os resolveu:

  • O FAT32 apenas suporta ficheiros individuais até 4GB de tamanho e volumes até 2TB. P. ex., se tiver um ficheiro de vídeo maior que 4GB, não consegue gravá-lo em FAT32, assim como não consegue formatar um disco de 3TB como uma unidade única. O NTFS tem limites muito mais elevados.
  • O FAT32 não é um sistema de ficheiros que suporte journaling, o que significa que a corrupção de ficheiros pode acontecer com muito mais facilidade. Com o NTFS, as alterações são registadas num "diário" na unidade antes de serem realmente feitas. Se o computador for abaixo a meio duma operação de escrita dum ficheiro, o sistema não vai precisar de uma longa e exaustiva operação de scan do disco, para recuperar.
  • O FAT32 não suporta permissões de ficheiro. Com o NTFS, as permissões de ficheiro permitem maior segurança. Os ficheiros de sistema podem ser marcados como somente de leitura e os programas normais tão lhes podem mexer, os utilizadores podem ser impedidos de ver os ficheiros de outros utilizadores, e assim por diante.

Pelo acima exposto, existem muito boas razões para que o Windows utilize o NTFS nas partições de sistema. O NTFS é mais seguro, robusto e suporta ficheiros e drives maiores.

Mas estes não são problemas em unidades amovíveis

É claro que nenhuma das questões anteriores é realmente um problema em pens USB e cartões SD. Eis o porquê:

  • Para já, as pen drives USB ou cartões SD estão definitivamente abaixo de 2TB, pelo que não há problemas com o limite do tamanho do drive. Ocasionalmente pode ser necessário guardar um ficheiro maior que 4 GB. Esta é a única situação em que pode querer formatar o disco como NTFS.
  • Uma unidade amovível não necessita dum registo em diário como uma unidade de sistema. Na verdade, o journaling resulta em gravações adicionais que podem reduzir a vida útil da memória flash da unidade.
  • Um dispositivo amovível também não necessita de permissões de ficheiro. Na verdade, estas podem causar problemas quando se ligam os dispositivos amovíveis em máquinas diferentes. P.ex., os ficheiros podem ser marcados como acessíveis apenas por determinado ID de utilizador. Isto funciona bem se a unidade ficar dentro do mesmo computador. No entanto, se era uma unidade amovível, qualquer pessoa com o mesmo ID de utilizador pode aceder aos ficheiros, no outro computador. Neste caso, as permissões de ficheiro não aumentam realmente a segurança, apenas acrescentam uma complexidade adicional.

Não há realmente nenhuma razão para usar o NTFS em pen drives USB e cartões SD, a menos que seja realmente necessário suporte para ficheiros com mais de 4GB de tamanho. Nesse caso, terá que converter ou reformatar a unidade para NTFS.

Claro que hoje já se podem adquirir discos rígidos externos, com ligação USB, com mais de 2 TB de espaço de armazenamento e também é mais provável guardar ficheiros com mais de 4GB num discos destes. É natural que venham formatados em NTFS, para que possam usar o tamanho total do armazenamento em uma única partição. A menos que sejam construídos com tecnologia de memória flash (ainda muito caro), não há problema das operações de escrita adicionais do journaling.

Compatibilidade

A compatibilidade é provavelmente a principal razão para querer usar o sistema de ficheiros FAT32 nas unidades flash USB ou cartões SD. Enquanto as versões modernas do Windows suportam o NTFS, outros dispositivos podem não o conseguir da mesma forma:

  • O Mac OS X tem suporte nativo de leitura para unidades NTFS, mas necessita de drivers e ajustes adicionais para conseguir escrever.
  • O Linux já possui um suporte sólido de leitura/escrita em NTFS, mas durante muitos anos não foi assim.
  • Leitores DVD, Smart TVs, impressoras, câmaras digitais, leitores de média, Smartphones, qualquer coisa com uma porta USB ou slot de cartão SD: Aqui é que realmente começa a ficar complicado. Muitos dispositivos têm portas USB ou slots para cartões SD. Todos estes dispositivo estão projectados para trabalhar com FAT32, para que eles possam "funcionar simplesmente" e ser capazes de ler os seus ficheiros, desde que use FAT32. Alguns dispositivos até funcionarão com o NTFS, mas não pode contar com isso para todos. Na verdade, deve supor que a maioria dos dispositivos só pode ler FAT32 e não NTFS

É principalmente por isto que vai querer usar FAT32 nos seus discos amovíveis. Desta forma pode usá-los em praticamente qualquer dispositivo. Não há muito a ganhar com a utilização do NTFS numa pen drive USB, para além do suporte para ficheiros de mais de 4GB de tamanho.

Referências

http://www.howtogeek.com/177529/htg-explains-why-are-removable-drives-still-using-fat32-instead-of-ntfs/