Monday, December 10, 2018

Why use Base64 Encoding?

##What is Base64 encoding?

  • Given a stream of binary bits, it will encode 6-bits to a character from a set of 2 pow 6 (64 chracters).
  • Example “abcd”, the ASCII representation is 65666768.
  • [1000001][1000010][1000011][1000100]
  • Base64 would pics six continuous bits
  • 100000|| 110000|| 101000|| 011100||0100xx here xx would be 00 (padding)
  • gwocQ

Why use base64 encoding?

  • Transferring binary data in URLs
  • Tranferring binary data such as images as text
  • Transmit and store text that might cause delimiter collision.
    • Example is a random string followed by a delimiter (_) and a pattern and the code logic searches the delimiter to seperate the pattern.
    • The _ can appear in the generated random string too.
    • So encoding the random string in base64 would avoid such case.
    • Embed image in a XML

Friday, December 7, 2018

Golang Runtime and Concurrency

  • Golang uses a user-space component (runtime) linked to the executable.
  • The runtime is written in C.
  • It has implementation of scheduler, goroutine management and OS-threads management.
  • Per go process, there is a max limit of OS threads.
  • Go runtime schedules N goroutines on M OS threads
  • One goroutine runs exactly on one thread.
  • A goroutine can get blocked (e.g. on a syscall) and blocks the OS-thread too.

References

Tuesday, December 4, 2018

Time based Key Expiry in Redis

https://redis.io/commands/expire
It is a useful feature to expire keys based on their last access time. We can use it to develop interesting feature such as rate limits,

There are various rate limiting implementations.
https://github.com/redislabsdemo/RateLimiter/tree/master/src/com/redislabs/metering/ratelimiter

Written with StackEdit.

Sample Go Code

package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
    say("world")
    go say("hello")
    // say("abcd")
}

  • Why hello does not get printed?

Written with StackEdit.

Monday, December 3, 2018

Sample git conf

#### Put this in your ~/.gitconfig or ~/.config/git/config
[user]
	name = Your Full Name
	email = your@email.tld
[color]
	# Enable colors in color-supporting terminals
	ui = auto
[alias]
	st = status
	ci = commit
	lg = log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
	oops = commit --amend --no-edit
	review-local = "!git lg @{push}.."
	# Or pre 2.5, as we didn't differential push and upstream in shorthands:
	# review-local = lg @{upstream}..
[core]
	# Don't paginate output by default
	pager = cat
	#
	# Out of luck: on Windows w/o msysGit? You may have Notepad++…
	# editor = 'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin
	# 
	# If you want to use Sublime Text 2's subl wrapper:
	# editor = subl -w
	# 
	# Or Atom, perhaps:
	# editor = atom --wait
	# 
	# Sublime Text 2 on Windows:
	# editor = 'c:/Program Files (x86)/Sublime Text 2/sublime_text.exe' -w
	# 
	# Sublime Text 3 on Windows:
	# editor = 'c:/Program Files/Sublime Text 3/subl.exe' -w
	#
	# Don't consider trailing space change as a cause for merge conflicts
	whitespace = -trailing-space
[diff]
	# Use better, descriptive initials (c, i, w) instead of a/b.
	mnemonicPrefix = true
	# Show renames/moves as such
	renames = true
	# When using --word-diff, assume --word-diff-regex=.
	wordRegex = .
	# Display submodule-related information (commit listings)
	submodule = log
[fetch]
	# Auto-fetch submodule changes (sadly, won't auto-update)
	recurseSubmodules = on-demand
[grep]
	# Consider most regexes to be ERE
	extendedRegexp = true
[log]
	# Use abbrev SHAs whenever possible/relevant instead of full 40 chars
	abbrevCommit = true
	# Automatically --follow when given a single path
	follow = true
[merge]
	# Display common-ancestor blocks in conflict hunks
	conflictStyle = diff3
[mergetool]
	# Clean up backup files created by merge tools on tool exit
	keepBackup = false
	# Clean up temp files created by merge tools on tool exit
	keepTemporaries = false
	# Put the temp files in a dedicated dir anyway
	writeToTemp = true
	# Auto-accept file prompts when launching merge tools
	prompt = false
[pull]
	# This is GREAT… when you know what you're doing and are careful
	# not to pull --no-rebase over a local line containing a true merge.
	# rebase = true
	# WARNING! This option, which does away with the one gotcha of
	# auto-rebasing on pulls, is only available from 1.8.5 onwards.
	rebase = preserve
[push]
	# Default push should only push the current branch to its push target, regardless of its remote name
	default = upstream
	# When pushing, also push tags whose commit-ishs are now reachable upstream
	followTags = true
[rerere]
	# If, like me, you like rerere, uncomment these
	# autoupdate = true
	# enabled = true
[status]
	# Display submodule rev change summaries in status
	submoduleSummary = true
	# Recursively traverse untracked directories to display all contents
	showUntrackedFiles = all
[color "branch"]
	# Blue on black is hard to read in git branch -vv: use cyan instead
	upstream = cyan
[tag]
	# Sort tags as version numbers whenever applicable, so 1.10.2 is AFTER 1.2.0.
	sort = version:refname
[versionsort]
	prereleaseSuffix = -pre
	prereleaseSuffix = .pre
	prereleaseSuffix = -beta
	prereleaseSuffix = .beta
	prereleaseSuffix = -rc
	prereleaseSuffix = .rc

###

Reference https://gist.github.com/tdd/470582

Written with StackEdit.