<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>JavaScript Archives - Hiago Silva Souza</title>
	<atom:link href="https://www.hiago.me/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hiago.me/category/javascript/</link>
	<description></description>
	<lastBuildDate>Wed, 28 Nov 2018 01:50:12 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.5</generator>

<image>
	<url>https://www.hiago.me/wp-content/uploads/2019/01/cropped-icon-hiagus-2-32x32.png</url>
	<title>JavaScript Archives - Hiago Silva Souza</title>
	<link>https://www.hiago.me/category/javascript/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">147457425</site>	<item>
		<title>Error Tracking: Localizando bugs antes de seus clientes ?</title>
		<link>https://www.hiago.me/2018/10/05/error-tracking-localizando-bugs-antes-de-seus-clientes/</link>
					<comments>https://www.hiago.me/2018/10/05/error-tracking-localizando-bugs-antes-de-seus-clientes/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Fri, 05 Oct 2018 11:00:09 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Infraestrutura]]></category>
		<category><![CDATA[Ionic]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Sentry]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[sentry]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tracking]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=478</guid>

					<description><![CDATA[<p>Você tem problema em não conseguir simular ou prever os erros que acontecem com o seu software? Caso a resposta seja sim pare o que está fazendo e leia esse post agora! Vamos falar de uma ferramenta para error tracking que vai salvar sua vida e tudo isso com um custo 0. O que é &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/10/05/error-tracking-localizando-bugs-antes-de-seus-clientes/">Error Tracking: Localizando bugs antes de seus clientes ?</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Você tem problema em não conseguir simular ou prever os erros que acontecem com o seu software? Caso a resposta seja sim pare o que está fazendo e leia esse post agora! Vamos falar de uma ferramenta para error tracking que vai salvar sua vida e tudo isso com um custo 0.</p>
<h1>O que é Error Tracking?</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_3]</span></p>
<p>Error Tracking é o ato de você rastrear erros. Aplicado na área de software o &#8220;Bug Tracking&#8221; é um aplicativo de software projetado para ajudar na <strong>garantia da qualidade de software</strong>. Ter um sistema de rastreamento de bugs é extremamente valioso no desenvolvimento de software, e eles são usados extensivamente por empresas que desenvolvem produtos de software.</p>
<p>Existem sistemas para gerir erros como o MantisBT mas hoje vamos falar de um carinha &#8220;diferente&#8221;. Apesar do MantisBT ser uma ferramenta muito popular todo o seu processo querendo ou não inicia com a iteração do usuário e nosso objetivo no post é descobrir bugs antes dos clientes reportarem ou pelo menos descobrir o máximo possível.</p>
<h1>O que eu ganho com isso?</h1>
<p>Podemos começar com tempo? Sim né, tempo é dinheiro! Se você diminui tempo para resolver problemas, automaticamente ganha tempo para criar novas soluções. Após isso acredito que á confiança de seus clientes, já pensou um cliente seu reportar um problema e você talvez já ter a solução? Ou melhor ainda, talvez ele nem precise reportar isso a você! Lindo né? Não podemos deixar de falar da qualidade de seu produto, pois a evolução vai ser constante.</p>
<p>Existem muitos ganhos poderia ficar aqui falando sobre todos eles, mas com os ganhos relatados acima já vale a pena saber mais sobre o assunto né?</p>
<h1>Onde eu posso aplicar?</h1>
<p>Praticamente em qualquer produto de software, seja aplicativos mobile, api&#8217;s, front-end, é escrito usando uma linguagem de programação suportada (acredite o suporte é grande) então você pode rastrear os erros fazendo uso da ferramenta. Eu já apliquei em aplicações escritas em PHP, Java, Ionic, FrontEnd&#8217;s HTML + Javascript&#8230;</p>
<h1>Qual o trabalho para implantar?</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_2]</span></p>
<p>Posso dizer que foi uma das ferramentas mais rápidas que já implantei na vida! Menos de 15 minutos e uau ? estava rastreando tudo. Mas isso vai alem de rastrear os erros, então temos um trabalhinho em reanalisar nosso processo de software, como por exemplo. Você versiona sua ferramenta usando um VCS? Sua aplicação tem uma politica de versionamento como por exemplo o <a href="https://semver.org/" target="_blank" rel="noopener">Semantic Versioning</a>? Isso tudo é importante mas vamos deixar esses detalhes para um próximo post.</p>
<h1>Qual ferramenta é essa, fala logo Hiago ?!</h1>
<p><img decoding="async" class="alignnone size-medium wp-image-479" src="https://www.hiago.me/wp-content/uploads/2018/10/skydive-654822cb21db40a6b29907dc217cb209edf32a552938c0f44758c80b853e5037.svg" alt="" width="1" height="1" /> <img decoding="async" class=" wp-image-480 alignleft" src="https://www.hiago.me/wp-content/uploads/2018/10/sentry-dev-heroes-300x214.png" alt="" width="149" height="106" srcset="https://www.hiago.me/wp-content/uploads/2018/10/sentry-dev-heroes-300x214.png 300w, https://www.hiago.me/wp-content/uploads/2018/10/sentry-dev-heroes-768x549.png 768w, https://www.hiago.me/wp-content/uploads/2018/10/sentry-dev-heroes.png 817w" sizes="(max-width: 149px) 100vw, 149px" />Apresento a vocês o <a href="https://sentry.io/welcome/">Sentry</a> ele atende tudo o que mencionei de forma simples, clara e objetiva! O Sentry é uma plataforma de rastreamento de erro de código aberto que fornece lógica completa de aplicativos, contexto profundo e visibilidade em toda a pilha em tempo real. <em><strong>Pela primeira vez</strong></em>, os desenvolvedores podem corrigir erros em todos os estágios do ciclo de vida do produto, bem antes dos usuários encontrarem um problema.</p>
<h1></h1>
<h1>Vamos colocar a mão na massa?</h1>
<p>Então vamos ver isso funcionando né pessoal, muito papo e pouca ação ninguém gosta disso. Para o exemplo a seguir eu gostaria de deixar umas coisas claras.</p>
<ol>
<li>O Sentry é gratuito caso você queira baixar o sistema e hospedar ele por conta própria, mas ele oferece serviços em cloud e isso é pago (mas tem uma conta free com algumas limitações). Para mostrar o funcionamento, vou estar fazendo o uso da conta free deles.</li>
<li>Capturar informações do usuário sem seu consentimento &#8220;mesmo que o produto seja seu&#8221; pode causar problemas jurídicos, então deixe bem claro isso em sua política de privacidade e consulte o jurídico de sua empresa.</li>
</ol>
<p>Agora que já sabemos essas informações, vamos lá fazer um <a href="https://sentry.io/signup/" target="_blank" rel="noopener">registro no sentry</a> e criar uma conta grátis. Após preencher os dados ele já vai perguntar em qual linguagem seu projeto está escrito, pela popularidade e facilidade vou mostrar o exemplo para rastrear erros no javascript ok? Então podem selecionar o JavaScript colocar um nome para o seu projeto e clicar em &#8220;Create Project&#8221;.</p>
<p>Ao finalizar esse processo você vai receber as instruções para configurar seu projeto, no nosso caso é só incluir uma tag `script` em nosso index.html e logo após executar a função do sentry para capturar os erros, <em>acho bom lembrar que esses devem ser os primeiros scripts de sua aplicação a serem carregados</em>&#8230; E após isso clicar em All Done.</p>
<p><img fetchpriority="high" decoding="async" class="alignnone wp-image-484" src="https://www.hiago.me/wp-content/uploads/2018/10/sentry-error-info-300x173.png" alt="" width="409" height="236" srcset="https://www.hiago.me/wp-content/uploads/2018/10/sentry-error-info-300x173.png 300w, https://www.hiago.me/wp-content/uploads/2018/10/sentry-error-info-768x443.png 768w, https://www.hiago.me/wp-content/uploads/2018/10/sentry-error-info.png 812w" sizes="(max-width: 409px) 100vw, 409px" /></p>
<h2>Testando uma captura</h2>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_1]</span></p>
<p>Agora é simples, você pode gerar um problema &#8220;proposital&#8221; e ver como ele chega no Sentry. Vou deixar o código HTML abaixo para vocês fazerem seus testes, lembrem-se de mudar a linha 6 com suas credenciais.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-br&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Teste Sentry - Hiago.me&lt;/title&gt;
	&lt;script src=&quot;https://browser.sentry-cdn.com/4.0.6/bundle.min.js&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
	&lt;script&gt;Sentry.init({ dsn: 'INSIRA_SEU_DSN' });&lt;/script&gt;
	
	&lt;script&gt;
		var gerarErro = function () {
			var teste = null;
			teste.Acao();
		};
	&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Testando erro&lt;/h1&gt;
	&lt;button onclick=&quot;gerarErro()&quot;&gt;Clique para gerar um erro&lt;/button&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Após clicarem no botão ele vai chamar um método dentro de um variável que é null e isso vai ser capturado e reportado para você ??. Conforme a imagem abaixo.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-485" src="https://www.hiago.me/wp-content/uploads/2018/10/erro-gerado-sentry-300x202.png" alt="" width="478" height="322" srcset="https://www.hiago.me/wp-content/uploads/2018/10/erro-gerado-sentry-300x202.png 300w, https://www.hiago.me/wp-content/uploads/2018/10/erro-gerado-sentry.png 761w" sizes="(max-width: 478px) 100vw, 478px" /></p>
