Tumgik
akubi0w1 · 1 year
Text
Goの特定のディレクトリを除外してテストする
grepで対象から除外させることが可能
$ go test $(go list ./... | grep -v "/path/to/dir")
ref
https://stackoverflow.com/questions/55224561/how-to-exclude-or-skip-specific-directory-while-running-go-test
0 notes
akubi0w1 · 1 year
Text
GitHub Actionsの特定のトリガーのみ発火させるstep
Overview
GitHub Actionsにおいて、ワークフローを発火したイベント(onディレクティブで指定する)に応じて、ステップの実行を指定する方法
How to
name: test github actions on: pull_request: branches: - '**' types: [ synchronize, opened, reopened, ready_for_review ] push: branches: - '**' jobs: echo_step: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # PRだった場合はスキャン結果を通知する - name: only pull request if: ${{ github.event_name == 'pull_request' }} run: | echo "only invoke pull_request"
Ref
GitHub Actions - run step only if job was triggered by specific "on" trigger -Stack Overflow
Contexts -GitHub Docs
0 notes
akubi0w1 · 1 year
Text
Docker Imageについて
概要
タグ 内容 OS <x.x.x>|latest|- 公式パッケージ alpine 軽量なAlpine Linuxベースのイメージ Alpine Linux bullseye[-slim] Debian11で構成されたイメージ Debian buster[-slim] Debian10で構成されたイメージ Debian stretch[-slim] Debian9で構成されたイメージ Debian jessie[-slim] Debian8で構成されたイメージ Debian windowsservercore windowsサーバ系OSで構築したイメージ windows
詳細
イメージを構築しているOSが以下4種類
公式パッケージ
Alpine Linux (Linuxディストリビューション)
Debian (Linuxディストリビューション)
windows
公式パッケージを使う場合
golang:1.18, golang1.18.5 など、バージョンを指定するもの
タグ 内容 <x.x.x> パッチまで指定 <x.x> マイナーバージョンまで指定、パッチは最新のものになる <x> メジャーバージョンのみ指定、マイナーバージョン、パッチは最新のものになる latest 最新バージョンを指定 - latestと同義
Alpine Linux
軽量重視で作られたLinuxディストリビューション。一部言語では速度が遅くなる場合がある。 パッケージ管理にapkコマンドを使う。
軽量版なので、必要なパッケージやライブラリが無い場合がある。
Debian
Linuxディストリビューション。バージョンごとにコードネームが付けられていて、Dockerイメージのタグにそのコードネームが使われている。
コードネーム バージョン bullseye v11 buster v10 stretch v8 jessie v8
windows
windows専用のサーバOSで構築されている。コンテナをwindows環境にする場合はこれを使う。
Slim
公式とDebian系イメージで用意されている。 更にslimがついているイメージは、使用頻度の低いツールやライブラリを除外したDockerイメージになります。
ref
Docker image(イメージ)の違い:alpine,bullseye, buster, slim, stretch, jessie, slim-buster, windowsservercore, latestどれを選ぶべきか?
0 notes
akubi0w1 · 1 year
Text
M1 Macでgrpc-toolsをインストールできない
node-pre-gypがarm64向けのコンパイル済のバイナリをインストールしようとして失敗するらしい。 x64向けのコンパイル済バイナリを取得しに行くように設定するとインストールできる。
x64向けバイナリはRosetta 2 に寄るエミュレーションでM1 Macでも動く
そうな。
# 環境変数に以下をセット $ export npm_config_target_arch=x64 # install $ yarn add grpc-tools
ref
M1 Mac で grpc-tools を npm install できない問題の回避策 - Qiita
0 notes
akubi0w1 · 1 year
Text
C++のライブラリをGoから呼び出す方法
C++のライブラリをGoから呼び出す方法
MacOS M1
Monterey 12.5
CMake
3.25.1
事前知識について
以下あたりで、C++のライブラリやCMakeの勉強をしました。
ライブラリのリンク方法をきっちり区別しよう -Qiita
CMake入門-基本概念と主な関数 -Qiita
C#で書いたライブラリをPHPやGoから呼び出す -Qiita
CMake Generator
チュートリアル: 独自のダイナミック リンク ライブラリを作成して使用する (C++)
コードを管理しているリポジトリはakubi0w1/call-cpplib-by-go-sample
C++のライブラリを作ってみる
テストということで適当に足し算します。
// cpplib/TestLibrary.h #ifndef TEST_H #define TEST_H #define DLL_EXPORT extern "C" __declspec(dllexport) #define DLL_CALL __stdcall DLL_EXPORT double DLL_CALL Add(double a, double b); #endif //TEST_H
// cpplib/TestLibrary.cpp #include "TestLibrary.h" double Add(double a, double b) { return a + b; }
CMakeまわり
CMakeLists.txtを書く
// CMakeLists.txt cmake_minimum_required(VERSION 3.23) project(test_library) set(CMAKE_CXX_STANDARD 14) add_compile_options(-fms-extensions) add_library(TestLibrary SHARED cpplib/TestLibrary.cpp cpplib/TestLibrary.h) # 静的ライブラリの場合は下記を指定する # add_library(TestLibrary STATIC cpplib/TestLibrary.cpp cpplib/TestLibrary.h)
CMakeのコマンドを実行するためのMakefileを作ります。
# Makefile CURRENT_PATH = $(shell pwd) # toolchains TOOLCHAIN_DIR = $(CURRENT_PATH)/.toolchain TOOLCHAIN_BIN = $(TOOLCHAIN_DIR)/bin # cmake CMAKE = $(TOOLCHAIN_BIN)/cmake/CMake.app/Contents/bin/cmake CMAKE_VERSION = 3.25.1 # packages UNAME_S := $(shell uname -s) ARCH := $(shell uname -m) ifeq ($(UNAME_S),Darwin) # See https://cmake.org/download/ CMAKE_ARCHIVE = cmake-$(CMAKE_VERSION)-macos-universal CMAKE_PACKAGE = https://github.com/Kitware/CMake/releases/download/v$(CMAKE_VERSION)/$(CMAKE_ARCHIVE).tar.gz endif ########################################### # cmake cmake-version: $(CMAKE) $(CMAKE) --version # See generators: https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html cmake-buildpj: $(CMAKE) $(CMAKE) -S . -B build/ -G"Unix Makefiles" cmake-buildlib: $(CMAKE) $(CMAKE) --build build/ $(CMAKE): mkdir -p $(TOOLCHAIN_BIN) mkdir -p $(TOOLCHAIN_DIR)/tmp-cmake cd $(TOOLCHAIN_DIR)/tmp-cmake && curl -Lo cmake.tar.gz $(CMAKE_PACKAGE) && tar -zxvf cmake.tar.gz mv $(TOOLCHAIN_DIR)/tmp-cmake/$(CMAKE_ARCHIVE) $(TOOLCHAIN_BIN)/cmake rm -rf $(TOOLCHAIN_DIR)/tmp-cmake
ライブラリをビルドする
Makefileで定義したターゲットを使ってビルドしてみる。
# プロジェクトファイルの作成 # build/が作成されます $ make cmake-buildpj # ライブラリのビルド # ライブラリの種類に応じて build/libTestLibrary.[a|dylib] が生成されます $ make cmake-buildlib
Goで呼び出す
静的ライブラリと動的ライブラリを呼び出してみる
静的ライブラリ
build/libTestLibrary.aが作成されていることを確認してください。
// main.go package main // #cgo LDFLAGS: -L./build -lTestLibrary // double Add(double a, double b); import "C" import ( "log" ) func main() { num1 := C.Add(1.5, 2.0) log.Printf("num: %+v", num1) }
goコードの実行をしてみる
$ go run main.go 2022/12/15 17:15:09 num: 3.5
動的ライブラリ
build/libTestLibrary.dylibがあることを確認してください。
// ライブラリを配置 $ sudo cp build/libTestLibrary.dylib /usr/local/lib/libTestLibrary.dylib
goのコードを書く
// main.go package main // #cgo LDFLAGS: -L. -lTestLibrary // double Add(double a, double b); import "C" import ( "log" ) func main() { num1 := C.Add(1.5, 2.0) log.Printf("num: %+v", num1) }
goコードの実行をしてみる
$ go run main.go 2022/12/15 17:17:17 num: 3.5
0 notes
akubi0w1 · 1 year
Text
Terraformのリソース作成のtimeoutを調整する
問題
Cloud Functionsをterraformで作成しようとしたら、applyでtimeoutした。
google_cloudfunctions_function.function: Still creating... [5m0s elapsed] ╷ │ Error: Error waiting for Creating CloudFunctions Function: timeout while waiting for state to become 'done: true' (last state: 'done: false', timeout: 5m0s) │ │ with google_cloudfunctions_function.function, │ on sample.tf line 95, in resource "google_cloudfunctions_function" "function": │ 95: resource "google_cloudfunctions_function" "function" { │ ╵
解決方法
そもそもtimeoutを引き伸ばす方法があるらしい。
resource "google_cloudfunctions_function" "function" { provider = google-beta project = var.project_id region = var.region ... timeouts { create = "10m" } }
参照
https://stackoverflow.com/questions/63561091/how-to-resolve-the-terraform-error-timeout-while-waiting-for-state-to-become-d
0 notes
akubi0w1 · 2 years
Text
Slackでユーザグループメンションを飛ばす
webhookやslackAPIを用いてメッセージを投稿する際に、グループメンションを飛ばす方法。
テキストのフォーマットは以下
<!subteam^{YOUR_TEAM_ID}>
teamIDの取得方法
slackAPI(usergroups.list)からも取得可能だが、web版のslackから取得する方法が簡単だったのでそっちも乗せる
Slackのweb版にログイン
サイドバー > その他 > メンバーディレクトリとユーザグループから対象のユーザグループを選択
https://app.slack.com/client/{clientID}/browse-user-groups/user_groups/{teamID}のURLになるので、末尾からteamIDを取得
メッセージのプレビューはBlock Kit Builder -Slackにて作成可能。
ref
【Slack】Webhook経由での通知でユーザーグループにメンションを飛ばす -Qiita
SlackのUserGroupのIDを取得する/How to get a user group id in slack -pospomeのプログラミング日記
0 notes
akubi0w1 · 2 years
Link
書式変換にめっちゃ便利
0 notes
akubi0w1 · 2 years
Text
GitでHEADのコミットハッシュを取得する
# headのコミットハッシュを取る $ git rev-parse HEAD # ハッシュの短縮形を取る $ git rev-parse --short HEAD
ref
Git で現在のコミットのハッシュを取得する方法
0 notes
akubi0w1 · 2 years
Text
yarn で create-react-app する
CrateReactAppのv5.0.0から、yarnがインストールされていてもnpmが使われるようになった。
���ので、yarnを使いたい場合は、以下で作成する。
$ yarn create react-app <project_name>
ref
【React】「npx create-react-app」コマンドでyarnは使われなくなった -Zenn
Getting Started -Create React App
0 notes
akubi0w1 · 2 years
Text
Terminalで文字入力時に直近の履歴を表示する
zsh-users/zsh-autosuggesionsを利用します。
Tumblr media
↓ こうする
Tumblr media
Git Cloneを使ってインストール
# clone $ git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions # edit .zshrc $ vim ~/.zshrc source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh # restart $ zsh
ref
ターミナルでコマンド履歴の入力補完 -Qiita
0 notes
akubi0w1 · 2 years
Text
GitHubにSSH keyを登録する
秘密鍵・公開鍵を作成する
$ ssh-keygen -t rsa -f ~/.ssh/github_rsa # 公開鍵をclipboardにコピーしておく $ cat ~/.ssh/github_rsa.pub | pbcopy
公開鍵をGitHubに追加する
https://github.com/settings/ssh > SSH keys > New SSH keyから公開鍵を登録。
Titleはよしなに、Keyは先程コピーした公開鍵を貼り付けて保存する。
SSH Configを作成する
$ vim ~/.ssh/config # 以下二行を入れておくと、毎回パスフレーズを聞かれなくなる Host * UseKeychain yes # 追加 Host github.com HostName github.com IdentityFile ~/.ssh/github_rsa User {github_id} Port 22
SSHの接続を確かめる
以下で接続確認。 Are you sure you want to continue connectingにはyesで対応する。
$ ssh -T [email protected] The authenticity of host 'github.com (13.114.40.48)' can't be established. ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'github.com' (ED25519) to the list of known hosts. Enter passphrase for key '/Users/s10973/.ssh/github_rsa': Hi {github_id}! You've successfully authenticated, but GitHub does not provide shell access.
ref
GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~ -Qiita
0 notes
akubi0w1 · 2 years
Text
予約済みExitCode
exit codeの使い分けに関して
exit codes
code 意味 例 コメント 1 一般的なエラー全般 $ let "var 1 = 1 / 0" ゼロ除算などのコマンドを継続できない雑多なエラー 2 (Bash のドキュメントによると)シェルビルトインな機能の誤用 $ empty_function(){} キーワードのつけ忘れ やコマンド,または権限周りの問題(あと,diff がバイナリファイルの比較に失敗した時) 126 呼び出したコマンドが実行できなかった時 $ /dev/null パーミッションの問題かコマンドが executable でない時 127 コマンドが見つからない時 $ illegal_command $PATH がおかしい時や typo した時などに起こる 128 exit コマンドに不正な引数を渡した時 $ exit 3.14159 exit コマンドは 0〜255 の整数だけを引数に取る 128+n シグナル n で致命的なエラー $ kill -9 $PPID 例では, $? は 137(128 + 9)を返す 130 スクリプトが Ctrl+C で終了 Ctrl+C Ctrl+C はシグナル2で終了する = 128 + 2 = 130(上記) 255 範囲外の exit status $ exit -1 exit コマンドは 0〜255 の整数だけを引数に取る
Exit Code 1, 2, 126〜165, 255 は特別な意味を持つため、スクリプトやプログラム内でexitするときは注意
ref
コマンドラインツールを書くなら知っておきたい Bash の 予約済み Exit Code -Qiita
Appendix E. Exit Codes With Special Meanings
0 notes
akubi0w1 · 2 years
Text
slack botにDMを送信したい時にやったこと
以下のあたり。
slack apiから変更したいアプリケーションの管理画面に行く。
左側のナビゲーションで、「App Home」を選択します。
「Your App's Presence in Slack」セクションで、「Always Show My Bot as Online」スイッチをオンにします。
ページを「タブの表示」セクションまで下にスクロールし、「メッセージ」タブをオンにします。
「ユーザーによるメッセージ・タブからのスラッシュ・コマンドおよびメッセージの送信を許可」チェック・ボックスを選択します。
ref
Oracle Cloud Infrastructureドキュメント
0 notes
akubi0w1 · 2 years
Text
Linuxのプロセス強制終了について
実行コマンドについて
// 強制終了(シグナルID 9)を指定する $ kill -9 $PID // シグナルIDの一覧 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX
ref
linux killできないプロセスを強制終了する
0 notes
akubi0w1 · 2 years
Text
S3のイベントをキャッチして発火するLambda
インフラリソース
S3のバケットがある想定。
Terraformでaws_s3_bucket_notification、aws_lambda_permissionを作成する。
locals { lambda_function_name = "SampleLambda" lambda_handler_name = "main" hook_bucket_name = "sample-bucket" } resource "aws_lambda_function" "sample" { function_name = local.lambda_function_name filename = "lambda/empty.zip" role = aws_iam_role.iam_for_lambda.arn handler = local.lambda_handler_name runtime = "go1.x" publish = true lifecycle { ignore_changes = [ source_code_hash ] } } resource "aws_s3_bucket_notification" "sample" { bucket = local.hook_bucket_name lambda_function { lambda_function_arn = aws_lambda_function.sample.arn events = ["s3:ObjectCreated:*"] // s3のイベント filter_prefix = "AWSLogs/" // prefixをフィルタ filter_suffix = ".zip" // suffixをフィルタ } depends_on = [aws_lambda_permission.sample] } resource "aws_lambda_permission" "sample" { statement_id = "AllowS3Invoke" action = "lambda:InvokeFunction" function_name = aws_lambda_function.sample.function_name principal = "s3.amazonaws.com" source_arn = "arn:aws:s3:::${local.hook_bucket_name}" }
lambda
events.S3Eventにていい感じにマップされたリクエストを受け取れる。
import ( "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func lambdaFn(ctx context.Context, event events.S3Event) (interface{}, error) { for _, record := range event.Records { // recordの中にイベント発生させたS3のBucket名やKeyが入っている bucket := record.S3.Bucket.Name key := record.S3.Object.Key } resp := &struct { StatusCode uint `json:"statusCode"` }{StatusCode: 200} return resp, nil } func main() { lambda.Start(s3lambda) }
ref
Resource: aws_s3_bucket_notification
Go言語でS3のイベントをHookしてLambdaを実行するときの書き方
0 notes
akubi0w1 · 2 years
Text
AWS Lambdaのあれこれ
GoでLambda書きまくった記念
ハンドラ
以下な感じのハンドラが使える。
func () func () error func (TIn) error func () (TOut, error) func (context.Context) error func (context.Context, TIn) error func (context.Context) (TOut, error) func (context.Context) (TOut, error)
ビルド・デプロイ
makeで実行する
refreshで値をバイナリやzipを削除して、deploy-lambdaでビルドとデプロイを実施。
refresh: rm -rf lambdafn/bin rm -rf lambdafn/func deploy-lambda: refresh mkdir -p lambdafn/func cd lambdafn && GOOS=linux GOARCH=amd64 go build -o ./bin/main ./main.go cp -r lambdafn/credentials lambdafn/bin/credentials cd lambdafn/bin && zip -r ../func/main.zip ./* cd lambdafn && aws lambda update-function-code \ --function-name sample-lambda-function \ --zip-file fileb://lambdafn/func/main.zip
Lambdaの設定値
ハンドラ名
goでビルドしたバイナリの名前と揃える。
zipの以下
bin/
main.goをビルドした成果物が入っている
func/main.zip
bin/をzipしたものが入っている
func/main
func/main.zipを解凍すると出てくるツリー 
lambdafn/ ├── bin/ │ ├── credentials/ │ │ └── cred.json │ └── main ├── credentials/ │ └── cred.json ├── func/ │ ├── main/ │ │ ├── credentials/ │ │ │ └── cred.json │ │ └── main │ └── main.zip └── main.go
Timeoutの値
Terraform(Terraform v0.12.31, aws 3.41.0)で作成するとデフォルトで3秒になる。 変更はtimeoutをつける。
resource "aws_lambda_function" "sample" { function_name = local.lambda_function_name filename = "lambda/empty.zip" timeout = 180 }
ref
Go の AWS Lambda 関数ハンドラー
0 notes