Categoria: Uncategorized

  • MVPConf 2018: eu fui!

    Fala galera!

     

    Aconteceu nos dias 7 e 8 de  abril  a primeira edição do MVPConf o maior evento organizado e executado por MVPS da América Latina.

     

    Nestes dois  dias de evento foi apresentado  muito conteúdo relacionado a tecnologias Microsoft e open source, nuvem, containers, Visual Studio e muito mais.

     

    Tive a oportunidade de falar tanto da acessibilidade no Visual Studio quanto  sobre  projetos Xamarin na vida real.

     

    Mais informações no site http://www.mvpconf.com.br

     

    Até a próxima!

  • Páscoa: Tempo de recomeçar

    Fala galera!

    Depois de muito tempo resolvi retornar ao blog. E a época não poderia ser mais propicia.

    Como Páscoa significa reinicio, recomeço, um novo tempo decidi que deveria retornar aqui e escrever sobre minhas novas experiencias, estudos, etc.

    Começo então fazendo o convite para os que tiverem interesse em bater um papo me encontrarem nos seguintes eventos:

    * [MVPConference 2018](http://www.mvpconf.com.br) nada mais nada menos que o maior evento já realizado por MVPs na américa latina. Dois dias de muito conteúdo com os maiores especialistas Microsoft compartilhando muito conhecimento e insights de empreendedorismo e tecnologia;
    * [CapiConf](http://www.capiconf.com.br) o maior evento de comunidade do Paraná em sua segunda ediçÃo. Um dos eventos que mais senti falta de ter participado em 2017 Também dois dias de muita troca de conhecimento sobre tecnologia;
    * [TDC Floripa]*http://www.thedevelopersconference.com.br) o evento já consagrado em mais uma ediçÃo um ano depois de eu ter dado minha primeira palestra e ter me mudado para Florianópolis. Coordeno a trilha Acessibilidade na quarta, Mobile na quinta e palestro na trilha .NET no sábado então nÃo tem desculpas para batermos um papo.
    São tantas coisas a compartilhar que tentarei voltar com mais frequencia aqui, mas por enquanto reforço os convites acima e também me minhas redes sociais.

    Forte abraço e até a próxima!

  • O que dizer após 2 meses em Florianópolis?

    Fala galera!

    É isto mesmo que voce leu no título. Estou neste momento morando dois meses em Florianópolis em uma verdadeira reestruturação da minha vida.
    Quem já me conhece sabe que eu trabalhava em uma grande instituição financeira e após uma proposta no TDC de Florianópolis decidi me mudar da cidade de São Paulo e começar em um novo lugar e em uma nova empresa.
    E não poderia ter feito escolha melhor. Aqui estou tendo uma qualidade de vida invejável e trabalhando com uma galera de altíssimo nível.
    Confesso que não conhecia a ArcTouch, empresa que trabalho atualmente com desenvolvimento móvel, mas eles realmente me mostraram nestes dois meses que. tudo que me falaram na entrevista era verdade.
    Finalmente estou trabalhando em um lugar onde tecnologia é core, onde as pessoas se preocupam com qualidade do que é entregue aos clientes, onde os papéis e responsabilidades são bem definidos, mas que todo o time está comprometido em fazer o seu melhor e contribuir para a evolução de todos.
    E por falar em tecnologia me surpreendo a cada dia com a quantidade de coisas que aprendo e que mesmo assim consigo compartilhar muito da minha experiencia com todos aqui também.
    O processo de inclusão foi fantástico, já estou plenamente adaptado com o escritório e todos aqui são muito prestativos e curiosos em relação a inclusão e acessibilidade o que torna todos os dias oportunidades de trocar muitas idéias, esclarecer muitos tabus e com certeza tornar isto um hábito para eles.
    Com certeza passarei a escrever mais e não se assustem se o nível dos posts aumentar por causa da influencia do meu novo momento.
    Até a próxima!

  • Problemas no Xamarin Build Agent

    Nestes dois últimos dias sofri com um problema de build em meu Mac.
    Apesar da conexão entre o Windows rodando no Parallels e o Mac estarem perfeitas ao tentar rodar meu app no dispositivo recebia no log a mensagem de que deveria ter um agente rodando.
    Após muitas buscas cheguei a esta thread https://forums.xamarin.com/discussion/100185/the-xamarin-build-agent-is-not-running-on-the-mac com a solução.
    Aparentemente uma atualização equivocada do Xamarin.IOS causada por um erro de deploy por parte deles quebrou a comunicação.
    Foi só fazer um Revert como eles indicam e tudo passou a funcionar novamente.
    Espero que ajude!

  • Participei de um hackathon corporativo!

    Fala galera!

    Todos sabem que trabalho para uma **grande instituição financeira** e vocês devem imaginar o quão grane é o ecosistma de tecnologias utilizadas internamente.

    Além disto somos considerados a maior empresa de tecnologia do Brasil. Temos números astronômicos de qualquer ponto de vista que sejamos analisados.

    Mas desde que passamos por uma reestruturação recente algumas iniciativas tem chamado bastante a atenção.

    E uma delas foi a promoção de hackathons internos.

    Não sabe o que é um hackathon?

    Em resumo é uma maratona de programação onde times se enfrentam na solução de problemas através de iniciativas que envolvem muito conhecimento técnico e principalmente criatividade, devido o curto espaço de tempo para se desenvolver as idéias.

    Participei de um time muito bacana, que me recebeu de forma muito natural e me senti totalmente incluído.

    O desafio foi bem grande, infelizmente não vencemos, mas tivemos uma experiência única durante todo o desenvolvimento.

    Agradeço demais a cada um dos organizadores, a cada um dos participantes mas em especial ao time PEPSI, pode ser?

    Até a próxima!

  • Fui nomeado Microsoft MVP em Visual Studio & Developnent Tools 

    Fala galera! 
    Ontem dia primeiro de outubro recebi um grande presente. Fui reconhecido pela Microsoft como um profissional que fez grandes contribuições pelas comunidades técnicas 
    Agora faço parte de um grupo seleto onde estão grandes profissionais que me inspiravam a sempre melhorar e compartilhar meus conhecimentos. 
    Então aguardem por novidades 
    Até a próxima!

  • Dica: Problemas com DNS em containers no Docker e OSX

    Fala galera!

    Continuando com as dicas sobre docker estava tendo problema com a geração de um container para o Sonarqube.

    O problema ocorria na hora de baixar uma chave para o PGP. A mensagem de erro dizia que o host nÃo podia ser localizado. Aparentemente algo relacionado ao DNS.

    Depois de bater cabeça verifiquei as configurações de DNS do meu Mac e verifiquei que o endereço estava com o do provedor e nÃo o do roteador. Resolvi então altera-lo para o do Google: 8.8.8.

    Imediatamente as coisas comçaram a funcionar. Então se voce estiver tendo o mesmo problema fica a dica.

    Até a próxima!

  • [Video]: DDD Cenários e Polemicas

    Fala galera!

    Como o assunto é extenso e o primeiro vídeo gerou bastante discussão interessante com a galera compartilhando suas experiencias resolvemos gravar uma segunda ediçÃo abordando os pontos mais polemicos e trazendo cenários reais de implementação.

    A discussão foi bem rica inclusive contando com uma provocação do Fabio Margarito sobre Micro Services.

    Não deixe de conferir também o blog do Jimmy Bogard que irá enriquecer bastante sua bagagem.

    Se voce gostou do primeiro vídeo não deixe de conferir este.

    E como sempre curta o vídeo, assine o canal e compartilhe com a galera!

    Até a próxima!

  • Lançado AutoMapper 4.2.0

    Fala galera!

    Eu

    Recentemente foi lançada a versão 4.2.0 do AutoMapper framework de mapeamento de tipos que , desde que conheci, passou a integrar a minha caixa de ferramentas essenciais.

    Caso voce não conheça o AutoMapper vem solucionar um dos tediosos problemas do desenvolvimento de sistemas em multiplas camadas: a conversão de Entidades do Domínio em DTOs (Data Transfer Objects) para comunicaçÃo entre estas camadas mantendo o encapsulamento do domínio.

    A maior novidade desta última versão, além de diversas melhorias, foi a introdução de uma API não estática, o que facilita muito o uso com Containers de injeção de dependencia e aumenta a testabilidade.

    DemonstraçÃo

    Para demonstrar esta API e um pouco do poder do AutoMapper desenvolvi uma pequena aplicação que converte uma entidade de domínio em dois DTOs. distintos.

    Crie um novo Console Application e adicione o pacote nuget do AutoMapper.

    Comecemos com a declaração da nossa entidade:

    public class Cliente
        {
            public string CNPJ { get; set; }
            public string RazaoSocial { get; set; }
            public string NomeFantasia { get; set; }
            public string InscricaoEstadual { get; set; }
            public Endereco Endereco { get; set; }
        }
    
    public class Endereco
        {
            public string Logradouro { get; set; }
            public string Numero { get; set; }
            public string Complemento { get; set; }
            public string Bairro { get; set; }
            public string Cidade { get; set; }
            public string UF { get; set; }
            public string CEP { get; set; }
        }
    

    Agora criaremos nossos dois DTOS:

    public class ClienteDTO
        {
            public string CNPJ { get; set; }
            public string RazaoSocial { get; set; }
            public string NomeFantasia { get; set; }
            public string InscricaoEstadual { get; set; }
            public string EnderecoLogradouro { get; set; }
            public string EnderecoNumero { get; set; }
            public string EnderecoComplemento { get; set; }
            public string EnderecoBairro { get; set; }
            public string EnderecoCidade { get; set; }
            public string EnderecoUF { get; set; }
            public string EnderecoCEP { get; set; }
        }
    
    public class EnvelopeDTO
        {
            public string Destinatario { get; set; }
            public string Linha1 { get; set; }
            public string Linha2 { get; set; }
            public string Linha3 { get; set; }
            public string CEP { get; set; }
        }
    

    Notemos que no primeiro DTO estamos utilizando uma convençÃo do AutoMapper pra que ele consiga trabalhar de forma automatizada.

    Para melhor organizar os mapeamentos gosto, mesmo que em projetos simples, de utilizar Profiles. Então em nosso exemplo ele ficará assim:

    public class ClienteProfile: Profile
        {
            protected override void Configure()
            {
                CreateMap()
                    .ForMember(dst => dst.InscricaoEstadual, opt => opt.NullSubstitute("Isento"));
    
                CreateMap()
                    .ForMember(dst => dst.Destinatario, opt => opt.MapFrom(src => src.NomeFantasia))
                    .ForMember(dst => dst.Linha1, opt => opt.MapFrom(src =>
                        src.Endereco.Logradouro + ", " + src.Endereco.Numero +
                        src.Endereco.Complemento ?? string.Empty))
                    .ForMember(dst => dst.Linha2, opt => opt.MapFrom(src => src.Endereco.Bairro))
                    .ForMember(dst => dst.Linha3, opt => opt.MapFrom(src =>
                        src.Endereco.Cidade + " - " + src.Endereco.UF))
                    .ForMember(dst => dst.CEP, opt => opt.MapFrom(src => src.Endereco.CEP));
            }         
        }
    

    Perceba o que fizemos em relação a Inscrição Estadual. Caso a mesma esteja nula será substituida pela palavra Isento.

    Agora colocando tudo para funcionar:

    class Program
        {
            private static IMapper mapper;
    
            static void Main(string[] args)
            {
                var config = new MapperConfiguration(cfg =>
                {
                    cfg.AddProfile();
                });
                mapper = config.CreateMapper();
    
                Cliente_ClienteDTO();
                Cliente_EnvelopeDTO();
            }
    
            private static void Cliente_ClienteDTO()
            {
                System.Console.WriteLine("Convertendo um Cliente para ClienteDTO");
                var cliente = new Cliente()
                {
                    CNPJ = "00.000.000/0001-0",
                    RazaoSocial = "Razão Social",
                    NomeFantasia = "Nome Fantasia",
                    Endereco = new Endereco()
                    {
                        Logradouro = "Rua",
                        Numero = "123",
                        Bairro = "Bairro",
                        Cidade = "Cidade",
                        UF = "SP",
                        CEP = "08209-000"
                    }
                };
    
                var dto = mapper.Map(cliente);
    
                System.Console.WriteLine("Razão Social: {0}", dto.RazaoSocial);
                System.Console.WriteLine("Nome Fantasia:{0}", dto.EnderecoLogradouro);
                System.Console.WriteLine("CNPJ: {0}", dto.CNPJ);
                System.Console.WriteLine("Inscr. EStadual: {0}", dto.InscricaoEstadual);
                System.Console.WriteLine("Endereço: {0}, {1} {2}", dto.EnderecoLogradouro, dto.EnderecoNumero,
                    dto.EnderecoComplemento);
    
                System.Console.WriteLine("Pressione ENTER para continuar.");
                System.Console.ReadLine();
            }
    
            private static void Cliente_EnvelopeDTO()
            {
                var cliente = new Cliente()
                {                                
                    NomeFantasia = "Alexandre Santos Costa",
                    Endereco = new Endereco()
                    {
                        Logradouro = "Rua das Lendas",
                        Numero = "229",
                        Bairro = "Jardim das Na;óes",
                        Cidade = "Sáo Paulo",
                        UF = "SP",
                        CEP = "08209-000"
                    }
                };
    
                var dto = mapper.Map(cliente);
    
                System.Console.WriteLine(dto.Destinatario);
                System.Console.WriteLine(dto.Linha1);
                System.Console.WriteLine(dto.Linha2);
                System.Console.WriteLine("{0} CEP: {1}", dto.Linha3, dto.CEP);
    
                System.Console.WriteLine("Pressione ENTER para continuar.");
    
                System.Console.ReadLine();
            }
        }
    

    Até a próxima!

  • ASP.NET SignalR: Criando um Mural de Recados

    Fala galera!

    Conforme prometi no primeiro post da série vamos implementar um pequeno exemplo utilizando os Hubs do ASP.NET SignalR para fixar melhor os conceitos.

    Recapitulando os Hubs abstraem toda a camada de comunicação entre o servidor e os clientes permitindo de forma facilitada a implementação de cenários de comunicação em tempo real como:

    • Notificação dos clientes quando da ocorrencia de eventos no servidor tais como conclusão de processos de longa duração, alteração de status em fluxos de trabalho, etc;
    • Comunicação entre aplicações, inclusive em diferentes plataformas, tais como jogos, chats, etc;

    Durante este artigo iremos construir um pequeno mural de recados que permitiráque os usuários publiquem mensagens que atualizarão o painel em todos os clientes conectados naquele momento.

    Criando nosso mural

    A Solution será composta de dois projetos:

    • Mural.Server: aplicação console responsável por hospedar nosso servidor SignalR. Poderia ser uma aplicação Web mas escolhi este modelo apenas para efeito de demonstração da versatilidade deste tipo de solução;
    • Mural.WEb: é uma WEb Application vazia apenas pra hospedar nossa página HTML e seus scripts. Poderia ser qualquer tipo de aplicação mas também escolhi este modelo pela sua simplicidade;

    Então para começar crie uma Blank Solution, adicione os dois projetos e vamos começar a implementa-los.

    Mural.Server

    Nossa aplicação console precise de apenas um pacote Nuget:

    • ASP.NET SignalR Self Host;

    Este pacote instalará todo o core do SignalR e se utilizará do OWIN para hospedar uma aplicação Web no endereço: http://localhost:8080.

    O SignalR trabalha com um mapeamento padrão em /signalr e disponibiliza o proxy para os hubs, em JavaScript no endpoint /signalr/hubs. Veremos isto em detalhes quando estivermos construindo nosso cliente.

    Para que possamos configurar o servidor precisamos adicionar uma nova classe chamada Startup que deve ter a seguinte implementação:

    public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.MapSignalR();
            }
        }
    

    Com isto o SignalR irá se configurar automaticamente. Agora precisamos subir nosso servidor quando a aplicação for inicializada. Altere o método Main da classe Program para:

    class Program
        {
            static void Main(string[] args)
            {
                using (WebApp.Start("http://localhost:8080/"))
                {
                    Console.WriteLine("Server running at http://localhost:8080/");
                    Console.ReadLine();
                }
            }
        }
    

    E para finalizar o projeto de nosso servidor precisamos apenas criar o Hub. Isto é feito através da implementação de uma classe que herda de Hub e todos os seus métodos publicos estão disponíveis para serem chamados pelo cliente.

    Já para acionarmos os clientes utilizamos a propriedade Clients e suas propriedades All para todos os clientes conectados, Caller para o chamador atual e Group para enviar para um grupo específico. Em um exemplo mais avançado abordaremos estes conceitos.

    Dica: utilize a versão d Hub que recebe uma interface. Isto evitará erros de digitação muito comuns quando utilizamos objetos dynamic.

    Logo nossa interface e Hub ficarão desse modo:

    public interface IMuralHubClient
        {
            void OnMensagemRecebida(string mensagem);
        }
    
    public class MuralHub: Hub
        {
            public void Publicar(string mensagem)
            {
                Console.WriteLine("Cliente {0} enviou {1} ...", Context.ConnectionId, mensagem);
                Clients.All.OnMensagemRecebida(mensagem);
            }
    
            public override Task OnConnected()
            {
                Console.WriteLine("Cliente {0} estabeleceu conexão ...", Context.ConnectionId);
                return base.OnConnected();
            }
    
            public override Task OnDisconnected(bool stopCalled)
            {
                Console.WriteLine("Cliente {0} desconectado ...", Context.ConnectionId);
                return base.OnDisconnected(stopCalled);
            }
        }
    

    Voilá! Nosso servidor está pronto para ser utilizado. Caso voce queira ter certeza disto inicie o debug e aponte seu navegador para http://localhost:8080/signalr/hubs e veja que será retornado um JavaScript contendo toda implementaçÃo do cliente para nosso hub.

    Mural.Web

    Agora vamos criar nosso cliente. Adicione os seguintes pacotes Nuget:

    • Bootstrap;
    • ASP.NET SignalR.js;

    O Bootstrap srá utilizado para dar uma ar mais profissional a interface do nosso mural, já o SignalR.js é o cliente do SignalR. Ele adicionará automaticamente o jQuery biblioteca necessária tanto pelo Bootstrap quando pelo SignalR.js.

    Crie um novo arquivo chamado Index.html com o seguinte conteúdo:

    
    
    
        Mural de Recados
        
        
    
    
    
    <div class="container">
        <div class="panel panel-default col-md-8 col-sm-12">
            <div class="panel-heading">Mural de Recados</div>
            <div class="panel-body">
                <ul class="media-list" id="mural">
                </ul>
            </div>
        </div>
        <div class="panel panel-default col-md-4 col-sm-12">
            <div class="panel-heading">Publicar Mensagem</div>
            <div class="panel-body">
                <div class="form-group">
                    Mensagem
                    <div class="form-group">
                        
                    </div>
                </div>
                <div class="form-group">
                    Publicar
                </div>
            </div>
        </div>
    </div>
    
    
    
    
        
    
    
    
    
    

    E codificaremos a interação com nosso hub no arquivo mural.js da seguinte forma:

    (function($) {
        $.connection.hub.url = 'http://localhost:8080/signalr';
        var hub = $.connection.muralHub;
        hub.client.OnMensagemRecebida = function(mensagem) {
            var li = $("<li>");
            li.addClass("media")
            var body = $("<div>")
            body.addClass("media-body");
            body.text(mensagem);
            li.append(body);
            $("#mural").append(li);
        }
    
        $(function() {
            $("#publicar").click(function() {
                hub.server.publicar($("#mensagem").val());
                $("#mensagem").val('');
                $("#mensagem").focus();
            });
    
            $.connection.hub.start().done(function() {
                $("#mensagem").focus();
            });
        });
    })(jQuery);
    

    Observemos que no bloco JavaScript realizamos as seguintes etapas:

    • Definimos a url do servidor SignalR;
    • Criamos uma referencia para o nosso Hub;
    • Definimos uma unção anonima que será chamada quando o servidor chamar o método OnMensagemRecebida do cliente;
    • Fazemos chamadas ao método Publicar do servidor;
    • Inicializamos a conexÃo com o servidor;

    O código é bem simples e auto explicativo mas caso tenha alguma duvida terei prazer em responde-las nos comentários.

    Por enquanto é isto. Veremos se em postagens superiores criamos coisas mais avançadas e divertidas.

    Até a próxima!