fbpx
Microsoft Bot Framework no .NET Core – Alpha

Microsoft Bot Framework no .NET Core – Alpha

Ao começar esse post estava disposto apenas a apresentar novos packages do Microsoft Bot Framework no .NET Core,  que endereçam o desenvolvimento de bots com .NET Core 1.1 e .NET Standard 1.4 e 1.6, já disponíveis em versão alpha no Nuget.org, no entanto como está no meu roadmap reconstruir, já pela 4ª vez, minha infraestrutura de bots, aproveitei para então entender um pouco o que esses assemblies trazem para poder já começar minha implementação. Aproveitei intervalos nesse domingo de páscoa e obtive ótimos resultados com os novos pacotes. Bots simples já podem usar esses novos pacotes sem problema algum.

(mais…)

Google Cloud Next – 2017

Google Cloud Next – 2017

Google Cloud Platform enviou na semana passada um email falando sobre o Google Cloud Next e há muita coisa interessante para falar. Um dos principais aspectos que devo abordar aqui estão centrados nas novas aquisições da google e novos produtos, features e free tier que encontramos no Google Cloud Platform.

(mais…)

A anatomia de um chatbot

A anatomia de um chatbot

Vendo bots com uma visão mais profissional, pude estudar muito e principalmente: experimentar muito. Fiz diversos testes implementando chatbots com C# e Microsoft Bot Framework, sob o .NET Framework, mas também fiz bots em NodeJS, e alguns construídos direto em plataformas web. Testei inúmeras plataformas, implementei diversos fluxos de negócio e apresentei diversos exemplos para comitês, fiz apresentações gerenciais e auxilio o time de vendas da Ebix Latin America no diálogo sobre Chatbots com nossos clientes. Aprendi sobre o que os gestores esperam, entendi o que eles querem, e quais são suas principais dúvidas e expectativas. Acho que posso ajudar quem pretende entender um pouco sobre chatbots e o que há de interessante no mercado para se fazer bots.

<update 03/Out/2017>Agora já tenho implantações com .NET Core também! Embora não seja possível usar o SDK, é possível usar a API REST para fazer a integração.</update>

(mais…)

Agora também estou no programa MTAC

Agora também estou no programa MTAC

Pessoal, nota rápida!

Hoje saiu a aprovação e fui um dos selecionados para o programa MTAC – Multi Platform Technical Audience Contributor. O programa visa o engajamento da comunidade técnica em ações para a comunidade técnica. Estou muito feliz de ter sido aceito, agradeço à indicação do Renato Groffe.

[dt_quote type=”blockquote” font_size=”big” animation=”none” background=”plain”]O que isso significa?

Trabalho! Mtac não é um título, é uma associação, e como qualquer outra demanda trabalho, mas dessa vez colaborativo em vez de isolado.[/dt_quote]

Que venham os desafios, espero poder contribuir e principalmente aprender com essa galera que já se mostrou bem legal!!!

Obrigado aos MTAC’s que me aceitaram! Vamos nessa!

[dt_divider style=”thin” /]

Aproveito o anúncio para convidar vocês para o grupo de Arquitetura .NET que está presente tanto facebook quanto no telegram. A temática é ter um local para falarmos de arquitetura, já tem gente demais falando de C#, ASP.NET, MVC, e muito detalhe sobre “how to”. Nossa proposta é conversar sobre “O que dá para fazer…” e não “Como fazer…”.

 

Docker – Images vs Layers

Docker – Images vs Layers

Sempre que fazemos um build de uma imagem docker, estamos criando novas layers a cada comando do dockerfile. A última layer de cada build é a layer que identifica aquela imagem, é sob ela que o Docker aplica a tag quando usamos o parâmetro -t {imagename:tagname}, para dar nomes semanticamente eficientes.

Abaixo trago um vídeo bem curtinho, gerado direto do powerpoint para ilustrar esse aspecto.

É só isso, a intenção é apenas ilustrar esse aspecto, facilitando o entendimento. Em breve esse vídeo estará incorporado a um vídeo maior que detalhará o processo de build.

NGINX Automation

NGINX Automation

Se você usa o NGINX em produção, como Reverse Proxy, já se perguntou se seria possível criar algum tipo de automação. Essa é uma demanda pois quanto mais apps passando por ele, mais endereços, mais configurações serão necessárias. Se você usa todo o potencial do NGINX, aí com toda certeza você ficará interessado na automação.

