20200113のGoに関する記事は5件です。

【docker-compose】Nuxt.jsとGOでREST APIを構築した手順

現在のプロジェクトでは、Nuxt.jsとGOをGKEを使ってREST APIを構築しています。

Kubernetesを利用する場合、Dockerを必然的に利用することになる上に、ローカルの環境構築も色々面倒だったため、docker-composeを利用することにしました。

今回は、Nuxt.jsGOdocker-composeを利用して、REST APIを構築したため、その手順をまとめています。

docker-composeで構築したNuxt.jsとGOのREST APIの雑な全体像

表題の通り、めっちゃ雑なポンチ絵を作りました。

docker-composeのポンチ絵.001.jpeg

以上のようなデータの流れを再現するための手順をまとめます。

docker-composeでNuxt.jsとGOでREST APIを構築した手順の目次

ざっくりとした手順は以下です。

  • ディレクトリ構成※
  • Dockerfileを作成
  • my.cnfを作成
  • docker-compose.ymlを作成
  • docker-compose upを実行
  • アプリ側やコンテナ等の細かい設定変更

これから手順を詳細にまとめていきます。

※ディレクトリ構成は手順ではないですが目次には入れておきます。

ディレクトリ構成

Nuxt.jsGOでリポジトリが分かれている前提で手順を進めます。

Nuxt.js側のディレクトリ構成

ディレクトリ構成も雑に最低限共有します。

project_name
├──app/
├──nuxt.config.js
├──package.json
├──Dockerfile #本番用
├──Dockerfile.dev
└──docker-compose.yml

※app/は作業しているファイルが格納されているディレクトリ(ディレクトリ構成については以下にまとめました。)

参考:https://qiita.com/arthur_foreign/items/637f2976e9f5e7a89727

GO側のディレクトリ構成

project_name
├──app/
│  ├──main.go
│  └──database.go
├──config/ #tomlで見にいくDBを出し分け(現プロジェクトでは廃止予定ですが備忘録のため記載)
│  ├──config_dev.toml
│  ├──config_stg.toml
│  ├──config_prd.toml
│  └──config_docker.toml
├──db/
│  ├──migrations/ #マイグレーションファイル
│  ├──mysql/
│  │  └──my.cnf # MySQLの設定ファイル
│  └──seed/ #シードデータ
├──Dockerfile #本番用
├──Dockerfile.dev
└──docker-compose.yml

※appは作業ディレクトリ

Dockerfileを作成

まずは、Nuxt.jsGODockerfileを作成しました。

※本番環境とローカル環境で利用するDockerfileを分けるため、別名のDockerfileを用意しています。

※現プロジェクトのソースコードほぼコピペです。

Nuxt.js

Dockerfile.dev
FROM node:10.15.1-alpine as dev
WORKDIR /app
COPY . /app
RUN apk update && \
    apk add git
RUN yarn

CMD ["yarn", "dev"]

GO

Dockerfile.dev
FROM golang:1.12-alpine as builder
ADD . /go/src/github.com/project_name
WORKDIR /go/src/github.com/project_name

ENV GO111MODULE=on

RUN apk update && \
    apk add git && \
    go get github.com/jmoiron/sqlx && \
    GOOS=linux GOARCH=amd64 go build main.go

FROM alpine:3.9
WORKDIR /app
COPY --from=0 /go/src/github.com/project_name /app

CMD ["./main"]

multi-stage buildが出来るDockerfileの作成方法は、以下の記事に詳細をまとめましたので、参考にしていただけますと幸いです。

参考:https://qiita.com/arthur_foreign/items/fca369c1d9bde1701e38

my.cnfを作成

my.cnf
[mysqld]
character-set-server=utf8mb4
default_storage_engine=InnoDB
log-error=/var/log/mysql/mysqld.log
log_timestamps=SYSTEM
slow_query_log=ON
slow_query_log_file=/var/log/mysql/slow_query.log

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqldump]
default-character-set=utf8mb4

my.cnfについてはこの記事では触れません。

以下の記事を参考にしました。

参考1:https://qiita.com/at_1016/items/874788e375938837a027
参考2:https://blog.apar.jp/linux/6769/
参考3:https://qiita.com/YusukeHigaki/items/2cab311d2a559a543e3a
参考4:https://qiita.com/EigenPort_M/items/46bd1bf386eb56eba97e

docker-compose.ymlを作成

Nuxt.js

docker-compose.yml
version: '3'
services:
  front:
    build:
      context: .
      dockerfile: "Dockerfile.dev"
    volumes:
      - ./:/project_name/app
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
    networks:
      - project_name_default
networks:
  project_name_default:
    external: true

GO

docker-compose.yml
version: '3'
services:
  api:
    build:
      context: .
      dockerfile: "Dockerfile.dev"
    volumes:
      - ./:/go/src/github.com/project_name
    ports:
      - "8080:8080"
    environment:
      - APP_ENV=docker
    depends_on:
      - db
    tty: true
    stdin_open: true
    networks:
      - project_name_default
  db:
    image: mysql:5.7
    restart: always
    volumes:
      - ./db/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: project_name
      MYSQL_USER: root
    ports:
      - "3306:3306"
networks:
  project_name_default:
    external: true

networksには、docker network lsで出たネットワークを指定しました。(先にdocker-compose upしています。)

docker-compose.ymlについては、以下のドキュメントを参考にしました。

参考1:https://qiita.com/sanoyo/items/294e76cbcb80df35a32f
参考2:https://qiita.com/at-946/items/08de3c9d7611f62b1894

docker-compose upを実行

Nuxt.js側とGO側で以下のコマンドを実行しましょう。

$ docker-compose up

docker-compose up --build等のオプションは、以下のドキュメントが参考になりました。

参考:http://docs.docker.jp/compose/reference/up.html

うまくいかない時はアプリやコンテナの設定を変えたり、DBにデータをつっこんだりしましょう。

アプリ側やコンテナ等の細かい設定変更

以下は、プロジェクトで僕がやった手順をまとめただけです。

  • Nuxt.jsでリクエストするエンドポイントを指定
  • GO側で見にいくDBを指定(toml管理)
  • コンテナのlocale設定

※人によって手順が違うところもあると思うので、容赦無く読み飛ばしてもらえると嬉しいです。

Nuxt.jsでリクエストするエンドポイントを指定

エンドポイントの指定方法だけ書きます。

index.vue
$axios.$get('http://api:8080')

先ほど、docker-compose.ymlに同じnetworksNuxt.js側とGO側に設定しています。

docker-compose.ymlに書いたAPI側のサービス名「api」を、エンドポイントのホスト名に指定することで、API側にリクエストを届けることが出来ました。

また、エンドポイントのホスト名をlocalhostに指定すると、connect ECONNREFUSED 127.0.0.1:8080のエラーが発生しました。

GO側で見にいくDBを指定(toml管理)

docker-compose.ymlで設定した環境変数「APP_ENV=docker」によって、config_docker.tomlの設定を見にいくようにしています。

見にいくDBをtomlで管理しました。

config_docker.toml
[MySQL]
Host     = "db"
Username = "root"
Database = "project_name"
Password = "password"
database.go
import (
    "os"

    "github.com/BurntSushi/toml"
    _ "github.com/go-sql-driver/mysql"
    "github.com/jmoiron/sqlx"
)

