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

競プロで使うための GO 入門 ~ASCII変換~

Index

ASCII変換

package main

import (
    "fmt"
)

func main() {

    // 文字からASCII
    s := "ABC"
    fmt.Println(s[0], s[1], s[2]) // ->64 65 66

    // ASCII から文字
    s = string(97) + string(98) + string(0x63)
    fmt.Println(s) // ->abc
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[自分メモ] CORS 設定をrouter group 内で使ってハマった...

はじめに

フロントとサーバーを別で開発していると CORS 設定をすると思うが、 それでハマった話。

ダメな例

func main() {
  e := echo.New()
  g := e.Group('/api')
  g.Use(
    middleware. CORSWithConfig(
      middleware.CORSConfig{
        AllowOrigins: []string{"API URL"},
        AllowMethods: []string{http.MethodGet, http.MethodPost, http.MethodPatch, http.MethodDelete, http.MethodOptions},
      }
    )
  )
  g.POST('/create', ...)
  ...
}

良い例

func main() {
  e := echo.New()
  e.Use(
    middleware. CORSWithConfig(
      middleware.CORSConfig{
        AllowOrigins: []string{"API URL"},
        AllowMethods: []string{http.MethodGet, http.MethodPost, http.MethodPatch, http.MethodDelete, http.MethodOptions},
      }
    )
  )
  g := e.Group('/api')
  g.POST('/create', ...)
  ...
}
  • group に対して CORS 設定をしても反映されない
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Go】 echo の CORS でハマった...

はじめに

フロントとサーバー別開発で CORS 設定をする時に、 ハマった話。
フロント: Nuxt
サーバー: Go

ダメな例

func main() {
  e := echo.New()
  g := e.Group('/api')
  g.Use(
    middleware. CORSWithConfig(
      middleware.CORSConfig{
        AllowOrigins: []string{"API URL"},
        AllowMethods: []string{http.MethodGet, http.MethodPost, http.MethodPatch, http.MethodDelete, http.MethodOptions},
      }
    )
  )
  g.POST('/create', ...)
  ...
}

良い例

func main() {
  e := echo.New()
  e.Use(
    middleware. CORSWithConfig(
      middleware.CORSConfig{
        AllowOrigins: []string{"API URL"},
        AllowMethods: []string{http.MethodGet, http.MethodPost, http.MethodPatch, http.MethodDelete, http.MethodOptions},
      }
    )
  )
  g := e.Group('/api')
  g.POST('/create', ...)
  ...
}

終わりに

group に対して CORS 設定をしても反映されないみたい。

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

【GCP】Cloud Functions の Go 1.13 で取得できなくなった環境変数とそれを置き換えれるメタデータの対応表

前回の記事から引き続いてGCF/Go 1.11から Go1.13への移行の話です。
自動的に設定される環境変数にも変更がありました。

Go1.11で設定されている環境変数

https://cloud.google.com/functions/docs/env-var#nodejs_6_nodejs_8_python_37_and_go_111

キー 説明
ENTRY_POINT 予約済み:実行される機能。
GCP_PROJECT 予約済み:現在のGCPプロジェクトID。
GCLOUD_PROJECT 予約済み:現在のGCPプロジェクトID(非推奨)。
GOOGLE_CLOUD_PROJECT 予約済み:設定されていませんが、内部使用のために予約されています。
FUNCTION_TRIGGER_TYPE 予約済み:関数のトリガータイプ。
FUNCTION_NAME 予約済み:関数リソースの名前。
FUNCTION_MEMORY_MB 予約済み:関数の最大メモリ。
FUNCTION_TIMEOUT_SEC 予約済み:秒単位の実行タイムアウト。
FUNCTION_IDENTITY 予約済み:関数の現在のID(サービスアカウント)。
FUNCTION_REGION 予約済み:関数領域(例:)us-central1。

Go1.13で設定されている環境変数

https://cloud.google.com/functions/docs/env-var#nodejs_10_and_subsequent_runtimes

キー 説明
FUNCTION_TARGET 予約済み:実行される機能。
FUNCTION_SIGNATURE_TYPE 予約済み:関数のタイプ:httpHTTP関数およびeventバックグラウンド関数用。
K_SERVICE 予約済み:関数リソースの名前。
K_REVISION 予約済み:関数のバージョンID。
PORT 予約済み:関数が呼び出されるポート。

環境変数の代わりにメタデータサーバーを使う

https://cloud.google.com/compute/docs/storing-retrieving-metadata

メタデータサーバーには、インスタンスのホスト名やインスタンスIDなどのインスタンスのメタデータが保存されています。
通常は、GCEから利用するようですが、GCFからも一部の情報は取得できるようなので確認してみました。

サンプルコードは下記に公開しています。
https://github.com/shigwata/gcp-cloud-functions-env-var

GCFでメタデータ サーバーから取得できた値

メタデータキー
project/attributes/ -
project/attributes/disable-legacy-endpoints -
project/attributes/enable-oslogin -
project/attributes/vmdnssetting -
project/attributes/ssh-keys -
project/numeric-project-id [GCP_PROJECT_NUM]
project/project-id [GCP_PROJECT]
instance/attributes/ -
instance/attributes/enable-oslogin -
instance/attributes/vmdnssetting -
instance/attributes/ssh-keys -
instance/cpu-platform -
instance/description -
instance/disks/ -
instance/guest-attributes/ -
instance/hostname -
instance/id [INSTANCE_ID]
instance/machine-type -
instance/name -
instance/network-interfaces/ -
instance/network-interfaces/0/access-configs/0/external-ip -
instance/network-interfaces/0/forwarded-ips/ -
instance/scheduling/ -
instance/scheduling/on-host-maintenance -
instance/scheduling/automatic-restart -
instance/scheduling/preemptible -
instance/maintenance-event -
instance/service-accounts/ [SERVICE_ACCOUNTS]
instance/service-accounts/default/email [GCP_PROJECT]@appspot.gserviceaccount.com
instance/service-accounts/default/token [TOKEN]
instance/service-accounts/default/identity -
instance/tags -
instance/zone projects/[GCP_PROJECT_NUM]/zones/[ZONE]

全然取れないです。。。

対応表

Go 1.11環境変数 Go 1.13環境変数 メタデータキー
ENTRY_POINT FUNCTION_TARGET -
GCP_PROJECT - project/project-id
GCLOUD_PROJECT - project/project-id
GOOGLE_CLOUD_PROJECT - -
FUNCTION_TRIGGER_TYPE FUNCTION_SIGNATURE_TYPE(※値は一致しない) -
FUNCTION_NAME K_SERVICE -
FUNCTION_MEMORY_MB - -
FUNCTION_TIMEOUT_SEC - -
FUNCTION_IDENTITY - instance/service-accounts/default/email
FUNCTION_REGION - -
- K_REVISION -
- PORT -

対応する値がないものは、デプロイ時に環境変数を設定するしかなさそうですね。

おわりに

GCFもGAEの第二世代のように内部的に大きく変わっているようです。
GCF/Go 1.11は廃止予定が利用ユーザ宛にされたので、この記事が移行の参考になれば幸いです。

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

【メモ】Skickaを使ってGoogleDriveに簡単アップロード

Skickaを使えば、ターミナルからGoogleDriveに簡単にファイル/フォルダのアップロード/ダウンロードができるのでインストールの過程をメモ

環境

Ubuntu18.04

Goのインストール

1.公式サイトからインストールをする

上記ページで自分のOSにあったソースコードをダウンロード

(今回はUbuntu18.04なのでLinuxを選択)

クリックすると、/home/user/Downloadsgo1.14.6.linux-amd64.tar.gzというファイルがダウンロードされる

2.圧縮ファイル.tar.gz/usr/local配下に解凍

tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz

3.Pathを通す
以下のコマンドを実行してPathを通す

export PATH=$PATH:/usr/local/go/bin

Pathが通ったことを確認するために、

$ go

コマンドを実行して、

Go is a tool for managing Go source code.

Usage:

    go command [arguments]

The commands are:

    build       compile packages and dependencies
    clean       remove object files and cached files
    doc         show documentation for package or symbol
    env         print Go environment information
    bug         start a bug report
    fix         update packages to use new APIs
    fmt         gofmt (reformat) package sources
    generate    generate Go files by processing source
    get         download and install packages and dependencies
    install     compile and install packages and dependencies
    list        list packages
    run         compile and run Go program
    test        test packages
    tool        run specified go tool
    version     print Go version
    vet         report likely mistakes in packages

Use "go help [command]" for more information about a command.

Additional help topics:

    c           calling between Go and C
    buildmode   build modes
    cache       build and test caching
    filetype    file types
    gopath      GOPATH environment variable
    environment environment variables
    importpath  import path syntax
    packages    package lists
    testflag    testing flags
    testfunc    testing functions

Use "go help [topic]" for more information about that topic.

こんな感じになればPathが通ってる
これでGoの準備はOK!!

Skickaのインストール

1.goコマンドを使ってGithubからskickaをインストール

$ go get github.com/google.skicka

2.Pathを通す

$ export PATH=~/go/bin;$PATH

3.設定ファイルの初期化
skicka initコマンドを実行すると.skicka.configファイルが作成される

$ skicka init
20XX/MM/DD hh:mm:ss created configuration file /home/user/.skicka.config.

4.Googleアカウント認証
skicka -no-browser-auth dfコマンドを実行すると、URLが出力され、ブラウザ上でアップロード先のGoogleアカウントの認証ができる

$ skicka -no-browser-auth df
Go to the following link in your browser: (ここにURLが表示される)
Enter verification code: (認証後に表示される認証コードをここに貼り付けたらエンターキーを押す)

※URL先で認証をしようとして、「Google でログイン機能が一時的に無効」と出てきた場合には、こちらの記事を参考にAPIキーの設定を行う

5.接続確認

$ skicka ls

で接続したGoogleDrive上のファイル/フォルダが確認できればOK

$ skicka df

でGoogleDriveの使用状況が確認できる

アップロード・ダウンロード

  • アップロードskicka upload
(ファイルのアップロード)
$ skicka upload <ファイルパス> <Drive上のパス>

(ディレクトリのアップロード)
$ skicka upload <ディレクトリパス>/ <Drive上のパス>
  • ダウンロードskicka download 基本的には、uploadと同じ
$ skicka download <Drive上のパス> <localのパス>

※ディレクトリごとの場合は、/をつける必要があるので注意!(つけないと中身だけアップロード/ダウンロードされる)

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