Exemplo de configuração do NGINX:

Para você entender o que estou falando, abaixo tenho um arquivo bem parecido com o que tenho em produção.

#user  nobody;
worker_processes  1;
pid        /run/nginx.pid;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;


events {
    worker_connections  4096;
}

stream {

	#############################################################
	# Stream binds for Container zimbra
	#############################################################
	server { 
    	listen 23; 
    	proxy_pass zimbra:22; 

    }				
	server { 
    	listen 53; 
    	proxy_pass zimbra:53; 

    }				
	server { 
    	listen 110; 
    	proxy_pass zimbra:110; 

    }				
	server { 
    	listen 143; 
    	proxy_pass zimbra:143; 

    }				
	server { 
    	listen 389; 
    	proxy_pass zimbra:389; 

    }				
	server { 
    	listen 465; 
    	proxy_pass zimbra:465; 

    }				
	server { 
    	listen 587; 
    	proxy_pass zimbra:587; 

    }				
	server { 
    	listen 993; 
    	proxy_pass zimbra:993; 

    }				
	server { 
    	listen 995; 
    	proxy_pass zimbra:995; 

    }				
	server { 
    	listen 3443; 
    	proxy_pass zimbra:3443; 

    }				
	server { 
    	listen 9071; 
    	proxy_pass zimbra:9071; 

    }				
	server { 
    	listen 444; 
    	proxy_pass zimbra:443; 

    }				

	#############################################################
	# Stream binds for Container MySQL
	#############################################################
	server { 
    	listen 3306; 
    	proxy_pass MySQL:3306; 

    }				

	#############################################################
	# Stream binds for Container Redis
	#############################################################
	server { 
    	listen 6379; 
    	proxy_pass Redis:6379; 

    }				

	#############################################################
	# Stream binds for Container MongoDB
	#############################################################
	server { 
    	listen 27017; 
    	proxy_pass MongoDB:27017; 

    }				

	#############################################################
	# Stream binds for Container RabbitMQ
	#############################################################
	server { 
    	listen 4369; 
    	proxy_pass RabbitMQ:4369; 

    }				
	server { 
    	listen 25672; 
    	proxy_pass RabbitMQ:25672; 

    }				
	server { 
    	listen 5671; 
    	proxy_pass RabbitMQ:5671; 

    }				
	server { 
    	listen 5672; 
    	proxy_pass RabbitMQ:5672; 

    }				
	server { 
    	listen 15672; 
    	proxy_pass RabbitMQ:15672; 

    }				
	server { 
    	listen 61613; 
    	proxy_pass RabbitMQ:61613; 

    }				
	server { 
    	listen 61614; 
    	proxy_pass RabbitMQ:61614; 

    }				
	server { 
    	listen 1883; 
    	proxy_pass RabbitMQ:1883; 

    }				
	server { 
    	listen 8883; 
    	proxy_pass RabbitMQ:8883; 

    }				
	
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    client_max_body_size 50M;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

	#############################################################
    #
    #		HTTP
    #
    #############################################################



	#############################################################
	# HTTP binds for Container LuizCarlosFariaBlog
	#############################################################
	server { 
    	listen 80; 
		server_name  endereco.com.br www.endereco.com.br docker.endereco.com.br;

		location / {
    		proxy_pass http://LuizCarlosFariaBlog:80; 

			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
    }				
			

	#############################################################
	# HTTP binds for Container javaApp
	#############################################################
	server { 
    	listen 80; 
		server_name  jira.endereco.com.br;

		location / {
    		proxy_pass http://javaApp:8080; 

			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
    }				
			

	#############################################################
	# HTTP binds for Container zimbra
	#############################################################
	server { 
    	listen 80; 
		server_name  mail.*;

		location / {
    		proxy_pass http://zimbra:80; 

			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
    }				
			
	


	#############################################################
    #
    #		HTTPS
    #
    #############################################################


	#############################################################
	# HTTPS binds for Container LuizCarlosFariaBlog
	#############################################################
	server { 
    	listen 443 ssl; 
		server_name  endereco.com.br www.endereco.com.br docker.endereco.com.br;

		#ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx;
    	#ssl_certificate_key  xxxxxxxxxxxxxxxxxxxxxxxx;
		#ssl_dhparam  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_session_timeout  xxxxxxxxxxxxxxxxxxxxxxxx;	
        #ssl_session_cache  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling_verify  xxxxxxxxxxxxxxxxxxxxxxxx;
        #add_header Strict-Transport-Security  xxxxxxxxxxxxxxxxxxxxxxxx;
		
		location / {			
    		proxy_pass http://LuizCarlosFariaBlog:80; 
			
			
			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
		
    }				

	#############################################################
	# HTTPS binds for Container zimbra
	#############################################################
	server { 
    	listen 443 ssl; 
		server_name  mail.*;

		#ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx;
    	#ssl_certificate_key  xxxxxxxxxxxxxxxxxxxxxxxx;
		#ssl_dhparam  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_session_timeout  xxxxxxxxxxxxxxxxxxxxxxxx;	
        #ssl_session_cache  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling_verify  xxxxxxxxxxxxxxxxxxxxxxxx;
        #add_header Strict-Transport-Security  xxxxxxxxxxxxxxxxxxxxxxxx;
		
		location / {			
    		proxy_pass https://zimbra:443; 
					proxy_set_header X-Real-IP $remote_addr;

			
			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
		
    }				
	server { 
    	listen 7071 ssl; 
		server_name  mail.*;

		#ssl_certificate xxxxxxxxxxxxxxxxxxxxxxxx;
    	#ssl_certificate_key  xxxxxxxxxxxxxxxxxxxxxxxx;
		#ssl_dhparam  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_protocols xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_prefer_server_ciphers on;
        #ssl_ciphers  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_session_timeout  xxxxxxxxxxxxxxxxxxxxxxxx;	
        #ssl_session_cache  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling  xxxxxxxxxxxxxxxxxxxxxxxx;
        #ssl_stapling_verify  xxxxxxxxxxxxxxxxxxxxxxxx;
        #add_header Strict-Transport-Security  xxxxxxxxxxxxxxxxxxxxxxxx;
		
		location / {			
    		proxy_pass https://zimbra:7071; 
					proxy_set_header X-Real-IP $remote_addr;

			
			#proxy_set_header X-Real-IP $remote_addr;
			#add_header  Feedback $host;
		}
		
    }				
	


	#############################################################
    #
    #	DEFAULT	
    #
    #############################################################

    server {
        listen       80;
        server_name  xxx;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /nginx_status {
          stub_status;
          #access_log   off;
          #allow 1.1.1.1;
          #deny all;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }


}

Trabalhando com Metadados:

No dia-a-dia você acaba por não ter de dar manutenção nestes arquivos com freqüência, e por isso você acaba por não lembrar de todos os passos necessários ou todas as features possíveis, assim automatizar gera o conforto e reduz o atrito na hora de fazer uma nova configuração no NGINX, a cada vez que você precise adicionar um novo endereço, ou aplicação no stack.

Embora o arquivo do exemplo 1 seja extenso, no dia-a-dia eu não preciso gerenciá-lo diretamente. Usando um script de automação que criei, eu modifico um arquivo json de metadados, executo um comando e pronto: arquivo de configuração gerado e script de recriação do container pronto para ser executado. Abaixo temos o exemplo de metadados, ele está disponível no repositório do projeto, no github.

{
    "NginxContainerName": "EntryPoint",
    "Workers": {
        "Count": 1,
        "Connections" : 4096        
    },
    "Services" :[
		{             
            "ContainerName" : "blog",
            "Enabled" : true,
            "Binds":[
                { "Type": "http", "Port" : 80, "HostHeaderPattern": "endereco.com.br www.endereco.com.br docker.endereco.com.br" },
                { "Type": "https", "HostPort" : 443, "ContainerPort": 80, "HostHeaderPattern": "endereco.com.br www.endereco.com.br docker.endereco.com.br" }
            ]
        },{             
            "ContainerName" : "wso2esb",
            "Enabled" : false,
            "Binds":[
          		{ "Type": "http", "HostPort" : 80, "ContainerPort": 8020, "HostHeaderPattern": "esb.endereco.com.br api.endereco.com.br", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] }
            ]
        },{             
            "ContainerName" : "javaApp",
            "Enabled" : true,
            "Binds":[
                { "Type": "http", "HostPort" : 80, "ContainerPort": 8080, "HostHeaderPattern": "jira.endereco.com.br" }                
            ]
        },{             
            "ContainerName" : "zimbra",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "HostPort" : 23, "ContainerPort": 22 },
                { "Type": "stream", "Port" : 53 },
                { "Type": "stream", "Port" : 110 },
                { "Type": "stream", "Port" : 143 },
                { "Type": "stream", "Port" : 389 },
                { "Type": "stream", "Port" : 465 },
                { "Type": "stream", "Port" : 587 },
                { "Type": "stream", "Port" : 993 },
                { "Type": "stream", "Port" : 995 },
                { "Type": "stream", "Port" : 3443 },
                { "Type": "stream", "Port" : 9071 },
                { "Type": "stream", "HostPort" : 444, "ContainerPort": 443 },
                { "Type": "http", "Port" : 80, "HostHeaderPattern": "mail.*" },
                { "Type": "https", "Port" : 443, "HostHeaderPattern": "mail.*", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] },                
                { "Type": "https", "Port" : 7071, "HostHeaderPattern": "mail.*", "LocationExtensions": ["proxy_set_header X-Real-IP $remote_addr"] }
            ]
        },{             
            "ContainerName" : "MySQL",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 3306 }
            ]
        },{             
            "ContainerName" : "Redis",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 6379 }
            ]
        },{             
            "ContainerName" : "MongoDB",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 27017 }
            ]
        },{             
            "ContainerName" : "RabbitMQ",
            "Enabled" : true,
            "Binds":[
                { "Type": "stream", "Port" : 4369 },
                { "Type": "stream", "Port" : 25672 },
                { "Type": "stream", "Port" : 5671 },
                { "Type": "stream", "Port" : 5672 },
                { "Type": "stream", "Port" : 15672 },
                { "Type": "stream", "Port" : 61613 },
                { "Type": "stream", "Port" : 61614 },
                { "Type": "stream", "Port" : 1883 },
                { "Type": "stream", "Port" : 8883 }
            ]
        }
    ],
    "templates": [
        { "Name": "Nginx Configuration", "Template": "./templates/nginx.config.template.asp", "Output": "./output/nginx.conf"  },
        { "Name": "Container Recreation", "Template": "./templates/nginx-recreate.sh.template.asp", "Output": "./output/rebuild-container.generated.sh"  }
    ]
}

