20200321のGoに関する記事は6件です。

Progate無料版をやってみる【Go】

前回に引き続きProgate無料レッスンをやっていこうと思います。

今回はGoです。

Googleが開発したプログラミング言語です。

Go

公式レッスン

環境構築

公式からダウンロード

IDEは最近使用しているVSCodeでいこうかなと・・・。

インストール後、Getting Startedを行います。
どうやら環境変数に「c:\Go\bin」(c:\Goにインストールした場合)を追加する必要があるようです。

→ 確認したところ、すでに入ってました・・・。

VSCodeのGoプラグイン
https://code.visualstudio.com/docs/languages/go

Goに触れてみよう

・Progateを真似て、main.goを適当なディレクトリに作成し、VSCodeでディレクトリを開きます。

main.go

package main

func main() {
    // 下記の「世界」の部分を「Go」に書き換えてください
    println("Hello, Go")
}

実行結果
image.png

packageだったり、printlnだったり、javaで見たような・・・。
でもセミコロン;はいらない。

GoのFormat

・普通にCtrl + Sでフォーマットされた。
 Goの拡張入れたときに、画面の右下にポップアップがでてきて2個くらいインストールしたからそれかもしれない・・・。

Goの基本

・コメントはC#やjavaと同様で///* */

数値、数値の計算

・おなじみの+ - * / %

文字列の連結

・同じみ+

変数の基本

・Goもvarで型推論

変数の更新

・おなじみ。変数上書き。

色々な変数の作り方

:=200などと初期化できる。

package main

func main() {
    // 変数messageを省略して定義し、"Hello, 世界"を代入してください
    message := "Hello, 世界"

    // 変数numberを省略して定義し、100を代入してください
    number := 100

    // 変数messageと変数numberを同時に出力してください
    println(message, number)

}

image.png

変数とエラー

・Goでは未使用変数はエラーになるとのこと。

変数と自己代入

・おなじみの+= -=++ --

if文を使ってみよう

・Goでは条件のところに()は必要ないが、ブロック{}は必要。

真偽値

・イコールが==
 Notが!=

else

・おなじみの・・・。

else if

・Goの場合、else ifのところは、else と ifが連続で書かれているだけではなさそう。
ifの後のブロック{}を省略することができなかった。

条件式を組み合わせよう

・かつ → &&
・または → ||
・否定 → !

java、C#、JavaScriptと一緒かな?
PHPどうだったか忘れた・・・汗

switch

・他言語と異なって、break;がいらない。
 また、またはの条件を,で区切って記述できる。

package main

func main() {
    n := 3
    switch n {
        // caseを追加し、nが0の場合、"凶です"と出力してください
        case 0:
            println("凶です")

        // caseを追加し、nが1または2の場合、"吉です"と出力してください
        case 1, 2:
            println("吉です")

        // caseを追加し、nが3または4の場合、"中吉です"と出力してください
        case 3, 4:
            println("中吉です")

        // caseを追加し、nが5の場合、"大吉です"と出力してください
        case 5:
            println("大吉です")
    }
}

クリアしました
image.png

感想

どこかのサイトにも書いてあったんですが、コンパイル言語 C、C++、C#、javaとインタープリタ言語 Ruby、Python、JavaScript等のいいところを合わせた感じがしました!

あれ?for文等のループがレッスンで出てこなかったけど・・・。
有料のレッスンにあるんでしょうね。
ただ、ネットに無料でたくさん情報はありますから無理に課金しなくてもいいですね。

他のプログラミング教育サイト、ドットインストールとかどうなんだろう。

次回はReactをやっていきたいと思います。

Vue.jsやKnockout.jsならやったことあるんですけどね・・・。
Reactはより難しいって聞いたことがあります・・・汗
間違えた・・・AngularJSと勘違いしてましたw

→ 次回

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

忙しい人のためのGo入門

とりあえうz、Go始めてみようかなと思った人向け

忙しい人のためのGo入門

そもそもGoとは

Goは,2009年にGoogleにより発表されたオープンソースのプログラミング言語です。

Goの特徴は

シンプルな言語仕様,型システム,並行処理

おすすめの講座

progate Go講座

https://prog-8.com/languages/go

dotinstall Go入門

サンプルアプリ

Goでアプリケーションを作る講座
https://rightcode.co.jp/blog/information-technology/golang-introduction-environment-1

基本的な文法(公式ドキュメント)

http://golang.jp/category/%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88

↓もわかりやすい
http://gihyo.jp/dev/feature/01/go_4beginners

ユニットテスト

