- 1. Goでの構造体埋め込みと、埋め込んだ構造体に構造体を代入する
- 2. 【Go】依存性注入ライブラリwireの使い方【DI】
- 3. Go 1.15 の reflect パッケージの変更の影響詳細について
- 4. Goでドメインの名前解決を強制的に行う(curl –resolveに相当することを行う)方法
- 5. React Nativeで作ったアプリをリリースしてから1年経ったので振り返ってみる
- 6. Featherweight GoをScalaで実装した
- 7. HTTPでrobocopyやrsyncみたいなの!オレトラストネットワークでちゃっちゃとファイル共有Ⅱ
- 8. GCPを使って、できるだけ楽してGo言語のgoroutineのリークを監視する
- 9. Goのdepで既に指定済みのbranchと異なるbranchを参照させる方法
- 10. ゆっくりGo vol.1
- 11. Amazon Linux 2でGoをインストールする
- 12. fmf.Sprintfはどんな型でもString型に合体する
- 13. [Go]文字コードのUTF-8変換を行う – charset decode
- 14. Nuxt × Go × AWS で比較コミュニケーション的な掲示板サービス作ってみた
- 15. [Go言語] 初心者必見シリーズ: マップ(Map)
- 16. vscodeコンテナー環境でgo rename出来ない
- 17. Go Gin Docker AWSで完璧なTodoアプリを作る
- 18. 宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!
- 19. あなたの知らない拡張Consistent Hashの世界 ~Chord Protocol~
- 20. vim-lspでgoの補完が効かない場合のメモ
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[型]型, 容量)
“`* 例
“
vscodeコンテナー環境でgo rename出来ない
# 実行環境
VSCode 1.47.3
Go 1.14.4
Remote-Containers v0.128.0
# 問題
「シンボルの名前を変更 F2」を行ったら、“`
Rename failed: gorename: can’t find package containing /****/****/***.go
名前の変更を実行できませんでした。
“`
# 解決
1. “`ctrl + ,“`設定ページ開く
1. 「go server」で検索する
1. 一番下に“`Go:Use Language Serve“`をチェックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198260/f035a615-4f3a-3eda-a8d3-ac8aefc8be09.png)
Go Gin Docker AWSで完璧なTodoアプリを作る
こんにちは。
今回は最近流行りのGoの勉強ついでにQiitaを書いてみようと思います。普段はReactでのフロント開発やRailsでAPI開発などをしています。
社内でもRailsからGoへの書き換えが始まっている中で、Goってどうやって書くの?インフラわからないんだけどデプロイしてみたい!って軽い気持ちでサンプルアプリを作ってみたいと思います。
意外とローカルで動くものを作って終わりな記事が多いので今回はデプロイまで行うことをゴールとして開発していきます!!## 使用技術
– go
– gin
– go modules
– mysql
– docker
– gorm
– AWS## 参考文献
[Go / Gin で超簡単なWebアプリを作る](https://qiita.com/hyo_07/items/59c093dda143325b1859)
[DockerでGoの開発環境を構築する](https://qiita.com/uji_/items/8c9eda89526abe0ba900)## 早速やっていこーう(環境構築)
(ここではgoのインストールは省略しまー
宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!
#宇宙船のコンピュータの整数演算ユニット作成し、船員を助けよう!!
![illustrain09-utyuu5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248419/5d2515e9-292e-88d8-0887-80c3a930ce5a.png)
## 問題
以下の入力の場合、実装して、出力の配列[0]の値を示せ。#### 入力
“`
[1,1,28,3,1,1,2,3,1,3,4,3,1,5,0,3,2,9,1,19,1,9,19,23,1,23,5,27,2,27,10,31,1,6,31,35,1,6,35,39,2,9,39,43,1,6,43,47,1,47,5,51,1,51,13,55,1,55,13,59,1,59,5,63,2,63,6,67,1,5,67,71,1,71,13,75,1,10,75,79,2,79,6,83,2,9,83,87,1,5,87,91,1,91,5,95,2,9,95,99,1,6,99,103,1,9,103,107,2,9,107,1
あなたの知らない拡張Consistent Hashの世界 ~Chord Protocol~
この記事は[Enjoy Architecting](https://taisho6339.hatenablog.com/entry/2020/07/22/164340)からの転載です。
## 概要
分散システムを学術的に学びたくて、
Chord Protocolというアルゴリズムが面白かったので実際に論文を読んで実装してみました。
この記事では、分散システムにおける名前付けの概念と、Chord Protocolの紹介、簡単な検証について言及していこうと思います。| ![実装したシステム](https://github.com/taisho6339/gord/raw/master/docs/architecture-2.png) |
|:–:|
| *実際に作ったサーバ* |## 分散システムにおける名前付けとは?
分散システムの分野には「名前」、「名前付け」、「アドレス」と呼ばれる概念があります。
それぞれどのような意味を持っているのでしょうか?### 名前付けと名前
分散システムはネットワークを通じてそれぞれのサーバ、プロセスが協調して動作しています。
この中で、各
vim-lspでgoの補完が効かない場合のメモ
近頃、vscodeが楽で便利すぎてvimを触る頻度が減ってしまっていたのですが、vimによるgoの開発環境を設定しようと思い立って設定してみました。
基本的にはmattnさんの以下の記事に従いました。
(1) [Big Sky :: Vim で Go 言語を書くために行った引越し作業 2020年度版](https://mattn.kaoriya.net/software/vim/20200106103137.html)
(2) [Big Sky :: Vim をモダンな IDE に変える LSP の設定](https://mattn.kaoriya.net/software/vim/20191231213507.htm)(1)の内容だと、コード補完が効いたり効かなかったりしたので、(2)に記述のある以下の設定があると良いようです。vim-lspのdocumentにも[記述](https://github.com/prabirshrestha/vim-lsp/blob/b05c8da3ec7de542821e91f74c0a6a80449718ac/doc/vim-lsp.txt