var DB *sqlx.DB

type Config struct {
    MySQL MySQLConfig
}

type MySQLConfig struct {
    Username string
    Password string
    Host     string
    Database string
}

func init() {
    var config Config

    var configFilePath string
    basePath := os.Getenv("APP_PATH")

    env := os.Getenv("APP_ENV")

    switch env {
    case "production":
        configFilePath = basePath + "config/config_prd.toml"
    case "staging":
        configFilePath = basePath + "config/config_stg.toml"
    case "development":
        configFilePath = basePath + "config/config_dev.toml"
    case "test":
        configFilePath = basePath + "config/config_test.toml"
    case "docker":
        configFilePath = basePath + "config/config_docker.toml"
    default:
        configFilePath = basePath + "config/config_dev.toml"
    }

    _, err := toml.DecodeFile(configFilePath, &config)
    if err != nil {
        panic(err.Error())
    }

    dbConfig := config.MySQL.Username + ":" + config.MySQL.Password + "@tcp(" + config.MySQL.Host + ":3306)/" + config.MySQL.Database + "?parseTime=true"

    db, err := sqlx.Connect("mysql", dbConfig)
    if err != nil {
        panic(err.Error())
    }

    DB = db
}

コンテナのlocale設定

手順は以下の記事を参考にしました。

参考:https://qiita.com/maejima_f/items/4d5432aa471a9deaea7f

現プロジェクトでは中国語の繁体字を利用しているため、その設定をそのまま記事に書きます。

まず、MySQLのコンテナ名を出します。

$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                               NAMES
xxxxxxxxxxxx        mysql:5.7                 "docker-entrypoint.s…"   25 hours ago        Up 12 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   project_name
_db_1

次に、Dockerコンテナの中のシェルに入りましょう。

$ docker exec -it project_name_db_1 bash

中国語繁体字(zh_TW)のlocaleを追加します。

$ apt-get update
$ apt-get install locales locales-all
$ dpkg-reconfigure locales
$ export LANG=zh_TW.UTF-8

追加されたlocaleを確認してみましょう。

$ locale
LANG=zh_TW
LANGUAGE=
LC_CTYPE="zh_TW"
LC_NUMERIC="zh_TW"
LC_TIME="zh_TW"
LC_COLLATE="zh_TW"
LC_MONETARY="zh_TW"
LC_MESSAGES="zh_TW"
LC_PAPER="zh_TW"
LC_NAME="zh_TW"
LC_ADDRESS="zh_TW"
LC_TELEPHONE="zh_TW"
LC_MEASUREMENT="zh_TW"
LC_IDENTIFICATION="zh_TW"
LC_ALL=

INSERT文で適当なクエリを投げてちゃんと入力できていたら完了です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

眺めて覚えるGo言語 その13 MongoDB

MongoDBにDatabaseを作りましょう。眺めていきます。

あらかじめMongoDB Copmpassをインストールしておきます。

image.png

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

// アドレス帳の構造体
type Adr struct {
    ID              int         `bson:ID`
    Name            string      `bson:"名前"`
    Kana            string      `bson:"名前フリガナ"`
    Post            string      `bson:"郵便番号"`
    Address         string      `bson:"住所"`
    AddrKaba        string      `bson:"住所フリガナ"`
    Sex             string      `bson:"性別"`
    BloodType       string      `bson:"血液型"`
    Database        string      `bson:"生年月日"`
    Telphone        string      `bson:"電話番号"`
    Mobile          string      `bson:"携帯番号"`
    Mail            string      `bson:"メール"`
}

func main() {
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
if err != nil {log.Fatal(err)}
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {log.Fatal(err)}
collection := client.Database("test").Collection("AdrList")
// すべて消します
collection.Drop(context.TODO())
fmt.Println("Connected to MongoDB!")
adrs:=[]interface{}{
Adr {1,"関 波子","セキ ナミコ","135-0034","東京都江東区永代8-1-4","トウキョウトコウトウクエイタイ","女","AB","1980/07/31","03-3060-4716","090-7787-3784","sk@eaccess.net"},
Adr {2,"小倉 準司","コクラ ジュンジ","071-1544","北海道上川郡東神楽町14号6-13-1","ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ","男","A","1973/10/08","0166-36-3522","","junzi-kokura@eaccess.net"},
Adr {3,"西村 有紀子","ニシムラ ユキコ","635-0805","奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009","ナラケンキタカツラギグンコウリョウチョウカヤノ","女","O","1972/12/05","0745-67-2723","090-5165-2074","okikuy1972@livedoor.com"},
Adr {4,"谷 僧三郎","タニ ソウザブロウ","520-0011","滋賀県大津市南志賀2868","シガケンオオツシミナミシガ","男","B","1989/01/17","077-323-7124","090-3781-1181","suzbrutn@dsn.ad.jp"},
Adr {5,"山口 和久","ヤマグチ カズヒサ","012-0813","秋田県湯沢市前森1-11-7","アキタケンユザワシマエモリ","男","A","1973/02/21","0183-21-6828","070-4790-1232","kazuhisa73@geocities.com"},
Adr {6,"米田 一生","コメタ イッセイ","264-0029","千葉県千葉市若葉区桜木北4-13-4","チバケンチバシワカバクサクラギキタ","男","O","1984/07/25","043-883-8543","","issei07@dsn.ad.jp"},
Adr {7,"村松 希美江","ムラマツ キミエ","616-8151","京都府京都市右京区太秦帷子ヶ辻町6-6-7","キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ","女","O","1980/11/21","075-727-1789","090-4849-6939","kimie.muramatu@odn.ne.jp"},
Adr {8,"小野寺 眞八","オノデラ シンヤ","527-0135","滋賀県東近江市横溝町6-6-7","シガケンヒガシオウミシヨコミゾチョウ","男","O","1986/04/28","0748-01-7199","090-1457-0772","ondr.sny@gmo-media.jp"},
Adr {9,"志村 陽一郎","シムラ ヨウイチロウ","048-1321","北海道磯谷郡蘭越町湯里5-9-5 ル・メール湯里","ホッカイドウイソヤグンランコシチョウユノサト","男","O","1975/07/08","0136-88-6603","","smr-yutru@dion.ne.jp"},
Adr {10,"鎌田 敏美","カマタ トシミ","409-0115","山梨県上野原市松留4631","ヤマナシケンウエノハラシマツドメ","女","B","1993/06/09","0554-03-0156","090-5690-8749","kamata0609@example.com"},
Adr {11,"宮本 力弥","ミヤモト リキヤ","922-0325","石川県加賀市二子塚町8888","イシカワケンカガシフタゴヅカマチ","男","O","1975/08/10","07617-9-0761","070-6565-9470","rky75@example.ac.jp"},
Adr {12,"中山 英博","ナカヤマ ヒデヒロ","130-0024","東京都墨田区菊川1-11-7","トウキョウトスミダクキクカワ","男","A","1978/04/01","03-3043-4017","090-3086-6504","nkym0401@dion.ne.jp"},
Adr {13,"丸山 平作","マルヤマ ヘイサク","039-1557","青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315","アオモリケンサンノヘグンゴノヘマチハッケイ","男","AB","1994/05/26","0178-60-8503","070-3567-0574","hisk0526@ybb.ne.jp"},
Adr {14,"金子 君吉","カネコ キミキチ","959-1372","新潟県加茂市本町7-10-7 TOP・本町 5F","ニイガタケンカモシホンチョウ","男","O","1984/05/15","0256-13-9329","090-7210-7725","kaneko_kimikiti@aitai.ne.jp"},
Adr {15,"阿部 康伸","アベ ヤスノブ","071-0551","北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F","ホッカイドウソラチグンカミフラノチョウモトマチ","男","B","1973/04/09","0167-59-5860","090-6699-6888","abe-yasunobu@users.gr.jp"},
Adr {16,"東 健也","アズマ ケンヤ","933-0809","富山県高岡市出来田新町8732","トヤマケンタカオカシデキデンシンマチ","男","B","1977/12/25","0766-24-2308","","kenya.azuma@tiki.ne.jp"},
Adr {17,"高田 紀子","タカタ トシコ","654-0067","兵庫県神戸市須磨区離宮西町4-2-2","ヒョウゴケンコウベシスマクリキュウニシチョウ","女","B","1994/11/06","078-547-5651","070-8120-1066","okisotokisot@example.com"},
Adr {18,"金城 茂義","カネギ シゲヨシ","923-1266","石川県能美郡川北町下先出3-15-2","イシカワケンノミグンカワキタマチシモセンデン","男","O","1987/03/14","076-969-3546","070-8191-6845","sigeyosi2003@plala.or.jp"},
Adr {19,"神谷 覚","カミタニ サトル","614-8151","京都府八幡市上奈良小端4-13-5","キョウトフヤワタシカミナラオバタ","男","O","1976/02/04","075-435-9736","090-9981-6325","inatimak0204@hotmail.com"},
Adr {20,"北川 梨華","キタカワ リカ","171-0033","東京都豊島区高田3-10-1","トウキョウトトシマクタカダ","女","A","1980/12/25","03-3658-2663","090-1407-6777","akir1710033@yahoo.co.jp"},
}
_,err = collection.InsertMany(context.TODO(), adrs)
if err != nil {log.Fatal(err)}
err = client.Disconnect(context.TODO())
if err != nil {log.Fatal(err)}
fmt.Println("Connection to MongoDB closed.")
}

