DeNAの短期インターン参加してきました報告
お久しぶりです。
すぐ影響される大学生です。最近は財宝って呼ばれてるのでそう呼んでもらえると嬉しいです!
9/3~9/5に開催されたDeNA Summer Internship 2022 【短期】ソフトウェアエンジニアリングコースに参加してきたのでそのことについて書いていきたいと思います。
インターン開始前
インターンが始まる何日前だったかな...DeNAさんから素敵なプレゼントが届きました。
飲食物以外にもマグカップなど素敵なものをいただいたのですが最初にこのカロリーメイトたちを見たときに
「あーきっと寝れないインターンなんだろうなぁ...エナドリ買っとかないと」
と思ってしまいましたw
実際は開発時間がしっかりと決められていたので寝ることが出来ましたw
インターンでは、AWSを使うのですがAWSのハンズオンなどがあってAWSを触ったことがない人でも知識のキャッチアップをすることができる機会を提供してくださいました。(学生だとAWSなんて触る機会少ないですからね...自分は適当に使っていたら気づかないうちに課金額が...げふんげふん)
インターン期間中
初日に自分達がチャットアプリを改善する理由について説明されました。
ざっくり説明すると怪獣が攻めてきて大変なことになったから安否確認するためにチャットアプリを使いたい。おっと〜なんという偶然かここに社員が過去作成したチャットアプリがあるではないですかぁ。しかし、アプリを提供するために多くの課題が残されている。皆さんの力で最高のアプリに改善してください!
みたいな感じですね。
また、10000発言/秒 10万人同時接続に耐えられるようにするという条件がありました。
ヒエー
やったこと
- 問題点の洗い出しとタスク設定
- 目標設定
私たちのチームでは、コードを見て具体的にどこが問題そうか洗い出してタスクとして設定していきました。
順番は逆になってしまったのですがその後に目標を決めました。
私たちは「安否確認用のサービスなのに繋がらないなんてやばいよね...」ということで絶対に繋がるアプリケーションを目指すを目標として設定しました。
そのため、新規機能やUI/UXの改善よりもパフォーマンスチューニングに力を入れました。
具体的に行ったこととしては以下のものになります。
- N+1解消&SQLのクエリチューニング&index貼る
- limit, offsetペタペタ
- スロークエリの解析
- SQLを実行計画を見ながらチューニング
- BASE64で管理されている画像のS3化
- バルクインサートを実装
- DBサーバー1台,APPサーバー8台にスケールアウト
自分が担当したものは、主に BASE64で管理されている画像のS3化、バルクインサートを実装の二つでした。
BASE64で管理されている画像のS3化
DBを覗いてみると170万枚ほどの画像がbase64で保存されていてサーバに負荷を与えている状態でした。そのため、画像をs3に移行するというタスクを担当したのですが、処理を書いて実行してみると一晩で5万枚しか移行できておらずこのままでは終わらないということで他の方が裏技で対応策を実装してくれました。(本当にごめんちゃい)
バルクインサート
バルクインサートについては、10000発言/秒 10万人同時接続ということで1秒間に10000回もインサートなんてできないよ!
てなわけでgoroutine とチャネルを使って200msecまたは1000件メッセージが溜まったらバルクインサートするという処理を書きました。
結果
悔しくも自分達のチームは賞を取ることができませんでした。他のチームは、新規機能の実装を行っていましたが自分達は着手することが出来ませんでした。また、UI/UX面も触れていてユーザ目線でこのサービスに求められている本質的な部分について考え修正していてすごかったです。
反省はあげればキリはないのですが自分達のチームの成果物も負荷改善がかなり出来ていたので自信をモテる内容でした。
golangでコンパイル【備忘録】
はじめに
コンパイルする時のコマンドの備忘録
Raspberry Pi 32-bit OS
GOOS=linux GOARCH=arm GOARM=7 go build -o hello main.go
AWS lambda
こっちはシンプル
GOOS=linux go build -o hello main.go
おわりに
Raspberry Pi 64-bit OSが出たてきたので上のコマンドを使うことは減りそう
golangでローカルにファイルサーバ
はじめに
HCB Advent Clendar 2021の19日目を担当するケイタです。
今回はgolangのginでローカルにファイルサーバを構築する方法について紹介します。
環境
macbook pro 2019
golang 1.16.6
コード
contlloer.go
package contller import ( "file-server/pkg/model" "file-server/pkg/view" "fmt" "github.com/gin-gonic/gin" "github.com/google/uuid" "log" "net/http" "os" ) func UploadImage() gin.HandlerFunc { return func(c *gin.Context) { var urls []string form, _ := c.MultipartForm() files := form.File["file"] for _, file := range files { uuID, err := uuid.NewRandom() if err != nil { log.Println("uuid generate is failed") } fileName := fmt.Sprintf("images/%s%s", file.Filename, uuID) err = c.SaveUploadedFile(file, fileName) if err != nil { log.Println("[ERROR] Faild Bind JSON \n ", err) c.JSON(http.StatusBadRequest, "Request is error") view.ReturnErrorResponse( c, http.StatusBadRequest, "Bad Request", "Request is error", ) return } urlName := fmt.Sprintf("/%s%s", file.Filename, uuID) urls = append(urls, urlName) } c.JSON(http.StatusOK, view.UploadResponse(urls)) }
view.go
package view func UploadResponse(urls []string)ImagesUrlResponse { return ImagesUrlResponse{ Urls: urls, } }
リポジトリをこちらに載せておきます リポジトリにはbase64で受け取って格納するのとファイルで受け取り格納する2つの処理を書いています。
終わりに
今回はgolangでローカルにファイルサーバを構築する方法について書きました。今ではS3やfirestoreなどの便利なストレージを使う方が主流かもしれません。自分もよくS3を使っています。 次の記事は、Kei Kimさんが書いてくれる予定なので、お楽しみに!
golangとAWS Rekognitionで表情分析してみた
はじめに
HCB Advent Clendar 2021の13日目を担当するケイタです。
前回はラズパイで自分を監視するカメラを設置した話を書いたのですが設置しただけでは味気ないと思いますよね?
なので今回は監視カメラから取得した画像を使ってgolangとAWS Rekognitionで感情を推定する方法について紹介したいと思います。
注意!用意する画像は顔が写っている必要があります!
用意するもの
- AWSアカウント
- IAMユーザ
IAMロールの用意
AmazonRekognitionReadOnlyAccessポリシーを付与したIAMユーザを作成しましょう。
コード
package main import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/rekognition" "io/ioutil" "log" ) func main() { imagePath := "face.jpg" imageBytes, err := ioutil.ReadFile(imagePath) if err != nil { log.Println(err) } //IAMユーザ作成時に確認できるアクセスキーとシークレットアクセスキーを入れてください accessKeyId := "アクセスキー" secretAccessKey := "シークレットアクセスキー" sess := session.Must(session.NewSession(&aws.Config{ Region: aws.String("ap-northeast-1"), Credentials: credentials.NewStaticCredentials(accessKeyId, secretAccessKey, ""), })) reko := rekognition.New(sess) params := &rekognition.DetectFacesInput{ Image: &rekognition.Image{ Bytes: imageBytes, }, Attributes: []*string{ aws.String("ALL"), }, } res, err := reko.DetectFaces(params) if err != nil { fmt.Println(err.Error()) return } for _, face := range res.FaceDetails { if *face.Smile.Value == true { fmt.Printf("ナイスSmile!!\n") } else { fmt.Printf("どしたん?話聞こか?\n") } } }
結果
表情が笑顔の時
ナイスSmile!!
表情が暗い時
どしたん?話聞こか?
分析結果の信頼度を確認したいときは以下のコードをfor分の中に記述してみてください。
fmt.Printf("信頼度%f\n",*face.Smile.Confidence)
さいごに
今回はgolangとAWS Rekognitionで感情を推定する方法について書きました。 今回紹介したコードでは笑顔だけですがAWS Rekognitionはさまざまな感情を推定することができるのでいろいろ試してみてください。 デスマーチしている時や研究で泣いている時の感情をslackのtimesに流したいと思います。
次の記事は、Kei Kimさんが書いてくれる予定なので、お楽しみに!
yyyy-mm-dd(string)の形でもらった生年月日から歳を計算してあげよう
はじめに
今回はgolangでyyyy-mm-ddの形で渡されたjsonから年齢を出したいと思います。
逆引きGolang (日付と時刻)
上のリンク先のページにに書かれている方法を使えば簡単に求めることができるかと思いますが
あえてここでは力技(めんどくさい方法)でやっていきたいと思います。
まずはjson.UnmarshalでJSON文字列をデコードした後に
生年月日(Birthday)と現在時刻(timeNow)を"-"で分割します。
現在時刻はRFC3339形式で2020-08-21 18:34:20.136181 +0900 JST m=+0.000099091
こういった形で取得するので現在時刻のddを得るために" "で分割します。
BirthdaySlice := strings.Split(users.Birthday, "-") timeNow := time.Now() s := "" s = timeNow.String() nowTimeSlice := strings.Split(s, "-") for _ = range BirthdaySlice { } for _ = range nowTimeSlice { } nowTimeS := strings.Split(nowTimeSlice[2], " ") for _ = range nowTimeSlice { }
次は分割した文字列を数値に変換します。
var ns int ns, _ = strconv.Atoi(nowTimeS[0]) var b [3]int var n [3]int for i := 0; i < 3; i++ { b[i], _ = strconv.Atoi(BirthdaySlice[i]) n[i], _ = strconv.Atoi(nowTimeSlice[i]) }
最後に生年月日と現在時刻を比較して歳を出します。
var old int if n[1]-b[1] < 0 { old = n[0] - b[0] - 1 } else if (n[1]-b[1] == 0) && (b[2]-ns < 0) { old = n[0] - b[0] - 1 }
(今日の日付 - 誕生日) / 10000 = 年齢や2つの時刻差を求める方法などを使ってもっと簡単に年齢を求めることができると思うので頑張ってみてください。
大学の課題のためにdockerでPython3の環境構築したよ
はじめに
大学の課題で画像のヒストグラムを得るプログラムを作成せよ!というものを出されました。
何を使って組もうかなと悩んでいたところPythonを使うと楽だよとの話を聞きPythonの環境を構築することにしました。
ファイル構成
Dockerfile
FROM python:3 USER root RUN apt-get update RUN apt-get -y install locales && \ localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LC_ALL ja_JP.UTF-8 ENV TZ JST-9 ENV TERM xterm RUN apt-get install -y vim less RUN pip install --upgrade pip RUN pip install --upgrade setuptools
docker-compose.yml
version: '3' services: python3: restart: always build: . container_name: 'python3' working_dir: '/root/' tty: true volumes: - ./opt:/root/opt
上記の二つのファイルを作成して中身を記述した後にコンテナを起動
$docker-compose up -d --build
もしここでこんなエラーが出た場合
Building python3 ERROR: invalid reference format
途中に日本語のディレクトリが入っているせいかもしれません
treeコマンドで確認してみましょう。自分もこのエラーが出たのですが位置を変えたら起動しました。
使い終わったら
$ docker-compose down
これでコンテナを削除できます。
かなりすぐ環境構築できるので便利だなぁ
参考
qiita.com
Echo Show 5 がなかなか優秀な件について
去年、Echo Show5が半額近くなっている時に購入したのですがEcho Show5がかなり優秀だよって話をしたいと思います。
•音楽を再生(スピーカーにBluetooth接続)
•目覚まし
•スマートホーム化
音楽を再生(スピーカーにBluetooth接続)
アレクサはAmazon Music やApple Musicと連携して音楽、自分のプレイリストを流すことができます。Echo Showの音質に物足りなさを感じたので自分に部屋に置いてあるYAMAHAのサウンドスピーカーにBluetooth接続してそっとで流しています。
目覚まし
アレクサはアラームをセットすることができるのでベッドに入ってからアラームをかけ忘れても「アレクサ、8時に目覚ましをかけて」の一言でアラームをセットすることができます。便利ですよねぇ〜
スマートホーム化
SwitchBot スイッチボット スマートホーム 学習リモコン Alexa - Google Home IFTTT イフト Siriに対応 SwitchBot Hub Mini
- 発売日: 2019/09/27
- メディア: Tools & Hardware
上のスイッチボットをアレクサと一緒に使うことで家にある赤外線を発するリモコンで操作する家電をアレクサで操作することが可能になります!
自分はテレビとエアコンをリモコンではなくアレクサで操作するようになりました。
リモコンをなくす癖があったのでこれのおかげでリモコンは不要になりました。
他にもアレクサには便利な機能あるので買ってみてもいいかもしれないですね。自分は買って満足しました。