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

【Go】本日日付のJST00:00:00をUTC時刻で取得する

概要 日付のデータに関してデータベース上では、UTCで格納しているケースはけっこうあると思います。ただシステムは日本時間(JST)の世界で動いているので、例えばクエリで日付を絞り込むときにJSTの00:00:00から開始したいんだけど、DB上はUTCなのでその昨日日付の15:00:00からのデータが対象となります。 ということで、こういうケースの場合、どうやってGoで日付の実装をしていけば良いのかというのを紹介します。 対応例 取得するデータを日本時間の本日日付という前提で、まずはJSTの本日日付の00:00:00を取得します。Goでtime.Parseを使うときのタイムゾーンについてを参考に、まずは日本時間でtime.Now()を取得し時刻部分の切り捨てを行います。例えば日本時間の2021/5/14に実行した場合は2021-05-14 00:00:00 +0900 Asia/Tokyoと出力されます。 jst := time.FixedZone("Asia/Tokyo", 9*60*60) currentTimeJst, _ := time.ParseInLocation("20060102", time.Now().In(jst).Format("20060102"), jst) fmt.Println(currentTimeJst) では次に、上記で取得した日付をUTC時刻に変換します。日本時間の2021/5/14に実行した場合は2021-05-13 15:00:00 +0000 UTCとなる想定です。実装としては、取得したJST日付でtime.UTC()メソッドを呼べば良いです。 currentTimeUtc := currentTimeJst.UTC() fmt.Println(currentTimeUtc)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mac初心者のGoインストール

Goを使ってみたいと思ったのだ。 環境 MacBook Air (M1, 2020) macOS Big Sur 11.3.1 zsh 制約 M1 Macがネイティブサポートされた、go version 1.6以降を入れたい goenvのインストール Homebrewでインストールしたら最新のGoはサポートされていないようだったので、公式のgitからインストールする。 基本は公式のインストール手順に従う。 goenvのclone % git clone https://github.com/syndbg/goenv.git ~/.goenv 環境変数の設定 % echo 'export GOENV_ROOT="$HOME/.goenv"' >> ~/.zshrc % echo 'export PATH="$GOENV_ROOT/bin:$PATH"' >> ~/.zshrc % echo 'eval "$(goenv init -)"' >> ~/.zshrc % echo 'export PATH="$GOROOT/bin:$PATH"' >> ~/.zshrc % echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.zshrc シェルを立ち上げ直して環境変数を適用する % exec $SHELL goのインストール % goenv install --list % goenv install 1.6.3 % goenv global 1.6.3 % goenv rehash % go version go version go1.16.3 darwin/arm64 備忘録 goenvをupgradeするときはgit pullする $ cd ~/.goenv $ git pull
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go 1.16用Makefile

『改訂2版 みんなのGo言語』のMakefileがGo 1.16では動かなかったので、動くように書き換えました。 フォルダ構成 cmd/myapp/main.goにメインアプリのソースコードが入っている。internalは内部でしか使わないパッケージ、pkgは外部から参照可能なパッケージ。 myproj/ ├── Makefile ├── README.md ├── go.mod ├── bin/ │   └── myapp(ビルド後に生成) ├── cmd/ │   └── myapp/ │   └── main.go ├── internal/ └── pkg/ Makefile # メタ情報 NAME := myproj VERSION := $(gobump show -r) REVISION := $(shell git rev-parse --short HEAD) LDFLAGS := -X 'main.revision=$(REVISION)' export GO111MODULE=on .PHONY: deps deps: go mod tidy # 必要なツール類をセットアップする .PHONY: devel-deps devel-deps: deps go install \ golang.org/x/lint/golint@latest go install \ github.com/x-motemen/gobump/cmd/gobump@latest go install \ github.com/Songmu/make2help/cmd/make2help@latest # テストを実行する ## Run tests .PHONY: test test: deps go test ./... ## Lint .PHONY: lint lint: devel-deps go vet ./... golint --set_exit_status./... ## build binaries ex. make bin/myapp bin/%: cmd/%/main.go deps go build -ldflags "$(LDFLAGS)" -o $@ $< .PHONY: build build: bin/myapp ## Show help .PHONY: help help: @make2help $(MAKEFILE_LIST) 実行手順 # makeで用いるツールのグローバルインストール make devel-deps # バイナリのビルド make build # 実行 ./bin/myapp
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

本の新刊データをJSONで取得できるようにする。

