<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
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/">
	<channel>
		<title>Author at Infinum</title>
		<atom:link href="https://infinum.com/blog/author/stjepan-hadjic/feed/" rel="self" type="application/rss+xml" />
		<link></link>
		<description>Building digital products</description>
		<lastBuildDate>Wed, 29 Apr 2026 14:21:05 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>19095https://infinum.com/uploads/2022/02/backend-development-job-0.webp</url>
				</image>
				<title>Being a Backend Developer Is a Thankless Job</title>
				<link>https://infinum.com/blog/backend-development-job/</link>
				<pubDate>Sat, 05 Feb 2022 12:50:00 +0000</pubDate>
				<dc:creator>Stjepan Hadjić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/blog/backend-development-job/</guid>
				<description>
					<![CDATA[<p>Backend development is challenging, underappreciated, and an awesome job.</p>
<p>The post <a href="https://infinum.com/blog/backend-development-job/">Being a Backend Developer Is a Thankless Job</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-199"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	Have you ever noticed how there are no awards for <a href="https://infinum.com/backend-development-service/">backend development</a>? Sure, there are “web” awards, but they mostly focus on design and the visual aspects (e.g. <a href="https://www.awwwards.com/">Awwwards</a>, the <a href="https://www.webbyawards.com/">Webby Awards</a>). Mobile has many awards such as the <a href="https://www.mobileindustryawards.com/">Mobile Industry Awards</a>, even HR receives awards (the <a href="https://awards.humanresourcesonline.net/hr-excellence-awards-id/">HR Excellence Awards</a>).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	No awards for backend, though. It’s as if the world thinks that what we do is easy and we don’t need any special knowledge or skills to write <a href="https://infinum.com/enterprise-platforms/">backend applications</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	It is a job that nobody notices when it’s done right, but when it’s not, everything crumbles. Sort of like the Night Watch in Game of Thrones. If you are interested in pursuing this not very glamorous, but badass role, read on to find out what it entails.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-102">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-103'
	>
	Programming language</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	There are a multitude of programming languages available for backend development. Most of them have more than one framework for building a <a href="https://infinum.com/mobile-web-apps/">web application</a>. From Ruby’s Ruby on Rails and Python’s Django to C#’s ASP.NET and Java’s Spring, the list goes on and on. Sorry if I didn’t mention your favorite framework, this of course barely scratches the surface.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-108">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-109'
	>
	If you’re only starting out, it’s best to choose a programming language you are most familiar with because all frameworks work in a similar fashion, some with more and some with less magic in them. However, they all have one thing in common – they have to work within the confines of the web’s request/response infrastructure.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-111">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-112'
	>
	Database</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-114">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-115'
	>
	The state of your application will need to be stored for long-term storage and retrieval. For that, you will need some kind of a database. You can use a relational database like <a href="https://www.mysql.com/">MySql</a> or <a href="https://www.postgresql.org/">Postgresql</a> or a NOSQL like <a href="https://www.mongodb.com/">MongoDB</a> or <a href="https://redis.io/">Redis</a>, depending on the application’s needs.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-117">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-118'
	>
	In my experience, we opt for a relational database 90 percent of the time because we end up needing the relational connections.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-120">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-121'
	>
	It’s possible to use other types of databases, too, such as the Graph database or the database for event sourcing.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-125"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-123">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-124'
	>
	Architecture</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-128"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-126">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-127'
	>
	With the basic tools for building a web application covered, you need to figure out what kind of architecture you are going to use. The two currently prevailing architectures are <a href="https://en.wikipedia.org/wiki/Monolithic_application">Monolithic</a> and <a href="https://en.wikipedia.org/wiki/Microservices">Microservices</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-131"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-129">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-130'
	>
	In a monolithic architecture, all the application’s functionality is coded in one big repository. Whenever you make a change you can potentially bring down the whole application, but the changes themselves are easier to make.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-134"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-132">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-133'
	>
	On the other hand, a microservices application is broken down into multiple smaller services that (should) work independently of one another. Changes in one service won’t affect other services, but keeping them all in sync becomes a problem once they start to stack up.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-137"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-135">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-136'
	>
	Response schema</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-140"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-138">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-139'
	>
	At some point, your application will need to respond to requests coming from the world wide web. You need to decide how it will respond, with an outdated <a href="https://en.wikipedia.org/wiki/XML">XML</a> or a <a href="https://www.json.org/json-en.html">JSON</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-143"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-141">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-142'
	>
	When you use JSON for your response schema, you will need to structure it so that all the responses follow the same structure. Whether you choose <a href="https://graphql.org/">GraphQL</a>, <a href="https://jsonapi.org/">JSON:API spec</a> or another schema, is completely up to you. There is no correct answer here as long as you respond with JSON. It might be smart to learn what a <a href="https://json-schema.org/">json schema</a> is, too.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-146"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-144">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-145'
	>
	Deploy</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-147">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-148'
	>
	Since you want your application to be accessible to the whole Internet, you need to deploy it somewhere. There are plenty of options, from buying your own <a href="https://en.wikipedia.org/wiki/Barebone_computer">barebone machine</a> you can customize and take care of, through paid services like <a href="https://aws.amazon.com/">AWS</a> or <a href="https://www.digitalocean.com/">Digital Ocean</a>, which maintain the hardware for you, to SaaS services like <a href="https://www.heroku.com/">Heroku</a> where you can deploy an application in one command line.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-152"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-150">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-151'
	>
	I should probably note that you will also need to learn about <a href="https://kubernetes.io/">Kubernetes</a> and <a href="https://www.docker.com/">Docker</a> if you want your application to scale well. However, we’ll leave these for now as they’re a topic for a separate blog post.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-155"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-153">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-154'
	>
	Admin Dashboard</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-158"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-156">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-157'
	>
	An admin dashboard is a good way for you to create and edit your content. To build one, though, you will need to learn some frontend languages – HTML, CSS and some Javascript. Fortunately, there are complete frameworks like <a href="https://getbootstrap.com/">Bootstrap</a> that will help you build the pages, but you still need to understand how they work in harmony.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-161"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-159">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-160'
	>
	Background jobs</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-164"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-162">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-163'
	>
	At one point, some of the requests will just take too long and users will start complaining. For example, those where you resize uploaded images or export a portion of your data. These types of requests can be migrated to background jobs so that they exit early. Users don’t have to wait for a response and the application responds asynchronously.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-167"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-165">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-166'
	>
	You will need to learn about <a href="https://www.rabbitmq.com/">queues</a> and <a href="https://aws.amazon.com/lambda/">lambdas</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-168">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-169'
	>
	Emails should also be sent in the background, but designing them is a whole other <a href="https://www.caniemail.com/">beast to master</a>. I recommend just going with the simplest design you can think of.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-171">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-172'
	>
	Observability</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-176"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-174">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-175'
	>
	You want your application to be available all the time. To achieve this, you need to learn about metrics and how to read graphs to figure out which part of your application is slow. Reading application logs is a science in itself, but yet another one you need to tackle. You will also need to learn how to set up alerts when your application goes offline so you can quickly restart it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-179"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-177">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-178'
	>
	More difficulties?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-182"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-180">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-181'
	>
	The challenges you’ll face on your backend journey don’t end here. You might find yourself working with third party API’s. I can’t begin to explain my frustration with those. Responding with XML, responding with the wrong HTTP status codes, or just plain not working as the documentation states, it’s just always bad.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-183">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-184'
	>
	Next, there is this pressure of <a href="https://www.itilnews.com/index.php?pagename=ITIL_Availability_Percentage_and_what_the_percentages_actually_mean_in_reality">achieving 99.999% availability</a>, which is nearly impossible in practice.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-186">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-187'
	>
	Holy s%!&amp;, is there an upside?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-189">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-190'
	>
	It’s difficult to build a backend “portfolio” because backend is not “showy” or “pretty”. Backend applications don’t win awards. Still, I wouldn’t give up backend development for anything.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-192">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-193'
	>
	First, it’s so much easier to test backend applications than Javascript or mobile apps. Next, you absolutely don’t care or have to worry about what browser the end user is using, and finally, you don’t need to know the latest and “best ever” javascript framework that seems to come out every three months. You also don’t need to make fun of Javascript, that’s purely optional.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-195">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-196'
	>
	<a href="https://infinum.com/backend-development-service/">Backend is the backbone of the web</a>. The sword in the darkness. Give your backend developer friend a high five when you see them.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/backend-development-job/">Being a Backend Developer Is a Thankless Job</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>7942https://infinum.com/uploads/2017/02/hiding-secrets-in-vault-0.webp</url>
				</image>
				<title>Hiding Secrets in a Vault</title>
				<link>https://infinum.com/blog/hiding-secrets-in-vault/</link>
				<pubDate>Tue, 19 Jul 2016 19:35:00 +0000</pubDate>
				<dc:creator>Stjepan Hadjić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/hiding-secrets-in-vault/</guid>
				<description>
					<![CDATA[<p>Every application needs configuration data like database passwords, AWS access keys, and social app IDs before it can run.</p>
<p>The post <a href="https://infinum.com/blog/hiding-secrets-in-vault/">Hiding Secrets in a Vault</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-321"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-200">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-201">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-202'
	>
	Every application needs configuration data like database passwords, AWS access keys, and social app IDs before it can run.<br>What’s the easiest way to do it? Hardcode those values, push them to Git and everyone who has a copy of the source code can run the application. The only problem is, you don’t want the whole world to know your usernames and passwords.<br>They need to be kept <strong>secret</strong>. They need to be kept <strong>safe</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-206"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-204">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-205'
	>
	Point III. of the <a href="http://12factor.net/config">12-factor</a> methodology calls for a <strong>strict separation of configuration from code</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-207">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-208'
	>
	This means removing your database configuration and similar files from version control and copying them directly to your server and CI. That, I don’t need to tell you, is a tedious job. Additionally, this approach is highly prone to errors and makes it harder to collaborate with other developers. You and all your collaborators need to remember to update configuration files everywhere.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-212"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-210">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-211'
	>
	Having multiple environments (such as production, staging, and acceptance) with different configuration files makes this even more difficult.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-215"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-213">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-214'
	>
	<a href="http://www.heroku.com/">Heroku</a> solved this problem through its <a href="https://devcenter.heroku.com/articles/getting-started-with-ruby#define-config-vars">config</a> setup. All configuration files can be set with <code>heroku config:set</code> independently for each environment.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-218"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-216">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-217'
	>
	If you have your own servers like us, Heroku’s strategy of using environment variables won’t work as easily. This is where <a href="https://www.vaultproject.io/">Vault</a> comes into play. We use HashiCorp’s Vault to store and retrieve our secrets.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-221"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-219">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-220'
	>
	12-factoring it up</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-224"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-222"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-223">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2017/02/hiding-secrets-in-vault-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="587"
															width="1000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-225">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-226'
	>
	We use Rails for web development. Luckily, there are a couple of gems that handle the setup of application environment variables. We agreed on using&nbsp;<a href="https://github.com/laserlemon/figaro" target="_blank" rel="noreferrer noopener">Figaro</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	The easiest and least error-prone way to do it is moving all your secrets to the <code>config/secrets.yml</code> file. There you can list all application secrets and make them use environment variables. Here’s an example:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-232"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> config/secrets.yml</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #d73a49;">default</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">secret_key_base</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">secret_key_base</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database_name</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_database</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database_username</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_username</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database_password</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_password</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database_host</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_host</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">bugsnag_api_key</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">bugsnag_api_key</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">devise_secret_key</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">devise_secret_key</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">development</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">test</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">staging</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">production</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">aws_access_key_id</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">aws_access_key_id</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">aws_secret_access_key</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">aws_secret_access_key</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">aws_region</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">aws_region</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">aws_bucket</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Figaro</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">env</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">aws_bucket</span><span class="token" style="color: #d73a49;">!</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-233">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-234'
	>
	<strong>PROTIP:</strong> By using Figaro’s bang methods we make sure all environment variables are set. If an environment variable is not set it will throw a <code>Figaro::MissingKey</code> error.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-236">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-237'
	>
	With the <code>secrets.yml</code> file all ready, we created three Figaro config files: <code>config/application.yml</code>, <code>config/application.staging.yml</code> and <code>config/application.production.yml</code> and remembered to add those files to <code>.gitignore</code>. Here&#8217;s an example of a config file: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-240"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> config/application.yml</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">secret_key_base</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">05</span><span class="token" style="color: #005cc5;">d822712453f3433298f3</span><span class="token" style="color: #d73a49;">...</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">devise_secret_key</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">682</span><span class="token" style="color: #005cc5;">a7bd0fefc30d2fda448062ccd828d3f13</span><span class="token" style="color: #d73a49;">...</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">database_username</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">postgres</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">database_password</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">database_host</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">localhost</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">bugsnag_api_key</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;">8217;5780d02c163...&amp;#8217;</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">development</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database_name</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">application_dev</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">test</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database_name</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">application_test</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-243"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-241">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-242'
	>
	And here’s an example of how to actually use those secrets:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-245"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> config/database.yml</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #d73a49;">default</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&amp;</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">adapter</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">postgresql</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">encoding</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">unicode</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">pool</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">5</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">database</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Rails</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">application</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">secrets</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_name</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">username</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Rails</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">application</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">secrets</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_username</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">password</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Rails</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">application</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">secrets</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_password</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">host</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">%=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Rails</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">application</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">secrets</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">database_host</span><span class="token"> </span><span class="token" style="color: #d73a49;">%</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">development</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">test</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">production</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">staging</span><span class="token">:</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">default</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-248"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-246">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-247'
	>
	Sharing secrets</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-251"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-249">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-250'
	>
	Now that our application is all 12-factored up, we need a way to share environment variables between developers and servers. Remember, we added <code>application.*.yml</code> files to <code>gitignore</code> so they don&#8217;t end up in the repository. No one has access to those files except for the person who wrote them. We are using Vault for sharing those files. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-254"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-252">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-253'
	>
	Here&#8217;s a summary of what <a href="https://www.vaultproject.io/" target="_blank" rel="noreferrer noopener">Vault</a> does:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-257"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-255">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-256'
	>
	<li>Vault secures, stores, and tightly controls access to tokens, passwords, certificates, API keys, and other secrets in modern computing.</li><li>Vault handles leasing, key revocation, key rolling, and auditing.</li><li>Vault presents a unified API to access multiple backends: HSMs, AWS IAM, SQL databases, raw key/value, and more.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-258">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-259'
	>
	Basically, it is an all-in-one solution for storing your critical information somewhere safe.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-263"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-261">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-262'
	>
	After setting up Vault on a separate server, we configured it to use <a href="https://www.consul.io/">consul.io</a> as a backend. For authentication backends we are using <code>github</code> and <code>app-id</code> methods. A <code>simple file system</code> is used for an audit backend. You can look into <a href="https://www.vaultproject.io/docs/index.html">Vault’s documentation</a> for more information.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-266"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-264">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-265'
	>
	As we have hundreds of projects under our belt, naming conventions are a must if we want our developers to know where the secrets are stashed. We agreed on <code>rails/#{git_repository_name}/#{environment}</code> for a path to store secrets within Vault. We are using the Git repository name here as a part of the path because that isn&#8217;t something that ever changes, so everyone knows the location of the secrets. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-269"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-267">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-268'
	>
	Next, a policy needs to be created to give someone writing and/or reading privileges on a specific Vault path. Here&#8217;s an example of such a policy: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">path</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">rails/application/*</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #032f62;">{</span><span class="token">
</span></span><span class="line"><span class="token">   </span><span class="token" style="color: #6f42c1;">policy</span><span class="token"> </span><span class="token" style="color: #032f62;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">write</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">}
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-272">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-273'
	>
	As Vault is easily <a href="https://www.vaultproject.io/docs/auth/github.html">integrated with GitHub</a>, we are using GitHub teams to apply different application policies to users. Simply create a new GitHub team, add all needed users, and link the Vault policy to that team. This has an added benefit of only having to remove someone from your GitHub organization in order to revoke their access to all secrets. This can come in handy when someone leaves the company.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-275"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-276">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2017/02/hiding-secrets-in-vault-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1000"
															width="682"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-278">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-279'
	>
	Except to users, we also need to grant access to servers and CI clients. We use what Vault calls <a href="https://www.vaultproject.io/docs/auth/app-id.html">app-id authentication</a>. App-id authentication uses two strong keys to authenticate a Vault server. We give our machines read-only access to secrets within Vault.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-283"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-281"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-282">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2017/02/hiding-secrets-in-vault-3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1000"
															width="918"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-286"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-284">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-285'
	>
	Real world usage</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-289"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-287">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-288'
	>
	As I mentioned before, Vault has no web interface, and its command line tool has a steep learning curve. We mitigated that problem by creating our own <a href="https://github.com/infinum/secrets_cli">secrets gem</a>. It uses the official <a href="https://github.com/hashicorp/vault-ruby">Vault Ruby gem</a> and is built around the requirements described above.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-292"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-290">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-291'
	>
	It has a couple of simple commands:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-294"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">secrets</span><span class="token"> </span><span class="token" style="color: #032f62;">init</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-297"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-295">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-296'
	>
	This will create a .secrets file with the project configuration. The command will ask for everything you don’t supply via options.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-300"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-298">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-299'
	>
	Here’s an example of a .secrets file:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-302"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> file where your secrets are kept depending on your environment gem</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">secrets_file</span><span class="token">:</span><span class="token"> config</span><span class="token" style="color: #d73a49;">/</span><span class="token">application</span><span class="token">.</span><span class="token" style="color: #6f42c1;">yml</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> vault &amp;#8217;storage_key&amp;#8217; where your secrets will be kept</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">secrets_storage_key</span><span class="token">:</span><span class="token"> rails</span><span class="token" style="color: #d73a49;">/</span><span class="token">my_project</span><span class="token" style="color: #d73a49;">/</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-305"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-303">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-304'
	>
	And if you set up your environment variables correctly you can push and pull secrets:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-307"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">secrets</span><span class="token"> </span><span class="token" style="color: #032f62;">push</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">secrets</span><span class="token"> </span><span class="token" style="color: #032f62;">pull</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-310"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-308">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-309'
	>
	This can also be set up on a server, so your deployment scripts pull secrets on every deployment. We use <a href="https://github.com/mina-deploy/mina">mina</a> for our deployment purposes, and we created a <a href="https://github.com/infinum/mina-secrets">mina-secrets</a> plugin which simplifies our deployment with secrets.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-313"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-311">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-312'
	>
	Conclusion</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-316"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-314">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-315'
	>
	So there it is, our approach to building a production-grade, scalable system for managing secrets. Using Vault makes the system secure. Using Github for the authentication makes it convenient for managing access. And using the <code>secrets</code> gem makes sharing secrets quick and dead simple for developers. Don’t sacrifice security for the sake of convenience any more.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-319"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-317">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-318'
	>
	Hope you enjoy using it.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/hiding-secrets-in-vault/">Hiding Secrets in a Vault</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>8101https://infinum.com/uploads/2015/07/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-0.webp</url>
				</image>
				<title>A Gem for Every Occasion: 11 Great Rails Libraries We Use on Every Project</title>
				<link>https://infinum.com/blog/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project/</link>
				<pubDate>Wed, 11 Mar 2015 09:21:00 +0000</pubDate>
				<dc:creator>Stjepan Hadjić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project/</guid>
				<description>
					<![CDATA[<p>In the Ruby world, these gems are created on a daily basis, but only some of them are good enough to win our hearts.</p>
<p>The post <a href="https://infinum.com/blog/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project/">A Gem for Every Occasion: 11 Great Rails Libraries We Use on Every Project</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-426"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-322">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-325"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-323">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-324'
	>
	As you work with your favorite programming language, you often look for tools to make your job easier. In the Ruby world, these tools (gems) are created on a daily basis, but only some of them are good enough to win our hearts.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-328"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-326">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-327'
	>
	Here are some of the core gems that have a special place in all of our Gemfiles. Some of them help with debugging code, others provide certain functionality like authentication. That’s useful in almost any project. In the end, they all help us work faster and produce quality software.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-331"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-329"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-330">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2015/07/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="384"
															width="720"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-334"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-332">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-333'
	>
	1. <a href="https://github.com/charliesome/better_errors">better_errors</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-337"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-335"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-336">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2015/06/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-2-1400x814.webp				media='(max-width: 699px)'
				type=image/webp								height="814"
												width="1400"
				 />
								
			<source
				srcset=https://infinum.com/uploads/2015/06/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-2-2400x1395.webp				media='(max-width: 1199px)'
				type=image/webp								height="1395"
												width="2400"
				 />
								
			<source
				srcset=https://infinum.com/uploads/2015/06/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-2-3000x1743.webp				media='(max-width: 1999px)'
				type=image/webp								height="1743"
												width="3000"
				 />
												<img
					src="https://infinum.com/uploads/2015/06/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1806"
															width="3108"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-340"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-338">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-339'
	>
	2. <a href="https://github.com/plataformatec/devise">devise</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-343"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-341">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-342'
	>
	Whether you need simple HTTP authentication, or you’re looking for some complex Facebook and Google+ login system, this authentication solution is great and it will significantly speed up your work. It’s built on top of the Rails MVC stack and its modular architecture allows you to pick what you need.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-345"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">User</span><span class="token"> </span><span class="token">&lt;</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ActiveRecord</span><span class="token" style="color: #6f42c1;">::</span><span class="token" style="color: #6f42c1;">Base</span><span class="token">
</span></span><span class="line"><span class="token">  devise </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">database_authenticatable</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">registerable</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">confirmable</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">recoverable</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">stretches</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">20</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-348"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-346">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-347'
	>
	3. <a href="https://github.com/CanCanCommunity/cancancan">cancancan</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-351"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-349">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-350'
	>
	The successor of the abandoned <a href="https://github.com/ryanb/cancan">cancan</a> project, this authorization gem lets you define what a user can do on your website by using abilities defined in a single place.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-353"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">Ability</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">include</span><span class="token"> </span><span class="token" style="color: #005cc5;">CanCan</span><span class="token">::</span><span class="token" style="color: #005cc5;">Ability</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">def</span><span class="token"> </span><span class="token" style="color: #6f42c1;">initialize</span><span class="token">(</span><span class="token">user</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">user</span><span class="token"> </span><span class="token" style="color: #d73a49;">||=</span><span class="token"> </span><span class="token" style="color: #005cc5;">User</span><span class="token">.</span><span class="token" style="color: #d73a49;">new</span><span class="token"> </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> guest user (not logged in)</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">if</span><span class="token"> user</span><span class="token">.</span><span class="token" style="color: #6f42c1;">admin?</span><span class="token">
</span></span><span class="line"><span class="token">      can </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">manage</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">all</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">else</span><span class="token">
</span></span><span class="line"><span class="token">      can </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">read</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">all</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-356"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-354">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-355'
	>
	In newer projects we started experimenting with <a href="https://github.com/elabs/pundit">pundit</a>. It is faster, more modular and it wont bloat a single file.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-359"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-357">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-358'
	>
	4. <a href="https://github.com/collectiveidea/delayed_job">delayed_job</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-362"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-360">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-361'
	>
	We find this gem to be the best when you need to extract some longer-running actions (e.g., sending newsletters to a large number of users) into a background task. You can reuse methods from your models, or you can create complex classes for all your background task needs. With delayed_job, even <a href="https://infinum.com/blog/progress-bar-in-rails/">progress bars</a> are possible in Ruby on Rails.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-364"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> without delayed_job</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">Notifier</span><span class="token">.</span><span class="token" style="color: #6f42c1;">signup</span><span class="token">(</span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">user</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">deliver</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> with delayed_job</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">Notifier</span><span class="token">.</span><span class="token" style="color: #6f42c1;">delay</span><span class="token">.</span><span class="token" style="color: #6f42c1;">signup</span><span class="token">(</span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">user</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> with delayed_job running at a specific time</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">Notifier</span><span class="token">.</span><span class="token" style="color: #6f42c1;">delay</span><span class="token">(</span><span class="token" style="color: #005cc5;">run_at</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">5</span><span class="token">.</span><span class="token" style="color: #6f42c1;">minutes</span><span class="token">.</span><span class="token" style="color: #6f42c1;">from_now</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">signup</span><span class="token">(</span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">user</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-367"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-365">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-366'
	>
	5. <a href="https://github.com/ryanb/letter_opener">letter_opener</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-370"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-368">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-369'
	>
	It’s quite annoying to set up email delivery in a development environment, and that’s where Letter Opener is great. It displays the email in your browser so you can easily inspect it, click any links (e.g., account confirmation) and not spam your email account with tons of test emails.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-373"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-371"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-372">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2014/10/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project-3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="654"
															width="1155"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-376"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-374">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-375'
	>
	6. <a href="https://github.com/mina-deploy/mina">mina</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-379"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-377">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-378'
	>
	Easily configured, this gem allows you to do fast remote deployments of you website, as multiple environments are supported and all the work is done in only one SSH session (compared to Capistrano’s multiple SSH sessions). For more info, check out this article about <a href="https://infinum.com/blog/faster-web-application-deployments-using-mina-instead-of-capistrano/">Mina</a>, written by my colleague Gabrijel Škoro.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-381"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token"> 
</span></span><span class="line"><span class="token" style="color: #6f42c1;">➜</span><span class="token">  </span><span class="token" style="color: #032f62;">project g</span><span class="token" style="color: #032f62;">it:(m</span><span class="token" style="color: #6f42c1;">aster</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #032f62;">✗ min</span><span class="token" style="color: #032f62;">a pro</span><span class="token" style="color: #032f62;">duction dep</span><span class="token" style="color: #032f62;">loy
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Creating</span><span class="token"> </span><span class="token" style="color: #032f62;">a</span><span class="token"> </span><span class="token" style="color: #032f62;">temporary</span><span class="token"> </span><span class="token" style="color: #032f62;">build</span><span class="token"> </span><span class="token" style="color: #032f62;">path</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Fetching</span><span class="token"> </span><span class="token" style="color: #032f62;">new</span><span class="token"> </span><span class="token" style="color: #032f62;">git</span><span class="token"> </span><span class="token" style="color: #032f62;">commits</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Using</span><span class="token"> </span><span class="token" style="color: #032f62;">git</span><span class="token"> </span><span class="token" style="color: #032f62;">branch</span><span class="token"> </span><span class="token" style="color: #032f62;">’master’    </span><span class="token">    </span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6f42c1;">Cloning</span><span class="token"> </span><span class="token" style="color: #032f62;">into</span><span class="token"> </span><span class="token" style="color: #032f62;">’.’... 
</span></span><span class="line"><span class="token">       done. 
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Using</span><span class="token"> </span><span class="token" style="color: #032f62;">this</span><span class="token"> </span><span class="token" style="color: #032f62;">git</span><span class="token"> </span><span class="token" style="color: #032f62;">commit</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6f42c1;">user</span><span class="token"> (0695b54</span><span class="token">): 
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #6f42c1;">increase</span><span class="token"> </span><span class="token" style="color: #032f62;">credits</span><span class="token"> </span><span class="token" style="color: #032f62;">after</span><span class="token"> </span><span class="token" style="color: #032f62;">manual</span><span class="token"> </span><span class="token" style="color: #032f62;">order</span><span class="token"> </span><span class="token" style="color: #032f62;">update</span><span class="token"> </span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Symlinking</span><span class="token"> </span><span class="token" style="color: #032f62;">shared</span><span class="token"> </span><span class="token" style="color: #032f62;">paths</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Installing</span><span class="token"> </span><span class="token" style="color: #032f62;">gem</span><span class="token"> </span><span class="token" style="color: #032f62;">dependencies</span><span class="token"> </span><span class="token" style="color: #032f62;">using</span><span class="token"> </span><span class="token" style="color: #032f62;">Bundler</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> list of gems ommited
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6f42c1;">Your</span><span class="token"> </span><span class="token" style="color: #032f62;">bundle</span><span class="token"> </span><span class="token" style="color: #032f62;">is</span><span class="token"> </span><span class="token" style="color: #032f62;">complete!</span><span class="token"> </span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6f42c1;">Gems</span><span class="token"> </span><span class="token" style="color: #032f62;">in</span><span class="token"> </span><span class="token" style="color: #032f62;">the</span><span class="token"> </span><span class="token" style="color: #032f62;">groups</span><span class="token"> </span><span class="token" style="color: #032f62;">development</span><span class="token"> </span><span class="token" style="color: #032f62;">and</span><span class="token"> </span><span class="token" style="color: #032f62;">test</span><span class="token"> </span><span class="token" style="color: #032f62;">were</span><span class="token"> </span><span class="token" style="color: #032f62;">not</span><span class="token"> </span><span class="token" style="color: #032f62;">installed.</span><span class="token"> </span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6f42c1;">It</span><span class="token"> </span><span class="token" style="color: #032f62;">was</span><span class="token"> </span><span class="token" style="color: #032f62;">installed</span><span class="token"> </span><span class="token" style="color: #032f62;">into</span><span class="token"> </span><span class="token" style="color: #032f62;">./vendor/bundle</span><span class="token"> </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">DB</span><span class="token"> </span><span class="token" style="color: #032f62;">schema</span><span class="token"> </span><span class="token" style="color: #032f62;">unchanged</span><span class="token">;</span><span class="token"> </span><span class="token" style="color: #6f42c1;">skipping</span><span class="token"> </span><span class="token" style="color: #032f62;">DB</span><span class="token"> </span><span class="token" style="color: #032f62;">migration</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Skipping</span><span class="token"> </span><span class="token" style="color: #032f62;">asset</span><span class="token"> </span><span class="token" style="color: #032f62;">precompilation</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Cleaning</span><span class="token"> </span><span class="token" style="color: #032f62;">up</span><span class="token"> </span><span class="token" style="color: #032f62;">old</span><span class="token"> </span><span class="token" style="color: #032f62;">releases</span><span class="token"> (keeping</span><span class="token"> </span><span class="token" style="color: #005cc5;">5</span><span class="token">)        
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Build</span><span class="token"> </span><span class="token" style="color: #032f62;">finished</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Moving</span><span class="token"> </span><span class="token" style="color: #032f62;">build</span><span class="token"> </span><span class="token" style="color: #032f62;">to</span><span class="token"> </span><span class="token" style="color: #032f62;">releases/307</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Updating</span><span class="token"> </span><span class="token" style="color: #032f62;">the</span><span class="token"> </span><span class="token" style="color: #032f62;">current</span><span class="token"> </span><span class="token" style="color: #032f62;">symlink</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Launching</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Symlink</span><span class="token"> </span><span class="token" style="color: #032f62;">system</span><span class="token"> </span><span class="token" style="color: #032f62;">to</span><span class="token"> </span><span class="token" style="color: #032f62;">shared</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Restarting</span><span class="token"> </span><span class="token" style="color: #032f62;">application</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">-----</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">Done.</span><span class="token"> </span><span class="token" style="color: #032f62;">Deployed</span><span class="token"> </span><span class="token" style="color: #032f62;">v307</span><span class="token">        </span><span class="token">
</span></span><span class="line"><span class="token">       </span><span class="token" style="color: #6f42c1;">Elapsed</span><span class="token"> </span><span class="token" style="color: #032f62;">time:</span><span class="token"> </span><span class="token" style="color: #005cc5;">2.00</span><span class="token"> </span><span class="token" style="color: #032f62;">seconds</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-384"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-382">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-383'
	>
	7. <a href="https://github.com/thoughtbot/paperclip">paperclip</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-387"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-385">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-386'
	>
	You often have to deal with attachments that need to be processed in various ways. With paperclip, that becomes quite simple (with the support of <a href="http://www.imagemagick.org">ImageMagick</a>) and allows you all sorts of validations and transformations, providing support for customizations as well.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-389"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">User</span><span class="token"> </span><span class="token">&lt;</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ActiveRecord</span><span class="token" style="color: #6f42c1;">::</span><span class="token" style="color: #6f42c1;">Base</span><span class="token">
</span></span><span class="line"><span class="token">  has_attached_file </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">avatar</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">styles</span><span class="token"> </span><span class="token">=&gt;</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">medium</span><span class="token"> </span><span class="token">=&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">300x300&gt;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">thumb</span><span class="token"> </span><span class="token">=&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">100x100&gt;</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token">}</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">default_url</span><span class="token"> </span><span class="token">=&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/images/:style/missing.png</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">  validates_attachment_content_type </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">avatar</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">content_type</span><span class="token"> </span><span class="token">=&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">/</span><span class="token" style="color: #032f62;font-weight: bold;">\A</span><span class="token" style="color: #032f62;">image</span><span class="token" style="color: #032f62;font-weight: bold;">\/</span><span class="token" style="color: #032f62;">.*</span><span class="token" style="color: #032f62;font-weight: bold;">\Z</span><span class="token" style="color: #032f62;">/</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-392"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-390">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-391'
	>
	If you feel adventurous, you can try <a href="https://github.com/refile/refile">refile</a> from the creators of <a href="https://github.com/carrierwaveuploader/carrierwave">carrierwave</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-395"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-393">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-394'
	>
	8. <a href="https://github.com/plataformatec/simple_form">simple_form</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-398"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-396">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-397'
	>
	Plain Rails generated forms (and related helpers) aren’t really that helpful when you’re designing a great user interface, which is essential for every website. This is where Simple Form saves the day with its powerful yet simple DSL.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-400"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-haml github-light" data-language="haml" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">=</span><span class="token"> simple_form_for </span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">user</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token">f</span><span class="token">|
</span></span><span class="line"><span class="token">  </span><span class="token">=</span><span class="token"> f</span><span class="token">.</span><span class="token" style="color: #6f42c1;">input</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">username</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">label</span><span class="token" style="color: #005cc5;">:</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">Your</span><span class="token"> username please’</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">=</span><span class="token"> f</span><span class="token">.</span><span class="token" style="color: #6f42c1;">input</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">password</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">hint</span><span class="token" style="color: #005cc5;">:</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">No</span><span class="token"> special characters</span><span class="token">.</span><span class="token">’</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">=</span><span class="token"> f</span><span class="token">.</span><span class="token" style="color: #6f42c1;">input</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">email</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">placeholder</span><span class="token" style="color: #005cc5;">:</span><span class="token"> ’user</span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">domain</span><span class="token">.</span><span class="token" style="color: #6f42c1;">com</span><span class="token">’</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">=</span><span class="token"> f</span><span class="token">.</span><span class="token" style="color: #6f42c1;">input</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">remember_me</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">inline_label</span><span class="token" style="color: #005cc5;">:</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">Yes</span><span class="token">,</span><span class="token"> remember me’</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">=</span><span class="token"> f</span><span class="token">.</span><span class="token" style="color: #6f42c1;">button</span><span class="token"> </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">submit</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-403"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-401">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-402'
	>
	9. <a href="https://github.com/rspec/rspec-rails">rspec-rails</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-406"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-404">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-405'
	>
	If you’re doing testing (and you should!), this gem helps you to easily integrate rspec framework into your Rails project by generating the necessary configuration files and spec helpers.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-408"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">require</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">spec_helper</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">describe </span><span class="token" style="color: #005cc5;">User</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">  it </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">orders by last name</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">lindeman</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">User</span><span class="token">.</span><span class="token" style="color: #6f42c1;">create!</span><span class="token">(</span><span class="token" style="color: #005cc5;">first_name</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Andy</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">last_name</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Lindeman</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">chelimsky</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">User</span><span class="token">.</span><span class="token" style="color: #6f42c1;">create!</span><span class="token">(</span><span class="token" style="color: #005cc5;">first_name</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">David</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">last_name</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Chelimsky</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">expect</span><span class="token">(</span><span class="token" style="color: #005cc5;">User</span><span class="token">.</span><span class="token" style="color: #6f42c1;">ordered_by_last_name</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">to</span><span class="token"> </span><span class="token" style="color: #6f42c1;">eq</span><span class="token">(</span><span class="token">[</span><span class="token">chelimsky</span><span class="token">,</span><span class="token"> lindeman</span><span class="token">]</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-411"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-409">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-410'
	>
	10. <a href="https://github.com/thoughtbot/factory_girl_rails">factory_girl_rails</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-414"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-412">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-413'
	>
	When testing your projects, you need data. The best way to generate test data is to use a factory generator. The factory_girl_rails gem helps you to easily integrate Factory Girl, our favorite factory generator, into your Rails projects.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-416"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> spec/factories/user.rb</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">FactoryGirl</span><span class="token">.</span><span class="token" style="color: #6f42c1;">define</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">  factory </span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">user</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">    first_name </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Andy</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">    last_name  </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Lindeman</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> spec/models/user_spec.rb</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #d73a49;">require</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">spec_helper</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">describe </span><span class="token" style="color: #005cc5;">User</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">  it </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">orders by last name</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">lindeman</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">create</span><span class="token">(</span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">user</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">chelimsky</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">create</span><span class="token">(</span><span class="token" style="color: #005cc5;">:</span><span class="token" style="color: #005cc5;">user</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">first_name</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">David</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">last_name</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">Chelimsky</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">expect</span><span class="token">(</span><span class="token" style="color: #005cc5;">User</span><span class="token">.</span><span class="token" style="color: #6f42c1;">ordered_by_last_name</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">to</span><span class="token"> </span><span class="token" style="color: #6f42c1;">eq</span><span class="token">(</span><span class="token">[</span><span class="token">chelimsky</span><span class="token">,</span><span class="token"> lindeman</span><span class="token">]</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-419"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-417">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-418'
	>
	11. <a href="https://github.com/rweng/pry-rails">pry-rails</a></h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-422"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-420">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-421'
	>
	Debug your code like a champ. With pry, you can see what went wrong in any part of your Rails project, in your tests, third-party gems, and it can even be used in the Rails console.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-424"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6f42c1;">Started</span><span class="token"> </span><span class="token" style="color: #032f62;">GET</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">/</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #032f62;">for</span><span class="token"> </span><span class="token" style="color: #005cc5;">127.0.0.1</span><span class="token"> </span><span class="token" style="color: #032f62;">at</span><span class="token"> </span><span class="token" style="color: #032f62;">2014-10-24</span><span class="token"> </span><span class="token" style="color: #032f62;">09:57:12</span><span class="token"> </span><span class="token" style="color: #032f62;">+0200</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">Processing</span><span class="token"> </span><span class="token" style="color: #032f62;">by</span><span class="token"> </span><span class="token" style="color: #032f62;">HomeController#index</span><span class="token"> </span><span class="token" style="color: #032f62;">as</span><span class="token"> </span><span class="token" style="color: #032f62;">HTML</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">User</span><span class="token"> </span><span class="token" style="color: #032f62;">Load</span><span class="token"> (0.5ms</span><span class="token">)  SELECT  </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">users</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">.</span><span class="token" style="color: #d73a49;">*</span><span class="token"> FROM </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">users</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">  WHERE </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">users</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">id</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> = 1  ORDER BY </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">users</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">.</span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">id</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> ASC LIMIT 1
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6f42c1;">From:</span><span class="token"> </span><span class="token" style="color: #032f62;">/Users/stef/dev/gluposti/blogs/app/controllers/home_controller.rb</span><span class="token"> </span><span class="token" style="color: #032f62;">@</span><span class="token"> </span><span class="token" style="color: #032f62;">line</span><span class="token"> </span><span class="token" style="color: #005cc5;">4</span><span class="token"> </span><span class="token" style="color: #032f62;">HomeController#index:</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">2:</span><span class="token"> </span><span class="token" style="color: #032f62;">def</span><span class="token"> </span><span class="token" style="color: #032f62;">index</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">3:</span><span class="token">   </span><span class="token" style="color: #032f62;">@user</span><span class="token"> </span><span class="token" style="color: #032f62;">=</span><span class="token"> </span><span class="token" style="color: #032f62;">current_user</span><span class="token">
</span></span><span class="line"><span class="token"> </span><span class="token" style="color: #032f62;">=</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">4:</span><span class="token">   </span><span class="token" style="color: #032f62;">binding.pry</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">5:</span><span class="token"> </span><span class="token" style="color: #032f62;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">[</span><span class="token">1</span><span class="token">]</span><span class="token"> pry(</span><span class="token">#&lt;HomeController&gt;)&gt; current_user
</span></span><span class="line"><span class="token" style="color: #032f62;">=</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;">&lt;User id: 1, email: &quot;admin@infinum.co&quot;, encrypted_password: &quot;$2a$10$AR/1ZnYJS5hqFNtDzx3ZGuGlRlinktNPebsp6Ye5ENn...&quot;, reset_password_token: &quot;5e116a7fd356c11cccfcf27ab981e19b5a756dd7c6f2bd64ba...&quot;, reset_password_sent_at: &quot;2014-10-24 07:32:34&quot;, remember_created_at: nil, sign_in_count: 2, current_sign_in_at: &quot;2014-10-24 07:57:12&quot;, last_sign_in_at: &quot;2014-10-24 07:25:25&quot;, current_sign_in_ip: &quot;127.0.0.1&quot;, last_sign_in_ip: &quot;127.0.0.1&quot;, created_at: &quot;2014-10-24 07:25:25&quot;, updated_at: &quot;2014-10-24 07:57:12&quot;&gt;
</span></span><span class="line"><span class="token">[</span><span class="token">2</span><span class="token">]</span><span class="token"> pry(</span><span class="token">#&lt;HomeController&gt;)&gt; cd @user
</span></span><span class="line"><span class="token">[</span><span class="token">3</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #6f42c1;">pry(#</span><span class="token">&lt;User&gt;</span><span class="token">):</span><span class="token" style="color: #d73a49;">1&gt;</span><span class="token"> email
</span></span><span class="line"><span class="token" style="color: #032f62;">=</span><span class="token">&gt;</span><span class="token"> </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">admin@infinum.co</span><span class="token" style="color: #032f62;">&quot;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/a-gem-for-every-occasion-11-great-ruby-libraries-we-use-on-every-project/">A Gem for Every Occasion: 11 Great Rails Libraries We Use on Every Project</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>7881https://infinum.com/uploads/2015/07/progress-bar-in-rails-0.webp</url>
				</image>
				<title>Progress Bar in Rails</title>
				<link>https://infinum.com/blog/progress-bar-in-rails/</link>
				<pubDate>Thu, 22 Jan 2015 09:05:00 +0000</pubDate>
				<dc:creator>Stjepan Hadjić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/progress-bar-in-rails/</guid>
				<description>
					<![CDATA[<p>Ever needed a progress bar for some long-running task in your Rails application? We created a progress&#095;job gem that helps with that problem.</p>
<p>The post <a href="https://infinum.com/blog/progress-bar-in-rails/">Progress Bar in Rails</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-488"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-427">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-430"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-428">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-429'
	>
	Ever needed a progress bar for some long-running task in your Rails application? You searched Google and couldn’t find anything that easily integrates with Rails? Well, we created a progress_job gem that helps with that problem.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-433"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-431">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-432'
	>
	<a href="https://github.com/d4be4st/progress_job">Progress_job</a> is a gem that builds upon <a href="https://github.com/collectiveidea/delayed_job">delayed_job</a> to give you a simple progress bar you can use in your views. Create a class with your long-running task inside, update the job in each iteration and have ajax calls that will update the progress bar.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-436"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-434"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-435">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2015/07/progress-bar-in-rails-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="674"
															width="1024"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-439"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-437">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-438'
	>
	ProgressJob</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-442"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-440">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-441'
	>
	Progress_job depends on delayed_job, so I will write this tutorial using the <a href="https://github.com/collectiveidea/delayed_job_active_record">delayed_job_active_record</a> gem.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-445"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-443">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-444'
	>
	After adding the gem in your Gemfile</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-447"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">  gem ’delayed_job_active_record’
</span></span><span class="line"><span class="token">  gem ’progress_job’
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-450"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-448">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-449'
	>
	and running bundle install,</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-452"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">bundle</span><span class="token"> </span><span class="token" style="color: #032f62;">install</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-455"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-453">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-454'
	>
	run the progress_job generator to add migrations necessary for progress_job to work.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-457"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-shellscript github-light" data-language="shellscript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">rails</span><span class="token"> </span><span class="token" style="color: #032f62;">generate</span><span class="token"> </span><span class="token" style="color: #032f62;">delayed_job:active_record</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">rails</span><span class="token"> </span><span class="token" style="color: #032f62;">generate</span><span class="token"> </span><span class="token" style="color: #032f62;">progress_job:install</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">$</span><span class="token"> </span><span class="token" style="color: #032f62;">rake</span><span class="token"> </span><span class="token" style="color: #032f62;">db:migrate</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-460"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-458">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-459'
	>
	This will add three columns to the delayed_jobs table:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-463"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-461">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-462'
	>
	<li>progress_stage : string =&gt; customizable description for the current progress stage of the task</li><li>progress_current : integer =&gt; number representing the current progress value of the task</li><li>progress_max : integer =&gt; number representing the maximum progress value of the task</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-466"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-464">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-465'
	>
	Then you can create a custom class extending ProgressJob::Base which will give you access to some handy methods for manipulating the job.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-468"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">update_progress</span><span class="token">(</span><span class="token" style="color: #005cc5;">step</span><span class="token" style="color: #005cc5;">:</span><span class="token"> </span><span class="token" style="color: #005cc5;">10</span><span class="token">)</span><span class="token">  </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> increase the progress_current for step</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">update_stage</span><span class="token">(</span><span class="token">’name of stage’</span><span class="token">)</span><span class="token">  </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> change the progress_stage</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">update_stage_progress</span><span class="token">(</span><span class="token">’name of stage’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">s</span><span class="token" style="color: #005cc5;">tep:</span><span class="token"> </span><span class="token" style="color: #005cc5;">11</span><span class="token">)</span><span class="token">  </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> change progress_stage and increase progress_current for step</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">update_progress_max</span><span class="token">(</span><span class="token">progress_max</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> change progress_max</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-471"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-469">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-470'
	>
	Progress_job also gives you a route from which you can get all the info on a progress_job, and it is located at:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-473"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token"> 
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #005cc5;">GET</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">progress</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">jobs</span><span class="token" style="color: #d73a49;">/</span><span class="token">:</span><span class="token" style="color: #005cc5;">job_id</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-476"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-474">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-475'
	>
	Now all you need is an ajax call which will check the route every few seconds and update the progress bar visible on the screen.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-479"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-477">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-478'
	>
	Demo app</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-482"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-480">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-481'
	>
	I’ve created a demo app. You can view its <a href="https://github.com/d4be4st/progress_job_demo">source</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-484"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-ruby github-light" data-language="ruby" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> app/jobs/export.rb</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ExportJob</span><span class="token"> </span><span class="token">&lt;</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ProgressJob</span><span class="token" style="color: #6f42c1;">::</span><span class="token" style="color: #6f42c1;">Base</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">def</span><span class="token"> </span><span class="token" style="color: #6f42c1;">initialize</span><span class="token">(</span><span class="token">users</span><span class="token">,</span><span class="token"> </span><span class="token">progress_max</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">super</span><span class="token"> </span><span class="token" style="color: #005cc5;">progress_max</span><span class="token" style="color: #005cc5;">:</span><span class="token"> progress_max
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">users</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> users
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">def</span><span class="token"> </span><span class="token" style="color: #6f42c1;">perform</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6f42c1;">update_stage</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #005cc5;">Exporting</span><span class="token"> users’</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">csv_string</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">CSV</span><span class="token">.</span><span class="token" style="color: #6f42c1;">generate</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token">csv</span><span class="token" style="color: #d73a49;">|</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">users</span><span class="token">.</span><span class="token" style="color: #6f42c1;">each</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token">user</span><span class="token" style="color: #d73a49;">|</span><span class="token">
</span></span><span class="line"><span class="token">        csv </span><span class="token" style="color: #d73a49;">&lt;&lt;</span><span class="token"> user</span><span class="token">.</span><span class="token" style="color: #6f42c1;">to_csv</span><span class="token">
</span></span><span class="line"><span class="token">        update_progress
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #005cc5;">File</span><span class="token">.</span><span class="token" style="color: #005cc5;">open</span><span class="token">(</span><span class="token">’path</span><span class="token" style="color: #d73a49;">/</span><span class="token">to</span><span class="token" style="color: #d73a49;">/</span><span class="token">export</span><span class="token">.</span><span class="token" style="color: #6f42c1;">csv</span><span class="token">’</span><span class="token">,</span><span class="token"> ’w’</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">|</span><span class="token">f</span><span class="token" style="color: #d73a49;">|</span><span class="token"> f</span><span class="token">.</span><span class="token" style="color: #6f42c1;">write</span><span class="token">(</span><span class="token">csv_string</span><span class="token">)</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> app/controllers/exports_controller.rb</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #d73a49;">class</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ExportsController</span><span class="token"> </span><span class="token">&lt;</span><span class="token"> </span><span class="token" style="color: #6f42c1;">ApplicationController</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">def</span><span class="token"> </span><span class="token" style="color: #6f42c1;">index</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">def</span><span class="token"> </span><span class="token" style="color: #6f42c1;">export_users</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #e36209;">users</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">User</span><span class="token">.</span><span class="token" style="color: #6f42c1;">first</span><span class="token">(</span><span class="token" style="color: #005cc5;">100</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">@</span><span class="token" style="color: #24292e;">job</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">Delayed</span><span class="token">::</span><span class="token" style="color: #005cc5;">Job</span><span class="token">.</span><span class="token" style="color: #6f42c1;">enqueue</span><span class="token"> </span><span class="token" style="color: #005cc5;">ExportJob</span><span class="token">.</span><span class="token" style="color: #d73a49;">new</span><span class="token">(</span><span class="token">users</span><span class="token">,</span><span class="token"> users</span><span class="token">.</span><span class="token" style="color: #6f42c1;">count</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> app/views/exports/index.html.haml</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">.</span><span class="token">export
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">=</span><span class="token"> link_to ’</span><span class="token" style="color: #005cc5;">Export</span><span class="token"> </span><span class="token" style="color: #005cc5;">Users</span><span class="token">’</span><span class="token">,</span><span class="token"> export_users_path</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">re</span><span class="token" style="color: #005cc5;">m</span><span class="token" style="color: #005cc5;">ote:</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">c</span><span class="token" style="color: #005cc5;">l</span><span class="token" style="color: #005cc5;">ass:</span><span class="token"> ’btn btn</span><span class="token" style="color: #d73a49;">-</span><span class="token">primary btn</span><span class="token" style="color: #d73a49;">-</span><span class="token">lg’
</span></span><span class="line"><span class="token">  </span><span class="token">.</span><span class="token" style="color: #6f42c1;">well</span><span class="token">{</span><span class="token" style="color: #005cc5;">style</span><span class="token" style="color: #005cc5;">:</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">displ</span><span class="token" style="color: #005cc5;">a</span><span class="token" style="color: #005cc5;">y:</span><span class="token">none’</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">.</span><span class="token" style="color: #6f42c1;">row</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token">.</span><span class="token" style="color: #6f42c1;">col</span><span class="token" style="color: #d73a49;">-</span><span class="token">xs</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">12</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">.</span><span class="token" style="color: #6f42c1;">progress</span><span class="token" style="color: #d73a49;">-</span><span class="token">status</span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token" style="color: #d73a49;">-</span><span class="token">primary
</span></span><span class="line"><span class="token">    </span><span class="token">.</span><span class="token" style="color: #6f42c1;">row</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token">.</span><span class="token" style="color: #6f42c1;">col</span><span class="token" style="color: #d73a49;">-</span><span class="token">xs</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #005cc5;">12</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">.</span><span class="token" style="color: #6f42c1;">progress</span><span class="token">.</span><span class="token" style="color: #6f42c1;">progress</span><span class="token" style="color: #d73a49;">-</span><span class="token">striped</span><span class="token">.</span><span class="token" style="color: #6f42c1;">active</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token">.</span><span class="token" style="color: #6f42c1;">progress</span><span class="token" style="color: #d73a49;">-</span><span class="token">bar
</span></span><span class="line"><span class="token">            </span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token" style="color: #d73a49;">-</span><span class="token">primary
</span></span><span class="line"><span class="token">              </span><span class="token" style="color: #005cc5;">0</span><span class="token" style="color: #d73a49;">%</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">=</span><span class="token"> link_to ’</span><span class="token" style="color: #005cc5;">View</span><span class="token"> csv’</span><span class="token">,</span><span class="token"> ’</span><span class="token" style="color: #d73a49;">/</span><span class="token" style="color: #005cc5;">system</span><span class="token" style="color: #d73a49;">/</span><span class="token">export</span><span class="token">.</span><span class="token" style="color: #6f42c1;">csv</span><span class="token">’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">c</span><span class="token" style="color: #005cc5;">lass:</span><span class="token"> ’btn btn</span><span class="token" style="color: #d73a49;">-</span><span class="token">success export</span><span class="token" style="color: #d73a49;">-</span><span class="token">link’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #005cc5;">sty</span><span class="token" style="color: #005cc5;">l</span><span class="token" style="color: #005cc5;">e:</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">d</span><span class="token" style="color: #005cc5;">isplay:</span><span class="token">none’
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;"> config/routes.rb</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #005cc5;">Rails</span><span class="token">.</span><span class="token" style="color: #6f42c1;">application</span><span class="token">.</span><span class="token" style="color: #6f42c1;">routes</span><span class="token">.</span><span class="token" style="color: #6f42c1;">draw</span><span class="token"> </span><span class="token" style="color: #d73a49;">do</span><span class="token">
</span></span><span class="line"><span class="token">  root </span><span class="token" style="color: #005cc5;">to</span><span class="token" style="color: #005cc5;">:</span><span class="token"> ’exports</span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;">index’</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token">  get ’export_users’ </span><span class="token">=&gt;</span><span class="token"> ’exports</span><span class="token" style="color: #6a737d;">#</span><span class="token" style="color: #6a737d;">export_users’, as: :export_users</span><span class="token" style="color: #6a737d;">
</span></span><span class="line"><span class="token" style="color: #d73a49;">end</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-486"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-javascript github-light" data-language="javascript" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> app/views/exports/export_users.js.haml</span><span class="token">
</span></span><span class="line"><span class="token">:</span><span class="token" style="color: #24292e;">plain</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #24292e;">interval</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token">.expor</span><span class="token">t</span><span class="token"> </span><span class="token" style="color: #24292e;">.wel</span><span class="token">l</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">show</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token" style="color: #24292e;">interval</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #6f42c1;">setInterval</span><span class="token">(</span><span class="token" style="color: #d73a49;">function</span><span class="token">(</span><span class="token">)</span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #24292e;">$</span><span class="token">.</span><span class="token" style="color: #6f42c1;">ajax</span><span class="token">(</span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token">url</span><span class="token">:</span><span class="token"> ’</span><span class="token" style="color: #032f62;">/</span><span class="token" style="color: #032f62;">progress-job</span><span class="token" style="color: #032f62;">/</span><span class="token">’ </span><span class="token" style="color: #d73a49;">+</span><span class="token"> #</span><span class="token">{</span><span class="token">@job.</span><span class="token" style="color: #24292e;">id</span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #6f42c1;">success</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">function</span><span class="token">(</span><span class="token" style="color: #e36209;">job</span><span class="token">)</span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">var</span><span class="token"> </span><span class="token" style="color: #24292e;">stage</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">progress</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> If there are errors</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">job</span><span class="token">.</span><span class="token" style="color: #24292e;">last_error</span><span class="token"> </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> </span><span class="token" style="color: #005cc5;">null</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">status</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">addClass</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">text</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">danger</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token">(</span><span class="token" style="color: #24292e;">job</span><span class="token" style="color: #24292e;">.progress_stag</span><span class="token">e</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">bar</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">addClass</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">progress</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">bar</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">danger</span><span class="token">’</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">removeClass</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">active</span><span class="token">’</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token" style="color: #6f42c1;">clearInterval</span><span class="token">(</span><span class="token" style="color: #24292e;">interval</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #24292e;">progress</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #24292e;">job</span><span class="token">.</span><span class="token" style="color: #24292e;">progress_current</span><span class="token"> </span><span class="token" style="color: #d73a49;">/</span><span class="token"> </span><span class="token" style="color: #24292e;">job</span><span class="token">.</span><span class="token" style="color: #24292e;">progress_max</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token"> </span><span class="token" style="color: #005cc5;">100</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> In job stage</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #24292e;">progress</span><span class="token">.</span><span class="token" style="color: #6f42c1;">toString</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">!==</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">NaN</span><span class="token">’</span><span class="token">)</span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">status</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token">(</span><span class="token" style="color: #24292e;">job</span><span class="token" style="color: #24292e;">.progress_curren</span><span class="token">t</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> ’</span><span class="token" style="color: #d73a49;">/</span><span class="token">’ </span><span class="token" style="color: #d73a49;">+</span><span class="token"> </span><span class="token" style="color: #24292e;">job</span><span class="token" style="color: #24292e;">.progress_ma</span><span class="token">x</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">          </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">bar</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">css</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">width</span><span class="token">’</span><span class="token">,</span><span class="token"> </span><span class="token" style="color: #24292e;">progress</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> ’</span><span class="token" style="color: #d73a49;">%</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token">(</span><span class="token" style="color: #24292e;">progress</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> ’</span><span class="token" style="color: #d73a49;">%</span><span class="token">’</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token">}</span><span class="token">,</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token" style="color: #6f42c1;">error</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">function</span><span class="token">(</span><span class="token">)</span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Job is no loger in database which means it finished successfuly</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">removeClass</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">active</span><span class="token">’</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">bar</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">css</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">width</span><span class="token">’</span><span class="token">,</span><span class="token"> ’</span><span class="token" style="color: #005cc5;">100</span><span class="token" style="color: #d73a49;">%</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #005cc5;">100</span><span class="token" style="color: #d73a49;">%</span><span class="token">’</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.progres</span><span class="token">s</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">status</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">text</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">Successfully</span><span class="token"> </span><span class="token" style="color: #24292e;">exported</span><span class="token" style="color: #d73a49;">!</span><span class="token">’</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">$</span><span class="token">(</span><span class="token">’</span><span class="token" style="color: #24292e;">.expor</span><span class="token">t</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #24292e;">link</span><span class="token">’</span><span class="token">)</span><span class="token">.</span><span class="token" style="color: #6f42c1;">show</span><span class="token">(</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6f42c1;">clearInterval</span><span class="token">(</span><span class="token" style="color: #24292e;">interval</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">      </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">}</span><span class="token">,</span><span class="token" style="color: #005cc5;">100</span><span class="token">)</span><span class="token">;</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/progress-bar-in-rails/">Progress Bar in Rails</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>8060https://infinum.com/uploads/2014/02/how-to-get-your-website-to-comply-with-the-eu-cookie-law-0.webp</url>
				</image>
				<title>How to Get Your Website to Comply with the EU Cookie Law?</title>
				<link>https://infinum.com/blog/how-to-get-your-website-to-comply-with-the-eu-cookie-law/</link>
				<pubDate>Wed, 14 Aug 2013 08:28:00 +0000</pubDate>
				<dc:creator>Stjepan Hadjić</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/how-to-get-your-website-to-comply-with-the-eu-cookie-law/</guid>
				<description>
					<![CDATA[<p>In May 2011, the Information Commissioner&#8217;s Office first announced that websites have to explicitly seek consent for cookies.</p>
<p>The post <a href="https://infinum.com/blog/how-to-get-your-website-to-comply-with-the-eu-cookie-law/">How to Get Your Website to Comply with the EU Cookie Law?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-548"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-489">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-492"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-490">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-491'
	>
	In May 2011, the Information Commissioner’s Office first announced that websites have to explicitly seek consent for cookies (cookies are text files that record your activity online). Later known as the EU cookie law, it took effect in May 2012 with a grace period of a year.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-495"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-493">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-494'
	>
	Developers were outraged, every website in the EU would become illegal, and users would not be happy with popups every second or so. Interestingly, 24 hours before the prosecutions started, there had been a clarification of the law that said you only needed to have implied consent from users to use cookies.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-498"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-496">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-497'
	>
	What’s the cookie law all about?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-501"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-499">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-500'
	>
	The cookie law is a piece of privacy legislation that requires websites to obtain consent from visitors to store or retrieve any information from a computer or any other web-connected device, like a smartphone or tablet.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-504"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-502">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-503'
	>
	It has been designed to protect online privacy, by making consumers aware of how information about them is collected by websites, and enable them to choose whether or not they want to allow it to take place.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-507"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-505">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-506'
	>
	If you are based in the EU and own a website, you are now <strong>expected to comply with the law</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-510"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-508"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-509">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2014/02/how-to-get-your-website-to-comply-with-the-eu-cookie-law-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="563"
															width="750"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-513"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-511">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-512'
	>
	How to comply to the EU cookie law?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-516"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-514">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-515'
	>
	The easiest way to comply with the cookie law is to follow the accepted standard: <strong>implied consent</strong>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-519"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-517">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-518'
	>
	Implied consent does not require a visitor to explicitly opt-in to the use of cookies on a website. However, it does mean there has to be an action taken by the user to confirm that consent is given, after there has been sufficient attempt to clearly inform the user about the use of cookies on the website.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-522"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-520">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-521'
	>
	These actions may be moving from one page to another, clicking on particular buttons on the website or choosing to continue to use the website.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-525"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-523">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-524'
	>
	<li><a href="http://econsultancy.com/hr/blog/10205-20-examples-of-eu-cookie-law-compliance">20+ examples of EU cookie compliance</a></li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-528"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-526">
	<h3	class='typography typography--size-36-text js-typography block-heading__heading'
	data-id='es-527'
	>
	What are the penalties if you do not comply?</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-531"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-529">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-530'
	>
	The maximum penalty is £500,000. Whilst this is the ‘maximum’, its worth pointing out that this would be a rather extreme case of failure to comply. A formal warning and enforcement notice are far more likely, but should be avoided nonetheless.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-534"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-532">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-533'
	>
	How we did it?</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-537"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-535">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-536'
	>
	Since we deploy a lot of web applications and websites for our clients and ourselves, we wanted to develop a standard system for resolving this issue.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-540"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-538">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-539'
	>
	We took inspiration from <a href="http://www.google.co.uk">Google’s</a> approach, as you probably noticed when you visited our site. We added a simple floating element to our page that says that we use cookies, and if you don’t disable them in your browser settings, you are OK with us using cookies to enhance your experience.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-543"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-541">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-542'
	>
	As we work primarily with <a href="http://rubyonrails.org/">Ruby on Rails</a>, we created the <a href="https://github.com/infinum/cookies_eu">cookies_eu gem</a> to make any web application simple to comply by just adding the gem to the Gemfile. It’s open source, and you’re welcome to use it for your own Ruby on Rails applications.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-546"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-544">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-545'
	>
	If you don’t use Ruby on Rails, you can probably roll your own solution quickly in the technology you favor. We’ve provided a sample of a cookie privacy page that needs to be located somewhere on your webpage, which you can <a href="https://github.com/infinum/cookies_eu#sample-of-cookie-info-in-haml-form">see here</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/how-to-get-your-website-to-comply-with-the-eu-cookie-law/">How to Get Your Website to Comply with the EU Cookie Law?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>