- 1. [Go言語] Golang + AWS Lambdaを実行するとfork/exec /var/task/main: exec format error: PathError
- 2. リモートワークで固定IPするために: VPNの認証のためにRADIUSサーバーをつくる
- 3. Lambda, Amazon Textractを利用してS3に保存した画像からテキストを抽出する(Golang)
- 4. VSCode + Remote ContainerでGoの開発環境を作ったけどimportできなくて悩んだ話
- 5. Go言語でhttpリクエスト結果が403の解決方法の一例
- 6. Golang Dockerマルチステージビルドで環境構築
- 7. [Go]型変換チートシート(int, string, float, time, etc)
- 8. 様々な言語での日時表記
- 9. mtailで「文字列がマッチしない場合」という否定条件を作る
- 10. [Go] Consume Kafka Message
- 11. nil slice と empty slice
- 12. Docker + GoアプリをVScode&Remote Containersでデバッグする方法
- 13. GolangでPKI入門 – 5
- 14. Go言語とは
- 15. Docker for windows でfyneを使ってwindowsアプリ用の環境構築
- 16. GORMでMYSQLに接続してCRUD操作する
- 17. ハウテレビジョン夏インターンが楽しかった!2021
- 18. validatorのエラーフィールド名に構造体のフィールド名ではなくjsonタグ名をセットしたい
- 19. 分岐もややこしい演算も無しの、クラス定義だけで書くFizzBuzz
- 20. Go WebSocketを使ってみる
[Go言語] Golang + AWS Lambdaを実行するとfork/exec /var/task/main: exec format error: PathError
## 概要
Serverless FrameworkやSAMやbuildしたものをそのまま上げてみるなどして、AWS LambdaにGoをデプロイするとどのケースでも以下のエラーがCloudWatchに出力されていた。筆者はM1 Macを使っていることで詰まった。“`
fork/exec /var/task/main: exec format error: PathError
null
“`## 解決策
### 一般的な解決法
go buildがなんかしらおかしいはずです。以下のようにgo buildはしましたか?
生成したバイナリのディレクトリ位置も確認してみたください。“`
$ GOOS=linux go build .
“`### M1 Macユーザー
go build時にLambdaで指定しているアーキテクチャに合わせていますか?
デフォルトはx86_64のため設定を変更をしていなければ以下のようにamd64でbuildするようにする“`
$ GOARCH=amd64 GOOS=linux go build .
“`
リモートワークで固定IPするために: VPNの認証のためにRADIUSサーバーをつくる
ピリカでは開発環境へのアクセスを保護するための一環としてIP制限をしていますが、ピリカという会社は元々リモートで仕事をしている人が多く、またオフィスのIPアドレスは動的IPの時代が続いていました。
そこで、各自のIPアドレスを固定化するためにVPNやプロキシサーバーを構築していますが、その認証の管理をできるだけGoogle Workspaceの権限を元にやりたいと考えました。
この記事では、VPNやプロキシの認証をするための前段として、Google Workspaceの情報と連動した独自の認証基盤をどのように作ったかを紹介します。
## 全体の設計
このVPN/認証プロキシシステムの設計はこのようになっています。
![20210922102253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/609129/03a9115c-ac92-e7f7-0b72-67adddca76bd.png)
Google Workspaceの生のパスワードをシステムが受け取って認証するのは、APIが存在しないし
Lambda, Amazon Textractを利用してS3に保存した画像からテキストを抽出する(Golang)
# はじめに
S3に画像を追加すると、自動的にその画像内のテキストを抽出し、テキストファイルとして保存する、というシステムを[Lambda](https://aws.amazon.com/jp/lambda/)・[Amazon Textract](https://aws.amazon.com/jp/textract/)・Golangを利用して作りました。
作成手順を共有します。
### 完成イメージ
![ocr.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455240/80ef8a6e-a645-99ad-8d4e-ab1f62fb8046.png)
### Textractとは
[Amazon Textract](https://aws.amazon.com/jp/textract/)はAWSが提供するクラウドOCRサービスです。詳しくは以下の記事を参照してください。
https://qiita.com/windows222/items/07c3683c052d6e2b
VSCode + Remote ContainerでGoの開発環境を作ったけどimportできなくて悩んだ話
# 概要
[前回の記事](https://qiita.com/ka-zuu/items/3144780ee528815e7557)でVSCodeでDockerのDevContainerをサクッと起動して、OS環境を汚さない快適開発環境を作れるようになったけど、Goでサンプル実装しようとすると、どうにもうまく行かない。
具体的には、自分の作ったpackageをimportできない。
情報を色々検索したところ、Goの推奨する標準構成が色々変わったことに、インターネッツの記事が追いついていなく、新旧の情報が錯綜しているためだった。
結果的に解決できたので、その備忘録を書いておく。# 結論
結論から書くと、こちらのサイトを最初から参考にして環境作っておけばよかった・・・という話・・・
[Go 脱初心者への道](https://zenn.dev/shellyln/articles/b2992891f8f3f9381025#1.-%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E4%BD%9C%E6%88%90%E3%83%BB%E3%83%91%E
Go言語でhttpリクエスト結果が403の解決方法の一例
# はじめに
カクヨムのサイトをGo言語の`net/http`のライブラリーを使用していてデータ取得していたけど
ある時から、403と表示するようになった。curlコマンドでは取得できるのでなんでかわからなかったけど
可決方法が分かったのでやり方を記載する。# 失敗時のやり方
以下のプログラムを組んだ時に403と返す。
“`go:main.go
package mainimport (
“fmt”
“io/ioutil”
“net/http”
)func main() {
url = “https://kakuyomu.jp/”
web1(url)
}func web1(url string) {
resp, _ := http.Get(url)
defer resp.Body.Close()byteArray, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(byteArray))
}
“`実行すると以下の通りになる。
“`:log
4
Golang Dockerマルチステージビルドで環境構築
#結論
Dockerマルチステージビルドを使用して可能な限りコンテナイメージを小さくしてみました。結果は以下の通りです。正直数十MBくらいになることを期待していましたが、意外と小さくならなかったです。もっと改善点があると思いますが、今回は開発中のアプリが問題なく動作するまでにとどめます。“`
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
go conventional ed4436ad7be4 35 minutes ago 955MB
go use-multi 40c0d5f36f4c 17 hours ago 548MB“`
# ゴール
– Dockerマルチステージビルドを使用してDockerコンテナを立ち上げる。
– 現在開発中のGoファイルの動作に問題がないこと。
– `マルチステージビルド使用前よりもコンテナイメージが小さくなること。`# 実行環境
– Mac 11.5.
[Go]型変換チートシート(int, string, float, time, etc)
自分用に型変換をまとめました。随時更新していきます。
足りない情報があればコメントをいただきたいです。### intの変換
“`go
// int → int64
int64(int)// int → string
strconv.Itoa(int)// int64 → int
int(int64)// int64 → string
strconv.FormatInt(int64, 10)// string → int
strconv.Atoi(string)
“`
### floatの変換
“`go
// float → string
v := fmt.Sprintf(“%.2f”,3.1425)
// “3.14”// float →float(四捨五入)
v :=3.1415
fmt.Println(math.Round(v*100) / 100) // 3.14
fmt.Println(math.Round(v*1000) / 1000) // 3.141
“`
### Time型の変換
“`go
// int → time
ti
様々な言語での日時表記
#背景
日時表現は割とよく使うけど、言語で書き方統一されてなくて正直やり辛いな~~
似てるけどちょっと違う、が多くてよくミスってしまうな〜〜
と思ったので覚書程度にまとめます。というわけで、いろんな言語で現在の年月日・時刻を「2021年10月02日 23時00分00秒」の形式で出力します。
とりあえずはJava, Ruby, Python3, Go, php。適宜更新します#Java(8以上)
SE8から加わったDate and Time APIのおかげで実装がぐっと楽になりました。“`Java:Main.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class Main {
public static void main(String[] args) {
// SE8から加わったクラス。現在の日時を取得
LocalDateTime dateTime = LocalDateTime.now();// 独自のフォーマットを準
mtailで「文字列がマッチしない場合」という否定条件を作る
## 概要
golangの正規表現では文字列がマッチしない否定文(Negative look ahead and behind)がサポートされていない。そもそも肯定でも否定でも、`(?`を使うと以下のようにエラーになる。
– error parsing regexp: invalid or unsupported Perl syntax: `(?=`
– error parsing regexp: invalid or unsupported Perl syntax: `(?!`[mtail](https://github.com/google/mtail)というgolangで書かれたログ収集ツールを使っていて、「特定の文字列がマッチしない場合ログを収集する」という条件を付けたいのだが、当然これもサポートされていないし、mtailではgolangそのものを書けるわけではないので、正規表現以外の方法がない。
https://github.com/google/mtail/issues/18これをどうにか解決した記録。
## 関連
https://qiita.com/Esf
[Go] Consume Kafka Message
A example to consume kafka message with golang and confluent.
“`go
package mainimport (
“log”“github.com/confluentinc/confluent-kafka-go/kafka”
)func main() {
c, err := kafka.NewConsumer(&kafka.ConfigMap{
“bootstrap.servers”: “localhost:9092”,
“group.id”: “myGroupId”,
})if err != nil {
panic(err)
}c.SubscribeTopics([]string{“quick-start-event”}, nil)
for {
msg, err := c.ReadMessage(-1)
if err == nil {
log.Println(string(msg.Value))
} else {
log.Fat
nil slice と empty slice
sliceを扱う時、結果が入っていない空のsliceなのか、それともsliceはnilなのかを意識せずにテストを書いて、テストでこけたことがあった。
nil slice と empty slice の違いはこんな感じ。
“`go
var a, b, c, d, e []intb = nil
c = []int(nil)
d = []int{}
e = make([]int, 0)// nil slice –> a,b,c
// empty slice –> d,e
fmt.Printf(“%#v”, a) // []int(nil)
fmt.Printf(“%#v”, b) // []int(nil)
fmt.Printf(“%#v”, c) // []int(nil)
fmt.Printf(“%#v”, d) // []int{}
fmt.Printf(“%#v”, e) // []int{}
“`https://play.golang.org/p/uUvGD5xJIMy
Docker + GoアプリをVScode&Remote Containersでデバッグする方法
#はじめに
今までの開発でVScodeに備わっているデバック機能を使わずに見て見ぬふりをしていました。
たまたまFlutterの勉強を始めて触ったVScodeのデバック機能の素晴らしさに感動し、それを普段開発しているGoでも実現したいと思い立ったが吉日、めちゃくちゃ手こずりました。原因としてはDockerを使用していたためです。色々検証した結果、拡張機能のRemote Containersを使うことで実現できました。
ご覧になった方々の快適なGo開発ライフにお役立てください!!!!!!# 前提条件
– Dockerを使って開発している
– Goを使用している
– Visual Studio Codeを使って開発している# ゴール
– VScodeのRemote Container機能を使いDockerコンテナ内に入ることができること。
– 任意の場所にブレークポイントを設置(?)しその場所を実行したら止まること。
– ブレークポイント以前の変数などの情報が取得出ること。# 実行環境
– Mac 11.5.2
– Docker Desktop 4.0.0
– Visual S
GolangでPKI入門 – 5
#1.この記事の対象の人
– Golang で、属性※付きの証明書要求( [CSR](https://datatracker.ietf.org/doc/html/rfc2986) ) を作ってみたい人※証明書の[ X.509 certificate extensions ](https://datatracker.ietf.org/doc/html/rfc5280#section-4.2)用途のための属性を付けます。
※以下、証明書要求は CSR と呼称します。#2.概要
この記事の概要は以下の通りです。**1. Golang で SubjectAltName と KeyUsage の属性をもつ CSR を生成**
**2. OpenSSL でSubjectAltName と KeyUsage の属性をもつ CSR を作成**
**3. 作成したそれぞれの CSR の中身を比較**
**4. おまけ– CSR の属性の ASN.1 データ構造の調査(詳しく知りたい人向け)**#3.Golang で SubjectAltName と KeyUsage の属性をもつ
Go言語とは
#Go言語とは
今回は少しだけGoを触った覚書として「こんな言語があって、流行っていて、こんな特徴があって、なんで、どんなところがおすすめか」という部分を纏める。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1532027/11dfc3cd-b85a-9242-59ea-52e9e988a814.png)
まずGo言語の基本的な情報は以下
* 2009年にGoogleによって開発されたプログラミング言語
* IEEEの人気言語ランキング2021では8位
* Cの高速性とCにはない生産性を兼ね備えた言語
* 現在はバックエンドの開発などでphp、rubyに代わって使用されている
* 有名なサービスだとDocker、Dropbox、メルカリなど#Go言語の特徴
####静的型付け・コンパイル型の言語
pythonやjavascript、phpなどの動的型付けの言語ではないため実行速度が非常に速い
例としてGCPでスピンアップ(起動時間)の比較があるがダントツで速い
![image
Docker for windows でfyneを使ってwindowsアプリ用の環境構築
# 初めに
bokkuruといいます。
今回はgolangの勉強用にGUI用のパッケージのfyneを使ってみるための環境構築を行います。wsl2上のdockerで開発を行い、動作はメインosであるwindows上で実行を目指します。
ブラウザ上でのHello Worldの表示まで行います。
筆者がgolang初心者なのでgolangに関する初歩的なミスが多いですが許して下さい。# 前提環境
OS : windows 10
wsl2のos : Ubuntu
docker : Docker desktop for windows
Fyne : https://github.com/fyne-io/fyne
golang : https://golang.org/
editor : VS code (Remote-Containers)方針
dockerのlinux上でコンパイルしてwindows向けのファイルを作りたい# Dockerの起動
“`DockerFile:Dockerfile
FROM golang:1.16.8
RUN apt update
RUN apt in
GORMでMYSQLに接続してCRUD操作する
#はじめに
転職にあたりgo言語を使用することになったので勉強して2日くらいです。
書き方なんとなくだけど分かったので、文字読むより手を動かそうと思い、いきなりDB接続しようとしたらめちゃ時間かかった(当たり前)のでその備忘録です。
間違いや、よろしくない書き方などあったらぜひぜひコメントで教えていただけると嬉しいです。
とにかくDBつないで動かしてみることが目的なので実用的ではないかもしれません。#環境
GOやMYSQLの環境構築は割愛。調べればたくさん出てきます。OS: windows
go version: go1.17.1 windows/amd64
mysql version: Ver 8.0.26 for Win64 on x86_64 (MySQL Community Server – GPL)#GORMとは
GO言語のORMライブラリです。公式がとても分かりやすいhttps://gorm.io/ja_JP/
##ORMとは
`Object-relational mapping`の略です。
名前の通り、オブジェクト(オブジェクト指向におけるオブジェクト)
ハウテレビジョン夏インターンが楽しかった!2021
# はじめに
2021年 9/13〜9/24 開催のハウテレビジョンさんのサマーインターンシップのレポートです。
はじめにメッセージとしては、
・2週間がっつり開発ができて非常に楽しい!
・開発に集中できる環境が整っている!
・技術者として成長できる!
です。# 目次
[1.きっかけ](#1-きっかけ)
[2.選考](#2-選考)
[3.1day研修と事前課題](#3-事前研修)
[4.インターン本番](#4-インターン本番)
[5.開発以外の魅力](#5-開発以外の魅力)
[6.感想](#6-感想)#1. きっかけ
ハウテレビジョンさんが運営する [外資就活ドットコム](https://gaishishukatsu.com) というサービスで募集を見つけました。
応募に至ったポイントは以下の通りです。
・東京(六本木)でのオフライン開催
・交通費&宿泊費 全支給
・報酬10万円(+優勝賞金10万円)
・同年代のハイレベルな方々とのチーム開発
・バックエンドの使用言語がGo (フロントならJavaScript等)
・実際に動いているサービス(外資就活ドットコム)をベースにした
validatorのエラーフィールド名に構造体のフィールド名ではなくjsonタグ名をセットしたい
## この投稿で使用している言語、ライブラリのバージョン
* Go v1.17.1
* [github.com/go-playground/validator](https://github.com/go-playground/validator) v10.9.0## やりたいこと
[github.com/go-playground/validator](https://github.com/go-playground/validator)で構造体をバリデーションした場合、
エラーの中には以下のように構造体のフィールド名が埋め込まれています。“`go:main.go
package mainimport (
“fmt”
“strings”“github.com/go-playground/validator/v10″
)type Person struct {
Name string `json:”name” validate:”required,max=100″`
Email string `json:”email” validate:”requ
分岐もややこしい演算も無しの、クラス定義だけで書くFizzBuzz
## はじめに
プログラムに携わって一度もFizzBuzz書いたことないなと思ったので、サクッと書いてみました。
せっかくなので保守性高めるようなコードの書き方を意識して、分岐なしのコードをクラス表現を使って実現しています## コード
golangのinterfaceクラスにより処理を分け、mapにより分岐を削除しました。
ポリモーフィズムがあって、mapのようなkeyから設定値を取り出せるものがある言語 ~~であれば~~ はもちろん、無い言語でも配列をうまく扱うなどの工夫により、同様のコードが実現可能です“`golang:main.go
package mainimport “fmt”
//FizzBuzzのパターン分けをするための構造体
type FizzBuzz struct {
Fizz bool
Buzz bool
}//パターン網羅する為の構造体生成関数
func NewFizz() FizzBuzz {
return FizzBuzz{Fizz: true, Buzz: false}
}
func NewBuzz() FizzBuzz {
Go WebSocketを使ってみる
今回は Go言語 で WebSocket を使用してみたいと思います。
軽く感じをつかむだけなので、あまり手の込んだものは作りませんw
## やりたいこと
サーバー と クライアント で メッセージ を キャッチボール する。
・・・のを WebSocket を使ってやります。
~~これくらいなら ajax とかでいい感じもしますが、、、~~
## WebSocket とは?
下記の資料がわかりやすかったです。
WebSocketのキホン from You_Kinjoh理解した感じでざっくり説明すると、
Webのアクセスは、キャッチボールみたいな感じでブラウザ「〇〇のページをちょうだい」(要求)
サーバー「はいよ!」(応答)
で接続が切れてしまうのですが、
WebSocket を使用すると 電話のように常時つなぎっぱなしにできます。
利点としては、先ほどのキャッチボールを始める前に
いろいろな前処理がなくなるので応答が早くなります。リアルタイム性を求めるものによく使われている感じですね。
##