はじめに  コミックやラノベの新刊データ取得で、JSON形式で無料で取得しようとするAPIが見つからなかったので、ゲーム、アニメ、CD発売日一覧というサイトからスクレイピングして、JSONで出力するようなプログラムを作る プログラム概要 ゲーム、アニメ、CD発売日一覧というサイトから、 新刊の発売日、名称、作者、画像が引っ張ってこれるので、これらのデータをJSONで出力するようにする また、実行結果は標準出力するようにする。 プログラム内容 calendarscriping.go package main import ( "fmt" "strings" "github.com/PuerkitoBio/goquery" ) type BookList struct { Type string `json:type` Months string `json:months` Days string `json:days` Img string `json:img` Title string `json:title` Writer string `json:writer` Bround string `json:bround` Ext string `json:ext` } const ( BOOKURL string = "https://calendar.gameiroiro.com/" COMICURL string = "manga.php" LITENOVELURL string = "litenovel.php" MAGAZINEURL string = "magazine.php" ) const ( COMIC = 0 LITENOVEL = 1 MAGAZINE = 2 ) func GetComicList(year, month string, booktype int) []BookList { var output []BookList mounth_tmp := month url := BOOKURL switch booktype { case COMIC: url += COMICURL case LITENOVEL: url += LITENOVELURL case MAGAZINE: url += MAGAZINEURL } if (year != "") && (month != "") { url += "?year=" + year + "&month=" + month } doc, err := goquery.NewDocument(url) if err != nil { fmt.Println(err.Error()) return output } if mounth_tmp == "" { mounth_tmp, _ = doc.Find("input.month").Attr("value") } doc.Find("div#content-inner").Each(func(i int, s *goquery.Selection) { s.Find("tr").Each(func(j int, ss *goquery.Selection) { days := ss.Find("td.day-td").Text() ss.Find("div.div-wrap").Each(func(k int, sss *goquery.Selection) { var tmp BookList tmp.Days = days tmp.Months = mounth_tmp sss.Find("div.product-image-left").Each(func(l int, image *goquery.Selection) { tmp.Img, _ = image.Find("img").Attr("src") }) sss.Find("div.product-description-right").Each(func(k int, data *goquery.Selection) { tmp.Type = strings.TrimSpace(data.Find("p.p-genre").Text()) tmp.Title = strings.TrimSpace(data.Find("a").Text()) data.Find("p.p-company").Each(func(i int, data2 *goquery.Selection) { if tmp.Bround == "" { tmp.Bround = strings.TrimSpace(data2.Text()) } else if tmp.Writer == "" { tmp.Writer = strings.TrimSpace(data2.Text()) } else if tmp.Ext == "" { tmp.Ext = strings.TrimSpace(data2.Text()) } else { tmp.Ext += "," + strings.TrimSpace(data2.Text()) } }) }) output = append(output, tmp) }) }) }) return output } main.go package main import ( "fmt" ) func main(){ fmt.Println(GetComicList("", "", COMIC)) } 実行すると、今月のコミックスの取得結果がJSONで得られる まとめ これらのプログラムを応用して、WebAPIにするとブラウザ処理が楽になる。 また、SQLサーバと連携して、ローカルにキャッシュを持つことで高速化や 細かい出力に変更できるように改造すると楽になる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【祝!初投稿】LINEbotを利用し、GO言語で書いたプログラムから自分のLINEアカウントにメッセージ送信してみた

はじめに はじめまして。初めて投稿します。 何を投稿するか悩んだのですが、少し前からLINEbotを触っていて、色々試していたら 「LINEbotにHTTPリクエストを送ったら、オウム返しで自分のLINEアカウントにメッセージを送れる。」 のがちょっと面白かったので、この内容にしてみました。 LINEbotについて LINEが提供するボットサービスです LINEアカウントをお持ちでしたら、LINE Developersから作成できますので、興味ある方は色々試してみてください LINEbotを使用するための準備 LINEbot用のチャネルを作成(手順はこちら) LINEbot作成(手順はこちら) 作成したプログラム 超絶シンプルな画面から、適当なメッセージを入力して送信ボタンを押すと、 2.LINEに通知されるだけの、簡単かつ特になんの役にも立たないプログラムです。 ソースコードについて ここで紹介しているプログラムはこちらのリポジトリに公開しています。 ●LINEbotメッセージ送信 GO言語用SDKを使用しています。SDKの使い方は左記リンクのREADMEに記載されています。 ほかにもJavaやPHPなどのSDKも提供されているようです。 こちらにリンクがまとめられています。 message.go#LINEbotメッセージ送信部分 // 構造体:LINE接続設定を管理 type LineConfig struct { UserId string `json:"userId"` ChannelSecret string `json:"channelSecret"` ChannelAccessToken string `json:"channelAccessToken"` } // LINEbotメッセージ送信処理 func SendMessage(w http.ResponseWriter, r *http.Request) { // リクエスト値を取得 var message string = r.FormValue("message") // プロパティファイル読み込み var config LineConfig = LoadConfig() // LINEbotオブジェクト初期化(チャネルシークレット、第二引数にチャネルアクセストークンを指定) bot, _ := linebot.New(config.ChannelSecret, config.ChannelAccessToken) var messages []linebot.SendingMessage messages = append(messages, linebot.NewTextMessage(message)) // メッセージ送信(第一引数に宛先、第二引数に送信するメッセージを指定) _, err := bot.PushMessage(config.UserId, messages...).Do() if err != nil { panic(err.Error()) } } func LoadConfig() LineConfig { // 設定ファイルの読み込み file, err := os.Open("resources/conf/config.json") if err != nil { panic(err.Error()) } defer file.Close() var config LineConfig err = json.NewDecoder(file).Decode(&config) if err != nil { panic(err.Error()) } return config } LINEbotのチャネル作成時に発行したチャネルシークレットとチャネルアクセストークンを使用します bot.PushMessage({宛先LINEユーザーID}, {送信するメッセージ}).Do() でメッセージが送信されます 終わりに LINEbotに入門しました。 今回は画面から入力したメッセージをそのまま送信するだけのものでしたが、 天気情報や近隣のスーパーのお買い得情報を通知したりなど、もう少し実用的なものを作成してみたいと思います。(すでにそういうアプリありますが・・) AIボットも面白そうですね。 以上、初投稿でした! 何か少しでも参考になることがあれば嬉しいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む