- 1. Golang – Incorrect CPU Numbers of GOMAXPROCS in Docker
- 2. [おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選
- 3. AWSの利用料金をGoで積み上げ棒グラフ化した
- 4. VScodeでGoをいい感じに設定する
- 5. [Go言語] httpライブラリのHandler,Handlefuncとかをざっくり整理
- 6. nuxtで作った静的ファイルをgolangのechoでホスティングする。
- 7. [go] エラーのラッピング
- 8. [Golang][競プロ]子ども達に大福を分け与える問題について解説してみた
- 9. if文の書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby)
- 10. Goを学習するに当たって特徴をまとめてみた
- 11. Ginのミドルウェアを使ったエラーハンドリング
- 12. Dependency Injection入門
- 13. プライベートリポジトリをパスワードで限定公開するアプリを作った
- 14. golang functional option
- 15. 【Go】日時を文字列に変換する時によく使うフォーマット指定
- 16. Golangで「特定のpackage以外の全てのpackageに対してtest」を行う方法
- 17. golangの数値型とmysqlの整数型
- 18. Golangのテンプレートエンジンを使い、日付・時刻のフォーマット指定
- 19. Sliceの値を構造体に表す方法
- 20. protobufのenumをgolangの型(int32)に変換する
Golang – Incorrect CPU Numbers of GOMAXPROCS in Docker
The runtime.GOMAXPROCS(??) will read the host machine’s CPU numbers instead of container’s (–cpus=??). We can use UBER’s ***automaxprocs*** to solve it.
“`
go get -u go.uber.org/automaxprocs
“`“`golang
import _ “go.uber.org/automaxprocs”func main() {
// Your application logic here.
}
“`https://github.com/uber-go/automaxprocs
https://mp.weixin.qq.com/s/Lk1EbiT7WprVOyX_dXYMyg
https://colobu.com/2017/10/11/interesting-things-about-GOMAXPROCS/
http:/
[おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選
こんにちわ、ゴリラです。
普段、筆者は主にターミナルで仕事をしています。そこで作業効率化のためいくつかTUIツールを使っています。
今日は、個人的におすすめのTUIツールを5つ紹介していきます。これらを導入することで、ターミナルでの作業効率が上がると思いますので、ぜひ導入して試してみてください。
また、こんな便利なツールがあるよって方いましたら、ぜひコメントをくださいー# Git
[lazygit](https://github.com/jesseduffield/lazygit)というTUIツールを使っています。`lazygit`機能が豊富なので紹介しようとすると長くになってしまうため、筆者が普段使っていて便利だなと思う機能を紹介します。
詳しく
AWSの利用料金をGoで積み上げ棒グラフ化した
## はじめに
– 最近いろんな所でDevOpsって言葉を聞きますね。
– DevOpsの影響を受けて[FinOps](https://www.finops.org/what-is-finops/)と呼ばれるテクノロジー、ビジネス、財務を融合させたクラウドの運用モデルも提唱されています。
– もしかしたら、数年後にはDevOpsと同じくらいメジャーな概念となっているかもしれません。
– FinOpsを始めるための第一歩としてクラウドの利用料金の可視化、通知が挙げられています。
– というわけで、今回はAWSの利用料金を手っ取り早くグラフ化してslackに通知するツールについて紹介します。## TL;DR
– CostExplorer APIからサービスごとの利用料金を取得
– [gonum/plot](https://github.com/gonum/plot)でStackedBarChartを生成
– [nlopes/slack](https://github.com/nlopes/slack)でslackに通知## AWS料金の可視化方法いろいろ
– [CostExp
VScodeでGoをいい感じに設定する
## Golangのインストール
[【Go】MacにGoをインストールする](https://qiita.com/tktktktk/items/7f284132ab4b080526b8)
まずは上記から、golangをインストールします。
## VScodeの設定
VScodeをインストール
[MacOSでVisual Studio Codeをインストールする手順](https://qiita.com/watamura/items/51c70fbb848e5f956fd6)VScodeを開きます。
左側のタブの一番下、プラグインタブの検索窓に「go」と打ち”Go”をインストール
Command+Shift+Pでコマンドパレッ
[Go言語] httpライブラリのHandler,Handlefuncとかをざっくり整理
# はじめに
Go言語のhttpの標準ライブラリを利用すると、http.Handleとかhttp.Handlefuncとか似た名前が多い。
httpサーバを作るときによく使われるものについて、概念だけわかるようにかなりざっくり整理。##Handler
リクエスト受信時の処理を持つインターフェースと思っておけばいい
定義されているServeHTTPは結局のところリクエスト受信時処理“`
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
“`“`
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
“`##http.Handle
URLと対応するHandlerをひもづけるURLに対してHandlerに定義されているリクエスト受信時処理が登録される
“`
func Handle(pattern string, handler Handler)
“`##http.Handlefun
nuxtで作った静的ファイルをgolangのechoでホスティングする。
# 背景
機能の内容は言えませんが、外部APIを利用した既存の機能の簡易版のツールを作りたい。そういった依頼が舞い込んできました。
すでにその機能は提供されていますが、画面仕様のもと多くの項目の入力が必要で、客先でさくっと処理させるには不向きでした。
そのため、既存機能の登録機能のみを切り出してほしいとのことでした。
二つ返事で了承。
今後のことを考えフロントエンドは別プロジェクトにし、APIは既存のものを利用。
外部のAPIはフロントエンドでのスクリプト読み込み後のAjax送信とサーバーサイドでのポストの処理があり、特定のホスト名と特定のIPにしか対応してませんでした。
それは困った。
ということで、nuxtで静的サイトとしてgenerateしたものを既存のプロジェクトでホスティングさせてしまえば、ホスト名とIPの課題は解決するということでやり方を書いておきます。※ソースは抜粋しか載せられないのでその点はご理解ください。
# 流れ
1. nuxtでプロジェクトを作成しgenerateすることで静的サイトへ
2. golangとechoでできた既存システムでgenerateした
[go] エラーのラッピング
Go 1.13 で追加された、エラーラッピングについて。
– Package errors (golang.org)
– https://golang.org/pkg/errors/# 概要
– エラーを他のエラーでラップすることが可能になる
– 元のエラーの型やフィールド値を保持しつつ新しいエラーを生成できる
– ラップされたエラーは、あとから取り出すことが可能
– 呼び出し先の深い場所で起きたエラーの種類を判別しやすくなる# 使い方
## エラーをラップする
~~~go
innerErr := fmt.Errorf(“Inner Error”)
newErr := fmt.Errorf(“Wrapped: %w”, innerErr)
~~~従来使用してきた `fmt.Errorf()` でできる。
通常は `fmt.Errorf()` は `errors.errorString` 側のエラーを返すが、以下の条件を満たす場合、`fmt.wrapError` 型のエラーを返す。– フォーマット指定子に `%w` を使用する。文字列内での
[Golang][競プロ]子ども達に大福を分け与える問題について解説してみた
# はじめに
今日は、競技プログラミングをしてみたので、回答のロジックについて共有致します。
なお、競技プログラミングサービス側の規約もありますので、**問題文は全く違うものを用意**しておりますが、もし万が一コンプライアンスに問題があれば、ご連絡頂けると嬉しいです。# 問題
おばあさんは、大福を`N`個持っています。
2人の孫が遊びに来たので、大福を分けてやることにしました。
標準入力で大福の数`N`を与えられた場合、2人の孫はいくつずつもらえるでしょう?
ただし、大福の数が奇数だった場合、孫のどちらかが多くなってしまいケンカになりかねないので、その場合はおばあさんが1つ食べるとします。# 回答
問題文の稚拙さは、ご容赦ください。笑
それでは、僕の回答について共有致します。## コード
“`golang:回答したコード
package main
import “fmt”
func main(){
var i int
fmt.Scanf(“%d”, &i)
r := i / 2
fmt.Println(r)
}
“`## 解説
if文の書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby)
いろんな言語を触っていると、言語の重要な特徴はともかく、細かい文法や記号の使い方などがだんだんごっちゃになってきてしまいます。あれ、これってこの言語だとどう書くんだっけ?ってなることがよくあります。前はよく使っていた言語なのに、ちょっと離れただけでもう忘れてしまった、とショックに感じることもあります。なので、こういうメモを作っていこうと思います。
# Scala
“`scala
if (x >= 30) {
…
} else if (x >= 0) {
…
} else {
…
}// 文ではなく式
val max = if (a > b) a else b
“`– 条件式は論理値であることが必要
– C言語と同様に`{ }`の中の式が1つの場合は`{ }`を省略可能 ([dangling else問題](https://www.google.com/search?q=dangling+else)あり)
– 文ではなく式※厳密には、上記例での`{ … }`の箇所は式を1つ置けるのであって、中かっこはif式の仕様ではなくブロック
Goを学習するに当たって特徴をまとめてみた
# はじめに
1年半ほど前から友人の勧めでGoを触っています。仕事ではC/C++を使っているのですが、趣味でGoを始めたことでプログラムの楽しさを思い出した1年でした。
有難いことに、その友人からGoのレッスンをしてもらえることになったので、ここで学習したことをまとめようと思います。友人曰く、新しい言語を学習する上で、その言語が作られた背景を知っている人と知らない人では成長スピードが変わってくるという話だったので、今回はGoの特徴を中心に、Goが開発された背景や勉強方法をまとめます。
# Goが開発された背景
**Google内の課題を解決するために開発された**
参考:https://talks.golang.org/2012/splash.article
– 開発速度の低下
– 開発規模が大きくなるに連れ、現行の言語(C++など)による開発に限界が見え始めた。
– Goで循環参照が禁止されているのは複雑な依存関係を生み出さない仕組みだろうか。
– マルチコア時代の開発
– プロセッサの進化によりプロセッサ数が増え、並行性とスケーラビリティが重要に
Ginのミドルウェアを使ったエラーハンドリング
# はじめに
ginでAPIなんかを書いていると、エラーを返すとき、
“`go
if err != nil {
log.Print(err)
c.AbortWithJSON(http.StatusInternalServerError, gin.H{
“Error”: “Request failed”
})
}
“`のようなコードが(気をつけないと)あちこちに散らばってしまいます。
このままだと、例えばログの表示方法や保存方法が変わることになったときなどに一つひとつ手直ししないといけません。
そこで、ミドルウェアを使ってエラー時の処理をまとめたいと思います。## バージョン
Go : v1.12
[gin](https://github.com/gin-gonic/gin) : v1.5# ミドルウェアについて
ginではミドルウェアを設定でき、通常のハンドラーの前後に任意の処理を入れることができます。
例えば、
“`go
func main() {
r := gin.Default()
r.Use(someMiddleware()) /
Dependency Injection入門
## はじめに
以下では、Dependency Injectionとは何なのか、またその意義について記述する。コード例にはPythonとGoを用いる。## まず、訳語について
Dependency Injectionという用語は、日本語の文脈では「依存性の注入」と訳されることが多い。たとえば、[このWikipediaの項目](https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5)も「依存性の注入」という名前になっている。英語でDependency Injectionという言葉を考えると、明らかに日常的な状況では使用しない専門用語であるという印象を与えはするが、個別の単語に分解して考えれば、プログラマにとってはそれほど難解ではないだろう。
まず、プログラミングの文脈でDependencyといえば、あるソフトウェアが内部で使用している別のソフトウェアのことがすぐに頭に浮かぶはずだ。つまり、「あるプログラムが機能するために必要な別のプログラム」という意味で用いる、使用
プライベートリポジトリをパスワードで限定公開するアプリを作った
GitHubのプライベートリポジトリを不特定多数に公開したい時ってありません? 私はあります、書類選考など。
不特定多数だから一人一人招待は無理だし、パスワード認証程度でいいんだけどなあと思いながら、
GitHubの設定でどうにかできないかと調べてみたんですが、ダメですね、なかったです。かなしいです。クソみたいなリポジトリなんてどうせ誰も見ないんだからパブリックにしちゃえば?と思われるかもしれません。
パブリックはなんか嫌だし、私が作ったものはクソじゃないし、百歩譲ってクソだったとしても自分のクソを全世界に公開する趣味はないです。なので作りました。他になさそうだったので。
http://35.233.244.144/
(クリックしても飛べない場合URLをコピーしてみてください)[GitHubのリポジトリはこちら](https://github.com/simoyama1333/git_limited_access)
![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2
golang functional option
# Optionalな引数、どうしてますか?
pythonやjavascriptであれば
“`py
def hoge(a, b=”bbb”, c=123):
pass
“`こんな風にすれば、関数はoptionalな引数を持つことができますが、Golangではこういう文法はありません。
調べると「Functional Optionを使いましょう」という記述に沢山出会います。実際にFunctional Optionってどうやればいいんだろう?ということでやってみました。
# 実装
## クラスのコンストラクタの場合
“`go
struct Sample {
a string
b string
c int
}
func (s *Sample) init(){
// init Sample
}
func NewSample(a string, b string, c int) *Sample {
s := &Sample{a,b,c}
s.init()
return s
}
“`たとえばこんなコードがあるとします。
【Go】日時を文字列に変換する時によく使うフォーマット指定
# はじめに
しょっちゅう「あれ?Golangで日付を文字列に変換する時のフォーマットってどんなんだっけ?」となって毎回調べているので、個人的によく使うやつを自分用のメモとして残しておきます。
フォーマットの詳しい指定方法については以下の記事がわかりやすくまとまっています。
本記事では細かい解説はしません。– [Golangでの日付のフォーマット指定の方法について \- Qiita](https://qiita.com/unbabel/items/c8782420391c108e3cac)
# よく使うフォーマット
年月日時分秒の指定方法さえ覚えておけば大体なんとかなると思います。
|日時形式|フォーマット|
:-:|:-:
|yyyy-mm-dd|2006-01-02|
|yyyy-m-d|2006-1-2|
|HH:MM:SS|03:04:05|
|H:M:S|3:4:5|
|yyyy-mm-dd HH:MM:SS|2006-01-02 03:04:05|# サンプルコード
“`go
package mainimport (
“time”
)func
Golangで「特定のpackage以外の全てのpackageに対してtest」を行う方法
TL;DR
—–“`bash
go test `go list ./… | grep -v 除外したいパッケージへのpath`
“`解説
—–`go test` の後ろにはテストしたいパッケージ名を書いていく。(全実行したい場合は `go test ./…`)
“`bash
go test internal/hoge internal/fuga
“`go list を実行すると次のようにパッケージのリストを出力してくれるので
“`
github.com/seya/test/server/internal/hoge
github.com/seya/test/server/internal/fuga
“`除外して欲しいものをgrepで除外して渡してあげればok
golangの数値型とmysqlの整数型
#TL;DR
unsignedだったらunsignedで合わせる。
not unsignedだったらnot unsignedで合わせる。
アンマッチの場合はきっちりオーバーフローするので回避したい。
intは甘え。#mysqlの整数型
リンク先参照
https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html#golangの整数型
リンク先参照#ざっくり対応
| mysql | golang|
|:—————–|:——————|
| tiny int | int8 |
| int | int32|
| big int | int64|
unsignedはunsigned同士で対応。
Golangのテンプレートエンジンを使い、日付・時刻のフォーマット指定
##はじめに
Golangのテンプレートにおいて、日付のフォーマットを指定する方法。
###方法
Golangのテンプレートでは、`{{ .変数名 }}`のような形で、テンプレートに渡されたデータにアクセスすることができる。
たとえば、`time型の変数名: now`が渡されたと仮定すると、以下のようにフォーマットを指定することができる。
(何も指定しないと、2009-11-10 23:00:00 +0000 UTCのような形式となる。)・YYYY/MM/DD形式で指定したい場合
>
>.now.Format “2006/01/02”
>・YYYY年MM月DD日 hh時mm分ss秒形式で指定したい場合
>
>.now.Format “2006年01月02日 15時04分05秒”
>のように記載すればよい。
##まとめ
つまり、.Format “~”を用いると日付・時刻を指定可能である。
Sliceの値を構造体に表す方法
初めまして、初投稿となります。
最近Goを初めて約2ヶ月なのですが、まだまだ慣れない
特に配列が苦手だった私にとっては「arrayとsliceってなんぞや?」で
3日間苦しむことも…(´・ω・`)マジツレェ
##なぜsliceと構造体を使おうとしたか?
開発している時に複数の値を入力して、
Googleのdatastoreに構造体の値を出力させるものを作ろうとしていました。いざsliceを使って何個も値を入力できるようにしたのです。
「よしできた!( ・∇・)」と思ってdatastore見たら
構造体の一箇所にsliceのデータがギッシリ詰まってましたΣ(・□・;)[{1 1}{2 4}{3 9}{4 16}{5 25}]みたいな感じで
もう摩訶不思議アドベンチャーです
こういうので引っかかったのは私だけじゃないはずと思いたい…##結果的にどうしたか
一度作ったsliceを別の構造体に挿入してみたって感じです
まずは簡単に構造体とsliceを作ってみます“`go
package mainimport (
“fmt”
)type Slice struct
protobufのenumをgolangの型(int32)に変換する
protobuf で定義した enum を golang handler 内で int32型 に変換したかった時
「protobuf enum int 変換」みたいなワードでササっとググって出てこなかったのでメモとして残しておきます。結論としては、単純に変換したい型で囲ってあげればよい。
`type(enum type)`“`protobuf
[protobuf]service User {
rpc PostUser(PostUserRequest) returns (User) {}
}enum SexType {
OTHER = 0;
MALE = 1;
FEMALE = 2;
}message User {
int64 id = 1;
string name = 2;
SexType sex = 3;
}message PostUserRequest{
string name = 1;
SexType sex = 2;
}
“`“`go
[golang handler]
func GetUser(ctx