すぐ影響される 大学院生

昨日とは違う自分を目指して

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面も触れていてユーザ目線でこのサービスに求められている本質的な部分について考え修正していてすごかったです。
反省はあげればキリはないのですが自分達のチームの成果物も負荷改善がかなり出来ていたので自信をモテる内容でした。

まとめ

三日間という短い期間ではありましたが学ぶことが多く成長を実感することができたインターンでした。技術力を高めたい人やDeNAに興味がある人には、おすすめのインターンなのでぜひ参加してみてください〜
最後に同じチームだったマスターキングのみなさん、メンターの方々、インターンの企画運営をしてくださった皆さん、ありがとうございました!

golangでローカルにファイルサーバ

はじめに

HCB Advent Clendar 2021の19日目を担当するケイタです。

今回はgolangのginでローカルにファイルサーバを構築する方法について紹介します。

環境

コード

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つの処理を書いています。

github.com

終わりに

今回はgolangでローカルにファイルサーバを構築する方法について書きました。今ではS3やfirestoreなどの便利なストレージを使う方が主流かもしれません。自分もよくS3を使っています。 次の記事は、Kei Kimさんが書いてくれる予定なので、お楽しみに!

golangとAWS Rekognitionで表情分析してみた

はじめに

HCB Advent Clendar 2021の13日目を担当するケイタです。

前回はラズパイで自分を監視するカメラを設置した話を書いたのですが設置しただけでは味気ないと思いますよね?

なので今回は監視カメラから取得した画像を使ってgolangAWS 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)

さいごに

今回はgolangAWS 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の環境を構築することにしました。


ファイル構成

f:id:zain78:20200607234929p:plain
ファイル構成

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 MusicApple Musicと連携して音楽、自分のプレイリストを流すことができます。Echo Showの音質に物足りなさを感じたので自分に部屋に置いてあるYAMAHAサウンドスピーカーにBluetooth接続してそっとで流しています。

 

目覚まし

アレクサはアラームをセットすることができるのでベッドに入ってからアラームをかけ忘れても「アレクサ、8時に目覚ましをかけて」の一言でアラームをセットすることができます。便利ですよねぇ〜

 

スマートホーム

 

 上のスイッチボットをアレクサと一緒に使うことで家にある赤外線を発するリモコンで操作する家電をアレクサで操作することが可能になります!

自分はテレビとエアコンをリモコンではなくアレクサで操作するようになりました。

リモコンをなくす癖があったのでこれのおかげでリモコンは不要になりました。

 

 

他にもアレクサには便利な機能あるので買ってみてもいいかもしれないですね。自分は買って満足しました。