Free Scratch course for kids

A while back I created some scratch exercises for my kids. It is modeled as a series of exercises (with solutions) that you/your kids can try as you learn programming. Just put it in the form of a free course: Scratch for Beginners. Enjoy!

Testing with Go

An integral part of the development licefycle is writing tests. Write tests early, write tests often as they say. Go makes it very easy to write tests. The following post will go through the basics of testing with Go. Let’s say we have a program that counts the number of vowels, consonants, digits and everything else within an input string. It may look something like this: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 package main import ( "flag" "fmt" ) // CountChars counts the number of characters in a string func CountChars(str string) (int, int, int, int) { vcount := 0 ccount := 0 dcount := 0 ocount := 0 for i := 0; i < len(str); i++ { switch str[i] { case 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U': vcount++ case 'b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'Z': ccount++ case '1', '2', '3', '4', '5', '6', '7', '8', '9', '0': dcount++ default: ocount++ } } return vcount, ccount, dcount, ocount } func main() { inputStr := flag.

Introduction to Go Modules

Table of Contents Preface Why Go Modules Philosophy Example Preface All the content for this post was gathered by reading the 7 part blog series by Russ Cox and other notes. There is also an introductory post on the Go blog. I would encourange you to read them as well. Why Go Modules Before jumping into the workings of Go modules, we should first understand why we need it in the first place.

Life...

Defer on exit

Working with go, sometimes you may want to run a deferred action on Exit. Something like: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package main import ( "fmt" "os" ) func main() { // THIS WILL NOT WORK defer fmt.Println("World") fmt.Println("Hello") // some code here... os.Exit(0) } In the above code, World will never get printed. This is because defer is not run on os.

Musashi’s 21 Precepts for Life

Just came across Miyamoto Mushashi, the greatest swordsman to ever live. He also wrote two books, one of which is Dokkōdō (The Path of Aloneness). It comprises of 21 percepts for living life. A lot of them resonanted with me personally, so I’m listing them out here. (Interpretation of these can be very personal to each, so i’ not even going to try.) Accept everything just the way it is.

Populating go vars at build time

When we build go executables, one common command is the version command. It should tell you the commit, version number etc of the released executable. However, we don’t want to hardcode these in code. We want to populate these variables at build time. Here is a common pattern that will let you do this. Let’s assume you have a main.go that imports a package version and prints out the output of version.

Init function in modules

A Go package can have an init function. This function is called at the time when the package is imported. You can put in any initialization you want here. e.g. 1 2 3 4 5 6 7 8 9 10 11 12 13 package main func init() { fmt.Print("Hello") } func init() { fmt.Print(" World") } func main() { fmt.Println(" People") } The above will print out Hello World People.

.gitattributes

Just like .gitignore, there is another file that you can use in your git repos: The .gitattributes file. You typically place this in the root of your repo. It has lines of the form: pattern attr1 attr2 ... It essentially means that for files that satisfy the regex pattern, apply the attribute attr1, attr2 etc to them. Let’s see some examples. Let’s say our .gitattributes had the line below: *.png binary *.

Books

Some of the books I have recently read. Hopefully you will find them enjoyable. The Alchemist - Paulo Coelho - 09/2021 Peace Is Every Step - Thich Nhat Hanh - 09/2021 Into Thin Air - Jon Krakauer - 07/2021 The Simple Path to Wealth - J.L. Collins - 06/2021 The End of Overeating - David A. Kessler - 05/2021 The Price of Civilization - Jeffrey Sachs - 04/2021