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

ラズパイで実行するGO言語プログラムのDocker開発環境(GPIOとかはわからん)

概要 debianのgo入ったdockerイメージ使ってMakefileでクロスコンパイルするときの設定わたしとくと、GPIOとかは無理だけど、そこそこラズパイ用のGO開発環境にできそう。 はじめに ラズパイでGO言語のプログラムを動かしたいときに、sshして開発しても良いと思うけど、複数人でなにか作りたいときとかはDocker環境で開発して出来たほうが良いかなーと思う。 クロスコンパイルして、そこそこテストして、実行ファイルだけラズパイにコピーして使う感じ。 ということで、ラズパイで動くGO言語プログラムを開発するためのDockerの設定をすこし整理した。 Dockerfileもdocker-compose.ymlもいまいちわかってないけど、動いてるから良しとした。 もっと、いい感じの書き方とかいい感じの設定あれば教えてほしいです。。。 結局、ラズパイとかいいつつ、GPIOもBluetoothも使ってないので、ただのdebian環境っていう・・・。 方針 軽くしらべたら、それっぽいイメージ提供してる人いたけど、詳細わかんないので、使わないことにした。GPIOとかをシミュレート?エミュレート?できるなら使ってみたい気はする。 balenalib/raspberry-pi-golang golangのオフィシャルなイメージはdebianっぽいので、そのまま使うことにした。 golang Makefileに、env GOOS=linux GOARCH=arm GOARM=7 go buildを書いておく。自分の持ってるラズパイはuname -aしたら、armv7lって書いてあったから、GOARM=7にした。それで動いた。 githubの環境変数を渡してあげる。 詳細 こんな感じ。 docker-compose.yml version: "3" services: raspi: build: ./raspi environment: GITHUB_USER_NAME: ${GITHUB_USER_NAME} GITHUB_TOKEN: ${GITHUB_TOKEN} GITHUB_EMAIL: ${GITHUB_EMAIL} volumes: - "raspi.repo:/repo" - "raspi.go:/go" tty: true volumes: raspi.repo: raspi.go: githubの環境変数をわたしてる。 上記ymlファイルの下に./raspiってフォルダを切ってDockerfileと最初に実行してほしいスクリプトをおいてる。 FROM golang:latest LABEL Name="raspi" LABEL Version="1.0.0" WORKDIR / ADD ./init.sh init.sh ENV GITHUB_USER_NAME=github-user-name ENV GITHUB_TOKEN=github-token ENV GITHUB_EMAIL=github-email RUN apt-get update && apt-get install -y \ less\ && apt-get clean \ && rm -rf /var/lib/apt/lists/* VOLUME /go VOLUME /repo WORKDIR /repo CMD ["bash", "/init.sh"] lessできないとストレスなので入れてる。 init.sh #!/bin/bash cd / git config --global user.name ${GITHUB_USER_NAME} git config --global user.email ${GITHUB_EMAIL} git config --global url."https://${GITHUB_USER_NAME}:${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" while :; do sleep 10; done もうちょいgo installとかしといたほうがよいのかも。 最後のsleepがないと、たちあげるとき、exit 0って出して死んじゃう。 Makefile SHELL=bash build: go build build-raspi: env GOOS=linux GOARCH=arm GOARM=7 go build ビルドするときの設定(↑) あとは、適当にたちあげて使ったらよさげ。 docker-compose -f docker-compose.yml up -d --build おわりに それっぽく動いてる。満足。 ただ、環境変数とか、volumeのこと、いまいちわからない。 Dockerfileとdocker-compose.ymlの使い分けがいまいちわからない。 軽く検索しただけじゃ、よくわかんないので、本読むか。。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Emacs + dap-modeでGoプログラムのデバッグをする

Emacs lsp-mode の導入はすでに済んでいたので、今度は dap-mode を導入してデバッグをしたい。 いろいろ躓きながらなんとか導入はできたので備忘録として残します あまり文献もなかったので。。。 環境 私の作業環境はこちらです macOS BigSur 11.2.3 GNU Emacs 27.1 Go 1.15 Node.js v14.4.0 必要なツールのインストール まずはGoの言語サーバである gopls のインストール $ go get golang.org/x/tools/gopls@latest 次にデバッグ用のプログラムをインストール、VSCode向けの拡張プログラムが使えるとのことなので、そちらの準備をします こちらは Node.js でのビルドが必要なようです // リポジトリのクローン $ git clone https://github.com/golang/vscode-go $ cd vscode-go // 必要なJSモジュール群をインストール $ npm install // 拡張プログラムのビルド $ npm run compile Emacsの設定 これで必要なツールは揃ったのでここからはEmacsの設定ファイルを編集します。 前提として、私は straight.el というパッケージ管理ツールを使用しています 他のツールを使っている場合は適宜読み替えてください straight.el の導入についても記事を書いているので興味のある方はそちらも見てみてください https://qiita.com/yoooz/items/8a97642086611892f4c3 (use-package dap-mode :defer t :after lsp-mode :config (dap-mode 1) (dap-auto-configure-mode 1) (require 'dap-hydra) (require 'dap-go) :custom (dap-auto-configure-features '(sessions locals breakpoints expressions repl controls tooltip)) (dap-go-debug-path "path/to/vscode-go/repository") (dap-go-debug-program `("node", (f-join dap-go-debug-path "dist/debugAdapter.js"))) ) 注意 dap-mode に同梱されている dap-go のデフォルトだと、下記変数のデフォルト値ではうまくいきませんでしたので、上記のように設定しています dap-go-debug-path dap-go-debug-program 使い方 設定が完了したらEmacsを再起動するか設定を反映して、Go のプログラムファイルを開きます エディタの左側、フリンジ部分をクリックすることで ブレークポイントを設定することができます ブレークポイントを設定したらデバッグ起動しましょう M-x dap-debug どの設定を使用するか聞かれるので Go Launch File Configuration を選択(もしくは入力)してください 下記のようなWindow構成となり、デバッグが可能になります 終わりに 以上で dap-mode の導入は完了です dap-mode 自体の機能についてはまだこれから触って行くつもりです VSCode や Goland のような便利ツールを使うのもいいですが、EmacsやVimの方が小回りが効いたりするので、気が向いたときに改造していくのは楽しいですね
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go + HEROKU の備忘録

HEROKUアプリケーションの確認 HEROKUにログイン heroku login HEROKUのアプリケーション一覧の確認 heroku list HEROKU アプリケーションの作成と削除 HEROKUのページから作成と削除を行うことができますが、コマンドでも可能です。 作成 heroku create <アプリ名> アプリのrename heroku rename <新しい名前> --app <古い名前> 削除 heroku apps:destroy --app アプリ名 ClearDB(MySQL)との接続 localでないDB(MySQL)を使用したい場合は、アプリケーションを作成し、ResourcesのAdd-onesでClearDBを追加します。 次にconfigを確認しプログラム(Go)にDBと接続するための接続情報を加えます。 heroku config --app <アプリ名> 自分でconfigを追加していない場合は基本的にDATABASE_URLが帰ってきます。 DATABASE_URLを分解することでプログラム(Go)をDBに接続することができます。DATABASE_URLのフォーマットが下記のようになっています。 DATABASE_URL='mysql://username:password@hostname/database_name?reconnect=true' 下記の4つがDBに接続するために必要になります。 UserName Password HostName Database_name MacのTerminalで環境変数としてDBの接続情報をセット export DB_USER= \ DB_PASS= \ DB_IP=127.0.0.1 \ DB_PORT=3306 \ DB_NAME= 外部DBへのアクセス 外部のMySQLDBに接続するためのコマンドです。 コマンドにpasswordを使用すると警告が出ますが、まぁ問題ないと思います。 mysql --host=hoge --user=hoge --password=hoge <Database_name> アプリを開く heroku open HEROKU Logの確認 使っていないアプリケーションや現在使用中のアプリケーションのログの取得コマンド heroku logs --tail --app <アプリ名> アプリケーションの再起動 何か動作が怪しい時などにとりあえず再起動します。 heroku restart --app <アプリ名> HEROKUへのデプロイ デプロイ方法1 git push heroku master git push heroku <現在いるブランチ名>:master デプロイ方法2 コンテナでデプロイする方法です。下記の記事を参考にデプロイしました。 正直かなり前にやって以来コンテナでデプロイはしていないのであまり覚えていません。今度の機会に追記したいと思います。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HEROKUコマンド集(自分用)

HEROKUアプリケーションの確認 HEROKUにログイン heroku login HEROKUのアプリケーション一覧の確認 heroku list HEROKU アプリケーションの作成と削除 HEROKUのページから作成と削除を行うことができますが、コマンドでも可能です。 作成 heroku create <アプリ名> アプリのrename heroku rename <新しい名前> --app <古い名前> 削除 heroku apps:destroy --app アプリ名 ClearDB(MySQL)との接続 localでないDB(MySQL)を使用したい場合は、アプリケーションを作成し、ResourcesのAdd-onesでClearDBを追加します。 次にconfigを確認しプログラム(Go)にDBと接続するための接続情報を加えます。 heroku config --app <アプリ名> 自分でconfigを追加していない場合は基本的にDATABASE_URLが帰ってきます。 DATABASE_URLを分解することでプログラム(Go)をDBに接続することができます。DATABASE_URLのフォーマットが下記のようになっています。 DATABASE_URL='mysql://username:password@hostname/database_name?reconnect=true' 下記の4つがDBに接続するために必要になります。 UserName Password HostName Database_name MacのTerminalで環境変数としてDBの接続情報をセット export DB_USER= \ DB_PASS= \ DB_IP=127.0.0.1 \ DB_PORT=3306 \ DB_NAME= 外部DBへのアクセス 外部のMySQLDBに接続するためのコマンドです。 コマンドにpasswordを使用すると警告が出ますが、まぁ問題ないと思います。 mysql --host=hoge --user=hoge --password=hoge <Database_name> アプリを開く heroku open HEROKU Logの確認 使っていないアプリケーションや現在使用中のアプリケーションのログの取得コマンド heroku logs --tail --app <アプリ名> アプリケーションの再起動 何か動作が怪しい時などにとりあえず再起動します。 heroku restart --app <アプリ名> HEROKUへのデプロイ デプロイ方法1 git push heroku master git push heroku <現在いるブランチ名>:master デプロイ方法2 コンテナでデプロイする方法です。下記の記事を参考にデプロイしました。 正直かなり前にやって以来コンテナでデプロイはしていないのであまり覚えていません。今度の機会に追記したいと思います。 ありがとうございました。 はてなブログもお願いします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Go ory/dockertestを使ってMongoDBを使うAPIのユニットテスト

やりたいこと APIのエンドポイント1つずつにこんなテストが書いてある。(本来レスポンスも見るしっかりしたテストの方がいいけどそれは一旦置いておく) このテストは、MongoDBのサーバー(Docker Desktop for Windowsのコンテナ)を別途用意した上で、テスト立ち上げの度にそのサーバーのDBを消して初期化し、テストしている。割とよくやる手法なのかもしれないが、この方法だとテストが増えるにつれ、並列処理ができないことから 時間がかかるようになってしまう。できれば並列でできるようにしたいのでその方法を調べてみた。 手法いろいろ 1. モックを使う サーバーがあると仮定して本来返ってくる値を書いておいて返す、的な手法。サーバーに依存しないでテストできて色々楽だと思うが、実際のDBで試したときに想定外のエラー返ってくることもありそうに思い見送り。 2. テスト用のDBサーバーを都度建てる 今回やっていた/やった手法。ここまでやっていたのは、別途DBサーバーを1つだけ建てておいてそれにアクセスさせるテストだったが、Dockertestというやつを使うと テスト時にユニット毎にコンテナを建ててその中でテストを行い、テスト後はコンテナの削除、というところまでができる。これなら並列でもテストができてよさそう。 3. インメモリなDBを建てて試す SQL系ならSQLiteで動かすとかができそうに思う。ORMを使っているならワンちゃん、なんとかできるんじゃないだろうか(よく調べられていない) ただ今回はMongoDBなので、SQLiteじゃダメ。memongoという インメモリなMongoDBを建てるものもあったが、サポートOSがUnix系(Linux/MacOS)だったので、Windowsでは動かなそうと思い見送り。 Dockertestを使ってみた https://github.com/ory/dockertest/blob/v3/examples/MongoDB.md 基本的にこのExampleを見たらわかる感じなのだが、これはgo-mongodb-driverではなく、mgoを使っていた。go-mongodb-driverでの実装例を載せておく。 実装例 pool.Runの引数 単に起動するコンテナ内容を指定している。左側がイメージ名、右側がバージョンだった。flagとか使って後から変えれるようにしといたほうがいいかもしれない。 defer shutdownの意味 テスト終了時にコンテナを消すやつである。resource.Expire(300)をしておけば5分後に勝手に消滅してくれるはずではあるが、どうも動かないこともあるようだった。 No connection could be made because the target machine actively refused it. で、テストを実行しようとしたらこんなエラーを言われた。その原因は書いてある通りで、Dockerが接続を受け付けてくれなかったことによるもの。 Docker Desktop for Windowsの設定画面を見たらこんな項目があったのでチェックを入れたら動くようになった。ほんとはTLSを使うべきなのだがdockertestのページを見てよくわからなかったので今回は妥協することにした。(やり方分かる人募集) Panic: Test timeout ローカルにイメージが無い初回実行時はダウンロードが終わるまで時間がかかりタイムアウトしてしまう。VSCodeで実行する場合は、settings.jsonのgo.testTimeoutを変更してタイムアウトまでの時間を300秒ぐらいに伸ばしてから再チャレンジ。 このままだと並列で動かないが。 テストの関数内上部にt.Parallel() を入れよう。 複雑な実装例 もしかしたらこの方法使うとCIをするときにめんどくさくなるかもしれないので従来の並列じゃないテストも残したくなった。そこで苦戦した結果はこれである。 flagが反応しない フラグ名として、parallel って入れてませんか?? parallelは予約語ですよ!!!(2時間悩んだ) テスト用引数の渡し方(VSCode) ファイル → ユーザー設定 → 設定 → go testって検索 → Go: Test flags → settings.jsonで編集 完走した感想 実行までは割とできたけど flagの扱いにめちゃくちゃ悩みました。結局予約語を使っているだけっていう単純なミスで悲しかった。Dockerを見てるとテスト実行時に大量にコンテナが立ち上がって、見てる分には面白いのだけど、あんまり多いと処理落ちしだすするので同時実行数を "-parallel=5" みたいにやって制限しましょう。 すごく参考にしたページ GolangでDBアクセスがあるユニットテストのやり方を考える https://qiita.com/seya/items/582c2bdcca4ad50b03b7
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む