Cciphertext sent by hacker
|
@@ -189,7 +190,7 @@ One problem is that, depending on the amount of encrypted malicious PHP code, th
-For this second method, let’s take a look at a recent backdoor that was found in a file named “**01f008ec.php**” within the root directory of an infected website.
+For this second method, let’s take a look at a recent backdoor that was found in a file named “**01f008ec.php**” within the root directory of an infected website.
PHP file formatted and segmented for clarity:
@@ -214,9 +215,9 @@ The backdoor starts with a isset
condition that mu
```
-Before the **XOR** operation, the file will use file_get_contents('php://input')
to read raw data through **GET**/**POST** requests (XOR encoding may add special characters that can be broken if not transmitted raw) to the malicious file. It’s then split into an array using str_split
and defined with the variable $part
within a foreach
loop.
+Before the **XOR** operation, the file will use file_get_contents('php://input')
to read raw data through **GET**/**POST** requests (XOR encoding may add special characters that can be broken if not transmitted raw) to the malicious file. It’s then split into an array using str_split
and defined with the variable $part
within a foreach
loop.
-We can see the malicious file’s code eventually evaluates code through a separate variable, eval($res)
— this lets us know that the variable $res
should contain the plaintext PHP code in order to be successfully executed.
+We can see the malicious file’s code eventually evaluates code through a separate variable, eval($res)
— this lets us know that the variable $res
should contain the plaintext PHP code in order to be successfully executed.
```
@@ -227,11 +228,11 @@ We can see the malicious file’s code eventually evaluates code through a separ
```
-This is a great example of the properties of symmetrical cryptography. The hacker uses the key (**B**) value to create the unreadable ciphertext (**C**) on their end, then the ciphertext (**C**) is submitted to the infected file via GET/POST request where it will be **XOR**’ed with the key (**B**) once more. The result is a plaintext (**A**) value that contains the malicious PHP code to be executed by the eval()
function.
+This is a great example of the properties of symmetrical cryptography. The hacker uses the key (**B**) value to create the unreadable ciphertext (**C**) on their end, then the ciphertext (**C**) is submitted to the infected file via GET/POST request where it will be **XOR**’ed with the key (**B**) once more. The result is a plaintext (**A**) value that contains the malicious PHP code to be executed by the eval()
function.
-It’s important to note that the plaintext (**A**) gets evaluated, so you won’t ever see it — nor the ciphertext (**C**) being sent to the infected file (unless you are logging HTTP requests or otherwise inspecting HTTP packets).
+It’s important to note that the plaintext (**A**) gets evaluated, so you won’t ever see it — nor the ciphertext (**C**) being sent to the infected file (unless you are logging HTTP requests or otherwise inspecting HTTP packets).
-One advantage with using this method is that even if HTTP requests are being inspected (e.g. by a firewall), website owners wouldn’t see the plaintext PHP, which can aid in evading detection. Another advantage is that the infection in the file can be much smaller (~235 characters on one line) than the previous method, which can have thousands of characters — this can also help prevent administrators from identifying malicious changes to files.
+One advantage with using this method is that even if HTTP requests are being inspected (e.g. by a firewall), website owners wouldn’t see the plaintext PHP, which can aid in evading detection. Another advantage is that the infection in the file can be much smaller (~235 characters on one line) than the previous method, which can have thousands of characters — this can also help prevent administrators from identifying malicious changes to files.
The Third Method
@@ -243,8 +244,8 @@ This third method doesn’t have the key value (**B**) hardcoded into the infect
Conclusion
-In conclusion, **XOR** bitwise operations in PHP malware can help hackers evade certain security controls, but their symmetric cryptography means that anyone that knows the pre-shared secret key can decrypt/encrypt using it.
+In conclusion, **XOR** bitwise operations in PHP malware can help hackers evade certain security controls, but their symmetric cryptography means that anyone that knows the pre-shared secret key can decrypt/encrypt using it.
-Users who believe that their site may be infected with a PHP backdoor can refer to our [hacked website guides](https://sucuri.net/guides/) for cleanup instructions, or [reach out to our remediation team](https://sucuri.net/website-malware-removal/) for assistance — we’re always happy to lend a hand.
+Users who believe that their site may be infected with a PHP backdoor can refer to our [hacked website guides](https://sucuri.net/guides/) for cleanup instructions, or [reach out to our remediation team](https://sucuri.net/website-malware-removal/) for assistance — we’re always happy to lend a hand.
-If you would like to receive email notifications for technical website security posts, subscribe for our [blog feed](https://info.sucuri.net/subscribe-to-security).
+If you would like to receive email notifications for technical website security posts, subscribe for our [blog feed](https://info.sucuri.net/subscribe-to-security).
diff --git a/_posts/2019-11-19-frontend-caching-quick-start.md b/_posts/2019-11-19-frontend-caching-quick-start.md
index f4fcabc..1f52082 100644
--- a/_posts/2019-11-19-frontend-caching-quick-start.md
+++ b/_posts/2019-11-19-frontend-caching-quick-start.md
@@ -4,6 +4,7 @@ title: "Frontend Caching Quick Start"
date: 2019-11-19 09:00:00 -0700
cover: /assets/images/2019-11-19-frontend-caching-quick-start/cover.jpg
excerpt: This post provides a quick start guide to front end caching, helping developers create an optimal caching strategy.
+canonical: https://godaddy.com/resources/news/frontend-caching-quick-start
authors:
- name: Mayank Jethva
title: Software Engineer
@@ -136,7 +137,7 @@ _On the other hand, if the file has newer content, the following flow between th
> Side Note: The [HTTP 1.1 Specification](https://tools.ietf.org/html/rfc2616) states: "To mark a response as 'never expires', an origin server sends an
> Expires date approximately one year from the time the response is
> sent. HTTP/1.1 servers SHOULD NOT send Expires dates more than one
-> year in the future."
+> year in the future."
> **Hence, the recommended `max-age` value for a resource which never expires is 1 year.** By setting `max-age: 31536000`, we're telling the client to cache it for up to 31536000 seconds, which is 1 year from the time of the request.
- `healthcheck.html`
diff --git a/_posts/2019-11-26-making-frameworks.md b/_posts/2019-11-26-making-frameworks.md
index 398e8a1..3157818 100644
--- a/_posts/2019-11-26-making-frameworks.md
+++ b/_posts/2019-11-26-making-frameworks.md
@@ -6,6 +6,7 @@ cover: /assets/images/making-frameworks/cover.jpg
excerpt: A look at how we develop Node.js apps today and how we
can do it better using Gasket to quickly compose reusable elements of apps
into feature-rich frameworks.
+canonical: https://godaddy.com/resources/news/making-frameworks
authors:
- name: Andrew Gerard
url: https://www.linkedin.com/in/andrewgerard/
diff --git a/_posts/2019-12-03-is-my-host-fast-yet.md b/_posts/2019-12-03-is-my-host-fast-yet.md
index f42b4d9..5d34513 100644
--- a/_posts/2019-12-03-is-my-host-fast-yet.md
+++ b/_posts/2019-12-03-is-my-host-fast-yet.md
@@ -7,6 +7,7 @@ excerpt: You put some files on a server and users grab them; that’s hosting, r
Sure, if you’re stuck in the 90’s. While there have been significant innovations in this space,
it’s been largely uneventful in the last 10 years. This post aims to enlighten and educate on
innovations in this industry.
+canonical: https://godaddy.com/resources/news/is-my-host-fast-yet
authors:
- name: Aaron Silvas
url: https://www.linkedin.com/in/aaron-silvas-5817626/
@@ -36,7 +37,7 @@ This report qualifies less than 200ms TTFB (Time To First Byte) as fast, 200-100
## What is this wizardry?
No tricks, just physics. Approximately [every 100km (~62mi) from data centers adds 1ms of latency](https://cloud.google.com/solutions/best-practices-compute-engine-region-selection) to client requests (RTT). Based on the worst case distance (half the circumference of earth), round trips can theoretically reach upwards of 200ms over fiber. This is before factoring in indirect routes, two to three round trips to establish connections (predominantly secured), and last-mile latencies from Internet Service Providers. If you’re serving all users from a single data center, parts of the world are likely to see roughly an overhead of 600-800ms simply due to distance. Add in the overhead of host response, and this can quickly reach 1000ms and beyond before your users begin to see something render.
-If you’re still not sold on how critical TTFB is between your host and your client, let's look at this problem through another lens. Client latencies have a far greater (and linear) impact [compared to that of bandwidth](https://www.igvita.com/2012/07/19/latency-the-new-web-performance-bottleneck/). This means optimizing response times between client and host often will have a greater impact than reducing the size of your applications -- though naturally you should do both. Why then are we so obsessed with “fat pipes”?
+If you’re still not sold on how critical TTFB is between your host and your client, let's look at this problem through another lens. Client latencies have a far greater (and linear) impact [compared to that of bandwidth](https://www.igvita.com/2012/07/19/latency-the-new-web-performance-bottleneck/). This means optimizing response times between client and host often will have a greater impact than reducing the size of your applications -- though naturally you should do both. Why then are we so obsessed with “fat pipes”?
## Custom stack
@@ -45,7 +46,7 @@ Surely you didn’t think physics was the only hand at play here? After all, you

-When we designed the hosting stack for GoDaddy Website Builder over 6 years ago, there were numerous off the shelf technologies we could have leveraged to get the job done, and done well. That was the easy and most obvious path. Instead we approached the problem as an opportunity to cater the solution specifically to the needs of users spanning the globe, and ultimately to provide a world class platform from which our customers could be proud to host their ideas and accelerate their ventures. Running a hosting platform on Node.js, which is JavaScript running in Google’s V8 engine, was fraught with skepticism. After all, fast JavaScript is an oxymoron, right?
+When we designed the hosting stack for GoDaddy Website Builder over 6 years ago, there were numerous off the shelf technologies we could have leveraged to get the job done, and done well. That was the easy and most obvious path. Instead we approached the problem as an opportunity to cater the solution specifically to the needs of users spanning the globe, and ultimately to provide a world class platform from which our customers could be proud to host their ideas and accelerate their ventures. Running a hosting platform on Node.js, which is JavaScript running in Google’s V8 engine, was fraught with skepticism. After all, fast JavaScript is an oxymoron, right?
Runtime language matters, especially for CPU bound operations. But when it comes to I/O bound tasks, which is often the case with hosting, your runtime plays an important but less significant role. Instead of chaining together general purpose technologies - that range from load balancers, to web servers, and caching - we approached the problem with a single cohesive stack that has full control over the quality experience throughout the process required to serve a customers request. This approach has allowed us to emphasize customer experience over throughput by performing all necessary computations in parallel.
diff --git a/_posts/2019-12-05-securing-the-cloud.md b/_posts/2019-12-05-securing-the-cloud.md
index 1bb54c3..e10faf1 100644
--- a/_posts/2019-12-05-securing-the-cloud.md
+++ b/_posts/2019-12-05-securing-the-cloud.md
@@ -9,6 +9,7 @@ excerpt: In March of 2018, GoDaddy and AWS announced a multi-year transition
same on-premise tools and infrastructure to secure a cloud environment. To
address this, we developed a serverless containerized framework on AWS to
continuously detect and track security issues.
+canonical: https://godaddy.com/resources/news/securing-the-cloud
authors:
- name: Greg Bailey
title: Principal Software Engineer
diff --git a/_posts/2019-12-10-Kernel-Bypass-Networking.md b/_posts/2019-12-10-Kernel-Bypass-Networking.md
index 13b2c89..93da590 100644
--- a/_posts/2019-12-10-Kernel-Bypass-Networking.md
+++ b/_posts/2019-12-10-Kernel-Bypass-Networking.md
@@ -4,6 +4,7 @@ title: "Kernel-Bypass Networking"
date: 2019-12-10 09:00:00 -0700
cover: /assets/images/kernel_bypass_networking.jpg
excerpt: The DNS Team explored the possibility of using a software-based router instead of a hardware router. This post examines the reasons for using a software-based router with Kernel-Bypass Networking.
+canonical: https://godaddy.com/resources/news/kernel-bypass-networking
authors:
- name: Benjamin Bowen
title: Senior Development Manager
@@ -32,7 +33,7 @@ For a server, this process is reversed. If that server is acting as a router, a
Layer 4 (Transport): Coordinates data transfer between system and hosts, including error-checking and data recovery.
Layer 3 (Network): Determines how data is sent to the receiving device. It's responsible for packet forwarding, routing, and addressing.
Layer 2 (Data Link): Translates binary into signals and allows upper layers to access media.
- Layer 1 (Physical): Transmits signals over media. Actual hardware sits at this layer.
+ Layer 1 (Physical): Transmits signals over media. Actual hardware sits at this layer.
```
The design of the BSD imposes constraints on how the data from a network source is handled by the OS. When a packet arrives from the NIC, it’s wrapped in a buffer object. That allocation can interfere with the dynamic memory allocator of the OS. For example, the buffer object can be forwarded between CPU cores in a multi-CPU system and accessed from multiple threads, which then requires locks for concurrent accesses.
diff --git a/_posts/2020-01-10-better-prediction-interval-with-neural-network.md b/_posts/2020-01-10-better-prediction-interval-with-neural-network.md
index 21dddfd..aafb362 100644
--- a/_posts/2020-01-10-better-prediction-interval-with-neural-network.md
+++ b/_posts/2020-01-10-better-prediction-interval-with-neural-network.md
@@ -4,6 +4,7 @@ title: "Better prediction intervals with Neural Networks"
date: 2020-01-10 09:00:00 -0700
cover: /assets/images/better-prediction-interval-with-neural-network/cover.jpg
excerpt: GoDaddy machine learning team presents Expanded Interval Minimization (EIM), a novel loss function to generate prediction intervals using neural networks. Prediction intervals are a valuable way of quantifying uncertainty in regression problems. Good prediction intervals should contain the actual value and have a small mean width of the bounds. We compare EIM to three published techniques and show EIM produces on average 1.37x tighter prediction intervals and in the worst case 1.06x tighter intervals across two large real-world datasets and varying coverage levels.
+canonical: https://godaddy.com/resources/news/better-prediction-interval-with-neural-network
authors:
- name: Ying Yin Ting
title: Senior Data Scientist
@@ -15,17 +16,17 @@ authors:
photo: https://avatars.githubusercontent.com/jansel
---
-## Introduction
+## Introduction
GoDaddy has an automated service to give you the [appraisal for a domain name](https://www.godaddy.com/domain-value-appraisal) on the secondary market. The domain name value
prediction is powered by a deep learning model that we described in a past [blog
post](https://www.godaddy.com/engineering/2019/07/26/domain-name-valuation/). Now, another question
that people may be curious about is: how confident is the model for that prediction? Can we quantify
the uncertainty of the prediction? The answer is, YES! Using a prediction interval, we can quantify
-the uncertainty of a regression problem. Instead of predicting a single value, one can predict a range of possible values, which we call a prediction interval. If the model is uncertain, it will give a
-larger prediction interval; if the model is confident about the prediction, it will give a tighter prediction interval. Let’s take the domain appraisal problem as an example.
+the uncertainty of a regression problem. Instead of predicting a single value, one can predict a range of possible values, which we call a prediction interval. If the model is uncertain, it will give a
+larger prediction interval; if the model is confident about the prediction, it will give a tighter prediction interval. Let’s take the domain appraisal problem as an example.
A normal regression model gives a single prediction for a domain name. `ThaiRestaurant.com` might be predicted
-as $9,463. With prediction intervals, we instead have a range of predictions. For example, we might get a range from $9,000 to $10,000 for the same domain name. If the model is less certain about the prediction, the range can be larger, and the prediction interval may instead be $5,000 to $15,000. To dive more deeply into this topic, the GoDaddy machine learning team investigated this prediction interval problem and wrote a paper based on findings. In our paper, [Tight Prediction Intervals Using Expanded Interval Minimization](https://arxiv.org/abs/1806.11222), we were curious to see if there was a better way to develop a model that would output prediction intervals which are meaningful and precise. The following sections of this post summarize our approach and the results.
+as $9,463. With prediction intervals, we instead have a range of predictions. For example, we might get a range from $9,000 to $10,000 for the same domain name. If the model is less certain about the prediction, the range can be larger, and the prediction interval may instead be $5,000 to $15,000. To dive more deeply into this topic, the GoDaddy machine learning team investigated this prediction interval problem and wrote a paper based on findings. In our paper, [Tight Prediction Intervals Using Expanded Interval Minimization](https://arxiv.org/abs/1806.11222), we were curious to see if there was a better way to develop a model that would output prediction intervals which are meaningful and precise. The following sections of this post summarize our approach and the results.
## Prediction Interval Evaluation
@@ -47,7 +48,7 @@ PICP for a given model is 85%, we will shrink the prediction intervals to hit 80
the models we want to compare hit the same PICP target, we can compare the MPIW to check which model
is the best.
-## Traditional Techniques
+## Traditional Techniques
Before we dive into our new technique, let's first discuss existing techniques to construct a prediction interval model from related literature. The first and most common way to construct prediction intervals is to predict the variance directly. We can view the prediction interval to be constructed by a point of estimation plus and minus a multiple of the predicted standard deviation (which is the square root of the variance). If we are less certain,
the variance will be higher; if we’re more certain, the variance will be smaller, which results in
@@ -62,9 +63,9 @@ The fixed bounds method is a naive baseline so we can get a floor of performance
The technique trains a regression model to predict the true value then adds and subtracts a
fixed percentage of that prediction value. For example, if the prediction is 3,000 and the fixed
percentage is set to 30%, we can then construct a prediction interval with the lower bound to be
-3000-(30%*3000) and the upper bound to be 3000+(30%*3000).
+3000-(30%*3000) and the upper bound to be 3000+(30%*3000).
-### Maximum Likelihood Estimation
+### Maximum Likelihood Estimation
For the maximum likelihood method, we directly build two neural networks. The first neural network
predicts the true value (like the $9,483 prediction for `thairestaurant.com` domain name), and the
@@ -82,7 +83,7 @@ and calculate the variance of those predictions to be the estimation of how conf
### Quantile Regression Method
-[Quantile regression](https://en.wikipedia.org/wiki/Quantile_regression) is a type of regression that predicts a specific quantile, such as the mean or 50%, of the data.
+[Quantile regression](https://en.wikipedia.org/wiki/Quantile_regression) is a type of regression that predicts a specific quantile, such as the mean or 50%, of the data.
Using quantile regression, we can
construct prediction intervals by training two models to output different quantile of the prediction
and thus construct an interval. For example, we
@@ -93,9 +94,9 @@ outputs.
## Propose technique - Expanded Interval Minimization
In our paper, we present a new way to build a prediction interval model: Expanded Interval
-Minimization (EIM), a novel loss function for generating prediction intervals using neural networks.
-For every neural network model, we need to provide a loss function that we want it to learn to minimize.
-For example, for a regression problem, the loss function can be the mean square error - the mean of the squared difference between predictions and actual values. For the prediction interval problem, we want to hit the target PICP while minimizing the MPIW. We use the minibatch as a noisy estimate of the population PICP and MPIW.
+Minimization (EIM), a novel loss function for generating prediction intervals using neural networks.
+For every neural network model, we need to provide a loss function that we want it to learn to minimize.
+For example, for a regression problem, the loss function can be the mean square error - the mean of the squared difference between predictions and actual values. For the prediction interval problem, we want to hit the target PICP while minimizing the MPIW. We use the minibatch as a noisy estimate of the population PICP and MPIW.
For every minibatch of data that feeds into the neural network, we scale
the prediction interval to hit the fixed and given PICP like the way we discussed in the [prediction
interval evaluation section](#prediction-interval-evaluation). After hitting the given PICP, we can
@@ -284,4 +285,4 @@ art by developing novel machine learning techniques like EIM. The proposed Expan
Minimization (EIM) method for prediction intervals has significantly better results than the
existing techniques. While comparing to the next best technique, EIM produces 1.06x to 1.26x tighter
prediction intervals given each target PICP (70%, 80%, and 90%). We hope that others will be able to
-use EIM to generate tighter prediction intervals and apply this technique to broader use cases.
\ No newline at end of file
+use EIM to generate tighter prediction intervals and apply this technique to broader use cases.
diff --git a/_posts/2020-01-27-b-root.md b/_posts/2020-01-27-b-root.md
index 706f082..b388fd3 100644
--- a/_posts/2020-01-27-b-root.md
+++ b/_posts/2020-01-27-b-root.md
@@ -4,6 +4,7 @@ title: "GoDaddy Hosts DNS B Root Instances"
date: 2020-01-27 09:00:00 -0700
cover: /assets/images/b-root/Root%20Servers%20in%20the%20World%20-%20Google%20My%20Maps.png
excerpt: The root of the Domain Name System (DNS Root) is managed by 13 independent organizations, known as "A" through "M". This post discusses GoDaddy's partnership with one of those 13, known as the B Root, to augment their global presence.
+canonical: https://godaddy.com/resources/news/b-root
authors:
- name: Brian Dickson
title: Principal Software Engineer
@@ -15,7 +16,7 @@ authors:
This blog explains the DNS Root Servers and how GoDaddy is contributing by hosting B Root instances.
It also provides a background of the Domain Name System (DNS) as a hierarchy. Lastly, this blog discusses the root of that hierarchy to help provide context for the various root server identities and independent operations, and to give a frame of reference for the discussion about the B Root servers.
## What is the Domain Name System?
-The Domain Name System (DNS) is both a protocol, and a distributed database of information concerning hosts and services on the public Internet.
+The Domain Name System (DNS) is both a protocol, and a distributed database of information concerning hosts and services on the public Internet.
DNS has scaled extremely well, handling the growth of the Internet for the last 35 years.
The database side of DNS is a hierarchical system, forming a decentralized database of Internet information. Conceptually, it forms a tree with a single root, where every node below the root has a label with only local significance.
diff --git a/_posts/2020-05-06-godaddy-splitio-collaboration.md b/_posts/2020-05-06-godaddy-splitio-collaboration.md
index 05aa01d..3fa1d46 100644
--- a/_posts/2020-05-06-godaddy-splitio-collaboration.md
+++ b/_posts/2020-05-06-godaddy-splitio-collaboration.md
@@ -4,6 +4,7 @@ title: "GoDaddy x Split.io"
date: 2020-05-06 09:00:00 -0700
cover: /assets/images/godaddy-splitio-collaboration/High-five_L.png
excerpt: GoDaddy and Split.io recently joined forces to design and build a set of experimentation tools that enables A/B testing without a performance penalty.
+canonical: https://godaddy.com/resources/news/godaddy-splitio-collaboration
authors:
- name: Celia Waggoner
title: Software Engineering Manager
diff --git a/_posts/2020-05-12-experimentation-practices.md b/_posts/2020-05-12-experimentation-practices.md
index 8e19dac..c60304f 100644
--- a/_posts/2020-05-12-experimentation-practices.md
+++ b/_posts/2020-05-12-experimentation-practices.md
@@ -4,6 +4,7 @@ title: "Four tips for developing sound experimentation practices"
date: 2020-05-13 08:00:00 -0800
cover: /assets/images/experimentation-practices/person-holding-blue-ballpoint-pen-on-white-notebook-669610.jpg
excerpt: Best practices and lessons learned for teams moving towards experiment-driven development.
+canonical: https://godaddy.com/resources/news/experimentation-practices
authors:
- name: Ellen O'Connor
title: Senior Software Engineer
diff --git a/_posts/2021-02-11-gasket-api-preset.md b/_posts/2021-02-11-gasket-api-preset.md
index b29449f..243d607 100644
--- a/_posts/2021-02-11-gasket-api-preset.md
+++ b/_posts/2021-02-11-gasket-api-preset.md
@@ -6,12 +6,12 @@ cover: /assets/images/gasket-api-preset/cover.jpg
excerpt: Create a simple API with Node.js and Express, using the Gasket API Preset. We'll also get a glimpse into generating API documentation with the new Gasket Swagger Plugin!
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/gasket-api-preset
authors:
- name: Kawika Bader
title: Senior Software Engineer
url: https://www.linkedin.com/in/kawikabader
photo: /assets/images/gasket-api-preset/kawikabader.jpg
-canonical: https://blog.gasket.dev/api-preset/
---
In this article, we'll learn how to create a simple API with Node.js and Express, using the Gasket API Preset. We'll also get a glimpse into generating API documentation with the new Gasket Swagger Plugin!
@@ -247,7 +247,7 @@ Here we are defining a route using the `GET` method. This route will log a messa
### Starting Up The API
-To start the API, run `npm run local` from the root of the `./fingerstache-coffee` directory (you may need to navigate to the project root directory, before running):
+To start the API, run `npm run local` from the root of the `./fingerstache-coffee` directory (you may need to navigate to the project root directory, before running):
```bash
cd fingerstache-coffee
```
@@ -390,7 +390,7 @@ module.exports = (app) => {
Here we have documented the route using a JSDoc-style format that the swagger-jsdoc module can parse and render. More information on the various doc parameters can be found on the [swagger-jsdoc github](https://github.com/Surnet/swagger-jsdoc/blob/master/docs/GETTING-STARTED.md).
-Now if we stop and restart the API
+Now if we stop and restart the API
```bash
control+c
npm run local
diff --git a/_posts/2021-05-07-godaddys-journey-to-the-cloud.md b/_posts/2021-05-07-godaddys-journey-to-the-cloud.md
index 26c02ef..4b18695 100644
--- a/_posts/2021-05-07-godaddys-journey-to-the-cloud.md
+++ b/_posts/2021-05-07-godaddys-journey-to-the-cloud.md
@@ -6,6 +6,7 @@ cover: /assets/images/godaddys-journey-to-the-cloud/cover.jpg
excerpt: In this blog post, we share information about GoDaddy's cloud journey, which began in early 2018 when we announced our partnership with AWS. Specifically, we describe the GoDaddy Public Cloud Portal, an application used to onboard engineering teams to AWS.
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/godaddys-journey-to-the-cloud
authors:
- name: Jared Beauchamp
title: Senior Software Engineer Manager
@@ -41,37 +42,37 @@ The GoDaddy Public Cloud Portal initiative set forth the following goals:
Meeting these goals is critical to the success of the GoDaddy cloud adoption journey.
-### Supporting the move to cloud and needed cultural change
+### Supporting the move to cloud and needed cultural change
-This story about our journey here at GoDaddy is not just one of a technical feat. At the highest levels of the GoDaddy management team, there was an understanding that realizing the benefits and value from moving to the cloud will require cultural change. The key story communicated by the executive management team is the spirit of working together – we're in this 'move to the public cloud' together. Moreover, GoDaddy needs the participation, collaboration, and input/feedback from every engineer in the company to help navigate and optimize the journey.
+This story about our journey here at GoDaddy is not just one of a technical feat. At the highest levels of the GoDaddy management team, there was an understanding that realizing the benefits and value from moving to the cloud will require cultural change. The key story communicated by the executive management team is the spirit of working together – we're in this 'move to the public cloud' together. Moreover, GoDaddy needs the participation, collaboration, and input/feedback from every engineer in the company to help navigate and optimize the journey.
-GoDaddy leadership has always professed there is no book they could pick up at the company store that says 'this is right way to take GoDaddy to the public cloud'. 'The book does not exist – they are actually writing it every day'. It takes the shared experience of everybody that is involved in the migration to the cloud to get it right. GoDaddy needed their engineers experiencing it all together, and providing feedback and input on refinements from their perspective. The Application Services team (GoDaddy Cloud Center of Excellence) is in place to be the nexus of that experience across all teams, so the organization overall can collect and expand experience drawn from other teams as they onboard over time.
+GoDaddy leadership has always professed there is no book they could pick up at the company store that says 'this is right way to take GoDaddy to the public cloud'. 'The book does not exist – they are actually writing it every day'. It takes the shared experience of everybody that is involved in the migration to the cloud to get it right. GoDaddy needed their engineers experiencing it all together, and providing feedback and input on refinements from their perspective. The Application Services team (GoDaddy Cloud Center of Excellence) is in place to be the nexus of that experience across all teams, so the organization overall can collect and expand experience drawn from other teams as they onboard over time.
-The culture and spirit of working together shows up in the GoDaddy initiative process, which is not just a centralized team defining the right solution with all others teams following. Instead, the process is where they gather a group of thought leaders across the company and agree on what the problem is – once they agree on the problem, they define and agree on what 'done' looks like (e.g. the form of done) – is it an application, a process, documentation, etc... Once they have this definition complete they ask the thought leaders to recommend and offer up a list of 8-10 contributors in the company that will contribute to the initiative to get to an actual answer. They've use this process, for example, for CDN architecture/design, defining tiers of applications and thus what level of security test should be applied to that tier of application and at what frequency, application encryption library innovations for teams, and creating the Must-Have's and Should-Do's list for raising the bar on engineering rigor that is discussed later.
+The culture and spirit of working together shows up in the GoDaddy initiative process, which is not just a centralized team defining the right solution with all others teams following. Instead, the process is where they gather a group of thought leaders across the company and agree on what the problem is – once they agree on the problem, they define and agree on what 'done' looks like (e.g. the form of done) – is it an application, a process, documentation, etc... Once they have this definition complete they ask the thought leaders to recommend and offer up a list of 8-10 contributors in the company that will contribute to the initiative to get to an actual answer. They've use this process, for example, for CDN architecture/design, defining tiers of applications and thus what level of security test should be applied to that tier of application and at what frequency, application encryption library innovations for teams, and creating the Must-Have's and Should-Do's list for raising the bar on engineering rigor that is discussed later.
-The culture of this contribution model was key for GoDaddy to leverage the expertise and diversity of their organization and to drive the speed of innovation they were looking to achieve with moving to the cloud. There's a well-defined pipeline for contributing. If someone can see a standard infrastructure-as-code architecture component or deployment product that can be better, or a new feature they want to have within an infrastructure product definition they're building with, they just submit a PR. There's a really good pipeline defined on how to get that into production for their team and thus to benefit all the other GoDaddy DevOps teams going forward.
+The culture of this contribution model was key for GoDaddy to leverage the expertise and diversity of their organization and to drive the speed of innovation they were looking to achieve with moving to the cloud. There's a well-defined pipeline for contributing. If someone can see a standard infrastructure-as-code architecture component or deployment product that can be better, or a new feature they want to have within an infrastructure product definition they're building with, they just submit a PR. There's a really good pipeline defined on how to get that into production for their team and thus to benefit all the other GoDaddy DevOps teams going forward.
-There's no doubt that there's more responsibility on teams moving to the AWS cloud than existed with the on-premises environment. In the new culture the company is asking teams to operate their own product, asking them to secure their own product, to be responsible for their own budget. This is definitely a lot of responsibility in the new 'DevSecFinOps' multi-responsibility model for teams. The culture needed to be supportive and make sure that teams are empowered to make their own decisions. Through the group-think type of Initiative Process we just discussed, GoDaddy has automated many of the things that used to be done on-premises manually, in some cases where they never had the ability to automate before. So, while there is more breadth of responsibility and things to do in the new world of cloud, there is much more automation across the board to offload each team also.
+There's no doubt that there's more responsibility on teams moving to the AWS cloud than existed with the on-premises environment. In the new culture the company is asking teams to operate their own product, asking them to secure their own product, to be responsible for their own budget. This is definitely a lot of responsibility in the new 'DevSecFinOps' multi-responsibility model for teams. The culture needed to be supportive and make sure that teams are empowered to make their own decisions. Through the group-think type of Initiative Process we just discussed, GoDaddy has automated many of the things that used to be done on-premises manually, in some cases where they never had the ability to automate before. So, while there is more breadth of responsibility and things to do in the new world of cloud, there is much more automation across the board to offload each team also.
-Communicating a strong vision and explaining the motivation for moving to the cloud is a key component of cultural change management for the company. GoDaddy communicated their motivation in going to the AWS cloud – the 3 major goals for raising the bar on customer experience and product excellence.
+Communicating a strong vision and explaining the motivation for moving to the cloud is a key component of cultural change management for the company. GoDaddy communicated their motivation in going to the AWS cloud – the 3 major goals for raising the bar on customer experience and product excellence.
-- Increased speed of delivery: get the features and the products to our customers faster
-- Increased application performance: getting the applications closer to our customer, as well as freeing up time for our engineers and giving them better tools so that we can actually accelerate our own applications.
-- Increased reliability & availability: This is the biggest goal that will drive architectural changes in the company as we move to the cloud. We need to build architectures that can withstand an entire AWS region going out, for example, and we stay up and running with no customer impact. The cloud allows new approaches that have not been available to us on-premises.
+- Increased speed of delivery: get the features and the products to our customers faster
+- Increased application performance: getting the applications closer to our customer, as well as freeing up time for our engineers and giving them better tools so that we can actually accelerate our own applications.
+- Increased reliability & availability: This is the biggest goal that will drive architectural changes in the company as we move to the cloud. We need to build architectures that can withstand an entire AWS region going out, for example, and we stay up and running with no customer impact. The cloud allows new approaches that have not been available to us on-premises.
-To manage this change, GoDaddy worked to achieve each of these goals while observing and adhering to necessary constraints to the business as they proceeded. The thought was to achieve the goals AND conform to the constraints at the same time – constraints related to Security, Application Architecture, Operational Readiness, Budget, and Compliance & Privacy. E.g. they will achieve increased speed of delivery while adhering to the budget, and while adhering to the necessary security standards, etc…
+To manage this change, GoDaddy worked to achieve each of these goals while observing and adhering to necessary constraints to the business as they proceeded. The thought was to achieve the goals AND conform to the constraints at the same time – constraints related to Security, Application Architecture, Operational Readiness, Budget, and Compliance & Privacy. E.g. they will achieve increased speed of delivery while adhering to the budget, and while adhering to the necessary security standards, etc…
-So how do they measure and make sure they get there? Within the defined constraints? The Must-Have's and Should-Do's list defines the bar. The Cloud Readiness Review implements the validation and approval against the bar. Then their standard S-P-A-Q metrics for measuring Speed, Performance, Availability, and Quality provide on-going metric measurement and reporting for achievement in production. We'll talk more about this in the next section.
+So how do they measure and make sure they get there? Within the defined constraints? The Must-Have's and Should-Do's list defines the bar. The Cloud Readiness Review implements the validation and approval against the bar. Then their standard S-P-A-Q metrics for measuring Speed, Performance, Availability, and Quality provide on-going metric measurement and reporting for achievement in production. We'll talk more about this in the next section.
-GoDaddy has applied the same Initiative approach to the definition and implementation of the S-P-A-Q metrics, including key members from various teams to improve and ratify the metrics over time. For example, measuring Availability has evolved, as originally many teams were measuring this differently making it difficult to compare and contrast team results. E.g. measuring by the second, the minute, from inside the datacenter, from outside the datacenter, if a ping failed once the service is down, or the ping must fail multiple times in succession for the service to be slated as down. There used to be a lack of consistency, and now the KPI dashboard shows consistently measured metrics across all services through the collaboration of initiative teams.
+GoDaddy has applied the same Initiative approach to the definition and implementation of the S-P-A-Q metrics, including key members from various teams to improve and ratify the metrics over time. For example, measuring Availability has evolved, as originally many teams were measuring this differently making it difficult to compare and contrast team results. E.g. measuring by the second, the minute, from inside the datacenter, from outside the datacenter, if a ping failed once the service is down, or the ping must fail multiple times in succession for the service to be slated as down. There used to be a lack of consistency, and now the KPI dashboard shows consistently measured metrics across all services through the collaboration of initiative teams.
-Finally, they've set the terminology of the company to be consistent, with agreed definition of terms, and ultimately raising the bar for compliance across all teams driving overall service improvement for customers. All this is built on top of standard engineering practices, well-defined, communicated, and understood by all engineering teams. The final 'hurrah' is achieving increased Speed of Delivery. For this they focused on good CI-CD engineering processes and tools for starters. Team Engineering practices are defined and measured during onboarding through the cloud portal managed Cloud Readiness Review process.
+Finally, they've set the terminology of the company to be consistent, with agreed definition of terms, and ultimately raising the bar for compliance across all teams driving overall service improvement for customers. All this is built on top of standard engineering practices, well-defined, communicated, and understood by all engineering teams. The final 'hurrah' is achieving increased Speed of Delivery. For this they focused on good CI-CD engineering processes and tools for starters. Team Engineering practices are defined and measured during onboarding through the cloud portal managed Cloud Readiness Review process.
-The needed cultural change has been a journey; all GoDaddy colleagues are clearly in this together. It continues to require the entire GoDaddy community to participate and make this move to the cloud successful and optimal – to achieve the outcomes the company strives to deliver to customers. GoDaddy is a work in progress; and continues to iterate toward the company vision.
+The needed cultural change has been a journey; all GoDaddy colleagues are clearly in this together. It continues to require the entire GoDaddy community to participate and make this move to the cloud successful and optimal – to achieve the outcomes the company strives to deliver to customers. GoDaddy is a work in progress; and continues to iterate toward the company vision.
-### Genesis of the Public Cloud Portal
+### Genesis of the Public Cloud Portal
-So, how is GoDaddy realizing the benefits and objectives of moving to the cloud, scaling across 1000’s of employees, 100’s of scrum teams, and creating an experience that accelerates engineering teams in serving their customers? Managing the deployment standards, setting up the cloud foundation and landing zones, organizing and collecting on-boarding information, tracking and reporting; is all too much to handle manually while supporting the scale and agility that is required. Enter the GoDaddy Public Cloud Portal, with the mission to deliver a seamless one stop shop for GoDaddy developers to learn, on-board, and manage their product and services in the cloud. Let's dive into the feature/functions brought together in the GoDaddy public cloud portal in support of development teams in the next section.
+So, how is GoDaddy realizing the benefits and objectives of moving to the cloud, scaling across 1000’s of employees, 100’s of scrum teams, and creating an experience that accelerates engineering teams in serving their customers? Managing the deployment standards, setting up the cloud foundation and landing zones, organizing and collecting on-boarding information, tracking and reporting; is all too much to handle manually while supporting the scale and agility that is required. Enter the GoDaddy Public Cloud Portal, with the mission to deliver a seamless one stop shop for GoDaddy developers to learn, on-board, and manage their product and services in the cloud. Let's dive into the feature/functions brought together in the GoDaddy public cloud portal in support of development teams in the next section.
## Public Cloud Portal ecosystem
diff --git a/_posts/2021-05-07-serverless-aws-servicecatalog-plugin.md b/_posts/2021-05-07-serverless-aws-servicecatalog-plugin.md
index a6a7154..40111fb 100644
--- a/_posts/2021-05-07-serverless-aws-servicecatalog-plugin.md
+++ b/_posts/2021-05-07-serverless-aws-servicecatalog-plugin.md
@@ -6,6 +6,7 @@ cover: /assets/images/serverless-aws-servicecatalog-plugin/cover.jpg
excerpt: The serverless-aws-servicecatalog plugin provides developers with the power of Serverless deployments while allowing companies to maintain governance over AWS resources by using AWS Service Catalog. This is one step on the path to unlock the power of no-managed-resource applications for enterprise uses. By taking advantage of higher order abstractions over CloudFormation, such as Service Catalog, teams working with self-created and managed custom products can also make use of Serverless to develop, maintain and deploy these innovative new runtimes.
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/serverless-aws-servicecatalog-plugin
authors:
- name: John Smey
title: Senior Software Engineer
@@ -14,7 +15,7 @@ authors:
The serverless design pattern made possible by Amazon API Gateway and AWS Lambda allows developers to build and run applications without having to maintain any persistent infrastructure. Serverless applications are becoming increasingly popular as more organizations move to cloud providers. Some of the core use cases for serverless applications include: auto-scaling web-sites and APIs, event processing and streaming, image or video processing and CICD.
-The serverless architecture is a good fit for applications that fit the following criteria:
+The serverless architecture is a good fit for applications that fit the following criteria:
1. You want the cloud provider to manage resources, availability and scaling
2. Some per-request latency isn’t a problem
3. You only want to pay for resources in active use
@@ -32,7 +33,7 @@ In AWS, the design principle of "infrastructure as code" is achieved by using Cl
## Serverless and Service Catalog
-**Serverless** generates a CloudFormation template which is used to deploy the AWS products required by a Serverless application. This will not work for developers that are restricted to using only Service Catalog products.
+**Serverless** generates a CloudFormation template which is used to deploy the AWS products required by a Serverless application. This will not work for developers that are restricted to using only Service Catalog products.
To solve this problem, GoDaddy and AWS joined forces to create the [serverless-aws-servicecatalog](https://github.com/godaddy/serverless-aws-servicecatalog) plugin. This plugin allows an AWS admin to deploy a custom serverless product in Service Catalog. This product ID is then added to the Serverless configuration file. The plugin overrides the Serverless package:compileFunctions hook and inserts the CloudFormation templates from the specified Service Catalog product.
@@ -48,12 +49,12 @@ Create a Serverless Service Catalog CloudFormation template to create the Servic
1. Install the Serverless framework
```
- npm install -g serverless
+ npm install -g serverless
```
2. Create a Serverless project and add the plugin.
- ```
+ ```
serverless create --template aws-nodejs
npm install serverless-aws-servicecatalog
```
@@ -75,7 +76,7 @@ Create a Serverless Service Catalog CloudFormation template to create the Servic
4. Run the following to create the stack.
```
- serverless deploy
+ serverless deploy
```
Developers can then write CICD tools to encapsulate stages of this process and automate the deployment and management of their serverless services.
@@ -83,4 +84,4 @@ Developers can then write CICD tools to encapsulate stages of this process and a
### Summary
The serverless-aws-servicecatalog plugin provides developers with the power of Serverless deployments while allowing companies to maintain governance over AWS resources by using AWS Service Catalog. This is one step on the path to unlock the power of no-managed-resource applications for enterprise uses. By taking advantage of higher order abstractions over CloudFormation, such as Service Catalog, teams working with self-created and managed custom products can also make use of Serverless to develop, maintain and deploy these innovative new runtimes.
-
\ No newline at end of file
+
diff --git a/_posts/2021-06-09-android-animated-pride-rainbow.md b/_posts/2021-06-09-android-animated-pride-rainbow.md
index 67f1f39..872e35b 100644
--- a/_posts/2021-06-09-android-animated-pride-rainbow.md
+++ b/_posts/2021-06-09-android-animated-pride-rainbow.md
@@ -6,6 +6,7 @@ cover: /assets/images/android-animated-pride-rainbow/cover.jpg
excerpt: In this post, we take a deep dive look into how we created a Pride-themed easter egg inside the Over Android App. The easter egg is a rainbow bounding box that is drawn using OpenGL. We take a look at how to setup the required code in order to get OpenGL to render the rainbow box on screen and learn a bit more about OpenGL along the way!
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/android-animated-pride-rainbow
authors:
- name: Rebecca Franks
title: Principal Software Engineer
@@ -101,7 +102,7 @@ version:
```kotlin
val surfaceView = findViewById(R.id.surface)
-// We use OpenGLES 3.0 because it has more features than 2.0
+// We use OpenGLES 3.0 because it has more features than 2.0
// It has a couple of nice newer features like - vertex array objects etc - more information [here](https://stackoverflow.com/a/38163130)
surfaceView.setEGLContextClientVersion(3)
surfaceView.setRenderer(RainbowBoxRenderer())
@@ -142,8 +143,8 @@ stored in the same array and we will inform GL of the stride length (ie the numb
a standard box, this is the geometry we would use:
```kotlin
-// each line represents a "vertex" that GL will read. In this example there are 4 vertices to draw a square.
-// The first two values represent X,Y coords. The second two represent the corresponding coordinates of a texture/bitmap that should be loaded up at that point.
+// each line represents a "vertex" that GL will read. In this example there are 4 vertices to draw a square.
+// The first two values represent X,Y coords. The second two represent the corresponding coordinates of a texture/bitmap that should be loaded up at that point.
val attributeValues = floatArrayOf(
-1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 0.0f, 0.0f,
@@ -311,9 +312,9 @@ const vec4 COLORS[7] = vec4[](
out vec4 oColor;
void main() {
- // vProgress is interpolated between 0 - 1 by the vertex shader.
+ // vProgress is interpolated between 0 - 1 by the vertex shader.
// We multiply by uTimeOffset to give the animation over time.
- // We multiply uTimeOffset by 16 to make the speed of the animation a bit faster, and 0.125 to stretch out the gradient a bit more.
+ // We multiply uTimeOffset by 16 to make the speed of the animation a bit faster, and 0.125 to stretch out the gradient a bit more.
float progress = (vProgress + uTimeOffset * 16.0) * 0.125;
float colorIndex = mod(uDashCount * progress / 4.0, 6.0); // There are actually 6 colors, not 7
vec4 currentColor = COLORS[int(floor(colorIndex))];
@@ -394,10 +395,10 @@ At GoDaddy everyone is welcome, we strongly believe that diverse teams build bet
representation from all different groups. So for pride month, we are highlighting the GoDaddy United (LGBQT+) group,
which is designed to ensure that within the walls of our company, everyone is able to be themselves, feels safe and is
informed with regard to issues relating to the Lesbian, Gay, Bisexual, Transgender and Queer communities. For more
-information about this and other initiatives - head to our website [here](https://careers.godaddy.com/diversity).
+information about this and other initiatives - head to our website [here](https://careers.godaddy.com/diversity).
We love adding little bits of user delight and we hope this puts a bit of a smile on people’s faces when they encounter
it in the app. If you have any questions or feedback, feel free to reach out to me on Twitter
[@riggaroo](https://twitter.com/riggaroo)!
-
\ No newline at end of file
+
diff --git a/_posts/2021-06-14-test-harness.md b/_posts/2021-06-14-test-harness.md
index c9e601c..4c96c72 100644
--- a/_posts/2021-06-14-test-harness.md
+++ b/_posts/2021-06-14-test-harness.md
@@ -6,6 +6,7 @@ cover: /assets/images/test-harness/cover.jpg
excerpt: Writing APIs around SDKs in multiple languages proves to be an effective method of implementing a language-agnostic integration test suite.
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/test-harness
authors:
- name: Joe Bergeron
title: Software Engineer III
diff --git a/_posts/2021-07-07-radpack-your-dependencies.md b/_posts/2021-07-07-radpack-your-dependencies.md
index 98377d0..8406f30 100644
--- a/_posts/2021-07-07-radpack-your-dependencies.md
+++ b/_posts/2021-07-07-radpack-your-dependencies.md
@@ -6,6 +6,7 @@ cover: /assets/images/radpack-your-dependencies/cover.jpg
excerpt: Bundlers like Webpack do a great job at providing a toolset needed to deliver an optimal out-of-the-box delivery solution. Loaders on the other hand are focused on delivering only the requested assets, as they are needed, and have a much higher cacheability. Radpack offers the best of both worlds.
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/radpack-your-dependencies
authors:
- name: Aaron Silvas
title: Sr Principal Architect
diff --git a/_posts/2021-08-26-tartufo.md b/_posts/2021-08-26-tartufo.md
index 67bda31..3991f4c 100644
--- a/_posts/2021-08-26-tartufo.md
+++ b/_posts/2021-08-26-tartufo.md
@@ -6,6 +6,7 @@ cover: /assets/images/tartufo/cover.jpg
excerpt: In our never-ending quest to improve the security of our code and systems, GoDaddy has been tackling the task of removing all secrets and credentials from all code across the company. Read the story of the process, tools, and challenges we have faced in this journey.
options:
- full-bleed-cover
+canonical: https://godaddy.com/resources/news/tartufo
authors:
- name: Joey Wilhelm
title: Sr Software Engineer
diff --git a/_posts/2021-09-29-godaddy-response-csam.md b/_posts/2021-09-29-godaddy-response-csam.md
index 467e930..ec07650 100644
--- a/_posts/2021-09-29-godaddy-response-csam.md
+++ b/_posts/2021-09-29-godaddy-response-csam.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: GoDaddy takes an unsparing stance when it comes to hosting CSAM (Child Sexual Abuse Material). We use many resources available to detect, remove, and report hosted CSAM on our platform(s). We do not allow content that sexually exploits or endangers minors. In this blog post we discuss how we’ve helped to protect children – within our systems and beyond – and how we watch for and fight this abhorrent crime.
keywords: CSAM Investigation, CSEAI, Child Safety, Child Abuse, Grooming
+canonical: https://godaddy.com/resources/news/godaddy-response-csam
authors:
- name: Akshay Grover
title: Mgr - Software Development
diff --git a/_posts/2021-11-08-android-state-management-mvi.md b/_posts/2021-11-08-android-state-management-mvi.md
index b4ca566..07c78d8 100644
--- a/_posts/2021-11-08-android-state-management-mvi.md
+++ b/_posts/2021-11-08-android-state-management-mvi.md
@@ -5,8 +5,9 @@ date: 2021-11-05 00:00:00 -0700
cover: /assets/images/android-state-management-mvi/cover.jpg
options:
- full-bleed-cover
-excerpt: In this post, we will look at the journey that the GoDaddy Studio Android team took with how UI state is managed across the app. We will cover MVVM and how it caused issues, the initial MVI implementation and the issues we faced. Finally, we will look at how we landed on using Spotify’s Mobius Framework for managing state.
+excerpt: In this post, we will look at the journey that the GoDaddy Studio Android team took with how UI state is managed across the app. We will cover MVVM and how it caused issues, the initial MVI implementation and the issues we faced. Finally, we will look at how we landed on using Spotify’s Mobius Framework for managing state.
keywords: Android, Architecture, MVI, MVVM, State machine, Mobius
+canonical: https://godaddy.com/resources/news/android-state-management-mvi
authors:
- name: Rebecca Franks
title: Software Development Engineer IV
@@ -24,11 +25,11 @@ The GoDaddy Studio Android app began with a fresh codebase around the end of 201
As time went on, we started facing issues with the MVI approach. The way we implemented it, unfortunately, allowed for race conditions and caused a lot of headaches for the team. It was at this point that we decided to investigate using existing frameworks for unidirectional data flow and see if they could solve the problems we were seeing. After evaluating a few, we settled on using the [Spotify Mobius Framework](https://github.com/spotify/mobius) for various reasons which we will dive into in this blog post.
-## State Management
+## State Management
-Let’s step back a bit and learn about the issues we faced with our approaches over the past couple of years. What does it mean when we talk about State Management for UI? State management refers to keeping track of how a user interface should look and how it should react to different user inputs. On a complex screen with plenty of buttons, gestures and text input - managing the state is a full-time concern.
+Let’s step back a bit and learn about the issues we faced with our approaches over the past couple of years. What does it mean when we talk about State Management for UI? State management refers to keeping track of how a user interface should look and how it should react to different user inputs. On a complex screen with plenty of buttons, gestures and text input - managing the state is a full-time concern.
-Take this screen for example:
+Take this screen for example:
{:refdef: style="text-align: center;"}
{: width="250" }
{: refdef}
@@ -39,15 +40,15 @@ There are plenty of concerns that need to be managed and tracked on this screen
- What is the currently selected tool on screen?
- What are the layers and properties that should be displayed in this project?
-Not only is there the current state of what should be rendered on screen, but there are many different interactions that need to mutate this state - scaling gestures, button taps, colour changes, etc.
+Not only is there the current state of what should be rendered on screen, but there are many different interactions that need to mutate this state - scaling gestures, button taps, colour changes, etc.
## MVVM and the issues we faced 😣
A couple of years ago, the Android community began advocating for using **some kind of architecture,** as we all realized that placing all your logic inside the Activity, was a perfect recipe for the messiest spaghetti bolognaise you could imagine (delicious but not very elegant).
-First came **MVP** (Model-View-Presenter) and there were great benefits to applying this architecture to our apps: we got testability, separation of concerns and the ability to re-use logic on other screens.
+First came **MVP** (Model-View-Presenter) and there were great benefits to applying this architecture to our apps: we got testability, separation of concerns and the ability to re-use logic on other screens.
-Then came along **MVVM** (Model-View-ViewModel), which solved a lot of issues that MVP had: mostly the ability to have the ViewModel unaware of the View or who was listening to any changes that are happening.
+Then came along **MVVM** (Model-View-ViewModel), which solved a lot of issues that MVP had: mostly the ability to have the ViewModel unaware of the View or who was listening to any changes that are happening.
We were using **MVVM** in certain places in our app, but we very quickly found issues with how we approached using MVVM.
@@ -79,7 +80,7 @@ class ProjectEditViewModel: ViewModel() {
This example looks good - loading and setting a project. But think of this scenario: a user clicks on the “**create project**" button, and it fails, populating the “**error**" `LiveData`. They click "create project" again and it succeeds but the error value is still populated. Now we have a loaded project and an error screen shown at the same time, what is the correct state to show to a user?
-Some might solve this problem by saying: “You need to reset the `error.value` inside `onSuccess`“ and whilst that could help improve things, the very nature of these `LiveData` observables being separate objects, is the **bigger** issue here. Let’s go a bit deeper into why multiple observables can be problematic.
+Some might solve this problem by saying: “You need to reset the `error.value` inside `onSuccess`“ and whilst that could help improve things, the very nature of these `LiveData` observables being separate objects, is the **bigger** issue here. Let’s go a bit deeper into why multiple observables can be problematic.
This is how we would typically observe these `LiveData` objects for changes inside the Fragment:
@@ -100,7 +101,7 @@ class ProjectFragment: Fragment() {
}
```
-From this example, it is difficult to know what the UI of the screen will look like at any point because each `LiveData` observable can emit a new state at **any point in time**. If we start adding new functions to our `ViewModel` that emit new loading or error states, would you be able to describe what the UI will look like at a single point in time?
+From this example, it is difficult to know what the UI of the screen will look like at any point because each `LiveData` observable can emit a new state at **any point in time**. If we start adding new functions to our `ViewModel` that emit new loading or error states, would you be able to describe what the UI will look like at a single point in time?
This can result in a [race condition](https://en.wikipedia.org/wiki/Race_condition) since these separate observables can emit state changes independently. What would the state look like if an error is emitted but there is currently a project loaded?
@@ -117,7 +118,7 @@ There are several drawbacks when using this approach of MVVM with separate LiveD
- There is no single snapshot to be able to recreate the UI from easily.
- This also then begs the question, are we handling all the potential cases here?
-One way to potentially improve on this behaviour, is to use data classes that contain the state information in one class and expose only a singular LiveData object to the UI. This would help solve the issue of having multiple observables emitting different state that we’d need to keep track of, and it's a building block of how MVI can work, as we will explore next.
+One way to potentially improve on this behaviour, is to use data classes that contain the state information in one class and expose only a singular LiveData object to the UI. This would help solve the issue of having multiple observables emitting different state that we’d need to keep track of, and it's a building block of how MVI can work, as we will explore next.
# MVI / Unidirectional Data Flow
@@ -149,7 +150,7 @@ As mentioned at the start of this post, we took inspiration for our MVI implemen
{: refdef}
-With this mechanism in mind, the code looked as follows. The `EditorAction` ‘s were fired from the UI, and the `EditorState` is an example of what the single state of the UI could look like:
+With this mechanism in mind, the code looked as follows. The `EditorAction` ‘s were fired from the UI, and the `EditorState` is an example of what the single state of the UI could look like:
```kotlin
sealed class EditorAction {
@@ -227,7 +228,7 @@ class EditorViewModel : ViewModel() {
}
```
-Then, inside our fragment, we were now observing only the **single state** that was emitted from the `ViewModel`, and not a bunch of observables as shown inside the MVVM example.
+Then, inside our fragment, we were now observing only the **single state** that was emitted from the `ViewModel`, and not a bunch of observables as shown inside the MVVM example.
```kotlin
class MainActivity : Fragment() {
@@ -253,15 +254,15 @@ class MainActivity : Fragment() {
This approach that we initially went with had many benefits and advantages over multiple `LiveData` observables as we saw in the MVVM example earlier. Some of the advantages include:
-- We are now avoiding issues with different states being emitted from different `LiveData` objects that can emit at any time. We have a **single state** controlling this.
-- Using the data class `.copy()` mechanism to update parts of the state that have changed, helped to not lose data along the way, as you only change parts of the object that need to change.
-- Our UI layer is minimal now - it only fires actions that have happened and there is not any logic sitting inside the view.
-- There is a clearer separation of concerns, Actions, Processors, Reducers controlling the UI state. Nothing external is changing the state. This makes it easier to test and ensure it is doing the correct thing.
+- We are now avoiding issues with different states being emitted from different `LiveData` objects that can emit at any time. We have a **single state** controlling this.
+- Using the data class `.copy()` mechanism to update parts of the state that have changed, helped to not lose data along the way, as you only change parts of the object that need to change.
+- Our UI layer is minimal now - it only fires actions that have happened and there is not any logic sitting inside the view.
+- There is a clearer separation of concerns, Actions, Processors, Reducers controlling the UI state. Nothing external is changing the state. This makes it easier to test and ensure it is doing the correct thing.
- There is also a clear pattern that keeps the code clean and allowed us to separate actions into different files, so we didn’t have all the logic inside the ViewModel file either. (We have over 200 unique actions that can happen on a single screen)
-But not everything worked as expected with this MVI setup either! 😩 Although for the most part things seemed to work well on the surface, we started observing strange crashes in production and a few race conditions along the way.
+But not everything worked as expected with this MVI setup either! 😩 Although for the most part things seemed to work well on the surface, we started observing strange crashes in production and a few race conditions along the way.
-Let’s talk a bit about the issues we faced with this particular MVI approach. (Did we mention, it has been a long journey?😅)
+Let’s talk a bit about the issues we faced with this particular MVI approach. (Did we mention, it has been a long journey?😅)
## Issues with our MVI implementation
@@ -303,7 +304,7 @@ Our MVI implementation was fine when events were sent sporadically and were proc
Having identified all the shortcomings of our current implementation, we came up with a new set of requirements for the new implementation:
-- Unidirectional flow of data: actions in, state out - we knew this was a good assumption and wanted to stick with it.
+- Unidirectional flow of data: actions in, state out - we knew this was a good assumption and wanted to stick with it.
- Concurrency
- Synchronized state access - we couldn’t let multiple concurrent jobs read and write state as they pleased
- Non-blocking events processing - receiving events had to be as fast as possible, however, processing could be much slower (i.e. requiring slow I/O operations, like network calls) and should not block the processing of new events
@@ -403,16 +404,16 @@ After digging through and learning the ins and outs of Mobius, we decided to sta
With every new framework or architecture decision, there is likely never going to be the solution that fits everyone, and adopting something like the Mobius Framework also comes with these disadvantages to adopting:
-- It requires quite a bit of boilerplate code to set up. We’ve solved this using shared code templates to generate most of the classes we need.
-- New framework for people to learn. Any new engineer needs to spend a bit of time learning about the framework, working through some examples and implementing a feature with it.
+- It requires quite a bit of boilerplate code to set up. We’ve solved this using shared code templates to generate most of the classes we need.
+- New framework for people to learn. Any new engineer needs to spend a bit of time learning about the framework, working through some examples and implementing a feature with it.
# Summary 🎉
-We’ve learnt a lot over the past couple of years, and I don’t doubt that we won’t learn more in the future.
+We’ve learnt a lot over the past couple of years, and I don’t doubt that we won’t learn more in the future.
-Right now, we have been successfully using Spotify’s Mobius Framework in our app for the past year and have migrated our largest piece of work - the Canvas Editor to use it too. After switching to Mobius in the Canvas Editor, we observed fewer bugs and race conditions with state were resolved. The level of testing and separation of concerns we’ve achieved using MVI over the years has improved our code quality and eliminated the “god class” activity/view Model that we’ve seen in the past.
+Right now, we have been successfully using Spotify’s Mobius Framework in our app for the past year and have migrated our largest piece of work - the Canvas Editor to use it too. After switching to Mobius in the Canvas Editor, we observed fewer bugs and race conditions with state were resolved. The level of testing and separation of concerns we’ve achieved using MVI over the years has improved our code quality and eliminated the “god class” activity/view Model that we’ve seen in the past.
-We hope this write-up of our journey can help you think a bit more about state management and the potential for race conditions with complicated state.
+We hope this write-up of our journey can help you think a bit more about state management and the potential for race conditions with complicated state.
Have any questions or feedback? Feel free to reach out to [Rebecca](https://twitter.com/riggaroo), [Kamil](https://www.linkedin.com/in/kamilslesinski/) or [@GoDaddyOSS](https://twitter.com/godaddyoss)!
diff --git a/_posts/2022-01-06-tartufo-v3.md b/_posts/2022-01-06-tartufo-v3.md
index b38bfd5..439c617 100644
--- a/_posts/2022-01-06-tartufo-v3.md
+++ b/_posts/2022-01-06-tartufo-v3.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: We have prepared a brand new release of our credential scanning tool, tartufo, packed full of new features, massive performance gains, and improvements to the user experience!
keywords: tartufo, secrets, secret scanning, security
+canonical: https://godaddy.com/resources/news/tartufo-v3
authors:
- name: Joey Wilhelm
title: Sr Software Engineer
diff --git a/_posts/2022-01-10-running-puma-in-aws.md b/_posts/2022-01-10-running-puma-in-aws.md
index 4ec1b76..24bfd45 100644
--- a/_posts/2022-01-10-running-puma-in-aws.md
+++ b/_posts/2022-01-10-running-puma-in-aws.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: In the past couple of years, we have been on our journey to the cloud migrating our web services to AWS. In this blog post, we share what we learned about deploying Puma web server to AWS by migrating our email delivery service written in Ruby to AWS.
keywords: Puma, Ruby, AWS, ALB, Security
+canonical: https://godaddy.com/resources/news/running-puma-in-aws
authors:
- name: Dalibor Nasevic
title: Sr. Principal Software Engineer
diff --git a/_posts/2022-01-28-raising-the-bar-for-devsecops-beyond.md b/_posts/2022-01-28-raising-the-bar-for-devsecops-beyond.md
index cecd5ab..c3b2deb 100644
--- a/_posts/2022-01-28-raising-the-bar-for-devsecops-beyond.md
+++ b/_posts/2022-01-28-raising-the-bar-for-devsecops-beyond.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: DevSecFinOps (Development + Security + Finance + Operations) means developers are accountable for more and more disciplines related to the services they build. Organizations can ease this burden by building internal developer platforms that prioritize the developer experience.
keywords: DevOps, DevSecFinOps, Automation, Developer Platform
+canonical: https://godaddy.com/resources/news/raising-the-bar-for-devsecops-beyond
authors:
- name: Keith Bartholomew
title: Software Engineer
diff --git a/_posts/2022-03-22-fluent-bit-plugins-in-go.md b/_posts/2022-03-22-fluent-bit-plugins-in-go.md
index 489303d..d6a1c3a 100644
--- a/_posts/2022-03-22-fluent-bit-plugins-in-go.md
+++ b/_posts/2022-03-22-fluent-bit-plugins-in-go.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Fluent Bit is a powerful tool for log management, filtering and exporting. Learn how you can extend its functionality even further using Go to build output plugins
keywords: fluent-bit, logging, go, plugins
+canonical: https://godaddy.com/resources/news/fluent-bit-plugins-in-go
authors:
- name: Todd Kennedy
title: Principal Software Developer
diff --git a/_posts/2022-05-27-study-group-framework.md b/_posts/2022-05-27-study-group-framework.md
index ccb2b5f..6e21679 100644
--- a/_posts/2022-05-27-study-group-framework.md
+++ b/_posts/2022-05-27-study-group-framework.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: How to keep learning new skills while meeting deadlines at work and maintaining a good work-life balance.
keywords: skill development, certification, procrastination, conflicting priorities
+canonical: https://godaddy.com/resources/news/study-group-framework
authors:
- name: Mayur Jain
title: Director of Engineering
diff --git a/_posts/2022-07-28-websites-and-marketing-case-study.md b/_posts/2022-07-28-websites-and-marketing-case-study.md
index 2dcaeb7..9550a7c 100644
--- a/_posts/2022-07-28-websites-and-marketing-case-study.md
+++ b/_posts/2022-07-28-websites-and-marketing-case-study.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Case study on how we improved performance and speed in Website + Marketing.
keywords: website, performance, speed
+canonical: https://godaddy.com/resources/news/websites-and-marketing-case-study
authors:
- name: Simon Le Parc
title: Sr. Mgr - Software Development
diff --git a/_posts/2022-09-12-rails-bulk-insert-mysql.md b/_posts/2022-09-12-rails-bulk-insert-mysql.md
index 2fc4066..a4a74c8 100644
--- a/_posts/2022-09-12-rails-bulk-insert-mysql.md
+++ b/_posts/2022-09-12-rails-bulk-insert-mysql.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: This blog post explores how we optimized our Email Batch API by using Rails bulk inserts with MySQL and how to calculate the auto-incrementing IDs for records, given MySQL does not support a RETURNING clause.
keywords: rails, bulk insert, mysql,
+canonical: https://godaddy.com/resources/news/rails-bulk-insert-mysql
authors:
- name: Dalibor Nasevic
title: Sr. Principal Software Engineer
diff --git a/_posts/2022-09-19-sample-size-calculator.md b/_posts/2022-09-19-sample-size-calculator.md
index 280ec3a..2fa6813 100644
--- a/_posts/2022-09-19-sample-size-calculator.md
+++ b/_posts/2022-09-19-sample-size-calculator.md
@@ -8,6 +8,7 @@ options:
usemathjax: true
excerpt: GoDaddy's Hivemind team built a Python sample size calculator that handles a wide variety of experiment metric types and multiple testing scenarios.
keywords: sample size calculator, A/B test, false discovery rate adjustment, Python
+canonical: https://godaddy.com/resources/news/sample-size-calculator
authors:
- name: Xinyu Zou
title: Data Scientist-Experimentation Platform
diff --git a/_posts/2022-09-29-track-aws-resources-using-globaltechregistry.md b/_posts/2022-09-29-track-aws-resources-using-globaltechregistry.md
index 8190874..499af1f 100644
--- a/_posts/2022-09-29-track-aws-resources-using-globaltechregistry.md
+++ b/_posts/2022-09-29-track-aws-resources-using-globaltechregistry.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Global Tech Registry (GTR) is a metadata registry service that provides insight into GoDaddy's AWS Cloud deployments. By combining metadata from various sources with active AWS health events, GTR is able to immediately discover the impact on GoDaddy products and notify the relevant teams with impacted services.
keywords: globaltechregistry, gtr, cloud operations, goDaddy metadata registry, Observability, aws service outage, aws resources discovery, aws health events, aws config, aws lambda, sns, sqs
+canonical: https://godaddy.com/resources/news/track-aws-resources-using-globaltechregistry
authors:
- name: Jan-Erik Carlsen
title: Principal Software Engineer
diff --git a/_posts/2022-10-25-chasing-runaway-memory-usage-in-istio-sidecars.md b/_posts/2022-10-25-chasing-runaway-memory-usage-in-istio-sidecars.md
index 31196a2..b663384 100644
--- a/_posts/2022-10-25-chasing-runaway-memory-usage-in-istio-sidecars.md
+++ b/_posts/2022-10-25-chasing-runaway-memory-usage-in-istio-sidecars.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: When a service on our Kubernetes cluster started using too much memory, I thought the service itself was to blame. After a long debugging journey, I found that a misconfigured Istio sidecar proxy was actually to blame.
keywords: kubernetes, istio, service mesh, cloudwatch, prometheus, bug
+canonical: https://godaddy.com/resources/news/chasing-runaway-memory-usage-in-istio-sidecars
authors:
- name: Keith Bartholomew
title: Senior Software Engineer
diff --git a/_posts/2022-10-31-optimized-hosting.md b/_posts/2022-10-31-optimized-hosting.md
index 625a92c..beeb460 100644
--- a/_posts/2022-10-31-optimized-hosting.md
+++ b/_posts/2022-10-31-optimized-hosting.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Did you ever wonder how GoDaddy runs your website? Or how one might go about hosting millions of websites? How about running a hundred thousand Virtual Private Servers (VPS)?
keywords: webhosting, vps, virtual private server, hosting, vserver, scale, reliability, availability
+canonical: https://godaddy.com/resources/news/optimized-hosting
authors:
- name: Robert Breker
title: Senior Director, Software Development
diff --git a/_posts/2022-12-01-data-mesh.md b/_posts/2022-12-01-data-mesh.md
index 1a70829..3141784 100644
--- a/_posts/2022-12-01-data-mesh.md
+++ b/_posts/2022-12-01-data-mesh.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: In this post, we discuss how GoDaddy uses AWS Lake Formation to simplify security management and data governance at scale, and enable data as a service (DaaS) supporting organization-wide data accessibility with cross-account data sharing using a data mesh architecture.
keywords: Amazon Simple Storage Service (S3), Analytics, AWS Big Data, AWS Glue, AWS Lake Formation
+canonical: https://godaddy.com/resources/news/data-mesh
authors:
- name: Ankit Jhalaria
title: Director of Engineering at GoDaddy
diff --git a/_posts/2022-12-15-search-data-engineering.md b/_posts/2022-12-15-search-data-engineering.md
index 27dec57..b6f2e82 100644
--- a/_posts/2022-12-15-search-data-engineering.md
+++ b/_posts/2022-12-15-search-data-engineering.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: GoDaddy provides best in class search experience for people looking for domain names. Search data engineering is the critical plumbing behind the seamless search experience on the GoDaddy search page. In this blog post, we provide some insights into the inner workings of the data pipelines by delving into the architecture and the implementation of the search data infrastructure.
keywords: Data Pipeline DataEngineering, Data Engineering Jobs, Data Mart, Domain search, Machine Learning, AWS, Airflow, EMR
+canonical: https://godaddy.com/resources/news/search-data-engineering
authors:
- name: Ankush Prasad
title: Principal Software Engineer
diff --git a/_posts/2023-02-03-mental-health-in-software-industry.md b/_posts/2023-02-03-mental-health-in-software-industry.md
index bf531ca..b80b837 100644
--- a/_posts/2023-02-03-mental-health-in-software-industry.md
+++ b/_posts/2023-02-03-mental-health-in-software-industry.md
@@ -5,19 +5,20 @@ date: 2023-02-03
cover: /assets/images/mental-health-repost/cover-photo.jpg
options:
- full-bleed-cover
-excerpt: If you’ve ever been on a job hunt in the software industry, you’ve likely seen a company list “work-life balance” as a benefit. The fact that companies need to tell prospective employees that they’ll allow them to “have a life” is telling, but often missed in this discussion of balance, is mental health.
+excerpt: If you’ve ever been on a job hunt in the software industry, you’ve likely seen a company list “work-life balance” as a benefit. The fact that companies need to tell prospective employees that they’ll allow them to “have a life” is telling, but often missed in this discussion of balance, is mental health.
keywords: software, mental health, support
+canonical: https://godaddy.com/resources/news/mental-health-in-software-industry
authors:
- name: Shane Parker
title: Sr Software Development Engineer
url: https://www.shnparker.com/
photo: /assets/images/sparker.jpeg
---
-
-If you’ve ever been on a job hunt in the software industry, you’ve likely seen a company list “work-life balance” as a benefit. The fact that companies need to tell prospective employees that they’ll allow them to “have a life” is telling, but often missed in this discussion of balance, is mental health.
-On his personal blog, Senior Software Development Engineer, Shane Parker, describes his journey to realization that the high stress of software development led to mental health issues that needed treatment. He highlights some of the common stressors that many people in software experience (and may not even know are stressors) and some of the changes he incorporated in his life to help improve his mental well-being.
+If you’ve ever been on a job hunt in the software industry, you’ve likely seen a company list “work-life balance” as a benefit. The fact that companies need to tell prospective employees that they’ll allow them to “have a life” is telling, but often missed in this discussion of balance, is mental health.
-We commend Shane for having the courage to share such a personal and important topic. His story serves as a reminder that mental health should be a priority for everyone in the software industry. If you're struggling with stress or mental health issues, know that help is available and it's important to seek support.
+On his personal blog, Senior Software Development Engineer, Shane Parker, describes his journey to realization that the high stress of software development led to mental health issues that needed treatment. He highlights some of the common stressors that many people in software experience (and may not even know are stressors) and some of the changes he incorporated in his life to help improve his mental well-being.
+
+We commend Shane for having the courage to share such a personal and important topic. His story serves as a reminder that mental health should be a priority for everyone in the software industry. If you're struggling with stress or mental health issues, know that help is available and it's important to seek support.
Check out Shane's full post on his site here,
diff --git a/_posts/2023-03-02-mobile-to-webview-bridge-with-rxjs-and-redux.md b/_posts/2023-03-02-mobile-to-webview-bridge-with-rxjs-and-redux.md
index 59fe92b..05cb828 100644
--- a/_posts/2023-03-02-mobile-to-webview-bridge-with-rxjs-and-redux.md
+++ b/_posts/2023-03-02-mobile-to-webview-bridge-with-rxjs-and-redux.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: In this post, we'll take a look at how our team built a robust duplex bridge between our mobile and webview code. We'll also take a look at how we use RxJS observables to deal with messages from the bridge combined with actions dispatched from our React app that runs in the webview.
keywords: RxJS, JavaScript, Promises, UI, Mobile, React, Redux
+canonical: https://godaddy.com/resources/news/mobile-to-webview-bridge-with-rxjs-and-redux
authors:
- name: Hendrik Swanepoel
title: Principal Engineer, Software Development
diff --git a/_posts/2023-03-20-leveraging-ffis.md b/_posts/2023-03-20-leveraging-ffis.md
index 8212709..0718453 100644
--- a/_posts/2023-03-20-leveraging-ffis.md
+++ b/_posts/2023-03-20-leveraging-ffis.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: By leveraging foreign function interface and C shared libraries, GoDaddy can unify the implementation of libraries in Go or Rust and share those libraries with other languages.
keywords: FFI
+canonical: https://godaddy.com/resources/news/leveraging-ffis
authors:
- name: Jeremiah Gowdy
title: Senior Principal Architect
diff --git a/_posts/2023-03-28-data-platform-evolution.md b/_posts/2023-03-28-data-platform-evolution.md
index 99bf1e3..fb3a91f 100644
--- a/_posts/2023-03-28-data-platform-evolution.md
+++ b/_posts/2023-03-28-data-platform-evolution.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: This technical blog provides an in-depth look at the evolution of data at GoDaddy, highlighting the challenges faced along the way and the journey towards building a modern, low-cost cloud data platform.
keywords: data platform, godaddy, data lake
+canonical: https://godaddy.com/resources/news/data-platform-evolution
authors:
- name: Naren Parihar
title: Sr. Director of Engineering
diff --git a/_posts/2023-04-26-improving-company-agility-and-scale-in-the-cloud.md b/_posts/2023-04-26-improving-company-agility-and-scale-in-the-cloud.md
index 9a0ce44..cb2494e 100644
--- a/_posts/2023-04-26-improving-company-agility-and-scale-in-the-cloud.md
+++ b/_posts/2023-04-26-improving-company-agility-and-scale-in-the-cloud.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Learn how GoDaddy improved management, governance, and observability across its platforms using AWS.
keywords: cloud platform, godaddy, agility, scale, aws
+canonical: https://godaddy.com/resources/news/improving-company-agility-and-scale-in-the-cloud
authors:
- name: Ketan Patel
title: Sr. Director of Software Development
@@ -25,4 +26,4 @@ To read about how we continue to scale in order to deliver new value and feature
If you want to be part of an awesome team that works to solve problems and build solutions for millions of small businesses, check out our [current open roles](https://careers.godaddy.com/search-jobs).
-*Cover Photo Attribution: Photo by [William Bout](https://unsplash.com/@williambout) on [Unsplash](https://unsplash.com/photos/7cdFZmLlWOM).*
+*Cover Photo Attribution: Photo by [William Bout](https://unsplash.com/@williambout) on [Unsplash](https://unsplash.com/photos/7cdFZmLlWOM).*
diff --git a/_posts/2023-05-23-application-layer-encryption-in-ruby-on-rails-with-asherah.md b/_posts/2023-05-23-application-layer-encryption-in-ruby-on-rails-with-asherah.md
index ed6f421..c4156fe 100644
--- a/_posts/2023-05-23-application-layer-encryption-in-ruby-on-rails-with-asherah.md
+++ b/_posts/2023-05-23-application-layer-encryption-in-ruby-on-rails-with-asherah.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: This article explores how we implement Application Layer Encryption in Ruby on Rails applications to protect customer-sensitive data with Asherah.
keywords: ruby, ruby on rails, application layer encryption, security
+canonical: https://godaddy.com/resources/news/application-layer-encryption-in-ruby-on-rails-with-asherah
authors:
- name: Dalibor Nasevic
title: Sr. Principal Software Engineer
diff --git a/_posts/2023-06-13-hosting-in-aws.md b/_posts/2023-06-13-hosting-in-aws.md
index c84bd56..6d26e78 100644
--- a/_posts/2023-06-13-hosting-in-aws.md
+++ b/_posts/2023-06-13-hosting-in-aws.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Learn how GoDaddy improved the performance and reliability of its on-prem Websites + Marketing hosting platform by migrating to AWS.
keywords: cloud platform, godaddy, agility, scale, aws, hosting
+canonical: https://godaddy.com/resources/news/hosting-in-aws
authors:
- name: Christopher Hinrichs
title: Principal Software Engineer
diff --git a/_posts/2023-06-23-ceph-storage.md b/_posts/2023-06-23-ceph-storage.md
index 59626fa..2fa3230 100644
--- a/_posts/2023-06-23-ceph-storage.md
+++ b/_posts/2023-06-23-ceph-storage.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Global Storage Engineering (GSE) migrated 2.5PB of Managed Word Press (MWP) data from vendor supported storage to opensource community supported Ceph storage utilizing CephFS in 9 months, resulting in improved customer experience.
keywords: Ceph, CephFS, MWP, Managed Word Press, Storage
+canonical: https://godaddy.com/resources/news/ceph-storage
authors:
- name: Joe Bardgett
title: SRE Sr. Manager
diff --git a/_posts/2023-08-07-lambda-rest-api-using-aws-cdk.md b/_posts/2023-08-07-lambda-rest-api-using-aws-cdk.md
index 809c6ce..b32b6b6 100644
--- a/_posts/2023-08-07-lambda-rest-api-using-aws-cdk.md
+++ b/_posts/2023-08-07-lambda-rest-api-using-aws-cdk.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Explore the step-by-step process of deploying an AWS lambda backed API using AWS CDK in this detailed guide.
keywords: aws, godaddy, cdk, api
+canonical: https://godaddy.com/resources/news/lambda-rest-api-using-aws-cdk
authors:
- name: Sushant Mimani
title: Sr. Software Development Engineer
diff --git a/_posts/2023-08-14-open-source-summit-north-america-2023.md b/_posts/2023-08-14-open-source-summit-north-america-2023.md
index cd65bc8..ca730ff 100644
--- a/_posts/2023-08-14-open-source-summit-north-america-2023.md
+++ b/_posts/2023-08-14-open-source-summit-north-america-2023.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: The 2023 Linux Foundation Open Source Summit in Vacouver, WA was one of the key events for open source developers. GoDaddy sent representatives to the conference and 3 of them share their experiences.
keywords: Open Source Summit, Linux Foundation, OpenJS Foundation, OSS
+canonical: https://godaddy.com/resources/news/open-source-summit-north-america-2023
authors:
- name: Courtney Robertson
title: Open Source Developer Advocate
diff --git a/_posts/2023-08-22-cpu-vulnerability-management.md b/_posts/2023-08-22-cpu-vulnerability-management.md
index a5838d5..aad72d9 100644
--- a/_posts/2023-08-22-cpu-vulnerability-management.md
+++ b/_posts/2023-08-22-cpu-vulnerability-management.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: CPU vulnerabilities that expose sensitive data have become commonplace in the last few years. Learn more about these vulnerabilities and how GoDaddy responds to protect its customers.
keywords: downfall, zenbleed, spectre, meltdown, vulnerability, mitigation, cpu, intel, amd
+canonical: https://godaddy.com/resources/news/cpu-vulnerability-management
authors:
- name: Brian Diekelman
title: Principal Software Engineer
diff --git a/_posts/2023-09-05-cmdb.md b/_posts/2023-09-05-cmdb.md
index 105173a..f692962 100644
--- a/_posts/2023-09-05-cmdb.md
+++ b/_posts/2023-09-05-cmdb.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Configuration Management Database (CMDB) plays a vitally important role in the hyper-efficient operation of all GoDaddy products. This article explains how GoDaddy evolved its CMDB into a trustworthy source of truth.
keywords: GoDaddy, Configuration, Management, Database, CMDB, Configuration, Item, Security, Compliance
+canonical: https://godaddy.com/resources/news/cmdb
authors:
- name: David Koopman
title: Principal Engineer, SRE VI
diff --git a/_posts/2023-09-28-aws-cdk-adoption.md b/_posts/2023-09-28-aws-cdk-adoption.md
index 9c12ca1..1f9521c 100644
--- a/_posts/2023-09-28-aws-cdk-adoption.md
+++ b/_posts/2023-09-28-aws-cdk-adoption.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Learn how GoDaddy is helping its developers provision infrastructure quickly and securely using AWS Cloud Development Kit.
keywords: cloud platform, godaddy, agility, scale, aws, cdk, cloud development kit
+canonical: https://godaddy.com/resources/news/aws-cdk-adoption
authors:
- name: Ketan Patel
title: Sr. Director of Software Development
diff --git a/_posts/2023-10-26-layered-architecture-for-a-data-lake.md b/_posts/2023-10-26-layered-architecture-for-a-data-lake.md
index a9b7296..47ddbf7 100644
--- a/_posts/2023-10-26-layered-architecture-for-a-data-lake.md
+++ b/_posts/2023-10-26-layered-architecture-for-a-data-lake.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: In this post, we discuss how GoDaddy uses Layered Architecture to build its Data Lake.
keywords: Enterprise Data Layers, Analytics
+canonical: https://godaddy.com/resources/news/layered-architecture-for-a-data-lake
authors:
- name: Kamran Ali
title: former Principal Data Engineer
diff --git a/_posts/2023-11-16-api-gateway-at-godaddy.md b/_posts/2023-11-16-api-gateway-at-godaddy.md
index 17ff458..eff9133 100644
--- a/_posts/2023-11-16-api-gateway-at-godaddy.md
+++ b/_posts/2023-11-16-api-gateway-at-godaddy.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
summary: We go over a new API Management initiative at GoDaddy using a self-serve API Gateway.
keywords: godaddy, api gateway, api management, envoy, oauth2, authentication, authorization, rate limiting, observability
+canonical: https://godaddy.com/resources/news/api-gateway-at-godaddy
authors:
- name: Carsten Blecken
title: Sr. Principal Engineer
@@ -20,7 +21,7 @@ authors:
From domain registrations to commerce, GoDaddy is known to be the platform that entrepreneurs build their businesses on. There's an obvious need to provide simple and great user experiences through web and mobile so our customers (and their customers) can access all the services we offer.
-While GoDaddy is the leader in registering domains for individual businesses, there is a large but lesser-known customer base of resellers and partners that rely on GoDaddy. These resellers and partners use different GoDaddy APIs to build their own offerings for various niche markets. The need to provide quality APIs to this group is essential for our customers to expand the reach of our solutions.
+While GoDaddy is the leader in registering domains for individual businesses, there is a large but lesser-known customer base of resellers and partners that rely on GoDaddy. These resellers and partners use different GoDaddy APIs to build their own offerings for various niche markets. The need to provide quality APIs to this group is essential for our customers to expand the reach of our solutions.
We laid the foundations for new omnichannel commerce solutions from GoDaddy in 2021 by building, consolidating, and optimizing various commerce services as a single, unified platform. This unified commerce platform drives all of our commerce solutions across all channels. Following standard modeling and design techniques like domain-driven design and an API-first approach has helped standardize all of our APIs and establish consistent authentication (authn) and authorization (authz) patterns. This ultimately led to building a common entry point for all our APIs to enforce consistent patterns and manage all APIs from a single location.
@@ -123,10 +124,10 @@ Running Envoy inside [Amazon Elastic Kubernetes Service](https://aws.amazon.com/
Each region-based Kubernetes cluster is an AWS auto-scaling group, and nodes are easily scaled up through the cluster autoscaler. The cluster has three nodes in three different availability zones to maximize availability. Every 24 hours, these nodes are rotated to comply with our corporate security policy.
-The gateway is set up in five different environments:
+The gateway is set up in five different environments:
- Experimental - the cluster used for the internal gateway development.
- Development - the cluster used for the initial internal integration setup for services.
-- Test - the cluster that allows service owners to run their automated integration tests.
+- Test - the cluster that allows service owners to run their automated integration tests.
- Staging (or OTE) - the cluster primarily used to run load and automated end-to-end tests and provides services in a production-like, highly-performing environment.
- Production - the cluster where live traffic occurs.
diff --git a/_posts/2023-11-20-emr-serverless-on-arm64.md b/_posts/2023-11-20-emr-serverless-on-arm64.md
index 6ea1dc7..8545bd6 100644
--- a/_posts/2023-11-20-emr-serverless-on-arm64.md
+++ b/_posts/2023-11-20-emr-serverless-on-arm64.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Learn how GoDaddy is helping its developers provision infrastructure quickly and securely using AWS Cloud Development Kit.
keywords: Amazon EMR, Analytics, Best Practices, Graviton, Serverless
+canonical: https://godaddy.com/resources/news/emr-serverless-on-arm64
authors:
- name: Mukul Sharma
title: Software Development Engineer
diff --git a/_posts/2023-12-07-cloud-cost-management-aws.md b/_posts/2023-12-07-cloud-cost-management-aws.md
index 2b84ff7..315568d 100644
--- a/_posts/2023-12-07-cloud-cost-management-aws.md
+++ b/_posts/2023-12-07-cloud-cost-management-aws.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: Learn how GoDaddy instills a cost-accountable culture as it continues to scale quickly and securely using AWS.
keywords: cloud, cost management, finops, godaddy, agility, scale, aws
+canonical: https://godaddy.com/resources/news/cloud-cost-management-aws
authors:
- name: Ketan Patel
title: Sr. Director of Software Development
diff --git a/_posts/2023-12-12-authorization-oauth-openfga.md b/_posts/2023-12-12-authorization-oauth-openfga.md
index bfc9fd8..17adae4 100644
--- a/_posts/2023-12-12-authorization-oauth-openfga.md
+++ b/_posts/2023-12-12-authorization-oauth-openfga.md
@@ -7,6 +7,7 @@ options:
- full-bleed-cover
excerpt: In this post we discuss GoDaddy's adoption of OAuth and OpenFGA for fine-grained authorization.
keywords: oauth, openfga, authentication, authorization, security, zanzibar
+canonical: https://godaddy.com/resources/news/authorization-oauth-openfga
authors:
- name: Jacob Brooks
title: Principal Software Engineer