Sem sombra de dúvidas, o arquivo JSON, acima, apresenta um modelo mais simples e melhor estruturado, tornando fácil criar novas configurações. Mas o NGINX não reconhece esse formato, para isso um script que transforma esse arquivo em 2 outros, o de configuração e o de recriação do container.

O repositório já conta com um arquivo de configuração parecido com esse que está aqui no post, além disso, o resultado do script é o arquivo de configuração “` ./output/nginx.conf “` e um arquivo sh “` ./output/reebuild-container.generated.sh “` , destinado à recriação do container.

O arquivo de configuração segue o exemplo 1, enquanto o script de recriação do container está abaixo no exemplo 3.

#!/bin/bash
docker rm -f EntryPoint

docker run \
-d \
--name EntryPoint \
--hostname EntryPoint \
--network=front \
-p 80:80 -p 443:80 \
 \
-p 23:22 -p 53:53 -p 110:110 -p 143:143 -p 389:389 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 3443:3443 -p 9071:9071 -p 444:443   -p 7071:7071 \
-p 3306:3306 \
-p 6379:6379 \
-p 27017:27017 \
-p 4369:4369 -p 25672:25672 -p 5671:5671 -p 5672:5672 -p 15672:15672 -p 61613:61613 -p 61614:61614 -p 1883:1883 -p 8883:8883 \
-v /docker/EntryPoint/config:/etc/nginx/ \
-v /docker/EntryPoint/PageSpeed:/PageSpeed/ \
-v /docker/EntryPoint/logs:/var/log/nginx/ \
-v /docker/Certificados/:/cert/ \
luizcarlosfaria/nginx-pagespeed

