Author Archives: amer

Wheels and Engine Sound

Last year, we took Ayden to monster truck show. We didn’t know how loud these trucks can be. So we bought ear protection headphones for him. He was still feeling a little scared.

Later he came up with idea that sound of engine comes from the tires. He would keep telling me that monster trucks tires are loud or they made it louder after he put on his headphone.

How to backup Kubernetes’ Config

The easiest solution seems to be following script by Stackoverflow user, Timothy Perez:

#!/bin/bash

# NAMESPACED EXPORTS
for ns in $(kubectl get ns --no-headers | cut -d " " -f1); do
  kubectl --namespace="${ns}" get -o=json bindings,cm,ep,ev,limits,pvc,po,podtemplates,rc,quota,secrets,sa,svc,controllerrevisions,ds,deploy,rs,sts,localsubjectaccessreviews,hpa,cj,jobs,leases,ev,ds,deploy,ing,netpol,rs,pods,netpol,pdb,roles,rolebindings | \
    jq '.items[] |
    select(.type!="kubernetes.io/service-account-token") |
    del(
        .spec.clusterIP,
        .metadata.uid,
        .metadata.selfLink,
        .metadata.resourceVersion,
        .metadata.creationTimestamp,
        .metadata.generation,
        .status,
        .spec.template.spec.securityContext,
        .spec.template.spec.dnsPolicy,
        .spec.template.spec.terminationGracePeriodSeconds,
        .spec.template.spec.restartPolicy
    )' >> "./${ns}.json"
done

# NON-NAMESPACED EXPORTS
kubectl get -o=json cs,ns,no,pv,mutatingwebhookconfigurations,validatingwebhookconfigurations,crds,apiservices,tokenreviews,selfsubjectaccessreviews,selfsubjectrulesreviews,subjectaccessreviews,csr,psp,nodes,psp,clusterrolebindings,clusterroles,pc,sc,volumeattachments | \
    jq '.items[] |
    select(.type!="kubernetes.io/service-account-token") |
    del(
        .spec.clusterIP,
        .metadata.uid,
        .metadata.selfLink,
        .metadata.resourceVersion,
        .metadata.creationTimestamp,
        .metadata.generation,
        .status,
        .spec.template.spec.securityContext,
        .spec.template.spec.dnsPolicy,
        .spec.template.spec.terminationGracePeriodSeconds,
        .spec.template.spec.restartPolicy
    )' >> "./cluster_non-namespaced_export.json"

Script copied here under CC BY-SA 4.0 license.

Crispy-Skinned Baked Chicken Drumsticks

Ingredients

  • 8 (4 oz each) skin-on chicken drumsticks (about 2 lb. total weight)
  • 2 tablespoons olive oil
  • 1 teaspoon salt
  • ½ teaspoon black pepper
  • 1 teaspoon garlic powder
  • 1 teaspoon onion powder
  • 1 teaspoon smoked paprika
  • 1/4 teaspoon chilli pepper

Instructions

  • Preheat your oven to 400 degrees F. Line a rimmed baking sheet with parchment paper and arrange the drumsticks in a single layer on the parchment.
  • Make the seasoning paste: In a medium bowl, use a fork or a spatula to mix the olive oil, salt, pepper, and spices.
  • Using a pastry brush or your hands, coat the chicken pieces with the seasoning paste.
  • Bake the drumsticks uncovered until their internal temperature reaches 165 degrees F, about 40 minutes.
  • Baste the drumsticks with the pan juices using a clean pastry brush. Serve immediately.

Via https://healthyrecipesblogs.com/wprm_print/22974

LeetCode 605. Can Place Flowers

/**
 * @param {number[]} flowerbed
 * @param {number} n
 * @return {boolean}
 */
var canPlaceFlowers = function(flowerbed, n) {
    for (let i = 0; i<flowerbed.length; i++) {
        if (flowerbed[i] == 0
           && (i == 0 || flowerbed[i-1] == 0)
           && (i == flowerbed.length-1 || flowerbed[i+1] == 0)) {
            n--
            flowerbed[i] = 1
            if (n < 1)
                return true
        }
    }

    return n <= 0
};

LeetCode 1268. Search Suggestions System

/**
 * @param {string[]} products
 * @param {string} searchWord
 * @return {string[][]}
 */
var suggestedProducts = function(products, searchWord) {
    products.sort((a, b) => {
        if (a > b) return 1
        if (a < b) return -1
        return 0
    })

    const r = []

    for (let i = 1; i<=searchWord.length; i++) {
        const arr = products.filter((s) => s.startsWith(searchWord.substring(0, i))).slice(0, 3)
        //console.log(searchWord.substring(0, i))
        r.push(arr)
    }

    return r
};

LeetCode 253. Meeting Rooms II

Lack of built-in Priority Queues in JavaScript makes it a bit hard to do problems like this. I end looking at the solution:

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var minMeetingRooms = function(intervals) {
    if (intervals.length < 1) return 0

    const startTimes = []
    const endTimes = []

    for (let i = 0; i<intervals.length; i++) {
        startTimes[i] = intervals[i][0]
        endTimes[i] = intervals[i][1]
    }

    startTimes.sort((a, b) => a-b)
    endTimes.sort((a, b) => a-b)

    let startPtr = 0
    let endPtr = 0
    let rooms = 0

    for (let i=0; i<intervals.length; i++) {
        if (startTimes[i] >= endTimes[endPtr]) {
            endPtr++
        } else {
            rooms++
        }
    }

    return rooms
};

git error: github.com:abc/xyz.git did not send all necessary objects

I was getting following error when running git pull

git pull
fatal: bad object refs/heads/master 2
error: github.com:abc/xyz.git did not send all necessary objects

I tried running git gc

git gc
error: bad ref for .git/logs/HEAD 2
fatal: bad object refs/heads/master 2
fatal: failed to run repack

The fix was to remove above to files under .git

rm .git/logs/HEAD\ 2
rm .git/refs/heads/master\ 2

After that I was able to run gc and do git pull

git gc
Enumerating objects: 257, done.
Counting objects: 100% (257/257), done.
Delta compression using up to 4 threads
Compressing objects: 100% (224/224), done.
Writing objects: 100% (257/257), done.
Total 257 (delta 85), reused 0 (delta 0), pack-reused 0

LeetCode 937. Reorder Data in Log Files

/**
 * @param {string[]} logs
 * @return {string[]}
 */
var reorderLogFiles = function(logs) {

    const sorted = []
    const numLogs = []
    const charLogs = []

    for (let i = 0; i<logs.length; i++) {
        const log = logs[i]
        const tokenized = log.split(" ")
        if (Number.isInteger(parseInt(tokenized[1]))) {
            numLogs.push(log)
        } else {
            charLogs.push(log)
        }
    }

    charLogs.sort(function (a, b) {
        const stra = a.substr(a.indexOf(' ') + 1)
        const strb = b.substr(b.indexOf(' ') + 1)
        if (stra > strb) {
            return 1
        }
        if (stra < strb) {
            return -1
        }

        const ida = a.substr(0, a.indexOf(' '))
        const idb = b.substr(0, b.indexOf(' '))
        //console.log({ida})
        if (ida > idb) {
            return 1
        }
        if (ida < idb) {
            return -1
        }

        return 0
    })

    return [...charLogs, ...numLogs]

};

LeetCode 49. Group Anagrams

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const map = []

    for (let i = 0; i<strs.length; i++) {
        const str = strs[i].split('').sort().join('')
        if (!map[str]) map[str] = []
        map[str].push(strs[i])
    }
    const ans = []
    for (let k in map) {
        ans.push(map[k])
    }
    return ans
};