gocloud - writing data to a bucket: 403
2022-12-23
Problem
We are writing some integration test using Go CDK. After writing some data to a bucket:
1 writer, err := buckOut.NewWriter(ctx, fileDst, nil) 2 if err != nil { 3 logger.Errorf("failed to write to fileDst: %v", err) 4 return err 5 } 6 defer writer.Close()
we got an error when reading:
1(code=NotFound): storage: object doesn't exist
By reading the documentation, I pay attention to this:
Closing the writer commits the write to the provider, flushing any buffers, and releases any resources used while writing, so you must always check the error of Close.
Terraform failed to acquire state lock: 403: Access denied., forbidden
2022-11-17
Problem
We stored Terraform state in gcs. For some reasons, we got this error randomly when running on BitBucket pipelines:
1╷ 2│ Error: Error acquiring the state lock 3│ 4│ Error message: 2 errors occurred: 5│ * writing 6│ "gs://bucket/path/to/default.tflock" 7│ failed: googleapi: Error 403: Access denied., forbidden 8│ * storage: object doesn't exist 9│ 10│ 11│ 12│ Terraform acquires a state lock to protect the state from being written 13│ by multiple users at the same time. Please resolve the issue above and try 14│ again. For most commands, you can disable locking with the "-lock=false" 15│ flag, but this is not recommended. 16╵
The King of Vietnamese language game show
2022-11-04
My family likes to watch “The King of Vietnamese language” game show together. I want to encourage our son to love Vietnamese. At the end of the game, the player has to find 7 complex words from the letters, for e.g,
đ / ă / n / g / c / a / y
One evening a few weeks ago, while we were watching the final round, my wife suddenly came up with an idea: this game could be programmed.
How to run a pipeline step only when pushing to a new branch?
2021-01-07
GitHub sends push hook when pushing to a new branch and merging a PR. How can we distinguish between them?
We are running integration test by triggering a downstream build when a PR is merged into specific branches. In the downstream repository, we pull all the docker images which has been built and pushed from upstream. The thing is we also used the drone-convert-pathschanged to only publish what modules has been changed.
So, what happens when pushing to a new release-*
branch?
How to add full text search to my static website?
2020-12-30
After building the website, I want to add search function. There are some ways to do it:
- ElasticSearch: setup and maintenance cost
- MongoDB: have to insert posts into database
- Google Custom Search Engine: ads?
So, is there any search engine written in Go?
Bleve
has more star and be maintained more often than riot
, I would like to give it a try first.
Backend
Looking at the documentation, there are three steps to add search to your website:
How to perform integration testing in Go?
2020-09-29
Integration testing can be triggered by using Drone downstream plugin:
1steps: 2- name: trigger 3 image: plugins/downstream:linux-amd64 4 settings: 5 params: 6 - COMMIT_BRANCH=${DRONE_COMMIT_BRANCH} 7 repositories: 8 - repo/integration-test@${DRONE_COMMIT_BRANCH} 9 server: https://drone.example.com 10 token: 11 from_secret: drone_token
It can be separated with unit tests by using build tags:
1// +build integration 2 3package webserver_test
Then we can write code to perform integration test as usual.
Save draft mail in Zimbra web client using ChromeDP
2020-07-03
As an engineer, I want to automate everything as much as possible. This CLI tool is created to save a draft mail in Zimbra web client.
Read config file:
1func initConfig() { 2 if cfgFile != "" { 3 // Use config file from the flag. 4 viper.SetConfigFile(cfgFile) 5 } else { 6 // Find home directory. 7 home, err := homedir.Dir() 8 if err != nil { 9 fmt.Println(err) 10 os.Exit(1) 11 } 12 13 // Search config in home directory with name ".zwc" (without extension). 14 viper.AddConfigPath(home) 15 viper.SetConfigName(".zwc") 16 } 17 18 viper.AutomaticEnv() // read in environment variables that match 19 20 // If a config file is found, read it in. 21 if err := viper.ReadInConfig(); err != nil { 22 log.Fatal(err) 23 } 24 25 fmt.Println("Using config file:", viper.ConfigFileUsed()) 26}
Google Calendar CLI
2020-04-13
Our company allows us to work from home some days a week. To do that, we have to create an event in Google Calendar.
I created this tool to run it from CLI.
First, take a look at this quickstart.
Create initical code by running:
1$ cobra init 2 3$ tree -L 2 4. 5├── LICENSE 6├── cmd 7│ └── root.go 8├── main.go
Create event
command:
1$ cobra add event 2$ cobra add insert -p 'eventCmd' 3 4$ tree -L 2 5. 6├── LICENSE 7├── cmd 8│ ├── event.go 9│ ├── event_insert.go 10│ └── root.go 11├── main.go
database/sql: never ignore errors
2019-10-16
I’m reading Building RESTful Web Services with Go. And in chapter 4, there is an example to play around with SQLite:
1db, err := sql.Open("sqlite3", "./books.db") 2if err != nil { 3 log.Fatal(err) 4} 5 6statement, err := db.Prepare("CREATE TABLE IF NOT EXISTS books (id INTERGER PRIMARY KEY, isbn INTEGER, author VARCHAR(64), name VARCHAR(64) NULL)") 7if err != nil { 8 log.Fatal(err) 9} else { 10 log.Println("Created table books successfully") 11} 12statement.Exec() 13 14statement, err = db.Prepare("INSERT INTO books (name, author, isbn) VALUES (?, ?, ?)") 15if err != nil { 16 log.Fatal(err) 17} 18statement.Exec("Life is a joke", "The Javna brothers", 123456789) 19log.Println("Inserted first book into db") 20rows, err := db.Query("SELECT id, name, author FROM books") 21var tempBook Book 22for rows.Next() { 23 rows.Scan(&tempBook.id, &tempBook.name, &tempBook.author) 24 log.Printf("ID: %d, Book: %s, Author: %s\n", tempBook.id, tempBook.name, tempBook.author) 25}
How do I build this blog?
2019-10-11
Recently, I decided to find a new job as a Golang developer. So, I updated my resume, sent to my friends to ask for review. Then I submitted it enclosed herewith a cover letter to recruiters. Some didn’t reply, and the other replied with a message like this “You are so good, but I’m so sorry…”.
What is the reason?
As you can see in my resume, I started my career as a .NET developer, then my passionate on Linux and open source lead me to a different direction: system administrator. And I followed this nearly in 9 years before switching back to work as a Golang developer 2 years ago.