sleep 2

docker ps -a --filter "name=EntryPoint"
docker logs EntryPoint

Este repositório é uma base para você criar sua própria automação. Se você usar a imagem luizcarlosfaria/nginx-pagespeed/ você ganha features como:

  • Stream – Possibilidade de usar o NGINX como Reverse Proxy de serviços não HTTP, como Banco de Dados, Redis. Mongo etc. Isso torna mais segura sua infra, na medida que você não precisa criar seus containers com binding para as portas. Habilita somente nos períodos em que precisar.
  • ngx_http_substitutions_filter_module – possibilita a substituição do conteúdo HTTP de uma requisição.
  • Google Page Speed – uma verdadeira bruxaria! O Google Page Speed realiza otimizações no HTML, Javascript de forma coordenada e unificada, permitindo que você melhore aplicações das quais você não tem controle sobre o desenvolvimento.
  • nginx-rtmp-module – NGINX-based Media Streaming Server, desenhado para enconding em realtime.

Os templates de criação estão na pasta ./Templates e devem ser customizados a gosto!

Get Started

Download

Baixe o repositório:

git clone https://github.com/docker-gallery/nginx-pagespeed-automation.git
cd ./nginx-pagespeed-automation
npm install

Customizando os metadados

No arquivo ./data.json substitua ./output/nginx.conf pelo path real onde deve ficar o arquivo de configuração do NGINX.

    "templates": [
        { "Name": "Nginx Configuration", "Template": "./templates/nginx.config.template.asp", "Output": "./output/nginx.conf"  },
        { "Name": "Container Recreation", "Template": "./templates/nginx-recreate.sh.template.asp", "Output": "./output/rebuild-container.generated.sh"  }
    ]