実行結果
image.png

20件のデータが作成されます。

一覧表の出力

main.go
package main

import (
    "context"
    "fmt"
    "log"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/bson"
    "strings"
)
func main() {
// Set client options
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
// Connect to MongoDB
client, err := mongo.Connect(context.TODO(), clientOptions)
defer client.Disconnect(context.TODO())
if err != nil {log.Fatal(err)}
collection := client.Database("test").Collection("AdrList")
findOptions := options.Find()
f:=bson.D{}
cur, err := collection.Find(context.TODO(), f, findOptions)
if err != nil {log.Fatal(err)}
lb:=strings.Split("id,名前,名前フリガナ,郵便番号,住所,住所フリガナ,性別,血液型,生年月日,電話番号,携帯番号,メール",",")
for cur.Next(context.TODO()) {
    var a map[string]interface{}
    if err = cur.Decode(&a); err != nil {log.Fatal(err)}
        for i,l:=range lb{          
            if i==0 {
                fmt.Printf("%-16s\t%v\n",l,a[l])
            } else{
                fmt.Printf("%-16s\t%v\n",l,a[l])
            }
        }
    fmt.Println("--------------------------------------------")
    }
}
出力結果
>go run main.go
id                      1
名前                     波子
名前フリガナ            セキ ナミコ
郵便番号                135-0034
住所                    東京都江東区永代8-1-4
住所フリガナ            トウキョウトコウトウクエイタイ
性別                    
血液型                  AB
生年月日                1980/07/31
電話番号                03-3060-4716
携帯番号                090-7787-3784
メール                  sk@eaccess.net
--------------------------------------------
id                      2
名前                    小倉 準司
名前フリガナ            コクラ ジュンジ
郵便番号                071-1544
住所                    北海道上川郡東神楽町14号6-13-1
住所フリガナ            ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ
性別                    
血液型                  A
生年月日                1973/10/08
電話番号                0166-36-3522
携帯番号
メール                  junzi-kokura@eaccess.net
--------------------------------------------
id                      3
名前                    西村 有紀子
名前フリガナ            ニシムラ ユキコ
郵便番号                635-0805
住所                    奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009
住所フリガナ            ナラケンキタカツラギグンコウリョウチョウカヤノ
性別                    
血液型                  O
生年月日                1972/12/05
電話番号                0745-67-2723
携帯番号                090-5165-2074
メール                  okikuy1972@livedoor.com
--------------------------------------------
id                      4
名前                     僧三郎
名前フリガナ            タニ ソウザブロウ
郵便番号                520-0011
住所                    滋賀県大津市南志賀2868
住所フリガナ            シガケンオオツシミナミシガ
性別                    
血液型                  B
生年月日                1989/01/17
電話番号                077-323-7124
携帯番号                090-3781-1181
メール                  suzbrutn@dsn.ad.jp
--------------------------------------------
id                      5
名前                    山口 和久
名前フリガナ            ヤマグチ カズヒサ
郵便番号                012-0813
住所                    秋田県湯沢市前森1-11-7
住所フリガナ            アキタケンユザワシマエモリ
性別                    
血液型                  A
生年月日                1973/02/21
電話番号                0183-21-6828
携帯番号                070-4790-1232
メール                  kazuhisa73@geocities.com
--------------------------------------------
id                      6
名前                    米田 一生
名前フリガナ            コメタ イッセイ
郵便番号                264-0029
住所                    千葉県千葉市若葉区桜木北4-13-4
住所フリガナ            チバケンチバシワカバクサクラギキタ
性別                    
血液型                  O
生年月日                1984/07/25
電話番号                043-883-8543
携帯番号
メール                  issei07@dsn.ad.jp
--------------------------------------------
id                      7
名前                    村松 希美江
名前フリガナ            ムラマツ キミエ
郵便番号                616-8151
住所                    京都府京都市右京区太秦帷子ヶ辻町6-6-7
住所フリガナ            キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ
性別                    
血液型                  O
生年月日                1980/11/21
電話番号                075-727-1789
携帯番号                090-4849-6939
メール                  kimie.muramatu@odn.ne.jp
--------------------------------------------
id                      8
名前                    小野寺 眞八
名前フリガナ            オノデラ シンヤ
郵便番号                527-0135
住所                    滋賀県東近江市横溝町6-6-7
住所フリガナ            シガケンヒガシオウミシヨコミゾチョウ
性別                    
血液型                  O
生年月日                1986/04/28
電話番号                0748-01-7199
携帯番号                090-1457-0772
メール                  ondr.sny@gmo-media.jp
--------------------------------------------
id                      9
名前                    志村 陽一郎
名前フリガナ            シムラ ヨウイチロウ
郵便番号                048-1321
住所                    北海道磯谷郡蘭越町湯里5-9-5 メール湯里
住所フリガナ            ホッカイドウイソヤグンランコシチョウユノサト
性別                    
血液型                  O
生年月日                1975/07/08
電話番号                0136-88-6603
携帯番号
メール                  smr-yutru@dion.ne.jp
--------------------------------------------
id                      10
名前                    鎌田 敏美
名前フリガナ            カマタ トシミ
郵便番号                409-0115
住所                    山梨県上野原市松留4631
住所フリガナ            ヤマナシケンウエノハラシマツドメ
性別                    
血液型                  B
生年月日                1993/06/09
電話番号                0554-03-0156
携帯番号                090-5690-8749
メール                  kamata0609@example.com
--------------------------------------------
id                      11
名前                    宮本 力弥
名前フリガナ            ミヤモト リキヤ
郵便番号                922-0325
住所                    石川県加賀市二子塚町8888
住所フリガナ            イシカワケンカガシフタゴヅカマチ
性別                    
血液型                  O
生年月日                1975/08/10
電話番号                07617-9-0761
携帯番号                070-6565-9470
メール                  rky75@example.ac.jp
--------------------------------------------
id                      12
名前                    中山 英博
名前フリガナ            ナカヤマ ヒデヒロ
郵便番号                130-0024
住所                    東京都墨田区菊川1-11-7
住所フリガナ            トウキョウトスミダクキクカワ
性別                    
血液型                  A
生年月日                1978/04/01
電話番号                03-3043-4017
携帯番号                090-3086-6504
メール                  nkym0401@dion.ne.jp
--------------------------------------------
id                      13
名前                    丸山 平作
名前フリガナ            マルヤマ ヘイサク
郵便番号                039-1557
住所                    青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315
住所フリガナ            アオモリケンサンノヘグンゴノヘマチハッケイ
性別                    
血液型                  AB
生年月日                1994/05/26
電話番号                0178-60-8503
携帯番号                070-3567-0574
メール                  hisk0526@ybb.ne.jp
--------------------------------------------
id                      14
名前                    金子 君吉
名前フリガナ            カネコ キミキチ
郵便番号                959-1372
住所                    新潟県加茂市本町7-10-7 TOP本町 5F
住所フリガナ            ニイガタケンカモシホンチョウ
性別                    
血液型                  O
生年月日                1984/05/15
電話番号                0256-13-9329
携帯番号                090-7210-7725
メール                  kaneko_kimikiti@aitai.ne.jp
--------------------------------------------
id                      15
名前                    阿部 康伸
名前フリガナ            アベ ヤスノブ
郵便番号                071-0551
住所                    北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F
住所フリガナ            ホッカイドウソラチグンカミフラノチョウモトマチ
性別                    
血液型                  B
生年月日                1973/04/09
電話番号                0167-59-5860
携帯番号                090-6699-6888
メール                  abe-yasunobu@users.gr.jp
--------------------------------------------
id                      16
名前                     健也
名前フリガナ            アズマ ケンヤ
郵便番号                933-0809
住所                    富山県高岡市出来田新町8732
住所フリガナ            トヤマケンタカオカシデキデンシンマチ
性別                    
血液型                  B
生年月日                1977/12/25
電話番号                0766-24-2308
携帯番号
メール                  kenya.azuma@tiki.ne.jp
--------------------------------------------
id                      17
名前                    高田 紀子
名前フリガナ            タカタ トシコ
郵便番号                654-0067
住所                    兵庫県神戸市須磨区離宮西町4-2-2
住所フリガナ            ヒョウゴケンコウベシスマクリキュウニシチョウ
性別                    
血液型                  B
生年月日                1994/11/06
電話番号                078-547-5651
携帯番号                070-8120-1066
メール                  okisotokisot@example.com
--------------------------------------------
id                      18
名前                    金城 茂義
名前フリガナ            カネギ シゲヨシ
郵便番号                923-1266
住所                    石川県能美郡川北町下先出3-15-2
住所フリガナ            イシカワケンノミグンカワキタマチシモセンデン
性別                    
血液型                  O
生年月日                1987/03/14
電話番号                076-969-3546
携帯番号                070-8191-6845
メール                  sigeyosi2003@plala.or.jp
--------------------------------------------
id                      19
名前                    神谷 
名前フリガナ            カミタニ サトル
郵便番号                614-8151
住所                    京都府八幡市上奈良小端4-13-5
住所フリガナ            キョウトフヤワタシカミナラオバタ
性別                    
血液型                  O
生年月日                1976/02/04
電話番号                075-435-9736
携帯番号                090-9981-6325
メール                  inatimak0204@hotmail.com
--------------------------------------------
id                      20
名前                    北川 梨華
名前フリガナ            キタカワ リカ
郵便番号                171-0033
住所                    東京都豊島区高田3-10-1
住所フリガナ            トウキョウトトシマクタカダ
性別                    
血液型                  A
生年月日                1980/12/25
電話番号                03-3658-2663
携帯番号                090-1407-6777
メール                  akir1710033@yahoo.co.jp
--------------------------------------------

