Thoughts, stories and ideas.

HTTPS server with Go + LetsEncrypt

Getting a HTTPS server started in Go using certificates from letsencrypt is incredibly easy. Just takes 3 lines of code.


The package autocert does this for you.

go get -d golang.org/x/crypto/acme/autocert 

Use it to constructs a new listener and start a server

l := autocert.NewListener("www.example.com)
s := &http.Server{}

Full Source

package main

import (


func main() {
	// 1. proxy requests
	// 2. letsencrypt based https
	// 3. read-only mode

	addr := "kalyanchakravarthy.net"

	m := mux.NewRouter()
	m.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello world")

	s := &http.Server{
		Handler: m,

	l := autocert.NewListener(addr)


Books in 2016

A better part of 2016 was spent reading books. This obsession took shape from the company of people who liked to read, in a country where there was nothing much I could do offline without getting overwhelmed; nor could I wander around online without ultra-slow-vpns (aka China). One goal for 2016 was to finish reading atleast 25 book and I managed to reach it. A major chunk was filled by Sci-Fi.

Here are those in reverse chronological order

  1. The Martian
    Andy Weir
  2. Beacon 23: The complete Novel
    Hugh Howey
  3. Rendezvous with Rama
    Arthur C Clarke
  4. Speaker For The Dead (Ender Saga - Book 2)
    Orson Scott Card
  5. Enders Game (Ender Saga - Book 1)
    Orson Scott Card
  6. Redshirts
    John Scalzi
  7. The Last Colony (Old Man's War - Book 3)
    John Scalzi
  8. Earth Rising (Earthrise Book 3)
    Daniel Arenson
  9. Earth Lost (Earthrise Book 2)
    Daniel Arenson
  10. Earth Alone (Earthrise Book 1)
    Daniel Arenson
  11. Half Way Home
    Hugh Howey
  12. The Ghost Brigades (Old Man's War - Book 2)
    John Scalzi
  13. Old Man's War (Book 1)
    John Scalzi
  14. The Checklist Manifesto
    Atul Gawande
  15. Dust (Silo Series - Book 3)
    Hugh Howey
  16. Shift(Silo Series - Book 2)
    Hugh Howey
  17. Wool (Silo Series - Book 1)
    Hugh Howey
  18. Green Mars (Mars Trilogy - Book 3)
    Kim Stanley Robinson
  19. The Rosie Project: Don Tillman
    Graeme Simsion
  20. Blue Mars (Mars Trilogy - Book 2)
    Kim Stanley Robinson
  21. Thunder Below: The USS Barb
    Eugene B. Fluckey
  22. Red Mars ( Mars Trilogy - Book 1)
    Kim Stanley Robinson
  23. Elon Musk
    Ashlee Vance
  24. Not A Penny More, Not A Penny Less
    Jeffrey Archer
  25. The Hitchhiker's Guide to the Galaxy
    Douglas Adams

Xcode: Keyboard shortcuts for assistant editor

Most of the time I just need 2 code panes on my main monitor, for which using ⌥⌘↩ or Option-Command-↩ usually does the job. Sometimes I need to see more than 2 files on the same screen and I always keep forgetting how to do that in Xcode. Here is it on record for posterity.

There are 2 ways

  1. View -> Assistant Editor -> Add Assistant editor
  2. Command-Shift-O -> Select file -> Command+J

FFMPEG: Simple video editing

As I started shooting videos from my drone, a pattern I repeatedly see is that I want to extract bits of a video for posting. Since I can't be bothered to install dedicated video editing tools to do that, am learning how to do that in ffmpeg. Turns out it is pretty straight forward

Cut video

$ ffmpeg -i <InputVideo.mp4>\ 
	-ss <start_from_seconds>\
	-t <end_at_seconds>\
	-c copy 
  • -ss start_from_seconds - this is the start time point in original video
  • -t end_at_seconds - end time point in the original video

Add Audio

This works by selecting 2 inputs and composing the output with stream selection using -map. Eg: -map 0:v selects video stream from first input. -shortest makes the output length be the shortest of the two inputs (which usually is the case for my videos). Finally we specify the OutputFile.mp4 where we want it to go.

$ ffmpeg -i VideoInput.mp4\
	-i AudioInput.mp3\
	-map 0:v\
	-map 1:a\ 
	-c copy\

Adding Fadeout

Once I have the video slice with audio added, the last part to add a nice fade out effect. I prefer to start reducing the volume of audio first and then start fading video out to black. Here is a small piece of shell code that helps with that.

# Video Fade duration in seconds

# Audio fade duration

# Obtain from shell or set for actual values

# probe the duration to help compute actual start point in video
duration=$(ffprobe -select_streams v -show_streams "$1" 2>/dev/null |
    awk -F= '$input_file == "duration"{print $2}')
v_final_cut=$(bc -l <<< "$duration - $v_fade_duration")
a_final_cut=$(bc -l <<< "$duration - $a_fade_duration")

# magic
ffmpeg -i "$1" \
    -filter:v "fade=out:st=$v_final_cut:d=$v_fade_duration" \
    -af "afade=t=out:st=$a_final_cut:d=$a_fade_duration" \
    -c:v libx264 -crf 22 -preset veryfast -strict -2 "$output_file"


Dispatch Sources: Timer

Dispatch souces define an event source that when triggered can invoke a pre-defined callback. Instead of registering for events and then writing logic to handle events to make a callback, dispatch source can be used.

Dispatch timer

For example, with interval timers, its not trivial to setup NSTimer outside of main threads as it requires a run-loop with predictable lifetime. Using a runloop outside main thread is painful. Dispatch queues have ephimeral threads and as such are bad candidates for use with NSTimers.

This is a scenario where dispatch source is an ideal use-case. A dispatch timer source, fires an event when the time interval has been completed, which then fires a pre-set callback all on the same queue.

// Define a queue
queue = dispatch_queue_create("com.blah",0);
// Define timer
interval_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
// Configure timer with type(wallclock), interval(2 mins), leeway(5)
// leeway is acceptable error
dispatch_source_set_timer( interval_timer, dispatch_walltime(NULL,0), 2*60, 5 );
// Callback when timer is fired
dispatch_source_set_event_handler(interval_timer, ^{
	NSLog(@"Timer event");

It is also easy to start and suspend timer events. Its as simple as calling

dispatch_resume( interval_timer );
dispatch_suspend( interval_timer );

Dispatch After

If an event needs to be fired after a time interval, but does not require cancellation, it is simpler to just use dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<delayInSeconds> * NSEC_PER_SEC)), <queue>, ^{
    // code to be executed after a specified delay

Example: Flushing Queue after time interval

Here is some pseudo/sample code that consumes objects via -addEvent: until - either the object count becomes <N>, or <T> seconds have elapsed since last object add and in the end calls -flush:

@implementation KCTimer
	dispatch_source_t _interval_timer;
	dispatch_queue_t _flush_queue;
	NSUInteger _count;
	NSUInteger _timelimit;

- (instancetype) initWithCount:(NSUInteger)count andTimeLimit:(NSUInteger)limit 
	if( self = [super init] ) {
		_timelimit = limit;
		_count = count;

		_flush_queue = dispatch_queue_create("com.blah",0);
		_interval_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, flush_queue);
		dispatch_source_set_event_handler(_interval_timer, ^{
			[self flush];
		[self reset];
		[self resume];
	return self;

- (void)resume
	dispatch_resume( _interval_timer );

- (void)suspend
	dispatch_suspend( _interval_timer );

- (void)reset
	dispatch_source_set_timer( interval_timer, dispatch_walltime(NULL,0), _timelimit, 5 );

- (void)addEvent:(Event *)e 
	// TODO: Add stuff in thread safe manner
	[self reset];
	if(eventCount >= 50) {
			[self flush];

- (void)flush
	// TODO: Flush queue in thread safe manner