Skip to content

Instantly share code, notes, and snippets.

View samarpanda's full-sized avatar
👋

Samar Panda samarpanda

👋
View GitHub Profile

Static file serving using Nginx + Docker

Quick file serving with lightweight & efficient webserver using nginx:1.25-alpine

Quick project aims to demonstrate the creation, deployment of a lightweight & efficient web server using Nginx running on an Apline Linux based Docker container. The project serve static files from any mounted folder, making an ideal solution for hosting simple website, front-end applications, or any content that needs to be served from a folder / local system.

nginx-serve.sh

  1. Container name CNAME=nginx-8080
  2. Nginx image is used from dockerhub
@samarpanda
samarpanda / generatePassword.js
Last active August 2, 2023 09:35
Random password generator
function getRandomCharacter(charset = "" ){
const randomIndex = Math.floor(Math.random() * charset.length);
return charset.charAt(randomIndex);
}
function generatePassword(length) {
const charsetAlphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$?";
// const charsetNumbers = "0123456789";
// const specialCharacters = "!@#$?"

Scaling your API with rate limiters

The following are examples of the four types rate limiters discussed in the accompanying blog post. In the examples below I've used pseudocode-like Ruby, so if you're unfamiliar with Ruby you should be able to easily translate this approach to other languages. Complete examples in Ruby are also provided later in this gist.

In most cases you'll want all these examples to be classes, but I've used simple functions here to keep the code samples brief.

Request rate limiter

This uses a basic token bucket algorithm and relies on the fact that Redis scripts execute atomically. No other operations can run between fetching the count and writing the new count.

const parallelFetch = async (urls) => {
var data = await Promise.all(
urls.map((fetchParams) => {
const { url, options = {} } = fetchParams;
return fetch(url, options).then((response) => response.json());
})
);
return data;
}
@samarpanda
samarpanda / Largest-Contentful-Paint.md
Last active June 16, 2023 15:18
Largest contentful Paint

I wonder if i can see all the lcp elements instead of getting the eventual lcp element from the performance panel. Below script higlights all lcp elements available on the page. After running the script in console / source - snippet it highlight by a dotten blue line for all lcp elements. This uses browser's PerformanceObserver API to get all lcp elements.

By @samarpanda

/**
 * PerformanceObserver
 */
@samarpanda
samarpanda / express-etag-fix.md
Last active April 10, 2021 01:29
Express - ETag fix for multiple servers

Express Etag fix (Multiple servers)

Etag uses information from file system stat. Including the modified time similar to nginx & apache. This can't calculate the hash of the contents. Doing so that would require reading the file from the file system twice for every single request scope.

Files usually have slightly different modification timestamp between multiple servers. Similarly apache/nginx would do the same.

Simple way to calculate ETag for the static files:

New York WebPerf 25th Feb

Talk by @samarpanda

CLS

try {
  var cumulativeLayoutShiftScore = 0;
  const observer = new PerformanceObserver(list => {
@samarpanda
samarpanda / first-input-delay.md
Last active October 20, 2023 12:24
First input delay (FID)

First input delay(FID)

This is an interactive metric. Collected once user tries to interact with the page.

Using web-vitals npm package

import {getFID} from 'web-vitals';
getFID(console.log);