0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

サポーターズ主催の技育CAMPに参加しての感想(企業賞受賞!) ③

Posted at

サポーターズ主催の技育CAMPに参加しての感想 ③

ダース・ベイダーサイド

正直スターウォーズは見たことがない。

見ようとは思っているが時間がない。

だがダース・ベイダーは知っている。

なんか黒いやつだ。

多分、ラスボスだ。

なんとなくデータベースと語感が似ている。

多分なんか保管してくれるんだろう。

あとアース・ネイチャーにも似ている。

多分蚊を亡きモノにしてくれるんだろう。

あとナイスネイチャにも似ている。

多分可愛いんだろう。

まとめると

ダース・ベイダーは
黒くて、なんか保管する、蚊をやっつける可愛いラスボスなのです。多分。

目次

1. ハードサイド

ラズベリーパイを使用した傾斜検知システムの開発

はじめに
 この記事では、ラズベリーパイと傾斜スイッチを使用して傾斜を検知し、その情報をAWS S3バケットに保存するシステムの開発過程について詳しく解説します。

この記事は前々回前回の続きです。

ハードウェアの設計とチャレンジ

 プロジェクトのハードウェア部分では、ラズベリーパイと傾斜スイッチを中心に設計を行いました。

 傾斜スイッチは、その傾きによってON/OFFが切り替わる装置で、傾斜を検知するためのシンプルで効果的な方法を提供します。

 チームメンバーからのフィードバックによると、最適な傾斜センサーを見つける過程はやや挑戦的であったものの、ラズベリーパイに関する大きな問題は発生しなかったとのことです。

 しかし、最終調整時にディスプレイやマウスが利用できない状況は困難でした。

ソフトウェアの実装

 プロジェクトのソフトウェア部分では、Go言語を使用してAWS S3バケットにデータを保存する機能を実装しました。

 このコードは、傾斜スイッチの状態に応じてLEDの色を変更し、傾斜が検知された際にはその情報をS3バケットにアップロードします。

 このプロセスにより、データのクラウド上での管理とアクセスが容易になります。

ハードサイドのコードはこちらです。
ハードサイドのGithub

学んだことと結論

 このプロジェクトを通じて、チームはラズベリーパイと傾斜スイッチを用いたハードウェアの設計、Go言語AWS S3の統合、そしてGinフレームワークを活用した開発に関する貴重な経験を得ました。

 ハードウェアとソフトウェアの両面で遭遇した課題を乗り越えることで、物理的なデバイスとクラウドサービスを組み合わせたアプリケーションの開発における実践的な知識とスキルを深めることができました。

2. データベースサイド

AWSバケットを利用したデータベース設計の挑戦と解決策

AWSとGo言語の組み合わせ

 このプロジェクトでは、AWSのバケットをデータベースとして利用しました。

 Go言語で提供されるAWS SDKを使用することで、初期設定を簡単かつ迅速に行うことができました。Go言語のシンプルさとAWS SDKの使いやすさが相まって、クラウドストレージの設定とデータ管理が効率的に実施できました。

認証情報の設定における挑戦

 しかし、プロジェクトを進める過程でいくつかの課題に直面しました。

 特に、AWSアカウントの登録と、アクセスキー及びシークレットアクセスキーを環境変数として設定する方法の理解までが大変でした。

 これらの認証情報の正しい設定は、AWSリソースへの安全なアクセスを確保するために不可欠です。

 適切な方法を学んだ後は、プロセスがずっと簡単になりましたが、その学習曲線は初心者にとってはやや険しいものでした。

従量課金制度に対する懸念

 また、AWSの従量課金制度に関する懸念もありました。

 無料枠を超えると追加料金が発生するため、GETPOSTのリクエスト数を慎重に管理しながらプロジェクトを進める必要がありました。

 この制度は、コスト管理に対する意識を高めるとともに、リソースの利用効率を最適化する動機付けとなりました。

データ保存方法の工夫

 データ構造に関しては、LINEのユーザーIDとラズパイのID、さらに鍵の開閉状態とその時間を保存するための工夫が施されました。

 これらの情報はキーとバリューの形式で保存され、ラズパイから送信されたデータを適切なユーザーに割り当てることが可能になりました。

 この方法により、データの整理とアクセスの効率化が実現しました。

コード例

 以下は今回使用した、」バケットへの保存と取得の実装コードです。


// ユーザーIDとMACアドレスの紐付けをS3に保存
func AssociateUserWithMacAddress(userID, macAddress string) {
	client := initS3Client()

	bucket := "magickeybucket"                       // 適切なバケット名に設定
	key := fmt.Sprintf("UserDevices/%s.txt", "testUserID") // ファイル名(ここではuserIDを使用)
	body := fmt.Sprintf("UserID: %s, MacAddress: %s", userID, macAddress)

	_, err := client.PutObject(context.TODO(), &s3.PutObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(key),
		Body:   strings.NewReader(body),
	})
	if err != nil {
		fmt.Println("Failed to upload to S3:", err)
	} else {
		fmt.Println("Successfully uploaded to S3")
	}
}

// 指定されたMACアドレスに対応するユーザーIDをS3バケットから取得
func FindUserIDByMacAddress(macAddress string) (string, error) {
	client := initS3Client()
	if client == nil {
		return "", fmt.Errorf("Failed to initialize S3 client")
	}

	bucket := "magickeybucket"                             // バケット名を設定
	key := fmt.Sprintf("UserDevices/%s.txt", "testUserID") // MACアドレスに基づくファイルパス

	// S3からファイルを取得
	output, err := client.GetObject(context.TODO(), &s3.GetObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(key),
	})
	if err != nil {
		return "", fmt.Errorf("Failed to get object from S3: %v", err)
	}
	defer output.Body.Close()

	// ファイルの内容を読み込む
	body, err := io.ReadAll(output.Body)
	if err != nil {
		return "", fmt.Errorf("Failed to read object body: %v", err)
	}

	// ファイルの内容を文字列に変換
	content := string(body)

	// 文字列を解析してUserIDを取得
	var userID string
	parts := strings.Split(content, ",")
	for _, part := range parts {
		// "UserID: "で始まる部分を探す
		if strings.HasPrefix(part, "UserID: ") {
			userID = strings.TrimSpace(strings.TrimPrefix(part, "UserID: "))
			break
		}
	}

	if userID == "" {
		return "", fmt.Errorf("UserID not found in object body")
	}

	return userID, nil
}

 このコードは、AWSS3サービスを使ってユーザーIDMACアドレスを紐付けて保存し、後でそれを検索する機能を提供します。具体的には:

  • 保存: ユーザーIDMACアドレスを組み合わせた情報をS3の特定のファイルに保存します。

  • 検索: 指定したMACアドレスに基づいて、対応するユーザーIDS3から探し出します。

結論

 AWSのバケットを使用したデータベース設計は、多くの学びとともにいくつかの挑戦を提供しました。

 Go言語AWS SDKの組み合わせは初期設定を容易にし、データ保存方法の工夫により効率的なデータ管理を実現しました。

 しかし、認証情報の設定と従量課金制度は、特に注意を要する領域でした。

 このプロジェクトを通じて、クラウドベースのアプリケーション開発における重要な側面について深い理解を得ることができました。

3. おわりに

 このハッカソンを通じて、多岐にわたる学びを得ることができました。

 特に、これまで学んできた知識の応用により、実用的なサービスを開発する経験は大きな喜びをもたらしました。

 今後もこのようなプロジェクトに取り組むことで、さらなる成長と発展を目指したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?