- 1. [Golang][競プロ]子ども達に大福を分け与える問題について解説してみた
- 2. if文の書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby)
- 3. Goを学習するに当たって特徴をまとめてみた
- 4. Ginのミドルウェアを使ったエラーハンドリング
- 5. Dependency Injection入門
- 6. プライベートリポジトリをパスワードで限定公開するアプリを作った
- 7. golang functional option
- 8. 【Go】日時を文字列に変換する時によく使うフォーマット指定
- 9. Golangで「特定のpackage以外の全てのpackageに対してtest」を行う方法
- 10. golangの数値型とmysqlの整数型
- 11. Golangのテンプレートエンジンを使い、日付・時刻のフォーマット指定
- 12. Sliceの値を構造体に表す方法
- 13. protobufのenumをgolangの型(int32)に変換する
- 14. [Golang]構造体でフィールドの初期値をnilにするには、そのフィールドをポインタ型にすれば良い件
- 15. Go の標準パッケージにないシステムコールを使う
- 16. Go Modules で stringer なんかの開発用ツールを管理するには
- 17. Go使ってAWS Lambdaでラムダ計算した
- 18. [Go] 音声実況動画をMacで作りたくて(その一)
- 19. GoでUnion型/直和型をいい感じに表現する方法
- 20. gRPCの通信をgzip圧縮する(go言語)
[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
[Golang]構造体でフィールドの初期値をnilにするには、そのフィールドをポインタ型にすれば良い件
# はじめに
golangでよく使う構造体ですが、特定のフィールドの初期値を0やfalseではなく、nilにしたい場合ってありませんか?
ポインタ型で指定することで、簡単にできるので共有しておきます。# いきなり結論のコード
“`golang
package main
import “fmt”type a struct {
valueA int
}type b struct {
valueB *int
}func main(){
var sa a
var sb bfmt.Println(sa,sb) // => {0} {
}
}
“`# 解説
1つ目の構造体では普通に`int`型を指定、2つ目の構造体では`int`のポインタ型を指定しています。
“`golang:それぞれの構造体
type a struct {
valueA int
}type b struct {
valueB *int
}
“`下の通り、宣言だけしてそのまま実行すると、初期値が出力されます。
“
Go の標準パッケージにないシステムコールを使う
# はじめに
Qiita 初投稿です。
Go の [golang.org/x/sys](https://godoc.org/golang.org/x/sys) には、OS のシステムコールの Wrapper 関数が定義されていますが、全てが網羅されているわけではありません。
例えば、windows package を見てみると、WSARecv() などはありますが、WSASocket() がない。
https://godoc.org/golang.org/x/sys/windows#WSAEnumProtocols
本項では、これを自前で定義する方法について述べます。
# 検証環境
– Windows 10
– go version go1.13.3 windows/amd64# Syscall の構造
まず、`WSARecv()` がどのように定義されているか見ていきます。
WSARecv() の定義は `golang.org/x/sys/windows/zsyscall_windows.go` にあります。“`go
func WSARecv(s Handl
Go Modules で stringer なんかの開発用ツールを管理するには
# はじめに
* Go Modules で stringer や lint など開発用のツールを依存パッケージとして管理する方法についてまとめます。
# Go Modules で開発ツールを管理できない問題
* stringer などの開発ツールを go get すると一時的に go.mod に記載されますが、コードの中で import されていないため go mod tidy すると go.mod から外れてしまいます。
# 解決策
* コード中で import されてさえいれば Go Modules の管理対象にできるので、開発ツールを import するだけのファイルをおいておきます。
* ファイル名は何でも良いのですがとりあえず `tools.go` で統一しておくとわかりやすいかもしれません。“`go:tools.go
// +build toolspackage main
import _ “golang.org/x/tools/cmd/stringer”
“`# 解説
* 行頭の `// +build ` はビルドタグと呼ばれるもので、go
Go使ってAWS Lambdaでラムダ計算した
### tl; dr
[ソースコードはこちら](https://github.com/kirisaki/go-lambda)
エンドポイントは
https://nd88j25ztg.execute-api.ap-northeast-1.amazonaws.com/dev/lambda
でヘッダに`Content-type: application/json`と`X-API-KEY: uwuZMJIWbqpmTpfzdEci2YaMGWFSvWz9ZfWFIjVf`を仕込んで`{“step”:1,”src”:”(λx.x)a”}`みたいにPostしてください。curlでやると“`
$ curl -X POST -H “Content-type: application/json” -d ‘{“step”:1, “src”: “(λx.x)a”}’ -H ‘X-API-KEY: uwuZMJIWbqpmTpfzdEci2YaMGWFSvWz9ZfWFIjVf’ https://nd88j25ztg.execute-api.ap-northeast-1.amazonaws.com/d
[Go] 音声実況動画をMacで作りたくて(その一)
# はじめに
ゆっくり実況の使う音声はライセンス的に,いまいち自由に使いにくい。
https://manjubox.net/ymm4/
しかもwindows環境ならまだしも、Macでうまいことやろうとすると、virtual boxを入れたりとか
音声とは別に字幕作ったりとか正直~~めんどくさい~~手間がかかる。
ネットの海を探したら、あるのかもしれないが、そんなググる力はなかった。だったらGoで作った方が~~楽しそう~~融通がきいてカスタマイズが自由自在だから良いと思う(小並感)
# ツール探し
### 音声
ライセンス的に自由に使えそうなのを探した結果、以下のOpenJTalkを採用。
コマンドラインから使えるので、ラップして使うことに決定
参考
[OpenJTalk](http://open-jtalk.sourceforge.net/)
### 字幕画像作成
Go製のツールでやりたいことから以下ツールを選定“`
“github.com/disintegration/imaging”
GoでUnion型/直和型をいい感じに表現する方法
# TL;DR
直和型を実装するのではなく、(型の)パターンマッチの方を実装します。
型のパターンマッチはクロージャーを使って以下のように表現できます。“`Go
IntOrString.Match(Cases{ // 型のパターンマッチ
Int: func(i Int) { sum += int(i) }, // Int型だった場合の処理
String: func(s String) { sum += len(string(s)) }, // String型だった場合の処理
})
“`# そもそもUnion型/直和型とは
Union型/直和型とはどちらか片方の型の値を取るような型のことで典型的には以下のような構文で表現されます。
“`
type IntString = Int | String
“`この機能を持っている言語としては静的型付け関数型言語(Haskell/OCaml/F#)、強力な型機能のある言語(Rust/TypeScript)などがあります。
Goを使っていても、”複数の型を取りうる型”を考えたくなることがあ
gRPCの通信をgzip圧縮する(go言語)
サーバ・クライアント間でデータをやり取りするとき、ネットワーク帯域がボトルネックになるケースは多いです。
gRPCは[Protocol Buffers](https://developers.google.com/protocol-buffers/docs/overview)によってデータのシリアライズをしており変数名などはタグ化されるし、数値型はちゃんと数値データとして送信されるので、JSONに比べて通信量的に有利です。
しかし所詮はその程度なので、大量のデータをやり取りすることを考えるときちんとデータを圧縮するべきです。go言語のgRPCパッケージにはgzip圧縮用のライブラリが組み込まれており、少ないコードで通信をgzip圧縮できます。
# サーバ側
“`go:server.go
(省略)
import (
“google.golang.org/grpc”
_ “google.golang.org/grpc/encoding/gzip”
:
(省略)
“`***”google.golang.org/grpc/encoding/gzip”をアンダースコア付でイ