- 1. ミニ Abema作ってみたい Part.2
- 2. 密っこくん
- 3. ミニ Abema作ってみたい
- 4. 【Go言語学習】struct{}{}
- 5. 【Golang】Goroutineについて
- 6. Go言語で可変引数の関数にスライスを展開する方法
- 7. JavaのOptionalをgolangにportする – Method Reference と Method values
- 8. Go言語でテストごとにデータベースを空にする方法
- 9. 初めてのオニオンアーキテクチャ実装チャレンジ
- 10. [Go言語] Echo でルーティング
- 11. 【Go言語学習】ポインタのレシーバの実験
- 12. 【個人開発】AIがおすすめの飲食店を教えてくれるLINEチャットボットを作りました
- 13. Goでwebアプリケーションを作成してみよう!~webアプリケーションとは~
- 14. blastengineを使ってGo言語でメールを送信する
- 15. 今回のプロジェクトを終えて #02
- 16. 【Go言語学習】引数の参照渡しについて
- 17. Go gosimple S1016 警告について
- 18. 【Go言語】テンプレートエンジンでtableをレンダリングしてechoで表示してみた
- 19. 【Cloud Spanner】yoを使ってスキーマからGoの構造体を生成する
- 20. 【Go言語学習】chan struct{}
ミニ Abema作ってみたい Part.2
# 下記記事の続き
https://qiita.com/new_hello/items/d9c3f930c5f583e67674## 技術選定
Kotlin Go Azureかその他インフラサービスで構築する
(Chatgptを積極的に使う)## 最低限のアプリを構築しながら必要な機能を盛り込めるようにバックエンド側を構築していく。
お試しなので、開発環境と本番環境には分けず、開発を進める。IaaSで開発を進めたいが、高そうなので、自分のPCをサーバとする。## 第一の目標
NHKのサイトから以下動画をお借りする。
https://www2.nhk.or.jp/archives/movies/?id=D0002161720_00000
まずは、この動画をループでサーバに乗せ、Android端末で見られるようにするところまでを第一の目標とする。## まずは、設計から考える
インフラ・バックエンドとフロントエンドに分けて考えていく。
インフラ側では、サーバの構築からネットワークの設定、セキュリティの確保などが必要。
バックエンド側では、動画の登録からループ再生までやる。
フ
密っこくん
# 目次
[1. 概要](#1-概要)
[2. 背景](#2-背景)
[3. 技術スタック](#3-技術スタック)
[4. アプリの詳細](#4-アプリの詳細)
[5. GitHubリポジトリ](#5-githubリポジトリ)
[6. まとめ](#6-まとめ)
# はじめに
このアプリは**Golang**と**Websocket**による**双方向通信**を学びたいというモチベーションのもと、唐突な思いつきで作成したアプリです。(現在もまだ修正中。最終的には一時的にでもデプロイしたい。)
**やさしい目**で見てもらえると嬉しいです。
とりあえずアプリの発信のために本記事を書いてます。
**(※使用する場合はリポジトリの注意書きを参照して下さい。)**また双方向通信やGolangについてはまた別でまとめられればと思ってます。
(現状あまりやる気が…)
# 1. 概要
みなさん、こんな経験ないですか?### 学校で、授業中寝てる友達に先生が気づくように、音を立てて先生の注目を引いたりして、どうにか友達をチクりたい!
みたいな経験ありませんか?(周りにはないと言わ
ミニ Abema作ってみたい
# Abemaを作ってみたい
作るならどんな感じになるか考えてみた# スコープ
Androidのabemaアプリのミニ版(機能 超縮小版)を作成する。
Azure等のサービスを使い、インフラ・バックエンドまで簡単に構築する。## 実装したいAbemaの機能
時間が限られているため、動画タイプは実装せず、配信型のみ実装する。
配信型で全画面表示時、画面上にコメントが表示されようにするタイプの実装を目指す。(既存abemaにない実装となる)
(niconicoの特許に抵触しないよう気をつけたい、)
コメントを打てるようにする。
ユーザーごとにidを振る。
配信が始まったときに、プッシュ通知を出せるようにする。
画質設定ができるようにする。
ユーザーIDに紐づいたマイリストを作る
リンクでシェアできるようにする
CMを定期的に流せるようにする
埋込み型の広告を表示できるようにする# やるべきことの洗い出し
プレイストアへの登録(可能な範囲で)
広告表示の方法調査(手続きがめんどくさそうでなので、学習レベルで)
フロントエンドの実装
バックエンドの実装
インフラの構築
【Go言語学習】struct{}{}
## struct{}{}
再度、なんだこりゃと思い以前、関数の引数の定義において c <-chan struct{} という表現を知った時、メモリを消費しない表現であると認識したが、受信専用で有ったためか struct{}{} は出てこなかったようで... マップや送信専用チャネルの変数に入れる際は c chan<- struct{}{} とするようで、 意味としては struct{}型の空のインスタンス(値が何も無いので、値を管理するためのメモリを消費しない) を表現しているとのこと。 ・インスタンス自体は存在するためnilではない ・配列のノリで struct{}{}{} をやると、文法エラー ・interface{}{}も文法エラー ## mapで試す ```Go package main import "fmt" func main() { set := make(map[string]interface{}) // 要素を追加 set["item1"] = struct{}{} set["item2"] = "" set["item3"] = nil
【Golang】Goroutineについて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985550/f22aafef-3524-8098-0d36-551dc0f21a01.png)
## Goroutine
とても簡単に言うと、`Goroutine (ゴルーチン)`とは、Go言語で**並列処理**を簡単に実現するためのものです。
参考)
https://go.dev/doc/effective_go#goroutines
**並列処理**を適切に実装することで実行効率が良くなります。
具体的には、複数のCPUを利用してタスクを分散することで、全体の処理速度を高めることができます。
**3**秒かかる処理`A`と、**2**秒かかる処理`B`の2つを実装してみましょう。
まずは、`Goroutine`を使わずに直列で実装します。
“`golang:main.go
// 3秒かかる処理
func A() {
time.Sleep(3 * time.Second)
println(“A”)
}/
Go言語で可変引数の関数にスライスを展開する方法
Go言語において、可変引数の関数を扱う際、スライスを引数として、関数が可変数の引数を受け取る場合に非常に便利です。例えば、ログの出力、数値の集計、文字列の結合など、さまざまなシチュエーションで役立ちます。
### 可変引数の基本
まず、可変引数関数の基本から見ていきましょう。可変引数関数は、任意の数の引数を同じ型で受け取れる関数です。関数定義時には、パラメータの型の前に `…` を置くことで、その型の任意の数の引数を受け取ることを示します。
例:以下の max 関数は、渡された整数の中から最大値を返します。
“`go
func max(values …int) int {
maxVal := values[0]
for _, val := range values[1:] {
if val > maxVal {
maxVal = val
}
}
return maxVal
}
“`### スライスを可変引数に展開する
次に、あるスライスから条件に合う値のみを選び出し、それを max 関数に渡す例を見てみましょう。たとえば、10以上の値
JavaのOptionalをgolangにportする – Method Reference と Method values
[JavaのOptionalをgolangにportする](https://qiita.com/shinnara/items/dca2181717e72b92d10d) が他の記事に比べて見られてます。といっても3桁程度ですが。タイトル詐偽的な状況になってしまったのかなと反省してます。今回も大した事は書いてないのでゆるゆるお付き合いください。
# 前回までのあらまし
* Javaを勉強するために、golangでJavaの[Optional](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/Optional.java#L86)を実装してみます
* Optionalをいきなり実装できないので、まず[Function](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/function/Function.java)を実装します
* golangで[
Go言語でテストごとにデータベースを空にする方法
## はじめに
今回は、ポートフォリオ開発で作成したテストの中で、DBを用いたテストでした工夫を紹介します。
今回作成したコードはGithubにpushしてあるので参考程度にどうぞ
https://github.com/piny940/portfolio
ポートフォリオはこちらから確認できます。
https://www.piny940.com
## 解決策
各テストごとにトランザクションを張り、テストが終わったらロールバックすることで、データベースのデータを空にすることができます。まず、テスト開始時にテスト用のデータベースに接続をします。
“`go
func TestMain(m *testing.M) {
dsn := fmt.Sprintf(“user=%s password=%s host=%s dbname=%s sslmode=%s”,
os.Getenv(“DB_USER”), os.Getenv(“DB_PASSWORD”), os.Getenv(“DB_HOST”),
os.Getenv(“DB_NAME”), os.Getenv(“DB
初めてのオニオンアーキテクチャ実装チャレンジ
# はじめに
はじめまして、この間、路頭に迷っていた子猫を保護して人生で初めて猫と生活を始めた、初級者エンジニアです。
依存関係の逆転?アーキテクチャパターン?って何・・・?みたいなところからスタートし、勉強のためにオニオンアーキテクチャ(的な)実装チャレンジをGo(echoフレームワーク)でしてみたので、備忘録です。# オニオンアーキテクチャについて
オニオンアーキテクチャは、ソフトウェア開発において柔軟で維持しやすいアプリケーションを構築するための設計パターン。
このアーキテクチャの目的は、アプリケーションのコアを保護し、各層が次の層にのみ依存するようにすることで、結合を制御し、より保守性の高いアプリケーションを作ること。※オニオンアーキテクチャを表す玉ねぎの画像([Jeffrey Palermoさんのサイトから拝借](https://jeffreypalermo.com/2008/07/the-onion-architecture-part-1/))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amaz
[Go言語] Echo でルーティング
# はじめに
Go 言語のフレームワークである [Echo](https://echo.labstack.com/) を使ってバックエンドを実装する際の、ルーティング に関する備忘録です。
私はこうやったということを残すものであり、ベストプラクティスではありませんが、みなさまの参考情報となれば幸いです。# 環境と各ツール
| | バージョン | 備考 |
| ————————————————————– | ——— | —————————————————- |
| [Go](https://go.dev/) | v1.2
【Go言語学習】ポインタのレシーバの実験
レシーバがポインタとそうでないと何が違うのだろうと思ったので、
基本的には大きいデータの構造体はポインタで扱うのが良いというのと、ポインタで扱う場合は、副作用に注意する必要があるということ。
副作用は、現状アイディアが無いので、とりあえず処理時間とメモリの使用量を比べてみることに…
この実験は結論から言うと、面白くない結果です…アイディアが乏しいのが原因かな…悔しい## ポインタの時
func (g *Group) Go(f func() error)の場合、gはポインタなので、同じオブジェクトを複数のゴルーチンで使用すると、それらのゴルーチンがオブジェクトの状態を同時に変更しようとすると競合状態が発生する可能性ある。
同じオブジェクトを複数のゴルーチンで使用する場合は、適切な同期メカニズム(例えば、ミューテックス)を使用して、同時アクセスを制御することが重要。(今回何もしていなので、何かすれば間違いなく結果は変わるでしょう)
“`Go
package mainimport (
“fmt”
“runtime”
“sync”
“time”
)type
【個人開発】AIがおすすめの飲食店を教えてくれるLINEチャットボットを作りました
# AI美食探訪というアプリを開発しました
Line上でやりとりできるAIチャットアプリです。
メッセージを送信すると、条件にあったお店を紹介してくれます。
(一応テスト版という状態です。実運用での入力データを集めること、それを精度向上に役立てることを目的としています)ここからLineの友達追加ができます。
スマホの通常のカメラで読み取れます。
![qr20240512113623589.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473706/08192e49-ec0b-a136-9290-e4ef463bb7a0.png)こちらからでも🙆♂
https://liff.line.me/1645278921-kWRPP32q/?accountId=234luzuw
ぜひ試してみて、フィードバックをいただけると大変嬉しいです。
お問い合わせ用
https://docs.google.com/forms/d/e/1FAIpQLSdLV7zaDC9U8YoiVPXwg3mpx_7pRw
Goでwebアプリケーションを作成してみよう!~webアプリケーションとは~
この記事では4回に分けてwebアプリケーションの作り方を説明していく
第1回
webアプリケーションの構成、仕組み(この記事)
第2回
[サーバーの立ち上げ](https://qiita.com/Yutosaki/items/fcd773a278e9b8663f36 “第2回”)
第3回
フロントエンドの実装(URL)
第4回
バックエンドの実装(URL)実際に作ったアプリケーション
https://github.com/Yutosaki/WiFiRader
# そもそもwebアプリケーションとは
webアプリケーションとは、高度な性能のwebサイトのような認識で大丈夫。・webサイト
webサイトは静的なコンテンツが提供され、何かを読んだり、動画を視聴できたりなどの比較的単純なインタラクションが行われる。頻繁に更新はされない。・webアプリ
webアプリは動的なコンテンツを提供し、ユーザーの情報に応じて、データベースやサーバーなどと連携し、リアルタイムで情報を更新、管理する。・モバイルアプリケーションとの違い
webアプリと違い、インストー
blastengineを使ってGo言語でメールを送信する
[blastengine](https://blastengine.jp/)はシンプルに使える開発者向けメールサービスを提供しています。何かと面倒なメール配信をシンプルに、かつ確実に送信先に届くようになります。
今回はblastengineを使って、Go言語でメール送信を行うまでの流れを解説します。
## ユーザ登録する
blastengineにユーザ登録します。管理画面に入るためのユーザID、パスワードが手に入るので、ログインします(ユーザIDは後で使います)。
![getting-started-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/5c6c8cb0-9ad1-0a6d-88fe-e24bc3ee7b17.jpeg)
## 送信元ドメインのSPFを設定する
送信元として利用するドメイン(自分で持っているもの)の設定をします。これは任意のドメイン管理サービスで設定できますが、TXTレコードに以下のSPFを追加します。
“`
txt @ v=spf1 incl
今回のプロジェクトを終えて #02
## プロジェクトの概要
私は所属するLTサークルで使用されるスライドを公開するウェブサイトを開発しました。このサイトは、サークルメンバーが作成したプレゼンテーションを広く共有し、アーカイブすることを目的としています。
## 動機
私たちのサークルでは毎週LTが開催されますが、これらの貴重なコンテンツが内部に留まり、外部の人々と共有する手段がありませんでした。このプロジェクトの主な目標は、知識の共有を促進し、学びをサークルの外に広げるためのプラットフォームを提供することです。
## 制作期間
このプロジェクトは初期バージョンを2週間で開発しましたが、ユーザーからのフィードバックを受けて現在も定期的にアップデートを行っています。## 使用技術とツール
### フロントエンド
・Next.js
・TypeScript
### バックエンド
・Echo
・Go
### その他
・GCP
・Vercel詳しくはGitHubのリポジトリをご覧ください
https://github.com/R1013-T/slide-share## 振り返り
### 成果
実際に機能するウ
【Go言語学習】引数の参照渡しについて
以下のコードは、セマフォを使って(あんま意味ないけど)、同時実行数を制限しているコードで遊んでいたのですが、do関数の引数について疑問が発生したのでメモ。
“`Go
package mainimport (
“context”
“fmt”
“log”
“time”“golang.org/x/sync/semaphore”
)func main() {
sem := semaphore.NewWeighted(5)go do(sem, func() { time.Sleep(1 * time.Second) }, 1)
go do(sem, func() { time.Sleep(1 * time.Second) }, 2)
go do(sem, func() { time.Sleep(1 * time.Second) }, 3)
go do(sem, func() { time.Sleep(1 * time.Second) }, 4)
go do(sem, func() { time.Sleep(1 * time.Second) }, 5)
Go gosimple S1016 警告について
go-golangci-lint(gosimple)で、以下のような警告が表示されました。
“`
S1016: should convert v
(type github.com/nanato-okajima/repository/internal/model.User)
to github.com/nanato-okajima/repository/internal/model.UserResponse
instead of using struct literal (gosimple)go-golangci-lint
“`## 構成
以下のような実装をしています。
DBから取得したデータをクライアントへ返却する際に
構造体同士の移し替えを行っています。
この際にgo(gosimple)で警告が表示されていました。“`go
// データベースから取得したデータを入れるDTO
type User struct {
ID uint64
Name string
Age uint64
}// クライアントへ返却するデ
【Go言語】テンプレートエンジンでtableをレンダリングしてechoで表示してみた
## はじめに
Goの標準で用意されているテンプレートエンジン(html/template)を使って、htmlのtableをレンダリングし、echoでwebサーバーを建てて表示してみました。## 環境
* macOS Sonoma 14.4.1
* Go 1.22.3 darwin-arm64## 表示したいもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787613/f942a972-c091-357e-590b-203da0c575aa.png)このようなテーブルを表示するhtmlを出力することがゴールとなります。
“`html:html
Table Rendering
【Cloud Spanner】yoを使ってスキーマからGoの構造体を生成する
# はじめに
本記事では、Cloud Spanner用のコード生成ツールである yo について説明します。
# Spannerについて
Cloud Spannerは、Google が提供するフルマネージド型の分散データベースです。従来のリレーショナルデータベース(SQL)のトランザクション正確性と整合性を維持しつつ、NoSQL データベースのように水平方向へのスケーラビリティを持つ NewSQL に該当します。
https://cloud.google.com/spanner?hl=ja
# **yoについて**
yoは[Cloud Spanner](https://github.com/xo/xo)のスキーマ定義から Go のコードを自動生成するツールで、次の特徴があります。
– Go の構造体をスキーマから生成
– CRUD 操作のための関数を生成
– CUD については、Mutation を返します
– セカンダリーインデックスに対応した取得関数を生成
– FindTableNameByIndexName みたいなメソッドが生成されますただし、J
【Go言語学習】chan struct{}
この意味不明なコードは何なんだ?
と思ったら、Go言語の仕様上、struct{}はゼロサイズのデータを表すものとのこと。
つまりメモリを消費しないものを表している。
ただし、変数やチャネルで使用した場合、これらを管理するためのメモリは当然消費される。
チャネルで使用する場合、目的はデータのやり取りで無く、ゴルーチンの同期が目的になる。“`Go
package mainimport (
“fmt”
“time”
)func main() {
doneCh := make(chan struct{})go func() {
time.Sleep(2 * time.Second) // 何かの処理を模擬
close(doneCh) // 処理が終了したらチャネルを閉じる
}()fmt.Println(“Waiting for the goroutine to finish…”)
<-doneCh // チャネルが閉じられるまで待つ fmt.Println("The goroutine has finished!") } ```