https://qiita.com/keiichi-hikita/items/ae241bd8c710bbfdf0a8
https://www.tweeeety.blog/entry/2018/01/22/233520

CMS

Ketchup
https://github.com/ketchuphq/ketchup

フレームワーク

こちらの記事が詳しい。
https://qiita.com/yumin/items/5de33b068ead564ebcbf

テンプレートエンジン

こちらの記事が詳しい。
https://qiita.com/kamina/items/58e5290ff0f569a76331

ライブラリ

https://github.com/avelino/awesome-go

並行処理

https://qiita.com/suin/items/82ecb6f63ff4104d4f5d
https://qiita.com/gold-kou/items/8e5342d8a30ae8f34dff

goroutine ゴルーチン 並行処理させたい関数 go func()
channel 関数同士で受け渡しするために使う
waitGroup 同期させるために使う

1万リクエスト
https://qiita.com/Azunyan1111/items/a1b6c58dc868814efb51理
https://qiita.com/suin/items/82ecb6f63ff4104d4f5d
https://note.com/akikun2020/n/nbe945100f3a0

 感想

並行処理おもしろーい

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

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

宣伝

兵庫県のコロナウイルス特設サイトが公開中
https://stop-covid19-hyogo.org/
僕の公開しているGraphQL APIとは今のところ別働で動いていますが
かなり参考にさせて頂いておりますのでご紹介しておきます。

hyogo.covid19-api

GraphQLプレイグラウンド

api内訳

readInfectedPeoples

感染者情報一覧取得クエリ
https://web.pref.hyogo.lg.jp/kk03/corona_kanjyajyokyo.html
上記のページに掲載されている感染者情報のエクセルファイルを30分おきに
コンテナ内にダウンロード。
そのファイルを読み込みPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。

GraphQLのフィールドとエクセルファイルとの関連
エクセルの「認定こども園」以降のデータはcluster_placesというサブコレクションクエリで読み込めます。

番号 確認日 年代 性別 管轄 居住地 職業 発症日 渡航歴 備考欄
no confirmed_date age_group sex jurisdiction residence occupation onset_date travel_history remarks

取得例
スクリーンショット 2020-03-21 11.45.05.png

全フィールド取得クエリ例
uuidによるidフィールドもありますがプレイグラウンドで試す際は長すぎて見づらくなるので
ここではidを含めないクエリを貼っておきます。

query{
  readInfectedPeoples{
    no
    confirmed_date
    age_group
    sex
    jurisdiction
    residence
    occupation
    onset_date
    travel_history
    remarks
    cluster_places{
      no
      label
      is_relation
    }
  }
}

readExamOverviews

https://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html
上記のページ、「発生状況」すぐ下のpdfファイルを30分おきに
コンテナ内にダウンロード。
そのファイルを読み込みPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。

関連しているデータ
スクリーンショット 2020-03-21 12.02.12.png

取得例
スクリーンショット 2020-03-21 12.42.04.png

全フィールド取得クエリ例

query{
  readExamOverviews{
    no
    label
    count
  }
}

readExamDetails

https://web.pref.hyogo.lg.jp/kf16/singatakoronakensa.html
上記のバーチャート下部のテーブルタグを30分おきにスクレイピング
抽出したデータをPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。

関連しているデータ
スクリーンショット 2020-03-21 12.59.27.png

取得例
スクリーンショット 2020-03-21 13.01.24.png

全フィールド取得クエリ例

query{
  readExamDetails{
    no
    date
    exam_count
    positive_count
  }
}

readPCROverviews

readExamOverviewsの改善版
2020/3/13までのhttps://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html
のpdf情報を蓄積
ただし、pdfは毎日差し替えられるので
https://web.pref.hyogo.lg.jp/kf16/singatakoronakensa.html の累積情報と
https://covid-hyogo.now.sh から一部データを拝借しております。
(一部、手入力www)
2020/3/23よりデータ蓄積開始しています。
dateフィールドの日付は兵庫県サイトに掲載されているルールに則って前日の日付を
ISO8601(RFC3339)形式で保存しています。
ちなみに、サイトのデータが更新されるまでは前日公表分のデータと同様のデータを返します。

関連しているデータ
スクリーンショット 2020-03-21 12.02.12.png

取得例
スクリーンショット 2020-03-23 10.44.54.png

全フィールド取得クエリ例

query{
  readPCROverviews{
  id
  date
  pcr_total
  pcr_positive_count
  hospitalized_count
  not_serious_count
  serious_count
  death_count
  discharge_count
}
}

まとめ

