- 1. Linuxでもお名前.com DDNS
- 2. 高校生が2ヶ月で教育用プログラミング言語を作ってU22プロコンで賞をとった話
- 3. 【HTTPヘッダー】CORSの仕組みとGo+GinによるCors設定の実践
- 4. 【Go】「binary.Write: invalid type 」が発生してバイナリ書き込みができない
- 5. 【並列・並行解説付き】goroutineでマルチスレッド処理を試してみた
- 6. Dockerコンテナ内で面倒なgo buildを実行する
- 7. RTPで受け取った動画をgolangで画像処理したい
- 8. 初心者向けGo問題集~演算子編~
- 9. プロキシ経由の社内ネットワーク接続のWindows端末でgo get ができない難民へ
- 10. 初心者向けGo問題集~スライス編~
- 11. GO言語を使って自分のPCでWEBサーバー構築
- 12. VSCode devcontainerを使って面倒な開発環境を作る
- 13. Docker上のMySQLにMac上のGoアプリから接続するのにハマった
- 14. Gopher君のかるた大会
- 15. 今週のアルゴリズム:最短経路の計算!(Go2/Crystal/Kotlin/Nim/Juliaでpermutation iterator)
- 16. GOでファイルを分ける時
- 17. Lambda + Goでネストされたアプリケーションを構築
- 18. go言語でSlackのWebhookをやろうとして苦労したので備忘録
- 19. Go(ver1.16.2) でgodocを使えるようにするための手順
- 20. [Go]goqueryで超簡単!Webスクレイピングを試してみた
Linuxでもお名前.com DDNS
# はじめに
お名前.com使ってますか?
僕はお名前.comでドメインを借りてます。ふと、家のマシンをインターネット公開しようとDDNSしようと思ったのですが、クライアントがWindowsしかありませんでした。調べてみると簡単にできそうだったので、肝となるコードは参考しつつ、Goで書いてみました。
利用の際は自己責任でお願いします。
# 機能紹介
## リポジトリ
https://github.com/miya-masa/onamae-go## ヘルプ(リリース当初)
“`
❯ onamae-go -h
flag needs an argument: -h
Usage of onamae-go:
-d string
Domain. ex. example.com
-daemon
Launch as daemon
-h string
Hostname. ex. www
-i https://httpbin.org/ip
IP address. If empty, will get it au
高校生が2ヶ月で教育用プログラミング言語を作ってU22プロコンで賞をとった話
#前置き
2020/11/29に開催された U22プログラミングコンテスト2020 において経済産業省政務局長賞プロダクト賞及びOBC賞を頂きましたので、開発経緯をまとめてみたいと思います。拙い文章だとは思いますが、U22プログラミングコンテストに応募してみようと考えている方や自作言語に興味がある方への参考になれば幸いです。
##自己紹介
最初にちょっとした自己紹介を…
プログラミングが趣味な一般高校二年生(4月から3年生)です。
プログラミングはScratchを小学生4年生から、JavaScriptを中学1年生からはじめました。高校に入ってからプログラミング学習を本格的に初め、C, C++, Swift, PHP, (SQL), Go などを学習しました。(まだマスターには程遠いですが..)
一番なれている分野はサーバーサイドで、文化祭の物品管理データベースの作成やスーパー混雑共有サービスなどを今までに作りました。
#応募作品について
今回のU22プログラミングコンテスト(以下U22プロコン)で提出した作品は
【HTTPヘッダー】CORSの仕組みとGo+GinによるCors設定の実践
#はじめに
`localhost:80`で立てたWebサーバー(nginx)から
`localhost:8080`に立てたAPIサーバー(golang)にリクエストを送った時に、
CORSエラーが発生し、APIが叩けないところでハマったので、
学びとしてまとめます。#そもそもHTTPとは?
>HTTP は、 HTML 文書などのリソースを取り出すことを可能にするプロトコルです。これはウェブにおけるデータ交換の基礎をなし、クライアントサーバープロトコルであり、リクエストは受け取り者 (一般にはウェブブラウザー) が生成します。文書全体は、テキスト、レイアウトの定義、画像、動画、スクリプトなど、取り込まれたさまざまなサブ文書から再構成されます。
参考元:[HTTP の概要](https://developer.mozilla.org/ja/docs/Web/HTTP/Overview)– プロトコルの一種
– ウェブにおけるデータ交換の基礎
– シンプルで人間が読めるように設計されている
– HTTPヘッダーで、プロトコルの拡張や検証が簡単
– ステートレスだけど、HTTP Co
【Go】「binary.Write: invalid type 」が発生してバイナリ書き込みができない
# 問題
以下のような構造体をバッファに書き込もうとしてエラーが発生した。
“`go:main.go
type T1 struct {
A int8
B int8
}type T2 struct {
T1
C string
D int8
}
var (
t1 T1
t2 T2
)t2.T1 = t1
t2.C = “hoge”
t2.D = 1234buf := new(bytes.Buffer)
// ここで該当のエラーが発生
//
// binary.Write: invalid type *main.T2
err := binary.Write(buf, binary.LittleEndian, &t2)“`
# 原因
埋め込みがまずいと予想していたが、どうやら**string**を書きこもうとして出力されるエラーだとわかった。ドキュメントによると、[^1]
>Write は data のバイナリ表現を w に書き込みます。 data は,固定サイズ値または固定サイズ値のスライス,あるいはそのようなデータへのポイン
【並列・並行解説付き】goroutineでマルチスレッド処理を試してみた
#はじめに
タイトルをあえて、**”マルチスレッド”**とだけ書き、`並行・並列`という言葉を使うのを避けました。
理由としては、– `goroutine`は`runtime.NumCPU()`の値(論理コア数)が複数だった場合、並列処理となる。
– 論理コアごとに`gorotine`と紐づくカーネルスレッドが実行される**`M:Nモデル`**を採用しているので、同時に複数の処理が走る。(並行処理)ただ、**並行は並列**を包含するので、
強いて言えば、goroutineは、並行処理というのがいいのかもしれませんね。すでに「並」でゲシュタルト崩壊発生( ;´Д`)
#マルチスレッドとは
すでに、並列処理・並行処理ってなんやねん!!って状態だと思いますが、
図をご覧下さい。
![スクリーンショット 2021-03-25 11.48.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/466c42e6-c416-e1bd-70be-57d4de34a8c4.png)##
Dockerコンテナ内で面倒なgo buildを実行する
https://qiita.com/kishibashi3/items/2b1e342d1ce3957b3dc8
の続き。
# 概要今回作成したサービスがopencvなどの環境を作成するのが面倒で、buildするのも一苦労するため、buildについてもdockerの中でやってしまおう、ということで試してみた。
### topic
* opencvやgstreamerなど多くのライブラリが必要
* 開発環境用docker imageがそのまま使用できそう
* goライブラリの中に、privateなライブラリが含まれている
* 上記にアクセスするために、SSH鍵が必要
* 前段のgo build処理 、通常のdocker buildのマルチステージビルド# Dockerfile
今回作成したDockerfileは以下。
ベースイメージである`ghcr.io/my_organization/devcontainer-go1.15-opencv4.5:latest`については、
https://qiita.com/kishibashi3/items/e20a
RTPで受け取った動画をgolangで画像処理したい
https://qiita.com/kishibashi3/items/e20aecef45ed8341e739
の続き。
# 概要動画を受け取り、動画から受け取ったフレームをある間隔で画像処理するようなアプリケーションをgolangで書きたい。
画像処理ライブラリとしてopencvを利用する必要があり、ラッパーとしてgocvを利用した。
試行錯誤した結果 opencv.OpenVideoCaptureという関数のバックエンドとしてgstreamerが使用できるという記事があり、試してみた。# 構造
実際にはRTPの前にはWebRTCがあり、今回はSkyway WebRTC Gatewayを用いてWebRTC->RTPに変換している。
https://github.com/skyway/skyway-webrtc-gateway
![image.png](https://qiita-image-store.s3.ap-northe
初心者向けGo問題集~演算子編~
Goの”基礎文法”を勉強中の方に向けた問題集です!
書籍や動画を使用したインプット中心の勉強になっていると感じたので、問題を作成してアプトプットすることにしました。(自身も初心者なので、問題集で間違っている箇所があれば教えてください。)
*********###演算子編###
####=問題=
Q1. 3 + 1 の答えを表示
Q2. 3 – 1 の答えを表示
Q3. 3 × 1 の答えを表示
Q4. 3 / 1 の答えを表示
Q5. 30 / 4 の余りを表示Q6. +演算子を用いて、「Hello Go」を表示
プラスα. 「Hello Go」2番目の文字「e」を表示
プラスα. 「Hello Go」を「Hello go」に変更
プラスα. sの文字列に「Hello」が含まれているか?下記の実行結果をtrue/falseで答えてください。
Q7.fmt.Println(true && false == true)
Q8.fmt.Println(true && true == true)
Q9.fmt.Println(true || false == true)
10
プロキシ経由の社内ネットワーク接続のWindows端末でgo get ができない難民へ
社内業務改善のツールを開発したい!(業務でGoを使用する機会はないので、少しでも理言語理解を深めるための時間にしたい!!)という思いで意気込んでいたところ、タイトルのとおり社内ネットワークを経由している端末でgo get(正確にはVSCodeの環境構築(Go:Install/Update Tools))ができませんでした。
エラーメッセージからプロキシに関する設定に問題があることはすぐわかりましたが、なかなか対処できずに苦戦しました。
## 確認すべき事項は以下の2点だけ
かなり苦戦してしまいましたが、以下2点の対応で解決します。
– Gitのプロキシ設定に過不足がある
– VSCodeのプロキシ設定に過不足がある以下に対処法の詳細を記載します。
### 「Gitのプロキシ設定に過不足がある」の対処法
コマンドプロンプトで以下を実行する
“`bash
git config –global http.proxy http://192.168.1.1:8080
git config –global https.proxy http://192.168.1.1:808
初心者向けGo問題集~スライス編~
Goの”基礎文法”を勉強中の方に向けた問題集です!
書籍や動画を使用したインプット中心の勉強になっていると感じたので、問題を作成してアプトプットすることにしました。(自身も初心者なので、問題集で間違っている箇所があれば教えてください。)
********************
###スライス編###
####=問題=
Q1.実行結果が[1 2 3 4 5]となるスライスslを作成してください。Q2.slの最初の要素を取得してください。
Q3.slの2番目から3番目の要素を取得してください。
Q4.最後の要素を取得してください。
Q5.slの最初と最後の要素以外すべてを取得してください。Q6.slの要素数を調べてください。
Q7.slのキャパシティ(容量)を調べてください。Q8.slに要素[6 7]を追加してください。
********************
####=解答=
Q1.実行結果が[1 2 3 4 5]となるスライスslを作成してください。“`Go:A1.go
func main() {
//明示的
var sl []int = []i
GO言語を使って自分のPCでWEBサーバー構築
モジュールについて学習している中、ここに来てプログラミング入門者である私に初めての課題が課せられました。自分のパソコンを使いWEBサーバーを立ててみて下さいというものでした。今まで動画や参考書に頼りっぱなしで、自分の力でなんとかするとなると、まず何からしていいのかさっぱりでした。まず、自分のパソコンをサーバーにするで検索をかけましたが知見が足りなすぎて、いろんなところを行ったり来たり。ヒントを頂き、Qiitaでなんとかそれらしき記事を発見! 早速作業にとりかかりました。GOには標準でHTTPパッケージが用意されているようで、自分のIPアドレスを使用し、ローカル環境で静的コンテンツを作ることができます。
“`
mkdir HELLO
cd HELLO
“`
では、ディレクトリ(コンピュータのファイルシステムにおいて、ファイルをグループ化するための特殊なファイルで、整理・管理する場所)をターミナル画面で作成していきます。“`
touch main.go
mkdir -p start/stylesheets
touch start/index.html start/stylesh
VSCode devcontainerを使って面倒な開発環境を作る
# 概要
ある案件で、opencvを使って映像を扱うサービスを構築した。
各開発者の開発環境をどう作るか頭を悩ませた。
opencvをビルドするのに2時間近くかかってしまうし、gstreamerのインストールやらもろもろのライブラリやら考えると、環境整備だけで気が遠くなりそう。検索していると以下のような記事を見かけた。
https://qiita.com/d0ne1s/items/d2649801c6f804019db7
あらかじめ開発環境をdocker image化しておき、それをそれぞれの開発PC上で起動する事ができれば、開発参画が簡単になるのでは?
ということで、試してみた。# 要件
* 開発言語はgolang1.15
* opencv4.5.1
* gocv0.26.0
* gstreamer
* Redisgstreamerで映像を受け取ってgocvで画像処理。結果をRedisに格納。
# 手順
事前に必要なものは
module | desc
–|—
VSCode | IDE
VSCode Remote Container | VSCodeの拡
Docker上のMySQLにMac上のGoアプリから接続するのにハマった
– Docker上のGoアプリ → Docker上のMySQL
– Docker上のGoアプリ → RDS(AWS)上のMySQL
– Mac上のGoアプリ → Mac上のMySQL
– Mac上のGoアプリ → RDS(AWS)上のMySQLこれら接続はやったことがあったのですが、
– Mac上のGoアプリ → Docker上のMySQL
の接続に数時間ハマってしまいました。
ググっても意外と情報が少なくて苦しんだので、メモしておきます。## やりたかったこと
Mac上のGoアプリ → DockerのMYSQL
この接続をしたい## 環境
Docker version 20.10.5
MacOS Big Sur 11.2.3
Go 1.15
MySQL 8.0.23## 結論
### MySQL
Docker ファイルを作ります。“`dockerfile
FROM mysql:8.0.23ENV MYSQL_ROOT_PASSWORD rootpass
ENV MYSQL_USER username
ENV MYSQL_PASSWORD passw
Gopher君のかるた大会
## 概要
問題文が消失したため不詳だが、 https://github.com/cielavenir/codeiq_solutions/blob/master/00misc/comb/comb_test.go なるテストコードがpassすれば良い。
つまり、
“`
func main(){
strs := []string{“A”, “B”, “C”, “D”, “E”}
for i := range comb.CombinationGenerator(5,2){
var actual []string
i.Index(strs,&actual)
fmt.Printf(“%v\n”, actual)
}
}
“`なるmainに対し、
“`
[A B]
[A C]
[A D]
[A E]
[B C]
[B D]
[B E]
[C D]
[C E]
[D E]
“`なる出力をすれば良い。
本問に関して、 https://qiita.com/cielavenir/items/d82515b7d12ab25afa56 にて、「Goの型システムは死
今週のアルゴリズム:最短経路の計算!(Go2/Crystal/Kotlin/Nim/Juliaでpermutation iterator)
|Permutation Iterator|next_permutation|URL|
|:–|:–|:–|
|C#/Go/Python/Ruby/VB| |まとめ含む http://qiita.com/cielavenir/items/ac96da5e3040c2edb78c|
| |Boo/C#/Nemerle/VB|http://qiita.com/cielavenir/items/0e07a024049017f7dea2|
| |Java/Groovy/Scala/Fortran/Pascal|http://qiita.com/cielavenir/items/4347fd0c6c69fa60804a|
| |D/Go/JavaScript/Lua/R|http://qiita.com/cielavenir/items/9e821d04f574a6623d03|
|Perl|HSP/PHP/Python/Ruby|http://qiita.com/cielavenir/items/006a878292c5be209231|
|Go2/Crystal/Kotlin/Nim
GOでファイルを分ける時
##初めに
Goって公開されてるパッケージを組み合わせてなんやかんやするのがメインで
ファイルがすんごく長くなる事ってあんまり考えないのかな?
普通に見にくくなっちゃうと思うので、ファイルを分ける方が好きだったりします。そして、ファイルを分けるのにドはまりしたので、書いておく
一応Windowsの場合です。##長くなったmain.goを分割する
**フォルダ構成はこうしたい!**
※一応[公式の推奨フォルダ構成](https://github.com/golang-standards/project-layout)を参考にした“`
GOPATH/
src/
└ test/ <-今回のプロジェクトルート ├ cmd/ │ └ textApp/ │ └ main.go └ intarnal/ └ sub/ └ sub.go ``` ##まずはとりあえず、go mod init 〇〇〇〇 する CMDで以下を実行 ``` cd GOPATH<皆良い感じに変えてほしい>/test
go mod init
Lambda + Goでネストされたアプリケーションを構築
![1280px-Go_Logo_Aqua.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525769/2b8f3e0b-9e8b-1355-2e71-ffd3570f9337.png)
LambdaでGoを使ったAPIを作成したときの話
あるサービスでGoを採用し、Lambda上でapiを作成することになった、最初は小規模の認識で開発を行っていたが、仕様がどんどん膨らみ気づいた時にはエンドポイントが150を超え、そしてやってきたリソース制限“`
Template format error: Number of resources, 206, is greater than maximum allowed, 200
“`ネストさせることで回避できることを知り、ネストするも“`sam build“`できず、結局ネストされた各アプリケションを個別にビルドし、マージするシェルを書いて運用していた。
苦労した話を書こうと思い調べていると、いつの間にかネストされたアプリケーションのビルド
go言語でSlackのWebhookをやろうとして苦労したので備忘録
### 環境
* go 1.15
* slack 2021/03/22時点## goの `url.QueryEscape` は空白( )をプラス(+)に変換する
URLエンコード的にはプラス(+)でも問題ないが、 `%20` に変換したい場合は以下のようにする。“`
str = regexp.MustCompile(([^%])(+)).ReplaceAllString(str, “$1%20”)
“`## Slackのサンプルには下記コマンドが提供されているがダブルクォートのエスケープが必要なのか分からない。。
`curl -X POST –data-urlencode “payload={\”channel\”: \”#any_channel\”, \”username\”: \”webhookbot\”, \”text\”: \”This is posted to #any_channel and comes from a bot named webhookbot.\”, \”icon_emoji\”: \”:ghost:\”}” https://hooks.
Go(ver1.16.2) でgodocを使えるようにするための手順
## godocとは?
Go言語は、**godoc** というコマンドがあります。このコマンドのおかげでgolang.orgのパッケージのドキュメントをオフラインで閲覧することが出来ます。## 前提条件
#### 環境
– OS : macOS Big Sur バージョン11.2.1– Go : 1.16.2 darwin/amd64
#### 状態
Goをインストールしたときに、一緒にインストールされるはずのgodocコマンドが使えない。####やりたいこと
godocを使って、オフラインでドキュメントを閲覧したい。またWebサーバーとして起動して、ブラウザ上で確認したい。## 手順
go get コマンドでgodocコマンドをインストールします。
“`shell
$ go get golang.org/x/tools/cmd/godoc
“`$GOROOT/binのパスを通す。
“`shell
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
“`以
[Go]goqueryで超簡単!Webスクレイピングを試してみた
#はじめに
私が、Webマーケッターをやっていた頃、
エンジニアたちがよく、
「このページをスクレイピングして…DDoSならないように、秒間隔空けて…」
とかいうやりとりをしていて、そう言えば、自分でもスクレイピングに憧れて、
[import.io](https://www.import.io/product/extract/)
とかいうスクレイピングの超便利サービスも使ってたなあと懐かしい思いがこみあげまして、、、エンジニアになった自分もスクレイピングなるものを試してみようと思いたったので挑戦してみますた。
#ウェブスクレイピングとは
>ウェブスクレイピング(英: Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー[1]あるいはウェブ・スパイダー[2]とも呼ばれる。 通常このようなソフトウェアプログラムは低レベルのHTTPを実装することで、もしくはウェブブラウザを埋め込むことによって、WWWのコンテンツを取得する。
参考:[wikipedia ウェブスクレイピング](https://ja.wikipedia