Ubuntu - 修改 hostname

  1. 查看目前的 hostname

     hostname
    
  2. 修改 etc/hostname

     sudo vim etc/hostname
    
  3. 修改 etc/hosts

     sudo vim etc/hosts
    
  4. 運行以下指令

     sudo hostname -F /etc/hostname
    

重新開啟 terminal ,應該就可以看到新的 hostname 了!

Go - 解決每次都要重新 mount /proc 的問題

照著 Deep into Container — Build your own container with Golang 這篇教學操作的時候,發現每次結束都需要執行:

sudo mount -t proc proc /proc

上網查之後,發現將 must(syscall.Mount("proc", "proc", "proc", 0, "")) 改為以下程式碼,聲明這個新的 mount namespace 獨立:

must(syscall.Mount("", "/", "", syscall.MS_PRIVATE|syscall.MS_REC, ""))
defualtMountFlags := syscall.MS_NOEXEC | syscall.MS_NOSUID | syscall.MS_NODEV
must(syscall.Mount("proc", "/proc", "proc", uintptr(defualtMountFlags), ""))

Resource

Go - Waitgroup

  • 當有很多 Goroutine 需要完成時,就可以用 Waitgroup
  • Waitgroup 做完一輪到 wg.Wait() 後可以被重複使用
  • 傳給其他 function 要 pass by reference
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	wg := &sync.WaitGroup{} // 宣告一個 Waitgroup

	for i := 0; i < 10; i++ {
		wg.Add(1) // 需要等待的 Goroutine 數量加一
		id := i

		go func() { // 啟動 Goroutine
			defer func() { // 每次結束 Goroutine,使用 wg.Done() 通知 waitgroup 需要等待的 goroutine 減少一個
				fmt.Printf("Task %d done\n", id)
				wg.Done()
			}()

			worker(id)
		}()
	}

	wg.Wait() // 將 main() block 住,直到所有 Goroutine 被執行完(counter == 0),避免 main() 在 goroutine 們還沒執行完就結束了
}

func worker(id int) {
	fmt.Printf("Worker %d starting\n", id)
	time.Sleep(time.Second)
}

Go - Build Executables for Multiple Platforms

以 libp2p 的 chatroom 範本為例,編譯不同平台的執行檔。

  1. Clone the repo.
     git clone https://github.com/libp2p/go-libp2p
     cd go-libp2p/examples/pubsub/chat
    
  2. Build the binary
     go build . # Builds executables
     ./chat # 執行
    
  3. 讓執行檔放在特定位置並取特定名字
       go build -o build/hello .
    

    上面的程式碼會 build 出叫 hello 的執行檔,並將他放在叫 build 的資料夾中。

  4. 如果希望執行檔被存在 $GOPATH/bin,則要使用 go install
     go install .  
    

    可以用下面指令查看目前 $GOPATH/bin 在哪:

     echo $GOPATH/bin    
    
  5. Go 方便的地方之一就是可以為其他 OS 與 architecture 編譯執行檔,用下面指令查看可以可以 build 執行檔的 OS 與 architecture :
     go tool dist list
    
  6. 用下列指令 build 後,資料夾下會出現屬於 Windows 64-bit 的執行檔 chat.exe :
     GOOS=windows GOARCH=amd64 go build .
    
  7. 可以使用 go env 查看目前的環境變數,裡面就包括預設的你的系統的 GOOS 與 GOARCH。

參考資料

Go - Return bit 1 count

程式碼如下:

func BitCount(x int) int {
	cnt := 0
	for x > 0 { // 當 x <= 0 就是完全沒 1 了 
		x = x & (x - 1) // 每次會不見一個 1
		cnt++
	}
	return cnt
}