2020/3/23追記
そろそろ、GraphQLのサブスクリプションにトライしてみようかと
あと、運用回りでいよいよ、CIに興味が出てきた。

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

Goのreturn記録

Goのreturnについて学んだので、備忘録としてまとめます。

main.go
package main

import "fmt"

func add(x, y int) (int, int) {
    return x + y, x - y
}


func main() {
    r1, r2 := add(10, 20)
    fmt.Println(r1, r2)

}

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

aplineのタイムゾーンを設定する

goでtime.Now()するとUTCで困った

なにも考えず(知らずに)にdockerfileを以下のように書いていた

FROM golang:1.13 as builder
WORKDIR /go/src/hoge
ENV GO111MODULE on 
COPY go.mod .
COPY go.sum .
RUN go mod download  
COPY . .

FROM alpine:3.9  
COPY --from=builder /go/src/hoge/main /usr/local/bin/main
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/main"]

するとgoでtime.Now()したときにUTCが帰ってくる
サーバも当然こうなる

/ # date
Fri Mar 20 16:05:22 UTC 2020

WEBアプリはJSTで色々計算したいので無理やりこう書いてやれば変換できる

//jst > utc
jst, _ := time.LoadLocation("Asia/Tokyo")
now := time.Now() //utc
nowJST := now.In(jst).Format("2006/01/02")

と思ったけど

time.LoadLocation("Asia/Tokyo")

ここでzoneinfoが無いとエラーになるので
まずは無理やりmacの中のzoneinfoをコピーして今感じにdockerを修正

FROM alpine:3.9  
COPY --from=builder /go/src/go-larn/main /usr/local/bin/main
#追加
ADD ./Tokyo.tar.gz /  
EXPOSE 8080
ADD ./views /views 
ENTRYPOINT ["/usr/local/bin/main"]

これで無理やりgoでUTCからJSTに変換できるようになる。

と長い前置きはここまで。

dockerを修正してtimezoneを設定

やりたいことは2つ

  • timezoneの設定
  • zonefileの追加
FROM alpine:3.9  
COPY --from=builder /go/src/go-larn/main /usr/local/bin/main
# zonefileの追加
RUN apk add tzdata
# timezoneを
ENV TZ=Asia/Tokyo
EXPOSE 8080
ADD ./views /views
ENTRYPOINT ["/usr/local/bin/main"]

起動後に実際にサーバに入って確認

/ # date
Sat Mar 21 01:27:02 JST 2020

ちゃんと修正されていますね。
あとはgoのソース直さないと・・・^^;

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

alpineのタイムゾーンを設定する

goでtime.Now()するとUTCで困った

なにも考えず(知らずに)にdockerfileを以下のように書いていた

FROM golang:1.13 as builder
WORKDIR /go/src/hoge
ENV GO111MODULE on 
COPY go.mod .
COPY go.sum .
RUN go mod download  
COPY . .

FROM alpine:3.9  
COPY --from=builder /go/src/hoge/main /usr/local/bin/main
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/main"]

するとgoでtime.Now()したときにUTCが帰ってくる
サーバも当然こうなる

/ # date
Fri Mar 20 16:05:22 UTC 2020

WEBアプリはJSTで色々計算したいので無理やりこう書いてやれば変換できる

//jst > utc
jst, _ := time.LoadLocation("Asia/Tokyo")
now := time.Now() //utc
nowJST := now.In(jst).Format("2006/01/02")

と思ったけど

time.LoadLocation("Asia/Tokyo")

ここでzoneinfoが無いとエラーになるので
まずは無理やりmacの中のzoneinfoをコピーして今感じにdockerを修正

FROM alpine:3.9  
COPY --from=builder /go/src/go-larn/main /usr/local/bin/main
#追加
ADD ./Tokyo.tar.gz /  
EXPOSE 8080
ADD ./views /views 
ENTRYPOINT ["/usr/local/bin/main"]

これで無理やりgoでUTCからJSTに変換できるようになる。

と長い前置きはここまで。

dockerを修正してtimezoneを設定

やりたいことは2つ

  • timezoneの設定
  • zonefileの追加
FROM alpine:3.9  
COPY --from=builder /go/src/go-larn/main /usr/local/bin/main
# zonefileの追加
RUN apk add tzdata
# timezoneを
ENV TZ=Asia/Tokyo
EXPOSE 8080
ADD ./views /views
ENTRYPOINT ["/usr/local/bin/main"]

起動後に実際にサーバに入って確認

/ # date
Sat Mar 21 01:27:02 JST 2020

ちゃんと修正されていますね。
あとはgoのソース直さないと・・・^^;

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