- 投稿日:2020-03-21T19:29:58+09:00
Progate無料版をやってみる【Go】
前回に引き続きProgate無料レッスンをやっていこうと思います。
今回はGoです。
Googleが開発したプログラミング言語です。
Go
環境構築
公式からダウンロード
IDEは最近使用しているVSCodeでいこうかなと・・・。
インストール後、Getting Startedを行います。
どうやら環境変数に「c:\Go\bin」(c:\Goにインストールした場合)を追加する必要があるようです。→ 確認したところ、すでに入ってました・・・。
VSCodeのGoプラグイン
https://code.visualstudio.com/docs/languages/goGoに触れてみよう
・Progateを真似て、
main.go
を適当なディレクトリに作成し、VSCodeでディレクトリを開きます。main.go
package main func main() { // 下記の「世界」の部分を「Go」に書き換えてください println("Hello, Go") }
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) }変数とエラー
・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("大吉です") } }感想
どこかのサイトにも書いてあったんですが、コンパイル言語 C、C++、C#、javaとインタープリタ言語 Ruby、Python、JavaScript等のいいところを合わせた感じがしました!
あれ?for文等のループがレッスンで出てこなかったけど・・・。
有料のレッスンにあるんでしょうね。
ただ、ネットに無料でたくさん情報はありますから無理に課金しなくてもいいですね。他のプログラミング教育サイト、ドットインストールとかどうなんだろう。
次回はReactをやっていきたいと思います。
Vue.jsやKnockout.jsならやったことあるんですけどね・・・。
Reactはより難しいって聞いたことがあります・・・汗
間違えた・・・AngularJSと勘違いしてましたw→ 次回
- 投稿日:2020-03-21T14:36:12+09:00
忙しい人のための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/233520CMS
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/8e5342d8a30ae8f34dffgoroutine ゴルーチン 並行処理させたい関数 go func()
channel 関数同士で受け渡しするために使う
waitGroup 同期させるために使う1万リクエスト
https://qiita.com/Azunyan1111/items/a1b6c58dc868814efb51理
https://qiita.com/suin/items/82ecb6f63ff4104d4f5d
https://note.com/akikun2020/n/nbe945100f3a0感想
並行処理おもしろーい
- 投稿日:2020-03-21T13:11:57+09:00
兵庫県のCOVID19感染者状況のGraphQL APIを公開してみた。(その2)
宣伝
兵庫県のコロナウイルス特設サイトが公開中
https://stop-covid19-hyogo.org/
僕の公開しているGraphQL APIとは今のところ別働で動いていますが
かなり参考にさせて頂いておりますのでご紹介しておきます。hyogo.covid19-api
api内訳
- readInfectedPeoples
- readExamOverviews
- readExamDetails
- readPCROverviews(2020/3/23 追加)
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 全フィールド取得クエリ例
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からデータを取得し配信しています。全フィールド取得クエリ例
query{ readExamOverviews{ no label count } }readExamDetails
https://web.pref.hyogo.lg.jp/kf16/singatakoronakensa.html
上記のバーチャート下部のテーブルタグを30分おきにスクレイピング
抽出したデータをPostgreSQLにデータを挿入します。
gqlgenで立てたGraphQLサーバーでgormを使ってPostgreSQLからデータを取得し配信しています。全フィールド取得クエリ例
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)形式で保存しています。
ちなみに、サイトのデータが更新されるまでは前日公表分のデータと同様のデータを返します。全フィールド取得クエリ例
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に興味が出てきた。
- 投稿日:2020-03-21T09:06:36+09:00
Goのreturn記録
Goのreturnについて学んだので、備忘録としてまとめます。
main.gopackage 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) }
- 投稿日:2020-03-21T01:36:12+09:00
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のソース直さないと・・・^^;
- 投稿日:2020-03-21T01:36:12+09:00
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のソース直さないと・・・^^;