teleren/devto huggingface dataset:
The Jonathan Test: 12 Steps to Better DevOps
Tags: productivity, practices, devops
Published: 2021-05-06 07:38:30

---
title: The Jonathan Test: 12 Steps to Better DevOps
published: true
date: 2021-05-04 00:00:00 UTC
tags: productivity,practices,devops
canonical_url: https://jhall.io/archive/2021/05/04/the-jonathan-test-12-steps-to-better-devops/
---

Once upon a time, Joel Spolsky (co-founder of [StackOverflow](https://stackoverflow.com/)) wrote the [_Joel Test: 12 Steps to Better Code_](https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/), which he describes as:

> My own, highly irresponsible, sloppy test to rate the quality of a software team.

Here’s the test:

> 1. Do you use source control?
> 2. Can you make a build in one step?
> 3. Do you make daily builds?
> 4. Do you have a bug database?
> 5. Do you fix bugs before writing new code?
> 6. Do you have an up-to-date schedule?
> 7. Do you have a spec?
> 8. Do programmers have quiet working conditions?
> 9. Do you use the best tools money can buy?
> 10. Do you have testers?
> 11. Do new candidates write code during their interview?
> 12. Do you do hallway usability testing?

For a quite while, companies advertising jobs on [StackOverflow Jobs](https://stackoverflow.com/jobs) could even include their self-scored “Joel Test score”. I don’t see it now, though, so I imagine that feature has been removed.

Many of the items on this list are timeless. Others not so much. In the 20+ years since this was written, the world has changed a lot, and some of these items are nearly laughable. Source control? In 2021, you may as well ask if a company has an Internet connection. Who _doesn’t_ use source control? (Seriously, if you know someone who doesn’t use source control, let me know!)

So here’s my “highly irresponsible, sloppy test to rate the quality of a software team”, hereby dubbed _The Jonathan Test_:

1. Do contributors merge their changes into mainline multiple times per day?
2. Is all code tested thoroughly before merging to mainline?
3. Is your project built and deployed automatically after every merge to mainline?
4. Do you have a bug database?
5. Do you fix bugs before writing new code?
6. Do you have a prioritized backlog of features?
7. Do you have a reasonably complete automated test suite?
8. Does everyone have quiet working conditions?
9. Do you use the best tools money can buy?
10. Do you do hallway usability testing?
11. Do developers control their [work from start to finish](https://jhall.io/archive/2021/04/27/the-u-shaped-cell/), without a “hand-off” to operations, QA, or some other team?
12. Can your developers work productively from an airplane?

* * *
_If you enjoyed this message, [subscribe](https://jhall.io/daily) to <u>The Daily Commit</u> to get future messages to your inbox._
Death to (Synchronous) Standups
Tags: standups, agile, process, meetings
Published: 2023-01-24 15:07:23

---
title: Death to (Synchronous) Standups
published: true
date: 2021-05-04 00:00:00 UTC
tags: standups, agile, process, meetings
canonical_url: https://www.rocky.dev/blog/death-to-standups
---

Some back of the napkin math no one asked for about how much daily standups cost your team compared to asynchronous standup tools like [Geekbot](https://geekbot.com/).

- Assuming 20 mins per standup (this could be an understatement) and five mins for Geekbot (usually an overstatement), we'll say async standups save 15 mins/day per person.
- Assuming a standup including ten people, that's 150 mins/day or 2.5 hrs/day, 12.5 hrs/wk, and ~625 hrs/yr (assuming 50 weeks worked).
- 625 hrs/yr is over 15.625 weeks(!) of time per year spent in standup or nearly eight full sprints. So just under a sprint per person per year spent in this single meeting.
- Assuming a conservative average of $50/hr, that's over $30,000/yr. But this number pails in comparison to the opportunity cost of an extra sprint each year you could instead build products for customers.

Especially with more workers going remote, a common argument is that the meeting is more about human interaction. But I'd argue a dedicated, weekly meeting to discuss team member's weekends, etc. along with regularly scheduled happy hours work better. These can lead to deeper conversations and more positivity than hearing each other's voices each morning give status updates.

In addition to the time savings, Slack-style standups give these added benefits:

- A historical record of what everyone said they were going to do and what they actually did.
- The productivity benefits of taking time to plan your day and get it in writing, helping to 1) stay accountable to yourself and others and 2) reduce distracting rabbit holes.
- Avoid the context switch (which studies have shown adds 15 mins and double my numbers above) of a meeting each morning and instead do your standup report when you're not in the middle of focused time.

It's up to each team to decide if an async standup is right for them. Hopefully, these numbers show the expense of daily standups. Make sure the benefits are outweighing these costs.
Regular Expressions Challenge 2
Tags: javascript, devops, tutorial, beginners
Published: 2021-05-03 23:33:17

#### Restrict Possible Usernames(Challenge)
* Usernames are used everywhere on the internet. They are what give users a unique identity on their favorite sites.
* You need to check all the usernames in a database. Here are some simple rules that users have to follow when creating their username.

* Usernames can only use alpha-numeric characters.
* The only numbers in the username have to be at the end. There can be zero or more of them at the end. Username cannot start with the number.
* Username letters can be lowercase and uppercase.
* Usernames have to be at least two characters long. A two-character username can only use alphabet letters as characters.
* Change the regex userCheck to fit the constraints listed above.
```
let username = "JackOfAllTrades";
let userCheck = /^[a-z][a-z]+\d*$|^[a-z]\d\d+$/i; 
let result = userCheck.test(username);
```
* Code Explnantion:
Code Explanation
1. ^ - start of input
2. [a-z] - first character is a letter
3. [a-z]+ - following characters are letters
4. \d*$ - input ends with 0 or more digits
5. | - or
6. ^[a-z] - first character is a letter
7. \d\d+ - following characters are 2 or more digits
8. $ - end of input
```
Our regex should match the string JACK
Our regex should not match the string J
Your regex should match the string Jo
Your regex should match the string Oceans11
```
Cheatsheet for the Regex Cheatsheet, Part III: POSIX
Tags: beginners, javascript
Published: 2021-05-03 23:10:37

##Intro
I was recently doing a code challenge for a job interview that required me to strip out all nonalphabetic characters. "Ah! I should use Regular Expressions for this!" I thought in triumph, impressed that I even knew what regular expressions _were_. That fleeting moment of glory faded once I decided to brush up on regular expressions and landed on the encouragingly-named [Regular Expressions Cheatsheet](https://cheatography.com/davechild/cheat-sheets/regular-expressions/). I had no idea how to use it!

So, for people like me, here is a *Cheatsheet for the Regular Expressions Cheatsheet, Part III: POSIX*

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qbdv22jf71i7et0sh4yz.png)

## What's a POSIX?
Okay, bear with me. POSIX means *Portable Operating System Interface for uniX*. It's just a different flavor of regex syntax that uses the following format: ``[:foo:]`` where ``foo`` is a descriptive term like ``upper`` for "Upper case letters" or ``xdigit`` for "Hexidecimal digits". **The important thing, at least for this blog series, is that it is not supported in Javascript. For that reason, I'm not going to delve into it.** 

Onto Part IV!
Installing and setting up Redis
Tags: redis, node, server, docker
Published: 2021-05-03 22:15:10

# Redis
Redis is an in-memory data structure store, used as a database, cache, and message broker that allows for incredibly fast read and write ops.

We are going to see 3 ways of setting up [Redis](https://redis.io/download). I will be using Ubuntu 20.04 for this tutorial.

## 1. Installing Redis Locally
Installing docker on 
```bash
sudo apt update
sudo apt install redis-server
```
You need to configure a couple of thing after this, use any editor and change the `supervised` directive to `systemd`.
```bash
sudo nano /etc/redis/redis.conf
```
![Screenshot from 2021-05-01 06-36-49.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1619831261532/Pu6bw5GLu.png)

You can also set your redis password, since Redis is pretty fast you need a very strong password. Use the following command to generate one.
```bash
openssl rand 60 | openssl base64 -A
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1620073638680/_te0esAgR.png)

Save the files and restart the Redis service to check if its running.
```bash
sudo systemctl restart redis.service
sudo systemctl status redis
```
![Screenshot from 2021-05-01 06-40-32.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1619831516395/3f2ILI6Ww.png)

## 2. Use a Docker Image
Pull the Redis docker image
```bash
docker pull redis
```
And start a redis instance
```bash
docker run --name some-redis -d redis
```
## 3. Managed Redis Labs instance

You can also use a free tier instance from [Redis Labs](https://redislabs.com/).

Create an account and select your favourite cloud provider.
![Redis Labs set up initial screen](https://cdn.hashnode.com/res/hashnode/image/upload/v1619823431655/qY4VIfMWN.png)

I'm gonna select the 30 MB free tier, that's more than enough for our project.

![Redis Labs select subscription](https://cdn.hashnode.com/res/hashnode/image/upload/v1619825512240/4mddKe7em.png)

You will be directed to set up a database:
A few things to consider here:
- Type of eviction policy (I highly recommend setting up an eviction policy).
- If you want to use a Redis module, you can set it up here.

![Setting up a database on ](https://cdn.hashnode.com/res/hashnode/image/upload/v1619829483373/slrVxoA51.png)
I have selected the allkeys-lru eviction policy and no modules.

This blog is part of a series, in the next part, we will set up our node server to cache data with Redis. You can continue with the series using any of the Redis setups mentioned in this blog.

Feel free to reach out to me on Twitter [@cryptus_neoxys](https://twitter.com/cryptus_neoxys) and connect with me on [LinkedIn](https://www.linkedin.com/in/cryptus-neoxys/).

### Refs
[https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04)

[https://redis.io/download](https://redis.io/download)
Instalación y configuración
Tags: javascript, automation, testing, tutorial
Published: 2021-05-03 22:12:29

# Primera parte: Instalación de librerías y configuración inicial

## Prerequisitos:
- NodeJS 10 o Superior.
- Editor de código (Utilizo Visual Studio Code)
- Git
- Opcional: Yarn

Cuando hablamos de API automation, muchas veces lo primero que se nos viene a la mente es usar RestAssured incluso es lo que recomiendan en grupos o comunidades, y si deseamos usar JavaScript lo primero que nos mencionan es el uso de Postman, aunque utilizamos la interfaz. En esta serie vamos a aprender a crear nuestro propio marco de trabajo para API testing utilizando diversas librerías de JavaScript. **Empezemos!**

Vas a crear un nuevo directorio (yo lo llamaré tutorial-api-automation) y dentro de el iniciar un nuevo proyecto de node, para ello abrimos una terminal (recomiendo el uso de Git Bash) y una vez dentro del directorio ejecutamos npm init -y (utilizamos -y para crear valores por defecto, en caso de querer personalizar solo usemos npm init)
```sh
$ mkdir tutorial-api-automation && cd tutorial-api-automation
$ npm init -y
```
Esto nos creará un nuevo archivo llamado _package.json_ , ahora procedamos instalar las librerías que vamos a utilizar; En la terminal ejecutemos:
```sh
$ yarn add axios chai dotenv jasmine jasmine-spec-reporter -D
```
o en caso de no estar familiarizado con yarn podemos usar npm
```sh
$ npm install axios chai dotenv jasmine jasmine-spec-reporter -D
```
| Librería | Uso|
| ------ | ------ |
| Axios | Librería para realizar peticiones HTTP |
| Chai | Librería para realizar las aserciones o validaciones |
| Dotenv | Librería para manejo de variables de entorno |
| Jasmine | Librería para ejecución de pruebas |
| Jasmine Spec Reporter | Librería para obtener en consola resultado de las pruebas |
Una vez finalizada la instalación de nuestras librerías podemos observar que se han creado: directorio *node_modules*, archivo *yarn.lock* o *package-lock.json* y en nuestro *package.json* debemos de tener un apartado con la sección de "devDependencies".
Siguiente paso para la configuración vamos a ejecutar el siguiente comando en nuestra terminal:
```sh
$ npx jasmine init
```
![Installation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2tp2tlv2b8516704njxy.png)
Y esto nos crea un nuevo directorio llamado *spec* y dentro de este un nuevo directorio llamado *support*. Spec es el directorio por defecto para crear nuestros test, es el directorio por defecto de Jasmine.

Por último paso vamos a editar el archivo package.json en la sección de scripts vamos a editar el comando test por:
```json
{
  "scripts: {
    "test": "jasmine"
  }
}
```

Hasta acá llega esta primera parte, hemos instalado las librerías que vamos a utilizar configurado jasmine y actualizado nuestro script para la ejecución de las pruebas.
En el próximo post vamos a crear varios directorios para organizar nuestro marco de trabajo y crear nuestro primer test.
Bug or Not a Bug?
Tags: discuss, healthydebate
Published: 2021-05-03 22:04:23

##Quick question!


**When an issue is considered a bug?**

* 1) Something has been done and it is not working as intended.
* 2) Something is working as intended but the planning was flawed.
* 3) Something was done and is working as intended but things have changed over time and now the business rule is outdated.

I would like to know what you think, and please share cases where you have been in this doubt as well.

🤔
Day 358 : The Code
Tags: hiphop, code, coding, lifelongdev
Published: 2021-05-03 21:54:49

_liner notes_:
- Saturday : Didn't really get a chance to work on the radio show so I worked on it during the day. Then had the show. My co-host had an event so it was just me. Still had some people in the chat, so I wasn't alone. haha. Had a really good time. After the show, I got the post show and promo work done. The recording of this week's show is at https://kNOwBETTERHIPHOP.com

![Radio show episode image of a t-shirt design of the silouettes of 2 young children holding "Fairness for the Future" signs and roots at their feet leading into pictures of 2Pac Lauryn Hill, Martin Luther King Jr, Malcolm X and more  with the words May 1st 2021 Rabbit hole](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lvcavwon445ggz5ll314.jpg)

- Sunday : Did my laundry, filed my taxes and paid my bills for the month. Also started working on a Web Component to be used in my side project. It's a timer that will display when an event will happen and if it's set, a countdown will show up when a certain time limit is met. Learned a lot about Date and locales. Plus I figured out how I can style the Web Component from the outer application. It came out pretty good. Watched an episode of an anime on Netflix called "Yauske". Pretty good. It's based on a story of a Black Samurai in feudal Japan. Watched "Fear of the Walking Dead" and "Gangs of London" and called it a night.

- Professional : Today was a slow one. I basically spent all day exporting videos to upload to an online application that can hopefully help speed up recording tutorial videos. Problem is that my laptop is SLOW! haha For a video clip that's less than a minute, it takes about an hour to export at 4K. So there's that. Can't really do anything else on the laptop because it basically locks up.

- Personal : So, I did my taxes. Actually getting money back. I wanted to start putting together the framework for my van, but got caught up working on the Web Component. I ordered some more aluminum, so once that comes in, I'll really get started. I still need to figure out how I'm going to attach the wheels. Also, I noticed my Chromebook is getting slower and some programs are taking a long time to open. May have to clear some storage.

![View from a rocky shore at Buzk's Gard Park, Ukraine with sparse foliage at sunset](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ow130m6dcc93btez2lt.jpg)

Plan to work on the code for the time Web Component some more and finish it up. I want it to fire an event when the deadline has been reached. Then going to publish the Web Component and implement it into my side project. Then it's just a couple of more things and I'll be able to publish the site and work on the other parts of the project. Going to see if I can sneak in another episode of "Yasuke". Yeah, that'll probably finish my night before going to bed.

Have a great night!

peace piece
Dwane / conshus
https://dwane.io / https://HIPHOPandCODE.com
{% youtube dMrXgnfPbNs %}
ABSWIATH- a little inspiration for job seekers
Published: 2021-05-03 21:53:08

Wait- what the heck is that? Well, it's something that I've been saying to myself a lot lately: *Always Believe Something Wonderful Is About To Happen*. 

I'm currently searching for my first engineering job after switching careers. I really don't need to say it, but it's tough out there! Some of you are probably in a similar situation, so this post is for you as much as it is for me. 

**Always Believe Something Wonderful Is About To Happen**

It's so easy to become discouraged when you haven't gotten that *YES* yet. It is disappointing to make it through the first interview, only to be rejected at the second or third. It's tough to end up as second choice, knowing that you have to start the process all over again.  

You already know that it can hard not to focus on these feelings. But, let's remember that it's important not to let them take over. Instead, try to turn that energy around to make it work for you. Stay positive, treat your mistakes as opportunities for growth, and remember that it just takes one yes!

Don't take the rejections personally since there are so many reasons that decisions are made. Focus on what you can do to improve your next interview experience and avoid making assumptions as to why you didn't get the job. 

In life, you get out of it what you put into it. So, this means that you not only have to do the work, you must project your desires out into the universe. *Whoa, unicorn sprinkles alert!* Seriously though, you have to put your energy out there to get what you want. Visualize yourself in your new role, as part of the team, contributing to the greater good of the world. You must stay positive and keep an open mind if you want good things to come. 

Although you may be feeling defeated at times, try to remain hopeful about what is yet to come. You will attract good things with your positive energy and then it is just a matter of time before something works out for you. 

Best of luck in your job search! Keep putting good energy into everything you do & don't forget to...

*Always Believe Something Wonderful Is About To Happen*
Is it True?  Come On, You Can Tell Me.
Tags: vue, react, angular, discuss
Published: 2021-05-03 21:31:51

One of the best things about this community is we are all here to help each other. That I am grateful and so appreciative. Over the last few months I have asked questions, expanded my network, and wrote some articles to help others. 
Well, I need your insight yet again. It seems to me each of the major JavaScript frameworks has a 'language' (jargon, slang, names and definitions) of its own. I'm not talking code but how things are referred to. Is this true?  Does React have a different way of developer talk than Vue? If so how to I break that code? Is there a reference for this some where? 

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rgu5by1c5l2nacbi1i4h.png)

I have been studying different frameworks and attempting to understand the differences of each (with your help, I am believe it or not a little more clearer) but this how to talk to Vue devs v React devs v Angular devs. I am at a loss, who can help me solve this puzzle?  
No answer is wrong, no reference or insight to small.  
Let's Chat and Educate Me, Please.

Thanks!
Kozmos - Explore the beauty of the universe.
Tags: nasa, apod, android, flutter
Published: 2021-05-03 21:26:32

Learning about space is one of my hobby. Recently, I build an app to consume beautiful NASA APOD and Bing Images using Flutter. It was total bliss learning and creating something exciting. It might not up to the mark but I still love what I have created. 
Anyways, If you share the same love for Space, Universe or Cosmos, then Kozmos App is what you might need.   

Google Play Store Link: 
https://play.google.com/store/apps/details?id=com.omerasif.kozmosapp
What is the most convenient and secure way to authenticate single page applications?
Tags: jwt, oauth, authorization, stateless
Published: 2021-05-03 21:23:38

I've been recently learning different ways to secure SPA's with Oauth 2.0. There are plenty of advices over the web, but they continually contradict one another.

Let me share my findings:

The first approach which took my attention was the Oauth 2.0 extension called PKCSE. In the first glance it looks great (no server needed), but when going deeper it has some disadvantages. Two which concerned me the most are:

where to securely store the access_token
where to store securely long lived refresh_token (local storage, in memory etc. is not a case because of XSS)

The second one I saw is to use a back-end for front-end server under the same domain (same nginx with routing all /api/* calls into my backend server). In this case the OAuth client will be the back-end server which can just implement the authorization flow and forward all request to dedicated resource api service. At the end of authorization flow it it will redirect browser to the SPA home page with the following COOKIE:

ACCESS_TOKEN=API_ACCESS_TOKEN
secure: true
httpOnly: true
SameSite: secure
expire: API_ACCESS_TOKEN_EXPIRE
The cookie from the above will be included into the all AJAX requests from the SPA to my back-end api (via nginx - same domain). Also it will mitigate the risk of XSS and CSRF attacks.

The third approach (similar to the 2nd one) but to store access_token on the server side and authenticate SPA with the generated SESSION_ID. It introduces a state in the back-end server - it is something i would like to avoid.

The fourth one (still similar to the 2nd one) but back-end server will generate JWT token with access_token inside the payload and will return it in the secure, SameSite, httpOnly cookie. In this approach back-end server can validate the token first before the request is forwarded to the resource server with the access_token. In terms of disadvantages the back-end server have to keep security keys to validate/generate token (maybe it is over engineering and just forwarding access_token to the resource API will be good enough)

Personally I feel like the second approach is kind of a good balance between security and simplicity ? Do you have any better ideas of securing SPA ? Please share your thoughts and correct me if I'm wrong in my small investigations.

Links:

https://www.pingidentity.com/en/company/blog/posts/2021/refresh-token-rotation-spa.html
https://stackoverflow.com/questions/20963273/spa-best-practices-for-authentication-and-session-management
https://curity.io/resources/learn/spa-best-practices/