20210127のGoに関する記事は4件です。

プロキシが影響してGoの環境構築で発生するエラーの対処

プロキシを経由している自社ネットワークで使用している開発マシンにて、VSCodeで実行できる以下コマンドでGoの開発環境を構築しようとした。

Go: Install/Update Tools

ところが以下のようなメッセージが出てインストールが失敗してしまうという状況です。

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

いろいろ調べたので、共有します。

前提条件

VSCode、Gitはインストール済み

対応まとめ

GitHubの設定ファイルにプロキシ設定を追加する

先にこれを実行しましたが、事象は解消されませんでした。

git config --global http.proxy http://proxy-address:proxy-port
git config --global https.proxy http://proxy-address:proxy-port
git config --global http.sslVerify false

VSCodeのsettings.jsonにプロキシの設定を追加する

この対応で「Go: Install/Update Tools」が失敗する事象は改善できました。
先ほど記載したgitのプロキシ設定も依存しているのかは不明です。

{
"http.proxy": "http://proxy-address:proxy-port"
}

感想

実はまだgo getができない状態なので、引き続き調査を進めていきます。

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

このエラーで悩んでいる方に届いてほしいです。

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

緯度経度の情報でポリゴン生成し、GeoJsonに変換してみよう! (Go言語)

はじめに

この記事では、特定の4箇所の緯度経度からポリゴンを生成し、GeoJsonを作成する方法をまとめたものです。
また、使用言語はGoになります。

GeoJsonとは?

GeoJSONとは、JSONを基としたGISデータを記述するためのフォーマットです。
Google mapやOpen street mapなどの地図サービスも対応しているため、読み込ませるだけで、エリアを可視化できたり、ポイントの表示が可能となります。

参考: GIS実習オープン教材

実装

orbライブラリ

今回はGoで実装を行なっていったのですが、緯度経度の情報からポリゴンを作成し、GeoJson形式にしてくれるライブラリがあります。
それがorbライブラリです。
このライブラリ、Stravaでも使われたライブラリのようです。

ポリゴン

ちなみにポリゴンなのですが、GISのポリゴンというのは、ベクトルデータ(すなわち、座標値を持った点のデータ)でを表現したものを指します。

そのため、ポリゴンを作成する際は、最低でも3つの点を必要とします。

また、注意しなければならないのは、下記のコードのように最初のポイントの緯度経度を最後にポイントとして指定しなければなりません。こうすることで、面を表現できる。

p := orb.Polygon{{{Lng1, Lat1}, {Lng2, Lat2}, {Lng3, Lat3}, {Lng4, Lat4},{Lng1, Lat1}}}
main.go
package main

import (
    "github.com/paulmach/orb"
    "github.com/paulmach/orb/geojson"
)

func main() {
    convertGeojeson(35.681, 139.77496, 35.68563, 139.76234,35.67681, 139.76002,35.6751, 139.77165)
}

func convertGeojeson(Lat1 float64, Lng1 float64, Lat2 float64, Lng2 float64,  Lat3 float64, Lng3 float64,  Lat4 float64, Lng4 float64) {

    name := "エリア"
    // ポリゴンの作成
    p := orb.Polygon{{{Lng1, Lat1}, {Lng2, Lat2}, {Lng3, Lat3}, {Lng4, Lat4},{Lng1, Lat1}}}

    // geojsonの作成
    c := geojson.NewFeatureCollection()
    gp := geojson.NewFeature(p)
    gp.Properties["name"] = name

    c = c.Append(gp)
    b, _ := c.MarshalJSON()
    println(string(b))
}
実行結果.geojson
{
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            139.77496,
                            35.681
                        ],
                        [
                            139.76234,
                            35.68563
                        ],
                        [
                            139.76002,
                            35.67681
                        ],
                        [
                            139.77165,
                            35.6751
                        ],
                        [
                            139.77496,
                            35.681
                        ]
                    ]
                ]
            },
            "properties": {
                "name": "エリア"
            }
        }
    ],
    "type": "FeatureCollection"
}

mapに食わせてみる

結果が得られたので、このGeoJsonをmapに出力してみたいと思います。
その時に便利なのがこちらのサイトです。
GeoJsonを食わせるだけで、mapに表示してくれます。

スクリーンショット 2021-01-27 13.39.03.png

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

?yawacom - ?どんな値がデータベースに入るのか

2021/01/27現在編集中

どんな値がデータベースに入るのか

アプリ内でどんな値が必要なのか,その値はどんな状態であるべきなのかをmiroに書き出しました.
スクリーンショット 2021-01-27 14.57.27.png

