20200318のGoに関する記事は3件です。

兵庫県のCOVID19感染者状況のGraphQL APIを公開してみた。

どんなAPIにしたか

3分ごとに
↓↓↓よりエクセルファイルをダウンロードし
https://web.pref.hyogo.lg.jp/kk03/corona_kanjyajyokyo.html
読み込んだデータをDBに書き込みます。
別のコンテナにgraphQLサーバーを用意して配信します。

コンテナ構成

  • DB自動書き込み用コンテナ(pythonで実装)
  • GraphQLサーバー(Goで実装)

ところが、残念ながら...(2020/3/18)

リリース後
定期実行される
pythonが読み込んでいる
エクセルファイルに想定外の変更が
before
スクリーンショット 2020-03-18 17.12.10.png

after
画像の通りなんと空のセルで表現した二重線が追加されてしまいました。
ここに想定外のnullが発生してエラーが発生してしまい。
エクセルのデータをDBに書き込めないという状態になりました。
スクリーンショット 2020-03-18 17.12.24.png

まぁ、担当の方が思いつくままに作っておられるであろうエクセルファイル仕方ありませんね。
なので、残念ながら3月16日までのデータしか提供できない状態となってしまいました。
残念!

修正して公開しなおしました!(2020/3/19)

pythonのcronとgraphQLを組み合わせたサービスの実験に...
くらいのテンションで作ってみたapiだったので
さらっと諦めかけていたのですが
上述のエクセルの空のカラム問題
なんのことは無い
空のカラムは読み飛ばせばいいじゃ無いかという事で
修正したらいけました。

https://hyogo.covid19-api.ga
GraphQLのプレイグラウンドも公開しています。
https://hyogo.covid19-api.ga/playground
一応、ソースコードも
https://github.com/inadati/hyogo-covid19-api.services

Playgroundでapiを試す

エクセルの表のヘッダーとGraphQLのフィールドの関連がこちらです。
スクリーンショット 2020-03-19 13.35.32.png
こんな感じのクエリを投げると...

query{
  readInfectedPeoples{
    no
    confirmed_date
    age_group
    sex
    jurisdiction
    residence
    occupation
    onset_date
    travel_history
    remarks
    infected_places{
      name
      is_relation
    }
  }
}

こんな感じで返ってきます。
エクセルの「認定こども園」以降のカラムはinfected_places(感染場所)でリスト取得できます。
詳しくは、プレイグラウンドのDOCSタブで確認してみてください。

{
  "data": {
    "readInfectedPeoples": [
      {
        "no": 86,
        "confirmed_date": "2020-03-17T00:00:00Z",
        "age_group": 70,
        "sex": "女性",
        "jurisdiction": "伊丹",
        "residence": "伊丹健康福祉事務所管内",
        "occupation": "無職",
        "onset_date": "03月07日",
        "travel_history": "なし",
        "remarks": "介護老人保健施設グリーンアルス伊丹デイケアを利用",
        "infected_places": [
          {
            "name": "認定こども園",
            "is_relation": false
          },
          {
            "name": "北播磨医療センター",
            "is_relation": false
          },
          {
            "name": "グリーンアルス",
            "is_relation": true
          },
          {
            "name": "宝塚第一病院",
            "is_relation": false
          },
          {
            "name": "仁恵病院",
            "is_relation": false
          },
          {
            "name": "介護保険通所事業所",
            "is_relation": false
          },
          {
            "name": "海外渡航者",
            "is_relation": false
          },
          {
            "name": "ライブ関係",
            "is_relation": false
          }
        ]
      },
      ...
    ]
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

お前らのGo環境は間違っている!GOPATHからの解放。

Welcome Gopher

Gopherの皆さんこんにちは。

Goの環境構築をより使いやすく、そしてシンプルにするためにこの記事を書きました。

Goの環境構築時に、GOPATHを設定した方が対象です。

GOPATHからの開放

Goの開発環境を構築する際に、GOPATHを設定する記事が散見されます。

しかし、時代は変わるもの、Goのエコシステムも大きく変わろうとしています。

長い間Goの環境を支えてきたGOPATHも、Go 1.13からは廃止されたようです(たぶん)

Goのブログにも記載されています

Our aim is for Go 1.13, scheduled for August 2019, to enable module mode by default (that is, to change the default from auto to on) and deprecate GOPATH mode. In order to do that, we’ve been working on better tooling support along with better support for the open-source module ecosystem.

GOPATHに変わり、GO 1.11から実装されたmoduleが今後のGoの開発には大きく貢献していくでしょう。

これから、Go開発に乗り出そうとする人は過去の栄光を捨て去り、これまでGoで開発してきた人は既存プロジェクトの様子を見ながら新しいGoのエコシステムに乗り換えましょう。

Goプロジェクトにmoduleを導入

と言っても、環境構築をさらに楽するために導入されたmoduleなので、導入も驚くほど簡単です。
より詳しい情報は、公式ページを確認してください

Goのインストール

On Mac

terminal
$ brew install go

プロジェクトのセットアップ

GOPATH以外のディレクトリで、プロジェクトを作成します。

と言うのも、GOPATH以下のディクトリでは、moduleは無効になっています。
GOPATHを指定していない場合、デフォルトでは,$HOME/goになっているので、それ以外のディレクトリでプロジェクトを作ります。

terminal
$ mkdir go-module-env

$ cd go-module-env

Go moduleの導入

モジュール名、もしくはプロジェクト名でmoduleを初期化します。

terminal
$ go mod init go-module-env
go: creating new go.mod: module go-module-env

ソースコードの作成

ソースコードを用意します。

以下のコードは、Goの軽量Webフレームワークで、サーバーに送られるリクエストをリッスンして、JSONを返すだけの簡単なwebアプリです。
main.goに、Ginを使用したコードおを書きましょう。
(ソースコードは、Ginのリポジトリからお拝借)

terminal
$ echo 'package main
import "github.com/gin-gonic/gin"
func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run() 
}' > main.go

or

terminal
$ touch main.go
main.go
package main
import "github.com/gin-gonic/gin"
func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run() 
}