<h1>Conclusão</h1>
<p>Com o Sentry é muito simples fazer o seu Error Tracking, ele é uma ferramenta enorme e tem muitas outras funcionalidades que não quis citar aqui no post. Essa foi uma apresentação de uma série de posts que vou fazer sobre o assunto. Espero que tenham gostado e quero que fiquem por dentro de outras dicas por isso curtam minha <a href="https://www.facebook.com/hiagodotme" target="_blank" rel="noopener">página no facebook</a> =)</p>
<p>The post <a href="https://www.hiago.me/2018/10/05/error-tracking-localizando-bugs-antes-de-seus-clientes/">Error Tracking: Localizando bugs antes de seus clientes ?</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/10/05/error-tracking-localizando-bugs-antes-de-seus-clientes/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">478</post-id>	</item>
		<item>
		<title>TypeScript: Interface ou Classes?</title>
		<link>https://www.hiago.me/2018/09/16/typescript-interface-ou-classes/</link>
					<comments>https://www.hiago.me/2018/09/16/typescript-interface-ou-classes/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sun, 16 Sep 2018 19:47:59 +0000</pubDate>
				<category><![CDATA[Angular]]></category>
		<category><![CDATA[Ionic]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[dicas]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[transpilacao]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=448</guid>

					<description><![CDATA[<p>Em aula o professor citou uma diferença bem importante entre o uso de interface e de classes no TypeScript. Então resolvi fazer um post para mostrar a vocês qual é essa diferença e como ela impactar seus aplicativos. TypeScript [wp_ad_camp_3] O TypeScript é uma linguagem criada pela microsoft para ajudar na criação de aplicações JavaScript &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/09/16/typescript-interface-ou-classes/">TypeScript: Interface ou Classes?</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Em aula o professor citou uma diferença bem importante entre o uso de interface e de classes no TypeScript. Então resolvi fazer um post para mostrar a vocês qual é essa diferença e como ela impactar seus aplicativos.</p>
<h1>TypeScript</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_3]</span></p>
<p style="text-align: left;">O TypeScript é uma linguagem criada pela microsoft para ajudar na criação de aplicações JavaScript adicionando recursos poderosos como por exemplo: tipagem e propriedades estáticas. As classes foram introduzidas oficialmente no ecossistema do javascript no ES6 mas por razões de compatibilidade o TypeScript permite que você faça a transpilação para o ES5 para aumentar a compatibilidade do seu código.</p>
<h1>O que é transpilação?</h1>
<p>Transpilação nada mais é que pegar seu código e converter ele para outro em tempo de compilação ou seja, o programador escreve seu código em uma linguagem e após compilar ele converte esse código para um equivalente em outra linguagem de programação.</p>
<h1>Problema?</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_2]</span></p>
<p>Geralmente quando desenvolvemos fazendo o uso do TypeScript seguimos a lógica de modelar todas as nossas informações (o que é sensacional e deve ser feito) e para isso geralmente seguimos nossos conhecimento de orientação a objetos e saímos criando nossas classes de modelos (as models). O problema é que o uso de classes gera um over head muito grande no código transpilado e isso aumenta o tamanho de nossos arquivos JS e com isso o tamanho de nosso aplicativo.</p>
<p>Abaixo deixo uma imagem de uma classe no TypeScript:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-449" src="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-typescript-300x186.png" alt="" width="300" height="186" srcset="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-typescript-300x186.png 300w, https://www.hiago.me/wp-content/uploads/2018/09/exemplo-typescript.png 504w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>O resultado do código acima após ser transpilado seria um código mais ou menos como esse na imagem abaixo:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-450" src="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-gerado-js-300x217.png" alt="" width="300" height="217" srcset="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-gerado-js-300x217.png 300w, https://www.hiago.me/wp-content/uploads/2018/09/exemplo-gerado-js.png 604w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>É muito código para uma definição de uma classe não concordam?</p>
<h1>E a solução?</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_1]</span></p>
<p>Em JavaScript a tipagem não existe ou seja o tipo da variável é o que tem dentro dela. O TypeScript ajuda no desenvolvimento implementando controles como esses minimizando erros e melhorando a performance no desenvolvimento. Ao criar uma interface o TypeScript faz o uso dela na compilação e após isso não faz a transpilação para o JavaScript. Já as classes são definições, elas possuem métodos com regras aplicadas e isso precisa ser transpilado.</p>
<p>Mas calma, não se apavorem! Muitas classes realmente precisam e devem ser implementadas dessa forma mas nas classes de modelo não tem essa necessidade, afinal de contas não é comum você implementar métodos em suas models não é mesmo? Para isso podemos simplesmente substituir nossas classes de modelos por &#8220;interfaces&#8221; assim ao transpilar elas não vão gerar esse código &#8220;desnecessário&#8221; em nossa aplicação.</p>
<p>Abaixo deixo o exemplo de definição para a mesma classe só que fazendo uso de interface:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-451" src="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-interface-typescript-300x134.png" alt="" width="300" height="134" srcset="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-interface-typescript-300x134.png 300w, https://www.hiago.me/wp-content/uploads/2018/09/exemplo-interface-typescript.png 581w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>O resultado do código transpilado é exatamente como na imagem abaixo:</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-452" src="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-interface-javascript-300x44.png" alt="" width="300" height="44" srcset="https://www.hiago.me/wp-content/uploads/2018/09/exemplo-interface-javascript-300x44.png 300w, https://www.hiago.me/wp-content/uploads/2018/09/exemplo-interface-javascript.png 606w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>O resultado da transpilação não gera código JavaScript isso é importante porque diminui o tamanho do build e melhora o tempo de processamento para tarefas como concat e minify.</p>
<h1>Conclusão</h1>
<p>Uma simples mudança ajuda na diminuição de tamanho do build de nossos sistemas e melhora o seu tempo de compilação. O Angular é um exemplo que usa esse pensamento em suas bibliotecas, eles simplesmente exportam as interfaces para serem utilizadas nos projetos.</p>
<p>Deixo como dica o site <a href="http://www.typescriptlang.org/play/">http://www.typescriptlang.org/play/</a> entrem lá coloquem o conteúdo de todas as suas models e façam vocês mesmo os testes.</p>
<p>The post <a href="https://www.hiago.me/2018/09/16/typescript-interface-ou-classes/">TypeScript: Interface ou Classes?</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/09/16/typescript-interface-ou-classes/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">448</post-id>	</item>
		<item>
		<title>Ionic &#038; Angular: Fazendo o CORS seu amigo</title>
		<link>https://www.hiago.me/2018/09/08/ionic-angular-fazendo-o-cors-seu-amigo/</link>
					<comments>https://www.hiago.me/2018/09/08/ionic-angular-fazendo-o-cors-seu-amigo/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sat, 08 Sep 2018 18:03:07 +0000</pubDate>
				<category><![CDATA[Infraestrutura]]></category>
		<category><![CDATA[Ionic]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PWA]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[cors]]></category>
		<category><![CDATA[ionic]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[técnicas]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=418</guid>

					<description><![CDATA[<p>Se esse post chamou sua atenção, com certeza você já teve ou ainda tem problemas com o CORS. Meu objetivo aqui é mostrar a importância desse mecanismo de segurança e como fazer o seu uso de forma consciente e clara. Antes de criticarmos ou falar que algo é ruim, é bom entendermos o motivo pelo &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/09/08/ionic-angular-fazendo-o-cors-seu-amigo/">Ionic &#038; Angular: Fazendo o CORS seu amigo</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Se esse post chamou sua atenção, com certeza você já teve ou ainda tem problemas com o CORS. Meu objetivo aqui é mostrar a importância desse mecanismo de <em><strong>segurança</strong></em> e como fazer o seu uso de forma consciente e clara.</p>
<p>Antes de criticarmos ou falar que algo é ruim, é bom entendermos o motivo pelo qual aquilo existe.</p>
<h1>Porque o CORS existe?</h1>
<p>O CORS (do inglês cross-origin resource sharing) é um mecanismo que permite que os conteúdos de domínios diferentes sejam compartilhados. Ele existe para evitar que o conteúdo de um determinado domínio seja utilizado por outro sem a autorização do mesmo.</p>
<p>Exemplo: supondo que eu queira exibir os conteúdos do youtube em meu site, faço uma análise das requisições HTTP&#8217;s feitas pelo youtube, obtendo os parâmetros da chamada criaria uma UI para usar as informações do youtube, tirando assim proveiro dos dados deles. O CORS impediria que essa ação fosse executada na <em>camada do navegador</em>, ou seja é uma segurança para você!</p>
<h1>Como funcionar o CORS?</h1>
<p>O CORS vai analisar se o recurso que você tenta carregar está sob o mesmo domínio e porta. Com isso mesmo que você tenha sua API rodando no endereço &#8220;http://localhost:8080&#8221; e sua aplicação ionic/angular rodando em suas respectivas portas (8100/4200) ao chamar a API com toda certeza vai ter sua requisição bloqueada e vai receber a mensagem de CORS.</p>
<p>Quando você não está sob o mesmo domínio você vai notar na parte de redes que uma requisição http gera 2 outras chamadas. A primeira chamada usa o verbo http OPTIONS, ele é utilizado pelo navegador para perguntar ao  seu servidor/aplicação quais os tipos de requisição sua aplicação permite e é no OPTIONS que você deve informar suas configurações do CORS através de Headers.</p>
<h2>Opções para o CORS</h2>
<ol>
<li><strong>Access-Control-Allow-Origin: </strong>Header utilizado para informar quais domínios você <em><strong>permite</strong></em> que use o seu conteúdo.</li>
<li><strong>Access-Control-Allow-Methods:</strong> Header utilizado para informar quais verbos http você <em><strong>permite</strong></em> a partir dos <em><strong>domínios</strong></em> liberados.</li>
<li><strong>Access-Control-Allow-Headers:</strong> Header utilizado para informar quais &#8220;Headers&#8221; os domínios liberados podem enviar para você.</li>
<li><strong>Access-Control-Max-Age:</strong> Header utilizado para informar quanto tempo é válido essas configurações de CORS.</li>
</ol>
<h1>O que não devo fazer?</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_3]</span></p>
<p>Bom acho que a primeira coisa que você deve se questionar é: Preciso realmente liberar o CORS em seu ambiente? Mesmo em aplicações ionic a liberação não é necessária. O mesmo para Angular, vendo que em produção o domínio será o mesmo (ou não rs).</p>
<p>Mas vamos lá, supondo que você chegou a conclusão que liberar o CORS é realmente necessário, não faça isso &#8220;<strong>Access-Control-Allow-Origin: *</strong>&#8221; ao fazer isso você está simplesmente tirando uma camada de segurança que foi criada para você. Caso você esteja rodando uma aplicação ionic (já compilada), não é necessário liberar o CORS mas caso queira liberar é necessário apenas  permitir o endereço http://localhost:8080/ que é o endereço que o ionic utiliza para carregar sua aplicação compilada ou seja a liberação correta (caso deseje fazer) é &#8220;<strong>Access-Control-Allow-Origin: http://localhost:8080</strong>&#8220;.</p>
<p>Outra coisa bem importante é o <strong>Access-Control-Max-Age </strong>geralmente nos tutoriais ninguém comenta sobre ele. Lembra aquela segunda requisição? A do tipo OPTIONS, então ela é feita quando expira o <strong>Access-Control-Max-Age </strong>então se você não falar para o navegador que essas definições só mudam de X em X tempos todo e qualquer request que você fizer o seu servidor vai receber duas requisições (cada browser tem seu tempo padrão). Em ambiente de desenvolvimento, geralmente desabilitamos os cache&#8217;s e com isso o <strong>Access-Control-Max-Age</strong> não vai fazer efeito. Mas em ambiente de produção é algo muito importante.</p>
<h1>Como assim não preciso liberar o CORS para o ionic?</h1>
<p>Sim é isso mesmo, não precisa! E já vou explicar o motivo. Quando você desenvolve seu aplicativo, você geralmente testa seu projeto seu navegador e ele implementa o Same-Origin-Policy por isso que você tem problemas com CORS e acaba fazendo tudo quanto é tipo de liberação. Porém quando o seu aplicativo é compilado para APK ou IPA o ionic de forma nativa consegue desabilitar o CORS da WebView (e eles já fazem isso).</p>
<p>Vale lembrar que para o iOS o ionic sempre usou o <em><strong>UIWebView</strong></em> só que agora eles migraram para o <em><strong>MKWebView</strong></em> e no iOS eles não conseguem desabilitar o CORS nessa webview em especifico =/. Então ou você faz um downgrade da webview, ou você libera o CORS para a origem &#8220;<strong>http://localhost:8080</strong>&#8221; ai é uma decisão pessoal, basta acessar a <a href="https://ionicframework.com/docs/wkwebview/">documentação</a> com as melhorias propostas pela <em><strong>MKWebView</strong></em> e colocar na balança.</p>
<p>Para fazer o downgrade da WebView basta colocar o conteúdo abaixo em seu config.xml para a plataforma iOS:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;preference name=&quot;CordovaWebViewEngine&quot; value=&quot;CDVUIWebViewEngine&quot; /&gt;

</pre>
<h1>E meu ambiente de desenvolvimento, como faço?</h1>
<p>Então para você desabilitar a checagem do CORS em seu ambiente de desenvolvimento você pode fazer uso de uma <a href="https://chrome.google.com/webstore/detail/moesif-origin-cors-change/digfbfaphojjndkpccljibejjbppifbc">extensão do google chrome </a>mas eu não recomendo, tive muitos problemas com essa extensão. Ela liberou o CORS mas sempre me trouxe problema com encodings em outros sites que eu acessava.</p>
<h2>Não quer usar a extensão?</h2>
<p>Então vamos lá, o ionic e o angular tem um recurso bem interessante e muito pouco conhecido que tem exatamente essa função (impedir problemas com CORS) são os proxies.  É algo bem simples, mas eles são apenas para ambientes de desenvolvimento. Então não se esqueça de criar uma configuração para seu endpoint  🙂</p>
<h2>O que é um proxy? Como ele funciona?</h2>
<p>Um proxy basicamente é um serviço intermediário entre você e seu servidor de aplicação, ele recebe sua requisição e repassa ela para o servidor original.</p>
<p>Vamos criar o seguinte cenário: Tenho a url (http://localhost:8888/) rodando um backend, então vamos criar um mapeamento para informar que tudo que for chamado na uri <strong>/api </strong>seja passado para o backend.</p>
<p>Vamos supor que você esteja desenvolvendo em uma aplicação ionic, ao digitar o endereço http://localhost:8100/api/criar-usuario ele vai redirecionar internamente no processo do ionic serve a requisição para http://localhost:8888/criar-usuario então sua aplicação vai estar chamando uma URL que está no mesmo <strong>domínio</strong> e na mesma <strong>porta </strong>assim a Same-Origin-Policy não vai ser aplicada e você pode seguir seu desenvolvimento sem necessidade de liberar o CORS para desenvolver.</p>
<h1>Configurando o proxy no ionic</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_2]</span></p>
<p>Para configurar o proxy no ionic basta abrir o arquivo <strong>ionic.config.json </strong>e criar uma nova propriedade chamada <strong>proxies</strong> e nela definir seus paths.</p>
<p>Exemplo:</p>
<pre class="brush: jscript; title: ; notranslate">
{
	&quot;name&quot;: &quot;app-meuapp&quot;,
	&quot;app_id&quot;: &quot;&quot;,
	&quot;type&quot;: &quot;ionic-angular&quot;,
	&quot;proxies&quot;: &#x5B;{
		&quot;path&quot;: &quot;/api&quot;,
		&quot;proxyUrl&quot;: &quot;http://localhost:8888/&quot;
	}],
	&quot;integrations&quot;: {
		&quot;cordova&quot;: {}
	}
}
</pre>
<h1>Configurando o proxy no Angular</h1>
<p>Para fazer a configuração de seu proxy no Angular o processo é semelhante. Para isso é necessário criar um arquivo JSON com as configurações os paths desejados. Então vamos criar o arquivo <strong>proxy.conf.json </strong>e vamos colocar o conteúdo abaixo. Após isso basta você inicializar seu projeto com o comando <strong>ng serve &#8211;proxy-config proxy.conf.json.</strong></p>
<p>Observação: Recomendo que coloque esse comando na chave start do <strong>package.json</strong> assim você só vai precisar rodar o comando <strong>npm start</strong></p>
<p>Conteúdo para o proxy.conf.json</p>
<pre class="brush: jscript; title: ; notranslate">
{
  &quot;/api&quot;: {
    &quot;target&quot;: &quot;http://localhost:8888&quot;,
    &quot;secure&quot;: false
  }
}
</pre>
<h1>Conclusão</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_1]</span></p>
<p>O CORS é um recurso de segurança muito importante e precisamos gerenciar ele de acordo com as necessidades do nosso projeto, fazendo o uso das técnicas mencionadas nesse post é possível trabalhar sem dor de cabeça e claro ter um desenvolvimento saudável e seguro.</p>
<p>The post <a href="https://www.hiago.me/2018/09/08/ionic-angular-fazendo-o-cors-seu-amigo/">Ionic &#038; Angular: Fazendo o CORS seu amigo</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/09/08/ionic-angular-fazendo-o-cors-seu-amigo/feed/</wfw:commentRss>
			<slash:comments>28</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">418</post-id>	</item>
		<item>
		<title>Promise ou Observable? Quais as diferenças?</title>
		<link>https://www.hiago.me/2018/09/08/promise-ou-observable-quais-as-diferencas/</link>
					<comments>https://www.hiago.me/2018/09/08/promise-ou-observable-quais-as-diferencas/#respond</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sat, 08 Sep 2018 13:56:33 +0000</pubDate>
				<category><![CDATA[Ionic]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[angular]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[observables]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=398</guid>

					<description><![CDATA[<p>Muitos desenvolvedores (inclusive eu) acabam se confundindo o uso de promises e o de observables. Por esse motivo resolvi fazer esse post com exemplos e explicações detalhadas sobre cada um deles. O que é uma promise? A promise é uma abstração para representar fluxos de ações em códigos assíncronos. No JavaScript é um objeto e &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/09/08/promise-ou-observable-quais-as-diferencas/">Promise ou Observable? Quais as diferenças?</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Muitos desenvolvedores (inclusive eu) acabam se confundindo o uso de promises e o de observables. Por esse motivo resolvi fazer esse post com exemplos e explicações detalhadas sobre cada um deles.</p>
<h1>O que é uma promise?</h1>
<p>A promise é uma abstração para representar fluxos de ações em códigos assíncronos. No JavaScript é um objeto e seu resultado representa uma operação assíncrona ela pode ser resolvida ou rejeitada.</p>
<p>A promise possui duas maneiras para retornar a informação, são as funções de callback resolve e reject. As duas chamam métodos retornados junto a promise. Os métodos then e catch, são retornados juntos a promise e eles são responsáveis por receber os métodos de callback para a operação.</p>
<p>Exemplos de uma promise:</p>
<pre class="brush: jscript; title: ; notranslate">
// ATENÇÃO: Exemplo em javascript puro.
saldoConta = 100;
function sacar(valor) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            if (saldoConta &lt; valor) {
                reject(&quot;Você não possui saldo suficiente&quot;);
            } else {
                saldoConta = saldoConta - valor;
                resolve(&quot;Saldo retirado com sucesso&quot;);
            }
        }, 3000);
    });
}

