- 1. プログラム
- 2. チャットアプリケーションを作るアウトライン
- 3. 利用パッケージまとめ
- 3.1. 【Go言語】OpenWeatherMapとTwitterAPIを使ってお天気情報をラズパイから定期的にツイートさせる
- 3.2. 2020年から始めた個人開発で作ったWEBアプリとスマホアプリを振り返る
- 3.3. 【OSS】api_gen 公開
- 3.4. Raspberry Pi 4でUbuntuデスクトップを動かして遊ぶ
- 3.5. Go言語でconfigファイルを読み込む!簡単なサンプルを紹介
- 3.6. mongo-go-driverでBulkUpdateの実装
- 3.7. AWS SDK for Go v2を使ったS3のオブジェクトアップロードとダウンロードを使ってみる
- 3.8. LeetCodeに毎日挑戦してみた 167. Two Sum II – Input array is sorted(Python、Go)
- 3.9. Go言語でbitFlyerLightningのPrivateAPIにリクエストを出す方法
- 3.10. 送信元 MAC アドレス毎のトラヒック制限機能を Meter(RFC2698) を用いて P4/P4Runtime で実装する
- 3.11. Golang StatikでViperのConfigファイルとかFirebaseのCredentialとかをまとめてビルド
- 3.12. LeetCodeに毎日挑戦してみた 160. Intersection of Two Linked Lists(Python、Go)
- 3.13. 「The Go Memory Model」の読解
- 3.14. GoでGCSのファイルのアップロード&移動
- 3.15. CloudWatch Logsのログをローカル環境にダウンロードする
- 3.16. Go言語でoptinal型もどきを使う
AtCoder Beginner Contest 187のメモ
# 前置き
Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。# 問題
https://atcoder.jp/contests/abc187
# A
“`Q_A.go
package mainimport (
“fmt”
“strconv”
“strings”
)func main() {
var A, B string
fmt.Scanf(“%s %s”, &A, &B)
A_ := strings.Split(A, “”)
B_ := strings.Split(B, “”)a_1, _ := strconv.Atoi(A_[0])
a_2, _ := strconv.Atoi(A_[1])
a_3, _ := strconv.Atoi(A_[2])
a := a_1 + a_2 + a_3b_1, _ := strconv.Atoi(B_[0])
b_2, _ := strconv.Atoi(B_[1])
Goでオウム返しするLINEBOTを作ってみた
以下のサンプルプログラムを参考にしてオウム返しするLINEBOTを作ってみました。
https://github.com/line/line-bot-sdk-go/blob/master/examples/echo_bot/server.goAWSやHerokuにデプロイするのは面倒なので、ngrokを利用してローカル端末からサービスを外部に公開しました。
あとは、GitHubでプログラムを公開するときにチャネルトークンなどを公開するのは好ましくないので、iniファイルから取得するようにしました。プログラム
“`go:main.go
package mainimport (
“fmt”
“log”
“net/http”
“os”“github.com/line/line-bot-sdk-go/linebot”
“gopkg.in/ini.v1”
)type Config struct {
channelSecrt string
channelToken string
}var Cnf Config
func init()
GoのRDBアクセスライブラリ(go-pg/pg)の紹介
# はじめに
GoのRDBアクセスライブラリ、皆さんは何を利用していますでしょうか。
今回見つけた[go-pg/pg](https://pg.uptrace.dev/)が、自分的にめちゃくちゃイケてたので紹介します。go-pg/pgの日本語記事の第一号です!!(自分調べ)
# [go-pg/pg](https://pg.uptrace.dev/)とは
名前からもお察しの通り、PostgreSQLに特化したDBアクセスライブラリです。
次項に記載しますが、私が調べた中でもっとも機能が充実していました。Document: https://pg.uptrace.dev/
Pkg: https://pkg.go.dev/github.com/go-pg/pg/v10
Git: https://github.com/go-pg/pg# 機能
## その前に
以下のような機能をもつDBライブラリってあるのかなと調査したのが、そもそもの発端でした。
1. SELECTはRawSQLで書きたい(ORMは読みにくい)
1. RawSQLでは変数名でバインドしたい
1. Insert
Go言語によるWebアプリケーション開発_ハンズオン1日目
この参考書の内容をハンズオンしながら理解不足な箇所をまとめました。
https://www.oreilly.co.jp/books/9784873117522/
サンプルプログラムはGitHubで提供されています。
https://github.com/oreilly-japan/go-programming-blueprints/tree/master/chapter1/chatチャットアプリケーションを作るアウトライン
・HTMLを提供するWebサーバを作成する
・チャットメッセージのやり取りをする機能を追加する利用パッケージまとめ
パッケージ名 詳細 net/http HTTPクライアントおよびサーバーの実装を提供 text/template テキスト出力を生成するためのデータ駆動型テンプレートを実装 html/template< 【Go言語】OpenWeatherMapとTwitterAPIを使ってお天気情報をラズパイから定期的にツイートさせる
#やったこと
Go言語で特定の地域の天気と気温をツイートするアプリを作り、Raspberry Pi 4上からcronで自動実行させるようにしました。
OpenWeatherMapとTwitterAPIを利用しています。#環境
・macOS Catalina 10.15.7(開発と動作確認時)
・Raspbian 10.6(Raspberry Pi 4B)
・go 1.15.2#流れ
1.TwitterのAPIアカウント申請 & App作成
2.TwitterアプリのApp Permissons設定をReadからRead & Writeに変更
3.OpenWeatherMapのアカウント作成 & APIキーの取得
4.Go言語でツイートアプリ作成
5.作ったアプリをラズパイ向けにビルド & 配置
6.cronを使ってラズパイから自動実行させる#1.TwitterのAPIアカウント申請 & App作成
[Developerページ](https://developer.twitter.com/en/apps/)から開発者申請とTwitterアプリケーション作成を行い、API2020年から始めた個人開発で作ったWEBアプリとスマホアプリを振り返る
# 前置き
いつかやるぞーと思って先延ばしにしまくっていた個人開発を2020年の初めごろにえいやでやり始めました。
1,2本のWEBアプリが作れたらいいなと思っていましたが、勢い余って2本のWEBアプリと1本のスマホアプリを作りました。
宣伝もかねて投稿します。何かしら深堀りしたい内容がありましたらコメントよろしくお願いいたします。# Band Summary(β)
[https://bandsummary.com/](https://bandsummary.com/)![bandsummary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662111/e6a8fee7-b20e-50fe-05d4-87b0ec93c71e.png)
## どういうものか
ライブ情報を投稿管理でき、リンクを追加したらいい感じにまとめてくれるサービス
リンクツリー+バンドのライブ情報を投稿、管理なイメージ## 開発経緯
(周りの)インディーズバンドでホームページがないバンドが多くて、どこを調べたら
【OSS】api_gen 公開
# はじめに
– 決められたフォーマットで記述したGoの構造体からを自動生成するジェネレータがv1.0.0迎えたからアウトプットする回(12/31時点でv1.6.1)
– 主にコントローラーとAPI疎通するためのTypeScriptを生成するため、内包しているジェネレータは2つある
– 基本的には構造体を書くだけ
– (beta) 生成後のコントローラーにある程度swaggoに対応したgodocも挿入されている為、調整すればSwaggerコードも自動生成できる
– [リポジトリ(go-generalize/api_gen)](https://github.com/go-generalize/api_gen)—
# こんな方向け
– **Goコード正義**でAPIコントローラー/クライアントを自動生成したい
– エンジニア間でバックエンドとフロントエンドのI/Fを合わせるのがめんどくさい
– バックエンドでルーティング、フロントエンドでAPIリクエストを実装ごとに書くのが辛いこんな人達に向いている
—
# とりあえず試す
###### 前提: [こちら](httpsRaspberry Pi 4でUbuntuデスクトップを動かして遊ぶ
# はじめに
Raspberry Piはこれまでにも少し触ったことがありましたが,Raspberry Pi 4になってRAMが4GBになり,さらに秋ころにUbuntuデスクトップが正式対応されたと聞いたので,単純に動かして遊んでみたときのメモです.
# やってみたこと
基本はRaspberry Pi 4上でUbuntuデスクトップ(GNOME 3)を動かしてみただけです.あとはリモート操作できるようにや,ちょっとしたプログラミング環境を作ってみました.
* Ubuntu Desktop 20.10をインストールして動かす
* ChromiumをインストールしてYouTubeを見てみる
* リモート接続環境のセットアップ(SSH,VNC)
* Visual Studio Codeをインストールして動かす
* PythonでHello world
* GoでHello world(Windowsでクロスコンパイルしてラズパイで動かす)# 準備したもの
* Raspberry Pi 4 4GB(スターターキット)
* タッチディスプレイ 7インチ
* キーボード・マウス
* スGo言語でconfigファイルを読み込む!簡単なサンプルを紹介
公式ドキュメント→https://gopkg.in/go-ini/ini.v1
### パッケージをインストール
“`
go get gopkg.in/go-ini/ini.v1
“`### ファイル構成
“`
.
├── config
│ └── config.go
├── config.ini
└── main.go
“`### iniファイルを作成
“`config.ini
[api]
api_key = aaaaaa
api_secret = bbbbbbb[db]
password = ccccc
etc…
“`上記の[api][db]のようにセクションごとに分けてあげると管理がしやすい。
クォーテーションなどで囲む必要はなし。### configファイルを作成
“`config/config.go
package configimport “gopkg.in/ini.v1”
type ConfigList struct {
APIKey string
APISecret string
Passwordmongo-go-driverでBulkUpdateの実装
## 概要
RDBにはだいたいBulkUpdate(一括更新)の機能があるのですが、MongoDBにおいてもその機能が用意されています。こちらの[ドキュメント](https://docs.mongodb.com/manual/core/bulk-write-operations/)にある通り、更新系のクエリをまとめて実行できます。
今回はGolangでupdateのクエリをBulk形式で実行する例を紹介します。## 対応
[Golang. MongoDB bulkWrite() to update slice of documents](https://stackoverflow.com/questions/58538657/golang-mongodb-bulkwrite-to-update-slice-of-documents)の記事にある通り、mongo-go-driverのcollectionに`BulkWrite`のメソッドが用意されています。BulkWriteの引数に、`mongo.WriteModel`の配列に定義したクエリを設定して実行します。## 実装サンプル
AWS SDK for Go v2を使ったS3のオブジェクトアップロードとダウンロードを使ってみる
## 概要
* まだRC版だけど、AWS SDK for Go v2を使ったS3のオブジェクトアップロードとダウンロードを使ってみた。
https://github.com/aws/aws-sdk-go-v2* goを普段触らなけど練習で書いてみた。
## 前提条件
Goのバージョンがv1.15であること
“`
$ go version
go version go1.15 linux/amd64
“`## 準備
“`bash
go mod init awssdkappgo get -u github.com/aws/aws-sdk-go-v2
go get -u github.com/aws/aws-sdk-go-v2/config
go get -u github.com/aws/aws-sdk-go-v2/feature/s3/manager
go get -u github.com/aws/aws-sdk-go-v2/service/s3
“`“`
touch main.go
mkdir myclient
touch myclient/myLeetCodeに毎日挑戦してみた 167. Two Sum II – Input array is sorted(Python、Go)
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。
#### 37問目(問題167)
#### 167. Two Sum II – Input array is sorted
#### 問題内容
> – Given an array of integers that is already ***sorted in ascending order\***, find two numbers such that they add up to a specific target number.
>
> The function twoSum should return indices of the two numbers such that theGo言語でbitFlyerLightningのPrivateAPIにリクエストを出す方法
Go言語でbitFlyerLightningのPrivateAPIにリクエストを出す方法
====
bitFlyerLightningAPIの[公式ドキュメント](https://lightning.bitflyer.com/docs/playground?lang=ja#GETv1%2Fgetmarkets/javascript)上に、Go言語でリクエストを出す場合のサンプルコードがなかったため、調査結果をメモした。
本記事では、childOrderを出す場合の手順について解説する。## 概要
基本的に、Go言語でのbitFlyerLightningAPIへのPrivateリクエストは、下記の手順にて実施する。
1. bitFlyerにログインして、アクセスキー、シークレットキーを取得する。
2. SHA256でデジタル署名を作成する。UNIXタイムスタンプ、メソッド、apiのパス、リクエストボディを文字列として連結し、それらの文字列をシークレットキーを利用して、SHA256でハッシュ化したものをデジタル署名としている。
3. アクセスキーとデジタル署名とタイムスタンプを送信元 MAC アドレス毎のトラヒック制限機能を Meter(RFC2698) を用いて P4/P4Runtime で実装する
# はじめに
[前回の記事](https://qiita.com/13ryuse4/items/96ed8b31382e1fdd79f1)では [P4Runtime](https://p4.org/p4runtime/spec/v1.3.0/P4Runtime-Spec.html) を用いてテーブルエントリ登録やトラヒックカウンタ値の取得を行うコントロールプレーン機能を実装しました. 今回は取得したトラヒックカウンタ値に基づき,指定のトラヒック量を超過した場合に一定時間トラヒック制限を適用する機能を実装します.特に,カウンタ値の取得は送信元 MAC アドレス毎に行い,またデータプレーンにおけるトラヒック制限は Meter ([RFC2698](https://tools.ietf.org/html/rfc2698)) を用いて実装します.
本記事で説明する内容のソースコードは[こちら](https://github.com/ryu-s-4/p4-practice/tree/master/traffic-limitter)で公開していますので併せて参照ください.P4 ってそもそも何?
Golang StatikでViperのConfigファイルとかFirebaseのCredentialとかをまとめてビルド
## Viper
GoのConfig用ライブラリ。プロジェクトの外に置いて監視するつくりっぽいが、バイナリに含めたかったため調べて実装した。
Firebaseの方はセキュリティ的にどうなんだろうか・・・
https://github.com/spf13/viper## 全体構成
“`
プロジェクトルート/
├ asset/
│ ├ environment/環境名.yaml
│ └ firebase/クレデンシャル.json
│
├ statik/statik.go
├ config/config.go
├ firebase.firebase.go
└ main.go
“`
##### statikを導入
“`
$ go get github.com/rakyll/statik@v0.1.7
“`##### プロジェクトルート/assetの下にenvironment/環境名.yamlとfirebase/credential.jsonを設置する。
##### コマンドを実行。statik/statik.goが生成
LeetCodeに毎日挑戦してみた 160. Intersection of Two Linked Lists(Python、Go)
#### Leetcodeとは
[leetcode.com](https://leetcode.com/)
ソフトウェア開発職のコーディング面接の練習といえばこれらしいです。
合計1500問以上のコーデイング問題が投稿されていて、実際の面接でも同じ問題が出されることは多いらしいとのことです。golang入門+アルゴリズム脳の強化のためにgoとPythonで解いていこうと思います。
#### 36問目(問題160)
#### 160. Intersection of Two Linked Lists
#### 問題内容
> Write a program to find the node at which the intersection of two singly linked lists begins.
>
> For example, the following two linked lists:
>
> [![img](https://assets.leetcode.com/uploads/2018/12/13/160_statement.png)](https:/「The Go Memory Model」の読解
「The Go Memory Model」
https://golang.org/ref/mem
の理解をまとめる。## Channelの3つのルール
上の記事に、Goのchannnelの送受信に関する3つのルールが載っている。#### ルール1
**A send on a channel happens before the corresponding receive from that channel completes.**
(チャネルへの送信は、それに対応する受信が完了する前に行われる。)
#### ルール2
**A receive from an unbuffered channel happens before the send on that channel completes.**
(バッファなしのチャネルに対しては、送信が完了する前に、受信が行われる。)
#### ルール3
**The *kth* receive on a channel with capacity *C* happens before the *k*+*Cth* send fromGoでGCSのファイルのアップロード&移動
GCSにファイルをアップロードをしたり、移動したりするのをGolangでやってみました。
レポジトリはこちらに置いてあります。dockerコンテナを立てて試すことができます。
https://github.com/greenteabiscuit/gcs-golang## 前提条件
– GCPのアカウントがある
– Dockerのダウンロードができている
– GCSの閲覧、編集権限のある鍵ファイルをダウンロードできている## やること
1. 空のファイル`sample.txt`をGCSにアップロードしてみる
2. GCSにアップロードできた`sample.txt`を別のディレクトリに移動する## 1. アップロードしてみる
“`main.go
package mainimport (
“context”
“io”
“log”
“os”“cloud.google.com/go/storage”
“google.golang.org/api/option”
)func main() {
credentialFilePath := “./key.jCloudWatch Logsのログをローカル環境にダウンロードする
# 概要
CloudWatch Logsコンソールからログを収集する作業が地味にきついのでツールを作りました。
# ソースコード
https://github.com/naomichi-y/cloudwatch-logs-downloader
# 特徴
* dockerベースなのでセットアップ手間いらず
* ロググループを指定することで、ログストリームを跨いだ検索が可能
* 正規表現に一致したメッセージのみ抽出可能
* 出力フォーマットはJSON形式# 使い方
ロググループ `ecs/production` における2020年12月27日 15時59分 (UTC) のログを取得する場合。
“`
$ docker run –rm -it –env-file=.env -v ${PWD}:/go/src/app cld -group=ecs/production-log -start=”2020-12-27 15:59:00″ -end=”2020-12-27 15:59:59″2020/12/29 07:05:42 Write results…
2020/Go言語でoptinal型もどきを使う
# はじめに
go言語を使用していて、optionalが使えなくて困ったため。
ライブラリを入れる程ではないので、以下のコードを参考に書いてみた。
参考 https://github.com/markphelps/optional# 実装したメソッドの概要
#### NewInt(i int) optional.Int
optional型を作成する。
#### Get() (int, bool)
optinalの中身を取り出す。値が存在するときは、value true, ないときは、0, falseを返す。
#### Set(i int)
optionalに値を設定する。
#### Present() bool
値があるか、どうかをチェックする。# コードの中身
“`golang
package optional// Int – optional int
type Int struct {
value *int
}// NewInt – create an optional.Int from int
func NewInt(i int) Int {
return関連する記事
OTHERカテゴリの最新記事
- 2024.09.19
JavaScript関連のことを調べてみた
- 2024.09.19
JAVA関連のことを調べてみた
- 2024.09.19
iOS関連のことを調べてみた
- 2024.09.19
Rails関連のことを調べてみた
- 2024.09.19
Lambda関連のことを調べてみた
- 2024.09.19
Python関連のことを調べてみた