Customizando script de recriação do container

No arquivo ./templates/nginx-recreate.sh.template.asp fique atento às linhas 8 e 26:

#!/bin/bash
docker rm -f <%= data.NginxContainerName %>

docker run \
-d \
--name <%= data.NginxContainerName %> \
--hostname <%= data.NginxContainerName %> \
--network=front \<% 
	var portsInUse = [];
Enumerable.from(data.Services).where("$.Enabled").toArray().forEach(function(service){ 
	var result = Enumerable.from(service.Binds).select(function(bind){
		var bindPort = is.existy(bind.Port)?bind.Port : bind.HostPort;
		var containerPort = is.existy(bind.Port)?bind.Port : bind.ContainerPort;
		var returnValue = "";
		if(Enumerable.from(portsInUse).any(function(it){ return it == bindPort}) == false)
		{
        	portsInUse.push(bindPort);
			return "-p " + bindPort + ":" + containerPort;
		}
		return returnValue;
	}).toArray().join(" "); 
%>
<%= result %> \<%
});
%>
-v /docker/EntryPoint/config:/etc/nginx/ \
-v /docker/EntryPoint/PageSpeed:/PageSpeed/ \
-v /docker/EntryPoint/logs:/var/log/nginx/ \
-v /docker/Certificados/:/cert/ \
luizcarlosfaria/nginx-pagespeed

sleep 2

docker ps -a --filter "name=<%= data.NginxContainerName %>"
docker logs <%= data.NginxContainerName %>

Na linha 8 temos a configuração da rede docker usada pelo container, enquanto na linha 26 o bind com o path do volume destinado às configurações do NGINX. Este último precisa ser coerente com path do arquivo gerado.

Executando

Acertando esses pontos para o teu cenário, basta rodar:

node ./index.js

Os arquivos são regerados e você pode executar o script “` ./reebuild-container.generated.sh“` localizado na pasta output. Este script removerá o container chamado EntryPoint, e o recriará, com base nas configurações de portas determinados no seu data.json.

Outras possibilidades

Esse procedimento pode ser automatizado no WebMin, mas isso é um assunto para um segundo post.

Você ainda pode customizar todo o fluxo para gerar outros artefatos, como um docker-compose.yml, por exemplo, e enfim, muito mais.

Forke o projeto no github.

WSO2 – Open Source SOA Suite

WSO2 – Open Source SOA Suite

E você vai passando pelas empresas, vai ganhando experiência, acaba vendo problemas recorrentes e em algum momento pode passar o seguinte pensamento: Putz, esse problema aqui se resolveria de forma super simples com um API Manager, ou um ESB, e quem sabe essa infinidade de API’s de consulta poderiam ser criadas com uma ferramenta. Hoje vou falar um pouco de alguns produtos da WSO2.