C:\Users\hirat\go\src\mongoex>go run m3.go
id                      1
名前                     波子
名前フリガナ            セキ ナミコ
郵便番号                135-0034
住所                    東京都江東区永代8-1-4
住所フリガナ            トウキョウトコウトウクエイタイ
性別                    
血液型                  AB
生年月日                1980/07/31
電話番号                03-3060-4716
携帯番号                090-7787-3784
メール                  sk@eaccess.net
--------------------------------------------
id                      2
名前                    小倉 準司
名前フリガナ            コクラ ジュンジ
郵便番号                071-1544
住所                    北海道上川郡東神楽町14号6-13-1
住所フリガナ            ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ
性別                    
血液型                  A
生年月日                1973/10/08
電話番号                0166-36-3522
携帯番号
メール                  junzi-kokura@eaccess.net
--------------------------------------------
id                      3
名前                    西村 有紀子
名前フリガナ            ニシムラ ユキコ
郵便番号                635-0805
住所                    奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009
住所フリガナ            ナラケンキタカツラギグンコウリョウチョウカヤノ
性別                    
血液型                  O
生年月日                1972/12/05
電話番号                0745-67-2723
携帯番号                090-5165-2074
メール                  okikuy1972@livedoor.com
--------------------------------------------
id                      4
名前                     僧三郎
名前フリガナ            タニ ソウザブロウ
郵便番号                520-0011
住所                    滋賀県大津市南志賀2868
住所フリガナ            シガケンオオツシミナミシガ
性別                    
血液型                  B
生年月日                1989/01/17
電話番号                077-323-7124
携帯番号                090-3781-1181
メール                  suzbrutn@dsn.ad.jp
--------------------------------------------
id                      5
名前                    山口 和久
名前フリガナ            ヤマグチ カズヒサ
郵便番号                012-0813
住所                    秋田県湯沢市前森1-11-7
住所フリガナ            アキタケンユザワシマエモリ
性別                    
血液型                  A
生年月日                1973/02/21
電話番号                0183-21-6828
携帯番号                070-4790-1232
メール                  kazuhisa73@geocities.com
--------------------------------------------
id                      6
名前                    米田 一生
名前フリガナ            コメタ イッセイ
郵便番号                264-0029
住所                    千葉県千葉市若葉区桜木北4-13-4
住所フリガナ            チバケンチバシワカバクサクラギキタ
性別                    
血液型                  O
生年月日                1984/07/25
電話番号                043-883-8543
携帯番号
メール                  issei07@dsn.ad.jp
--------------------------------------------
id                      7
名前                    村松 希美江
名前フリガナ            ムラマツ キミエ
郵便番号                616-8151
住所                    京都府京都市右京区太秦帷子ヶ辻町6-6-7
住所フリガナ            キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ
性別                    
血液型                  O
生年月日                1980/11/21
電話番号                075-727-1789
携帯番号                090-4849-6939
メール                  kimie.muramatu@odn.ne.jp
--------------------------------------------
id                      8
名前                    小野寺 眞八
名前フリガナ            オノデラ シンヤ
郵便番号                527-0135
住所                    滋賀県東近江市横溝町6-6-7
住所フリガナ            シガケンヒガシオウミシヨコミゾチョウ
性別                    
血液型                  O
生年月日                1986/04/28
電話番号                0748-01-7199
携帯番号                090-1457-0772
メール                  ondr.sny@gmo-media.jp
--------------------------------------------
id                      9
名前                    志村 陽一郎
名前フリガナ            シムラ ヨウイチロウ
郵便番号                048-1321
住所                    北海道磯谷郡蘭越町湯里5-9-5 メール湯里
住所フリガナ            ホッカイドウイソヤグンランコシチョウユノサト
性別                    
血液型                  O
生年月日                1975/07/08
電話番号                0136-88-6603
携帯番号
メール                  smr-yutru@dion.ne.jp
--------------------------------------------
id                      10
名前                    鎌田 敏美
名前フリガナ            カマタ トシミ
郵便番号                409-0115
住所                    山梨県上野原市松留4631
住所フリガナ            ヤマナシケンウエノハラシマツドメ
性別                    
血液型                  B
生年月日                1993/06/09
電話番号                0554-03-0156
携帯番号                090-5690-8749
メール                  kamata0609@example.com
--------------------------------------------
id                      11
名前                    宮本 力弥
名前フリガナ            ミヤモト リキヤ
郵便番号                922-0325
住所                    石川県加賀市二子塚町8888
住所フリガナ            イシカワケンカガシフタゴヅカマチ
性別                    
血液型                  O
生年月日                1975/08/10
電話番号                07617-9-0761
携帯番号                070-6565-9470
メール                  rky75@example.ac.jp
--------------------------------------------
id                      12
名前                    中山 英博
名前フリガナ            ナカヤマ ヒデヒロ
郵便番号                130-0024
住所                    東京都墨田区菊川1-11-7
住所フリガナ            トウキョウトスミダクキクカワ
性別                    
血液型                  A
生年月日                1978/04/01
電話番号                03-3043-4017
携帯番号                090-3086-6504
メール                  nkym0401@dion.ne.jp
--------------------------------------------
id                      13
名前                    丸山 平作
名前フリガナ            マルヤマ ヘイサク
郵便番号                039-1557
住所                    青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315
住所フリガナ            アオモリケンサンノヘグンゴノヘマチハッケイ
性別                    
血液型                  AB
生年月日                1994/05/26
電話番号                0178-60-8503
携帯番号                070-3567-0574
メール                  hisk0526@ybb.ne.jp
--------------------------------------------
id                      14
名前                    金子 君吉
名前フリガナ            カネコ キミキチ
郵便番号                959-1372
住所                    新潟県加茂市本町7-10-7 TOP本町 5F
住所フリガナ            ニイガタケンカモシホンチョウ
性別                    
血液型                  O
生年月日                1984/05/15
電話番号                0256-13-9329
携帯番号                090-7210-7725
メール                  kaneko_kimikiti@aitai.ne.jp
--------------------------------------------
id                      15
名前                    阿部 康伸
名前フリガナ            アベ ヤスノブ
郵便番号                071-0551
住所                    北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F
住所フリガナ            ホッカイドウソラチグンカミフラノチョウモトマチ
性別                    
血液型                  B
生年月日                1973/04/09
電話番号                0167-59-5860
携帯番号                090-6699-6888
メール                  abe-yasunobu@users.gr.jp
--------------------------------------------
id                      16
名前                     健也
名前フリガナ            アズマ ケンヤ
郵便番号                933-0809
住所                    富山県高岡市出来田新町8732
住所フリガナ            トヤマケンタカオカシデキデンシンマチ
性別                    
血液型                  B
生年月日                1977/12/25
電話番号                0766-24-2308
携帯番号
メール                  kenya.azuma@tiki.ne.jp
--------------------------------------------
id                      17
名前                    高田 紀子
名前フリガナ            タカタ トシコ
郵便番号                654-0067
住所                    兵庫県神戸市須磨区離宮西町4-2-2
住所フリガナ            ヒョウゴケンコウベシスマクリキュウニシチョウ
性別                    
血液型                  B
生年月日                1994/11/06
電話番号                078-547-5651
携帯番号                070-8120-1066
メール                  okisotokisot@example.com
--------------------------------------------
id                      18
名前                    金城 茂義
名前フリガナ            カネギ シゲヨシ
郵便番号                923-1266
住所                    石川県能美郡川北町下先出3-15-2
住所フリガナ            イシカワケンノミグンカワキタマチシモセンデン
性別                    
血液型                  O
生年月日                1987/03/14
電話番号                076-969-3546
携帯番号                070-8191-6845
メール                  sigeyosi2003@plala.or.jp
--------------------------------------------
id                      19
名前                    神谷 
名前フリガナ            カミタニ サトル
郵便番号                614-8151
住所                    京都府八幡市上奈良小端4-13-5
住所フリガナ            キョウトフヤワタシカミナラオバタ
性別                    
血液型                  O
生年月日                1976/02/04
電話番号                075-435-9736
携帯番号                090-9981-6325
メール                  inatimak0204@hotmail.com
--------------------------------------------
id                      20
名前                    北川 梨華
名前フリガナ            キタカワ リカ
郵便番号                171-0033
住所                    東京都豊島区高田3-10-1
住所フリガナ            トウキョウトトシマクタカダ
性別                    
血液型                  A
生年月日                1980/12/25
電話番号                03-3658-2663
携帯番号                090-1407-6777
メール                  akir1710033@yahoo.co.jp
--------------------------------------------