// agora vamos sacar 90 reais?
sacar(90).then(function(r) {
    alert('sucesso: ' + r);
}).catch(function(e) {
    alert('erro: ' + e);
});

// agora vamos sacar mais 11 reais?
sacar(11).then(function(r) {
    alert('sucesso: ' + r);
}).catch(function(e) {
    alert('erro: ' + e);
});
</pre>
<p>É simples assim, a promessa resolve ou rejeita sua solicitação.</p>
<h1>O que é um Observable?</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_3]</span></p>
<p>Observables fornecem suporte para a transmissão de mensagens entre editores e assinantes em seu aplicativo. Os observables ​​oferecem benefícios significativos em relação a outras técnicas para manipulação de eventos, programação assíncrona e manipulação de vários valores.</p>
<p>Os observables ​​são declarativos &#8211; isto é, você define uma função para publicar valores, mas não é executado até que um consumidor assine a ele. O consumidor inscrito recebe notificações até que a função seja concluída ou até que elas sejam canceladas.</p>
<p>Um observable pode fornecer vários valores de qualquer tipo &#8211; literais, mensagens ou eventos, dependendo do contexto. A API para receber valores é a mesma, quer os valores sejam entregues de forma síncrona ou assíncrona. Como a lógica de configuração e de desmontagem são tratadas pelo observable, o código do seu aplicativo só precisa se preocupar em se inscrever para consumir valores e, quando terminar, desinscrever. Vou deixar abaixo o exemplo de um Observable para escutar mudança da posição geográfica do usuário usando a API geolocation.</p>
<pre class="brush: jscript; title: ; notranslate">
// Cria um Observable que ouve as atualizações de geolocalização
// quando um consumidor se inscreve
const locations = new Observable((observer) =&gt; {
	// Obtenha os próximos retornos de chamada e erros. Estes serão passados quando
	// o consumidor assina.
	const {
		next,
		error
	} = observer;
	let watchId;

	// a API geolocation checa valores para publicar.
	if ('geolocation' in navigator) {
		watchId = navigator.geolocation.watchPosition(next, error);
	} else {
		error('Geolocation not available');
	}

	// Quando o consumidor cancelar a assinatura, limpe os dados prontos para a próxima assinatura.
	return {
		unsubscribe() {
			navigator.geolocation.clearWatch(watchId);
		}
	};
});

