<?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>Hiago Souza, Author at Hiago Silva Souza</title>
	<atom:link href="https://www.hiago.me/author/hiago/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hiago.me/author/hiago/</link>
	<description></description>
	<lastBuildDate>Fri, 16 Oct 2020 20:02:04 +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>Hiago Souza, Author at Hiago Silva Souza</title>
	<link>https://www.hiago.me/author/hiago/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">147457425</site>	<item>
		<title>TypeScript: Propriedades requeridas para opcionais</title>
		<link>https://www.hiago.me/2020/10/16/typescript-propriedades-requeridas-para-opcionais/</link>
					<comments>https://www.hiago.me/2020/10/16/typescript-propriedades-requeridas-para-opcionais/#respond</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Fri, 16 Oct 2020 19:57:59 +0000</pubDate>
				<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[intellisense]]></category>
		<category><![CDATA[transformar]]></category>
		<category><![CDATA[type]]></category>
		<category><![CDATA[typescript]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=705</guid>

					<description><![CDATA[<p>Quem nunca precisou aproveitar uma entidade no TypeScript e acabou criando uma classe auxiliar só por conta das propriedades obrigatórias? Porque não criar um type para transformar propriedades requeridas em opcionais. Um exemplo disso é a rotina de update com o TypeORM, você quer atualizar somente algumas propriedades e se você definir a sua entidade &#8230;</p>
<p>The post <a href="https://www.hiago.me/2020/10/16/typescript-propriedades-requeridas-para-opcionais/">TypeScript: Propriedades requeridas para opcionais</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Quem nunca precisou aproveitar uma entidade no <a href="http://typescript">TypeScript</a> e acabou criando uma classe auxiliar só por conta das propriedades obrigatórias? Porque não criar um type para transformar propriedades requeridas em opcionais.</p>



<p>Um exemplo disso é a rotina de update com o TypeORM, você quer atualizar somente algumas propriedades e se você definir a sua entidade na assinatura do seu método você acaba tendo que fazer um cast só para o intellisense parar de te perturbar.</p>



<p>Para resolver esse problema com o type do TypeScript, com o código abaixo você cria um tipo de dado que irá estender o tipo de sua entidade e retornar um tipo com as mesmas propriedades como opcionais e tudo isso de forma dinâmica. Assim você conseguirá transformar propriedades requeridas em opcionais</p>



<p>Vamos aos códigos né?</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
/// entidade-opcional.ts
export type EntidadeOpcional&lt;T&gt; = {
    &#x5B;P in keyof Required&lt;T&gt;]?: Pick&lt;T, P&gt; extends Required&lt;Pick&lt;T, P&gt;&gt; ? T&#x5B;P] : (T&#x5B;P] | undefined);
}

/// minha-entity.ts
export class UsuarioEntity {
    id: number;
    nome: string;
    telefone?: string;
    email: string;
    senha: string;
}

/// service.ts
export class LoginService {
     autenticar(minhaEntity: EntidadeOpcional&lt;MinhaEntity&gt;) {
            //// rotinha de update
     }
}


let service: MeuService = new MeuService();

// chamo o autenticar, informando apenas email e senha e não obtenho erro.
this.autenticar({email: &#039;&#039;, senha: &#039;&#039;});
</pre></div>


<h2 class="wp-block-heading">Conclusão</h2>



<p>Bom pessoal, apesar de simples o conteúdo desse post ele me ajudou bastante em um projeto com <a href="https://www.hiago.me/2018/05/13/nestjs-uma-estrutura-nodejs-linda-e-trabalhada/">NestJS</a>. O objetivo é compartilhar esse trechinho de código com vocês sem escrever muita coisa =)</p>



<p>Se o isso te ajudou, deixa um comentário ^^</p>


<p>[wp_ad_camp_3]</p>



<p></p>
<p>The post <a href="https://www.hiago.me/2020/10/16/typescript-propriedades-requeridas-para-opcionais/">TypeScript: Propriedades requeridas para opcionais</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2020/10/16/typescript-propriedades-requeridas-para-opcionais/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">705</post-id>	</item>
		<item>
		<title>Android: Depurando sem cabo USB!</title>
		<link>https://www.hiago.me/2020/06/28/android-depurando-sem-cabo-usb/</link>
					<comments>https://www.hiago.me/2020/06/28/android-depurando-sem-cabo-usb/#respond</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Mon, 29 Jun 2020 02:00:34 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[depuração]]></category>
		<category><![CDATA[wifi]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=699</guid>

					<description><![CDATA[<p>Se você está nesse post, tenho certeza que assim como eu você não gosta de cabos! Hoje vou mostrar para vocês como compilar e depurar um aplicativo Android em seu smartphone sem a necessidade dele estar com o cabo conectado ao seu computador. E o mais bacana, funciona para apps escritos em: ionic, react-native, flutter, &#8230;</p>
<p>The post <a href="https://www.hiago.me/2020/06/28/android-depurando-sem-cabo-usb/">Android: Depurando sem cabo USB!</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Se você está nesse post, tenho certeza que assim como eu você não gosta de cabos! Hoje vou mostrar para vocês como compilar e depurar um aplicativo Android em seu <em>smartphone</em> sem a necessidade dele estar com o cabo conectado ao seu computador. E o mais bacana, funciona para apps escritos em: ionic, react-native, flutter, java, kotlin&#8230; e qualquer outro framework para desenvolvimento móvel =) </p>



<p>[wp_ad_camp_3]</p>



<h2 class="wp-block-heading">Uauuu, tem como?</h2>



<p>Sim, com certeza tem! Mas já vou avisando, que esse tutorial não ensina você a configurar seu ambiente de desenvolvimento nem nada do tipo&#8230; Então para seguir com o tutorial, você já deve ter instalado o SDK do Android, blz?</p>



<h2 class="wp-block-heading">Vamos lá? Let&#8217;s go?!</h2>



<p>[wp_ad_camp_2]</p>



<p>É um processo muito simples, para isso é necessário que o seu smartphone e o seu computador estejam conectados na mesma mesma rede.</p>



<p>Caso você esteja no linux, faça uso do terminal, caso esteja no Windows abra o seu CMD, após isso siga os passos abaixo:</p>



<ol><li>Conecte o cabo de seu dispositivo ao computador.</li><li>Acesse o diretório <code>platform-tools</code> dentro do diretório do seu SDK.</li><li>Digite o comando <code>adb tcpip 5555</code> (isso irá iniciar a depuração por rede do android) e aguarde a saída <code>restarting in TCP mode port: 5555</code></li><li>Retire o cabo do seu dispositivo.</li><li>Digite o comando <code>adb connect 192.168.x.x</code> (onde tá 192.168.x.x, substitua pelo ip do celular)</li><li>Digite o comando <code>adb devices</code> e veja se o seu celular encontra-se listado.</li></ol>



<p>Prontinho, seguindo os passos acima você não precisa do cabo no seu smartphone para testar seus app&#8217;s, basta compilar e pronto!</p>



<p><strong>Importante:</strong> Caso você desconecte do Wifi é necessário realizar todos os procedimentos novamente, ok?</p>



<h2 class="wp-block-heading">Seu dispositivo é roteado?</h2>



<p>Se seu dispositivo for roteado, o processo fica mais fácil ainda! É só você fazer a instalação do aplicativo <a aria-label="undefined (opens in a new tab)" href="https://play.google.com/store/apps/details?id=com.ttxapps.wifiadb&amp;hl=pt_BR" target="_blank" rel="noreferrer noopener">WiFi ADB &#8211; Debug Over Air</a> e seguir as instruções. Após isso faça o 4º passo da lista acima e já estará tudo pronto =)</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p>[wp_ad_camp_1]</p>



<p>Seguindo os passos acima, agora é possível fazer a depuração do seu aplicativo sem ficar utilizando o cabo USB do seu dispositivo.</p>
<p>The post <a href="https://www.hiago.me/2020/06/28/android-depurando-sem-cabo-usb/">Android: Depurando sem cabo USB!</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2020/06/28/android-depurando-sem-cabo-usb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">699</post-id>	</item>
		<item>
		<title>WebAuthn &#8211; Autenticação Biométrica na Internet</title>
		<link>https://www.hiago.me/2019/03/10/webauthn-autenticacao-biometrica-na-internet/</link>
					<comments>https://www.hiago.me/2019/03/10/webauthn-autenticacao-biometrica-na-internet/#respond</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Sun, 10 Mar 2019 19:11:26 +0000</pubDate>
				<category><![CDATA[Inovação]]></category>
		<category><![CDATA[Novas Tecnologias]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[Tendências]]></category>
		<category><![CDATA[WebAuthn]]></category>
		<category><![CDATA[autenticação]]></category>
		<category><![CDATA[biometria]]></category>
		<category><![CDATA[recomendações]]></category>
		<category><![CDATA[segurança]]></category>
		<category><![CDATA[w3c]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webauthn]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=607</guid>

					<description><![CDATA[<p>A web não para de mudar a W3C que é a principal organização para a padronização da Web, disponibilizou no dia 4 de março de 2019 uma nova recomendação, uma API de Autenticação da Web (também conhecida como WebAuthn). O que é o WebAuthn? [wp_ad_camp_3] A API de Autenticação da Web (também conhecida como WebAuthn) &#8230;</p>
<p>The post <a href="https://www.hiago.me/2019/03/10/webauthn-autenticacao-biometrica-na-internet/">WebAuthn &#8211; Autenticação Biométrica na Internet</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>A web não para de mudar a W3C que é a principal organização para a padronização da Web, disponibilizou no dia 4 de março de 2019 uma nova recomendação, uma <a href="https://www.w3.org/TR/webauthn/">API de Autenticação da Web</a> (também conhecida como WebAuthn).</p>



<h2 class="wp-block-heading">O que é o WebAuthn?</h2>



<p>[wp_ad_camp_3] </p>



<p>A API de Autenticação da Web (também conhecida como WebAuthn) é uma especificação escrita pelo <a href="https://www.w3.org/">W3C</a> e pela <a href="https://fidoalliance.org/">FIDO</a>, com a participação de grandes empresas como o Google, Mozilla, Microsoft dentre outros. A API permite que os servidores registrem e autentiquem usuários usando criptografia de chave pública ao invés de uma senha.</p>



<p>Ele permite que os servidores integrem-se aos autenticadores fortes agora integrados em dispositivos, como o Windows Hello ou o Touch ID da Apple. Em vez de uma senha, um par de chaves público-privado (conhecido como <strong>credencial</strong>) é criado para um site/aplicação web. A chave privada é armazenada com segurança no dispositivo do usuário; uma chave pública e um ID de credencial é gerada aleatoriamente é enviada ao servidor para armazenamento. O servidor pode então usar essa chave pública para provar a identidade do usuário.</p>



<p> A chave pública não é secreta, porque é efetivamente inútil sem a chave privada correspondente.&nbsp;O fato de o servidor não receber segredo tem implicações de longo alcance para a segurança de usuários e organizações.&nbsp;Os bancos de dados não são mais tão atraentes para os hackers, porque as chaves públicas não são úteis para eles. </p>



<p> O WebAuthn faz parte da&nbsp;<a rel="noreferrer noopener" href="https://duo.com/blog/developments-to-webauthn-and-the-fido2-framework" target="_blank">estrutura FIDO2</a>&nbsp;, que é um conjunto de tecnologias que permitem a autenticação sem senha entre servidores, navegadores e autenticadores.&nbsp;A partir de janeiro de 2019, o WebAuthn é suportado no Chrome, Firefox e Edge, com suporte futuro no Safari. </p>



<h2 class="wp-block-heading">Registrando uma credencial do WebAuthn</h2>



<p> [wp_ad_camp_2]<br></p>



<p>Em um fluxo de registro de usuário baseado em senha, um servidor normalmente apresentará um formulário a um usuário solicitando um nome de usuário e senha.&nbsp;A senha seria enviada ao servidor para armazenamento.</p>



<p>No WebAuthn, um servidor deve fornecer dados que vinculem um usuário a uma credencial (um par de chaves público-privado); esses dados incluem identificadores para o usuário e a organização (também conhecidos como &#8220;terceira parte confiável&#8221;). O site, em seguida, usaria a API de autenticação da Web para solicitar que o usuário crie um novo par de chaves. É importante notar que precisamos de uma string gerada aleatoriamente do servidor como um desafio para evitar ataques de repetição.</p>



<div class="wp-block-button"><a class="wp-block-button__link has-text-color has-very-light-gray-color has-background has-vivid-cyan-blue-background-color" href="https://webauthn.io/">Veja uma demonstração em webauthn.io</a></div>



<figure class="wp-block-image"><img fetchpriority="high" decoding="async" width="398" height="414" src="https://www.hiago.me/wp-content/uploads/2019/03/2019-03-10_1529.png" alt="" class="wp-image-608" srcset="https://www.hiago.me/wp-content/uploads/2019/03/2019-03-10_1529.png 398w, https://www.hiago.me/wp-content/uploads/2019/03/2019-03-10_1529-288x300.png 288w" sizes="(max-width: 398px) 100vw, 398px" /><figcaption>Exemplo de um registro utilizando o WebAuthn<br></figcaption></figure>



<h3 class="wp-block-heading">Autenticando com uma credencial do WebAuthn</h3>



<p>[wp_ad_camp_1] </p>



<p>Após o término do registro, o usuário agora pode ser autenticado.&nbsp;Durante a autenticação, uma&nbsp;declaração&nbsp;é criada, o que prova que o usuário possui a chave privada.&nbsp;Essa declaração contém uma&nbsp;<em>assinatura</em> criada usando a chave privada. O servidor usa a chave pública recuperada durante o registro para verificar essa assinatura.</p>



<div class="wp-block-button"><a class="wp-block-button__link has-background has-vivid-cyan-blue-background-color" href="https://webauthn.io/">Veja uma demonstração em webauthn.io</a></div>



<figure class="wp-block-image"><img decoding="async" width="353" height="537" src="https://www.hiago.me/wp-content/uploads/2019/03/2019-03-10_1542.png" alt="" class="wp-image-612" srcset="https://www.hiago.me/wp-content/uploads/2019/03/2019-03-10_1542.png 353w, https://www.hiago.me/wp-content/uploads/2019/03/2019-03-10_1542-197x300.png 197w" sizes="(max-width: 353px) 100vw, 353px" /><figcaption> <br>Exemplo de um login utilizando o WebAuthn </figcaption></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>O que é criptografia de chave pública?</p><p><br></p><cite>A criptografia de chave pública foi inventada nos anos 70 e foi uma solução para o problema dos segredos compartilhados. É um pilar da segurança moderna da Internet; Por exemplo, toda vez que nos conectamos a um site HTTPS, ocorre uma transação de chave pública. <br>Criptografia de chave pública usa o conceito de um par de chaves;&nbsp;uma chave privada armazenada com segurança pelo usuário e uma chave pública que pode ser compartilhada com o servidor.&nbsp;Essas &#8220;chaves&#8221; são números longos e aleatórios que têm um relacionamento matemático entre si. </cite></blockquote>



<h2 class="wp-block-heading">Olhando para o futuro</h2>



<p>Embora a Autenticação da Web seja uma ferramenta importante,&nbsp;é sempre importante lembrar que a segurança não é uma tecnologia única;&nbsp;É uma&nbsp;<em>maneira de pensar</em>&nbsp;que deve ser incorporada em cada etapa de como o software&nbsp;é projetado e desenvolvido.&nbsp;A autenticação da Web pode ser uma parte importante desse processo,&nbsp;forçando 80% dos ataques de hackers a se adaptar ou a morrer.</p>



<p>Fora introdução todo conteúdo desse post é uma tradução do site webauthn.guide e você pode encontrar o texto original <a href="https://webauthn.guide/">clicando aqui</a>.</p>



<p>Nos próximos posts vou estar trazendo aplicações práticas e tutoriais para implementação da funcionalidade com PWA&#8217;s e sistemas Web.</p>
<p>The post <a href="https://www.hiago.me/2019/03/10/webauthn-autenticacao-biometrica-na-internet/">WebAuthn &#8211; Autenticação Biométrica na Internet</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.hiago.me/2019/03/10/webauthn-autenticacao-biometrica-na-internet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">607</post-id>	</item>
		<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 loading="lazy" 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 loading="lazy" 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 uma aplicação ionic no VSCode</title>
		<link>https://www.hiago.me/2018/06/06/depurar-uma-aplicacao-ionic-no-vscode/</link>
					<comments>https://www.hiago.me/2018/06/06/depurar-uma-aplicacao-ionic-no-vscode/#comments</comments>
		
		<dc:creator><![CDATA[Hiago Souza]]></dc:creator>
		<pubDate>Thu, 07 Jun 2018 01:53:28 +0000</pubDate>
				<category><![CDATA[Ionic]]></category>
		<category><![CDATA[TypeScript]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[ionic]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[remote debug]]></category>
		<category><![CDATA[typescript]]></category>
		<category><![CDATA[visual studio code]]></category>
		<category><![CDATA[vscode]]></category>
		<guid isPermaLink="false">https://www.hiago.me/?p=334</guid>

					<description><![CDATA[<p>Boa noite pessoal, sejam bem vindos a mais um post! Hoje vou falar de ionic (2/3) com o Visual Studio Code. Estava trabalhando em um aplicação minha quando eu notei que o Visual Studio Code tem a opção de colocar os breakpoints, inclusive no TypeScript então pensei será que tem como depurar minha aplicação direto &#8230;</p>
<p>The post <a href="https://www.hiago.me/2018/06/06/depurar-uma-aplicacao-ionic-no-vscode/">Depurar uma aplicação ionic no VSCode</a> appeared first on <a href="https://www.hiago.me">Hiago Silva Souza</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Boa noite pessoal, sejam bem vindos a mais um post! Hoje vou falar de ionic (2/3) com o Visual Studio Code. Estava trabalhando em um aplicação minha quando eu notei que o Visual Studio Code tem a opção de colocar os breakpoints, inclusive no TypeScript então pensei será que tem como depurar minha aplicação direto do VSCode no Dispositivo e no Browser? Então fui atrás, e consegui fazer funcionar e o resultado foi simplesmente sensacional! Então vamos lá, vamos se preparar para Depurar sua aplicação IONIC com o VSCode no aplicativo compilado sem a necessidade do <strong>chrome://inspect</strong>.</p>
<h1>Extensões</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>Vamos preparar para que você possa depurar tanto a aplicação no <strong>ionic serve </strong>(testando em seu browser), como no <strong>ionic cordova run android </strong>(com a aplicação compilada no Android ou iOS).</p>
<p>Para isso vamos precisar de duas extensões do VSCode para nos ajudar, são elas:</p>
<ol>
<li>Debugger for Chrome (distribuído pela própria Microsoft)<br />
<img loading="lazy" decoding="async" class="alignnone size-medium wp-image-335" src="https://www.hiago.me/wp-content/uploads/2018/06/debugger-for-chrome-300x109.png" alt="" width="300" height="109" srcset="https://www.hiago.me/wp-content/uploads/2018/06/debugger-for-chrome-300x109.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/debugger-for-chrome.png 417w" sizes="(max-width: 300px) 100vw, 300px" /></li>
<li>Cordova Tools<br />
<img loading="lazy" decoding="async" class="alignnone size-medium wp-image-336" src="https://www.hiago.me/wp-content/uploads/2018/06/cordova-tools-300x92.png" alt="" width="300" height="92" srcset="https://www.hiago.me/wp-content/uploads/2018/06/cordova-tools-300x92.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/cordova-tools.png 490w" sizes="(max-width: 300px) 100vw, 300px" /></li>
</ol>
<h1>Configurando o VSCode</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>Após instalar as extensões você pode ir na sessão de debug do vscode (4º ícone da barra lateral esquerda). Lá você clica na engrenagem que fica após o combobox e escolha a opção <strong>Cordova</strong>.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-339" src="https://www.hiago.me/wp-content/uploads/2018/06/passo-a-passo-vscode-300x162.png" alt="" width="783" height="423" srcset="https://www.hiago.me/wp-content/uploads/2018/06/passo-a-passo-vscode-300x162.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/passo-a-passo-vscode-768x416.png 768w, https://www.hiago.me/wp-content/uploads/2018/06/passo-a-passo-vscode-1024x554.png 1024w, https://www.hiago.me/wp-content/uploads/2018/06/passo-a-passo-vscode.png 1096w" sizes="(max-width: 783px) 100vw, 783px" /></p>
<p>Logo após isso vai ser criado o arquivo launch.json com diversas opções de debug disponíveis. Porém vamos apagar o conteúdo atual do arquivo e colocar o conteúdo abaixo no lugar.</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;name&quot;: &quot;Depurar no Chrome&quot;,
            &quot;type&quot;: &quot;chrome&quot;,
            &quot;request&quot;: &quot;launch&quot;,
            &quot;url&quot;: &quot;http://localhost:8100&quot;,
            &quot;sourceMaps&quot;: true,
            &quot;webRoot&quot;: &quot;${workspaceRoot}/www&quot;
        },
        {
            &quot;name&quot;: &quot;Depurar no Android&quot;,
            &quot;type&quot;: &quot;cordova&quot;,
            &quot;request&quot;: &quot;attach&quot;,
            &quot;platform&quot;: &quot;android&quot;,
            &quot;target&quot;: &quot;device&quot;,
            &quot;port&quot;: 9222,
            &quot;sourceMaps&quot;: true,
            &quot;cwd&quot;: &quot;${workspaceRoot}&quot;
        },
        {
            &quot;name&quot;: &quot;Depurar no iOS&quot;,
            &quot;type&quot;: &quot;cordova&quot;,
            &quot;request&quot;: &quot;attach&quot;,
            &quot;platform&quot;: &quot;ios&quot;,
            &quot;target&quot;: &quot;device&quot;,
            &quot;port&quot;: 9220,
            &quot;sourceMaps&quot;: true,
            &quot;cwd&quot;: &quot;${workspaceRoot}&quot;
        }
    ]
}
</pre>
<p>Ao colocar esse código e salvar feche e abra o seu Visual Studio Code e na sessão de debug você já terá disponível o &#8220;Depurar no Chrome&#8221;, &#8220;Depurar no Android&#8221; e <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;">&#8220;Depurar no iOS&#8221;</span>.</p>
<h1>Vamos testar?</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 é a hora que todos estavam esperando não é mesmo? Vamos fazer 2 testes, o primeiro é depurando usando o próprio google chrome, e o segundo é fazendo a depuração usando o próprio dispositivo.</p>
<p><img loading="lazy" decoding="async" class="alignnone wp-image-344" src="https://www.hiago.me/wp-content/uploads/2018/06/opcoes-disponiveis-300x216.png" alt="" width="774" height="557" srcset="https://www.hiago.me/wp-content/uploads/2018/06/opcoes-disponiveis-300x216.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/opcoes-disponiveis-768x552.png 768w, https://www.hiago.me/wp-content/uploads/2018/06/opcoes-disponiveis.png 782w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<ul>
<li>Obs: Na imagem não contém o depurar no iOS pois como não tenho um Mac eu removi a opção, mas na empresa eu testei e vai rolar na maçã 😉</li>
</ul>
<h2>Depurando no Browser</h2>
<p>Para fazer o debug tanto na aplicação compilada quando no browser primeiro é necessário rodar o comando do ionic responsável pela plataforma desejada. No browser vamos no terminal e executar o comando &#8220;<strong>ionic serve &#8211;nobrowser</strong>&#8220;. Assim que finalizar o processo de compilação, vá até a opção de debug selecione a opção &#8220;<strong>Depurar no Chrome</strong>&#8220;. Assim que o navegador for aberto e o rodapé do seu VSCode estiver laranja, você já está depurando sua aplicação.</p>
<p>Vai fundo, coloque um breakpoint em uma de suas rotinas e seja feliz!</p>
<h2>Depurando no Dispositivo</h2>
<p>O processo de depuração no dispositivo é bem semelhante ao do browser. Você precisa executar a usando o comando desejado no meu caso &#8220;<strong>ionic cordova run android -l</strong>&#8220;. No meu caso vou colocar o -l para fazer o uso do live reload dentro do dispositivo.</p>
<p>Assim que compilar e o aplicativo estiver aberto em seu dispositivo, basta você selecionar a opção <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;">&#8220;</span><strong>Depurar no Android</strong><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;">&#8221; ou &#8220;<strong>Depurar no iOS</strong>&#8221; e aguardar a barra ficar laranja. Após isso é a mesmo processo do browser! Coloque seus breakpoints e seja mais produtivo no seu trabalho.</span></p>
<p><img loading="lazy" decoding="async" class="alignnone  wp-image-350" src="https://www.hiago.me/wp-content/uploads/2018/06/imagem-debug-funcionando-android-300x153.png" alt="" width="778" height="397" srcset="https://www.hiago.me/wp-content/uploads/2018/06/imagem-debug-funcionando-android-300x153.png 300w, https://www.hiago.me/wp-content/uploads/2018/06/imagem-debug-funcionando-android-768x391.png 768w, https://www.hiago.me/wp-content/uploads/2018/06/imagem-debug-funcionando-android-1024x521.png 1024w, https://www.hiago.me/wp-content/uploads/2018/06/imagem-debug-funcionando-android.png 1366w" sizes="(max-width: 778px) 100vw, 778px" /></p>
<p>Obrigado e espero que tenha gostado! Caso tenha alguma dúvida ou sugestão, pode deixar um comentário informando seu e-mail (não envio spams rs). Valeu!</p>
<p>The post <a href="https://www.hiago.me/2018/06/06/depurar-uma-aplicacao-ionic-no-vscode/">Depurar uma aplicação ionic no 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/06/depurar-uma-aplicacao-ionic-no-vscode/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">334</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>
	</channel>
</rss>