C:\Users\hirat\go\src\mongoex>go run m3.go
id                      1
名前                     波子
名前フリガナ            セキ ナミコ
郵便番号                135-0034
住所                    東京都江東区永代8-1-4
住所フリガナ            トウキョウトコウトウクエイタイ
性別                    
血液型                  AB
生年月日                1980/07/31
電話番号                03-3060-4716
携帯番号                090-7787-3784
メール                  sk@eaccess.net
--------------------------------------------
id                      2
名前                    小倉 準司
名前フリガナ            コクラ ジュンジ
郵便番号                071-1544
住所                    北海道上川郡東神楽町14号6-13-1
住所フリガナ            ホッカイドウカミカワグンヒガシカグラチョウ14ゴウ
性別                    
血液型                  A
生年月日                1973/10/08
電話番号                0166-36-3522
携帯番号
メール                  junzi-kokura@eaccess.net
--------------------------------------------
id                      3
名前                    西村 有紀子
名前フリガナ            ニシムラ ユキコ
郵便番号                635-0805
住所                    奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009
住所フリガナ            ナラケンキタカツラギグンコウリョウチョウカヤノ
性別                    
血液型                  O
生年月日                1972/12/05
電話番号                0745-67-2723
携帯番号                090-5165-2074
メール                  okikuy1972@livedoor.com
--------------------------------------------
id                      4
名前                     僧三郎
名前フリガナ            タニ ソウザブロウ
郵便番号                520-0011
住所                    滋賀県大津市南志賀2868
住所フリガナ            シガケンオオツシミナミシガ
性別                    
血液型                  B
生年月日                1989/01/17
電話番号                077-323-7124
携帯番号                090-3781-1181
メール                  suzbrutn@dsn.ad.jp
--------------------------------------------
id                      5
名前                    山口 和久
名前フリガナ            ヤマグチ カズヒサ
郵便番号                012-0813
住所                    秋田県湯沢市前森1-11-7
住所フリガナ            アキタケンユザワシマエモリ
性別                    
血液型                  A
生年月日                1973/02/21
電話番号                0183-21-6828
携帯番号                070-4790-1232
メール                  kazuhisa73@geocities.com
--------------------------------------------
id                      6
名前                    米田 一生
名前フリガナ            コメタ イッセイ
郵便番号                264-0029
住所                    千葉県千葉市若葉区桜木北4-13-4
住所フリガナ            チバケンチバシワカバクサクラギキタ
性別                    
血液型                  O
生年月日                1984/07/25
電話番号                043-883-8543
携帯番号
メール                  issei07@dsn.ad.jp
--------------------------------------------
id                      7
名前                    村松 希美江
名前フリガナ            ムラマツ キミエ
郵便番号                616-8151
住所                    京都府京都市右京区太秦帷子ヶ辻町6-6-7
住所フリガナ            キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ
性別                    
血液型                  O
生年月日                1980/11/21
電話番号                075-727-1789
携帯番号                090-4849-6939
メール                  kimie.muramatu@odn.ne.jp
--------------------------------------------
id                      8
名前                    小野寺 眞八
名前フリガナ            オノデラ シンヤ
郵便番号                527-0135
住所                    滋賀県東近江市横溝町6-6-7
住所フリガナ            シガケンヒガシオウミシヨコミゾチョウ
性別                    
血液型                  O
生年月日                1986/04/28
電話番号                0748-01-7199
携帯番号                090-1457-0772
メール                  ondr.sny@gmo-media.jp
--------------------------------------------
id                      9
名前                    志村 陽一郎
名前フリガナ            シムラ ヨウイチロウ
郵便番号                048-1321
住所                    北海道磯谷郡蘭越町湯里5-9-5 メール湯里
住所フリガナ            ホッカイドウイソヤグンランコシチョウユノサト
性別                    
血液型                  O
生年月日                1975/07/08
電話番号                0136-88-6603
携帯番号
メール                  smr-yutru@dion.ne.jp
--------------------------------------------
id                      10
名前                    鎌田 敏美
名前フリガナ            カマタ トシミ
郵便番号                409-0115
住所                    山梨県上野原市松留4631
住所フリガナ            ヤマナシケンウエノハラシマツドメ
性別                    
血液型                  B
生年月日                1993/06/09
電話番号                0554-03-0156
携帯番号                090-5690-8749
メール                  kamata0609@example.com
--------------------------------------------
id                      11
名前                    宮本 力弥
名前フリガナ            ミヤモト リキヤ
郵便番号                922-0325
住所                    石川県加賀市二子塚町8888
住所フリガナ            イシカワケンカガシフタゴヅカマチ
性別                    
血液型                  O
生年月日                1975/08/10
電話番号                07617-9-0761
携帯番号                070-6565-9470
メール                  rky75@example.ac.jp
--------------------------------------------
id                      12
名前                    中山 英博
名前フリガナ            ナカヤマ ヒデヒロ
郵便番号                130-0024
住所                    東京都墨田区菊川1-11-7
住所フリガナ            トウキョウトスミダクキクカワ
性別                    
血液型                  A
生年月日                1978/04/01
電話番号                03-3043-4017
携帯番号                090-3086-6504
メール                  nkym0401@dion.ne.jp
--------------------------------------------
id                      13
名前                    丸山 平作
名前フリガナ            マルヤマ ヘイサク
郵便番号                039-1557
住所                    青森県三戸郡五戸町八景3-15-9 八景ガーデン 1315
住所フリガナ            アオモリケンサンノヘグンゴノヘマチハッケイ
性別                    
血液型                  AB
生年月日                1994/05/26
電話番号                0178-60-8503
携帯番号                070-3567-0574
メール                  hisk0526@ybb.ne.jp
--------------------------------------------
id                      14
名前                    金子 君吉
名前フリガナ            カネコ キミキチ
郵便番号                959-1372
住所                    新潟県加茂市本町7-10-7 TOP本町 5F
住所フリガナ            ニイガタケンカモシホンチョウ
性別                    
血液型                  O
生年月日                1984/05/15
電話番号                0256-13-9329
携帯番号                090-7210-7725
メール                  kaneko_kimikiti@aitai.ne.jp
--------------------------------------------
id                      15
名前                    阿部 康伸
名前フリガナ            アベ ヤスノブ
郵便番号                071-0551
住所                    北海道空知郡上富良野町本町9-9-9 本町第2ビル 14F
住所フリガナ            ホッカイドウソラチグンカミフラノチョウモトマチ
性別                    
血液型                  B
生年月日                1973/04/09
電話番号                0167-59-5860
携帯番号                090-6699-6888
メール                  abe-yasunobu@users.gr.jp
--------------------------------------------
id                      16
名前                     健也
名前フリガナ            アズマ ケンヤ
郵便番号                933-0809
住所                    富山県高岡市出来田新町8732
住所フリガナ            トヤマケンタカオカシデキデンシンマチ
性別                    
血液型                  B
生年月日                1977/12/25
電話番号                0766-24-2308
携帯番号
メール                  kenya.azuma@tiki.ne.jp
--------------------------------------------
id                      17
名前                    高田 紀子
名前フリガナ            タカタ トシコ
郵便番号                654-0067
住所                    兵庫県神戸市須磨区離宮西町4-2-2
住所フリガナ            ヒョウゴケンコウベシスマクリキュウニシチョウ
性別                    
血液型                  B
生年月日                1994/11/06
電話番号                078-547-5651
携帯番号                070-8120-1066
メール                  okisotokisot@example.com
--------------------------------------------
id                      18
名前                    金城 茂義
名前フリガナ            カネギ シゲヨシ
郵便番号                923-1266
住所                    石川県能美郡川北町下先出3-15-2
住所フリガナ            イシカワケンノミグンカワキタマチシモセンデン
性別                    
血液型                  O
生年月日                1987/03/14
電話番号                076-969-3546
携帯番号                070-8191-6845
メール                  sigeyosi2003@plala.or.jp
--------------------------------------------
id                      19
名前                    神谷 
名前フリガナ            カミタニ サトル
郵便番号                614-8151
住所                    京都府八幡市上奈良小端4-13-5
住所フリガナ            キョウトフヤワタシカミナラオバタ
性別                    
血液型                  O
生年月日                1976/02/04
電話番号                075-435-9736
携帯番号                090-9981-6325
メール                  inatimak0204@hotmail.com
--------------------------------------------
id                      20
名前                    北川 梨華
名前フリガナ            キタカワ リカ
郵便番号                171-0033
住所                    東京都豊島区高田3-10-1
住所フリガナ            トウキョウトトシマクタカダ
性別                    
血液型                  A
生年月日                1980/12/25
電話番号                03-3658-2663
携帯番号                090-1407-6777
メール                  akir1710033@yahoo.co.jp
--------------------------------------------