Build!!!

ビルドしましょう!

terminal
$ go build
go: finding module for package github.com/gin-gonic/gin
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.5.0

ちなみに、go.modを見ると、パッケージとその依存関係を確認できます。

terminal
$ cat go.mod
module go-module-env

go 1.14

require github.com/gin-gonic/gin v1.5.0

Goのバージョンがgo 1.14で、gin v1.5.0の依存関係を明示しています。

Run!!!

ビルドで作成された実行ファイルを使い、ソースコードを実行します。

terminal
$ ./go-module-env
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

実行時に、ネットワークへの接続の許可お画面が表示されます。
「許可」で許可しましょう。
スクリーンショット 2020-03-18 8.55.55.png

これで、全ての準備が整いました。
http://localhost:8080/ping にアクセスしてみましょう。

スクリーンショット 2020-03-18 9.13.24.png

JOSN形式で、レスポンスが返ってきてました。

では、ターミナルを見てみましょう。

terminal
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2020/03/18 - 09:13:11 | 200 |     236.388µs |             ::1 | GET      /ping

先ほどのコマンドの一番下に、/pingへのGETリクエストを取得して、200ステータスを返していることが確認できました。

これで、Go moduleを使ったGoプロジェクトの作成が終わりました。

うむ、簡単である

Happy Hacking :sunglasses: !

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

お前らのGo開発環境は間違っている!GOPATHからの解放。

Welcome Gopher

Gopherの皆さんこんにちは。

Goの環境構築をより使いやすく、そしてシンプルにするためにこの記事を書きました。

Goの環境構築時に、GOPATHを設定した方が対象です。

GOPATHからの開放

Goの開発環境を構築する際に、GOPATHを設定する記事が散見されます。

しかし、時代は変わるもの、Goのエコシステムも大きく変わろうとしています。

長い間Goの環境を支えてきたGOPATHも、Go 1.13からは廃止されたようです(たぶん)

Goのブログにも記載されています

Our aim is for Go 1.13, scheduled for August 2019, to enable module mode by default (that is, to change the default from auto to on) and deprecate GOPATH mode. In order to do that, we’ve been working on better tooling support along with better support for the open-source module ecosystem.

GOPATHに変わり、GO 1.11から実装されたmoduleが今後のGoの開発には大きく貢献していくでしょう。

これから、Go開発に乗り出そうとする人は過去の栄光を捨て去り、これまでGoで開発してきた人は既存プロジェクトの様子を見ながら新しいGoのエコシステムに乗り換えましょう。

Goプロジェクトにmoduleを導入

と言っても、環境構築をさらに楽にするために導入されたmoduleなので、導入も驚くほど簡単です。
より詳しい情報は、公式ページを確認してください

Goのインストール

On Mac

terminal
$ brew install go

プロジェクトのセットアップ

GOPATH以外のディレクトリで、プロジェクトを作成します。

と言うのも、GOPATH以下のディクトリでは、moduleは無効になっています。
GOPATHを指定していない場合、デフォルトでは,$HOME/goになっているので、それ以外のディレクトリでプロジェクトを作ります。

terminal
$ mkdir go-module-env

$ cd go-module-env

Go moduleの導入

モジュール名、もしくはプロジェクト名でmoduleを初期化します。

terminal
$ go mod init go-module-env
go: creating new go.mod: module go-module-env

ソースコードの作成

ソースコードを用意します。

以下のコードは、Goの軽量WebフレームワークGinを用いた、サーバーに送られるリクエストをリッスンして、JSONを返すだけの簡単なwebアプリです。
main.goに、Ginを使用したコードを書きましょう。
(ソースコードは、Ginのリポジトリからお拝借)

terminal
$ echo 'package main
import "github.com/gin-gonic/gin"
func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run() 
}' > main.go

or

terminal
$ touch main.go
main.go
package main
import "github.com/gin-gonic/gin"
func main() {
        r := gin.Default()
        r.GET("/ping", func(c *gin.Context) {
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        r.Run() 
}

Build!!!

ビルドしましょう!

terminal
$ go build
go: finding module for package github.com/gin-gonic/gin
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.5.0

ちなみに、go.modを見ると、パッケージとその依存関係を確認できます。

terminal
$ cat go.mod
module go-module-env

go 1.14

require github.com/gin-gonic/gin v1.5.0

Goのバージョンがgo 1.14で、gin v1.5.0の依存関係を明示しています。

Run!!!

ビルドで作成された実行ファイルを使い、ソースコードを実行します。

terminal
$ ./go-module-env
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

実行時に、ネットワークへの接続の許可の画面が表示されます。
「許可」で許可しましょう。
スクリーンショット 2020-03-18 8.55.55.png

これで、全ての準備が整いました。
http://localhost:8080/ping にアクセスしてみましょう。

スクリーンショット 2020-03-18 9.13.24.png

JOSN形式で、レスポンスが返ってきました。

では、ターミナルを見てみましょう。

terminal
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2020/03/18 - 09:13:11 | 200 |     236.388µs |             ::1 | GET      /ping

先ほどのコマンドの一番下に、/pingへのGETリクエストを取得して、200ステータスを返していることが確認できました。

これで、Go moduleを使ったGoプロジェクトの作成が終わりました。

うむ、簡単である

Happy Hacking :sunglasses: !

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