Bom esses e muitos outros problemas endereçados no SOA são geralmente atendidos com soluções caras como Data Power, Integration Bus (ambos da IBM) e diversas outras soluções extremamente difundidas, mas caras! Seja IBM, Oracle, Microsoft, CA, inevitavelmente você irá esbarrar em custo, principalmente se você não tiver um bom orçamento para se jogar fora.

(mais…)

Dev Week 2016 @ Canal .NET

Dev Week 2016 @ Canal .NET

Pessoal,

essa semana está rolando o Dev Week 2016: São 5 dias, 16 palestras, todas as noites!

A de segunda-feira já passou, mas isso não é um problema, todo o material fica disponível no Canal .NET, lá no youtube.

15423794_1960992114033816_263886330_n

A propósito, eu fecho a agenda da quarta-feira com o tema Arquitetura X Infraestrutura: O que todo desenvolvedor deveria saber às 22h. Mas antes tem 2 temas interessantes. Corre no site, veja a agenda e assista, tem muita coisa legal todos os dias!

Nos vemos no Canal .NET!

.NET Core – Estratégias de Deploy – Parte 2

.NET Core – Estratégias de Deploy – Parte 1

Olá pessoal, já faz algum tempo que não escrevo sobre .NET. Tenho me dedicado aos vídeos sobre Docker, mas escolhi um tema muito divertido para falar: Novas estratégias de deploy com .NET Core.

Quem vem acompanhando os novos rumos da Microsoft, deve estar compreendendo que estamos diante de uma magnífica e imensa mudança de paradigma, que trás consigo não apenas um novo framework, mas novas e infinitas possibilidades. Alinhada à estratégia open source, a Microsoft está mudando e transformando-se para ser mais competitiva e entenda: A proximidade com o Linux não é um tiro no pé, mas uma abordagem mais realista, que endereça o sonho de muitos, assim como eu.

[dt_quote type=”blockquote” font_size=”big” animation=”none” background=”plain”]Especulando: O resultado a longo prazo, é que poderemos ter a chance de ver o Windows sendo realmente competitivo em relação ao Linux, justificando talvez o esforço de migração e o custo licenciamento. [/dt_quote]

(mais…)

Docker – de A a Z – 16 – SQL Server for Linux

Docker – de A a Z – 16 – SQL Server for Linux

Pessoal,

aqui vai mais um vídeo da série, e dessa vez uma demo, super simples e super rápida sobre o SQL Server for Linux.

Vale lembrar que esse SQL Server on Linux é compatível com os providers e ferramentas que conhecemos e usamos no da-a-dia em qualquer aplicação, sua limitação está nos designers do SQL Server Management Studio (SSMS). E por falar nisso, está aqui o link para download do SSMS, o download tem aproximadamente 900mb.

Se você ainda não pensa em uma utilizada real para o SQL Server for Linux, vale lembrar que a estabilidade do Linux já justificaria uma versão de produção do SQL Server no Linux, mas enquanto estamos em CTP (community technology preview), podemos pensar em:

  • Ambientes de teste
  • Teste integrado para testes de CI e CD
  • Teste de implantação

Bom o céu é o limite. Com um pouco de criatividade, dá para se imaginar muitas formas de se utilizar o SQL Server on Linux!

Aqui está o vídeo!

[UPDATE 26/09/2017]

Hoje fazendo novos testes, revalidando o que havia dito aqui no vídeo percebi que o designer de tabelas já está funcionando perfeitamente no Linux, e com Docker!

Windows Server 2016 – Overview

Windows Server 2016 – Overview

Desde que a Microsoft passou da era Steve Ballmer para a era Satya Nadella encontramos uma nova Microsoft. Muito mais flexível, muito mais competitiva, muito mais livre, sem rótulos e/ou bandeiras, mais madura e por fim, uma Microsoft definitivamente mais atraente ao olhar do mercado e da comunidade. Os novos rumos com o Windows 10 já movimentaram o mercado, mas agora é hora de voltarmos os holofotes para o Windows Server 2016 e analisarmos com critério o que está presente e o que quebra paradigmas nessa nova release da versão do Windows para servidores. Há muita coisa interessante chegando, muitas features de segurança, um aumento significativo nos limites de sotrage, memória e processadores virtuais, além de uma série de softwares de suporte a infraestrutura do servidor, inspirada na arquitetura vencedora do Windows Azure.

