- 1. Web系企業でプログラマを目指す皆様へ
- 2. GoにてRedirectの注意点(初心者向け)(Echo)
- 3. 【Golang】 mysql データベース処理
- 4. Go言語の似た概念を触る
- 5. golangにusingステートメントのようなものを作ってみた
- 6. 【Go】int64型・uint64型からstring型へ変換する方法
- 7. goss を使ったサーバ構築のテスト
- 8. フォルダごとに分かれている画像を一箇所に集める
- 9. 今更ながらGo言語を触ってみた(GO 1.13.6)
- 10. Go makeとnewの違い
- 11. golangの名前付き戻り値に関して
- 12. 速習 Go + Clean Architecture
- 13. Go言語でレトロな感じの2Dゲームを作る
- 14. Go log
- 15. go ファイルの読み取り
- 16. 【Golang – goroutine(ゴルーチン) 】for – select パターン 例
- 17. Go for文の”_”の使い方
- 18. AtCoder Beginner Contest 151 参戦記
- 19. golangで標準入力
- 20. k8sとAPI Gateway(Ambassador)を用いたコンテナ管理
Web系企業でプログラマを目指す皆様へ
##少数受託開発ベンチャーでアルバイトをして感じたこと
初めに結論から述べます###結論
メリットもあればデメリットもあり
万人にオススメは出来ないということです###会社の特徴
・社員数20名以下
・受託開発
・ベンチャー企業未経験からWeb系企業へ転職を考えている人ならば
魅力的な企業のように見えるはずです但し、いいことばかりではありません
###メリット
・モダンな技術に触れることができる
・服装自由、音楽も聴ける
・人が少ないので挑戦しやすい
・未経験でも潜り込める###デメリット
・社長と距離が近い故に、地雷を踏む可能性がある
・実力主義
・研修が充実していない###オススメできる人
・自走力がある人
・短期間で成長したい人
・ステップアップを考えている人###オススメできない人
・ゆっくり成長したい人
・研修が必要な人
・会社でコミュニティを築きたい人
・安定志向の人全ての少数受託開発の企業がこうだとは思いません。
一概に上記の条件が全て正しい訳ではないが、
Web系企業を目指す人に知っておいて欲しいですSESやSIerなどでエンジニア
GoにてRedirectの注意点(初心者向け)(Echo)
#リダイレクトで困った事が起きました
特定のページにリダイレクトする時に、1度目のリダイレクトは成功するが、2回目以降実行しても正しく実行してくれない。
“`go
func hoge(c echo.Context)error{
//省略
return c.Redirect(http.StatusMovedPermanently, “/”)
}
“`
これはルートパスにリダイレクトしてくれというコードですね
この**StatusMovedPermanetly**というやつにやられましたどうやら**Chormeブラウザ**にて **GET**アクションで**StatusMovedPermanetly**を実行するとブラウザにキャッシュが溜まるらしいです。(要するに2回目以降動かない)
これを解決するには
“`go
func hoge(c echo.Context)error{
//省略
return c.Redirect(http.StatusFound, “/”)
}
“`
**StatusMovedPermanetly**を**StatusFound**に変
【Golang】 mysql データベース処理
# 概要
本記事では、Golangにおけるdatabase/sqlライブラリを用いたMySQLデータベースに対する処理例を示す。
処理例では、ユーザーデータを仮定し、エラー処理についても例を示す。以下のようになテーブルを想定する。
“`sql
CREATE TABLE user_db.users (
id INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(45) NULL,
last_name VARCHAR(45) NULL,
email VARCHAR(45) NOT NULL,
data_created DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
status TINYINT(1) NOT NULL,
PRIMARY KEY (id),
UNIQUE INDEX email_UNIQUE (email ASC));
“`
# pkgのインストールmysqlのドライバーpkgをインストールする。
“`bash
go get github.com/go-
Go言語の似た概念を触る
# はじめに
本題に入る前に、前提となることを記述しておきます。
## 目的
目的は以下です。– Go言語を読んでいて、似た概念を読み間違えないようにするため
それだけです。
## 読者の対象
読者の対象は以下です。– プログラミング初心者
– Go初心者
– 軽くGo言語を使っている人裏を返せば、例えば以下のような方は対象ではありません。
– Go言語を体系的に理解したい方
– 似た表現の実体を比較したい方、メモリの使い方を理解したい方## 参考
– [A Tour of Go](https://go-tour-jp.appspot.com/list)
## おことわり
– 少しずつ文を追加しています。
– 初心者目線で「これとこれも紛らわしいから説明してくれ!」というものがあれば、連絡ください。# 本題
## ArraysとSlices
A Tour of Goを読んでいて、ArraysとSlicesは似ているなーと思ったのでまとめました。
– [Arrays](https://go-tour-jp.appspot.com/moretypes
golangにusingステートメントのようなものを作ってみた
この記事の内容は以下のバージョンで作りました。
“`cmd
> go version
go version go1.13 windows/amd6
“`## きっかけ
* ちょっとしたgoのコードを書いているときに、「リソースの開放が面倒だなぁ」とおもった。
* .NETだと、usingステートメントですごくすっきりかけるから、似たようなものを作りたい。## 通常のgoの場合
“`go
// 何らかのリソースを取得する
resource, err := hogehoge.GetResource()
// エラーがあるかどうか調べてちょめちょめする
if err != nil {
// ちょめちょめ
}
// 解放忘れがないように、deferを定義
defer resource.Close()// ようやく本来やりたい処理
“`みたいな感じになる。本来やりたい処理を書き始めるまでいつまでかかるんだ・・・
という感じ## 今回作ったもの
“`go
type IDispose interface {
open() error
dispose()
【Go】int64型・uint64型からstring型へ変換する方法
# int64型からstring型へ変換する方法
“`go
// int64
var Int64 int64 = 9223372036854775807// strconv.FormatInt(int64, 基数(10進数))
convertedInt64 := strconv.FormatInt(Int64, 10)
“``9223372036854775807`は`int64`の最大数です
https://golang.org/pkg/builtin/#int64
> int64 is the set of all signed 64-bit integers. Range: -9223372036854775808 through 9223372036854775807.
# uint64型からstring型へ変換する方法
“`go
// uint64
var Uint64 uint64 = 18446744073709551615// strconv.FormatUint(uint64, 基数(10進数))
convertedUint64 := s
goss を使ったサーバ構築のテスト
# はじめに
以前 [InSpec でデプロイを自動テスト化する] という記事で InSpec というテストフレームワークの紹介をしましたが、最近 goss という Go 言語製のテストフレームワークを使い始めたのでそのご紹介です。
# goss とは
[goss] は YAML でテストケースを記述し、その内容に従ってテストを実行できるフレームワークです。
## 特徴
– シングルバイナリなのでライブラリのインストールなどが不要
– 記述が YAML なので覚えることが少ない
– 速い## goss でできるテストの例
goss を使えば下記のようなことがテストできるようになります。
– ファイルが存在するか
– ファイル属性は正しいか
– プロセスやサービスは起動しているか
– パッケージはインストールされているか
– HTTP レスポンスのヘッダやボディは正しいか# インストール
開発用途の環境に入れるのであれば下記でインストールできます。
“`shell
$ curl -fsSL https:
フォルダごとに分かれている画像を一箇所に集める
最近業務で画像のデータを使って〜する場面があったのですが、サーバー上にある画像がフォルダごとに分かれてしまっていたり、階層もばらばらだったりと不便だったので、ちょっとした効率化ツールを作ってみました。
使っているのはGo言語です。
# ソースコード
“`Go
package mainimport (
“image”
“image/jpeg”
“image/png”
“log”
“os”
“path/filepath”
)const imgQt int = 60
func main() {
// 実行ファイル直下のパスを取得
path, _ := os.Getwd()
dataPath := filepath.Join(path, “data”)
dataAllPath := filepath.Join(dataPath, “*”)list, _ := filepath.Glob(dataAllPath)
var textList []string// 画像を1枚づつ読み込む
for _, item := range list {
今更ながらGo言語を触ってみた(GO 1.13.6)
# Go言語を触りたかったきっかけ
kubernetesを構築・活用しているうちにカスタマイズしてみたい衝動があり、
Go言語でのみカスタマイズが出来ることと
軽量のWebApiを構築することが多々あり普段はPythonで実装していたが、
この際なのでGo言語を触ってみることにしました。
と言っても実務があるので、学習期間は3日しかありませんでしたが・・・。## で、作ってみたもの
簡単にwebサーバーを立ち上げれるフレームワークを実装してみました。
内容的には下記のリンク先のREADMEにも記載していますが、
yamlファイルに諸々設定することでwebサーバーが起動します。
ビジネスロジックに集中出来るようにこのフレームワークを実装しています。[httprouter_wrapper](https://github.com/ncs-nozomi-nishinohara/httprouter_wrapper)
## 躓いた点
`map[string]interface{}`の仕組みがいまいちわかりづらかったです。
`map[string]interface{}`からval
Go makeとnewの違い
###makeとnewの違い
違いはポインタを返すかどうか
make → ポインタを返さない
new → ポインタを返す
“`main.go
package mainimport(
“fmt”
)func main(){
var p *int = new(int)
fmt.Printf(“%T\n”, p) => *ints := make([]int, 0)
fmt.Printf(“%T\n”, s) => []int}
“`
golangの名前付き戻り値に関して
名前付き変数は[tour of go](https://tour.golang.org/basics/7)で紹介されているように、関数の最初で変数宣言したのと同様になる。
この時、nameの変数のスコープは`fugafuga()`に対して関数渡しで渡した関数から参照できるため、下記コードは問題なく動く。
“`go
package mainimport “fmt”
func fugafuga(f func() error, logger func(err error)) error {
f()
return nil
}func hogehoge() (name string, err error) {
fugafuga(func() error {
name = “test”
return nil
},
func(err error) {
})
return
}func main() {
n, _ := hogehoge()
fmt.Println(n)
}
“`出力結果
“`console
$ go run main.go
速習 Go + Clean Architecture
## 概要
Go 言語 + Clean Architecture を必要に迫られ勉強した。緊急だったので、Clean Architecture の概念をなめて、ネット上に散らばるソースコードを読んだ。が、ぶっちゃけよく分からなかったので、自分で書いてみた。3週くらいして、なんとなく分かった。気がする。今回の学習のゴールは、チームのメンバー(同じく未経験)が理解できて、実装時に設計思想からはみ出ないようにすること。細かいことは抜きにして、読んでコピペすれば、何とかなる程度まで行ければ、細かい話はレビューで潰せば良い。という感じ。
Go も Clean Architecture も初めてな上、設計・実装からも遠ざかっていたので、理解に時間がかかった。完全に理解しているとは言い難いが、いちおうメモとして残しておく。実装は割と楽しかった。
## 作るもの
– go, clean architecture, net/http, gorm な REST API群
– 2 系統の CRUD API(User, Property)
– 2 系統の DB(MySQL, PostgreSQL)
Go言語でレトロな感じの2Dゲームを作る
# はじめに
昔Qiitaに、[Go言語で作るマリオ風2Dゲーム](https://qiita.com/KMim/items/aebb9d7a9116bf6294b3)という記事を書きました。これを発展させる形で、昨年の中頃から会社の友人何人かと一緒に、Golangを使ってゲームを作り始めました。私が昔、[洞窟物語](https://forest.watch.impress.co.jp/library/software/doukutsu/)などのシンプルな2DのRPGゲームが好きだったこともあり、レトロさや手作り感を感じられるようなゲームの開発を目指してきました。最近になってこのゲーム開発の活動が停留してきたので、この記事でとりあえず現在までで出来たものをまとめてみます。
[Githubのリポジトリはここ](https://github.com/KMimura/RPGGame)です。
# 今のところ出来たもの
出来たもののgifをいくつか貼ります。背景画像およびプレーヤー画像などは仮にフリーの素材を用いたものであり、いずれはかっこいいものを自作したいと思ってます。![fir
Go log
logを学んだのでまとめておきます。
logのパッケージを使って出力すると
生年月日や時間が出力されます。
“`main.go
package mainimport “log”
func main(){
//logを出力
log.Println(“hello”)//型や値を出力
log.Printf(“%T %v”, “hello”, “hello”)//コードが終了する
log.Fatalln(“hello”)
}
“`現時点で学んだ内容をまとめました。
随時更新していきます。
go ファイルの読み取り
Goでファイルの読み取り方法を学んだのでまとめておきます。
“`main.go
package mainimport(
“fmt”
“os”
)func main() {
//file変数にファイルのデータを代入
//ここではエラーは空白に
file, _:= os.Open(“ファイル名”)//ファイルのクローズを最後に行うためのdefer
defer file.Close()//バイト配列を作成
data := make([]byte, 100)//バイト配列にファイルのデータを読み込む
file.Read(data)//バイト配列に格納されたデータを出力
//バイト型になっているので、string()で文字列に型変換を行う
fmt.Println(string(data))
}
“`
【Golang – goroutine(ゴルーチン) 】for – select パターン 例
# 概要
Golangにおけるゴルーチンのfor-selectパターンを実装してみました。
基本的には、チャネルを介してゴルーチン内外でデータのやり取り、エラーハンドリング、終了処理についての例を実装しています。処理の流れは、
1. ゴルーチン外部から、チャネルを介して文字を挿入(“1”, “bad0”)
2. ゴルーチン内部で、チャンネルから得た文字を数字に変換(エラーかどうか場合分けして、結果をresultに挿入)
3. ゴルーチン外部から、doneをcloseすることで、ゴルーチンが終了し、それに伴いresultチャネルもcloseされる。
4. ゴルーチン外部で、resultを取得していたforが終了する。# 実装
以下にプログラムと結果を示します。
“`go
package mainimport (
“fmt”
“strconv”
“time”
)type Result struct {
Error error
Response int
}func doSomething(done <-chan interface{}, print
Go for文の”_”の使い方
golangのfor文を勉強していて
“_”の意味を理解したのでまとめておきます。
結論から言いますと
**インデックス番号を表示する必要がない場合に**
**”_”を使います。**“`main.go
package mainimport “fmt”
func main(){
//スライス作成
l := []string{“jave”, “python”, “go”}//インデックス番号とスライスの要素を表示
for i:=0; i < len(l); i++{ fmt.Println(i, l[i]) } //スライスの要素だけを表示 for _, v := range l{ fmt.Println(v) } //"_"を使わずに要素を表示させようとすると for v := range l{ fmt.Println(v) } //インデックス番号が表示される //"_"でインデックス番号を埋める必要がある //map作成 m := map[string]int
AtCoder Beginner Contest 151 参戦記
# AtCoder Beginner Contest 151 参戦記
## ABC151A – Next Alphabet
1分半で突破. 書くだけ.
“`python
C = input()print(chr(ord(C[0]) + 1))
“`## ABC151B – Achieve the Goal
4分で突破. 書くだけ.
“`python
N, K, M = map(int, input().split())
A = list(map(int, input().split()))t = sum(A)
if N * M > t + K:
print(-1)
else:
print(max(N * M – t, 0))
“`## ABC151C – Count Order
7分半で突破. AC 後の WA は無視しないといけないところだけを気にすればよい.
“`python
N, M = map(int, input().split())ac = [False] * N
wa = [0] * N
for _ in ran
golangで標準入力
###基本的な標準入力の方法
Go言語で標準入力を行う方法をまとめておきます。
paizaのスキルチェックに標準入力は必須です。
“`
package mainimport (
“bufio”
“fmt”
“os”
)func main(){
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
ucl := scanner.Text()
fmt.Println(ucl)
}
}
“`
k8sとAPI Gateway(Ambassador)を用いたコンテナ管理
こんにちは。kwashiです。SPAによるフロントエンドと、APIサーバの組み合わせで構築したシステムを実装したので紹介します。前職で、モノリシックなシステムに、大規模な機能を追加して苦労したため機能や構成の分離を意識して実装しました。もし、Ambassadorやk8sのマニフェストを参考にしたい場合は、記事の後半に書いています。
※ 実装したシステムは、何らかのサービスを提供する仕様ではなく、技術的な検証・ポートフォリオを目的として作成しました。
SPAは、サーバーサイド側でのHTMLレンダリングを行わず、サーバーサイド側の役割をAPIサーバーに徹底させるために用いています。各APIはサービスごとにコンテナ化することで分離し、コンテナ管理ツールで各サービスを管理することで、スケーリングやデプロイが容易にできるようにしています。また、各APIへのトラフィックをルーティングするためAPI Gatewayを使用しています。
上記のような構成にした場合、認証機能をAPIサーバーとフロントエンド両方でセキュアに実装する必要があり面倒なので、Firebase Authenticatio