プレシオカップ

*OM

https://github.com/K-Kizuku/plesio-server

Go

C++

Kubernetes

Redis

Python

ターミナル上で動くzoomのようなミーティングアプリ!!

Kizuku

しめさば

Tanakaryuki

推しアイデア

カメラから受け取った映像をリアルタイムでAAに変換してターミナルに表示してくれる

作った背景

エンジニアたるものWebブラウザを開くことよりターミナルを開くことの方が多いだろうからターミナル上でミーティングできたらいいよねってなった

推し技術

パフォーマンス重視! サーバー側はRedisとin-memory-cacheを用いて,大量のトラフィックも捌けるようにしています. 多言語対応! 諸事情により使えない言語がある人向けに3言語での実装を行いました

プロジェクト詳細

アプリ概要

エンジニアってめんどくさがりですよね? ミーティングに参加するためにブラウザやミーティングアプリを開かないといけないと面倒だなと思ったことがある人は多いのではないでしょうか? そんな人のために開発したのがこの「*om」というアプリ。 なんとターミナル上でビデオ通話ができます! カメラから取得した映像をアスキーアート(AA)に変換し、ターミナル上で文字列として表示しています。ギリギリ輪郭や表情がわかる絶妙な解像度で映るので、身だしなみが整っていない状態でも安心してミーティングに参加できます。 全てがターミナル上で完結する、そんな世界の幕開けとなるアプリです!

デモ画像

image

技術構成図

image

クライアント推しポイント

多言語対応

エンジニアたるもの諸事情や宗教上の理由で使えない言語があると思います.そこで,今回のプロダクトではクライアントサイドは複数の言語(C++,Python,Go)で行いました.また,マルチプラットフォーム対応(Mac,Windows,Linux)も行いました. AA化にはOpenCVを用いました

サーバーサイド推しポイント

パフォーマンス重視

今回はリアルタイム通信サーバーということで,パフォーマンスを意識して作りました.通信はUDPで行い,インメモリキャッシュを用いてキャッシュを行い,データの保存にはRedisを用いました.

インフラ推しポイント

HorizontalPodAutoscaler

今回はサーバーへの負荷がかかりやすいサーバーということで,負荷分散ができるようにしました.またargoCDを用いており,開発者体験がとても良かったです.

PM推しポイント

今回はドキュメンテーションにも力を入れてみました.

ADRとDesign Docのドキュメントに関してはscaffdogでテンプレートを自動生成できるようにMakefileに書いてあります.(バージョニングもできます!)

ツリー

. ├── Dockerfile ├── Makefile ├── README.md ├── app │ ├── adapter │ │ ├── controller │ │ │ ├── chat.go │ │ │ ├── controller.go │ │ │ ├── meeting.go │ │ │ └── schema.go │ │ └── gateway │ │ ├── client.go │ │ └── room.go │ ├── di │ │ ├── wire.go │ │ └── wire_gen.go │ ├── domain │ │ ├── entity │ │ │ ├── client.go │ │ │ └── room.go │ │ └── repository │ │ ├── client.go │ │ ├── data_store.go │ │ ├── db.go │ │ ├── in_memory_cache.go │ │ └── room.go │ ├── driver │ │ ├── redis │ │ │ └── init.go │ │ ├── ristretto │ │ │ └── init.go │ │ ├── tcp │ │ │ └── server.go │ │ └── udp │ │ └── server.go │ └── usecase │ ├── ascii_art.go │ ├── chat.go │ ├── meeting.go │ └── session.go ├── changelog.config.js ├── ci.mk ├── cmd │ └── main.go ├── compose.yml ├── data │ └── redis │ └── dump.rdb ├── docs │ ├── ADR │ │ └── 1_ristretto.md │ └── DesignDog │ ├── 1_アスキーアート.md │ ├── 2_ルームの作成.md │ ├── 3_ルームの参加.md │ ├── 4_ルームの退出.md │ ├── 5_音声通信.md │ ├── 6_コメント機能.md │ └── 7_放映者の選択.md ├── go.mod ├── go.sum ├── locust │ ├── data_subnet.tf │ ├── main.tf │ ├── output.tf │ ├── plan │ │ └── basic.py │ ├── provisioner.tf │ └── variables.tf ├── server.go └── utils ├── config │ └── config.go └── uuid └── uuid.go

Kizuku

@Kizuku