- 1. GoでMonth型をint型に変換
- 2. Golangを唐突に始めたい衝動に駆られた話
- 3. GoMockで、構造体オブジェクトのポインタを受け取る関数の引数をテストする
- 4. azbill: Azure 利用明細・課金情報出力 CLI の紹介
- 5. Golangで再帰関数を書く
- 6. Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
- 7. 【Go】依存性注入ライブラリwireの使い方【DI】
- 8. Go 1.15 の reflect パッケージの変更の影響詳細について
- 9. Goでドメインの名前解決を強制的に行う(curl –resolveに相当することを行う)方法
- 10. React Nativeで作ったアプリをリリースしてから1年経ったので振り返ってみる
- 11. Featherweight GoをScalaで実装した
- 12. HTTPでrobocopyやrsyncみたいなの!オレトラストネットワークでちゃっちゃとファイル共有Ⅱ
- 13. GCPを使って、できるだけ楽してGo言語のgoroutineのリークを監視する
- 14. Goのdepで既に指定済みのbranchと異なるbranchを参照させる方法
- 15. ゆっくりGo vol.1
- 16. Amazon Linux 2でGoをインストールする
- 17. fmf.Sprintfはどんな型でもString型に合体する
- 18. [Go]文字コードのUTF-8変換を行う – charset decode
- 19. Nuxt × Go × AWS で比較コミュニケーション的な掲示板サービス作ってみた
- 20. [Go言語] 初心者必見シリーズ: マップ(Map)
GoでMonth型をint型に変換
英語で表されるtime.Month型をintで型キャストしたら普通に変換できたのでメモ。
“`go:main.go
package mainimport (
“fmt”
“time”
)func main() {
now := time.Now()
year := now.Year()
month := now.Month()
monthToInt := int(month)
date := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()fmt.Printf(“年を表示:%v\n”, year)
fmt.Printf(“月をtime.Month型で表示:%v\n”, month)
fmt.Printf(“月をint型に変換して表示:%v\n”, monthToInt)
fmt.
Golangを唐突に始めたい衝動に駆られた話
# 金曜日の深夜に急にGoを始めたい衝動に駆られた
## 思い立った経緯
金曜日の夜にふと人気プログラミング言語について閲覧していた。そこでPythonやJavascript不動の人気に、「はい、そうですか。」気分でみていた。そこでみたGoLangをみて、「あ、せっかくだし触りだけでも今日やろうかな」と思ったので、自分への議事録のため記事を投稿。# やったこと
自分のPCでの動作環境構築と公式ドキュメントの「Packages, variables, and functions.
Learn the basic components of any Go progr」をやってみた## 動作環境
OS:macOS Catalina 10.15.6
Editor:Visual Studio Code 1.47.3
pkg管理:Homebrew 2.4.9## 環境構築
まずはGoLangのインストールから“`terminal
hoge@hoge-MacBook-Air ~ % brew install go
…省略…
hoge@hoge-MacBook-Air ~
GoMockで、構造体オブジェクトのポインタを受け取る関数の引数をテストする
# 概要
モック化させたインターフェースの関数に、期待した値が入って呼ばれるかどうかをテストしたいシーンのお話です。引数に構造体のポインタを受け取る関数をテストする時、
* テストスイート内でアサーションのために宣言したオブジェクト
* 実際のビジネスロジックの中で生成されたオブジェクトはポインタが異なるため、オブジェクトのチェックが難しくなります。
gomockを使っている際に、この問題を解決する方法をまとめます。
# GoMock
GitHub: https://github.com/golang/mock今回使用したバージョンはv1.4.3です。
# ユースケース
概要だけだとイメージが湧きにくいかと思いますので、ここからは例を交えて説明します。
ユースケースは下記のようにシンプルなものを用意します。* タイトルと著者名を入力して、Bookオブジェクトを作成する
* タイトルに空文字を入れた時には、Bookオブジェクトのタイトルが「no title」になる## テストケース
テストでは、* **When**: ユースケースの関数に空文字のタイトルを
azbill: Azure 利用明細・課金情報出力 CLI の紹介
## はじめに
[azbill](https://github.com/yaegashi/azbill) という Azure クラウドサービスの利用明細・課金情報を出力してくれる CLI ツールを Go 言語で作ったので紹介します。主に Enterprise Agreement (EA) で Azure を導入している組織向けで、例えば部署ごと・リソースの種類ごと・タグごとの使用量を算出するといったようなコスト分析のためのデータを出力するツールです。
azbill を使うと EA の課金アカウントや Azure サブスクリプションに含まれるすべてのリソースの使用量・課金額を日次で取得し、CSV や JSONL の形式でファイルに保存できます。
このような利用明細の取得は Azure CLI でもできると思われるかもしれませんが、現行の Azure CLI は[新しいバージョンの Consumption API](https://docs.microsoft.com/en-us/rest/api/consumption/) に対応しておらず、予約 VM の利用状況といったような情報
Golangで再帰関数を書く
仕事でGoで再帰関数を書いた時に苦戦したので備忘録として残しておきます。
## サンプルコード
“`
func unpackStruct(data interface{}) interface{} {
switch d := data.(type) {
case *structpb.Struct:
_metadata := make(map[string]interface{})
for k, x := range d.Fields {
_metadata[k] = unpackStruct(x.GetKind())
}
return _metadata
case *structpb.Value_StructValue:
_metadata := make(map[string]interface{})
for k, x := range d.StructValue.Fields {
_metadata[k] = unpackStruct(x.GetKind())
}
return _metadata
case *structp
Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
構造体の埋め込みについてはよく書いてあるのだけど
埋め込んだ構造体に、埋め込んだ元の構造体を代入する方法があまりなかったのでメモ### 埋め込み
“`
type A struct {
A string
}
type B struct {
B string
}type C struct {
*A
*B
}
“`### 代入
“`
a := new(A)
b := new(B)
c := new(C)a.A = “hoge”
b.B = “hage”c = &C{B: b} // CにBを代入
“`### 代入済みのCにAを追加
“`
c = &C{
A: a,
B: c.B,
}
“`
【Go】依存性注入ライブラリwireの使い方【DI】
# Hello, World
## DI とは
[Weblio辞書から引用](https://www.weblio.jp/content/Di?edc=BINIT#:~:text=DI%E3%81%A8%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B,%E6%A6%82%E5%BF%B5%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82&text=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%88%90%E7%AB%8B%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE,%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A8%E3%81%95%E3%82%8C%E3%82%8B)
*DIとは、プログ
Go 1.15 の reflect パッケージの変更の影響詳細について
# Go 1.15 の reflect パッケージの変更の影響詳細について
[Go 1.15 リリースノート 日本語訳](https://qiita.com/c-yan/items/dad49c9dce27e77a94e7#reflect) として、reflect パッケージの変更内容を日本語訳したものの、いまいち何を言っているのか分からなかったので確認してみた.
“`go
package mainimport “reflect”
type u struct{}
func (u) M() {}
type t struct {
u
u2 u
}func main() {
reflect.ValueOf(t{}).Method(0).Call(nil) // no problem
reflect.ValueOf(t{}).Field(0).Method(0).Call(nil) // panic on go1.15
reflect.ValueOf(t{}).Field(1).Method(0).Call(nil) // panic on go
Goでドメインの名前解決を強制的に行う(curl –resolveに相当することを行う)方法
## やりたいこと
Goでドメインの名前解決を強制的に行う。ドメインの名前解決を外部DNSを通して行うのではなくて自分でIPアドレスを指定して解決したい場合は、通常はローカルマシンのhostsファイルに以下のように記述すればよい。
“`
203.0.113.0 google.com # google.comを 203.0.113.0 に解決させる例
“`hostsファイルを使用する以外だと、`curl`コマンドに`–resolve`オプションというのがあり、以下のように指定することでコマンド実行時に直接名前解決を行わせることが可能だ。
“`
curl https://google.com –resolve “google.com:443:203.0.113.0”
“`今回はこのcurlの場合と同様に、hostsファイルを使わずにリクエスト実行時に強制的にドメインにIPアドレスを与えるということをGoでやりたかった。
そもそも可能なのか、可能だとしたらどういう方法でできるのか分からず色々と検索していたら、まさに同じことをやろうとしてた人の[stack
React Nativeで作ったアプリをリリースしてから1年経ったので振り返ってみる
![Frame 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170824/fcdbe13f-04d9-e44c-a53a-a7a7d2753a77.png)
[React Native製、予定作成アプリ「ペペロミア」を公開しました](https://qiita.com/wheatandcat/items/3324dfd141729e46009f)
以前記事にしたペペロミアが公開してから1年経ったので振り返りも兼ねて記事にまとめてみました。
個人プロダクトのアーキテクトとかの参考になれば良いかなと思います。# 主に使用している技術
* アプリ
* [Expo(React Native)](https://expo.io/)
* Backend
* [Golang](https://golang.org/)
* Web版
* [Nuxt.js](https://ja.nuxtjs.org/)
* ヘルプサイト
* [Gatsby.js](http
Featherweight GoをScalaで実装した
# はじめに
arXivに[Featherweight Go](https://arxiv.org/abs/2005.11710)の論文が投稿されていた。この論文ではGo言語から機能を大きく取り去ったモデル言語を作り、それ振る舞いを定義したり型システムを与えている。さらにはFeatherweight Go(FG)にジェネリクスを搭載した_Featherweight Go with Generics (FGG)_というものを定義し、FGGからFGへの変換を与えることでGo言語へのジェネリクス追加が安全であろうことを述べていると思われる。このように、FGは実際のところは型システムなどの議論のために生まれたものであり、処理系などを実装することは恐らく意図されてはいないが、小さくて実装が容易だったのでScalaで実装した。この記事ではまずFeatherweight Goでできることやプログラム例を示し、その後にScala実装について軽く解説する。
また今回の実装は下記のGitHubリポジトリにある。– https://github.com/y-yu/featherweight_go
こ
HTTPでrobocopyやrsyncみたいなの!オレトラストネットワークでちゃっちゃとファイル共有Ⅱ
# 前回
[オレトラストネットワークでちゃっちゃとファイル共有](https://qiita.com/ykato/items/0939cbae9ce338a26914)
の続きです。前回の載せたら、
*「Syncthingに似てる気がするけど知ってる?参考になるかもよー見てみたら??」*
というありがたいレスが。~~知らないので調べてみますわーってレス書いた後で過去にQiitaのSyncthin記事にがっつりLGTM入れてた!~~
# Syncthingつよい
僕のツールのがニッチで良い部分もありつつ見習いたい点が多々出てくる出てくる
– 同期状況とか完了したかどうかサーバー、クライアント両方で見れる
– 接続中のサーバーを見れる
– 全通信をプロトコルで暗号化したり効率化してる
– 同期対象のディレクトリ対応
– 中継SaaS持ってるのでinbound通信を開放しなくていい
– GUI持ってるので操作が分かりやすい
– バックグラウンドで同期してくれる
– 設定が保存できるので前回と同じ同期がやりやすい洗い出しできたところで、ワイツールも既存のHTTP Proxy挟
GCPを使って、できるだけ楽してGo言語のgoroutineのリークを監視する
## ゴルーチン リーク
Go言語はめちゃめちゃ簡単にゴルーチン(スレッドのようなもの)を作れるのが魅力です。ゴルーチンはメインフローとは別に切り離されて実行されるので、デッドロックなどでゴルーチンの処理が途中で止まっていても気づかず、「終了したと思っていたが、実は実行中で残っていました」ということがありました。
それ以来、ゴルーチンの起動数を定期的にログに出力して、ゴルーチンのリークが起こっていないかチェックしているのですが、その作業が面倒くさくなってきました。
## もっと楽したい
GCPのCloud Monitoringは主に、GCPの各種サービスの状態モニタリングを行う機能なのですが、アプリの状態モニタリングも行えるので、それを使ってゴルーチンの起動数を監視することにしました。## 方針
Cloud Monitoringに、Go言語のpprofの値を送るようにして、Cloud Monitoring上でゴルーチンの起動数をグラフ表示します。プログラムからCloud Monitoringに値を送るには、OpenCensusというオープンソースのライブラリを使うのです
Goのdepで既に指定済みのbranchと異なるbranchを参照させる方法
### 概要
Goのdepで既にインストール済の依存パッケージに関して、既に指定されているブランチとは別のブランチを参照させるようにする方法についてです。
例えば、既に`master`ブランチを参照する設定になっていたとして、一時的に開発中の`feature/sugoi`ブランチを参照させたい場合には以下のような手順で参照先のブランチを変えることができます。### Gopkg.tomlで指定済のbranch名を変更する
Gopkg.tomlの該当パッケージのbranch名指定(`branch=xxxxx`)を変更する。#### 変更前
仮にmasterブランチを参照している状態だとする。“`
[[constraint]]
name = “github.com/hogehoge/fuga”
branch = “master”
“`#### 変更前
`branch`の指定を、参照させたいブランチ(ここでは`feature/sugoi`)に変更する。
なお参照させたいブランチは、githubからダウンロード可能な状態(githubにpush済)である必要がある。
ゆっくりGo vol.1
#前書き
Python、R、Fortran90、C#、Processing、等々さわってきた結論として、CとFortranからは逃れられない定めにあると悟りました
Goで土台を築くことに……
そして、後輩たちに布教するんだ……ふへっ
#学ぶ上で用意した物
Go Tour
https://go-tour-jp.appspot.com/スターティングGo言語
#本題
Go Tourのforまで学んで思ったことについて##導入
@yoskeoka 氏が [WindowsにGo言語をインストールする方法まとめ]
[WindowsにGo言語をインストールする方法まとめ]:http://qiita.com/drafts/c686397e4a0f4f11683dとまとめてくださっているので、導入**には**苦労しませんでした
と言うのも、入れろ入れろと煩く言われたウイルス対策ソフトの影響で、
挙動が不安定になり、
“`hello.go
package mainimport “fmt”
Amazon Linux 2でGoをインストールする
## EC2にインストール
### 利用できるバージョンの確認
“`
# amazon-linux-extras list | grep golang
29 golang1.11=latest enabled \
“`### インストール
“`bash
amazon-linux-extras install golang1.11
“`### GOPATHの追記
“`bash
export GOPATH=”$HOME/go”
export PATH=$PATH:$GOPATH/bin
“`### インストール確認
“`
# go version
go version go1.13.4 linux/amd64
“`
fmf.Sprintfはどんな型でもString型に合体する
### サンプル
– lengthなどはint
– spirintfでまとめつつStringにしている“`golang
package mainimport “fmt”
func main() {
type sample struct {
length int
Height int
}p := new(sample)
p.length = 13
p.Height = 666str := fmt.Sprintf(“長さ:%d 高さ:%d”, p.length, p.Height)
fmt.Println(str)
}“`
結果
“`
長さ:13 高さ:666
“`
[Go]文字コードのUTF-8変換を行う – charset decode
# 実現したい機能
`Shift-JIS` `EUC-JP` `ISO-2022-JP`等の文字コードであるstringをGo内部で扱えるよう `UTF-8` にデコードする。
# 実装
文字コードが既に分かっている場合の変換は以下の手順で実現できる。
* 入力stringのcharsetに応じたdecoderを取得
* decoderを用いてstringをUTF-8にdecode“`Go
package mainimport (
“errors”
“fmt”
“golang.org/x/net/html/charset”
“golang.org/x/text/transform”
)// Converts the specified charset to UTF-8.
func Decode(src []byte, charSet string) (string, error) {
e, _ := charset.Lookup(charSet)
if e == nil {
return string(src), errors.New(fmt.Sp
Nuxt × Go × AWS で比較コミュニケーション的な掲示板サービス作ってみた
比較コミュニケーションサイト Versus
https://versus-web.net![FireShot Capture 075 – 比較コミュニケーションサイト『Versus(バーサス)』 – versus-web.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379449/1ee33604-7c8c-fd80-e979-1ab4b7a8c396.png)
![FireShot Capture 076 – 比較コミュニケーションサイト『Versus(バーサス)』 – versus-web.net.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379449/b9035a66-65f6-46c0-4c70-b6b9bfce023b.png)
~~Twitter で技術マウント合戦している人たちが面白かったので~~
AWS と Go の勉強がてら、テーマを持ち寄ってコミュニケーションできる簡単な掲示板
[Go言語] 初心者必見シリーズ: マップ(Map)
# マップ(Map)
Golangではハッシュテーブル(hash table)のことを `map` と呼びます。
**キーと値の組**を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造です。
![golang-map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170309/c68cc7cb-b8ad-c6b3-f416-000550a99277.png)
## 定義方法
### 方法1
* 構文
“`go
変数名 := map[型]型{初期値1, …, 初期値n}
“`* 例
“`go
languages := map[string]string{
“go”:”golang”,
“rb”:”ruby”,
“js”:”javascript”,
}
“`### 方法2
* 構文
“`go
変数名 := make(map[型]型, 容量)
“`* 例
“