ではフィルターをかけて女性だけを選んでみましょう

f:=bson.D{}
   ↓
f:= bson.D{{"性別", "女"}}

実行結果
>go run main.go
id                      1
名前                    関 波子
名前フリガナ            セキ ナミコ
郵便番号                135-0034
住所                    東京都江東区永代8-1-4
住所フリガナ            トウキョウトコウトウクエイタイ
性別                    女
血液型                  AB
生年月日                1980/07/31
電話番号                03-3060-4716
携帯番号                090-7787-3784
メール                  sk@eaccess.net
--------------------------------------------
id                      3
名前                    西村 有紀子
名前フリガナ            ニシムラ ユキコ
郵便番号                635-0805
住所                    奈良県北葛城郡広陵町萱野5-2-7 ヴェルテックス萱野 1009
住所フリガナ            ナラケンキタカツラギグンコウリョウチョウカヤノ
性別                    女
血液型                  O
生年月日                1972/12/05
電話番号                0745-67-2723
携帯番号                090-5165-2074
メール                  okikuy1972@livedoor.com
--------------------------------------------
id                      7
名前                    村松 希美江
名前フリガナ            ムラマツ キミエ
郵便番号                616-8151
住所                    京都府京都市右京区太秦帷子ヶ辻町6-6-7
住所フリガナ            キョウトフキョウトシウキョウクウズマサカタビラノツジチョウ
性別                    女
血液型                  O
生年月日                1980/11/21
電話番号                075-727-1789
携帯番号                090-4849-6939
メール                  kimie.muramatu@odn.ne.jp
--------------------------------------------
id                      10
名前                    鎌田 敏美
名前フリガナ            カマタ トシミ
郵便番号                409-0115
住所                    山梨県上野原市松留4631
住所フリガナ            ヤマナシケンウエノハラシマツドメ
性別                    女
血液型                  B
生年月日                1993/06/09
電話番号                0554-03-0156
携帯番号                090-5690-8749
メール                  kamata0609@example.com
--------------------------------------------
id                      17
名前                    高田 紀子
名前フリガナ            タカタ トシコ
郵便番号                654-0067
住所                    兵庫県神戸市須磨区離宮西町4-2-2
住所フリガナ            ヒョウゴケンコウベシスマクリキュウニシチョウ
性別                    女
血液型                  B
生年月日                1994/11/06
電話番号                078-547-5651
携帯番号                070-8120-1066
メール                  okisotokisot@example.com
--------------------------------------------
id                      20
名前                    北川 梨華
名前フリガナ            キタカワ リカ
郵便番号                171-0033
住所                    東京都豊島区高田3-10-1
住所フリガナ            トウキョウトトシマクタカダ
性別                    女
血液型                  A
生年月日                1980/12/25
電話番号                03-3658-2663
携帯番号                090-1407-6777
メール                  akir1710033@yahoo.co.jp
--------------------------------------------
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go言語でロックファイルを利用した多重起動防止サンプル