// Chame o subscribe() para ouvir as atualizações.
const locationsSubscription = locations.subscribe({
	next(position) {
		console.log('Posição Atual: ', position);
	},
	error(msg) {
		console.log('Erro ao recuperar localização: ', msg);
	}
});

// Para de ouvir após 10 segundos
setTimeout(() =&gt; {
	locationsSubscription.unsubscribe();
}, 10000);
</pre>
<h1>Requisições HTTP</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_2]</span></p>
<p>Agora que já vimos sobre promises e sobre os observables, vamos imaginar eles aplicados em uma requisição HTTP. Saindo um pouquinho da caixa, requisições HTTP são utilizadas constantemente (obvio né? kkk) elas além de resolver e rejeitar tem uma série de fatores que podem acontecer em seu ambiente externo ou interno que necessitam de tratativas especiais.</p>
<p>Requisições HTTP podem falhar por problemas de conexão, requisições HTTP podem nos informar sobre seu progresso, requisições HTTP podem ser canceladas&#8230;</p>
<h2>Sua requisição falhou, e agora?</h2>
<p>Podemos dizer que é comum termos requisições que não são concluídas, quando isso ocorre geralmente mostramos um erro para o usuário ou então implementamos algum método para tentar novamente. Com o observable podemos tratar isso facilmente com o operador &#8220;retry&#8221;, com ele podemos especificar quantas vezes nosso observable pode tentar refazer a requisição. Legal né?</p>
<h2>O usuário saiu da tela antes da requisição se completar, e agora?</h2>
<p>É muito comum o usuário cancelar uma ação, seja por erro dele, ou por demora em obter a resposta, ele pode e com certeza ele vai sair da sua operação para tentar novamente. Como você iria cancelar essa operação caso esteja fazendo uso de uma promise? Para isso você teria que fazer alguma implementação externa ou usar algum framework para facilitar a operação. Já com observable você pode simplesmente chamar o operador &#8220;unsubscribe&#8221; e pronto, você já não está mais esperando uma resposta.</p>
<h1>Conclusão</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_1]</span></p>
<p>O observable tem mais vantagens que as promises, e você pode definir quando deseja usar cada um dos recursos. Sobre o observable sua grande vantagem está nos &#8220;poderes&#8221; <i>que ele</i> nos dá com seus operadores. No exemplo acima ao cancelar um request quando o usuário sai da dela, poupou processamento e também conseguimos tratar possíveis problemas de falha, como o retry na perda de conexão. Já com promises é possível cancelar, e fazer os retry mas não usando sua definição e sim usando meios/frameworks alternativos.</p>
<p>Fontes:</p>
<ol>
<li><a href="https://medium.com/tableless/entendendo-rxjs-observable-com-angular-6f607a9a6a00">Entendendo RxJS Observable com Angular</a></li>
<li><a href="https://pt.stackoverflow.com/questions/119907/o-que-s%C3%A3o-promises-promessas-em-javascript">Promises em Javascript</a></li>
<li><a href="https://angular.io/guide/observables">Angular &#8211; Observables</a></li>
</ol>
<p>&nbsp;</p>
<p>The post <a href="https://www.hiago.me/2018/09/08/promise-ou-observable-quais-as-diferencas/">Promise ou Observable? Quais as diferenças?</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/09/08/promise-ou-observable-quais-as-diferencas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">398</post-id>	</item>
		<item>
		<title>Gulp + Ionic: Automatizando Release no Android</title>
		<link>https://www.hiago.me/2018/08/18/gulp-ionic-automatizando-release-no-android/</link>
					<comments>https://www.hiago.me/2018/08/18/gulp-ionic-automatizando-release-no-android/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sat, 18 Aug 2018 21:48:54 +0000</pubDate>
				<category><![CDATA[Ionic]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[automatizando]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[gulp]]></category>
		<category><![CDATA[ionic]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=368</guid>

					<description><![CDATA[<p>Todos que já finalizaram um projeto em ionic, tiveram que passar pelo &#8220;Publishing your app&#8221; e quando você tem que lançar suas atualizações constantemente fica chato ter que ficar repetindo esses procedimentos, por isso resolvi fazer esse post para mostrar como vocês podem automatizar não só esse, como qualquer outro processo usando o Gulp + &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/08/18/gulp-ionic-automatizando-release-no-android/">Gulp + Ionic: Automatizando Release no Android</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Todos que já finalizaram um projeto em ionic, tiveram que passar pelo &#8220;<a href="https://ionicframework.com/docs/v1/guide/publishing.html">Publishing your app</a>&#8221; e quando você tem que lançar suas atualizações constantemente fica chato ter que ficar repetindo esses procedimentos, por isso resolvi fazer esse post para mostrar como vocês podem automatizar não só esse, como qualquer outro processo usando o Gulp + Ionic.</p>
<h1>Gulp</h1>
<p>O Gulp é um kit de ferramentas para automatizar tarefas massantes/demoradas no fluxo de trabalho do desenvolvimento, com ele é possível automatizar essas tarefas de maneira simples e confiável.</p>
<h1>Preparando o ambiente</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_3]</span></p>
<p>Primeiro você deve instalar em seu projeto ionic as dev-dependencies abaixo:</p>
<pre class="brush: plain; title: ; notranslate">

npm install --save-dev gulp run-sequence shelljs

</pre>
<h1>Criando sua KeyStore</h1>
<p>A keystore é única, ela é quem garante que você e somente você consiga fornecer uma atualização segura para seus usuários.</p>
<p>Como a KeyStore é gerada uma única vez, não vejo motivos para automatizar no processo do Gulp. A Keystore é o segundo passo do &#8220;<a href="https://ionicframework.com/docs/v1/guide/publishing.html">Publishing your app</a>&#8220;. Entre no diretório de sua aplicação e na mesma pasta de seu package.json, execute o comando abaixo informando os seus dados e criando uma senha que você vai usar depois na nossa tarefa do Gulp. Mantenha a mesma senha, tanto para o keystore quanto para o alias.</p>
<pre class="brush: plain; title: ; notranslate">
keytool -genkey -v -keystore chave-distribuicao.keystore -alias ID_DO_SEU_CONFIG_XML -keyalg RSA -keysize 2048 -validity 10000
</pre>
<p>Note que no comando acima tem a informação <em><strong>ID_DO_SEU_CONFIG_XML</strong></em> essa informação deve ser substituída pelo id que você colocou no seu config.xml, o padrão para os id do config.xml é <em><strong>br.com.seuappsite.app</strong></em>.</p>
<h1>Package.Json</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_2]</span></p>
<p>Agora vamos editar nosso package.json, e vamos adicionar um novo valor dentro dos scripts. Crie uma nova chave com o nome &#8220;<strong>build:release</strong>&#8221; com o valor &#8220;<strong>gulp release</strong>&#8220;.</p>
<h1>Gulpfile</h1>
<p>Agora precisamos criar um arquivo chamado gulpfile.js no mesmo diretório do seu package.json ele é quem vai fazer todo o trabalho de executar o &#8220;ionic cordova build &#8211;prod &#8211;release&#8221;, e os outros passos para assinar e alinhar o seu aplicativo. E o resultado final vai ser o seu APK pronto para distribuição na pasta dist.</p>
<p>Conteúdo do Gulpfile.js:</p>
<pre class="brush: plain; title: ; notranslate">
const gulp = require('gulp'),
      fs = require('fs'),
      path = require('path'),
      runSequence = require('run-sequence'),
      shelljs = require('shelljs'),
      config = {
           pwd: &quot;SENHA_ESCOLHIDA_NA_CHAVE&quot;,
           alias: &quot;ID_DO_SEU_CONFIG_XML&quot;,
           keystore: &quot;chave-distribuicao.keystore&quot;
      };

gulp.task('release', function () {

    const apks = fs.readdirSync('./dist');
    for(apk of apks) {
        // verificando apks não assinados
        if(apk.indexOf('.apk') &gt; -1) {
            fs.unlinkSync(`./dist/${apk}`);
        }
    }

    if(config.pwd === 'keystore_password' || config.pwd === '') {
        console.error('Edite o gulpfile.js e informe a senha de sua keystore.');
        return shelljs.exit(1);
    }

    runSequence('compilar-release', 'assinar-apk', 'alinhar-apk', function () {

    });
});

/**
 * Compilo com a flag --prod e --release no ionic
 */
gulp.task('compilar-release', function () {
    const out = shelljs.exec('ionic cordova build android --release --prod --no-interactive', {silent:true}).stdout;
    const buildReturn = out.split('Built the following apk(s):');

    // verifico se o build deu certo
    if(buildReturn.length &gt; 1) {
        const apks = buildReturn&#x5B;1].replace(/\r/, '').replace(/\t/, '').split('\n'),
              realApks = &#x5B;];
        for(apk of apks) {
            // recupero os apks releases gerados
            if(apk.indexOf('release-unsigned.apk') &gt; -1) {
                realApks.push(apk);
            }
        }

        // verificando se a pasta dist existe.
        if(!fs.existsSync('./dist')) {
            fs.mkdirSync('./dist');
        }

        // movendo apks para a dist
        for(apk of realApks) {
            let splitter = &quot;/&quot;;
            if(apk.indexOf(&quot;\\&quot;) &gt; -1) {
                splitter = &quot;\\&quot;;
            }

            let fileName = apk.split(splitter);
            fileName = fileName&#x5B;fileName.length - 1];

            fs.copyFileSync(apk, './dist/' + fileName);
            fs.unlinkSync(apk);
        }
    } else {
        // erro no build
        shelljs.exit(1);
    }
});

/**
 * Assina o APK com release
 */
gulp.task('assinar-apk', function () {
    const apks = fs.readdirSync('./dist');
    for(apk of apks) {
        // verificando apks não assinados
        if(apk.indexOf('release-unsigned.apk') &gt; -1) {
            let signCommand = `jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ${config.keystore} -storepass ${config.pwd} -keypass ${config.pwd} ./dist/${apk} ${config.alias}`;
            const signCommandResult = shelljs.exec(signCommand, {silent:true}).stdout;
            console.log(signCommandResult);
        }
    }
});

/**
 * Assina o APK com release
 */
gulp.task('alinhar-apk', function () {
    let bdtools = process.env.ANDROID_HOME + path.sep + 'build-tools' + path.sep + fs.readdirSync(process.env.ANDROID_HOME + path.sep + 'build-tools')&#x5B;0] + path.sep;
    console.log(bdtools);
    const apks = fs.readdirSync('./dist');
    for(apk of apks) {
        // verificando apks não assinados
        if(apk.indexOf('release-unsigned.apk') &gt; -1) {
            let alignCommand = `&quot;${bdtools}zipalign&quot; -v 4 ./dist/${apk} ./dist/${apk.replace('-release-unsigned.apk', '')}.apk`;
            const alignCommandResult = shelljs.exec(alignCommand, {silent:true}).stdout;
            fs.unlinkSync(`./dist/${apk}`);
            console.log(alignCommandResult);
        }
    }
});
</pre>
<h1>Testando</h1>
<p><span style="display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: 'Source Sans Pro',Arial,sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">[wp_ad_camp_1]</span></p>
<p>Agora para gerar e assinar seus apks basta você executar o comando abaixo:</p>
<pre class="brush: plain; title: ; notranslate">

npm run build:release

</pre>
<p>Obrigado pessoal, espero que o conteúdo seja útil para vocês.</p>
<p><strong>[27/11/2018] Edição:</strong> Adicionei na linha 32 do Gulpfile.js o parâmetro <strong>&#8211;no-interactive</strong> para corrigir o problema de travar a compilação pelo fato da CLI do ionic perguntar se você deseja fazer a atualização.</p>
<p>The post <a href="https://www.hiago.me/2018/08/18/gulp-ionic-automatizando-release-no-android/">Gulp + Ionic: Automatizando Release no Android</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/08/18/gulp-ionic-automatizando-release-no-android/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">368</post-id>	</item>
		<item>
		<title>Depurar sua aplicação NestJS com o VSCode</title>
		<link>https://www.hiago.me/2018/06/05/depurar-sua-aplicacao-nestjs-com-o-vscode/</link>
					<comments>https://www.hiago.me/2018/06/05/depurar-sua-aplicacao-nestjs-com-o-vscode/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Tue, 05 Jun 2018 23:51:53 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[nestjs]]></category>
		<category><![CDATA[type-script]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[visual studio code]]></category>
		<category><![CDATA[vscode]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=316</guid>

					<description><![CDATA[<p>No meu último post, apresentei a vocês o NestJS. Hoje vou mostrar para vocês como depurar sua aplicação NestJS com o VSCode. Configurando seu VSCode [wp_ad_camp_3] Primeiro abra seu projeto com o Visual Studio Code após isso vá até o menu de Debug (ctrl + shift + D). Segundo clique sobre a engrenagem ao lado &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/06/05/depurar-sua-aplicacao-nestjs-com-o-vscode/">Depurar sua aplicação NestJS com o VSCode</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>No meu <a href="https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/" target="_blank" rel="noopener">último post</a>, apresentei a vocês o NestJS. Hoje vou mostrar para vocês como depurar sua aplicação NestJS com o VSCode.</p>
<h1>Configurando seu VSCode</h1>
<p>[wp_ad_camp_3]</p>
<ol>
<li>Primeiro abra seu projeto com o Visual Studio Code após isso vá até o menu de Debug (ctrl + shift + D).<img loading="lazy" decoding="async" class="alignnone size-medium wp-image-317" src="https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-300x238.png" alt="Imagem com o local do debug." width="300" height="238" srcset="https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-300x238.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode.png 666w" sizes="(max-width: 300px) 100vw, 300px" /></li>
<li>Segundo clique sobre a engrenagem ao lado do combobox. <img loading="lazy" decoding="async" class="alignnone size-medium wp-image-318" src="https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-config-294x300.png" alt="Imagem demonstrando engrenagem para configuração do Debug" width="294" height="300" srcset="https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-config-294x300.png 294w, https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-config.png 556w" sizes="(max-width: 294px) 100vw, 294px" /></li>
<li>Terceiro clique sobre a opção NodeJS</li>
</ol>
<p>Após concluir o terceiro passo vai ser aberto um arquivo chamado <strong>launch.json (</strong>caso pergunte alguma outra informação selecione algum modelo do NodeJS) e substitua o conteúdo que tem nele pelo conteúdo abaixo:</p>
<pre class="brush: jscript; title: ; notranslate">
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    &quot;version&quot;: &quot;0.2.0&quot;,
    &quot;configurations&quot;: &#x5B;
        {
            &quot;type&quot;: &quot;node&quot;,
            &quot;request&quot;: &quot;launch&quot;,
            &quot;name&quot;: &quot;Depurar Projeto&quot;,
            &quot;protocol&quot;: &quot;inspector&quot;,
            &quot;args&quot;: &#x5B;&quot;${workspaceRoot}\\src\\main.ts&quot;],
            &quot;cwd&quot;: &quot;${workspaceRoot}&quot;,
            &quot;runtimeArgs&quot;: &#x5B;
                &quot;-r&quot;,
                &quot;ts-node/register&quot;
            ],
            &quot;internalConsoleOptions&quot;: &quot;openOnSessionStart&quot;
        }
    ]
}
</pre>
<p>Agora é só salvar o conteúdo e seu VSCode já vai estar configurado para depurar aplicações NodeJS + TypeScript usando o Framework NestJS.</p>
<h1>Depurando a Aplicação</h1>
<p>[wp_ad_camp_2]</p>
<p>Agora você já pode colocar seus breakpoints em seu código (clicando no espaço antes do número da linha) pressionar a tecla F5 em seu teclado e ser feliz!</p>
<p>Observação: Caso não funcione a depuração, tente reiniciar o VSCode para ele ler as configuração de Debug feitas por você, comigo não foi necessário, mas pode ser que aconteça.</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-328" src="https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-exemplo-300x200.png" alt="Imagem demonstando o resultado dos passos aqui executados." width="300" height="200" srcset="https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-exemplo-300x200.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-exemplo-768x513.png 768w, https://www.hiago.me/wp-content/uploads/2018/06/debug-vscode-exemplo.png 937w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<h1>Conclusão</h1>
<p>[wp_ad_camp_1]</p>
<p>Com pequenos passos configuramos o ambiente para facilitar nossa vida no trabalho. Escrevi esse post, pois eu fiquei um bom tempo depurando as aplicações usando o <strong>chrome://inspect </strong>e o fato de ficar alternando entre as janelas, tanto para fazer alteração de código quanto para analisar uma informação me incomodava bastante.</p>
<p>&nbsp;</p>
<p>Obrigado e até mais 😉</p>
<p>&nbsp;</p>
<p>The post <a href="https://www.hiago.me/2018/06/05/depurar-sua-aplicacao-nestjs-com-o-vscode/">Depurar sua aplicação NestJS com o VSCode</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/06/05/depurar-sua-aplicacao-nestjs-com-o-vscode/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">316</post-id>	</item>
		<item>
		<title>NestJS: Uma estrutura NodeJS linda e trabalhada</title>
		<link>https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/</link>
					<comments>https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sun, 13 May 2018 15:27:56 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[nest]]></category>
		<category><![CDATA[nestjs]]></category>
		<category><![CDATA[nodejs]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=297</guid>

					<description><![CDATA[<p>Antes de falar do NestJS vamos lembrar que nos últimos anos, graças ao Node.js, o JavaScript se tornou a “língua franca” da web para aplicativos front e backend, dando origem a projetos incríveis como Angular, React e Vue, que melhoram a produtividade do desenvolvedor e permitem a construção de aplicativos frontend testáveis e extensíveis. No &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/">NestJS: Uma estrutura NodeJS linda e trabalhada</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Antes de falar do NestJS vamos lembrar que nos últimos anos, graças ao Node.js, o JavaScript se tornou a “língua franca” da web para aplicativos front e backend, dando origem a projetos incríveis como Angular, React e Vue, que melhoram a produtividade do desenvolvedor e permitem a construção de</span> aplicativos frontend testáveis e extensíveis. <span class="">No entanto, no lado do servidor, embora existam muitas bibliotecas, assistentes e ferramentas excelentes para o Node, nenhum deles resolve efetivamente o problema principal &#8211; a arquitetura.</p>
<p>O Nest visa fornecer uma arquitetura de aplicativo pronta para uso, que permite a criação sem esforço de aplicativos altamente testáveis, escalonáveis, fracamente acoplados e de fácil manutenção.</p>
<h1>O que é?</h1>
<p>[wp_ad_camp_3]</p>
<p>O NestJS é uma estrutura para criar aplicativos do lado do servidor <a href="https://nodejs.org" target="_blank" rel="noopener">Node.js </a>de forma eficiente e escalável. Ele usa JavaScript moderno, é construído com o <a href="https://www.typescriptlang.org/" target="_blank" rel="noopener">TypeScript</a> (porém preserva a compatibilidade com JavaScript puro) e combina elementos de OOP (Programação Orientada a Objetos), FP (Programação Funcional) e FRP (Programação Reativa Funcional).</p>
<p>Por trás de tudo, o NestJS faz uso do Express, permitindo o uso fácil dos inúmeros plugins de terceiros disponíveis.</p>
<h1>O Desenvolvimento</h1>
<p>Para começar a trabalhar com o NestJS é bem simples. Basta você clonar o repositório de um projeto em branco no Github com o modelo que deseja trabalhar (TypeScript ou JavaScript).</p>
<p>Lembrando que para trabalhar com o NestJS você precisa de possuir instalado em seu ambiente o NodeJS.</p>
<p><strong>Criando um novo projeto usando JavaScript puro com o GIT:</strong></p>
<pre class="brush: plain; title: ; notranslate">
$ git clone https://github.com/nestjs/javascript-starter.git meu-primeiro-projeto
$ cd meu-primeiro-projeto
$ npm install
$ npm run start
</pre>
<p><strong>Criando um novo projeto usando TypeScript com o GIT:</strong></p>
<pre class="brush: plain; title: ; notranslate">
$ git clone https://github.com/nestjs/typescript-starter.git meu-primeiro-projeto
$ cd meu-primeiro-projeto
$ npm install
$ npm run start
</pre>
<p><strong>Criando um projeto do zero usando NPM:</strong></p>
<pre class="brush: plain; title: ; notranslate">

$ npm i --save @nestjs/core @nestjs/common @nestjs/microservices @nestjs/websockets @nestjs/testing reflect-metadata rxjs

</pre>
<p>&nbsp;</p>
<h1>Estrutura</h1>
<p>[wp_ad_camp_2]</p>
<p>O NestJS conta com uma estrutura bem conhecida pelos desenvolvedores Java/.NET  ele tem implementado de forma bem simples recursos que são muito utilizados.</p>
<p>Segue abaixo a lista de recursos que o NestJS propõe em sua estrutura atual.</p>
<h2>Controllers</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1">A camada de Controllers é responsável por manipular solicitações recebidas e retornar uma resposta ao cliente, e todo a parte de &#8220;Rota&#8221; já é feito nessa mesma camada.</span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-300 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Controllers_1.png" alt="Imagem mostrando os controllers do NestJS" width="970" height="420" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Controllers_1.png 970w, https://www.hiago.me/wp-content/uploads/2018/05/Controllers_1-300x130.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Controllers_1-768x333.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<h2>Providers</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1">Quase tudo pode ser considerado como um provedor &#8211; provider – service, repository, factory, helper e assim por diante. Todos eles podem injetar dependências através de construtor (Dependency Injection), ou seja, eles podem criar vários relacionamentos entre si. Mas, na verdade, um provedor nada mais é do que apenas uma classe simples anotada com um decorator @Injectable().</span><span id="result_box" class="" lang="pt" tabindex="-1"><span class=""><br />
</span></span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-301 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Providers_1.png" alt="Imagem mostrando os providers do NestJS" width="970" height="518" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Providers_1.png 970w, https://www.hiago.me/wp-content/uploads/2018/05/Providers_1-300x160.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Providers_1-768x410.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<h2>Modules</h2>
<div id="gt-res-content">
<div id="gt-res-dir-ctr" class="trans-verified-button-small" dir="ltr"><span id="result_box" class="" lang="pt" tabindex="-1"><span class="">Um módulo é uma classe que faz uso de um decorator @Module().</span> <span class="">O decorator @Module() fornece metadados, que o Nest usa para organizar a estrutura da aplicação.</span></span></div>
<div dir="ltr"><img loading="lazy" decoding="async" class="alignnone wp-image-302 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Modules_1.png" alt="Imagem mostrando os modules do NestJS" width="970" height="526" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Modules_1.png 970w, https://www.hiago.me/wp-content/uploads/2018/05/Modules_1-300x163.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Modules_1-768x416.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></div>
<h2 dir="ltr">Middlewares</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1">O middleware é uma função que é chamada antes do manipulador de rota. As funções de middleware têm acesso aos objetos de solicitação e resposta, e a próxima função de middleware no ciclo de solicitação-resposta do aplicativo. <span class="">A próxima função de middleware é geralmente denotada por uma variável denominada next.</span></span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-303 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Middlewares_1.png" alt="Imagem mostrando os middlewares do NestJS" width="970" height="220" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Middlewares_1.png 970w, https://www.hiago.me/wp-content/uploads/2018/05/Middlewares_1-300x68.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Middlewares_1-768x174.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></p>
<h2>Exception filters</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1">A camada de exceções interna é responsável por manipular todas as exceções lançadas em todo o seu aplicativo. Quando uma exceção não tratada é detectada, o usuário final receberá uma resposta adequada.</span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-304 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Filter_1.png" alt="Imagem mostrando os filters do NestJS" width="833" height="474" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Filter_1.png 833w, https://www.hiago.me/wp-content/uploads/2018/05/Filter_1-300x171.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Filter_1-768x437.png 768w" sizes="(max-width: 833px) 100vw, 833px" /></p>
<h2>Pipes</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1">Um pipe é uma classe anotada com o decorator @Injectable(). O pipe deve implementar a interface PipeTransform.</span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-305 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Pipe_1.png" alt="Imagem mostrando os pipes do NestJS" width="833" height="474" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Pipe_1.png 833w, https://www.hiago.me/wp-content/uploads/2018/05/Pipe_1-300x171.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Pipe_1-768x437.png 768w" sizes="(max-width: 833px) 100vw, 833px" /></p>
<h2>Guards</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1"><span class="">Um guarda é uma classe anotada com o decorator @Injectable().</span> O guarda deve implementar a interface do CanActivate.</span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-306 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Guards_1.png" alt="Imagem mostrando os guards do NestJS" width="906" height="269" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Guards_1.png 906w, https://www.hiago.me/wp-content/uploads/2018/05/Guards_1-300x89.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Guards_1-768x228.png 768w" sizes="(max-width: 906px) 100vw, 906px" /></p>
<h2>Interceptors</h2>
<p><span id="result_box" class="" lang="pt" tabindex="-1"><span class="">Um interceptor é uma classe anotada com o decorator @Injectable().</span> <span class="">O interceptor deve implementar a interface NestInterceptor.</span></span></p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-307 size-full" src="https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1.png" alt="Imagem mostrando os interceptors do NestJS" width="1800" height="850" srcset="https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1.png 1800w, https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1-300x142.png 300w, https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1-768x363.png 768w, https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1-1024x484.png 1024w, https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1-520x245.png 520w, https://www.hiago.me/wp-content/uploads/2018/05/Interceptors_1-720x340.png 720w" sizes="(max-width: 1800px) 100vw, 1800px" /></p>
<h1>Conclusão</h1>
<p>[wp_ad_camp_1]</p>
<p>O NestJS é uma ótima alternativa de manter seu projeto organizado e escalável. Além de todos os seus recursos conforme apresentado acima ele também oferece suporte a diversos tipos de implementações não citadas como WebSockets, GraphQL e por ai vai.</p>
<p>Vamos lá, não vamos perder tempo! Entre agora na documentação oficial do Nest e deixe sua imaginação trabalhar.</p>
<p><a href="https://www.hiago.me/category/node-js/">+ posts sobre NodeJS</a></p>
</div>
<p>The post <a href="https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/">NestJS: Uma estrutura NodeJS linda e trabalhada</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">297</post-id>	</item>
		<item>
		<title>Annyang: Processamento de áudio com JavaScript</title>
		<link>https://www.hiago.me/2017/11/18/processamento-de-audio-com-javascript/</link>
					<comments>https://www.hiago.me/2017/11/18/processamento-de-audio-com-javascript/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sat, 18 Nov 2017 12:00:23 +0000</pubDate>
				<category><![CDATA[AnnyAng]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Processamento de Áudio]]></category>
		<category><![CDATA[annyang]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[português]]></category>
		<category><![CDATA[processamento]]></category>
		<guid isPermaLink="false">http://www.hiago.me/?p=237</guid>

					<description><![CDATA[<p>Olá, hoje estou aqui para mostrar a vocês como fazer processamento de áudio com javascript através de um Framework bem simples e prático. Hoje em dia a internet se atualiza e muda a cada dia, assim surgem novos recursos a todo momento. Esses dias enquanto estava estudando e procurando por recursos diferentes encontrei um Framework &#8230;</p>
<p>The post <a href="https://www.hiago.me/2017/11/18/processamento-de-audio-com-javascript/">Annyang: Processamento de áudio com JavaScript</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá, hoje estou aqui para mostrar a vocês como fazer processamento de áudio com javascript através de um Framework bem simples e prático.</p>
<p>Hoje em dia a internet se atualiza e muda a cada dia, assim surgem novos recursos a todo momento. Esses dias enquanto estava estudando e procurando por recursos diferentes encontrei um Framework javascript que simplesmente me chamou a atenção, seu nome é Annyang!</p>
<p>[wp_ad_camp_3]</p>
<h1>O que é Annyang?</h1>
<p>Annyang é um framework javascript para implementar comandos de voz em sua aplicação ou website. Com simples parametrizações você consegue fazer praticamente qualquer coisa!</p>
<h1>Onde encontrar?</h1>
<p>[wp_ad_camp_1]</p>
<p>O Annyang encontra-se disponível no seu website oficial (https://www.talater.com/annyang/), lá você já pode interagir com a página e ver possibilidades que possam ser atingidas.</p>
<h1>Como funciona?</h1>
<p>Para fazer o uso do Framework é necessário que seu website/aplicação seja disponibilizado através do protocolo HTTPS e após incluir uma linha de código a biblioteca já fica disponível para usar.</p>
<p>Apesar do website oficial dar um exemplo de uso, eles fazem isso em inglês! Então vamos criar uma simples aplicação para você ver esse magnifico Framework agindo!</p>
<p>[wp_ad_camp_2]</p>
<p>Primeiro vamos criar um index.html e um app.js para escrever nossa lógica fonte.</p>
<blockquote><p>index.html</p></blockquote>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-br&quot;&gt;
&lt;head&gt;
	&lt;title&gt;AnnyAng&lt;/title&gt;
	&lt;meta charset=&quot;utf-8&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;

	&lt;b&gt;&lt;i&gt;Utilização: &lt;/b&gt;&lt;/i&gt;
 
	* &quot;escreva...&quot; 
	* &quot;acessar www.google.com.br&quot; 
	* &quot;fechar guia&quot; 
	* &quot;limpar&quot; (limpar tela)

	* &quot;Fundo azul&quot;
	* &quot;Fundo amarelo&quot;
	* &quot;Fundo verde&quot;


	
        &lt;div id=&quot;texto&quot;&gt;
   
	&lt;/div&gt;

&lt;script src=&quot;https://code.jquery.com/jquery-2.2.4.min.js&quot; integrity=&quot;sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=&quot; crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/annyang/2.6.0/annyang.min.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;app.js&quot;&gt;&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<blockquote><p>app.js</p></blockquote>
<pre class="brush: jscript; title: ; notranslate">
$(function () {
        var windowJanela;
	// configurando o annyAng
	if( annyang ) {
		// Definicao do primeiro comando. Primeiro texto de chamada e depois a funcao ou texto a escrever
		var commands = {
			'limpar': function() {
				$(&quot;#texto&quot;).html(&quot;&quot;);
				$(&quot;body&quot;).css({&quot;background-color&quot; : &quot;white&quot;});
			},
			'escreva *term': function(term) {
			  $(&quot;#texto&quot;).html($(&quot;#texto&quot;).html()+&quot; &quot;+ term);
			},
			'acessar *term': function(term) {
				windowJanela = window.open('http://'+term, 'teste');
			},
			'fechar guia': function(term) {
				 windowJanela.close();
			},
			'fundo *term': function(term) {
				if(term == &quot;vermelho&quot;){
					$(&quot;body&quot;).css({&quot;background-color&quot; : &quot;darkred&quot;});
				}
				if(term == &quot;verde&quot;){
					$(&quot;body&quot;).css({&quot;background-color&quot; : &quot;green&quot;});
				}
				if(term == &quot;azul&quot;){
					$(&quot;body&quot;).css({&quot;background-color&quot; : &quot;blue&quot;});
				}
				if(term == &quot;amarelo&quot;){
					$(&quot;body&quot;).css({&quot;background-color&quot; : &quot;yellow&quot;});
				}
				if(term == &quot;preto&quot;){
					$(&quot;body&quot;).css({&quot;background-color&quot; : &quot;black&quot;});
				}
			}
		};

	  //Idioma...
	  annyang.setLanguage(&quot;pt-BR&quot;);
	  
	  // Adicionar comandos para a API (annyang)
	  annyang.addCommands(commands);

	  // Iniciar escuta. Podera ser chamado aqui ou carregado por um evento ou botao, etc
	  annyang.start();
	}
});
</pre>
<p><strong>Obs: Caso a aplicação não esteja rodando sobre o protocolo de segurança HTTPS, os browsers vão ficar pedindo constantemente a autorização.</strong></p>
<p>Obrigado pela visita, <a href="http://cdn2.hiago.me/wp-content/uploads/2017/11/demo-annyang.zip">cliquem aqui</a> para baixar o exemplo <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>The post <a href="https://www.hiago.me/2017/11/18/processamento-de-audio-com-javascript/">Annyang: Processamento de áudio com JavaScript</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2017/11/18/processamento-de-audio-com-javascript/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">237</post-id>	</item>
		<item>
		<title>Inspecionando sua página remotamente</title>
		<link>https://www.hiago.me/2017/06/01/inspecionando-sua-pagina-remotamente/</link>
					<comments>https://www.hiago.me/2017/06/01/inspecionando-sua-pagina-remotamente/#respond</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Thu, 01 Jun 2017 15:12:28 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[weinre]]></category>
		<guid isPermaLink="false">http://www.hiago.me/?p=186</guid>

					<description><![CDATA[<p>Olá! Seja bem vindo(a), a mais um post do meu blog. Você provavelmente, já precisou inspecionar sua página remotamente para fazer a análise de um problema de seu sistema web em um dispositivo móvel e já deve ter acontecido do problema não acontecer no seu navegador e persistir no dispositivo. Já pensou você inspecionando sua &#8230;</p>
<p>The post <a href="https://www.hiago.me/2017/06/01/inspecionando-sua-pagina-remotamente/">Inspecionando sua página remotamente</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá! Seja bem vindo(a), a mais um post do meu blog.</p>
<p>Você provavelmente, já precisou inspecionar sua página remotamente para fazer a análise de um problema de seu sistema web em um dispositivo móvel e já deve ter acontecido do problema não acontecer no seu navegador e persistir no dispositivo. Já pensou você inspecionando sua página remotamente? É isso que vou mostra para você no post de hoje <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>[wp_ad_camp_3]</p>
<p>Há algum tempo atrás uns amigos meus precisaram de resolver um caso assim, então eles vieram me perguntar se havia alguma ferramenta para fazer esse tipo de análise. Na época, eu indiquei para eles o uso do <strong>chrome://inspect </strong>e ele resolveu, porém tiveram que instalar drivers do android, habilitar depuração, aquela burocracia toda. Agora aconteceu o mesmo só que dessa vez é no Safari, e só no safari do iphone, como não tinha um MAC Book tive que ir a campo procurar alguma ferramenta para me ajudar, então encontrei o <strong>Weinre </strong>com essa ferramenta o modo de depurar tanto android quanto ios se tornou extremamente simples. E estou escrevendo esse post para mostrar a vocês como usar essa incrível ferramenta.</p>
<h1>Oque é Weinre?</h1>
<p>[wp_ad_camp_1]</p>
<p>Weinre é uma aplicação command-line escrita em NodeJS, ela cria um console virtual acessado via browser. Assim você pode continuar inspecionando sua página remotamente. Sua integração é muito simples, e seu uso é semelhante as ferramentas para desenvolvedores do firefox.</p>
<h1>Como usar?</h1>
<p>Primeiro é necessário ter instalado o <a href="https://nodejs.org/en/download/">NodeJS</a> com  o seu gerenciador de pacotes o NPM.</p>
<p>Após ter o NodeJS instalado você precisa abrir seu terminal e digitar os comandos abaixos (para windows, desconsiderar o sudo apenas execute o prompt de comando como administrador):</p>
<pre class="brush: bash; title: ; notranslate">
$ sudo npm install -g weinre
</pre>
<p>Após instalado, agora você tem o weinre disponível em sua command-line, agora é hora de iniciar ele. Para isso digite o comando abaixo em seu terminal:</p>
<pre class="brush: bash; title: ; notranslate">
weinre --boundHost=0.0.0.0
</pre>
<p>Após isso o weire vai ficar escultando na porta 8080, e a seguinte mensagem vai aparecer:</p>
<pre class="brush: bash; title: ; notranslate">
2017-06-01T14:03:39.322Z weinre: starting server at http://0.0.0.0:8080
</pre>
<p>[wp_ad_camp_2]</p>
<p>Agora é só abrir o seu browser no endereço http://localhost:8080/client/#meuprojeto, agora é só acessar uma página padrão do seu projeto e colocar o código abaixo em seu cabeçalho:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script src=&quot;http://SEU_IP_LOCAL:8080/target/target-script-min.js#anonymous&quot;&gt;&lt;/script&gt;
</pre>
<p>E pronto é só acessar pelo seu dispositivo e depurar pelo seu computador!</p>
<p>Observação: no script que você vai colocar em seu projeto, lembre-se de colocar o endereço de IP do seu computador e também libere o weinre no firewall quando solicitado.</p>
<p>Obrigado, espero que tenha ajudado!</p>
<p>The post <a href="https://www.hiago.me/2017/06/01/inspecionando-sua-pagina-remotamente/">Inspecionando sua página remotamente</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2017/06/01/inspecionando-sua-pagina-remotamente/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">186</post-id>	</item>
		<item>
		<title>Novidade: Arduíno + JavaScript = J5 </title>
		<link>https://www.hiago.me/2017/05/04/novidade-arduino-javascript-j5/</link>
					<comments>https://www.hiago.me/2017/05/04/novidade-arduino-javascript-j5/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Fri, 05 May 2017 00:19:59 +0000</pubDate>
				<category><![CDATA[Arduino]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[automação]]></category>
		<category><![CDATA[j5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[johnny-five]]></category>
		<category><![CDATA[nodejs]]></category>
		<guid isPermaLink="false">http://www.hiago.me/?p=156</guid>

					<description><![CDATA[<p>[wp_ad_camp_3] Olá, seja bem vindo a mais um post, Arduíno + Javascript = J5! Eu sou amante do javascript e acredito que o mesmo não só é o nosso presente como vai ter grande presença no futuro da tecnologia (opinião minha), e para aumentar ainda mais minha paixão pela linguagem aparece o J5. O que é o &#8230;</p>
<p>The post <a href="https://www.hiago.me/2017/05/04/novidade-arduino-javascript-j5/">Novidade: Arduíno + JavaScript = J5 &lt;3</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>[wp_ad_camp_3]</p>
<p>Olá, seja bem vindo a mais um post, Arduíno + Javascript = J5!</p>
<p>Eu sou amante do javascript e acredito que o mesmo não só é o nosso presente como vai ter grande presença no futuro da tecnologia (opinião minha), e para aumentar ainda mais minha paixão pela linguagem aparece o J5.</p>
<h2>O que é o J5 (Johnny Five)?</h2>
<p>[wp_ad_camp_1]</p>
<p>O J5 (Johnny Five) é uma biblioteca em NodeJS que possibilita a programação de projetos não só em Arduino como em diversas  placas eletrônicas fazendo uso da linguagem JavaScript.</p>
<h2>O que é o Arduíno?</h2>
<p>O Arduino é uma plataforma para prototipagem de hardware livre (isso mesmo, livre você não precisa pagar royalties ou direitos autorais para usa-lo em seus projetos) ele é projetado com um microcontrolador Atmel AVR que já possui suporte de I/O (Entrada e Saída) embutido. Sua linguagem de programação tem origem do C/C++.</p>
<h2>Arduíno + Javascript = J5!</h2>
<p>O motivo desse post é trazer uma novidade para você. Antes para começar a fazer o uso do Arduíno ou de outras plataformas, muitas vezes era necessário fazer o estudo de linguagens como C e C++.  A comunidade acabou chegando com o J5 (Johnny Five), para ingressar o javascript no mundo da eletrônica.</p>
<h2>Fazendo um Olá Mundo com J5 (Johnny Five)!</h2>
<p>[wp_ad_camp_2]</p>
<p>Acabei de fazer meu primeiro experimento e a sensação foi ótima pois não necessitei fazer uso de uma linha de C/C++.</p>
<p>Primeiro é necessário instalar o driver e o IDE do Arduíno que encontra-se disponível em (<a href="https://www.arduino.cc/en/Main/Software">https://www.arduino.cc</a>), após fazer isso plugue o USB de sua placa em seu computador e abra o IDE do Arduíno. Assim que o IDE do Arduíno estiver aberto vá até o menu: Arquivos &gt; Exemplos &gt; Firmdata &gt;  StandardFirmdataPlus (conforme imagem abaixo):</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-157 size-medium" src="http://www.hiago.me/wp-content/uploads/2017/05/arduino-firmdataplus-300x240.png" alt="Passo a passo para criar o Firmdata" width="300" height="240" srcset="https://www.hiago.me/wp-content/uploads/2017/05/arduino-firmdataplus-300x240.png 300w, https://www.hiago.me/wp-content/uploads/2017/05/arduino-firmdataplus.png 687w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>Após isso o código do StandardFirmdataPlus vai aparecer em seu IDE. Depois basta clicar em Upload e fechar o seu IDE do Arduíno:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-158 size-medium" src="http://www.hiago.me/wp-content/uploads/2017/05/arduino-upload-exemplo-246x300.png" alt="Botão UPLOAD no IDE do Arduíno" width="246" height="300" srcset="https://www.hiago.me/wp-content/uploads/2017/05/arduino-upload-exemplo-246x300.png 246w, https://www.hiago.me/wp-content/uploads/2017/05/arduino-upload-exemplo.png 486w" sizes="(max-width: 246px) 100vw, 246px" /></p>
<p>Agora vamos para melhor parte o <a href="https://www.hiago.me/category/javascript/">JavaScript </a>né =)!</p>
<p>Com o NodeJS instalado crie uma pasta no meu caso vou estar criando a pasta Arduino-JohnnyFive em C:\.</p>
<p>Com o prompt de comando/terminal, vamos navegar até a nossa pasta do projeto e instalar a dependência do JohnnyFive:</p>
<pre class="brush: bash; title: ; notranslate">
cd C:\Arduino-JohnnyFive
npm install johnny-five --save
</pre>
<p>Assim que acabar a instalação do J5 crie um arquivo chamado ola-mundo.js com o conteúdo abaixo:</p>
<pre class="brush: jscript; title: ; notranslate">
var five = require('johnny-five');
var placa = new five.Board();

placa.on(&quot;ready&quot;, function() {
        //Assim que a placa for disponível eu mando o pino 12 emitir/omitir energia a cada 500 mile segundos.. em outras palavras fizemos um pisca pisca..
	var led = new five.Led(12);
	led.blink(500);
});
</pre>
<p>Após finalizar o seu script basta executa-lo usando o nosso NodeJS. Para isso digite a linha abaixo dentro da pasta de seu projeto:</p>
<pre class="brush: bash; title: ; notranslate">
node ola-mundo.js
</pre>
<p>E pronto seu olá mundo com J5 está pronto! Após executar esse comando, o console do J5 vai ficar disponível para você fazer uso dele =)<br />
<img loading="lazy" decoding="async" class="aligncenter wp-image-163 size-medium" src="http://www.hiago.me/wp-content/uploads/2017/05/console-johnny-five-300x145.png" alt="Console do sistema operacional" width="300" height="145" srcset="https://www.hiago.me/wp-content/uploads/2017/05/console-johnny-five-300x145.png 300w, https://www.hiago.me/wp-content/uploads/2017/05/console-johnny-five.png 326w" sizes="(max-width: 300px) 100vw, 300px" /><br />
Então é isso, espero que tenha gostado do post!<br />
Você pode estar lendo sobre outros métodos do J5 em seu website oficial, ou em futuros posts no meu blog!<br />
Me siga no twitter e fique por dentro das novidades =)</p>
<p>Links:<br />
Johnny Five: <a href="http://johnny-five.io/">http://johnny-five.io/</a><br />
Arduíno: <a href="https://www.arduino.cc/">https://www.arduino.cc/</a><br />
NodeJS: <a href="https://nodejs.org/">https://nodejs.org/</a></p>
<p>The post <a href="https://www.hiago.me/2017/05/04/novidade-arduino-javascript-j5/">Novidade: Arduíno + JavaScript = J5 &lt;3</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2017/05/04/novidade-arduino-javascript-j5/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">156</post-id>	</item>
	</channel>
</rss>
