A detailed and lucid explanation is here
Wednesday, December 12, 2018
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
- Example is a random string followed by a delimiter (
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.
Subscribe to:
Posts (Atom)