Go言語のバッチ等で、ロックファイルを利用した多重起動防止のサンプル実装です。

アプリケーションルートのディレクトリ配下の/utilディレクトリに置かれる想定で、~/go/src//util/を除いたディレクトリ名のハイフン区切りをロックファイル名にしています。

ex.) ~/go/src/example/lockfile/util/lockfile.goの場合
ロックファイルは ~/go/src/example/lockfile/example-lockfile.lock

利用例

main.go
package main

import (
    "lockfile/util"
    "os"
)

func main() {
    os.Exit(execute())
}

func execute() int {
    util.Setlock()
    defer util.Unlock()

    // do process

    return 0
}

ソースコード

util/lockfile.go
package util

import (
    "errors"
    "io/ioutil"
    "os"
    "path/filepath"
    "runtime"
    "strings"
    "sync"
)

const separator string = string(filepath.Separator)
const srcDir string = "src" + separator

var lockfile string
var once = new(sync.Once)

// Setlock lock by creating lockfile
func Setlock() (string, error) {
    once.Do(func() {
        lockfile = lockfilePath()
    })
    return lockfile, lock(lockfile)
}

// Unlock unlock by removing lockfile
func Unlock() error {
    if !exists(lockfile) {
        return errors.New("not running about: " + lockfile)
    }
    return os.Remove(lockfile)
}

func lockfilePath() string {
    _, filename, _, _ := runtime.Caller(0)
    rootDir := filepath.Dir(filename)[:strings.Index(filename, separator+"util")]
    packageName := rootDir[strings.Index(rootDir, srcDir)+len(srcDir):]
    lockfileName := strings.ReplaceAll(packageName, separator, "-") + ".lock"
    return filepath.Join(rootDir, lockfileName)
}

func exists(filepath string) bool {
    _, err := os.Stat(filepath)
    return !os.IsNotExist(err)
}

func lock(lockfile string) error {
    if exists(lockfile) {
        return errors.New("already running with: " + lockfile)
    }
    return ioutil.WriteFile(lockfile, []byte(""), 0644)
}

簡易テスト

util/lockfile_test.go
package util

import (
    "io/ioutil"
    "os"
    "path/filepath"
    "runtime"
    "strings"
    "testing"
)

func TestFilename(t *testing.T) {
    lockfilePath := lockfilePath()
    if filepath.Base(lockfilePath) != "lockfile.lock" {
        t.Errorf("lockfilePath() = %s; want basename=lockfile.lock", lockfilePath)
    }
    _, filename, _, _ := runtime.Caller(0)
    rootDir := filepath.Dir(filename)[:strings.Index(filename, "/util")]
    if filepath.Dir(lockfilePath) != rootDir {
        t.Errorf("lockfilePath() = %s; want dirpath=$GOPATH/src/path/to/lockfile", lockfilePath)
    }
}

func TestSetlock(t *testing.T) {
    if lockfilePath, err := Setlock(); err != nil {
        t.Errorf("cannot lock by creating lockfile: %s", lockfilePath)
    }
    _, err := Setlock()
    if err == nil {
        t.Errorf("error shoud occurs with existing lockfile")
    }
    os.Remove(lockfilePath())
}

func TestUnlock(t *testing.T) {
    lockfilePath := lockfilePath()
    ioutil.WriteFile(lockfilePath, []byte(""), 0644)
    if err := Unlock(); err != nil {
        t.Errorf("cannot unlock by removing lockfile: %s", lockfilePath)
    }
    err := Unlock()
    if err == nil {
        t.Errorf("error shoud occurs with no lockfile")
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Golang on DockerでEchoを動かす

TL;DR

Docker上でGolangのWebフレームワークであるEchoを動かしてみました。

DockerでGolang環境の構築

FROM golang:1.13.6-alpine

WORKDIR /go/src

COPY ./src /go/src

RUN apk update && apk add git
#RUN go get -u github.com/labstack/echo/...

dockerfile内のgo get -u github.com/labstack/echo/...が実行出来なかったのは何故だろう。。。

docker-compose.yml
version: '3'
services:
  app:
    build: .
    ports:
      - 8080:8080
    volumes:
      - ./src:/go/src
    tty: true
$ mkdir src
src/server.go
package main

import (
    "net/http"
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, Echo World!!")
    })
    e.Logger.Fatal(e.Start(":8080"))
}
$ docker-compose build
$ docker-compose up -d

