tech
shell scriptを時間指定で実行したいときに cronjob や at など方法があると思います。
ただKubernetes環境で実行したいときはどうでしょうか?
shell scriptを実行するだけなら cronjob リソースを使えば良いのですが、今回は対象アプリのsidecarとして載せる必要がありました。この場合は Deployment リソースなので、shell scriptに時間トリガーを仕込む必要がありました。
時間を integer に変換して比較・・・など色々試行錯誤しましたが、stackoverflowのHow to check if the current time is between 23:00 and 06:30に素晴らしいアイデアがありました。
結論は date を string で取り出して、case で判定を行います。
#!/bin/bash while :; do currenttime=$(date +%H:%M) echo $currenttime case "$currenttime" in (04:21) # 04:21にbreakしてscriptを終了 echo "break" break ;; (*) echo "*" ;; esac sleep 5s done exit 0 動作させた結果がこちらです。
$ bash test.sh 04:20 * 04:20 * 04:20 * 04:21 break バッチリですね。02:00~04:00の間などの条件を使いたいときは正規表現です。
Read more
gin-gonic/ginが圧倒的な人気を誇っているので、README.mdにある一通りの機能でWebAPI(JSON format)の想定で関わりそうな機能を試していきます。
記載してあるコードはREADME.mdにあるコードを抜粋したり、改変したりして記載しています。
QuickStart とりあえずQuickStartのコードを試してみます。
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H{ "message": "pong", }) }) r.Run() } $ curl localhost:8080/ping {"message":"pong"} $ go run main.go [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /ping --> main.
Read more
import _ "hogehoge" の _ は、どういう意味があるんだろうと気になったので調べました。
init()の実行が理由 packageの中身を利用せずに、init()関数が必要な場合に利用するようです。 なので次のように動作を試してみました。
main.go
package main import ( "fmt" _ "github.com/sourjp/practice/hello" ) func main() { fmt.Println("Hi") } hello/hello.go
package hello import "fmt" func init() { fmt.Println("hello") } 実行してみるとpackage helloを使いませんが、中に定義されているinit()が実行されていることがわかります。
$ go run main.go hello Hi 次に実際のpackageでの使われ方をみていきます。
package imageの場合 package imageでは、Decode()を行うのにRegistration()で拡張子を登録する必要があります。
Values of the Image interface are created either by calling functions such as NewRGBA and NewPaletted, or by calling Decode on an io.Reader containing image data in a format such as GIF, JPEG or PNG.
Read more
Go言語でコマンドラインツールを作ろうと思いましたが、サブコマンドが必要になりそうだったので調べました。 書きやすいものを探したいので次のコマンドを作るという前提で比較していきます。
./cmd foo -name=foo args ./cmd bar -name=bar args 対象は標準パッケージと、みんなのGo言語にピックアップされている3rd packageも試してみます。
flag (標準) 大変わかりやすかったので、Go by Example: Command-Line Subcommandsをベースに簡略化して考えたいと思います。
package main import ( "flag" "fmt" "os" ) func main() { fooCmd := flag.NewFlagSet("foo", flag.ExitOnError) fooName := fooCmd.String("name", "", "name") barCmd := flag.NewFlagSet("bar", flag.ExitOnError) barName := barCmd.String("name", 0, "name") if len(os.Args) < 2 { fmt.Println("expected 'foo' or 'bar' subcommands") os.Exit(1) } switch os.Args[1] { case "foo": fooCmd.Parse(os.Args[2:]) fmt.Println("subcommand 'foo'") fmt.
Read more
Qiita: ArgoCDをArgoCDで管理 + Kustomizeに書きました。
securego/gosecなるものを教えてもらいました。 Go ASTでセキュリティの問題がないかをチェックしてくれるようです。
どんな内容をチェックしてくれる? Available rulesがその一覧です。
もう少し細かいところは公式サイトにありますが、更新はされてなさそうですが、調べ方は次に記載します。
Gxxxって何の番号? README.mdに書いてありました。 gosecのprojectで採番している番号で、その元はCWEのようです。
対応表を見ると、例えば G102 は CWE-200 にマッチしていて、CWE-22: Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’)とアクセスすれば良さそうです。
// GetCwe creates a cwe object for a given RuleID func GetCwe(id string) Cwe { return Cwe{ID: id, URL: fmt.Sprintf("https://cwe.mitre.org/data/definitions/%s.html", id)} } // IssueToCWE maps gosec rules to CWEs var IssueToCWE = map[string]Cwe{ "G101": GetCwe("798"), "G102": GetCwe("200"), ---snip--- } 使われてるの? リストがありました。 GitlabやVMwareなどの企業しかり、KubernetesやJenkins Xなどのプロジェクトにも使われるようですね。
使い方は? いくつかオプションがありますが、基本はこれで良さそうです。 GitHub Actionsでも gosec の名前で公開されているのでCIへの組み込みも簡単そうですね。
Read more
Hugoについて Go言語の静的サイトジェネレータです。md形式でblogを作れて簡単です。
Theme選び 出始め当時はテーマが少ないなんて記事も多かったですが、今では結構選択肢が多いようです。私はシンプルが好みなので、Picklesを使うことにしました。
Pickles Cactus Deploy方法 AWS, Firebaseなど色々用意されています。次を参考にGitHub Pagesが無料なので使うことします。
公式 Hugoで1からテーマを作ってGitHub Pagesにデプロイする 参考URLを読むとデプロイ方法は次の通りとわかり1の手法にすることにしました。理由はHugoの設定関連をprivate repositoryにして隠すことができること、単純にわかりやすいからです。
blog用のrepositoryの master branchから配信 blog用のrepositoryの gh-pages branchから配信 blog用のrepositoryの master branchの /dir から配信 ただいくつかの点でハマったので補足情報をメモします。例えば sample さんのGITHUBアカウントだと、repositoryを二つ作ります。
Hugoの設定ファイルを管理するrepository e.g. sample/blog GitHub Pages配信repository e.g. sample/sample.github.io ポイントは sample/blog/ に生成される /public を、sample/sample.github.io のsubmoduleとすることです。
こんな感じ。
tree -L 1 sample/blog // Hugo用のrepository ├── Makefile ├── archetypes ├── config.toml ├── content ├── data ├── layouts ├── public // submoduleでsample/sample.
Read more