<?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#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Igor Escobar</title>
	<atom:link href="https://blog.igorescobar.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.igorescobar.com</link>
	<description>Turning complexity into simplicity for my own pleasure and enjoyment.</description>
	<lastBuildDate>Fri, 20 Nov 2020 13:04:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<site xmlns="com-wordpress:feed-additions:1">196281527</site><cloud domain='blog.igorescobar.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>Igor Escobar</title>
		<link>https://blog.igorescobar.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://blog.igorescobar.com/osd.xml" title="Igor Escobar" />
	<atom:link rel='hub' href='https://blog.igorescobar.com/?pushpress=hub'/>
	<item>
		<title>Storage Persistence Between Docker Containers on AWS ECS Fargate</title>
		<link>https://blog.igorescobar.com/2020/11/20/storage-persistence-between-docker-containers-on-aws-ecs-fargate/</link>
					<comments>https://blog.igorescobar.com/2020/11/20/storage-persistence-between-docker-containers-on-aws-ecs-fargate/#respond</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Fri, 20 Nov 2020 13:04:48 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[ebs]]></category>
		<category><![CDATA[ecs]]></category>
		<category><![CDATA[efs]]></category>
		<category><![CDATA[terraform]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=1084</guid>

					<description><![CDATA[If you are used to Docker you know that containers are stateless. It means that if you shut it down or spawn new containers, anything you wrote to disk will be gone. That&#8217;s one of the reasons a lot of people just write stuff to S3 buckets instead. But what if you are hosting your<a class="more-link" href="https://blog.igorescobar.com/2020/11/20/storage-persistence-between-docker-containers-on-aws-ecs-fargate/">Continue reading <span class="screen-reader-text">"Storage Persistence Between Docker Containers on AWS ECS&#160;Fargate"</span></a>]]></description>
										<content:encoded><![CDATA[
<p>If you are used to Docker you know that containers are stateless. It means that if you shut it down or spawn new containers, anything you wrote to disk will be gone. That&#8217;s one of the reasons a lot of people just write stuff to S3 buckets instead. </p>



<p>But what if you are hosting your own database? or your own Nginx caching layer? Or if you want to save your files directly to disk for performance/security reasons?</p>



<h2 class="wp-block-heading">EBS &amp; EFS volumes</h2>



<p>Until ECS Platform Version 1.3, I believe you could only attach <a rel="noreferrer noopener" href="https://aws.amazon.com/blogs/compute/amazon-ecs-and-docker-volume-drivers-amazon-ebs/" target="_blank">EBS volumes</a> to your containers, and only after the release of the platform version 1.4 you could get <a rel="noreferrer noopener" href="https://aws.amazon.com/efs/" target="_blank">EFS volumes</a> attached to your docker containers. Make sure you understand <a rel="noreferrer noopener" href="https://dzone.com/articles/confused-by-aws-storage-options-s3-ebs-amp-efs-explained" target="_blank">the differences regarding performance, costs &amp; limitations</a> before choosing between them. </p>



<p>For the sake of example, I&#8217;m going to show you how you can attach an EFS volume on a Docker Container using AWS ECS Fargate using <a href="https://www.terraform.io/" target="_blank" rel="noreferrer noopener">Terraform</a>.</p>



<h2 class="wp-block-heading">Creating your EFS Volume</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_file_system
resource "aws_efs_file_system" "efs-nginx" {
  creation_token = "efs-nginx"
  performance_mode = "generalPurpose"
  throughput_mode = "bursting"
  encrypted = true
  lifecycle_policy {
    transition_to_ia = "AFTER_30_DAYS"
  }
}

# https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_mount_target
resource "aws_efs_mount_target" "efs-mt-nginx" {
  file_system_id   = aws_efs_file_system.efs-nginx.id
  subnet_id        = "my-subnet-id"
  security_groups  = &#91;aws_security_group.nginx-sg.id]
}
</pre></div>


<p>The above will create your EFS and its mount information so it could be attached later by our containers.</p>



<h2 class="wp-block-heading">Task Definition</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
resource "aws_ecs_task_definition" "nginx" {
  family                   = "nginx"
  task_role_arn            = aws_iam_role.nginx_execution_role.arn
  execution_role_arn       = aws_iam_role.nginx_execution_role.arn
  network_mode             = "awsvpc"
  requires_compatibilities = &#91;"FARGATE"]
  cpu                      = 512
  memory                   = 1024
  
  container_definitions = "${file("task-definitions/nginx.json")}"

  volume {
    name = "nginxCache"
    efs_volume_configuration {
      file_system_id = aws_efs_file_system.efs-nginx.id
      root_directory = "/"
    }
  }
}
</pre></div>


<p>The <code>task-definitions/nginx.json</code> is pretty standard. The only thing you need to add to your own task definition is:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
"mountPoints": &#91;
  {
    "sourceVolume": "nginxCache",
    "containerPath": "/nginx/cache"
  }
],
"ulimits": &#91;
  {
    "name": "nofile",
    "softLimit": 999999,
    "hardLimit": 999999
  }
</pre></div>


<p><br>Two things to pay attention here:</p>



<ul class="wp-block-list"><li>The Nginx cache folder is <code>/nginx/cache</code> so it will be our mounting point.</li><li>99% of you might not deal with this problem but sometimes the given limitations imposed by ECS Docker Environment might not be compatible with your needs, which in this case is <strong><strong><code>nofile=1024:4096</code></strong></strong>.</li></ul>



<h2 class="wp-block-heading">Security Groups</h2>



<p>Another, not <strong>so obvious configuration</strong> that you need to pay attention to is the fact that the <strong>security group </strong>you are using between your EFS volumes &amp; your application (Nginx), needs to have an <code>ingress</code> rule, that allows TCP traffic on port 2049 which is the standard on AWS.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
ingress {
  from_port = 2049
  to_port   = 2049
  protocol  = "tcp"
  self      = true
}
</pre></div>


<p>Without this, your fate is to deal with all kinds of networking errors with tons of error messages that don&#8217;t explain what is going on and your mount won&#8217;t work.</p>



<h2 class="wp-block-heading">What now?</h2>



<ul class="wp-block-list"><li>When your Nginx containers boot up, the caching layer will be cached between them regardless of how many containers you have. The same use case can be applied to whatever use-case you might have.</li><li>This use case might be shitty but the example is still valid if you need any sort of long-term persistence and shared state between containers. </li></ul>



<p>Stay safe! </p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2020/11/20/storage-persistence-between-docker-containers-on-aws-ecs-fargate/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1084</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/0d470-image.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/0d470-image.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>
	</item>
		<item>
		<title>Serverless APIs: Lessons learned</title>
		<link>https://blog.igorescobar.com/2020/11/16/lessons-learned-from-serverless-apis/</link>
					<comments>https://blog.igorescobar.com/2020/11/16/lessons-learned-from-serverless-apis/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Mon, 16 Nov 2020 13:22:51 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[apis]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[serverless]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=1046</guid>

					<description><![CDATA[If you are thinking about or never heard that building completely serverless APIs was possible? This post is for you. I&#8217;m going to compile a few lessons I&#8217;ve learned in the past 3-4 years while shipping a few production projects and dealing with no servers at all. (\___/)( ͡ ͡° ͜ ʖ ͡ ͡°)\╭☞ \╭☞<a class="more-link" href="https://blog.igorescobar.com/2020/11/16/lessons-learned-from-serverless-apis/">Continue reading <span class="screen-reader-text">"Serverless APIs: Lessons&#160;learned"</span></a>]]></description>
										<content:encoded><![CDATA[
<p>If you are thinking about or never heard that building completely serverless APIs was possible? This post is for you. I&#8217;m going to compile a few lessons I&#8217;ve learned in the past 3-4 years while shipping a few production projects and dealing with no servers at all. </p>



<p>(\___/)<br>( ͡ ͡° ͜ ʖ ͡ ͡°)<br>\╭☞ \╭☞ Follow me on <a rel="noreferrer noopener" href="https://twitter.com/igorescobar" target="_blank">Twitter</a>!</p>



<h4 class="wp-block-heading">Be advised </h4>



<p>Most of what I&#8217;m going to talk about here in this post is heavily dependent on AWS. AWS has been my cloud of choice for at least 8-10 years so If AWS isn&#8217;t what you are looking for you will be profoundly disappointed with this article. :&#8217;)</p>



<h2 class="wp-block-heading">How does it work?</h2>



<p>For all the things I&#8217;ve tried, I&#8217;ve found only two Libraries &amp; Frameworks that can produce a &#8220;good enough&#8221; outcome from the point of maintenance.</p>



<h4 class="wp-block-heading" id="API-Gateway">API Gateway</h4>



<p>Before moving into more detail, it’s important to know that at the moment, the only service available to truly serverless APIs is <a href="https://aws.amazon.com/api-gateway/">AWS API Gateway</a>. So regardless of which library you choose they will always leverage the usage of API Gateway &amp; Lambdas. API Gateway is the AWS attempt on the <strong>Sidecar gateway pattern</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>The&nbsp;<strong>sidecar gateway pattern</strong>&nbsp;deploys the&nbsp;<strong>gateway</strong>&nbsp;as an ingress and egress proxy alongside a microservice. This enables services to speak directly to each other, with the&nbsp;<strong>sidecar</strong>&nbsp;proxy handling and routing both inbound and outbound communication.</p></blockquote>



<p>In other words, API Gateway was made to be pretty much a wrapper on top of all your microservices. You can create a completely different API interface on top of your existing APIs, changing responses and resources, and all sorts of things. But there is one feature that is particularly powerful if you want to build serverless APIs which is the ability to proxy requests from an endpoint to a lambda function.</p>



<h3 class="wp-block-heading">Apex Up</h3>



<p><a href="https://apex.sh/up/">https://apex.sh/up/</a></p>



<p>From the creator of Express, Mocha, Koa, and <strong>gazillion</strong> other open-source projects. It introduces a more maintainable design to the table for 90% of people. After deployment, your stack will look like this:</p>



<figure class="wp-block-image size-large"><img data-attachment-id="1050" data-permalink="https://blog.igorescobar.com/apex-up-2/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/be787-apex-up-edited.png" data-orig-size="1132,637" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="apex-up" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/be787-apex-up-edited.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/be787-apex-up-edited.png?w=750" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/be787-apex-up-edited.png" alt="" class="wp-image-1050" /></figure>



<p><a href="https://apex.sh/up/" target="_blank" rel="noreferrer noopener">Up</a> deploys an API Gateway interface for you, using a <a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-http.html" target="_blank" rel="noreferrer noopener"><em>{proxy+}</em> resource</a>, add a network proxy in between, and forward all your incoming requests to your lambda function seemly. The good thing here is the &#8220;network proxy&#8221; in between, give us the ability to create an application that looks like an actual app and not a Lambda (no handlers, etc). For example, your API could still be a fully-fledged <a href="https://expressjs.com/" target="_blank" rel="noreferrer noopener">Express API</a> and you wouldn&#8217;t even notice.</p>



<h3 class="wp-block-heading" id="Serverless-Framework">Serverless Framework</h3>



<p><a href="https://github.com/serverless/serverless">https://github.com/serverless/serverless</a></p>



<p>With the <a rel="noreferrer noopener" href="https://github.com/serverless/serverless" target="_blank">Serverless Framework</a>, you can use a combination of plugins that can help you to create the API Gateway endpoints and proxy them to lambda functions, and your stack would look like this:</p>



<figure class="wp-block-image size-large"><img data-attachment-id="1049" data-permalink="https://blog.igorescobar.com/serverless-apis-7-1-2/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/0a7fb-serverless-apis-7-1-edited.png" data-orig-size="1346,758" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Serverless-APIs-7-1" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/0a7fb-serverless-apis-7-1-edited.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/0a7fb-serverless-apis-7-1-edited.png?w=750" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/0a7fb-serverless-apis-7-1-edited.png" alt="" class="wp-image-1049" /></figure>



<p>So you want to have a more &#8220;granular&#8221; control over the resource allocation, tech language behind each Lambda function, your best bet would be the <a rel="noreferrer noopener" href="https://github.com/serverless/serverless" target="_blank">Serverless Framework</a>. It deploys one lambda function individually for each API endpoint you have. I personally don&#8217;t use it much as I prefer Up for most of my use cases.</p>



<h2 class="wp-block-heading">Which one is better?</h2>



<p>I use <a rel="noreferrer noopener" href="https://apex.sh/up/" target="_blank">Up</a> in most cases. Mostly because your code looks exactly the same as a regular application, it doesn&#8217;t look like you are writing a Lambda function so there is no development friction within your team, and if for any reason, you decide to move on to a containerized application you can do it pretty easily since you won&#8217;t have to change anything on the code itself so no heavy architectural change.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>&#8220;If you are on a crossroads between two equality good options, pick the one that it is easier to change in the future.&#8221; </p><cite>Someone smarted than me which I don&#8217;t remember</cite></blockquote>



<p><a rel="noreferrer noopener" href="https://github.com/serverless/serverless" target="_blank">Serverless Framework</a> is that bazooka we sometimes hear about. it looks like a Boeing dashboard with so many options and features. It&#8217;s great if you want more flexibility and you know what you are doing <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">When to use it?</h2>



<ul class="wp-block-list"><li>Since there aren&#8217;t servers involved, this type of stack is known for being able to handle crazy levels of concurrency &amp; throughput so If your API has unpredictable request spikes which are harder to deal with auto-scaling or without having to throw money at the problem, this could be your solution.</li><li>Background Job processing. I know it sucks but sometimes, jobs have to do API calls ¯\_(ツ)_/¯. If you have tons of jobs to process at a small period of time, and you don&#8217;t want to bring down your services, this stack can be useful.</li><li>Side projects. It is extremely cost-effective and great to deploy your ideas in a matter of minutes. Who wants to pay 10-20$/month for something that you don&#8217;t even know if&#8217;s going to work, right? Paying per-request is a good morale booster if you still couldn&#8217;t find the courage to ship your idea because of monthly costs.</li></ul>



<h2 class="wp-block-heading">Be Aware</h2>



<ul class="wp-block-list"><li>If your API depends on native binaries, packaging your application might become tricky since you need to pre-compile all of them and add them to your <code>lib/</code> folder before deploying it. In that case, unless you are experienced with compiling custom binaries&#8230; managing containers might be easier and unless your like pain and suffering. </li><li>Keep your APIs slim. Your bundle can’t exceed the 500MB mark in size. (unless you have binaries, this is pretty hard to achieve).</li></ul>



<h2 class="wp-block-heading">Common Issues (and How to Fix them)</h2>



<h3 class="wp-block-heading">Cold Starts</h3>



<p>If you are not using this stack for a user-facing API, you might want to skip this one.</p>



<p>There is an inherited characteristic when you use Lambda functions which is what people call <strong>&#8220;cold starts</strong>&#8220;.</p>



<figure class="wp-block-image size-large"><img data-attachment-id="1051" data-permalink="https://blog.igorescobar.com/2020/11/16/lessons-learned-from-serverless-apis/image-20200929-174240/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/6fc38-image-20200929-174240.png" data-orig-size="768,294" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="image-20200929-174240" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/6fc38-image-20200929-174240.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/6fc38-image-20200929-174240.png?w=750" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/6fc38-image-20200929-174240.png" alt="" class="wp-image-1051" /></figure>



<p>As concurrency increases, AWS keeps increasing the amount of &#8220;warmed&#8221; lambdas that are able to handle your traffic <strong>but not for too long</strong> if you don’t use it. </p>



<p>So if you have an API that doesn’t get used too often, without <a rel="noreferrer noopener" href="https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html" target="_blank">reserved concurrency</a> you can sometimes experience an increase of response time which is a new lambda booting up to handle your current currency demand.</p>



<h4 class="wp-block-heading">How to fix it?</h4>



<p><strong>If you are managing just lambda functions or using the serverless framework</strong>, you can fix it with “reserved concurrency”. It’s an option available on your lambda configuration and AWS will make sure all lambda calls go through “warmed” lambdas. <strong>Reserved concurrency is charged extra.</strong></p>



<p><strong>If you are managing APIs (using Up)</strong>, this is where it gets tricky:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>When Lambda allocates an instance of your function, the runtime loads your function&#8217;s code and runs initialization code that you define outside of the handler. If your code and dependencies are large, or you create SDK clients during initialization, this process can take some time.</p></blockquote>



<p>This means that since the <strong>Up</strong> owns the handler, only the handler gets “warmed up” and the function doesn’t really initialize so you have a few options:</p>



<ol class="wp-block-list"><li>If you have a monitoring tool like Apex Ping, you can configure it to ping your API and keep it warm for you.</li><li>If you need a specific amount of concurrency, you can either write a code that concurrently “pings” your API every X minutes. It will keep X containers running for you and ready to handle the traffic. If you don’t want to do that… using <strong>Up Pro</strong>, you can <a href="https://apex.sh/docs/up/configuration/#lambda_settings.active_warming">configure the concurrency you need</a> and it will keep it warm for you. Up Active Warming is billed normally without paying extra.</li><li>If having cold starts is not an issue but you just want to reduce the cold start time, using a combination of reserved concurrency and increasing the amount of memory of your lambda can reduce your cold start in half or more.</li></ol>



<h3 class="wp-block-heading" id="Blowing-up-Database-Connections">Blowing up Database Connections</h3>



<p><strong>Lambdas are designed to handle one call at once</strong>, isolated, so no concurrency in between calls. It means that if you call a lambda function twice in parallel <strong>it will spawn two different lambdas</strong> and handle them independently. If you call it again it means you have two warmed lambda on the “pool” and one of them will be “re-used” without creating another one (no cold starts). It means that if your environment has crazy levels of concurrency like 1000 API calls at the same time it means that you might have 1000 clients connected to your database just to handle 1000 API calls. Not good. If you misconfigured your connection pool with like, 10 connections per lambda you would have 10k database connections at once. (╯°□°）╯︵ ┻━┻.</p>



<h4 class="wp-block-heading" id="How-to-fix-it?.1">How to fix it?</h4>



<p><strong>Serverless Databases:</strong> If you can, use a serverless database like <strong>DynamoDB</strong> it will work just fine because you don’t keep active connections to your DynamoDB.</p>



<p><strong>Amazon RDS Proxy:</strong> If a serverless database is not an option, AWS offers you an RDS Proxy which you can configure directly from the AWS console. <a href="https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/">https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/</a>. It means that this proxy will manage the connection pool for you without creating tons of new ones on your database as concurrency increases.</p>



<h3 class="wp-block-heading">Performance Issues</h3>



<p>One thing that isn&#8217;t obvious at first is: You can&#8217;t configure the amount of CPU allocated to your Lambda function it&#8217;s all about getting the right memory settings for your use-case.</p>



<p> When you scale up the amount of memory your lambda needs, it also increases the amount of CPU, networking performance, and so on. It means that your Lambda might be ok memory-wise, but could have its performance drastically improved by just increasing the amount of memory allocated to it.</p>



<p>If you think that the reason why you are having performance issues is code-related, you can set up <a rel="noreferrer noopener" href="https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html" target="_blank">X-Ray for your lambda</a> function and identify the bottleneck. </p>



<h3 class="wp-block-heading">Native Binaries</h3>



<p>All Lambdas Runtimes are built on top of the Amazon Linux Images. This means that, if your project uses native binaries, once they get compiled on your local machine they might not be compatible with the Lambda Runtime which is based on the Amazon Linux AMIs.</p>



<p>If that&#8217;s your case, Docker is your friend. You can use a combination of Docker Compose + <a rel="noreferrer noopener" href="https://hub.docker.com/_/amazonlinux" target="_blank">Amazon Linux images</a> to build your dependencies before packaging and deploying your app.</p>



<h3 class="wp-block-heading">Managing Secrets</h3>



<p>At this moment, Lambda doesn&#8217;t natively support the injection of secrets as environment variables. If you are using Serverless Framework, all you can do at this point is adding them to Secrets Manager or Parameter Store and read them when your lambda boots up using any AWS SDK available. <strong>Make sure you do that outside of the function handler</strong>. </p>



<p>If you are using Up, you can just use the <code>up env</code> and it will be handled for you on a per-environment basis. (Under the hood, also managed via Secrets Manager).</p>



<h3 class="wp-block-heading">Testing Locally</h3>



<p>If you are using Up, it wouldn&#8217;t be a problem since you would just start your app normally. But if you are using Serverless Framework you can follow this <a rel="noreferrer noopener" href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-test-and-debug.html" target="_blank">in-depth tutorial from AWS</a> teaching you how to simulate the lambda environment locally using SAM.</p>



<h2 class="wp-block-heading" id="Final-Thoughts">Wrap Up</h2>



<p>As you can see, when used to solve the right problem, respecting the limitations of the environment, this is a very strong card to keep on your sleeve. </p>



<p>If you faced something different, comment bellow (づ￣ ³￣)づ.</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2020/11/16/lessons-learned-from-serverless-apis/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1046</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/c2062-serverless-apis-7-1.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/c2062-serverless-apis-7-1.png" medium="image">
			<media:title type="html">Serverless-APIs-7-1</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/be787-apex-up-edited.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/0a7fb-serverless-apis-7-1-edited.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/6fc38-image-20200929-174240.png" medium="image" />
	</item>
		<item>
		<title>WordPress Plugin: Up to 60% smaller images &#038; CDN</title>
		<link>https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/</link>
					<comments>https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Sun, 17 Nov 2019 14:04:59 +0000</pubDate>
				<category><![CDATA[Optimization]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[image compression]]></category>
		<category><![CDATA[imageboss]]></category>
		<category><![CDATA[webp]]></category>
		<category><![CDATA[wordpress]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=1003</guid>

					<description><![CDATA[In 2019 WordPress powered 35% of the Internet. 60% of all CMS websites were made using WordPress. Nearly 28% of all e-commerces are WooCommerce Stores. Can you imagine that? So if you are part of these statistics and run your website, blog, or e-commerce through WordPress, you know how important images are. Images are by<a class="more-link" href="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/">Continue reading <span class="screen-reader-text">"WordPress Plugin: Up to 60% smaller images &#38;&#160;CDN"</span></a>]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-1005 " src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2019/11/Screenshot-2019-11-17-at-13.22.30-1024x666.png" alt="" width="254" height="168">In 2019 WordPress powered 35% of the Internet. 60% of all CMS websites were made using WordPress. Nearly 28% of all e-commerces are WooCommerce Stores. Can you imagine that?</p>
<p>So if you are part of these statistics and run your website, blog, or e-commerce through WordPress, you know how important images are. Images are by far the biggest hit on page speed and a key factor if you want to increase your conversion.</p>
<h1>The Sandbox</h1>
<p>In order to test effectiveness, I will configure this plugin on my own personal blog. Currently, this is how much data you download if you open the home page of my blog and scroll it down to the end:</p>
<p><img loading="lazy" class="size-full wp-image-1006 alignnone" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/ee921-screenshot-2019-11-17-at-13.40.28.png" alt="" width="898" height="100"></p>
<p>Many images. All of them with just WordPress defaults.</p>
<h1>The Installation</h1>
<p>There is a WordPress plugin called &#8220;<a href="https://wordpress.org/plugins/imageboss/" target="_blank" rel="noopener noreferrer">ImageBoss – Images Up To 60% Smaller &amp; CDN</a>&#8220;. You can simply go to <em>WordPress Dashboard &gt; Plugins &gt; Add new</em> and search for &#8220;ImageBoss&#8221; or You can download the plugin and upload it directly on your WordPress dashboard.</p>
<p><img loading="lazy" data-attachment-id="1007" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2019-11-17-at-13-22-30/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/294ec-screenshot-2019-11-17-at-13.22.30.png" data-orig-size="1876,1220" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2019-11-17 at 13.22.30" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/294ec-screenshot-2019-11-17-at-13.22.30.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/294ec-screenshot-2019-11-17-at-13.22.30.png?w=750" class="wp-image-1007 size-large alignnone" src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2019/11/Screenshot-2019-11-17-at-13.45.38-1024x264.png" alt="" width="584" height="151"></p>
<p>After the installation, you will be redirected to this page:</p>


<figure class="wp-block-image size-large"><img loading="lazy" data-attachment-id="1070" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2020-11-17-at-10-36-53/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png" data-orig-size="979,556" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2020-11-17 at 10.36.53" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png?w=750" class="alignnone size-full wp-image-1070" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png" alt="" width="979" height="556" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png 979w, https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png?w=150&amp;h=85 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png?w=300&amp;h=170 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png?w=768&amp;h=436 768w" sizes="(max-width: 979px) 100vw, 979px" />



<p>First I need to create my&nbsp;<a href="https://imageboss.me/users/sign_up" target="_blank" rel="noopener noreferrer">ImageBoss Account</a> and configure my &#8220;Source&#8221;. Most people will use a source type &#8220;Web Proxy&#8221;. If you don&#8217;t know exactly the URL of your images to set up the Web Proxy Source, you can just inspect an <strong>&lt;img&gt;</strong> element on your website and see what&#8217;s in there:</p>
<p><img loading="lazy" data-attachment-id="1009" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2019-11-17-at-13-45-38/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8d257-screenshot-2019-11-17-at-13.45.38.png" data-orig-size="3028,780" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2019-11-17 at 13.45.38" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8d257-screenshot-2019-11-17-at-13.45.38.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8d257-screenshot-2019-11-17-at-13.45.38.png?w=750" class="size-large wp-image-1009 alignnone" src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2019/11/Screenshot-2019-11-17-at-13.50.17-1024x220.png" alt="" width="584" height="125"></p>
<p>In my case, all my images go through the same source:</p>


<figure class="wp-block-image size-large"><img loading="lazy" data-attachment-id="1069" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2020-11-17-at-10-34-12/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png" data-orig-size="814,764" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot-2020-11-17-at-10.34.12" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=750" class="alignnone size-full wp-image-1069" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png" alt="" width="814" height="764" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png 814w, https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=150&amp;h=141 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=300&amp;h=282 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=768&amp;h=721 768w" sizes="(max-width: 814px) 100vw, 814px" />



<p>Now, I need to connect the WordPress plugin to the same source:</p>
<p><img data-attachment-id="1067" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2020-11-17-at-10-31-20/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/b7784-screenshot-2020-11-17-at-10.31.20.png" data-orig-size="976,728" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot-2020-11-17-at-10.31.20" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/b7784-screenshot-2020-11-17-at-10.31.20.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/b7784-screenshot-2020-11-17-at-10.31.20.png?w=750" class="wp-image-1067" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/b7784-screenshot-2020-11-17-at-10.31.20.png" alt=""></p>
<p>If you have images from other sources you can just add them separated by a comma.</p>
<h1>That&#8217;s it!</h1>
<p>Now let&#8217;s check the results!</p>
<p>The image compression was <strong>MASSIVE</strong>:<img loading="lazy" data-attachment-id="1012" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2019-11-17-at-13-53-05/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8df88-screenshot-2019-11-17-at-13.53.05.png" data-orig-size="1924,984" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot 2019-11-17 at 13.53.05" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8df88-screenshot-2019-11-17-at-13.53.05.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8df88-screenshot-2019-11-17-at-13.53.05.png?w=750" class="alignnone size-full wp-image-1012" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/de7c3-screenshot-2019-11-17-at-13.56.23.png" alt="" width="918" height="106"></p>
<p>I went from 6.6MB to <strong>1.6MB</strong>, which is <strong>73,33%</strong>&nbsp;less than my original setup!</p>
<p>On top of that, these are all features of the plugin:</p>
<ul>
<li>CDN (<a href="http://cloudflare.com/" target="_blank" rel="noopener noreferrer">Cloudflare</a>).</li>
<li>WebP Support.</li>
<li>Image Optimization/Compression for Devices that don&#8217;t support WebP.</li>
<li>Retina Display Support.</li>
<li>Image sizes are tailored for each device.</li>
</ul>
<p>Let me know what you think!</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1003</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/294ec-screenshot-2019-11-17-at-13.22.30.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/294ec-screenshot-2019-11-17-at-13.22.30.png" medium="image">
			<media:title type="html">Screenshot 2019-11-17 at 13.22.30</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2019/11/Screenshot-2019-11-17-at-13.22.30-1024x666.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ee921-screenshot-2019-11-17-at-13.40.28.png" medium="image" />

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2019/11/Screenshot-2019-11-17-at-13.45.38-1024x264.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ae150-screenshot-2020-11-17-at-10.36.53.png" medium="image" />

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2019/11/Screenshot-2019-11-17-at-13.50.17-1024x220.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/b7784-screenshot-2020-11-17-at-10.31.20.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/de7c3-screenshot-2019-11-17-at-13.56.23.png" medium="image" />
	</item>
		<item>
		<title>Responsive Images for Responsive Designs</title>
		<link>https://blog.igorescobar.com/2018/05/06/responsive-images/</link>
					<comments>https://blog.igorescobar.com/2018/05/06/responsive-images/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Sun, 06 May 2018 23:31:30 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[imageboss]]></category>
		<category><![CDATA[responsive design]]></category>
		<category><![CDATA[responsive images]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=848</guid>

					<description><![CDATA[Today we are going to talk about Responsive Images. Responsive Images are a very useful technique to make your designs look good regardless of the user&#8217;s resolution screen. Nowadays when we create our online projects we want them to look good on every device. Desktop, Mobile Phones, Tablets, you name it. With HTML you can<a class="more-link" href="https://blog.igorescobar.com/2018/05/06/responsive-images/">Continue reading <span class="screen-reader-text">"Responsive Images for Responsive&#160;Designs"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Today we are going to talk about <strong>Responsive Images</strong>. Responsive Images are a very useful technique to make your designs look good regardless of the user&#8217;s resolution screen.</p>
<p>Nowadays when we create our online projects we want them to look good on every device. Desktop, Mobile Phones, Tablets, you name it.</p>
<p><img loading="lazy" data-attachment-id="849" data-permalink="https://blog.igorescobar.com/2018/05/06/responsive-images/bro_responsivedesign_main2/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png" data-orig-size="1200,560" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Responsive Images" data-image-description="&lt;p&gt;Responsive Images for Responsive Designs&lt;/p&gt;
" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=750" class="aligncenter wp-image-849 size-large" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=1024&#038;h=478" alt="Responsive Images" width="584" height="273" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=584&amp;h=273 584w, https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=1168&amp;h=545 1168w, https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=150&amp;h=70 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=300&amp;h=140 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=768&amp;h=358 768w, https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=1024&amp;h=478 1024w" sizes="(max-width: 584px) 100vw, 584px" /></p>
<p>With HTML you can use two different approaches to accomplish this and I will teach you how do implement it and how can you make it cross-browser and make it work with older browsers.</p>
<h1>Why Responsive Images?</h1>
<p>With responsive images, you can deliver the image with the best fit for your user&#8217;s screen. Why deliver a 5MB image when you can deliver a 3kb image for your user that is accessing your website on his phone? Your user will see your content faster, will navigate through your content faster, and will use a lot less bandwidth which will save you a few bucks.</p>
<ul>
<li>Faster navigation.</li>
<li>Bandwidth savings.</li>
<li>Most of us don&#8217;t live in a world where we don&#8217;t have to care about 4G data consumption.</li>
</ul>
<h1>The &lt;picture&gt; element</h1>
<p>The syntax like this:</p>
<p class="codepen">See the Pen <a href="https://codepen.io/igorescobar/pen/ZoXgYK/">Responsive Images for Responsive Designs #1</a> by Igor Escobar (<a href="https://codepen.io/igorescobar">@igorescobar</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<p>Notice in this example I&#8217;ve used <a href="https://imageboss.me/" target="_blank" rel="noopener noreferrer">ImageBoss</a> to crop the smart crop the original image for desktop, tables, and mobile phones. I&#8217;ve used it because I not only want to deliver images with proper sizes but they are also compressed and delivered with Progressive Scans.</p>
<p>Notice that you open the code pen above and resize your window the image will change accordingly to your window size.</p>
<h1>The &lt;img&gt; element with srcset and sizes attribute</h1>
<p>If you don&#8217;t like the approach above you can also use the &lt;img&gt; tag with the srcset and sizes attribute.</p>
<p class="codepen">See the Pen <a href="https://codepen.io/igorescobar/pen/JvrgGZ/">Responsive Images for Responsive Designs #2</a> by Igor Escobar (<a href="https://codepen.io/igorescobar">@igorescobar</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<p><a href="https://static.codepen.io/assets/embed/ei.js">https://static.codepen.io/assets/embed/ei.js</a></p>
<h1>Browser Support</h1>
<p>Notice that both the &lt;picture&gt; and &lt;img&gt; approach are only implemented on modern browsers as you can see in the image below:</p>
<p><img loading="lazy" data-attachment-id="859" data-permalink="https://blog.igorescobar.com/2018/05/06/responsive-images/screen-shot-2018-05-07-at-00-10-12/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3066c-screen-shot-2018-05-07-at-00.10.12.png" data-orig-size="2508,564" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Picture browser support" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3066c-screen-shot-2018-05-07-at-00.10.12.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3066c-screen-shot-2018-05-07-at-00.10.12.png?w=750" class="alignleft size-large wp-image-859" src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2018/05/Screen-Shot-2018-05-07-at-00.10.12-1024x230.png" alt="" width="584" height="131" />More Info: <a href="https://caniuse.com/#feat=picture" target="_blank" rel="noopener noreferrer">https://caniuse.com/#feat=picture</a></p>
<h1>Cross-browser Responsive Images</h1>
<p>If you are concerned about how this is going to work on an old browser you can use a very cool project called <a href="http://scottjehl.github.io/picturefill/" target="_blank" rel="noopener noreferrer">Picturefill</a>. It will basically wrap the W3C specifications for <a href="https://html.spec.whatwg.org/multipage/embedded-content.html#attr-img-srcset" target="_blank" rel="noopener noreferrer">img</a> and <a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-picture-element" target="_blank" rel="noopener noreferrer">picture</a> with javascript to make it work.</p>
<h1>How to generate multiple images for multiple screen sizes?</h1>
<p>In this very post, I&#8217;ve used <a href="https://imageboss.me/" target="_blank" rel="noopener noreferrer">ImageBoss</a> to generate the images for all the devices I wanted. I didn&#8217;t need to generate all of them by myself and also didn&#8217;t need to code anything specific for it. All I needed was to have my image stored somewhere and it did the heavy lifting.</p>
<p>Hope it helped!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2018/05/06/responsive-images/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">848</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png" medium="image">
			<media:title type="html">Responsive Images</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/1f406-bro_responsivedesign_main2.png?w=1024&#038;h=478" medium="image">
			<media:title type="html">Responsive Images</media:title>
		</media:content>

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2018/05/Screen-Shot-2018-05-07-at-00.10.12-1024x230.png" medium="image" />
	</item>
		<item>
		<title>On-demand Image Resizing API</title>
		<link>https://blog.igorescobar.com/2018/04/02/on-demand-image-resizing-api/</link>
					<comments>https://blog.igorescobar.com/2018/04/02/on-demand-image-resizing-api/#respond</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Mon, 02 Apr 2018 18:39:09 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Optimization]]></category>
		<category><![CDATA[cdn]]></category>
		<category><![CDATA[image compression]]></category>
		<category><![CDATA[image cropping]]></category>
		<category><![CDATA[image resizing]]></category>
		<category><![CDATA[image resizing api]]></category>
		<category><![CDATA[imageboss]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=838</guid>

					<description><![CDATA[Hello guys. Today I&#8217;m going to share with you a very cool project I&#8217;m working on. Its main mission is to apply all Web Development Best Practices applied for images and combine them into one simple but powerful API. It&#8217;s called ImageBoss. And my objective today with this post it&#8217;s to help you to understand<a class="more-link" href="https://blog.igorescobar.com/2018/04/02/on-demand-image-resizing-api/">Continue reading <span class="screen-reader-text">"On-demand Image Resizing&#160;API"</span></a>]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" data-attachment-id="839" data-permalink="https://blog.igorescobar.com/2018/04/02/on-demand-image-resizing-api/logo-13x/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png" data-orig-size="156,156" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="ImageBoss" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png?w=156" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png?w=156" class="alignleft wp-image-839 size-full" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png" alt="" width="156" height="156" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png 156w, https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png?w=150&amp;h=150 150w" sizes="(max-width: 156px) 100vw, 156px">Hello guys. Today I&#8217;m going to share with you a very cool project I&#8217;m working on. Its main mission is to apply all Web Development Best Practices applied for images and combine them into one simple but powerful API.</p>
<p>It&#8217;s called <a href="https://imageboss.me">ImageBoss</a>. And my objective today with this post it&#8217;s to help you to understand why&nbsp;<a href="https://imageboss.me">ImageBoss</a> and how simple it is to do <strong>image resizing</strong> or <strong>image cropping</strong> with any kind of image.</p>
<p>First of all, if you have a website (or an app) with posts, news, galleries, or dealing with user-generated content, in general, it can be a huge waste of time if all you want to do is to focus on your business.</p>
<p>Usually, you have to create a new machine and optimize this web service to handle huge payloads, optimize its storage to fast access, increase timeouts to be able to fetch all the information, handle security, conversion, compression, and then you have to code a routine to generate thumbnails and resize your images in all kind of different formats you need (or may need) to be able to beautifully display those images on your app or website. After doing all that, you still need to sign up for a <strong>CDN</strong> so you can put your assets closer to your end-users to reduce latency and download speed.</p>
<p>It should be the dream, right? but we have to be honest&#8230; not all of us have the time, resources, and patience to go this further and do it all over again for each product or client you have.</p>
<p>That is why&nbsp;<a href="https://imageboss.me">ImageBoss</a> is here. It does it all for you. <strong>Image Resizing</strong>, <strong>image cropping</strong>, <strong>image filters</strong>, <strong>image conversion,</strong> and then <strong>caching</strong> it to one of the most popular CDNs in the world,&nbsp;<a href="https://www.cloudflare.com/" target="_blank" rel="noopener noreferrer">Cloudflare</a>.</p>
<h1>Image Resizing</h1>
<p>First of all, to be able to keep up you need to go to the ImageBoss website and set up your account: <a href="https://imageboss.me/" target="_blank" rel="noopener noreferrer">https://imageboss.me/</a>. (~30secs)</p>
<p>After login in, on your dashboard, you will be able to see this screen:</p>
<p><img loading="lazy" data-attachment-id="1069" data-permalink="https://blog.igorescobar.com/2019/11/17/wordpress-plugin-up-to-60-smaller-images-cdn/screenshot-2020-11-17-at-10-34-12/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png" data-orig-size="814,764" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screenshot-2020-11-17-at-10.34.12" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=750" class="alignnone size-full wp-image-1069" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png" alt="" width="814" height="764" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png 814w, https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=150&amp;h=141 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=300&amp;h=282 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png?w=768&amp;h=721 768w" sizes="(max-width: 814px) 100vw, 814px"></p>
<p>All you need to do is to add all the <strong>sources/hosts</strong> that identify your traffic. (You can add as many sites as you want).</p>
<p>In this example I will use this image:</p>
<p><img loading="lazy" data-attachment-id="736" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-15-10-22-1/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg" data-orig-size="2446,2446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1463929822&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00060716454159077&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.696338888889&quot;,&quot;longitude&quot;:&quot;-9.4201833333333&quot;}" data-image-title="2016-05-22 15.10.22-1" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=750" class="alignleft  wp-image-736" src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2016/05/2016-05-22-15.10.22-1-1024x1024.jpg" alt="" width="239" height="239"></p>
<p>Its URL is:&nbsp;<a href="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg">https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg</a></p>
<p>Imagine that you want to generate a custom version of that image to be able to show it on a mobile device with <strong>745&#215;200</strong>.</p>
<p>In that case, I will use an ImageBoss operation called &#8220;<strong>cover</strong>&#8221; with all the default settings. You can read further by following this link:<br />
<a href="https://imageboss.me/docs/operations/cover" target="_blank" rel="noopener noreferrer">https://imageboss.me/docs/operations/cover</a></p>
<p>Basically, all you need to do is add a <strong>prefix</strong> to the original URL:</p>
<pre>https://img.imageboss.me/igorescobar/cover/745x200/</pre>
<p>And the final URL should be:</p>
<pre><a href="https://img.imageboss.me/igorescobar/cover/745x200/blog/wp-content/uploads/2016/05/2016-05-22-15.10.22-1.jpg" target="_blank" rel="noopener noreferrer">https://img.imageboss.me/igorescobar/cover/745x200/blog/wp-content/uploads/2016/05/2016-05-22-15.10.22-1.jpg</a></pre>
<p>The generated image would be:<br />
<a href="https://img.imageboss.me/igorescobar/cover/745x200/blog/wp-content/uploads/2016/05/2016-05-22-15.10.22-1.jpg"><img class="alignnone" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg" alt="" width="745" height="200"></a></p>
<p>Notice that ImageBoss has <strong>Smart Cropping</strong> by default.</p>
<blockquote><p>Use&nbsp;<span class="operation">cover</span>&nbsp;when you want an image with an exact width and height. By default, we&#8217;ll run our&nbsp;<strong>Smart Cropping</strong>&nbsp;algorithm to identify the main subject of the image, so in case we need to remove part of the image to deliver on the requested size, we will always try our best to keep the most important element in the frame.</p></blockquote>
<p>In addition to all that it <strong>auto-rotates</strong> my image if necessary and it also converts my image to have progressive scans (<a href="https://optimus.keycdn.com/support/progressive-jpeg/" target="_blank" rel="noopener noreferrer">progressive JPEG</a>). Now my image is auto rotated, <strong>compressed</strong>, cached, <strong>progressive scans</strong>, and <strong>globally available</strong> to all my users.</p>
<p>I guess that our boring days generating <strong>thumbnails</strong> manually for every single project is over, right?</p>
<p>Let me know what you guys think!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2018/04/02/on-demand-image-resizing-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">838</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/d367b-screenshot-2020-11-19-at-10.38.29.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/d367b-screenshot-2020-11-19-at-10.38.29.png" medium="image">
			<media:title type="html">Screenshot 2020-11-19 at 10.38.29</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/67117-logo-1403x.png" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/32965-screenshot-2020-11-17-at-10.34.12.png" medium="image" />

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2016/05/2016-05-22-15.10.22-1-1024x1024.jpg" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg" medium="image" />
	</item>
		<item>
		<title>I&#8217;ve had the chance to troll Donald Trump. But I didn&#8217;t.</title>
		<link>https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/</link>
					<comments>https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Sun, 21 Aug 2016 23:20:39 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[donald trump]]></category>
		<category><![CDATA[donate]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[jquery mask plugin]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=802</guid>

					<description><![CDATA[The craziest thing that could possibly happen on my professional life as a Software Engineer happened on August 18th, 2016. That day I discovered that I could perform a massive Rick Roll attempt against the US presidential candidate Donald Trump. &#160; The&#160;crazy story begins with an unexpected e-mail from a guy named&#160;Shu Uesugi&#160;&#8211;&#160;a San Francisco<a class="more-link" href="https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/">Continue reading <span class="screen-reader-text">"I&#8217;ve had the chance to troll Donald Trump. But I&#160;didn&#8217;t."</span></a>]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" data-attachment-id="803" data-permalink="https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/trump_3/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg" data-orig-size="4272,3204" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Trump_3" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=750" class="size-medium wp-image-803 alignright" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=300&#038;h=225" alt="Trump_3" width="300" height="225" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=300&amp;h=225 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=600&amp;h=450 600w, https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=150&amp;h=113 150w" sizes="(max-width: 300px) 100vw, 300px"><br />
The <strong>craziest</strong> thing that could possibly happen on my professional life as a Software Engineer happened on August 18th, 2016. That day I discovered that I could perform a massive <a href="https://www.youtube.com/watch?v=dQw4w9WgXcQ" target="_blank" rel="noopener noreferrer">Rick Roll</a> attempt against the US presidential candidate <a href="https://en.wikipedia.org/wiki/Donald_Trump" target="_blank" rel="noopener noreferrer">Donald Trump</a>.</p>
<p>&nbsp;</p>
<p>The&nbsp;crazy story begins with an unexpected e-mail from a guy named&nbsp;<a href="https://twitter.com/chibicode" target="_blank" rel="noopener noreferrer">Shu Uesugi</a>&nbsp;&#8211;&nbsp;a San Francisco based Engineer currently&nbsp;working for <a href="http://www.edsurge.com/" target="_blank" rel="noopener noreferrer">EdSurge</a>&nbsp;&#8211; asking for permission to mention my name and share with the world what <a href="https://blog.chibicode.com/you-can-submit-a-pull-request-to-inject-arbitrary-js-code-into-donald-trumps-site-here-s-how-782aa6a17a56#.t6ks9yw8w" target="_blank" rel="noopener noreferrer">he just discovered</a>.</p>
<p>After reading his e-mail and his draft I was like:<br />
<img src="https://blog.igorescobar.com/wp-content/uploads/2021/08/2945d-agtmbomg.gif" alt="" width="196" height="187"></p>
<p>The short story is that <a href="https://secure.donaldjtrump.com/donations/make-a-donation/" target="_blank" rel="noopener noreferrer">Donald Trump has a donate page</a>&nbsp;which is using my open-source project&nbsp;<a href="https://github.com/igorescobar/jquery-mask-plugin" target="_blank" rel="noopener noreferrer">jQuery Mask Plugin</a>&nbsp;to guide his visitors on the tricky quest of filling up web forms &#8211; so far so good.</p>
<p>The shit hits the fan when the developer of his <strong>2MM</strong> <strong>dollars</strong> website&nbsp;decides to include the minified version of jquery mask plugin file pointing directly to the <a href="https://igorescobar.github.io/jQuery-Mask-Plugin/" target="_blank" rel="noopener noreferrer">demonstration page of my project</a> (hosted in github.io). I have 100% control over this file and the developer simply injected the file on the page (instead of saving the file on his servers) and I could just replace or inject something nasty in&nbsp;it to make the most ambitious trolling attempt against the US presidential candidate.</p>
<p>Yet, in shock, I decided to share this with my personal friends on Facebook:</p>
<p>In only MY post I got 714 likes, 139 comments and an impressive 262 shares, hundreds&nbsp;of people randomly sending me friend requests, sending me messages on Twitter, Facebook and e-mails&#8230; giving me ideas and warning me about the window of opportunity that I got to do something about Trump. People really liked the possibilities of what&nbsp;<a href="https://twitter.com/chibicode" target="_blank" rel="noopener noreferrer">Uesugi</a>&nbsp;discovered . At the end of the post I asked for ideas of what each person would do if they&nbsp;were in my position&nbsp;&#8211; oh boy&#8230; <strong>that was fun</strong>!</p>
<blockquote class="twitter-tweet">
<p dir="ltr" lang="en"><a href="https://twitter.com/igorescobar">@igorescobar</a> SO. MUCH. POWER.</p>
<p>— Eduardo Shiota (@shiota) <a href="https://twitter.com/shiota/status/766359301841625090">August 18, 2016</a></p></blockquote>
<p>All of the sudden I became some sort of super-man with&nbsp;a power that could change the world. People were like&#8230; DO IT! DO IT! Say something! Make a beautiful rain of penises with wings upon his website! And I was like&#8230; Wow&#8230; People really want to say something to this guy&#8230;</p>
<p>They even opened a <strong>hilarious</strong> pull request on their own, pure team work, in attempt to do something and hoping I&#8217;d merge&nbsp;it (sadly it was deleted).</p>
<p>The discovery was discussed everywhere:</p>
<ul>
<li><a href="https://news.ycombinator.com/item?id=12314919" target="_blank" rel="noopener noreferrer">Hacker News</a></li>
<li><a href="https://www.reddit.com/r/programming/comments/4ydfr1/you_can_submit_a_pull_request_to_inject_arbitrary/" target="_blank" rel="noopener noreferrer">Reddit</a></li>
<li><a href="http://qz.com/762424/trumps-campaign-donation-website-used-open-source-code-sloppily-risking-ridicule-and-worse/?utm_content=buffer1065b&amp;utm_medium=social&amp;utm_source=facebook.com&amp;utm_campaign=buffer" target="_blank" rel="noopener noreferrer">Trump’s campaign donation website used open-source code sloppily, risking ridicule and worse</a></li>
<li><a href="http://nymag.com/selectall/2016/08/it-would-have-been-pretty-easy-to-hack-the-trump-website.html" target="_blank" rel="noopener noreferrer">Donald Trump’s Donation Website Was Easily Hackable<br />
</a></li>
<li><a href="https://www.facebook.com/igorcescobar/posts/1248697458498526?pnref=story" target="_blank" rel="noopener noreferrer">Facebook post</a></li>
</ul>
<p>After watching all this, receiving all those tweets, messages and emails showing nothing but pure <del>hate</del> love towards&nbsp;Trump. Of course, the bad news spreads fast and in a matter of hours the code on Trump&#8217;s website was fixed. People were in tears. e.g:</p>
<p><img loading="lazy" data-attachment-id="805" data-permalink="https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/screen-shot-2016-08-21-at-11-21-18-pm/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png" data-orig-size="578,167" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2016-08-21 at 11.21.18 PM" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png?w=578" class="wp-image-805 size-full alignnone" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png" alt="Screen Shot 2016-08-21 at 11.21.18 PM" width="578" height="167" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png 578w, https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png?w=150&amp;h=43 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png?w=300&amp;h=87 300w" sizes="(max-width: 578px) 100vw, 578px"></p>
<p>Then I posted this on twitter:</p>
<p><img loading="lazy" data-attachment-id="804" data-permalink="https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/screen-shot-2016-08-21-at-11-18-18-pm/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png" data-orig-size="588,191" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2016-08-21 at 11.18.18 PM" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png?w=588" class="wp-image-804 size-full alignnone" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png" alt="Screen Shot 2016-08-21 at 11.18.18 PM" width="588" height="191" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png 588w, https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png?w=150&amp;h=49 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png?w=300&amp;h=97 300w" sizes="(max-width: 588px) 100vw, 588px"></p>
<p>Yep. At the bottom of your heart you agree with me that this would be wrong. jQuery Mask Plugin is a serious project which took years of hard work and commitment to the community to build its reputation. I can&#8217;t just throw it all away for the public&#8217;s amusement. To make people laugh. To make a statement against&nbsp;someone &#8211; even if this someone is a&nbsp;US presidential candidate like Donald Trump.</p>
<p><img loading="lazy" data-attachment-id="807" data-permalink="https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/screen-shot-2016-08-21-at-11-22-27-pm/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png" data-orig-size="577,182" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2016-08-21 at 11.22.27 PM" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png?w=577" class="wp-image-807 size-full alignnone" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png" alt="Screen Shot 2016-08-21 at 11.22.27 PM" width="577" height="182" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png 577w, https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png?w=150&amp;h=47 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png?w=300&amp;h=95 300w" sizes="(max-width: 577px) 100vw, 577px"></p>
<p>The <strong>true sad history</strong>&nbsp;behind this is that Donald Trump&#8217;s website cost <strong>2MM dollars,&nbsp;</strong>they are using several <strong>open sourced</strong>&nbsp;projects like our <strong>jQuery Mask Plugin</strong> and <strong>they don&#8217;t even donated 1.00 freaking dollar </strong><a href="http://igorescobar.github.io/jQuery-Mask-Plugin/" target="_blank" rel="noopener noreferrer">in our donate page</a><strong>&nbsp;</strong>to support its development<strong>.</strong></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2016/08/21/ive-the-chance-to-troll-donald-trump-but-i-didnt/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">802</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccd04-trump.jpeg" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccd04-trump.jpeg" medium="image">
			<media:title type="html">trump</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/8ee22-trump_3.jpg?w=300&#038;h=225" medium="image">
			<media:title type="html">Trump_3</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/2945d-agtmbomg.gif" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/b63ab-screen-shot-2016-08-21-at-11.21.18-pm.png" medium="image">
			<media:title type="html">Screen Shot 2016-08-21 at 11.21.18 PM</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/4a684-screen-shot-2016-08-21-at-11.18.18-pm.png" medium="image">
			<media:title type="html">Screen Shot 2016-08-21 at 11.18.18 PM</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/df706-screen-shot-2016-08-21-at-11.22.27-pm.png" medium="image">
			<media:title type="html">Screen Shot 2016-08-21 at 11.22.27 PM</media:title>
		</media:content>
	</item>
		<item>
		<title>Deploying Sendy Using AWS ElasticBeanstalk and Docker</title>
		<link>https://blog.igorescobar.com/2016/07/20/deploying-sendy-using-aws-elasticbeanstalk-and-docker/</link>
					<comments>https://blog.igorescobar.com/2016/07/20/deploying-sendy-using-aws-elasticbeanstalk-and-docker/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Wed, 20 Jul 2016 17:35:51 +0000</pubDate>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Geral]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[elasticbeanstalk]]></category>
		<category><![CDATA[sendy]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=779</guid>

					<description><![CDATA[In this post I&#8217;m going to guide you through a step-by-step on how to deploy your Sendy installation using AWS ElasticBeanstalk and Docker. Keep in mind that this is a production ready setup so brace yourself. The AWS Resources Here is a list of what you need to do before going ahead. Create an ElasticBeanstalk<a class="more-link" href="https://blog.igorescobar.com/2016/07/20/deploying-sendy-using-aws-elasticbeanstalk-and-docker/">Continue reading <span class="screen-reader-text">"Deploying Sendy Using AWS ElasticBeanstalk and&#160;Docker"</span></a>]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" data-attachment-id="790" data-permalink="https://blog.igorescobar.com/2016/07/20/deploying-sendy-using-aws-elasticbeanstalk-and-docker/sendy-300x118/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png" data-orig-size="300,118" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="sendy-300&amp;#215;118" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png?w=300" class="alignleft size-medium wp-image-790" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png?w=300&#038;h=118" alt="sendy-300x118" width="300" height="118" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png?w=150&amp;h=59 150w" sizes="(max-width: 300px) 100vw, 300px" />In this post I&#8217;m going to guide you through a step-by-step on how to deploy your <a href="https://sendy.co/" target="_blank" rel="noopener">Sendy</a> installation using <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/Welcome.html" target="_blank" rel="noopener">AWS ElasticBeanstalk</a> and <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html" target="_blank" rel="noopener">Docker</a>. Keep in mind that this is a <strong>production ready</strong> setup so brace yourself.</p>
<h2>The AWS Resources</h2>
<p>Here is a list of what you need to do before going ahead.</p>
<ol>
<li>Create an ElasticBeanstalk Application (e.g Sendy).</li>
<li>Create an ElasticBeanstalk Environment (e.g sendy-production).
<ol>
<li>You can deploy the <strong>Sample Application</strong> for now.</li>
<li>Once your environment is created make a note of your<strong> Environment ID</strong> located on your environment dashboard right beside your DNS entry. (e.g Environment ID: e-xxxxxxxxxxx).</li>
</ol>
</li>
<li>Create a EC2 Security Group to be used by your <strong>RDS MySQL</strong> Instance (e.g: rds-sendy-production).
<ol>
<li>Inbound: Open this tab and make sure you allowed your ElasticBeanstalk Instances can reach your RDS. To do so you need to locate the name of the Security Group created by your ElasticBeanstalk Environment. Just go to your <a href="https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#SecurityGroups:search=rds-sendy;sort=groupId" target="_blank" rel="noopener">EC2 Security Groups Section</a>. And locate the ID of the security group that possessed your ElasticBeanstalk Environment ID.</li>
<li>It will look kind of like this:
<ol>
<li><img loading="lazy" data-attachment-id="789" data-permalink="https://blog.igorescobar.com/2016/07/20/deploying-sendy-using-aws-elasticbeanstalk-and-docker/screen-shot-2016-07-20-at-19/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png" data-orig-size="952,624" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2016-07-20 at 19" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=750" class="wp-image-789 size-medium alignnone" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=300&#038;h=197" width="300" height="197" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=300&amp;h=197 300w, https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=600&amp;h=393 600w, https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=150&amp;h=98 150w" sizes="(max-width: 300px) 100vw, 300px" /></li>
</ol>
</li>
<li>You need to do that because your environment is elastic and every new created instance needs to inherit its permission to access the RDS instance.</li>
</ol>
</li>
<li>Create your <a href="https://console.aws.amazon.com/rds/home?region=us-east-1#launch-dbinstance:ct=dashboard:" target="_blank" rel="noopener">RDS MySQL instance</a> and attach the EC2 Security Group created on the previous step. Further configurations is up to you.</li>
<li>Create a <a href="https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#Volumes:sort=state" target="_blank" rel="noopener">SSD or Magnetic Volume </a>on the <strong>same Availability Zone</strong> of your Elastic Beanstalk Environment Instances. Attention to the availability zone or your deployment will fail because EC2 Instances can&#8217;t attach volumes outside of its availability zone. After doing that take a note on your Volume ID (e.g vol-XXXXXXXX).</li>
<li>Install the <a href="http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install.html" target="_blank" rel="noopener">awsebcli</a>.</li>
</ol>
<h2>The Deploy Setup</h2>
<p>Assuming that you&#8217;re already inside your Sendy&#8217;s folder you need to create a few files.</p>
<p><strong>Dockerfile</strong></p>
<p>[bash]<br />
FROM php:7.0.8-apache</p>
<p>RUN a2enmod rewrite &amp;amp;&amp;amp; \<br />
    docker-php-ext-install mysqli gettext</p>
<p>ENV APP_HOME /var/www/html</p>
<p>WORKDIR $APP_HOME<br />
COPY . $APP_HOME</p>
<p>EXPOSE 80<br />
[/bash]</p>
<p>Notice that I&#8217;m using the official <a href="https://hub.docker.com/_/php/" target="_blank" rel="noopener">php + apache2 docker image</a>. I need to create my own Dockerfile because of Sendy&#8217;s dependencies like mysqli and gettext.</p>
<p><strong>.elasticbeanstalk/config.yml</strong></p>
<p>[ruby]<br />
branch-defaults:<br />
  default:<br />
    environment: sendy-production<br />
global:<br />
  application_name: sendy<br />
  default_ec2_keyname: YOUR-EC2-KEYNAME<br />
  default_platform: Docker 1.11.1<br />
  default_region: us-east-1<br />
  profile: null<br />
  sc: null<br />
[/ruby]</p>
<p>This file is important when your are about to deploy your application to ElasticBeanstalk.</p>
<p><strong>Dockerrun.aws.json</strong></p>
<p>[ruby]<br />
{<br />
  &quot;AWSEBDockerrunVersion&quot;: &quot;1&quot;,<br />
  &quot;Ports&quot;: [<br />
    {<br />
      &quot;ContainerPort&quot;: &quot;80&quot;<br />
    }<br />
  ],<br />
  &quot;Volumes&quot;: [<br />
    {<br />
      &quot;HostDirectory&quot;: &quot;/uploads&quot;,<br />
      &quot;ContainerDirectory&quot;: &quot;/var/www/html/uploads&quot;<br />
    },<br />
    {<br />
       &quot;HostDirectory&quot;: &quot;/session&quot;,<br />
       &quot;ContainerDirectory&quot;: &quot;/var/www/html/session&quot;<br />
    }<br />
  ],<br />
  &quot;Logging&quot;: &quot;/var/log/apache2/&quot;<br />
}</p>
<p>[/ruby]</p>
<p><strong>Ports:</strong> By default apache is running on port 80, no big deal here.<br />
<strong>Volumes:</strong> The most important thing to notice on the code above is those &#8220;Volumes&#8221;. Sendy uses the the <strong>uploads/</strong> directory to save everything you upload to its system so it&#8217;s very important for you to have those volumes mapped from the Docker Host into your containers to make sure that in case you need to restart your containers you don&#8217;t lose your persisted data (docker containers are stateless!).</p>
<p>The <em>/session:/var/www/html/session</em> is because it is where php is saving logged user sessions. Its better to save sessions outside of the application container. It make sure that every new deployment you don&#8217;t need to clean your cookies and login again (it sucks, I know!).</p>
<p><strong>.ebextensions/container_commands.config</strong></p>
<p>[ruby]<br />
container_commands:<br />
  01mount:<br />
    command: &quot;aws ec2 attach-volume &#8211;region us-east-1 &#8211;volume-id YOUR_VOLUME_ID_HERE &#8211;instance-id $(curl -s <a href="http://169.254.169.254/latest/meta-data/instance-id" rel="nofollow">http://169.254.169.254/latest/meta-data/instance-id</a>) &#8211;device /dev/xvdf&quot;<br />
    ignoreErrors: true<br />
  02wait:<br />
    command: &quot;sleep 20&quot;<br />
  03mkdir:<br />
    command: &quot;mkdir /uploads&quot;<br />
    test: &quot;[ ! -d /uploads ]&quot;<br />
  04trymount:<br />
    command: mount /dev/xvdf /uploads<br />
    ignoreErrors: true<br />
  05format-if-not-already:<br />
    command: if find /uploads -maxdepth 0 -empty | read v; then mkfs -t ext4 /dev/xvdf; fi<br />
  06mount:<br />
    command: &quot;mount /dev/xvdf /uploads&quot;<br />
    ignoreErrors: true<br />
  07fix_public_dirs:<br />
    command: &quot;chmod -R 777 /session &amp;amp;&amp;amp; chmod -R 777 /uploads&quot;<br />
    ignoreErrors: true<br />
[/ruby]</p>
<p><strong>01mount:</strong> Replace the <em>YOUR_VOLUME_ID_HERE</em> by your <strong>Volume ID</strong> created before. Also make sure that <em>&#8211;region us-east-1</em> is correct. This file will make sure that we will be using the Volume created earlier exclusive to our uploads and your data will never be lost in case you explode your machine somehow.<br />
<strong>02wait:</strong> The commend <em>aws ec2 attach-volume</em> is async so we need this otherwise further commands would fail.<br />
<strong>03mkdir</strong>: Create the /uploads dir in case it doesn&#8217;t exists.<br />
<strong>04trymount and 05:</strong> When you first create a EC2 Volume you need to make sure that it has a file system in it so this is what it does.<br />
<strong>06mount:</strong> Uses the Volume we created for the /uploads folder.</p>
<p><strong>.ebextensions/files.config</strong></p>
<p>[ruby]<br />
files:<br />
  &quot;/opt/elasticbeanstalk/hooks/appdeploy/pre/files.sh&quot;:<br />
    mode: &quot;000755&quot;<br />
    owner: root<br />
    group: root<br />
    content: |<br />
      #!/usr/bin/env bash<br />
      set -x<br />
      docker run -v /uploads:/var/www/html/uploads &#8211;rm aws_beanstalk/staging-app chown -R www-data: /var/www/html/uploads<br />
  &quot;/opt/elasticbeanstalk/hooks/appdeploy/enact/rewrite_nginx_config.py&quot;:<br />
    group: root<br />
    owner: root<br />
    mode: &quot;000755&quot;<br />
    content: |-<br />
      #! /usr/bin/python</p>
<p>      &quot;&quot;&quot;<br />
      Modifies nginx configuration file on AWS Elastic Beanstalk to support WebSocket connections.<br />
      &quot;&quot;&quot;</p>
<p>      import os<br />
      import re</p>
<p>      VERSION=&quot;v1.0.4&quot;<br />
      NGINX_CONF_FILE = &#8216;/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf&#8217;<br />
      NGINX_CONFIG = &quot;&quot;&quot;<br />
      # nginx.conf<br />
      # v1.0.4</p>
<p>      map $http_upgrade $connection_upgrade {<br />
        default   &quot;upgrade&quot;;<br />
        &quot;&quot;      &quot;&quot;;<br />
      }</p>
<p>      server {<br />
        listen 80;</p>
<p>        gzip on;<br />
        gzip_comp_level 4;<br />
        gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;<br />
        client_max_body_size 100M;</p>
<p>        location ~ &quot;^/assets/&quot; {<br />
          root /var/app/current/public;<br />
          gzip_static on;<br />
          expires max;<br />
          add_header Cache-Control public;<br />
          add_header ETag &quot;&quot;;<br />
        }</p>
<p>        location / {<br />
          proxy_pass      <a href="http://docker" rel="nofollow">http://docker</a>;<br />
          proxy_http_version  1.1;</p>
<p>          proxy_set_header  Connection           $connection_upgrade;<br />
          proxy_set_header  Upgrade              $http_upgrade;<br />
          proxy_set_header  Host                 $host;<br />
          proxy_set_header  X-Real-IP            $http_x_real_ip;<br />
          proxy_set_header  X-Forwarded-For      $http_x_forwarded_for;<br />
        }<br />
      }<br />
      &quot;&quot;&quot;</p>
<p>      def has_same_nginx_file_version():<br />
        f = open(NGINX_CONF_FILE, &quot;r&quot;)<br />
        conf = f.read()<br />
        ret = re.search(VERSION, conf)<br />
        f.close()</p>
<p>        return ret != None</p>
<p>      def write_nginx_conf_file():<br />
        f = open(NGINX_CONF_FILE, &quot;w&quot;)<br />
        f.write(NGINX_CONFIG)<br />
        f.close()</p>
<p>      def restart_nginx():<br />
        print(&quot;&#8211; service nginx restart&quot;)<br />
        os.system(&quot;service nginx restart&quot;)</p>
<p>      def main():<br />
        if has_same_nginx_file_version():<br />
          print(&quot;&#8211; already configured, do nothing.&quot;)<br />
        else :<br />
          write_nginx_conf_file()<br />
          restart_nginx()</p>
<p>      if __name__ == &quot;__main__&quot;:<br />
        main()</p>
<p>[/ruby]</p>
<p>The file above is necessary because apache runs your application with <strong>www-data</strong> user and this user doesn&#8217;t exists on your <strong>Docker Host</strong>. And the second file is for overwriting nginx&#8217;s beanstalk configuration for accepting upload of bigger files.</p>
<p><strong>includes/config.php</strong></p>
<p>[php]<br />
/* MySQL database connection credentials (please place values between the apostrophes) */<br />
$dbHost = $_ENV[&#8216;MYSQL_DATABASE_HOST&#8217;]; //MySQL Hostname<br />
$dbUser = $_ENV[&#8216;MYSQL_DATABASE_USER&#8217;]; //MySQL Username<br />
$dbPass = $_ENV[&#8216;MYSQL_DATABASE_PASSWORD&#8217;]; //MySQL Password<br />
$dbName = $_ENV[&#8216;MYSQL_DATABASE_NAME&#8217;]; //MySQL Database Name<br />
[/php]</p>
<p><strong>.htaccess</strong><br />
Add these to your .htaccess file:</p>
<p>[php]</p>
<p># for enabling upload of bigger CSV files<br />
LimitRequestBody 104857600<br />
php_value max_execution_time 0<br />
php_value post_max_size 60M<br />
php_value upload_max_filesize 50M</p>
<p># to avoid session problems originally saved to /tmp.<br />
php_value session.save_path &#8216;/var/www/html/session&#8217;<br />
[/php]</p>
<p>Make sure that you are using environment variables on that file so we can inject them into your ElasticBeanstalk Environment.</p>
<h2>Set your database configuration as Environment Variables</h2>
<pre class="brush: plain; title: ; notranslate">
eb setenv MYSQL_DATABASE_HOST=&quot;XXXX&quot; MYSQL_DATABASE_USER=&quot;XXXX&quot; MYSQL_DATABASE_PASSWORD=&quot;XXXX&quot; MYSQL_DATABASE_NAME=&quot;XXX&quot; -e sendy-production
</pre>
<h2>Deploy it</h2>
<p>Commit your changes and then:</p>
<pre class="brush: plain; title: ; notranslate">eb deploy sendy-production</pre>
<p>Boom! Now make sure that you follow<a href="https://sendy.co/get-started" target="_blank" rel="noopener"> Sendy&#8217;s Guide Lines</a> in order to setup your app correctly.</p>
<p>Let me know if you have any questions on the comments section bellow. Maybe some detail is missing and I could add it to the post. Remember! Sharing is caring! ;-D</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2016/07/20/deploying-sendy-using-aws-elasticbeanstalk-and-docker/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">779</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png" medium="image">
			<media:title type="html">sendy-300x118</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/fb0d0-sendy-300x118-1.png?w=300&#038;h=118" medium="image">
			<media:title type="html">sendy-300x118</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/fefea-screen-shot-2016-07-20-at-19.png?w=300&#038;h=197" medium="image" />
	</item>
		<item>
		<title>Farewell Brasil&#8230; Hello Portugal!</title>
		<link>https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/</link>
					<comments>https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Thu, 26 May 2016 18:05:51 +0000</pubDate>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[golf]]></category>
		<category><![CDATA[hole19]]></category>
		<category><![CDATA[life]]></category>
		<category><![CDATA[work]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=721</guid>

					<description><![CDATA[Hi. My name is Igor Escobar and I&#8217;m a Software Engineer at Hole19 Golf. As many of you already know, I recently made a life changing decision of which I would love to talk about with you. Before going through the why&#8217;s, I need you to understand I little bit about me so you can<a class="more-link" href="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/">Continue reading <span class="screen-reader-text">"Farewell Brasil&#8230; Hello&#160;Portugal!"</span></a>]]></description>
										<content:encoded><![CDATA[<p>Hi. My name is Igor Escobar and I&#8217;m a Software Engineer at <a href="//www.hole19golf.com">Hole19 Golf</a>. As many of you already know, I recently made a life changing decision of which I would love to talk about with you.</p>
<div>
<p>Before going through the why&#8217;s, I need you to understand I little bit about me so you can follow my reasoning on why I did leave Brasil.</p>
</div>
<div>
<p>I started into programming when I was 13 years old. Loved it since the first time I laid eyes on&nbsp;those crazy computer instructions. Did all kinds of crazy computer programs you can imagine and I&#8217;ve learned that <em>magical things only happen way&nbsp;out of your comfort zone</em>.</p>
<p>This motto not only tells a lot&nbsp;about myself but also tells a lot about our&nbsp;mindset and the kind of challenges that we&nbsp;are able to pursue. I&#8217;ve always dreamed big, always pictured myself out there, living this dream of endless freaking awesome challenges.</p>
</div>
<div>
<p>A few months ago I stumbled on the opportunity of joining a Portugal based startup called&nbsp;<a href="http://www.hole19golf.com/company">Hole19 Golf</a>. I can tell you&nbsp;that it&nbsp;wasn&#8217;t an easy decision.</p>
</div>
<div>
<div>
<p>Some of you would call me crazy for leaving Brasil (some of you definitely wouldn&#8217;t), but not everyone has the <strong>courage needed</strong> to put your entire life upside down&#8230; leaving your family, selling everything you once possessed, job, home (~/) and my wife (also&nbsp;a dog) for endless 4 months.</p>
<p>When this kind of opportunity appears in your life you can&#8217;t think just about yourself. You need to think about your family, your future, is it worth it? Does Portugal have better safety conditions, education? Will my kids have a better life there? For many of you It may sound like &#8220;it&#8217;s just a job, not worth it!&#8221; but in my head it sounded completely different.</p>
<p>I saw an entire new world opening before my eyes. Portugal in 2016 held the <a href="http://www.numbeo.com/quality-of-life/rankings_by_country.jsp">13th position in terms of <strong>Quality of Life</strong></a> right after Finland and United States which holds the 12th position. Portugal has better qualify of life compared with amazing places like UK, Canada, Japan, France, Ireland, Italy and the list goes on! Where is Brasil on that list? 45th place&#8230; right next to India, Iran, Pakistan, Singapore etc.</p>
<p>As hard as it may be&#8230; For the sake of my future family of 3 kids and two dogs&#8230; I really believed that a huge shiny door was opening for me.</p>
<p>It&#8217;s been 5 months since I left Brasil and started a whole new life in&nbsp;Portugal as a Software Engineer at <a href="http://hole19golf.com">Hole19&nbsp;Golf</a>&nbsp;and I feel morally obligated to tell you about how my life&#8217;s going in Lisbon/Portugal&nbsp;and how it&#8217;s&nbsp;like to be working for Hole19.</p>
</div>
</div>
<div></div>
<h2>Life in Lisbon/Portugal</h2>
<p>Instead of going through all the aspects of living in Portugal I rather talk about a few things that most impressed&nbsp;me on a daily basis.</p>
<h3>Safety</h3>
<p>When I moved to Lisbon I discovered that I&#8217;m a guy who likes to walk around. Day and night.&nbsp;This is impossible in Brasil if you don&#8217;t live in&nbsp;a private condo with security cameras, high walls or&nbsp;electrified fences. Lisbon proved to be a very nice place to walk around and discover the city. It felt really safe and you can walk around anytime, day or night, and still&nbsp;get home safe with&nbsp;all pieces in place. Also, if you value&nbsp;living in a nice house close to the ocean or with green areas everywhere, Portugal fits you well and you don&#8217;t have to sell one of your kidneys for it or drive for a hundred hours to get to work.</p>
<h3>Beauty and people</h3>
<p>Lisbon&nbsp;is beautiful and it surprises me&nbsp;every time&nbsp;I go&nbsp;for a walk,&nbsp;day or night. The portuguese are known for being quite surly, but all I can say is that in Lisbon I was always well attended, so I didn&#8217;t feel any of that so called rudeness. Of course, you can relate that to the fact that Lisbon is a big city and full of tourists and that influences how portuguese treat visitors.</p>
<p>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-34-10/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="753" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-34-10/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457804050&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0004040404040404&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.71365&quot;,&quot;longitude&quot;:&quot;-9.1331555555556&quot;}" data-image-title="2016-03-12 17.34.10" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-20-14/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="751" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-20-14/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457803214&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00060716454159077&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.712780555556&quot;,&quot;longitude&quot;:&quot;-9.1343416666667&quot;}" data-image-title="2016-03-12 17.20.14" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-17-41-11/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="761" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-17-41-11/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460914871&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00032797638570023&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.7248&quot;,&quot;longitude&quot;:&quot;-9.1493944444444&quot;}" data-image-title="2016-04-17 17.41.11" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-10-23/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="750" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-10-23/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457802623&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0036363636363636&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.712344444444&quot;,&quot;longitude&quot;:&quot;-9.1327333333333&quot;}" data-image-title="2016-03-12 17.10.23" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-57-28/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="733" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-57-28/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460919448&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0012903225806452&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.711852777778&quot;,&quot;longitude&quot;:&quot;-9.1536666666667&quot;}" data-image-title="2016-04-17 18.57.28" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-26-17-43-00/'><img width="113" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg?w=113" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg?w=113 113w, https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg?w=226 226w" sizes="(max-width: 113px) 100vw, 113px" data-attachment-id="756" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-26-17-43-00/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg" data-orig-size="2448,3264" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1459014180&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;40&quot;,&quot;shutter_speed&quot;:&quot;0.01&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.697505555556&quot;,&quot;longitude&quot;:&quot;-9.2054138888889&quot;}" data-image-title="2016-03-26 17.43.00" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg?w=225" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-02-20-16-54-49/'><img width="150" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="746" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-02-20-16-54-49/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg" data-orig-size="2446,2446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1455987289&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00058105752469494&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.724816666667&quot;,&quot;longitude&quot;:&quot;-9.1350416666667&quot;}" data-image-title="" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-21-56/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="731" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-21-56/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460917316&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00035398230088496&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.722522222222&quot;,&quot;longitude&quot;:&quot;-9.1577083333333&quot;}" data-image-title="2016-04-17 18.21.56" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-02-20-17-07-46/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="747" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-02-20-17-07-46/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1455988066&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00058105752469494&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.716305555556&quot;,&quot;longitude&quot;:&quot;-9.1360055555556&quot;}" data-image-title="2016-02-20 17.07.46" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-24-18-09-46-1/'><img width="150" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="745" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-24-18-09-46-1/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg" data-orig-size="2446,2446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1453658986&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;400&quot;,&quot;shutter_speed&quot;:&quot;0.058823529411765&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.697441666667&quot;,&quot;longitude&quot;:&quot;-9.2058444444444&quot;}" data-image-title="2016-01-24 18.09.46-1" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-14-30-11/'><img width="150" height="46" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="735" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-14-30-11/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg" data-orig-size="10254,3128" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1463927411&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00035398230088496&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.703636111111&quot;,&quot;longitude&quot;:&quot;-9.4059777777778&quot;}" data-image-title="2016-05-22 14.30.11" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-15-14-14-55-1/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="741" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-15-14-14-55-1/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1452867295&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00017699115044248&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.707352777778&quot;,&quot;longitude&quot;:&quot;-9.1365111111111&quot;}" data-image-title="2016-01-15 14.14.55-1" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-26-18-21-13/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="757" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-26-18-21-13/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1459016473&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.03030303030303&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.697686111111&quot;,&quot;longitude&quot;:&quot;-9.2027666666667&quot;}" data-image-title="2016-03-26 18.21.13" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-16-16-51-30/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="742" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-16-16-51-30/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1452963090&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00060716454159077&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.707477777778&quot;,&quot;longitude&quot;:&quot;-9.1332166666667&quot;}" data-image-title="2016-01-16 16.51.30" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-24-17-21-00/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="744" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-24-17-21-00/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1453656060&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0020746887966805&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.693430555556&quot;,&quot;longitude&quot;:&quot;-9.2060944444444&quot;}" data-image-title="2016-01-24 17.21.00" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-39-34/'><img width="113" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg?w=113" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg?w=113 113w, https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg?w=226 226w" sizes="(max-width: 113px) 100vw, 113px" data-attachment-id="755" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-39-34/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg" data-orig-size="2448,3264" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457804374&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0016447368421053&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.714286111111&quot;,&quot;longitude&quot;:&quot;-9.1338361111111&quot;}" data-image-title="2016-03-12 17.39.34" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg?w=225" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-10-17-01-24/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="730" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-10-17-01-24/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460307684&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00058105752469494&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.717219444444&quot;,&quot;longitude&quot;:&quot;-9.1498472222222&quot;}" data-image-title="2016-04-10 17.01.24" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-14-16-51-29/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="765" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-14-16-51-29/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1463244689&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00065703022339028&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.737938888889&quot;,&quot;longitude&quot;:&quot;-9.1543527777778&quot;}" data-image-title="2016-05-14 16.51.29" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-15-10-22-1/'><img width="150" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="736" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-15-10-22-1/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg" data-orig-size="2446,2446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1463929822&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00060716454159077&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.696338888889&quot;,&quot;longitude&quot;:&quot;-9.4201833333333&quot;}" data-image-title="2016-05-22 15.10.22-1" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-10-18-04-57-2/'><img width="150" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="759" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-10-18-04-57-2/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg" data-orig-size="2448,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460311497&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0011135857461024&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.719569444444&quot;,&quot;longitude&quot;:&quot;-9.1452416666667&quot;}" data-image-title="2016-04-10 18.04.57-2" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-27-13-04-16/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="758" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-27-13-04-16/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1459083856&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00037893141341417&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.762883333333&quot;,&quot;longitude&quot;:&quot;-9.0949805555556&quot;}" data-image-title="2016-03-27 13.04.16" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-35-18/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="754" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-35-18/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457804118&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00027800945232138&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.713663888889&quot;,&quot;longitude&quot;:&quot;-9.1332166666667&quot;}" data-image-title="2016-03-12 17.35.18" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-02-28-17-02-12/'><img width="150" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="748" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-02-28-17-02-12/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg" data-orig-size="2446,2446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1456678932&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00032797638570023&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.713047222222&quot;,&quot;longitude&quot;:&quot;-9.1389916666667&quot;}" data-image-title="2016-02-28 17.02.12" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-42-23/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="732" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-42-23/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460918543&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0022522522522523&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.715011111111&quot;,&quot;longitude&quot;:&quot;-9.1586388888889&quot;}" data-image-title="2016-04-17 18.42.23" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-46-35/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="764" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-46-35/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460918795&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0015432098765432&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.714175&quot;,&quot;longitude&quot;:&quot;-9.1601777777778&quot;}" data-image-title="Responsive Images" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-32-08/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="752" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-32-08/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457803928&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0013157894736842&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.713963888889&quot;,&quot;longitude&quot;:&quot;-9.1331555555556&quot;}" data-image-title="2016-03-12 17.32.08" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-24-34/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="762" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-24-34/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460917474&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0022271714922049&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.72215&quot;,&quot;longitude&quot;:&quot;-9.1567805555556&quot;}" data-image-title="2016-04-17 18.24.34" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-29-43/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="763" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-17-18-29-43/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460917783&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00045495905368517&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.7203&quot;,&quot;longitude&quot;:&quot;-9.1544666666667&quot;}" data-image-title="2016-04-17 18.29.43" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-02-31/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="749" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-03-12-17-02-31/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1457802151&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00032797638570023&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.70985&quot;,&quot;longitude&quot;:&quot;-9.1333166666667&quot;}" data-image-title="2016-03-12 17.02.31" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-16-18-56-12/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="760" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-04-16-18-56-12/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1460832972&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.0021978021978022&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.736419444444&quot;,&quot;longitude&quot;:&quot;-9.1537638888889&quot;}" data-image-title="2016-04-16 18.56.12" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-23-23-06-40-1/'><img width="150" height="150" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="743" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-23-23-06-40-1/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg" data-orig-size="2446,2446" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1453590400&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;1600&quot;,&quot;shutter_speed&quot;:&quot;0.058823529411765&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.7305&quot;,&quot;longitude&quot;:&quot;-9.1548472222222&quot;}" data-image-title="2016-01-23 23.06.40-1" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg?w=750" /></a>
<a href='https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-17-00-08/'><img width="150" height="113" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg?w=150" class="attachment-thumbnail size-thumbnail" alt="" decoding="async" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg?w=150 150w, https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg?w=300 300w" sizes="(max-width: 150px) 100vw, 150px" data-attachment-id="766" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-05-22-17-00-08/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg" data-orig-size="3264,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;iPhone 6&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1463936408&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;32&quot;,&quot;shutter_speed&quot;:&quot;0.00045495905368517&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.691841666667&quot;,&quot;longitude&quot;:&quot;-9.4210194444444&quot;}" data-image-title="2016-05-22 17.00.08" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg?w=750" /></a>
</p>
<p>Pictures above were all taken by me. Most of those places you can visit by just walking around. These are just a few places that I&#8217;ve been for this very short period living here. It&#8217;s amazing(!).</p>
<h3>food</h3>
<p>If you think you&#8217;re coming to Lisbon and you&#8217;re not putting on&nbsp;some extra pounds, you&#8217;re wrong. The variety of restaurants here is impressive. And to make it better you eat very well and pay fair prices for it. I guarantee that eating well won&#8217;t be an issue for you. This made things easier for me, considering that brazilian food is really good and that my first four months I was living by myself.</p>
<h3>weather</h3>
<p>For me, this is a huge positive point. Lisbon is cold in the winter but not FREAKING ICE AGE like in other countries and it&#8217;s very nice in the&nbsp;summer. The only thing you need to be aware is the pacific freaking cold ocean incluencing the Tejo River.</p>
<h3>Public Transportation</h3>
<p>In my opinion it works perfectly. We got buses, trams, funiculars, subway, trains and boats.&nbsp;I could go anywhere I wanted&nbsp;using them for very affordable rates.</p>
<p>And these&nbsp;were the aspects that&nbsp;impacted me the most in this time frame.</p>
<h3></h3>
<h2>Life and Work&nbsp;at&nbsp;Hole19</h2>
<p>Since the first moment I decided to join <a href="http://hole19golf.com">Hole19</a> they started to be like a family to me. They took care of every aspect of my moving to Portugal like documentation, plain tickets, costs, temporary place to stay,&nbsp;everything! They even picked me up at the airport, by the way.</p>
<p>And it&#8217;s been like a family ever since. We work and we work hard to connect the world of golf! Together&nbsp;we were able to accomplish amazing things! Even more that I could ever imagine. Our team is incredibly passionate and talented. We are so focused on our mission that you can&#8217;t even think about&nbsp;doing poor&nbsp;work &#8211; its like everybody is watching and this is amazing!</p>
<p><img loading="lazy" data-attachment-id="769" data-permalink="https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/2016-01-28-16-41-47/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/69dc9-2016-01-28-16.41.47.jpg" data-orig-size="2448,2448" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;2.2&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;4.15&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.03030303030303&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;,&quot;latitude&quot;:&quot;38.712002777778&quot;,&quot;longitude&quot;:&quot;-9.1364916666667&quot;}" data-image-title="2016-01-28 16.41.47" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/69dc9-2016-01-28-16.41.47.jpg?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/69dc9-2016-01-28-16.41.47.jpg?w=750" class="alignleft size-medium wp-image-769" src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2016/05/2016-01-28-16.41.47-300x300.jpg" alt="2016-01-28 16.41.47" width="300" height="300"></p>
<p>It really feels like we are all part of a huge mission (it really has been). If you <strong>don&#8217;t</strong> like to work on a world class product&nbsp;used by <strong>1M people</strong>, across <strong>154 countries</strong> and <strong>14 languages</strong>, to create highly performant applications, solve scale issues, work on recommendation/search algorithms, social connections with Graph databases, to process several thousands of requests per second, to deal with payments, (No)SQL/in memory databases, streaming data processing/transformation/aggregation, distributed architectures, math problems, to create technology for mobile/wearable devices, to use the right&nbsp;programming language to solve the problem, to use containers, continuous integration and deployment and to create APIs&#8230; this is definitely <strong>NOT</strong> the place for you.</p>
<p>It has been an exciting&nbsp;ride for me. I&#8217;ve always been a guy that thinks&nbsp;that with the <strong>right people</strong>, <strong>hard work</strong> and a <strong>huge load of passion</strong> you can accomplish&nbsp;anything. So&nbsp;I think we&#8217;re on the right track.</p>
<p>This post is also available on <a href="https://medium.com/@Hole19/farewell-brasil-hello-portugal-d19f7a4d4152#.fmrsppheb" target="_blank" rel="noopener noreferrer">Medium</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2016/05/26/farewell-brasil-hello-portugal/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">721</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg" medium="image">
			<media:title type="html">2016-01-24 17.21.00</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a0b7-2016-05-22-15.10.22-1.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/d7371-2016-04-17-18.29.43.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/d561d-2016-02-20-16.54.49.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/2f2f9-2016-05-14-16.51.29.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/087a0-2016-04-17-18.57.28.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/eab29-2016-04-17-18.24.34.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/eb659-2016-03-27-13.04.16.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/07bc5-2016-03-12-17.32.08.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/4fa85-2016-04-17-17.41.11.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/2ae45-2016-02-28-17.02.12.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/68f85-2016-04-17-18.21.56-e1464274748155.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/41466-2016-01-15-14.14.55-1.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/bf25f-2016-01-16-16.51.30.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/92641-2016-05-22-14.30.11.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/8aee4-2016-03-26-17.43.00.jpg?w=113" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/2519b-2016-03-12-17.20.14.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/89734-2016-02-20-17.07.46.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/73748-2016-01-23-23.06.40-1.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/dd544-2016-03-26-18.21.13.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/02df9-2016-03-12-17.34.10.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/2af99-2016-03-12-17.02.31.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/a4245-2016-03-12-17.10.23.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/5d965-2016-03-12-17.39.34.jpg?w=113" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/798b3-2016-03-12-17.35.18.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ccefe-2016-04-17-18.42.23.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/840ad-2016-04-10-17.01.24.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/5a11e-2016-04-17-18.46.35.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/8dd3d-2016-04-10-18.04.57-2.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/ce3ac-2016-01-24-17.21.00.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/fab3a-2016-05-22-17.00.08.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/3b591-2016-01-24-18.09.46-1.jpg?w=150" medium="image" />

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/4f8cf-2016-04-16-18.56.12.jpg?w=150" medium="image" />

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2016/05/2016-01-28-16.41.47-300x300.jpg" medium="image">
			<media:title type="html">2016-01-28 16.41.47</media:title>
		</media:content>
	</item>
		<item>
		<title>Working with Asterisk and Node.js</title>
		<link>https://blog.igorescobar.com/2014/08/13/working-with-asterisk-and-node-js/</link>
					<comments>https://blog.igorescobar.com/2014/08/13/working-with-asterisk-and-node-js/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Wed, 13 Aug 2014 18:07:19 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Node.js]]></category>
		<category><![CDATA[ami]]></category>
		<category><![CDATA[asterisk]]></category>
		<category><![CDATA[asterisk-manager]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[voip]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=686</guid>

					<description><![CDATA[I&#8217;ve been working on a very cool project project here at Vale Presente which was able to provide a smooth interface to our call center attendees increasing their productivity and quality of our costumer service. The project was built with HTML5, CSS3, Javascript and Node.js as our backend engine (only cool stuff!). But the main challenge was finding the right<a class="more-link" href="https://blog.igorescobar.com/2014/08/13/working-with-asterisk-and-node-js/">Continue reading <span class="screen-reader-text">"Working with Asterisk and&#160;Node.js"</span></a>]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" data-attachment-id="687" data-permalink="https://blog.igorescobar.com/2014/08/13/working-with-asterisk-and-node-js/screen-shot-2014-08-13-at-2-21-49-pm/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3da99-screen-shot-2014-08-13-at-2.21.49-pm.png" data-orig-size="273,144" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2014-08-13 at 2.21.49 PM" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3da99-screen-shot-2014-08-13-at-2.21.49-pm.png?w=273" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/3da99-screen-shot-2014-08-13-at-2.21.49-pm.png?w=273" class="wp-image-687" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/3da99-screen-shot-2014-08-13-at-2.21.49-pm.png" alt="Screen Shot 2014-08-13 at 2.21.49 PM" width="188" height="103" /> <img loading="lazy" data-attachment-id="688" data-permalink="https://blog.igorescobar.com/2014/08/13/working-with-asterisk-and-node-js/screen-shot-2014-08-13-at-2-22-23-pm/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png" data-orig-size="255,100" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Screen Shot 2014-08-13 at 2.22.23 PM" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png?w=255" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png?w=255" class="wp-image-688" src="https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png" alt="Screen Shot 2014-08-13 at 2.22.23 PM" width="255" height="100" srcset="https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png 255w, https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png?w=150&amp;h=59 150w" sizes="(max-width: 255px) 100vw, 255px" /></p>
<p>I&#8217;ve been working on a very cool project project here at <a href="http://www.valepresente.com.br/" target="_blank" rel="noopener">Vale Presente</a> which was able to provide a smooth interface to our call center attendees increasing their productivity and quality of our costumer service. The project was built with <a href="http://en.wikipedia.org/wiki/HTML5" target="_blank" rel="noopener">HTML5</a>, <a href="http://en.wikipedia.org/wiki/Cascading_Style_Sheets#CSS_3" target="_blank" rel="noopener">CSS3</a>, <a href="http://en.wikipedia.org/wiki/JavaScript" target="_blank" rel="noopener">Javascript</a> and <a href="http://nodejs.org/" target="_blank" rel="noopener">Node.js</a> as our backend engine (only cool stuff!). But the main challenge was finding the right tool to get the job done in a fast and consistent manner. I&#8217;m not going to talk about how I built the client. My focus here is talk about the tool I used to create a fast and consistent connection between the attendees and <a href="http://www.asterisk.org/" target="_blank" rel="noopener">Asterisk</a>. That was tough. There are a lot of libraries available over the Internet but most of them aren&#8217;t production ready.</p>
<h2>Production ready</h2>
<p>During my quest I had the pleasure to meet <a href="https://www.npmjs.org/package/asterisk-manager" target="_blank" rel="noopener">asterisk-manager</a>. A <strong>Asterisk Manager Interface</strong> created by <a href="https://www.npmjs.org/~pipobscure" target="_blank" rel="noopener">Philipp Dunkel</a> which is a <strong>node.js</strong> module for interacting with the<strong> Asterisk Manager API</strong>. Nowdays I&#8217;m helping him as a maintainer of the project, improving, fixing bugs and helping to increase the project&#8217;s visibility. Not just because I&#8217;m a maintainer but because it works!</p>
<p>Currently the <a href="https://www.npmjs.org/package/asterisk-manager" target="_blank" rel="noopener">asterisk-manager</a> module/package for <strong>node.js</strong> is handling incredibly well more than 500,000 asterisk events and ~5,000 voice calls a day. All of those events are being transmitted to our clients through <a href="http://socket.io/">Socket.io</a>. This is a production ready and tested solution.</p>
<h2>How to use it</h2>
<p>Pretty simple. First you have to install it directly:</p>
<p>[javascript]<br />
npm install asterisk-manager<br />
[/javascript]</p>
<p>Or put it inside of your package.json:</p>
<p>[javascript]<br />
{<br />
 &quot;dependencies&quot;: {<br />
    &quot;asterisk-manager&quot;: &quot;0.1.x&quot;<br />
  }<br />
}<br />
[/javascript]</p>
<p>Now you have to create a connection instance with your asterisk server:</p>
<p>[javascript]<br />
var AsteriskManager = require(&#8216;asterisk-manager&#8217;)<br />
  , ami = new AsteriskManager(config.asterisk.port, config.asterisk.host, config.asterisk.user, config.asterisk.password, true)<br />
  ;<br />
[/javascript]</p>
<p>And that&#8217;s it! It works! Now you have to take a closer look inside of the available events and actions and have fun!</p>
<h3>Events</h3>
<p>The list of all available events which is supported by Asterisk Manager API can be found here: <a href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+AMI+Events" rel="nofollow">https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+AMI+Events</a> <strong>How do I listen for any/all AMI events?</strong></p>
<p>[javascript]<br />
ami.on(&#8216;managerevent&#8217;, function(evt) {});<br />
[/javascript]</p>
<p><strong>How do I listen for specific AMI events?</strong></p>
<p>[javascript]<br />
ami.on(&#8216;hangup&#8217;, function(evt) {});<br />
ami.on(&#8216;confbridgejoin&#8217;, function(evt) {});<br />
[/javascript]</p>
<p><strong>What if my connection dropped?</strong> You can listen to the connection events like:</p>
<p>[javascript]<br />
ami.on(&#8216;close&#8217;, function(e) {});<br />
ami.on(&#8216;disconnect&#8217;, function(e) {});<br />
ami.on(&#8216;connect&#8217;, function(e) {});<br />
[/javascript]</p>
<p>And make your own decision on what do to next.</p>
<h3>Actions</h3>
<p>The list of all available actions supported by Asterisk Manager API can be found here: <a href="https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+AMI+Actions" rel="nofollow">https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+AMI+Actions</a> <strong>How do I call an action?</strong></p>
<p>[javascript]<br />
ami.action({<br />
  &#8216;action&#8217;:&#8217;originate&#8217;,<br />
  &#8216;channel&#8217;: &quot;SIP/1234&quot;,<br />
  &#8216;exten&#8217;: &#8216;1143224321&#8217;,<br />
  &#8216;context&#8217;: &#8216;from-internal&#8217;,<br />
  &#8216;priority&#8217;: &#8216;1&#8217;<br />
}, function(err, res) {});<br />
[/javascript]</p>
<p>And that&#8217;s it! Have fun!</p>
<p><strong>Github</strong>: https://github.com/pipobscure/NodeJS-AsteriskManager <strong>NPM Repository</strong>: https://www.npmjs.org/package/asterisk-manager <strong>Bug Reports</strong>: https://github.com/pipobscure/NodeJS-AsteriskManager/issues</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2014/08/13/working-with-asterisk-and-node-js/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">686</post-id>
		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/3da99-screen-shot-2014-08-13-at-2.21.49-pm.png" medium="image">
			<media:title type="html">Screen Shot 2014-08-13 at 2.21.49 PM</media:title>
		</media:content>

		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/a9aec-screen-shot-2014-08-13-at-2.22.23-pm.png" medium="image">
			<media:title type="html">Screen Shot 2014-08-13 at 2.22.23 PM</media:title>
		</media:content>
	</item>
		<item>
		<title>Using jQuery Mask Plugin with Zepto.js</title>
		<link>https://blog.igorescobar.com/2013/04/30/using-jquery-mask-plugin-with-zepto-js/</link>
					<comments>https://blog.igorescobar.com/2013/04/30/using-jquery-mask-plugin-with-zepto-js/#comments</comments>
		
		<dc:creator><![CDATA[igorescobar]]></dc:creator>
		<pubDate>Tue, 30 Apr 2013 21:06:43 +0000</pubDate>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquery mask plugin]]></category>
		<category><![CDATA[zeptojs]]></category>
		<guid isPermaLink="false">http://www.igorescobar.com/blog/?p=637</guid>

					<description><![CDATA[Today I&#8217;m going to exemplify a pretty easy way to put jQuery Mask Plugin to run with Zepto.js instead of jQuery. What is Zepto.js Basically, you can switch from jQuery to Zepto.js if it&#8217;s too heavy or if it&#8217;s too much for your current needs. If you need something more lightweight that allows you to keep your<a class="more-link" href="https://blog.igorescobar.com/2013/04/30/using-jquery-mask-plugin-with-zepto-js/">Continue reading <span class="screen-reader-text">"Using jQuery Mask Plugin with&#160;Zepto.js"</span></a>]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" data-attachment-id="638" data-permalink="https://blog.igorescobar.com/2013/04/30/using-jquery-mask-plugin-with-zepto-js/zepto-js-logo/" data-orig-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d958c-zepto.js-logo.png" data-orig-size="712,186" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="Running jQuery Mask Plugin with Zepto.js" data-image-description="" data-image-caption="" data-medium-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d958c-zepto.js-logo.png?w=300" data-large-file="https://blog.igorescobar.com/wp-content/uploads/2021/08/d958c-zepto.js-logo.png?w=712" class="alignleft size-medium wp-image-638" src="https://i0.wp.com/www.igorescobar.com/blog/wp-content/uploads/2013/04/zepto.js-logo-300x78.png" alt="Running jQuery Mask Plugin with Zepto.js" width="300" height="78" />Today I&#8217;m going to exemplify a pretty easy way to put jQuery Mask Plugin to run with <a href="http://zeptojs.com" target="_blank" rel="noopener noreferrer">Zepto.js</a> instead of <a href="http://jquery.com/" target="_blank" rel="noopener noreferrer">jQuery</a>.</p>
<h2>What is Zepto.js</h2>
<p>Basically, you can switch from <a href="http://jquery.com/" target="_blank" rel="noopener noreferrer">jQuery</a> to <a href="http://zeptojs.com" target="_blank" rel="noopener noreferrer">Zepto.js</a> if it&#8217;s too heavy or if it&#8217;s too much for your current needs. If you need something more <em>lightweight</em> that allows you to keep your code compatible with your old jQuery&#8217;s code, <strong>Zepto.js</strong> is a match for you.</p>
<blockquote><p><b>Zepto</b> is a minimalist <b>JavaScript library for modern browsers</b> with a largely <b>jQuery-compatible API</b>. <em>If you use jQuery, you already know how to use Zepto. While 100% jQuery coverage is not a design goal, the <b>APIs provided match their jQuery counterparts</b>. The goal is to have a ~5-10k modular library that <b>downloads and executes fast</b> with a <b>familiar and versatile API</b>, so you can <b>concentrate on getting stuff done</b>.</em><br />
&#8211; <a title="Zepto.js" href="http://zeptojs.com/" target="_blank" rel="noopener noreferrer">Zepto.js Official Web Site</a></p></blockquote>
<p>(\___/)<br />( ͡ ͡° ͜ ʖ ͡ ͡°)<br />\╭☞ \╭☞ Follow me on <a href="https://twitter.com/igorescobar" target="_blank" rel="noreferrer noopener">Twitter</a>!</p>
<h2>How to</h2>
<p>Recently, <a title="Igor Lima's GitHub" href="https://github.com/igorlima" target="_blank" rel="noopener noreferrer">Igor Lima</a> made <a title="adding Zepto.js compatibility to jQuery Mask Plugin " href="https://github.com/igorescobar/jQuery-Mask-Plugin/pull/20/files" target="_blank" rel="noopener noreferrer">a pretty cool contribution to jQuery Mask Plugin</a> making a few tweaks on <strong>jQuery Mask Plugin&#8217;s</strong> code to make it run smoothly with <strong>Zepto.js</strong>, making things even easier for you.</p>
<p>Since <a title="jQuery Mask Plugin's version v0.9.0" href="https://github.com/igorescobar/jQuery-Mask-Plugin/tree/v0.9.0" target="_blank" rel="noopener noreferrer">version 0.9.0</a> all you have to do is:</p>
<h3>1 &#8211; Load zepto.js between your head TAG (or where ever you want to put it if you know what you&#8217;re doing):</h3>
<pre><pre class="brush: plain; title: ; notranslate">
&amp;amp;lt;script type="text/javascript" src="http://zeptojs.com/zepto.min.js"&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;
</pre>
<h3>Load the Zepto.js data plugin right after Zepto.js:</h3>
<pre><pre class="brush: plain; title: ; notranslate">
&amp;amp;lt;script type="text/javascript" src="https://raw.github.com/madrobby/zepto/master/src/data.js"&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;
</pre>
<p><em>Zepto&#8217;s basic implementation of <code>data()</code> only stores strings. To store arbitrary objects the optional <a href="https://github.com/madrobby/zepto/blob/master/src/data.js" target="_blank" rel="noopener noreferrer">&#8220;data&#8221; module</a> from custom build of Zepto <em>was included</em>.</em></p>
<h3>And then load jQuery Mask Plugin:</h3>
<pre><pre class="brush: plain; title: ; notranslate">
&amp;amp;lt;script type="text/javascript" src="https://raw.github.com/igorescobar/jQuery-Mask-Plugin/master/dist/jquery.mask.min.js"&amp;amp;gt;&amp;amp;lt;/script&amp;amp;gt;
</pre>
<p>All you need to do now is take a look into <a title="jQuery Mask Plugin's Documentation" href="http://igorescobar.github.io/jQuery-Mask-Plugin/" target="_blank" rel="noopener noreferrer">jQuery Mask Plugin Documentation</a> to learn a little about <em>jQuery Mask Plugin&#8217;s API</em> and you&#8217;re ready to go!</p>
<h3>Did it help you? Support jQuery Mask Plugin!</h3>
<p><a href="http://igorescobar.github.io/jQuery-Mask-Plugin/" rel="nofollow">http://igorescobar.github.io/jQuery-Mask-Plugin/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.igorescobar.com/2013/04/30/using-jquery-mask-plugin-with-zepto-js/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">637</post-id>
		<media:thumbnail url="https://blog.igorescobar.com/wp-content/uploads/2021/08/d958c-zepto.js-logo.png" />
		<media:content url="https://blog.igorescobar.com/wp-content/uploads/2021/08/d958c-zepto.js-logo.png" medium="image">
			<media:title type="html">Running jQuery Mask Plugin with Zepto.js</media:title>
		</media:content>

		<media:content url="https://2.gravatar.com/avatar/ed7c036c1b316f6dc327459a4df8f1b25b76c01bc2f7bd8010ef4f3282ac1a01?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">igorescobar</media:title>
		</media:content>

		<media:content url="http://www.igorescobar.com/blog/wp-content/uploads/2013/04/zepto.js-logo-300x78.png" medium="image">
			<media:title type="html">Running jQuery Mask Plugin with Zepto.js</media:title>
		</media:content>
	</item>
	</channel>
</rss>