Echoのインストール

https://echo.labstack.com/
https://echo.labstack.com/guide

$ docker-compose exec app go get -u github.com/labstack/echo/...
$ docker-compose exec app go run server.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.13
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8080

スクリーンショット 2020-01-13 15.07.08.png

出来ました:beer:
本当はdocker-compose up -dだけでEchoの実行までいきたいんですがね。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go + gin-gonic + Vue で作るWebアプリの始め方

この記事では Goとgin-gonic (Go の Web Application Framework) および webpack と Vue を使ってWebアプリを作る際の初期環境の構築方法について説明します。自分自信、webpackやVueのプロではないので、もっといい方法などあればコメント歓迎です。なおこの工程でできる完成品は https://github.com/m-mizutani/web-app-go に置いてあります。

構築手順

webpack周りの設定

最初にyarnのパッケージを諸々追加します。 yarn init するとパッケージの内容についていろいろ聞かれるのでよしなに入力します。

$ yarn init
$ yarn add -D @babel/cli @babel/core @babel/preset-env babel-loader webpack webpack-cli webpack-dev-server html-webpack-plugin vue-loader vue-template-compiler css-loader vue-style-loader sass-loader
$ yarn add babel-polyfill vue  node-sass axios

そのあと、 webpack.config.js を作成します。スタイルシートにはSCSSを使うことを想定しています。 ./static がデプロイ用ファイルの置き場、./src が元のJavaScriptやスタイルシートを格納するディレクトリです。

const path = require('path');
const VueLoaderPlugin = require("vue-loader/lib/plugin");

module.exports = {
  mode: "development",
  entry: ["babel-polyfill", path.resolve("src", "js", "index.js")],
  output: {
    filename: "bundle.js",
    path: path.join(__dirname, "static/js/"),
    publicPath: "/js"
  },
  module: {
    rules: [
      {
        test: /\.vue$/,
        loader: "vue-loader"
      },
      {
        test: /\.js$/,
        loader: "babel-loader"
      },
      {
        test: /\.s[ac]ss$/i,
        use: [
          // Creates `style` nodes from JS strings
          'vue-style-loader',
          // Translates CSS into CommonJS
          'css-loader',
          // Compiles Sass to CSS
          'sass-loader',
        ],
      }
    ]
  },
  resolve: {
    extensions: [".js", "json", "jsx", "vue"],
    alias: {
      vue$: "vue/dist/vue.esm.js"
    }
  },
  devServer: {
    contentBase: "static",
    proxy: {
      "/api": "http://localhost:9080"
    }
  },
  plugins: [new VueLoaderPlugin()]
};

最後の方に書いてあるとおり、 /api/* に対してはgoで書いたserverにproxyさせます。

さらに、npm からコマンド実行できるように package.json に以下の項目を追加しておきます。

  "scripts": {
    "start": "webpack-dev-server",
    "build": "webpack --optimize-minimize"
  },

Web関連のコードを追加

以下のファイルを初期ファイルとして配置します。 "This is test" というボタンをクリックするとAjaxでJSONをAPIサーバから取得して、その中の message という項目を表示するというシンプルなものです。

  • src/css/main.scss
  • src/js/index.js
  • src/js/app.vue
  • static/index.html

main.scss

body {
  font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif;
}

index.js

import '../css/main.scss'

import _ from 'lodash';
import "babel-polyfill";
import Vue from "vue";

import App from "./app.vue";

new Vue({
    el: "#app",
    render: h => h(App)
});

app.vue

<template>
  <div>
    <div>MyApp</div>
    <button v-on:click="showMessage">This is test</button>
    <div>{{message}}</div>
  </div>
</template>
<script>
import axios from "axios";
const appData = {
  message: ""
};
export default {
  data() {
    return appData;
  },
  methods: {
    showMessage: showMessage
  }
};
function showMessage() {
  axios.get("/api/v1/hello").then(res => {
    console.log(res);
    appData.message = res.data.message;
  });
}
</script>
<style>
</style>

index.html

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>MyApp</title>
  </head>
  <body>
    <div id="app"></div>
    <script src="/js/bundle.js"></script>
  </body>
</html>

Goのサーバを書く

Goのモジュールを初期化します。パッケージ名は github.com/m-mizutani/web-app-go という想定ですので必要に応じて置き換えます。

$ go mod init github.com/m-mizutani/web-app-go

そのあと main.go をレポジトリのトップディレクトリに作成します。

package main

import (
    "fmt"
    "os"

    "github.com/gin-contrib/static"
    "github.com/gin-gonic/gin"
    "github.com/sirupsen/logrus"
)

var logger = logrus.New()

var logLevelMap = map[string]logrus.Level{
    "trace": logrus.TraceLevel,
    "debug": logrus.DebugLevel,
    "info":  logrus.InfoLevel,
    "warn":  logrus.WarnLevel,
    "error": logrus.ErrorLevel,
}

type arguments struct {
    LogLevel       string
    BindAddress    string
    BindPort       int
    StaticContents string
}

func runServer(args arguments) error {
    level, ok := logLevelMap[args.LogLevel]
    if !ok {
        return fmt.Errorf("Invalid log level: %s", args.LogLevel)
    }
    logger.SetLevel(level)
    logger.SetFormatter(&logrus.JSONFormatter{})

    logger.WithFields(logrus.Fields{
        "args": args,
    }).Info("Given options")

    r := gin.Default()

    r.Use(static.Serve("/", static.LocalFile(args.StaticContents, false)))
    r.GET("/api/v1/hello", func(c *gin.Context) {
        c.String(200, `{"message":"hello, hello, hello"}`)
    })

    if err := r.Run(fmt.Sprintf("%s:%d", args.BindAddress, args.BindPort)); err != nil {
        return err
    }

    return nil
}

func main() {
    args := arguments{
        LogLevel: "info",
        BindAddress: "0.0.0.0",
        BindPort: 9080,
        StaticContents: "./static",
        }

    if err := runServer(args); err != nil {
        logger.WithError(err).Fatal("Server exits with error")
    }
}

開発

Goサーバを動かす

go run . でも起動しますが、開発のためにhot reloadができると便利なので
air を使います。 .air.conf という設定ファイルを用意します。以下サンプルです。

[build]
include_ext = ["go"]
exclude_dir = ["src", "tmp", "node_modules"]
delay = 1000 # ms
stop_on_error = true
log = "air_errors.log"

ファイルを作成したら以下の通り実行します。

$ air -c .air.conf

Webpack dev server を動かす

こちらはデフォルトでホットリロードに対応してくれているので、そのまま webpack-dev-server を起動します。 package.json の script の項目を記述していれば、以下のコマンドで起動します。

$ npm run start

サーバが起動したら http://localhost:8080 を開くことで

デプロイ

Goのバイナリ + ./static 以下のファイルを対象サーバにコピーしたり、Docker image 化してpushしたりとすることで、デプロイできます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む