テーブルは

  • ユーザ情報の格納:userテーブル
  • やわらかさの格納:yawarakasaテーブル
  • アクセストークンの格納:access tokenテーブル

の3つを用意します.
access tokenはログイン状態の保持のために作成しています.

準備

まずログインしてからデータベースを作ります.

$ mysql -uroot    # rootでログイン
mysql> create database yawarakasa;

これでyawarakasaという名前のデータベースが作られました.
確認してみましょう.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| yawarakasa         |
+--------------------+

どのデータベースを使うのかを指定します.

mysql> use yawarakasa

テーブル作成

テーブルをMySQLで作って行きます.
まずユーザテーブルです.

create_table.sql
use yawarakasa;

create table user(
  # auto_incrementは連番を自動で入れてくれるやつ
  # primary keyにはすでにユニーク制約が入っとる
  id int(255) not null primary key auto_increment,
  user_name varchar(255) not null,
  password varchar(255) not null,
  sex char(1) not null,
  unique(user_name)
);

次はやわらかさテーブルです.このファイルに追記で書いていきます.

create_table.sql
create table yawarakasa(
  # yawarakasaとしてのプライマリーキーもあるとべんり
  # primary keyは1行目に書かないとシンタックスエラー
  id int(255) not null primary key auto_increment,
  user_id int(255) not null references user(id),
  yawarakasa int(255) not null,
  year int(4) not null,
  month int(2) not null,
  day int(2) not null
);

最後にアクセストークンテーブルです.これもファイルに追記で買いていきます.

create_table.sql
create table access_token(
  user_id int(255) not null references user(id),
  access_token varchar(255) not null,
  # 古いアクセストークンでアクセスできなくするために最新トークン以外消すとかするといいかも?
  # デフォルトで現在時刻入れとく
  created_at datetime default current_timestamp not null
);

以上のSQLをファイル実行してテーブルを作成します.ファイル名はcreate_table.sqlにしました.
下記コマンドを行うことでファイルのSQL文を実行できます.

mysql> source create_table.sql
もしくは
mysql> \. create_table.sql

作られたかどうかを確認します.

mysql> show tables;
+----------------------+
| Tables_in_yawarakasa |
+----------------------+
| access_token         |
| user                 |
| yawarakasa           |
+----------------------+

テーブルが3つ作成されました!?

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

Go言語でMariaDBにinsertするとUTCで挿入される

結論

Go言語でgorpを使いMariaDBに日付型のデータをinsertしたところ、JSTのはずがUTCだったので調査したときのメモ。
結局、DB接続時にロケーション未指定というドキュメントをちゃんと読んでないのが原因...
https://github.com/go-sql-driver/mysql

db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/db?parseTime=true&loc=Asia%2FTokyo")

原因が分からなくて調査した際の各種ログ

OS

# strings /etc/localtime
TZif2
TZif2
JST-9

Go

gorpログ

2021/01/26 23:11:42 [SQL] begin; [] (3.78465ms)
2021/01/26 23:11:42 [SQL] insert into `t1` (`target_date`) values (?); [1:2021-01-26 23:11:42.100496 +0900 JST] (1.963555ms)
2021/01/26 23:11:42 [SQL] commit; [] (1.572656ms)

gorpのログは以下のようにして出力

type GorpTracer struct{}

func (t *GorpTracer) Printf(format string, v ...interface{}) {
    log.Printf(format, v...)
}

//  一部抜粋
func main()  {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/db?parseTime=true&loc=Asia%2FTokyo")
    if err != nil {
        fmt.Printf(err.Error())
    }

    dialect := gorp.MySQLDialect{Engine: "InnoDB", Encoding: "UTF8"}
    dbmap := &gorp.DbMap{Db: db, Dialect: dialect}
    defer dbmap.Db.Close()

    tracer := &GorpTracer{}
    dbmap.TraceOn("[SQL]", tracer)
}

MariaDB

タイムゾーン

MariaDB [db]> SHOW VARIABLES LIKE '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.011 sec)

クエリログ

210126 23:11:42     11 Connect  user@localhost as anonymous on t1
                    11 Query    START TRANSACTION
                    11 Prepare  insert into `t1` (`target_date`) values (?)
                    11 Execute  insert into `t1` (`target_date`) values ('2021-01-26 14:11:42.100496')

なお、クエリログは以下の設定で出力可能

/etc/my.cnf.d/mariadb-server.cnf
[mariadb]
general_log
general_log_file=/var/log/mariadb/query.log
# touch /var/log/mariadb/query.log
# chown mysql:mysql /var/log/mariadb/query.log
# systemctl restart mariadb
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む