SICP Exercise 2.35: Counting leaves of a tree
2021-10-14
Exercise 2.35: Redefine count-leaves from section 2.2.2 as an accumulation:
1(define (count-leaves t) 2 (accumulate <??> <??> (map <??> <??>)))
The count-leaves
procedure from section 2.2.2:
1(define (count-leaves x) 2 (cond ((null? x) 0) 3 ((not (pair? x)) 1) 4 (else (+ (count-leaves (car x)) 5 (count-leaves (cdr x))))))
SICP Exercise 2.27: Reversing nested lists
2021-10-12
Exercise 2.27: Modify your reverse procedure of exercise 2.18 to produce a deep-reverse procedure that takes a list as argument and returns as its value the list with its elements reversed and with all sublists deep-reversed as well. For example,
1(define x (list (list 1 2) (list 3 4))) 2 3x 4((1 2) (3 4)) 5 6(reverse x) 7((3 4) (1 2)) 8 9(deep-reverse x) 10((4 3) (2 1))
First, look at my reverse
procedure:
1#lang racket/base 2(require racket/trace) 3 4(define (reverse items) 5 (iter items null)) 6 7(define (iter remaining result) 8 (trace iter) 9 (if (null? remaining) 10 result 11 (iter (cdr remaining) (cons (car remaining) result)))) 12 13(trace reverse) 14(reverse (list (list 1 2) (list 3 4)))
SICP Exercise 1.25: A simpler expmod?
2021-09-30
Exercise 1.25: Alyssa P. Hacker complains that we went to a lot of extra work in writing
expmod
. After all, she says, since we already know how to compute exponentials, we could have simply written:1(define (expmod base exp m) 2 (remainder (fast-expt base exp) m))Is she correct? Would this procedure serve as well for our fast prime tester? Explain.
First, look at the original algorithm:
1 (define (expmod base exp m) 2 (cond ((= exp 0) 1) 3 ((even? exp) 4 (remainder 5 (square (expmod base (/ exp 2) m)) 6 m)) 7 (else 8 (remainder 9 (* base (expmod base (- exp 1) m)) 10 m))))
SICP Exercise 1.16: Iterative Exponentiation
2021-09-29
I am reading SICP.
Section 1.2.4 talks about the problem of computing the exponential of a given number.
The authors start with a recursive procedure:
1#lang sicp 2 3(define (expt b n) 4 (if (= n 0) 5 1 6 (* b (expt b (- n 1)))))
This requires O(n) steps and O(n) space.
then an iterative procedure:
1#lang sicp 2 3(define (expt b n) 4 (expt-iter b n 1)) 5 6(define (expt-iter b counter product) 7 (if (= counter 0) 8 product 9 (expt-iter b 10 (- counter 1) 11 (* b product))))
SICP Exercise 1.14: orders of growth of count-change
2021-09-28
Exercise 1.14: Draw the tree illustrating the process generated by the
count-change
procedure of section 1.2.2 in making change for 11 cents. What are the orders of growth of the space and number of steps used by this process as the amount to be changed increases?
The count-change
procedure:
1(trace-define (count-change amount) 2 (cc amount 5)) 3 4(trace-define (cc amount kinds-of-coins) 5 (cond ((= amount 0) 1) 6 ((or (< amount 0) (= kinds-of-coins 0)) 0) 7 (else (+ (cc amount 8 (- kinds-of-coins 1)) 9 (cc (- amount 10 (first-denomination kinds-of-coins)) 11 kinds-of-coins))))) 12 13(define (first-denomination kinds-of-coins) 14 (cond ((= kinds-of-coins 1) 1) 15 ((= kinds-of-coins 2) 5) 16 ((= kinds-of-coins 3) 10) 17 ((= kinds-of-coins 4) 25) 18 ((= kinds-of-coins 5) 50)))
URI network-path reference
2021-09-23
Problem
I’ve just updated the code to always prefix the post URI with a slash:
1if !strings.HasPrefix(p.URI, "/") { 2 p.URI = "/" + p.URI 3}
and I think that no need to update the HTML template:
1<a href="/{{ .URI }}">{{ .Title }}</a>
as the redundant slash will be removed. But I was wrong.
Looking at the link address, instead of seeing:
1http://localhost//2021/09/23/uri-network-path-reference
I saw:
1http://0.0.7.229/09/23/uri-network-path-reference
What’s going on?
Troubleshooting
The first question comes to my mind is what does href
do if it begins with two slashes?
Side Projects
2021-09-23
- vtv: The King of Vietnamese language
- blog: my own static site generator
- xsplitter: I helped my wife to automate her office tasks
- gcal: insert an event into Google Calendar whenever I want to work from home.
- zwc: save a draft mail message in Zimbra Web Client
- vnr500: I helped my friend to extract top 500 largest Vietnamese enterprises into csv.
- salt-osx: manage Mac OS X using SaltStack
Docker Compose healthcheck
2021-09-09
The most important thing when running integration test using docker-compose is ensured that one container is started completely before others.
Sometime wait-for-it is not enough:
1 cassandra: 2 image: bitnami/cassandra:latest 3 ports: 4 - '7000:7000' 5 - '9042:9042' 6 volumes: 7 - /path/to/init-scripts:/docker-entrypoint-initdb.d 8 9 wait-for-cassandra: 10 image: willwill/wait-for-it 11 command: cassandra:9042 -t 60 12 depends_on: 13 - cassandra:
Do not use jq when working with large number
2021-09-07
We use etcd to store application configuration. On production, config is loaded from json file by using Python.
I’m wondering if we can use jq to do that. So, I tried something like this:
1host=${ETCD_HOST:-127.0.0.1} 2port=${ETCD_PORT:-2379} 3for key in $(jq -r 'keys[]' "$1"); do 4 value=$(jq -r ".$key" -c "$1") 5 ETCDCTL_API=3 etcdctl --endpoints="$host:$port" put "$key" "$value" 6done
Config is loaded into etcd
but some values are not the same as in the JSON file.
What is going on?
fish shell - very high CPU usage
2021-07-30
Sometimes my Macbook is loud like a plow, and the culprit is usually docker. This time it’s different, top -u
tells me that fish shell is taking up > 100% CPU.
I just switched from zsh to fish about a year ago after having problems with git completion.
My favorite feature about fish is probably autosuggestions. Normally, when I want to run a command again, I can control+R
, type a few letters to select the command I want to run. With fish shell, I can type that command and then ->
or control+F
is fine.