A lista de recursos apresentada nos primeiros papers oficiais após o tão esperado lançamento do Windows Server 2016 estão disponíveis aqui, junto com o link para download na sessão resources desse post.

Overview

O documento Introducing Windows Server 2016 apresenta de uma forma bem clara, exemplos reais de problemas e necessidades do mercado, endereçando-as em um formato de fácil compreensão. Da esquerda para a direita, vemos o tópico em questão, um exemplo e por fim como o Windows Server 2016 endereça esse aspecto.

Segurança

Aqui são endereçados aspectos de segurança no windows server.

01-windows-server-2016-table-security-fw

Infraestrutura

Aqui são endereçados aspectos técnicos de infraestrutura no windows server.

02-windows-server-2016-table-infraestrutura-fw

Plataforma para Desenvolvedores

Novas features que endereçam a nova forma de desenvolver e implantar aplicações.

03-windows-server-2016-table-application-platform-fw

What’s new?

Quais são as novas features em comparação com o Windows Server 2008 e 2012?

Segurança

Features de segurança

11-windows-server-2016-compare-security-fw

DataCenter Operations

Novas features de infraestrutura.

12-windows-server-2016-compare-datacenter-operations-fw

13-windows-server-2016-compare-datacenter-operations-fw

Plataforma para Desenvolvedores

Novas features para application development.

13-windows-server-2016-compare-support-developers-fw

Resources

Download

As 3 opções de avaliação estão disponíveis no Technet Evaluation Center. As 3 opções são:

  • [dt_tooltip title=”ISO”]14393 . 0 . 160715 – 1616.RS1 _ RELEASE _ SERVER _ EVAL _ X64FRE _ EN-US .ISO [/dt_tooltip]
  • [dt_tooltip title=”Nano Server VHD (.exe)”]NanoServerDatacenter.vhd.exe[/dt_tooltip]
  • Virtual Lab

A ISO, por exemplo, está disponível nos idiomas Chines Simplificado, Inglês, Francês, Alemão, Italiano, Japonês, Russo e Espanhol, enquanto a versão VHD não possui definição de Idioma no download.

Documentação e Tutoriais

Introducing Windows Server 2016 e The Ultimate Guide to Windows Server (requer registro)

Youtube

Channel9

Conclusão

A Microsoft e o Windows Server 2016 endereçam anseios do mercado, necessidades que surgiram rápido nos últimos anos. É realmente incrível ver como a Microsoft conseguiu se antecipar e entregar em tão pouco tempo esse enorme conjunto de mudanças. É fantástico o trabalho que fizeram ao longo desses últimos anos. Foram diversas parcerias, e inúmeras conquistas para a comunidade e para a plataforma em si. Desde o WSL, as contribuições com o Kernel do Linux e o suporte e atenção dados ao pingüim. A imagem abaixo foi tirada de um dos documentos oficiais do Windows Server.

microsoft-loves-linux-fw

Docker – de A a Z – 15 – RabbitMQ,  ElasticSearch , LogStash e Kibana

Docker – de A a Z – 15 – RabbitMQ, ElasticSearch , LogStash e Kibana

Durante a série Docker de A a Z, esse foi um dos Stacks entregues para facilitar a compreensão de como docker pode nos ajudar a unir soluções complexas, colaborando para criar stacks com diversos projetos e produtos.

 

 

Esse stack serviu para a apresentação, mas também virou projeto e hoje é mantido e atualizado, por mim e por colaborações.

 

Para simplificar a apresentação desse conteúdo o post foi movido para a página do Stack aqui no site.

 

Microsoft Virtual Academy – Microservices

Microsoft Virtual Academy – Microservices

Uma boa dica para quem quer conhecer MicroServices sob o ponto de vista da Microsoft é o MVA – Introdução à Microsserviços (em inglês).

O conteúdo foi lançado dia 09/Junho e conta com os seguintes tópicos:

  • Introdução a Arquiteturas de Serviço
  • Introdução a Containers
  • Azure Compute Platform e Conjuntos de escalabilidade de Máquinas Virtuais
  • O que é o Azure Container Services?
  • O que é o Azure Service Fabric?
  • Resumo e próximos passos

O link para esse MVA é esse aqui.

Bom, divirtam-se!