<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Where I write about the things I find interesting on Esteban Sastre</title><link>https://www.estebansastre.com/</link><description>Recent content in Where I write about the things I find interesting on Esteban Sastre</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 24 Jan 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.estebansastre.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Real estate metrics: Cap Rate</title><link>https://www.estebansastre.com/blog/2026/01/24/real-estate-metrics-cap-rate/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2026/01/24/real-estate-metrics-cap-rate/</guid><description>I already mentioned Cap Rate in this other post as a comparative metric for Cash-on-Cash.
As a reminder, the formula for the Cap Rate is:
$$ Cap \space Rate = \frac{Net \space Operating \space Income \space (NOI)}{Property \space Price} $$ This is another handy metric that allows you to answer the question &amp;ldquo;How good is this property independent of my financing?&amp;rdquo;, or putting it in a different way, &amp;ldquo;What is the return of this property if I paid for it all cash?</description></item><item><title>Real estate metrics: Cash-on-Cash</title><link>https://www.estebansastre.com/blog/2026/01/04/real-estate-metrics-cash-on-cash/</link><pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2026/01/04/real-estate-metrics-cash-on-cash/</guid><description>I&amp;rsquo;ve been wanting to dive deep into better understanding the world of real estate investing taking a more analytical approach.
Here in Spain, despite the housing crisis that we are going through, real estate or &amp;ldquo;el ladrillo 🧱&amp;rdquo; as we call it, remains the number one asset and generally the most popular of all when it comes to parking our money. It is ingrained in our common imagination and shared culture to first and foremost invest in bricks that we can touch and sort of dismiss other alternatives like the stock market, perfectly illustrated in our common phrase &amp;ldquo;jugar en bolsa&amp;rdquo; (the use of the word jugar -&amp;gt; play in the stock market, as opposed to invertir -&amp;gt; invest).</description></item><item><title>What is the French amortization system for mortgages and how does it work</title><link>https://www.estebansastre.com/blog/2025/03/31/mortgage-loan-french-amortization/</link><pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2025/03/31/mortgage-loan-french-amortization/</guid><description>There are many variations of this sentence I hear when talking with people about getting a mortage:
At first you&amp;rsquo;re paying mostly interest but over time you pay less interest and more goes to the house.
But I never really stopped to understand what does it mean exactly. Enter the French Loan Amortization System.
What is this? When you get a mortage loan (or any loan) with a fixed interest rate, every month you&amp;rsquo;re paying an established amount of money based on the quantity of the loan, the interest rate and the total number of payments (how long will you take to repay that loan).</description></item><item><title>What is the Discounted Cash Flow Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/12/21/discounted-cash-flow-startup-valuation-method/</link><pubDate>Wed, 21 Dec 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/12/21/discounted-cash-flow-startup-valuation-method/</guid><description>What is it? The Discounted Cash Flow valuation method is a way to determine the intrinsic value of a startup based on its expected future cash flows.
The idea behind the DCF method is that the value of an asset or business is the sum of all of its future cash flows, discounted back to their present value (so future earnings are worth less today than in the future). It can be applied for both established companies and startups, if not with some caution and tweaking for the latter.</description></item><item><title>What is the Liquidation Value Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/11/15/liquidation-value-startup-valuation-method/</link><pubDate>Tue, 15 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/11/15/liquidation-value-startup-valuation-method/</guid><description>What is it? The Liquidation Value valuation method shares some similarities with the Book Value method, but the way they arrive at a final valuation is fairly different.
The fundamental difference between the two methods is:
The Book value is calculated by subtracting the total liabilities from the total assets. Book Value = Total assets (tangible + intangible) - Total liabilities Thus the Book Value represents the company&amp;rsquo;s worth as per its balance sheet in a given moment of time, stating the historical cost of assets.</description></item><item><title>What is the Book Value Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/11/05/book-value-startup-valuation-method/</link><pubDate>Sat, 05 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/11/05/book-value-startup-valuation-method/</guid><description>What is it? In the public and profitable companies universe, the book value of an asset represents the price as purchased in the balance sheet with it&amp;rsquo;s accumulated depreciation subtracted.
In the case of a whole company, it represents the total sum of assets, tangible (machinery, real estate, materials) and intangible (patents, copyrights, brand value, network) less the liabilities (deferred tax, mortgages, bonds, debt in general).
On a personal note this method doesn&amp;rsquo;t fit exactly to be a good method for startup valuations as the calculations rely solely on quantitative methods and hard numbers.</description></item><item><title>What is the Gross Profit x Competitor’s Multiple Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/11/02/gross-profit-competitors-multiple-startup-valuation-method/</link><pubDate>Wed, 02 Nov 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/11/02/gross-profit-competitors-multiple-startup-valuation-method/</guid><description>What is it? The Gross Profit x Competitor&amp;rsquo;s Multiple method is based on a simple formula:
Gross Profit (i.e. Last 12 months) x Competitor&amp;#39;s Multiple It is thus evident that this method is to be applied to startups that have already conquered the no-revenue threshold and are growing at a healthy pace.
The idea behind this simple formula is to use the Gross Profit magnitude as a solid indicator of growth, company health, and market penetration.</description></item><item><title>What is the 5x Your Raise Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/10/21/five-times-your-raise-startup-valuation-method/</link><pubDate>Fri, 21 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/10/21/five-times-your-raise-startup-valuation-method/</guid><description>What is it? The 5x Your Raise valuation method might be one of the simplest ones to understand, almost feels tongue-in-cheek, because it leaps over any quantitative or qualitative methods to evaluate the startup and it simply bases itself in a simple assumption:
Most investors whant to see the valuation for their money representing around 20%-25% of the post-money valuation
So for any particular investment a potential VC/Angel investor is willing to make, using the 5x Your Raise estimates a post-money valuation of any startup at around 4-5 times the money they put in.</description></item><item><title>What is the First Chicago Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/10/15/five-times-your-raise-startup-valuation-method/</link><pubDate>Sat, 15 Oct 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/10/15/five-times-your-raise-startup-valuation-method/</guid><description>What is it The First Chicago valuation method differs from other methods I&amp;rsquo;ve listed up until now, like Scorecard, Berkus or Venture Capital, in the fact that not only qualitative analysis come into play, but additional financial projection is needed to implement it.
While other methods are fundamentally pre-revenue and rely more on market analysis, comparison with other startups or risk management analysis, the First Chicago method depends on cashflow and earnings to calculate the final valuation, thus a level of growth &amp;amp; revenue is expected in the startup.</description></item><item><title>What is the Venture Capital Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/09/30/venture-capital-startup-valuation-method/</link><pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/09/30/venture-capital-startup-valuation-method/</guid><description>What is it? The last one of the pre-money, pre-revenue startup valuation methods I&amp;rsquo;ve been covering, the Venture Capital method is the preferred method for VCs all around (that&amp;rsquo;s pretty much from where it got the name).
Deal sourcing entails a long process of discovery and analysis of potential startups to incorporate to a VC portfolio. When it comes to pre-revenue startups there is also a void of financial data to extract projections, thus the analysis must rely on more qualitative methods, and those are by nature slower to evaluate.</description></item><item><title>My experience at Nosday 2022</title><link>https://www.estebansastre.com/blog/2022/09/19/nosday/</link><pubDate>Mon, 19 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/09/19/nosday/</guid><description>This past Saturday 17th September I had the chance of assisting to the Nosday 2022 edition in Santiago de Compostela, Galicia, Spain.
It&amp;rsquo;s been around 6 months since I came to live back to my hometown in Galicia after so long living in Belgium. After some time here I started connecting back to old university classmates. Some I contacted directly, some I just stumbled upon in the street, it is a small city here 😄.</description></item><item><title>What is the Risk Factor Summation Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/09/18/risk-factor-summation-startup-valuation-method/</link><pubDate>Sun, 18 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/09/18/risk-factor-summation-startup-valuation-method/</guid><description>What is it? Still, amongst the pre-money, pre-revenue startup valuation methods such as the Scorecard or Berkus methods, falls the Risk Factor Summation valuation method.
It is a valuation method that emphasizes the risk associated with creating a startup in a given industry and location. Much like Scorecard, the Risk Factor Summation method uses a base value extracted from averaging out comparable startups in the same niche &amp;amp; geographical location and adjusts accordingly comparing the reference value against 12 common risk factors.</description></item><item><title>What is the Valuation by Stage Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/09/06/valuation-by-stage-startup-valuation-method/</link><pubDate>Tue, 06 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/09/06/valuation-by-stage-startup-valuation-method/</guid><description>What is it? By using the Valuation-by-Stage, we grok the possible valuation of a startup by pondering the risk that is still present in the current stage of a startup. The further a company is in their development, the (theoretically) less possible disastrous outcomes are prone to materialize.
It is a &amp;ldquo;rule-of-thumb&amp;rdquo; approach that can be used by assigning a valuation range to each stage of the development of the startup.</description></item><item><title>What is the Cost-to-Duplicate Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/09/05/cost-to-duplicate-startup-valuation-method/</link><pubDate>Mon, 05 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/09/05/cost-to-duplicate-startup-valuation-method/</guid><description>What is it? Quite straightforward, the Cost-to-Duplicate approach to value startups focuses on the costs &amp;amp; expenses that took to create the startup. It measures how much it would cost to recreate the company from scratch. The idea behind it is that a potential investor wouldn&amp;rsquo;t allow a higher valuation than the aggregate sum of the expenses that took the company to get to that point.
This is quite straightforward to calculate for physical companies, and for online-based SaaS-type businesses the final figure could be worked out as the overall cost of development poured into making the software.</description></item><item><title>What is the Berkus Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/09/02/berkus-startup-valuation-method/</link><pubDate>Fri, 02 Sep 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/09/02/berkus-startup-valuation-method/</guid><description>What is it? The Berkus method is a pre-revenue valuation approach based solely in qualitative methods, much like the Scorecard Valuation Method discussed before.
Few startups manage to meet their financial projections especially in very early stages, so valuation approaches like the Berkus method is a sound way to provide a valuation when the economic metrics are still not solid, or enough, to grant an accurate valuation.
How it works? This methodology aims to provide a valuation based on five key success dimensions:</description></item><item><title>What is the Scorecard Startup Valuation Method?</title><link>https://www.estebansastre.com/blog/2022/08/30/scorecard-startup-valuation-method/</link><pubDate>Tue, 30 Aug 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/08/30/scorecard-startup-valuation-method/</guid><description>What is it The scorecard valuation method is a technique formulated by Bill Payne, a US angel investor in 2001 to approximate the valuation of pre-revenue startups for possible investment rounds. It is based purely on qualitative methods since at that stage of the life of the startup it doesn&amp;rsquo;t have enough financial data to make economic projections.
How it works The scorecard valuation method compares the startup to evaluate with other similar funded startups in the sector and adjusts the value based upon 7 different parameters:</description></item><item><title>Twilio Client resilient setup</title><link>https://www.estebansastre.com/blog/2022/08/08/create-twilio-client-join-conversation/</link><pubDate>Mon, 08 Aug 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/08/08/create-twilio-client-join-conversation/</guid><description>With Twilio Conversations SDK 2.0 release there is a new way of creating the client and setting up the event handlers. As stated in the documentation and contrary to previous versions, when the client is created in order to guarantee it has been properly initialized we must wait for the stateChanged event to fire and check the passed state to verify the initialization was completed:
import { Client } from &amp;#39;@twilio/conversations&amp;#39;; const client = new Client(token); // Before you use the client, subscribe to the `&amp;#39;stateChanged&amp;#39;` event and wait // for the `&amp;#39;initialized&amp;#39;` state to be reported.</description></item><item><title>What is a convertible loan and how do they work</title><link>https://www.estebansastre.com/blog/2022/06/06/what-is-a-convertible-loan/</link><pubDate>Mon, 06 Jun 2022 16:23:56 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/06/06/what-is-a-convertible-loan/</guid><description>Introduction Going from being an employee my whole professional career to cofounding TheGoodPsy in 2020 meant transitioning from focusing solely on the responsibilities directly pegged to my software engineering role to a whole slew of business concepts I needed to get acquainted with. In Spanish we have the expression Por la cuenta que me trae, which could roughly be translated to because now you account for them.
Although still focused primarily on designing and implementing the technical roadmap and strategy for our digital product, I&amp;rsquo;ve had to make an effort into grasping concepts from marketing, accounting, or startup valuations.</description></item><item><title>Send emails asynchronously from Sendgrid with node.js, AWS SQS &amp; Lambda</title><link>https://www.estebansastre.com/blog/2022/06/06/send-emails-node-sqs-lambda-sendgrid/</link><pubDate>Mon, 06 Jun 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/06/06/send-emails-node-sqs-lambda-sendgrid/</guid><description>Recently in TheGoodPsy we experienced an uptick in the number of signups &amp;amp; concurrent users. This is generally a good thing, an increase in traffic means that a project is gaining traction (or a DDoS attack but we surely hope it wasn&amp;rsquo;t that and those kind of attacks would generate way more traffic than the numbers we were experiencing).
Our backend is in node.js and we deploy in the AWS ecosystem.</description></item><item><title>Show Google Calendar events in Fullcalendar with React</title><link>https://www.estebansastre.com/blog/2022/06/06/google-calendar-events-fullcalendar-react/</link><pubDate>Mon, 06 Jun 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/06/06/google-calendar-events-fullcalendar-react/</guid><description>For convenience, Psychologists in TheGoodPsy are able to connect to their Google Calendar to see their events along with the appointments local to the platform in order to prevent clashes between the two. It is quite easy to add an appointment with a patient in one calendar and propose an appointment in the other without noticing.
Google Identity Services became the new authentication flow enforced by Google, forcing newly created credentials to use it by default without allowing to fallback to Google Sign-In Platform.</description></item><item><title>Render a loader contidionally in React with a High Order Component</title><link>https://www.estebansastre.com/blog/2022/05/15/conditional-render-hoc-react/</link><pubDate>Sun, 15 May 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/05/15/conditional-render-hoc-react/</guid><description>There are multiple places where we load data asynchronously in TheGoodPsy, so we use the ReactLoading package to show a spinner while the data is being downloaded and processed in the frontend.
There is a common block of code that gets repeated:
{loading ? ( &amp;lt;ReactLoading className=&amp;#34;chat-loader&amp;#34; type=&amp;#34;spin&amp;#34; color={COLOR} /&amp;gt; ) : &amp;lt;&amp;gt;whatever content here&amp;lt;/&amp;gt;} Sometimes the loader needs to be wrapped in a different html skeleton, being the perfect place to use a render prop.</description></item><item><title>Startup Nuggets #5: Document Everything</title><link>https://www.estebansastre.com/blog/2022/05/04/startup-nuggets-series-document-everything/</link><pubDate>Wed, 04 May 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/05/04/startup-nuggets-series-document-everything/</guid><description>Over the course of TheGoodPsy&amp;rsquo;s life, there have been countless changes.
In order to verify assumptions, we&amp;rsquo;ve tried different marketing strategies, UI changes, user flow tweaks, and anything to verify what works and what doesn&amp;rsquo;t when it comes to user acquisition and retention.
We started out using a simple WordPress to test out the idea and add personalized logic with custom-developed plugins and sprinkling javascript here and there.
Once we reached the limit in terms of what we could do with WordPress, we moved into a no-code solution: Bubble.</description></item><item><title>Basic memoizer function in Javascript</title><link>https://www.estebansastre.com/blog/2022/04/27/memoizer-function-javascript/</link><pubDate>Wed, 27 Apr 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/04/27/memoizer-function-javascript/</guid><description>A basic user flow in TheGoodPsy is to allow patients to book appointments directly from the chat.
In order to do so, we have a Calendar component inside the application that wraps a FullCalendar component and extends its functionality with our custom logic.
We mainly use the day view where the patient has a glimpse of the slots available with their psychologist 24 hours from the current moment. This is to allow psychologists some room to maneuver and not have a Patient potentially booking an appointment within the next couple of hours they connect.</description></item><item><title>Startup Nuggets #4: Choose the Inelegant Solution</title><link>https://www.estebansastre.com/blog/2022/03/27/startup-nuggets-series-choose-the-inelegant-solution/</link><pubDate>Sun, 27 Mar 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/03/27/startup-nuggets-series-choose-the-inelegant-solution/</guid><description>Choose the hacky-unelegant-put-together solution before the good, well-thought one. There are plenty of times where there’s a need for a feature to be shipped, as we’re receiving pressure from stakeholders to have it available as soon as possible, or we have a deadline for an integration with a partner and they make a last minute change that in their eyes is “just this small tweak”.
A good engineer would spend a sensible amount of time thinking a robust, generic, extendable and testable solution, paying attention to all the moving pieces the aforementioned feature touches.</description></item><item><title>Startup Nuggets #3: Staying Technically Relevant</title><link>https://www.estebansastre.com/blog/2022/03/08/startup-nuggets-series-staying-technically-relevant/</link><pubDate>Tue, 08 Mar 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/03/08/startup-nuggets-series-staying-technically-relevant/</guid><description>It becomes harder to keep your technical skills up to date.
As the main technical person of the company, it can be a contradictory statement. Since I have to wear many hats, even if those hats are limited to the technical domain, there&amp;rsquo;s little time I can devote to experimenting. Learning a new language or framework consumes time that could be better employed in improving the current state of the tech stack.</description></item><item><title>Startup Nuggets #2: Motivation and Personal Investment</title><link>https://www.estebansastre.com/blog/2022/02/13/startup-nuggets-series-motivation-and-personal-investment/</link><pubDate>Sun, 13 Feb 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/02/13/startup-nuggets-series-motivation-and-personal-investment/</guid><description>One can&amp;rsquo;t expect people to have the same level of investment as you have in your own startup. It might happen, but one cannot assume. There are multiple dimensions to this.
It’s not realistic for an employee (less a freelancer) to have the same level of dedication and nurture you exert. A certain level of motivation can be instilled in a person, and that varies depending on the kind of work, the project, the person&amp;rsquo;s personality, etc.</description></item><item><title>Startup Nuggets #1: Multiple Responsibilities</title><link>https://www.estebansastre.com/blog/2022/02/08/startup-nuggets-series-multiple-responsibilities/</link><pubDate>Tue, 08 Feb 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/02/08/startup-nuggets-series-multiple-responsibilities/</guid><description>As a developer, your work is structured, at least most of the time. A regular working day used to start by arriving at the office (remember?), getting your coffee, checking some emails, doing your daily standup where you get a grasp of what&amp;rsquo;s going on for everyone during that day, you expose your work as well: what did I do yesterday, what am I doing today, what are my blockers. Then you sit in front of the PC.</description></item><item><title>Startup Nuggets Series</title><link>https://www.estebansastre.com/blog/2022/02/08/startup-nuggets-series/</link><pubDate>Tue, 08 Feb 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/02/08/startup-nuggets-series/</guid><description>Normally I would be working on a non-tech related task, such as writing an entry in Notion for a new feature for a developer to implement, or dealing with the back &amp;amp; forth of expectations when hiring a freelancer for a given task, and it strikes me: &amp;ldquo;I could write a nice blog post about the lesson I&amp;rsquo;m taking out of this&amp;rdquo;.
So I jot the learning down, try to add a couple more observations I&amp;rsquo;ve had while working on something similar and promise to myself to get back to adding more valuable fragments to the list to eventually have a big enough one to share.</description></item><item><title>New Year's Resolutions for 2022</title><link>https://www.estebansastre.com/blog/2022/01/02/2022-new-year-resolutions/</link><pubDate>Sun, 02 Jan 2022 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2022/01/02/2022-new-year-resolutions/</guid><description>Another year another corny-ass new year&amp;rsquo;s resolutions post! It seems to make no sense to state the word &amp;ldquo;another&amp;rdquo; in the first sentence, but the crushing reality is that for the last two years I sought out to write my new year&amp;rsquo;s resolutions blog post around 28th December and by the 10th January of the next year my best intentions already faded and those posts were never written. So by putting this baby into writing I already got one of those resolutions done!</description></item><item><title>Graceful error handling in redux asynchronous actions</title><link>https://www.estebansastre.com/blog/2021/12/16/graceful-error-handling-redux-functions/</link><pubDate>Thu, 16 Dec 2021 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2021/12/16/graceful-error-handling-redux-functions/</guid><description>For React applications I often use Redux as my state management library of choice because of its simplicity, stability, added plugins, and predictability. I find it easier to reason about data flow if I imagine it as a set of snapshots that are computed from the previous one depending on the actions the user or the business logic takes. That notion of immutability has had a beneficial impact on the way I construct and debug my programs.</description></item><item><title>Wordpress shortcomings when creating a web application</title><link>https://www.estebansastre.com/blog/2020/05/10/wordpress-shortcomings/</link><pubDate>Sun, 10 May 2020 19:34:02 +0200</pubDate><guid>https://www.estebansastre.com/blog/2020/05/10/wordpress-shortcomings/</guid><description>Introduction Recently this week I was discussing with a friend whether Wordpress could be a viable choice for a web application over a custom solution in order to have a working MVP as fast as possible. This app would include some more complex features such as in-app video chat &amp;amp; messaging.
Ideally the huge amount of available plugins combined with the ease of installation and minimal code would provide a solid solution almost out of the box.</description></item><item><title>Differences between Dubbel, Tripel &amp; Quadrupel beer</title><link>https://www.estebansastre.com/blog/2020/04/03/beer-dubbel-triplel-quadrupel/</link><pubDate>Fri, 03 Apr 2020 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2020/04/03/beer-dubbel-triplel-quadrupel/</guid><description>Dubbel? Tripel? Quadrupel?
Don&amp;rsquo;t belgians have enough by having over 1600 different beers to confuse and marvel us? What are those denominations we constantly hear the moment we step foot in this lovely country?
There&amp;rsquo;s a lot of folktales around the specific origin of such terms with not much agreement. Some say it&amp;rsquo;s due to being double, triple or quadruple fermentation, some argue they take the name from the amount of malt of the previous type (for example, a triple having three times as much malt).</description></item><item><title>Trappist Beer</title><link>https://www.estebansastre.com/blog/2020/04/01/trappist-beer/</link><pubDate>Wed, 01 Apr 2020 01:17:35 +0200</pubDate><guid>https://www.estebansastre.com/blog/2020/04/01/trappist-beer/</guid><description>Such a symbol of belgian tradition must not remain unexplained.
What is indeed, a Trappist beer?
Trappist beers constitute the flagship or belgian beer. The name references a type of beer brewed by a given catholic order of monks denominated as Trappist (or officially known as Order of Cistercians of the Strict Observance). They stand as a religious order of cloistered monks that branched from the Cistercians.
This very specific denomination is only allowed to fourteen monasteries around the world to describe their beer production, as recognized by the International Trappist Association.</description></item><item><title>Writing Other Content</title><link>https://www.estebansastre.com/blog/2020/04/01/writing-other-content/</link><pubDate>Wed, 01 Apr 2020 01:17:34 +0200</pubDate><guid>https://www.estebansastre.com/blog/2020/04/01/writing-other-content/</guid><description>For the last 8 months I have been working at Beer Planet and I took over the task of improving the shop&amp;rsquo;s online presence in Instagram and Facebook. I am still thinking of a comfortable way of using Twitter and Linkedin and ads for the matter, but that&amp;rsquo;s a future endeavor.
Every once in a while I redact informational posts I might find interesting based on common questions many clients ask, misunderstandings about processes or nomenclature, or pure curiosity from my side.</description></item><item><title>Adding quotes to tmux status bar</title><link>https://www.estebansastre.com/blog/2020/03/13/funny-quotes-tmux-statusbar/</link><pubDate>Fri, 13 Mar 2020 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2020/03/13/funny-quotes-tmux-statusbar/</guid><description>After reading Jezen Thomas&amp;rsquo; cool blog post about Showing Weather in Tmux, I tried it in my computer and loved the result after minor tweaks: From that moment it also occurred to me that next to the weather, date and time I would love to have a greeting sentence in my local language, galician, to bring back the warm and fuzzy feeling of being at home after being away already for five years.</description></item><item><title>Oh no, I forgot my PGP private key's passphrase</title><link>https://www.estebansastre.com/blog/2019/04/14/oh-no-i-forgot-my-private-keys-passphrase/</link><pubDate>Sun, 14 Apr 2019 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2019/04/14/oh-no-i-forgot-my-private-keys-passphrase/</guid><description>Introduction After being quite disconnected from the technology world for months and pretty much limiting my interactions to my working schedule, I decided to go back into setting up my personal workstation with the minimal memory footprint and using as little privacy-invading technologies as possible.
One step of this process meant setting up again my GPG keys to be used while signing my emails. Thus, I retrieve my private key from an offline medium I keep safe and check whether the corresponding generated public key matches the one I have broadcasted publicly.</description></item><item><title>Making POST requests work with Django tests</title><link>https://www.estebansastre.com/blog/2019/02/10/making-post-requests-work-with-django-tests/</link><pubDate>Sun, 10 Feb 2019 18:03:35 +0000</pubDate><guid>https://www.estebansastre.com/blog/2019/02/10/making-post-requests-work-with-django-tests/</guid><description>It is the second time at work that I spent some minutes wondering why I was not properly receiving POST arguments in a view when testing it from django.
Let&amp;rsquo;s have a little more context, imagine a very simple Django view where you want to print the value of a POST parameter in the console and return it.
class MyView(views.APIView): def post(self, request): param = request.POST.get(&amp;#39;param&amp;#39;, None) print(param) return param So I manually test this with curl:</description></item><item><title>Writing a simple Inverted Index in Python</title><link>https://www.estebansastre.com/blog/2018/10/22/writing-a-simple-inverted-index-in-python/</link><pubDate>Mon, 22 Oct 2018 12:47:56 +0000</pubDate><guid>https://www.estebansastre.com/blog/2018/10/22/writing-a-simple-inverted-index-in-python/</guid><description>Introduction Nowadays is not uncommon that web applications include full text search features. There are already well known solutions working out-of-the-box that provide the needed functionalities, such as ElasticSearch or Apache Solr.
Having used ElasticSearch at work a couple of times I wondered how it achieved fast searches and what mechanism empowered that, so reading up a little on the topic, the Inverted Index appears as the cornerstone of full text search algorithms.</description></item><item><title>How to choose your next tech side project</title><link>https://www.estebansastre.com/blog/2018/06/18/how-to-choose-your-next-tech-side-project/</link><pubDate>Mon, 18 Jun 2018 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2018/06/18/how-to-choose-your-next-tech-side-project/</guid><description>Introduction Besides the day-by-day work, I like to always have an ongoing side project to keep my skills sharp. These don&amp;rsquo;t have to be necessarily useful or directly linked to my current job, but serve as a distraction to throw some spare hours into.
Normally those projects have a bunch of common traits:
They are purposely small. They focus on a single defined task. I try to add at least one element of novelty on them (language, framework, programming paradigm).</description></item><item><title>Understanding requestAnimationFrame</title><link>https://www.estebansastre.com/blog/2018/05/29/understanding-requestanimationframe/</link><pubDate>Tue, 29 May 2018 15:18:12 +0000</pubDate><guid>https://www.estebansastre.com/blog/2018/05/29/understanding-requestanimationframe/</guid><description>Introduction I never quite got what was the requestAnimationFrame function I kept seeing while reading web articles since I never really dove deep in graphics in the browser. Still, I think it will be a good exercise and reminder for the future to write a small article to structure and understand the basic concept and usage of the function.
Overview For the human brain to be fooled into thinking that a sequence of images flow into movement (animate), you need to provide at least 24 images (frames) per second, otherwise you&amp;rsquo;ll start to notice cuts.</description></item><item><title>Year 2017 review and resolutions</title><link>https://www.estebansastre.com/blog/2018/01/09/year-2017-review-and-resolutions/</link><pubDate>Tue, 09 Jan 2018 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2018/01/09/year-2017-review-and-resolutions/</guid><description>Every time a new year passes by I feel a mix of two reactions: on one side, my first impression is always of a slight disappointment, as if I had not accomplished anything worth mentioning or hadn&amp;rsquo;t made much more of a change compared to how I was when the year first started.
Then, I try to keep a cold mind and start enumerating the nice, interesting things I have done and learned, as well as all the new friendships made and the strengthening of existing ones, and slowly I tear down the thin depression web I made myself lay upon me.</description></item><item><title>mdlink: Linking multiple node modules with a single command</title><link>https://www.estebansastre.com/blog/2017/12/20/mdlink-linking-multiple-node-modules-with-a-single-command/</link><pubDate>Wed, 20 Dec 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/12/20/mdlink-linking-multiple-node-modules-with-a-single-command/</guid><description>Introduction As part of the process of working in node.js applications, developers usually use additional libraries and frameworks to ease and speed their development time, and more than often the number of libraries they rely upon is quite high.
It is also not uncommon to need to modify any of those libraries to fix a bug, or fork them to add additional functionality required for the project they are being used in.</description></item><item><title>Ember Cookies over SSL</title><link>https://www.estebansastre.com/blog/2017/12/16/ember-cookies-ssl/</link><pubDate>Sat, 16 Dec 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/12/16/ember-cookies-ssl/</guid><description>Problem I am currently working on an issue in a very old Ember.js application (version 1.13.0 of the ember-cli). After performing the regular ritual: npm install; bower install; ember s --proxy &amp;lt;proxy&amp;gt; I was presented with the application&amp;rsquo;s login screen, but what was my surprise that after introducing a valid set of credentials, the next http call invariably failed.
Client -&amp;gt; POST /sessions -&amp;gt; Server API (works) Client -&amp;gt; GET /settings -&amp;gt; Server API (fails) Now, the code wasn&amp;rsquo;t changed in the frontend so there was a slight chance the backend would be the culprit.</description></item><item><title>Understanding PGP</title><link>https://www.estebansastre.com/blog/2017/12/07/understanding-pgp/</link><pubDate>Thu, 07 Dec 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/12/07/understanding-pgp/</guid><description>Overview I&amp;rsquo;ve had the intention of writing an article about PGP for a long time, but every time I started reading about the topic I almost immediately brushed the idea off. I believe this is spurred by the fact that understanding it is not quite simple.
Just as monads, once you get the hang of it it becomes evident and you automatically lose the ability to communicate the concept to others.</description></item><item><title>Array of extended objects in python using list comprehensions and lambda functions</title><link>https://www.estebansastre.com/blog/2017/12/04/array-extended-objects-python/</link><pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/12/04/array-extended-objects-python/</guid><description>Problem It&amp;rsquo;s been a while since I don&amp;rsquo;t write any posts, so I thought that even though the idea might be initially quite silly, it will help me to kickoff again the habit by writing about a small problem I encountered the other day.
I was developing a very simple microservice that would receive a GET request with two parameters, issue a SPARQL query to a Virtuoso store and then, transform the returned array of objects by extending each object with the same additional meta information per object.</description></item><item><title>Clojure threading macros in ES6</title><link>https://www.estebansastre.com/blog/2017/09/10/clojure-macros-in-es6/</link><pubDate>Sun, 10 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/09/10/clojure-macros-in-es6/</guid><description>While working in the functionality for getting a docker-compose path from the cursor position, I realized at some point I was writing constantly code like this:
let first_result = func_call1(val); let second_result = func_call2(first_result); let third_result = func_call3(second_result); ...etc... This is not necessarily bad, it improves code readability and helps to reason about the flow of execution, normally better than calling those functions in a nested way:
func_call3(func_call2(func_call1(val))); // Phew. But yet, it feels somewhat cumbersome to nest too many function calls that way.</description></item><item><title>Handling async exceptions in express</title><link>https://www.estebansastre.com/blog/2017/09/10/async-me-gusta/</link><pubDate>Sun, 10 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/09/10/async-me-gusta/</guid><description>How do you handle exceptions in express.js? If you&amp;rsquo;re anything like me, you start coding your application with your best intentions and favor readability, simplicity, and separation of concerns.
At the beginning I tend to split the app with a MVC structure featuring routes, middleware, controllers and I make use of services to group related pieces of functionality, trying to follow best practices, classic.
Once the application begins to grow and edge cases start biting my ass, I start to sprinkle try/catch blocks here and there, sometimes at the controller level, sometimes for some of the service methods, and sometimes within utility functions, following several layers of function calls.</description></item><item><title>Ember Websockets &amp; nginx integration</title><link>https://www.estebansastre.com/blog/2017/09/03/getting-docker-compose-path-from-cursor-position/</link><pubDate>Sun, 03 Sep 2017 15:18:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/09/03/getting-docker-compose-path-from-cursor-position/</guid><description>In a previous article I explained our approach at work to deploy an Ember.js application in an nginx server running on docker. Today I had to integrate an instance of that application to communicate with another microservice using WebSockets.
All this services run using a docker-compose script like this one (it is a very simplified version):
docker-compose.yml:
frontend: image: bde2020/ember-swarm-ui-frontend:0.6.0 ports: - &amp;#34;88:80&amp;#34; links: - dispatcher:backend volumes: - ./config/frontend:/etc/nginx/conf.d dispatcher: image: semtech/mu-dispatcher:1.</description></item><item><title>Getting docker-compose path from cursor position</title><link>https://www.estebansastre.com/blog/2017/09/03/getting-docker-compose-path-from-cursor-position/</link><pubDate>Sun, 03 Sep 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/09/03/getting-docker-compose-path-from-cursor-position/</guid><description>Introduction The Stack Builder application as part of the Big Data Europe platform is a system that helps in the process of building docker-compose.yml files. You can drag &amp;amp; drop existing docker-compose files from the project into a textarea to be shown and also search for other repositories in the big data europe github organization, composing a whole new system by taking useful pieces of systems and putting them together.</description></item><item><title>Big Data Integrator (BDI) Integrated Development Environment (IDE)</title><link>https://www.estebansastre.com/blog/2017/08/23/big-data-integrator/</link><pubDate>Wed, 23 Aug 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/08/23/big-data-integrator/</guid><description>In the Big Data Europe framework, the Big Data Integrator is an application that can be thought as a &amp;ldquo;starter kit&amp;rdquo; to start working and implementing big data pipelines in your process. It is the minimal standalone system so you can create a project with multiple docker containers, upload it &amp;amp; make it run using a nice GUI.
Architecture You can think of the Big Data Integrator as a placeholder. It acts as a &amp;ldquo;skeleton&amp;rdquo; application where you can plug &amp;amp; play different big data services from the big data europe platform, and add and develop your own.</description></item><item><title>Healthchecks for nginx in docker</title><link>https://www.estebansastre.com/blog/2017/08/15/healthchecks-nginx-docker/</link><pubDate>Tue, 15 Aug 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/08/15/healthchecks-nginx-docker/</guid><description>Introduction Recently I faced a problem where I had two nginx servers connected sequentially, the first one acted as a proxy (let&amp;rsquo;s call it nginx-proxy) between the frontend and another nginx server (let&amp;rsquo;s call it nginx-server). All services were running in docker containers using the docker-compose script.
The nginx-proxy service would route (or dispatch, however you want to call it) requests to the nginx-server service, as well as other microservices. Nginx by default does healthchecks on the upstream servers.</description></item><item><title>Git subtree introduction</title><link>https://www.estebansastre.com/blog/2017/08/10/git-subtree-introduction/</link><pubDate>Thu, 10 Aug 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/08/10/git-subtree-introduction/</guid><description>We often find ourselves developing projects that depend on other vendor’s libraries or even on our own produced external software components.
Git subtree provides a way to incorporate that external project into another one (normally bigger) by copying it inside the parent one and making it share the parent’s commit history from that moment on.
This is known as system-based approach in development, where you architect your design by taking the different interconnected projects as a whole.</description></item><item><title>Routing in Javascript</title><link>https://www.estebansastre.com/blog/2017/08/05/routing-in-javascript/</link><pubDate>Sat, 05 Aug 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/08/05/routing-in-javascript/</guid><description>Introduction Originally web applications consisted in interconnected html documents that one could navigate through links between them. Every time a user clicked a link on a website a new document would be generated in the server and sent back to the browser to be rendered in their screen.
Around the year 2005 the term Single-Page Application (SPA) became popular. Said term encompassed a new way or architecting websites to make them behave more like desktop applications: snappy, with graphical animations and smooth transitions between links.</description></item><item><title>Ember &amp; nginx docker deployment with multi-stage builds</title><link>https://www.estebansastre.com/blog/2017/07/26/ember-nginx-docker-deployment-with-multi-stage-builds/</link><pubDate>Wed, 26 Jul 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/07/26/ember-nginx-docker-deployment-with-multi-stage-builds/</guid><description>Introduction At work we use docker as the virtualization technology of choice to perform our project&amp;rsquo;s deployments. We follow a microservices architecture that allows us to do rapid development &amp;amp; testing, quickly trying new ideas and iterating on new functionality using a modular approach, choosing the best language/framework that best adapts to our needs for each particular use case.
The Problem Our fronted stack consists of Ember.js happily running in an nginx server inside a docker container.</description></item><item><title>Understanding HTML terminology</title><link>https://www.estebansastre.com/blog/2017/07/21/understanding-html-terminology/</link><pubDate>Fri, 21 Jul 2017 16:04:26 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/07/21/understanding-html-terminology/</guid><description>Introduction I know, I know. &amp;ldquo;But Esteban, this article would have been useful 20 years ago, now it is a little outdated to say the least&amp;rdquo;. I cannot disagree with that, but this kind of posts serve more as a reminder to me, and also perhaps to satisfy your curiosity. I don&amp;rsquo;t have a comments section, but feel free to reach me out over twitter, email or linkedin.
History When The Web was born, it did it as a system of internet servers that would allow to access documents via a Web Browser.</description></item><item><title>Passing arguments to Dockerfiles</title><link>https://www.estebansastre.com/blog/2017/07/15/passing-arguments-to-dockerfiles/</link><pubDate>Sat, 15 Jul 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/07/15/passing-arguments-to-dockerfiles/</guid><description>Introduction When using docker as our virtualization software of choice to deploy our applications, sometimes we might want to build an image that depends on a variable parameter, for example when building images from a script and you have a changing deployment folder when constructing it.
Using the ENV keyword The easiest way is to specify an environment variable inside the Dockerfile with the ENV keyword and then reference it from within the file.</description></item><item><title>Automatically loading json files to ElasticSearch</title><link>https://www.estebansastre.com/blog/2017/07/13/automatically-loading-json-files-to-elasticsearch/</link><pubDate>Thu, 13 Jul 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/07/13/automatically-loading-json-files-to-elasticsearch/</guid><description>Introduction Right now at work I am working in the (Big Data Europe) project, a joint effort or several organizations and enterprises accross Europe to create a platform that provides a set of software services that allow to implement big data pipelines, with minimal effort compared to other stacks and in an extremely cost effective way.
This is to make any company or organization that wants to make sense of their data using Big Data an easy starter to play around with the technologies that allow so.</description></item><item><title>My experience in JSCONF Belgium 2017.</title><link>https://www.estebansastre.com/blog/2017/07/04/my-experience-in-jsconf-belgium-2017/</link><pubDate>Tue, 04 Jul 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/07/04/my-experience-in-jsconf-belgium-2017/</guid><description>This Thursday 29th June the Jsconf.be conference was celebrated in the beautiful city of Brugge, and I had the chance of going there! I had already taken a look at the speakers and I was interested in at least four talks so it was more than worth going.
The conferences started in the afternoon and where structured in two tracks not following any topic in particular, so I had to sacrifice some.</description></item><item><title>Types of dependencies in NPM.</title><link>https://www.estebansastre.com/blog/2017/06/25/types-of-dependencies-in-npm/</link><pubDate>Sun, 25 Jun 2017 19:48:15 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/06/25/types-of-dependencies-in-npm/</guid><description>Introduction When we start a new javascript project and we count on adding a minimal level of complexity to it, we will eventually need to make use of external libraries if we want to avoid writing every feature totally from scratch. For that matter, you can choose to take three approaches:
Download the library code bundle and adapt it to your development and deployment process. This is easy if the library is very small, you don&amp;rsquo;t care about updating it&amp;rsquo;s version, and you know very specifically what you want from it.</description></item><item><title>Easy way to log network traffic from docker containers</title><link>https://www.estebansastre.com/blog/2017/06/01/log-network-traffic-from-docker-containers/</link><pubDate>Thu, 01 Jun 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/06/01/log-network-traffic-from-docker-containers/</guid><description>Introduction Let&amp;rsquo;s say that you are working on a project using docker and running several containers in the host network, or you have multiple containers leveraging the power of the docker-compose script and running concurrently sharing a single docker network. Now for instance, imagine that you experience some slowness while they are executing, and you suspect one or several of them are misusing the network causing a performance bottleneck, and you want to identify it.</description></item><item><title>Minimal working setup Rails 5 API + ActiveAdmin</title><link>https://www.estebansastre.com/blog/2017/05/15/minimal-working-setup-rails-5-api-activeadmin/</link><pubDate>Mon, 15 May 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/05/15/minimal-working-setup-rails-5-api-activeadmin/</guid><description>First of all add the ActiveAdmin and the Devise gems. Devise is needed because ActiveAdmin will use it as the authentication mechanism.
Gemfile:
gem &amp;#39;devise&amp;#39;, &amp;#39;&amp;gt; 4.x&amp;#39; gem &amp;#39;activeadmin&amp;#39;, github: &amp;#39;activeadmin&amp;#39; We install the gems:
bundle install Then we modify several files in order to adapt the Rails API application:
app/controllers/application_controller.rb:
ActionController::API changed to ActionController::Base Added protection against XSRF attacks. class ApplicationController &amp;lt; ActionController::Base include ActionController::Serialization protect_from_forgery :with =&amp;gt; :exception end config/application.</description></item><item><title>Ember.run.later and setTimeout comparing scenario</title><link>https://www.estebansastre.com/blog/2017/05/12/ember-run-later-vs-settimeout/</link><pubDate>Fri, 12 May 2017 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/blog/2017/05/12/ember-run-later-vs-settimeout/</guid><description>In the Ember internals (Backburner) it can be found that Ember.run.later basically calls setTimeout() under the hood, but respecting the firing order by which other timeouts were added into the queue.
import Ember from &amp;#39;ember&amp;#39;; export default Ember.Controller.extend({ appName: &amp;#34;Timers comparison&amp;#34;, init: function() { this._super(); this.set(&amp;#39;myErrCountLater&amp;#39;, 0); this.set(&amp;#39;myErrCountTimeout&amp;#39;, 0); this.myFunc(0); this.myOtherFunc(0); }, myFunc: function(errorCount) { if (errorCount &amp;lt; 7) { self = this; this.set(&amp;#39;myErrCountLater&amp;#39;, errorCount); console.log(&amp;#34;Error Count Later is &amp;#34; + errorCount + &amp;#34;, repeating&amp;#34;); Ember.</description></item><item><title>About myself 🦧</title><link>https://www.estebansastre.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.estebansastre.com/about/</guid><description>XMin is the first Hugo theme I have designed. The original reason that I wrote it was I needed a minimal example of Hugo themes when I was writing the blogdown book. Basically I wanted a simple theme that supports a navigation menu, a home page, other single pages, lists of pages, blog posts, categories, tags, and RSS. That is all. Nothing fancy. In terms of CSS and JavaScript, I really want to keep them minimal.</description></item></channel></rss>