OmniAICreator/Qiita-1.07M huggingface dataset:
[Terraform]Lambda構築に必要なリソースと引数の概要

## はじめに
Terraformを使ってAWS Lambdaを構築する際に、「Lambdaが利用するリソースで何ができるのか」「そのリソースの引数に何を指定すべきか」が分からず手間取ったので、簡単に整理しました。

## Lambda構築に使用したTerraformコード
以下は、Terraformを使ってLambdaを作成するためのコード例です。
```tf
# Lambda
data "archive_file" "lambda_function_file" {
  type        = "zip"
  source_dir  = "./src/"
  output_path = "./upload/lambda_function.zip"
}

resource "aws_lambda_function" "get_gang_info" {
  filename         = data.archive_file.lambda_function_file.output_path
  function_name    = "get_gang_info"
  role             = aws_iam_role.dynamodb_read_only.arn
  handler          = "lambda_function.lambda_handler"
  source_code_hash = data.archive_file.lambda_function_file.output_base64sha256
  runtime          = "python3.12"
  timeout          = 29
}

resource "aws_lambda_permission" "tr_lambda_permit" {
  statement_id  = "get_gang_info_api"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.get_gang_info.arn
  principal     = "apigateway.amazonaws.com"
  source_arn    = "${aws_api_gateway_rest_api.get_gang_info_api.execution_arn}/*/GET/gang"
}
```

## 使用したリソースと指定する内容

### 1. archive_file

#### 機能
Lambda関数用のスクリプトファイルをZIP化します。

:::note warn
archive_fileを使用するには、Terraformのプロバイダーとしてhashicorp/archiveをrequired_providersに追加する必要があります。
:::

#### 主な引数
| 引数 | 指定する内容 |
| :--- | :--- |
| type | zipを指定する |
| soruce_dir | スクリプトが格納されたフォルダを指定する |
| output_path | zip化したフォルダの出力先を指定する |

### 2. aws_lambda_function

#### 機能
Lambda関数を作成します。

#### 主な引数
| 引数 | 指定する内容 |
| :--- | :--- |
| filename | zip化したファイルのパスを指定する |
| function_name | Lambda関数名を指定する |
| role | 他のAWSサービスに対してアクションを実行するのに必要なロールを指定する |
| handler | スクリプトにあるメイン関数を指定する |
| source_code_hash | 「archive_file.ラベル名.output_base64sha256」で指定する |
| runtime | スクリプトで使用した開発言語を指定する |
| timeout | スクリプトで使用した開発言語を指定する |
| runtime | スクリプト処理の制限時間を指定する |


### 3. aws_lambda_permission

#### 機能
他のAWSサービスにLambda関数の呼び出し権限を付与します。

#### 主な引数
| 引数 | 指定する内容 |
| :--- | :--- |
| statement_id | アクセス権の名前を指定する |
| action | 「lambda:InvokeFunction」ポリシーを指定する |
| function_name | Lambda関数のARNを指定する |
| principal | アクセス権を与えるAWSサービスのプリンシパルを指定する |
| source_arn | アクセス権を与えるAWSサービスのARNを指定する |


## おわりに
今回のコード例は、基本的な構築に焦点を当てていますが、こちらの記事が小さな疑問や不明点を解消する一助となれば幸いです。次のステップとして、サービスからの呼び出しをシミュレーションする方法や、エラーハンドリングのパターンにも挑戦していきたいと考えています。

## 参考
[https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/file](https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/file)
[https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function)
[https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission)
NestJS 開発での CORS 問題と解決方法


NestJS を使用した API 開発中に、ブラウザからのリクエストで CORS (Cross-Origin Resource Sharing) エラーが発生することがあります。この問題の原因と解決方法をまとめました。

---

### 【原因】
CORS 問題は、クライアント (例: `http://localhost:3000`)から、別のオリジンの API (例: `http://localhost:8080`)に HTTP リクエストを送信した際に発生します。

これはブラウザのセキュリティメカニズムにより、インジェクションできる資源を制限するために実装されています。

NestJS サーバーでは、CORS を有効にしていない場合、リクエストは拒否されます。

---

### 【解決方法】

#### 1. **NestJS での CORS 設定**
NestJS で CORS を有効にするには、`enableCors` メソッドを使用します。

以下のようにサーバー起動時に設定してください。

```typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // CORS を有効化
  app.enableCors({
    origin: 'http://localhost:3000', // 許可するオリジン
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', // 許可する HTTP メソッド
    credentials: true, // Cookie を送信する場合に設定
  });

  await app.listen(8080);
}
bootstrap();
```

- **特定のオリジンのみを許可**
  セキュリティを高めるために、必要なオリジンのみを許可します。

- **すべてのオリジンを許可する場合**
  開発時には、一時的にすべてのオリジンを許可することが可能です。
  
  ```typescript
  app.enableCors({
    origin: '*',
  });
  ```

#### 2. **Middleware を使用した CORS 設定**
CORS 設定を細かく制御したい場合は、`@nestjs/platform-express` を使用してミドルウェアとして実装できます。

```typescript
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as cors from 'cors';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.use(
    cors({
      origin: 'http://localhost:3000', // 許可するオリジン
      methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
      credentials: true,
    }),
  );

  await app.listen(8080);
}
bootstrap();
```

#### 3. **Docker を使用している場合の考慮**
Docker 環境で NestJS を起動している場合、クライアントがサーバーと同じネットワーク内からアクセスできることを確認します。

- `docker-compose.yml` のネットワーク設定を確認し、`app-network` 内の通信が有効な状態であることを調べてください。

#### 4. **Axios のリクエスト設定**
クライアント側の Axios リクエストに、`withCredentials` オプションを追加することで Cookie を送信できます。

```javascript
axios
  .get("http://localhost:8080/test/test", {
    withCredentials: true, // Cookie の送信を有効にする
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.error(error);
  });
```

---

### 【デバッグ步衵】
1. **ブラウザのデベロッパーツールでネットワークタブを確認**
   - プリフライトリクエスト (`OPTIONS`)のレスポンスヘッダーに `Access-Control-Allow-Origin` が含まれているか確認する。

2. **サーバーのログ確認**
   - リクエストが到達しているか、エラーが発生している場合はその内容を確認する。

3. **Postman や curl を使用した確認**
   - Postman や curl で直接リクエストを送信し、サーバーが正常に応答するか確認します。

   ```bash
   curl -X GET http://localhost:8080/test/test
   ```

---

NestJS の CORS 問題は、通常、サーバー側での設定の誤りにより発生します。上記の手順を試し、問題を解決してください。
IaCジェネレーター使ってみた

## はじめに
IaCジェネレーターの使用感を見てみたので備忘録も兼ねて記事にしました。

## スキャン
5分くらいでアカウント内のリソースを全スキャンしてくれるようです。
![スクリーンショット 2024-12-20 155614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/73bcf53e-8811-003d-0830-1e80e61139ea.png)



## テンプレート作成
試しに先日構築したECSのタスク定義をテンプレート化して詳細見ていきます。
```
Resources:
  ECSTaskDefinition00taskdefinitionecstaskdefinition200TaqkI:
    UpdateReplacePolicy: "Retain"
    Type: "AWS::ECS::TaskDefinition"
    DeletionPolicy: "Retain"
    Properties:
      InferenceAccelerators: []
      Memory: "3072"
      PlacementConstraints: []
      Cpu: "1024"
      RequiresCompatibilities:
      - "FARGATE"
      NetworkMode: "awsvpc"
      EnableFaultInjection: false
      ExecutionRoleArn:
        Fn::GetAtt:
        - "IAMRole00ecsTaskExecutionRole00WhmYw"
        - "Arn"
      RuntimePlatform:
        OperatingSystemFamily: "LINUX"
        CpuArchitecture: "X86_64"
      Volumes: []
      ContainerDefinitions:
      - ExtraHosts: []
        Secrets: []
        VolumesFrom: []
        Cpu: 0
        EntryPoint: []
        DnsServers: []
        Image: "061039782769.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1"
        Essential: true
        LogConfiguration:
          SecretOptions: []
          Options:
            awslogs-group: "/ecs/ecs-task-definition"
            mode: "non-blocking"
            max-buffer-size: "25m"
            awslogs-create-group: "true"
            awslogs-region: "ap-northeast-1"
            awslogs-stream-prefix: "ecs"
          LogDriver: "awslogs"
        ResourceRequirements: []
        EnvironmentFiles: []
        Name: "apache-helloworld"
        MountPoints: []
        DependsOn: []
        DockerLabels: {}
        PortMappings:
        - ContainerPort: 80
          AppProtocol: "http"
          Protocol: "tcp"
          HostPort: 80
          Name: "apache-helloworld-80-tcp"
        DockerSecurityOptions: []
        SystemControls: []
        Command: []
        DnsSearchDomains: []
        Environment: []
        Links: []
        CredentialSpecs: []
        Ulimits: []
      Family: "ecs-task-definition"
      Tags: []
```
- アップデートのポリシーがRetainに勝手になっていたので、テンプレートを修正したら上書きではなく新しくリソース作っちゃうことになりそう。Deleteに変える必要あり

## 最後に
- 2024年の2月にIaCジェネレーターのアップデートがあり、リソースをグラフで表示してくれるようになったみたいです。
![スクリーンショット 2024-12-22 164232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/1190f9e6-a718-5180-2f84-319ea4acbb12.png)

- リソースからテンプレートを作成してくれるのでリソースを引っ越しさせたり、クローンを作りたいときに適していると思います。
- ほかの人の使用感を見てみると細かい修正は必要みたいなので注意が必要です。
LinuC303　合格体験記

# 概要
LinuC303に合格したので、記録を残しておく

# 学習前の状況
- LinuC304を２月に取って以来LinuCから遠ざかっていた
- 業務でセキュリティはやらない
- Linuxは毎日触る

# 使った教材
https://mondai.ping-t.com/

https://openai.com/ja-JP/chatgpt/overview/

# やったこと
- 勉強期間：1.5ヶ月
    - 業務が多忙すぎて土日でリカバリ
- 通勤時間にひたすらPing-t
- Ping-tの解説をノートに書き写しつつ、わからないところがあったらChatGPTに質問
    - 質問したらそれもノートに書き写す

# 結果
**合格(546点)**
520点で合格なので本当にギリギリ


# 感想
- 黒本高すぎて買えない
- Ping-tだけだとギリッギリ
- ちょこちょこ仕事で出てきた知識が出てきて楽しい
- 前日に二郎を食べるのはやめよう
Android版VRChatに透明アバターを持ち込む方法

# はじめに
こんにちは！lainと申します。
普段はCG,VR,アバター系の研究室でアバターのプロシージャル制御の研究をしている修士学生です。
この記事は[VRChat近況報告会 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/vrchat-status-update-event)の22日の記事です。
今回はスタンドアローンのQuestなどのPCを使わないVRChatに透明なアバターを持ち込む方法を解説していきます。
なぜわざわざ透明アバターをAndroid版VRCに持ち込もうと思ったかというと、研究で自分のアバターのモーションをリアルタイムに別の人型3Dモデルに適用しているのですが、自分のアバターを透明にしてあたかも別の人型3Dモデルを自分のアバターのように見せたかったからです。この辺のモーション適用の詳しい話は[Iwakenlab tech conf](https://youtu.be/gHS0cSpe25M?t=10676)でしています。
今回作成したアバターは[booth](https://lain62.booth.pm/items/6369200)にて無料で公開もしているのでもしよかったらお使いください。


## Android版の制約
Android版VRChatはQuest単機のような強力でないスペックで動作させるためにいくつかの制約があります。
具体的にはshaderやポリゴン数に制限があります。詳しくは[VRChatの公式ガイド](https://creators.vrchat.com/platforms/android/quest-content-optimization/)をご覧ください。
半透明なshaderをAndroidで扱えないために、shaderをいじってAndroid向け透明アバターを作ることは不可能です。従ってshaderをいじるのではなく直接頂点数を極限まで減らすことで透明アバターを作ることにしました。

## Blenderで頂点を減らす
Blenderのバージョンは後述するAdd onに合わせて3.1系を使用しました。
FBXファイルを使う場合はAdd onインストールの部分はスキップしてください。 
まずはBlenderで頂点を削っていきます。今回はVRMアバターを利用するため、BlenderでVRMファイルを読み込む準備が必要です。[VRM Add on for Blender](https://vrm-addon-for-blender.info/ja/)のサイトからお使いのBlenderバージョンに合わせてAdd onをダウンロードしてください。ダウンロードしたファイルは解凍せずBlenderのEdit>Preferences>Add-ons>Installからインストールしてください。その後File>import>.vrmからvrmファイルを読み込みます。
ここで1頂点を残して全削除したいところですが、実はアーマチュア情報も消してしまうとUnityでアバターアップロードはできるものの、VRChat上でロボットアバターになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517673/4f8a8e61-5c90-ec1c-8da4-9d1f8ebb5a03.png)
従って、アーマチュアではなくメッシュを選択して頂点を減らしていきます。今回利用した[VRoidサンプルモデル](https://hub.vroid.com/characters/7939147878897061040/models/2292219474373673889)においてはこのような階層構造になっており、メッシュはBody(merged).bakedでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517673/8fbcdaff-ecdb-dc3a-b1a0-1066d95d3157.png)
あとは1,2頂点を残して頂点を削っていきます。1ポリゴンは3頂点からなるため3頂点以上残すとメッシュが貼られ、目に見えてしまう可能性があります。
モデリングがゴリゴリにできる必要はありませんが、必要な基本操作はできる必要があります。Blenderを初めて触る人はzenさんの[チュートリアル動画](https://youtu.be/GlcKLaWO-0g?list=PLh2HlgtpWBpVI3GyRF-vBi-mqtG4ARJgc)が分かりやすいので一度やっておくとおススメです。
ちなみにBlender上では、モデルの頂点数は簡単に確認することができます（[参考](https://reflectorange.net/archives/059.html)）。
頂点を削除し終わったらあとはfile>export>vrmからファイルエクスポートするだけです！

## Unityからアバターアップロード
後はいつも通りUnityからアバターアップロードをするだけです。
ただ、Unityは標準でvrmインポートができないため、UniVRMを導入する必要があります。
UPMかunitypackageから[UniVRM](https://github.com/vrm-c/UniVRM/releases)を導入してください。
あとはvrmファイルをインポートし（vrmをprojectフォルダにドラッグアンドドラッグでいけます）、いつも通りアバターアップロードしましょう！（Androidにswitch platformをお忘れなく）
なにかアップロード画面でエラーがでたらfix allで治ると思ます。エラーが消えなかったり
VRChatで確認してロボットアバターだったりしたら、アーマチュアの親子関係が崩れている可能性があります。Benderからエクスポートする前にアーマチュアの親子関係が変わっていないか確認してみてください。

# 最後に
Androidで透明アバターを実現するために、BlenderでVRMファイルの頂点数を削り、Unityにエクスポートし、アバターアップロードするまでを見てきました。
一部分でも参考になったのなら幸いです。
Android16対応時に修正が必要になりそうな差分まとめ

# はじめに
先日Android15に関しての差分をまとめた記事を出しましたが、実は次期バージョンであるAndroid16に関して、すでに修正が必要になるであろう情報が部分的に開示されています。

https://qiita.com/YuukiYoshida/items/90bd291885c3415285b4

そこで今回は、Android16対応時に慌てることがないよう、わかっている情報を現時点でまとめておこうと思います。

# リリースは2025年6月
タイトルの通り、Android16は来年6月を予定しています。
リリースフローとしては以下です。

### 開発者向けプレビュー版の提供
第1回目: 2024年11月に提供開始。 
第2回目: 2024年12月に提供開始。 

### ベータ版の提供
開始時期: 2025年1月に開始予定です。 

### 正式リリース
予定時期: 2025年第2四半期（4月～6月）にリリース予定で、具体的には2025年6月3日にて予定されています。

上記の通りすでにプレビュー版は提供されているので、余裕のある方はプレビュー版にて影響範囲をご確認いただくと良いかと思います。

# 1. JobScheduler の割り当ての最適化
Android16では、JobSchedulerに関して以下の3つが最適化されているようです。

### アプリのスタンバイバケット
アプリがどのスタンバイバケットに属しているかに応じて、ジョブの実行時間が割り当てられます。
特に、アクティブなスタンバイバケットに属するアプリには、より多くの実行時間が提供されます。

### アプリの表示状態
ユーザーに表示されている（トップ状態）の間に開始されたジョブが、アプリが非表示になった後も続行される場合、そのジョブはランタイムの割り当てに従います。

### フォアグラウンドサービスの実行中
フォアグラウンドサービスと同時に実行されているジョブも、ランタイムの割り当てに従います。

JobSchedulerは検証のしづらいAPIの一つだと思いますが、元々WorkInfoが持つ機能としてJobが停止した理由を以下APIにて追うことが可能です。

https://developer.android.google.cn/reference/androidx/work/WorkInfo#getStopReason()

今回、上記に加えAndroid16より新たに **JobScheduler#getPendingJobReasonsHistory** が追加されています。
この関数の詳細は現時点ではまだドキュメント化されていませんが、Jobが実行されなかった理由を知ることができるようなので、Android16対応によりJobが正しく動かなかった際には**getPendingJobReasonsHistory**と**getStopReason**を合わせて利用することで、これまでより詳細に原因を追うことができそうですね。

# 2. 非推奨APIの削除
Android16より、**JobInfo#setImportantWhileForeground**がサポートを完全に終了するようです。

https://developer.android.google.cn/reference/android/app/job/JobInfo.Builder#setImportantWhileForeground(boolean)

この関数はスケジュール設定アプリがフォアグラウンドにある間、またはバックグラウンドの制限を一時的に免除されている間のジョブの重要度を返す関数となっています。
Android12より非推奨となっておりましたが、Android16より完全にサポートを終了し、呼んでも無視されるのでご注意ください。

また、他にも非推奨となっている機能が今回のバージョンアップでサポートを終了するものがあるかもしれません。
アプリ内で非推奨となっている機能を利用しているケースがあるよであれば、これを機に見直しておくと安心かと思います。

# 3. ユーザー補助の妨げになる通知の非推奨
Android16でもUI周りの差分がいくつかありますが、その中でも影響がありそうなものがこの通知の差分になります。

**announceForAccessibility**の使用や**TYPE_ANNOUNCEMENT**ユーザー補助イベントのディスパッチを特徴とするユーザー補助機能の通知が非推奨となりました。
これにより、ユーザー補助機能の妨げになる通知のサポートが終了します、アプリ内でこれらの機能を使用している場合は、代替手段への移行が必要です。

https://developer.android.google.cn/about/versions/16/behavior-changes-all?hl=ja&utm_source=chatgpt.com#disruptive-a11y

# さいごに
OSアップデートの間隔が短くなったので合わせていくのがより一層一苦労ですね。
来年になればより多くの情報が開示されていくはずなので、要チェックかと思います。
JAWS-UG 2024年の活動を振り返る

この記事は[JAWS-UG（AWS Users Group – Japan） Advent Calendar 2024](https://qiita.com/advent-calendar/2024/jaws-ug)の19日目の記事です。
※JAWS-UGについては、[こちら](https://jaws-ug.jp/)から。

AWSの技術要素は0なポエムです！

## はじめに
JAWSでクラウド女子会の運営と事務局の運営をしています。
去年2023年もアドベントカレンダーを書く機会があり、改めて振り返ってみました。コミュニティに参加するきっかけなどについて書いています。
記事は[こちら](https://www.sunnycloud.jp/column/20231207-01/)

## 2024年の活動振り返り
クラウド女子会としてのイベント開催もありますが、その中から、
JAWS DAYS 2024、AWS Summitの2つについて書いてみます。

### JAWS DAYS 2024
JAWS DAYS 2024の実行委員を経験しました。コロナ前は家族の都合などでオンライン中心に参加していて、オフラインの大きなイベントの参加は初めてでした。

イベントの参加も初めてながら、実行委員をする機会をいただいたことに感謝です。

最初の実行委員のキックオフでは知らない方もたくさんいらっしゃいましたが、イベントを作り上げるため、一緒に朝早くから夜遅くまで活動しました。実行委員の方の自宅にお邪魔したり、実は家が近所の方がいて地元のお店に行ったり、濃い時間を過ごしました。

仕事も参加しているJAWSのコミュニティも違いながら、イベントを盛り上げようと一つになり、色々なアイディアを出し、形にしていく過程がとても面白かったです。
より一層、JAWSを盛り上げて、コミュニティに貢献していきたいと思ったきっかけのイベントです。

イベントでは、初めてスポンサーをさせていただきました。ランチセッション付きだったので、部署の後輩に登壇してもらい発表を聞きました。

また、自身も機会をいただき、「CIer・SIer集まれ！！クライアントワークな私たちとAWSの良い関係を考えよう！」のセッションに登壇しました。
セッションの内容は、[こちら](https://togetter.com/li/2327985)から。

### AWS Summit
初めてコミュニティのミニセッションで運営の五味さんと登壇の機会をいただきました。
発表内容は、運営しているコミュニティの説明、「女性」と支部名についているのでその特色、今後の目標などをお話しました。

初めて運営メンバーと色々支部そのものをテーマにディスカッションすることができました。

運営メンバーはたまたまAPN企業のメンバーが多いこともあり、次のAPN系のイベントや新しいAWS技術について色々話してきましたが、どこにこだわりを持って活動しているのか？を短い限られたセッション時間の中で言語化できたのは、プラスだったと思います。
大げさですが目標を共有することで、方向性も具体化されてきたと感じたイベントでした。

## 2025年の活動
クラウド女子会では、2025年1月にまずはre:Inventのre:Capとしてイベント開催を予定しています。

また、他の支部とも交流していきたいと思っています！
2024年にコラボしていただいた支部の方々ありがとうございます。

[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858908/2a334373-f98a-cee4-d1f1-3d0184c473f8.png)](https://jawsug-cloudgirl.connpass.com/event/329597/)
Linuxでパスワードを忘れてログインできなくなった際のリカバリ方法

# この記事について
ログインパスワードを忘れてしまい焦った経験あるでしょうか。
私はつい最近virtual box上に立てたLinux vmのパスワードが分からなくなったのでこんな記事を書いてみようと思いました。
なお、この記事はUbuntuを対象に記載しています。


# やること
やることは意外に簡単でした。
以下の手順だけでリカバリできます。

- シングルユーザモードでLinuxを起動する
- コマンドでパスワードを変更する
- シングルユーザモードを終了してログイン確認



## シングルユーザモードでLinuxを起動する
シングルユーザモードはUNIX系OSの動作モードの一つで、起動後はrootユーザとして操作可能になります。
シングルユーザモードで起動している場合、通常モードで再起動するまでほかのユーザがログインすることはできません。
要するにメンテナンス用のモードです。
パスワード不要でroot権限を使えるので今回このモードを使用しています。

### ①GRUBメニューを開く
対象のサーバの電源を入れます。今回はGRUBメニューを開きたいので完全に立ち上がる前にescキーを押します。（連打でOKです）

成功すると以下の画像のようなGRUBメニューが開きます。
このGRUBメニューで`Advanced options for ubuntu`を選択してEnterキーを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967908/d7e9a36d-bbed-76b7-97f9-7ac0edbf3850.png)

### ②recovery modeでOSを起動する
次に以下の画像のように選択肢が表示されます。
ここでは`(recovery mode)`の方を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967908/f3083ced-3c2f-73ed-20b7-6a512c4c26f7.png)

ちなみに環境によっては複数バージョンのOSが表示されることがあります。

### ③root権限でshellを起動する
Recovery Menuの選択画面が開きます。ここで`root`を選択します。
こうすることでパスワード不明な状態でもroot権限でshellを起動することできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967908/d02a8434-329e-5213-9754-333e49249a27.png)



## コマンドでパスワードを変更する
root権限でshellに入れているのでなんでもできます。
つまり、ユーザのパスワードの変更も自由にできます。

早速`passwd [user名]`コマンドで任意のユーザのパスワードを変更します。

例
```
root@ubuntu:~# passwd user
New password:
Retype new password:
passwd: password updated successfully
```


## シングルユーザモードを終了してログイン確認
パスワード変更が終わったら、シングルユーザモードを終了してログイン確認を行います。
まずは`exit`コマンドでシェルから抜けます。

`exit`を入力すると以下の画面に遷移します。
ここで`resume`を選択して通常の方法でLinuxを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967908/b1405234-4aa2-4cde-ca31-f6c801657507.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967908/4706544b-d459-b238-f283-46fc1753b226.png)


この後通常のログイン画面に遷移します。
そこで、今回変更したパスワードを使ってログインできれば問題解決です！


#  参考文献
以下のwebページを参考にさせていただきました。

[VirtualBox + CentOS 7 で root のパスワードがわからない時の対処法](https://webgroove.work/virtualbox-centos-change-root-password/)
[Ubuntuに「トラブル時に」ログインするいろいろな方法](https://gihyo.jp/admin/serial/01/ubuntu-recipe/0639)
Gitの概念とコマンド操作を学べるゲーム「Oh My Git!」を遊んでみた

# はじめに
趣味や学校でGitに触ることなく新卒で入社してきた人にとってGitでの資産管理はなかなか学習ハードルが高い。
実際に新卒研修で一通りは触るようなカリキュラムにしているものの、
頭に「？？？」が飛んでいるのが見てわかる。

Web上にはGitの概念や各コマンドを分かり易く解説してくれている素敵なページがいくつもあるが、
やはりコミットが遷移していく流れ等は図だけではなかなかわからないものがある。

https://backlog.com/ja/git-tutorial/

実務上はgitコマンドよりもVSCodeのソース管理機能や拡張機能のGitGraphで
なんとなく操作ができてしまうため困らないかもしれないが、
GUIでの操作では解決できない問題や、GUI上の操作の裏で何が起きているのかを知る意味でも
gitコマンドでの操作は一通り理解しておくに越したことがない。
良い学習教材がないかと調べていたら、ミッションクリア型のゲームとして
gitの概念や操作を一通り学べる「Oh My Git!」というOSSのゲームがあったのでプレイしてみた。

## Oh My Git!
### 公式サイト
以下の公式サイトから無料でダウンロードできる。対応OSはWindows、Mac、Linux。

https://ohmygit.org/

Zip形式で解凍するだけなのでインストールは不要。

### 内容
以下ゲーム内で学べるチャプターのタイトル。
各チャプターには複数のステージがあり、1つずつこなしていくことで操作を学ぶことができる。

1. intro
1. files
1. branches
1. merge
1. index
1. remotes
1. changing-the-past
1. shit-happens
1. workflows
1. stash
1. tags

### プレイ画面
画面中央の部分は現在のリポジトリの状況が可視化され、下部にはコマンドが書かれたカードがある。
画面右側には状況の説明と達成すべきミッションが赤枠で記載されている。
条件を達成すると緑色になってクリア扱いとなる。

画像の例では、ブランチのheadとコミットがぐちゃぐちゃになってしまったので、`git checkout`や`git reset --hard`で正しい状態にするというお題。

![git_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561546/524f4895-198b-b068-e625-11c28088bcdd.jpeg)

![git_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561546/191b8802-0b04-febd-1490-3040729e0fab.jpeg)

画面下側のコマンドのカードは、それを画面上部にドラッグ&ドロップでプレイしていくことで、
カードに記載されたgitコマンドが実行されるシステムになっている。
カードをプレイすると、連動したgitコマンドが画面右下のターミナル部分に出力されるため、
カードの絵、リポジトリに起こった変化、ターミナルに出力されるコマンドの3点で動きを把握できるため頭に入りやすいと感じた。

## まとめ
ゲーム自体は筆者がやった限りでは2時間かからないぐらいでクリアできたが、
git初心者が真面目にやろうとすると3～4時間以上はかかるぐらいのボリュームはあるのではないかと思う。
また、プレイ画面を見てわかる通り、全て英語で日本語は対応していない。
難しい単語や構文は出てこないものの、git以前にそこで「ウッ」となってしまう人は多そうである。

ちなみに慣れている人はターミナル部分に直接コマンドを打ちこんでも操作が可能。
1周目はカードで、2周目はコマンドでといった遊び方もできそう。

筆者は触っていないが、他のGit学習コンテンツとして「Learn Git Branching」というものがあった。
こちらはゲーム形式ではないものの、リポジトリ内の状況を可視化しながらコマンドの学習ができそうだった。

https://learngitbranching.js.org/?locale=ja

以上。
VSCodeのDev Containersを実行した時に、Docker version 17.12.0 or later requiredと表示される

## 問題
VSCodeのDev Containersを使おうとした時に、「Docker version 17.12.0 or later required」と表示され接続できない。

## 解決方法
Docker ver17.12.0以降をインストールしておきます。
設定の Dev > Containers: Docker Path を以下コマンドで表示されたパスに書き換えます。
```
$ which docker
```

## 参考
https://obel.hatenablog.jp/entry/20221024/1666551600
Babylon.jsでメッシュの体積計算を可視化する

この記事は[Babylon.js Advent Calendar 2024](https://qiita.com/advent-calendar/2024/babylonjs)の20日目の記事です。

# はじめに

[前回の記事](https://qiita.com/kiyuka/items/bed73ecbd4c052cc399c)で面積計算をやったよ！じゃあ次は体積だよね？ということで体積計算を可視化していくよ。

# できたもの

https://x.com/kiyuka_study/status/1870738644153299068

Playground
https://playground.babylonjs.com/#A28FEN#1

# メッシュの体積を計算する方法

体積の計算方法については、[モデルの体積を計算する](https://shikousakugo.wordpress.com/2013/08/25/volume/) の解説がわかりやすいかなと思います。

やっていることとしては「メッシュを構築する三角形と原点とで構成される三角錐について符号付き体積を計算して合計する」みたいなことなんですが、まあ何が何やらですよね？解説を見てもやっぱり難しい！

# 2次元上の多角形の面積の計算方法を解説するよ

わかんないときは問題を簡単にしよう！ということで3次元から2次元にして考えるよ。つまり体積じゃなくて面積で考えてみる。

上記の体積の計算方法を面積に置き換えると、

```markdown
「多角形を構成する辺」と「原点」とで構成される三角形について、
「符号付き面積」を計算して合計する
```

ということなんだけど、順に見ていこう。

## 「多角形を構成する辺」と「原点」とで構成される三角形

まずは最初の【「多角形を構成する辺」と「原点」とで構成される三角形】を図で表すとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703301/6f0d05cc-fa07-b169-a534-a99b2f0d2eec.png)

この図だと五角形だから5つの三角形を作ることができるね。この三角形の符号付き面積の和を計算するわけだ。

## 符号付き面積

でも「符号付き面積」って何？面積なんだからプラスの値しかないのでは...？って思うよね？その説明をするよ。

ここで、多角形の頂点から左回りに矢印を引いてみる。そしてその矢印を基準に三角形を見ると、(0, 2, 1)の三角形は右回り、(0, 2, 3)の三角形は左回りになっているね。
この左周り右回りの違いによって、面積の符号を変えるのが「符号付き面積」だよ。今回の場合だと、右回りになっている三角形の面積を負の面積、左回りになっている三角形の面積を正の面積、とするよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703301/aea2cf57-1636-0453-b014-525f51d7ddf9.png)

五角形の5つの三角形について図にすると以下のような感じ。青が負の面積、赤が正の面積になっているから、面積を足し合わせると多角形の面積になっていることがわかるね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703301/688c90a8-0cbb-5ee7-eb34-3a5c2ded9b4c.png)


こんな感じに【「多角形を構成する辺」と「原点」とで構成される三角形について、「符号付き面積」を合計する】ことで、多角形の面積を計算できることがわかったね。

# 体積計算を可視化しよう！

さて、2Dがわかったから次は3Dだ！ということで改めて計算方法を確認してみると

```markdown
「メッシュを構築する三角形」と「原点」とで構成される三角錐について、
「符号付き体積」を計算して合計する
```

この意味がイメージしやすくなっているんじゃないかと思う。じゃあこれを図で説明してみよう！と思うわけだけど、図にするの難しいよね？
そういうわけでBabylon.jsで可視化していこう！というのがこの記事の趣旨なんだけど...ここまで長かったね？

## できました

なにか解説を書こうと思ったんだけど、

実際に説明を文章で書くよりも触ってもらったほうがわかりやすいでしょ！というかここまで読んでみんな疲れてるよ！あとはみんな実物触って遊ぶがいいさ！

と思ったのでPlaygroundに作ってあるからみんな遊んでね！別にここまで記事書いて力尽きたわけじゃないんだからね！？

※ 最初の方に乗せたのと同じリンクです

https://playground.babylonjs.com/#A28FEN#1

すっごく簡単にだけやっていることを説明すると

1. メッシュから三角形を取得
1. 三角形と原点で三角錐を作って面積を計算
1. ボタンに応じて表示される三角錐と面積を切り替えるようにする

ということをやっているよ！


# まとめ

メッシュの体積計算の方法を解説したよ！難しい問題を理解するためには、まずは問題を簡単にして考えるって大事だよね。

最後はサボったわけじゃないんです><

# 参考

https://shikousakugo.wordpress.com/2013/08/25/volume/

https://elosove.com/?p=208
AIとタッグを組んで有馬記念に挑戦した結果

# はじめに
こんにちは！
Flutterエンジニアをしています、みどりです！
有馬記念、勝ちましたか？

本記事では、競馬未経験の私が、AI検索エンジン「[Perplexity](https://www.perplexity.ai/)」に言われるがまま馬券を買ってみた物語です
 

# Perplexityの特徴
Perplexity AIは、自然言語処理技術を活用した会話型のAIサービスで、以下のような特徴があります

**情報源の明示**：回答に使用した情報源や参考文献を「Sources」欄に明確に表示します
**最新情報へのアクセス**：インターネットから最新の情報をリアルタイムで検索し、常に最新のデータに基づいた回答を提供します

2024/12/22現在、1日の質問数に制限なく利用可能です！

# 有馬記念挑戦の流れ

最初のプロンプトはこちら！
```
2024の有馬記念に1500円分かけます
一緒にどれにかけるか考えて
```

返ってきたのは、こちら

![スクリーンショット 2024-12-22 17.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/05637965-6cdc-b80d-975b-ee6dda81a1f0.png)


### **嘘だろ当たってた！！！！！！！**



しかしその時の私はそんなことつゆ知らず、次のプロンプトを返します
```
その回答を10倍賢くして
```

これにより、買い方が分散されました

![スクリーンショット 2024-12-22 17.06.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/a4017309-0569-cd48-8f20-a04e105e9e5c.png)

![スクリーンショット 2024-12-22 17.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/629c6fa8-aefd-37f6-ec61-21d4c8965aec.png)
![スクリーンショット 2024-12-22 17.07.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/bb0151e0-1c38-d996-3d52-36c4b245479a.png)

ドウデュースは出場しないので、訂正します

```
ドウデュースは出場しないことになったよ
最新の情報も加味してもっと考えて
```

![スクリーンショット 2024-12-22 17.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/4bacf847-57bd-9b5e-fe53-357790b4f1e5.png)
![スクリーンショット 2024-12-22 17.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/ba225435-c8bf-acdb-5904-3b251d95cbd8.png)


しかし、ここで私は余計なことをしてしまったのです
それはなんと「**友達に固いと聞いたアーバンシックは入れないのか尋ねる**」という愚行です

プロンプトはこんな感じ
```
質問なんだけど、アーバンシックはデータ予想だと一番人気だけど、入れないの？入れなくていいけど

```

それによって予想はガラッと変わり、以下になりました!

![スクリーンショット 2024-12-22 17.10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/7972fcb7-527e-b33e-3361-988e2c2b89ff.png)

 そしてパワハラします

 ```
 その回答を10倍賢くして
 ```

![スクリーンショット 2024-12-22 17.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/9f74fc30-0cb4-6d7b-f4cf-65a2671ad0d2.png)
![スクリーンショット 2024-12-22 17.11.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/befd9ab6-f5af-e5cb-6c7d-a711d0638759.png)

 最終的に買った馬券はこちらです！
 
![競馬.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620636/339f7622-545e-24f2-0e63-65cffb5a0e98.png)

# 結果
1500円賭けて返ってきたのは640という渋い結果になりました

しかしですよ！？最初のプロンプトどおり、３連複に500円賭けていたら

### 20,850円 × 5倍 = 104250円！？

いや〜なんもわからないならAIの言いなりになるべきでした・・・

# 最後に

この度は私の意思が入って大成功とはなりませんでしたが、未経験者がAIに賭けさせることにはこんなメリットがありそうです！

- 手堅い賭け方が知識0でもできる！
    - 詳しい友達に見せましたが、意味のわからない買い方はしていなかったようです
- AIがどうしてそのように賭けるかまで教えてくれるので、友だちの話についていける！
    - 騎手との相性、レースの特徴、最新の戦績まで踏まえて解説してくれました！

また、AIは本誌の予想をデータの予想よりも見ていそうでした（本誌とデータが何かはわかっていませんが）

皆さんも自己責任で競馬を楽しみましょ〜〜！
ClaudeのMCPを使ってローカルファイルにアクセスする

## やりたいこと

ClaudeのMCPを使ってローカルファイルにアクセスする

https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem

## 手順

MCPサーバの接続方法については以下記事を参考にしてください。
Filesystemのサーバだけ立てたいのであれば、Brave APIのところはスキップしてOKです。

https://zenn.dev/nislab/articles/2024-11-30-claude-mcp

すでに他のサーバで接続ができておりFilesystemのみ新しく使いたいという場合は`claude_desktop_config.json`に"filesystem"の箇所を追加してClaude Desktopアプリを再起動すれば使えるようになります。

```json:claude_desktop_config.json
{
	"mcpServers": {
        "filesystem": {
            "command": "npx",
            "args": [
                "-y",
                "@modelcontextprotocol/server-filesystem",
                "/Users/<YOUR_USER_NAME>/Desktop"
            ]
        }
	}
}
```

## 動作確認

正常に設定できていればチャット欄右下の方にトンカチアイコンが表示されます。

![スクリーンショット 2024-12-22 16.45.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259490/550b7de2-af79-7c54-dcef-38be3040f0cd.png)

トンカチアイコンをクリックすると使用可能なMCP Toolsが表示されます。
以下のようにfilesystemに関するものが表示されていればOKです。

![スクリーンショット 2024-12-22 16.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259490/9c29f284-4cdb-5ae4-fbf3-5b8d197bb5d3.png)

それでは実際に使ってみます。
とりあえずローカルファイルにアクセスできるか聞いてみたらできました。
（この際、アクセス許可するかどうかという確認モーダルが出るので許可すれば進めることができます）

![スクリーンショット 2024-12-22 16.37.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259490/abc0693e-b77d-c26e-d0c5-835fb9f725d8.png)

もしサーバの接続に失敗したり、何かうまくいかないことがあれば以下の記事を参考に設定を修正してみてください。
（私が書いた記事の紹介になりますがお許しください🤲）

https://zenn.dev/sun_asterisk/articles/58647adfba4609

https://zenn.dev/sun_asterisk/articles/6c9c0dc8535d6f
社内で絶大な支持を集めるDifyアプリTOP3

近年、AIや自動化ツールは企業の業務効率化に大きく貢献しています。  
私たちリンクアンドモチベーションでも、社内の業務をよりスピーディーかつ正確に行うために、Difyを積極的に導入してきました。

これまでにプロトタイプを含め、**100を超えるDifyツール** を開発し、さまざまな場面で活用しています。結果、特定部署ではひとりあたり40時間/月の業務効率化を実現しました。
今回は、その中でも **継続的に多くのユーザーに利用されているTOP3** のDifyアプリを紹介します。

## 1. 日本語校正ツール
**顧客や外部に向けた文章をチェックし、校正後の文章と具体的な指摘事項を提案してくれるツール** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/6a7ede2a-4ba5-d65f-8464-815d48b21415.png)

- **誤字脱字の検出**  
  人間の目では見落としがちな細かなミスを、正確に洗い出してくれます。    
- **使い方がシンプル**  
  文章を貼り付けるだけで、瞬時に校正結果が返ってくるため、作業の合間に気軽に使えます。

社内メールからお客様向け提案書まで、幅広い文章の品質を底上げするこのツールは、**文章作成時の二次チェック機能**として欠かせない存在です。

## 2. メール返信文提案ツール
**受信メールに対してAIが返信文の草案を提案するツール** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/b2dfc543-9f65-f089-af38-e6fd83fa97af.png)

- **定型文の自動生成**  
  お礼、依頼、謝罪など、ビジネスメールで頻出する表現を自動生成してくれます。  
- **含めたい内容の指定**  
  返信メールに盛り込みたい情報やキーワード（例：「納期調整」「ミーティングの参加可否」「次回アクションの提案」など）を指定しておくことで、  必要事項を漏れなく返信文を作成できます。
- **文面のトーン調整**  
  相手や内容に応じて、カジュアルからフォーマルまでトーンを微調整できます。  

このツールのおかげで、**メール対応にかかる時間が大幅に削減**されました。社員からは「メール対応時間に余裕ができた」「忘れがちな定型表現を自動で補えるのが助かる」といった声が寄せられています。

## 3. アンケート分析ツール
**アンケート内容を多角的に分析し、わかりやすいレポートを生成するツール**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20310/b051e023-2f95-9075-2190-0affbb68de08.png)

- **集計・可視化の自動化**  
  これまでは手作業で行っていたアンケート分析がボタン一つで完了します。  
- **深い分析の提案**  
  性別や年代別の意見の違いなど、AIが新たな切り口で分析の示唆を与えてくれます。  
- **レポート作成の効率化**  
  分析結果をわかりやすくまとめられるため、**社内報告や提案時のアウトプットもスムーズ**です。

このツールにより、アンケート結果の分析から施策立案までのプロセスが圧倒的に早くなり、**より的確な意思決定**を行えるようになりました。

## まとめ

これら上位3つのツールに共通しているのは、**職種問わず多くの業務で利用機会があり、すぐに成果を実感しやすい**という点です。  
Difyを活用したアプリは、操作が直感的で簡単なものが多く、**開発から社内全体へ浸透するスピード**も速いのが特徴です。  

今後もDifyを活用し新しいアプリ開発を積極的に進め、業務効率化を加速させていきます。
botアプローチ案1

【導入】
数年ぶりにbot参入。
キャッチアップ：2024/05～08
運用　　　　　：2024/08～

↓現在動かしているbotストラテジー
※オーバーフィットbotだが、損益曲線維持しているため運用中。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871574/46b46ce1-fa4b-c9de-1be0-855b30b4398a.png)

【現在の課題】
・ある特定のストラテジーと損益曲線が将来も続くとは限らない。
・ある特定のストラテジー相場環境が合っていない場合、損失を出し続ける。

【理想の状態】
・相場環境に影響を受けず、損益曲線を維持し続ける。

【課題解決案1】
・ロバストで、将来も損益曲線を維持できるストラテジーを作る。

【課題解決案2】
・案1は現実的には難しいので、なるべく相関の低い複数のストラテジーを複数個運用する。

【案2の場合のシミュレート】
下記のようなコードで疑似ストラテジーのリターンを再現。
※ストラテジー3種運用と仮定。
※本記事の本筋とは関係無いため、平均、分散、外れ値などは適当。
```python:python.py
def geenrate_returns(size=None, loc=None, scale=None, outlier_size=None, outlier=None):
    data_tmp = np.random.normal(loc=loc, scale=scale, size=size)
    # たまに+xを追加する
    # random_indices = np.random.choice(range(size), outlier_size-10, replace=False)
    # data_tmp[random_indices] = outlier-2
    
    # たまに-xを追加する
    random_indices = np.random.choice(range(size), outlier_size, replace=False)
    data_tmp[random_indices] = -1*outlier

    return data_tmp


def generate_data(num_columns=3,df2=None):
    # 各カラムのデータを格納するリスト
    data_list = []
    for i in range(num_columns):
        data_tmp = geenrate_returns(
            size=500,
            loc=0.3,
            scale=1,
            outlier_size=25,
            outlier=3
            )

        data = data_tmp / 100 
        data = data.cumsum()


        data_list.append(data)

   
    # データをDataFrameに格納
    df = pd.DataFrame({f'Value{i+1}': data_list[i] for i in range(num_columns)})
    df['Value_sum'] = df.sum(axis=1)

    size_tmp = df2.shape[1]+1

    df2[f"Value_sum_{size_tmp}"] = df['Value_sum']
    return df, df2
```
【シミュレート結果】
損益曲線（例）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871574/80819540-4228-c980-28cf-1d00012b8f63.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871574/a122523e-cd89-99e8-d8f6-9cc07a6c8f5b.png)
単体で見ると、DD発生してたり横這いになっているストラテジーがあるが全体で見ると、滑らかな損益曲線になっていることが分かる。

上記を複数ループしてValue_Sumをまとめてplotしたのが以下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2871574/d44247e8-9534-8f59-0684-d0772eaf86f9.png)

【結論】
90点のストラテジーを一つ作るより、50～70のストラテジーを量産するほうが簡単で、取り組みやすい。
RDSでMySQLデータベースを作成し、ローカルから接続するための接続設定と注意点


## はじめに
[公式サイト](https://aws.amazon.com/jp/getting-started/hands-on/create-mysql-db/)の手順に従ってRDSのMySQLデータベースを作成し、ローカル環境から接続しようとしました。その際、セキュリティグループやネットワーク設定が原因でなかなか繋がらなくて苦労したので本記事に注意点をまとめます。

---

## 1. RDSのMySQLデータベースの作成
公式サイトのチュートリアルを参考にRDSのMySQLデータベースを作成しました。

https://aws.amazon.com/jp/getting-started/hands-on/create-mysql-db/

---

## 2. セキュリティグループとネットワーク設定
私が作成したMySQLに接続できなかった主な原因は、RDBをおいたVPCによって自分のPCからの通信がブロックされているからでした。以下の手順で問題を解決しました。

1. **RDSのセキュリティグループ設定**:
   - AWSコンソールでRDSのセキュリティグループページに移動します。
   - インバウンドルールを追加:
     - **ソース**: カスタム
     - **IPアドレス**: 使用しているPCのグローバルIP
     (自分のグローバルIPは以下のコマンドで確認できます。）
       ```bash
       curl inet-ip.info
       ```
<br\>
2. **VPCのルートテーブル設定**:
   - VPCのルートテーブルを開き、以下を設定:
     - **送信先**: `0.0.0.0/0`
     - **ターゲット**: インターネットゲートウェイ

---

### 注意
上記の設定は**一時的な接続確認用**です。接続確認後はセキュリティ強化のため、パブリックIPの許可を削除し、AppRunnerや特定のサービスからの接続に限定しましょう。

---

## 3. 接続確認手順
接続が成功したかどうかを確認するため、以下のコマンドを実行します。

```bash
mysql -u <マスターユーザー名> -p -h <RDSエンドポイント>
```

## 終わりに
公式サイトの手順はとてもわかりやすいものの、ネットワーク設定が正しくないと接続確認に苦労することがあります。そんな時、この記事が少しでもお役に立てれば幸いです。
std::set と std::map に対する二分検索にはメソッドの lower_bound を使いましょうという話

# はじめに

https://atcoder.jp/contests/abc385/tasks/abc385_d

コンテスト中に解けなかった AtCoder ABC385 D問題の復習をしていて、最終的に TLE が取れなくて泣きそうになったので、二度と繰り返さないように備忘録です。

# 先達の英知

本記事の結論は**タイトル通り**なんですが、手っ取り早く内容を知りたい方は検索で見つかった先達の方々の記事をご参照ください。

https://qiita.com/yaskitie/items/da225f5ab13bb6d3221e

https://qiita.com/sinzyousan/items/158b19a9a3fecf8b855f

# ChatGPT さまのご神託

![スクリーンショット 2024-12-22 163122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798407/48feefe7-2b06-d904-8505-363588f31bf7.png)



`set` の操作において、**`std::lower_bound(X.begin(), X.end(), t)`** と **`X.lower_bound(t)`** は目的が似ていますが、内部的な動作が異なるため、パフォーマンスにも違いがあります。

---

### **`std::lower_bound(X.begin(), X.end(), t)`**
- **動作**:  
  これは `std::set` を範囲として扱い、**線形イテレータアクセス**を通じてバイナリサーチを行います。  
  `std::set` のデータは木構造（通常は赤黒木）で管理されているため、`X.begin()` から `X.end()` を使用して要素を取得するコストがかかります。  
  バイナリサーチ自体は \( O(\log n) \) の計算量ですが、イテレータ操作により要素を移動するコストが発生し、実際には遅くなることがあります。

- **計算量**:  
  典型的には **\( O(n) \)** （イテレータを1つずつ進める必要があるため）。

---

### **`X.lower_bound(t)`**
- **動作**:  
  これは `std::set` 固有のメンバ関数で、直接内部の木構造にアクセスし、目的の値を探します。  
  赤黒木を利用した検索のため、不要なイテレータ操作を省略し、最短経路で目的の要素を取得します。

- **計算量**:  
  **\( O(\log n) \)** （`std::set` の木構造に依存）。

---

### **結論**
- **`X.lower_bound(t)`** の方が常に速いです。  
  理由は、`std::lower_bound` は汎用的なアルゴリズムで、`std::set` に特化した実装ではないため、イテレータ操作に余計なコストがかかります。
- **推奨**:  
  `std::set` に対しては **`X.lower_bound(t)`** を使用してください。

---

### **補足**
- 同様の理由で、`std::map` に対しても `std::lower_bound` ではなく `map.lower_bound` を使用する方が効率的です。  
- 必要なときに範囲アルゴリズム（`std::lower_bound`）を使うのは、配列や他のコンテナ（例: `std::vector`）で効率的なソート済み探索を行いたい場合です。

---

# 反省点

[解説動画](https://youtu.be/O5l04fNO-bY?t=5472) を拝見して、「同じことやってるつもりなんだけどなぁ:rage:」とイライラしてましたが、「別に set じゃなくてもよくない？」と std::vectorでやろうとして WA を量産したのち、反省して std::set に変更してからの TLE 量産で、貴重な休日を浪費しました。

**データ型選び大事。** （凡庸な結論）
supabase で多対多な関係のレコードを頑張って登録する

# はじめに

JISOU の課題でプロフィール、得意なスキル、SNS を登録するフォームを作成しました。

- 課題でチャレンジしたこと
  - supabase で多対多な関係のレコードを登録
  - supabase で UUID を主キーに設定
  - react router を使ったルーティング

# 工夫してみたところ

## supabase で多対多な関係のレコードを登録

Rails だと中間テーブルは特に意識せずしれっと作ることが多いですが、いざ SQL でやるとなると違った考え方になるので楽しいですね。supabase ではクライアントからトランザクションを実行できないようで（※）プロシージャを作るのが普通のようです。

:::note warn
トランザクションを実行できないのは流し読みしてた記事にあったのですが情報元は不明です。
:::

```sql
CREATE OR REPLACE FUNCTION public.insert_user(
  name varchar,
  description text,
  skill_id integer,
  github_id varchar,
  qiita_id varchar,
  x_id varchar
)
RETURNS varchar
AS $$
  declare
  user_id varchar;
begin
  INSERT into users
    (id, name, description, github_id, qiita_id, x_id)
    values (gen_random_uuid(), name, description, github_id, qiita_id, x_id)
    returning id
    into user_id;
  INSERT into user_skill
    (skill_id, user_id)
     values (skill_id, user_id);
RETURN user_id;
END $$ language plpgsql;
```

users テーブルの主キーは UUID を想定して varchar としているので `gen_random_uuid` を呼び出して生成しています。

:::note
プロシージャを追加したときも型定義を更新する必要があります
:::

## react router を使ったルーティング

Rails router より優秀かな？と思いました。多分、思想の違いで優劣つけるものじゃないですが。例えば、

```
<Routes>
  <Route path="cards/register" element={<Register />} />
  <Route path="cards/:id" element={<Card />} />
</Routes>
```

このように定義すると次のような URL にアクセスすると該当するコンポーネントを描画します。

- `/cards/register`  
Register コンポーネントを描画
- `/cards/sample-id`  
Card コンポーネントを描画

これを順序逆にしても問題なく動きます。この点が Rails と違いますよね。Rails 8 は知りませんがそれ以前だと最後に定義した内容が優先されるはずなので `/cards/register` は id が register として理解されて期待するコンポーネントを描画することはありませんでした。

# 終わりに

課題に取り組むとき react router が v7 へバージョンアップしていました。情報が少なく困りましたが、やはり本家サイトはわかりやすく不安を払拭できました。
読書会の紹介＠秋葉原ロボット部理論グループ

## はじめに
秋葉原ロボット部理論グループでは、定期的に読書会を開催しています。現在開催されている読書会のテーマは、下記の2つです。

- 相対性理論
- ガロア理論

それぞれの読書会について簡単に解説します。

## 相対性理論
毎週月曜の20時から1時間イベントを開催しています。Zoom でのオンライン読書会です。
connpass でイベントを公開しています。下記は、記事執筆時点の最新イベントです。
[「一般相対性理論を一歩一歩数式で理解する」 読書会 第114回 - connpass](https://akbrobot.connpass.com/event/340409/) [^1]

アインシュタインが導いた「一般相対性理論」を数式ベースで理解しよう、という趣旨の書籍を輪読します。各節ごとに担当者を決めて持ち回りで解説していただき、質疑応答・ディスカッションを通して理解を深めていきます。
記事執筆時点では、クライマックスの第7章「一般相対性理論」に入ろうというところですが、少しでもご興味があればお気軽に読書会を覗いてみてください。
参加メンバーは、初心者から他の書籍で相対性理論を勉強している方まで様々です。

### 書籍情報
石井俊全. 『[一般相対性理論を一歩一歩数式で理解する](https://www.beret.co.jp/book/44987)』. ベレ出版, 2017, 672p. [^2]
(ISBN: 978-4-86064-498-7)

![『一般相対性理論を一歩一歩数式で理解する』の書影](https://img.hanmoto.com/bd/img/9784860644987.jpg)

#### 目次
- 第1章「数学の準備」：19ページ
- 第2章「物理の準備」：123ページ
- 第3章「テンソルと直線座標のテンソル場」：207ページ
- 第4章「特殊相対性理論」：297ページ
- 第5章「曲線座標のテンソル場」：411ページ
- 第6章「曲率」：481ページ
- 第7章「一般相対性理論」：559ページ

### 対象
高校の数学および物理ができるぐらいの方であれば、取り組めると思います。
高校で習った微積分とベクトル、行列を使います。なお、1996年度〜2005年度および、2015年度以降の高校数学の指導要綱には行列が入っていないので、該当の方、および行列を忘れてしまった方はしっかり行列の予習をしておいてください。

### キーワード
- 接続係数
- クリストッフェル記号
- 計量テンソル
- など

## ガロア理論
毎月2回（第1, 3 水曜日）で1回あたりの開催時間は2時間です。こちらも Zoom での開催です。
記事執筆時点での最新イベントは下記です。
[「ガロア理論の頂を踏む」読書会 第8回 - connpass](https://akbrobot.connpass.com/event/340634/) [^3]

「一般の５次方程式が根号で解けないことをきちんと証明する」ことを目標とした書籍を扱います。こちらも各節に担当者を割り振って進めていきます。
記事執筆時点では、第1章の最後の第11節を輪読中です。相対性理論の読書会と違って、こちらはまだまだ序盤ですので短時間で追いつけると思います。
参加メンバーは「しっかり理解しよう」という熱意のある方が多く、ディスカッションは毎回盛り上がっています。


### 書籍情報
石井俊全. 『[ガロア理論の頂を踏む](https://www.beret.co.jp/book/43638)』. ベレ出版, 2013, 504p.[^4]
(ISBN: 978-4-86064-363-8)

![『ガロア理論の頂を踏む』の書影](https://img.hanmoto.com/bd/img/9784860643638.jpg)

#### 目次
- 第1章「整数」：23ページ
- 第2章「群」：97ページ
- 第3章「多項式」：191ページ
- 第4章「複素数」：223ページ
- 第5章「体と自己同型写像」：271ページ
- 第6章「根号で表す」：411ページ

### 対象
対象は、高校の数学がある程度わかる方です。
わからないことを積極的に質問してくれる方は大歓迎です。もちろん、聞くだけの参加も大丈夫です。

### キーワード
- 原始根
- 剰余類
- 既約剰余類群
- など

## おわりに
今後は、「圏論」、「意識」をテーマとした勉強会を開催する構想があります。
ご質問があれば、秋葉原ロボット部の Discord サーバ[^5]にて随時受付中です。「コミュニティの雰囲気を知りたい」という方も、ぜひご参加ください。

[^1]: https://akbrobot.connpass.com/event/340409/
[^2]: https://www.beret.co.jp/book/44987
[^3]: https://akbrobot.connpass.com/event/340634/
[^4]: https://www.beret.co.jp/book/43638
[^5]: https://discord.gg/bqVJS2S
【Rails】スキーマ書き換えダメゼッタイ！！

## はじめに 🚗  
こんにちは！  
本記事では **Railsのマイグレーションファイル** と **schema.rb ファイル** について、わかりやすく解説します。  
初心者にも理解しやすいように、これらを車の **設計図** や **監視カメラ** に例えて説明していきます。

Railsを学び始めた方が「なるほど、こういうことか！」と思える記事を目指しますので、ぜひ最後までお付き合いください！ 🚀  

## マイグレーションファイルは 設計図 🛠️  

### 1. 設計図としてのマイグレーションファイル  
**マイグレーションファイル** は、データベースの構造を定義・変更するためのファイルです。  
これは車の **設計図** に例えることができます。

#### 設計図のポイント  
- 車の設計図には、車種や車の色の仕様が書かれています。  
- 設計図に従って、実際に車が製造されます。  
- 必要に応じて設計図を更新し、新しい部品や機能を追加できます。  

Railsでも同様に、**マイグレーションファイル** に基づいてデータベースが作成・変更されます。

#### マイグレーションの例 🚘  
```ruby
class CreateCars < ActiveRecord::Migration[6.1]
  def change
    create_table :cars do |t|
      t.string :model      # 車種
      t.string :color      # 車の色
      t.timestamps
    end
  end
end
```
## schema.rbは 監視カメラ 📷
### 1. 監視カメラとしてのschema.rb
schema.rb は、現在のデータベースの構造を記録しているファイルです。
これは、車を監視する 監視カメラ に例えることができます。

### 監視カメラのポイント
- 現在の車の様子を記録します。
- 実際の車の状態が更新されるたびに監視カメラの記録もアップデートされます。
- schema.rb は、データベースの最新状態を視覚的に確認する手段です。

schema.rbの例 📋
```ruby
ActiveRecord::Schema.define(version: 20231203) do
  create_table "cars", force: :cascade do |t|
    t.string "model"      # 車種
    t.string "color"      # 車の色
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
end
```
この設計図（マイグレーションファイル）に従い、Carsテーブル がデータベースに作成されます。

### 設計図（マイグレーション）と監視カメラ（schema）の違い

|項目　|マイグレーションファイル (設計図)🛠️|schema.rb (監視カメラ)📷|
|:--:|:-----------------:|:-----------------:|
|役割|データベースの変更指示書|現在のデータベースの状態を記録|     
|更新| 手動で作成・編集する| rails db:migrate 実行時に自動更新|      
|目的| データベース構造を作成・更新するための計画書   | 現在のデータベースを確認するための記録|     
|例え| 車の設計図  | 車の状態を記録する監視カメラ |    
    
## schema.rb を直接編集しない理由 🛑
schema.rb を直接書き換えると、以下のような問題が発生します

#### 正確性が失われる
- 車の状態を監視する「監視カメラ」の映像を編集しても、車自体には影響を与えません。むしろ、車（データベース）の正確な状態が分からなくなってしまいます。

#### 変更が適用されない
- 本当に車を改造したい場合は、設計図（マイグレーションファイル）を変更し、改めて製造（マイグレーション）を行う必要があります。

## まとめ
#### マイグレーションファイルは車を作るための設計図
設計図がなければ車を製造できません。
設計図を変更することで、新しい仕様の車が作られます。

#### schema.rb は車を監視する監視カメラ
現在の車の状態を確認するために使います。
監視カメラ（schema.rb）の記録を変えるだけでは車自体は変わりません。
これらのファイルを正しく理解し、使い分けることで、Railsでのデータベース操作がスムーズになります！

## おわりに
今回はRailsの**マイグレーションファイル** と **schema.rb**を、**車の設計図** と **監視カメラ** に例えて解説しました。
この記事を通して、データベースの構造管理についての理解が深まったと思っていただけたら嬉しいです。

もし質問や疑問があれば、ぜひコメントで教えてください！
これからも一緒にRailsを学んでいきましょう！ 🚗💨

🎄 また来年もお楽しみに！🎅
松尾研究室での金言集：学生が心に刻むべきアドバイス３選

# はじめに
私が見聞きし印象的だった言葉を、起業家精神を持ち、日々努力する学生に向けて共有します。

https://weblab.t.u-tokyo.ac.jp/

## 応援お願いします！
もしこの記事が役に立ったり、「おもしろそう！」と思った方は、ぜひ 「いいね」ボタン を押していただけると嬉しいです！みなさんの応援が、次のチャレンジへの大きな励みになります。💪

# 人は1.4倍成長する
### 2年で2倍に。20年で1000倍に。
松尾先生自身はドクターを出て20年以上。つまり、1000倍になっている。
孫さんは更に1000倍先にいる。私も負けてられない
###  スタートアップは2T3Dを目指そう
1年目Triple、2年目Triple、3年目Double、4年目Double、5年目Double

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089860/df2f42bd-c1bc-c347-b2af-f9214fc125e2.png)

# 高校生の間にすべて出会っている。
### 難しいと感じる事象は、自分が経験したことのある事象に置き換えなさい。
とにかく、メタ認知が大切。困難な状態でも、やる気が出る方法を探す。

### 起業家としての能力があるのであれば、大企業にいる意味はない。
それでも大企業に行くのであれば、自分がどれだけの決断ができるのかどうかなどを問い、巨額のプロジェクトがあるなどの特別な理由がないと意味がない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089860/004add20-5fe4-5c18-eae9-f57da256adb9.png)


# その日しかない、絵がある。
### 朝起きて、今日はどういう1日にしたいか描きなさい。
何やりたいかがあって、それをどう攻略するかが勝負。設定がないのに戦略立ててもしょうがない。

### キャラを立てよ
いかに自分を覚えてもらうか。自分は何をしている人か。ぼくですら相当考えている
結局人間なので、近い人が好き。日本人も、海外に行くとアジア人と仲良くなる。で、アジア人として世界に振る舞う。けど、宇宙人が来たら人種問わず地球人として活動するはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089860/1ffd54a3-549a-6898-9c24-5a76959e531c.png)

**以上！**
【CFn】yamlフォーマットでJson型の書き方

CloudFormationで値がjson型の場合の書き方でハマったので、そのときの解決した書き方を残しておく。

SNSのポリシードキュメントを書くときにjson型となっていたので、インラインでyaml内にjson形式でポリシーを書いたらエラーになった。

```yml
Type: AWS::SNS::TopicInlinePolicy
Properties:
  PolicyDocument: Json
  TopicArn: String
```

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-sns-topicinlinepolicy.html

実際の書き方は↓になる。

```yml
Type: AWS::SNS::TopicInlinePolicy
Properties:
  PolicyDocument:
    Version: '2012-10-17'
    Statement:
      - Effect: Allow
        Principal:
          AWS: "*"
        Action:
          - "SNS:GetTopicAttributes"
          - "SNS:SetTopicAttributes"
          - "SNS:AddPermission"
          - "SNS:RemovePermission"
          - "SNS:DeleteTopic"
          - "SNS:Subscribe"
          - "SNS:ListSubscriptionsByTopic"
          - "SNS:Publish"
        Resource: !Sub "arn:aws:sns:ap-northeast-1:${AWS::AccountId}:${MySNSTopic}"
        Condition:
          StringEquals:
            "AWS:SourceOwner": !Sub ${AWS::AccountId}
```
PlaywrightのVisual Testing機能について

# Visual Testingとは

Playwrightでは、期待する状況と実際との差異をスクリーンショットを用いて比較するテストを行うことができます。以下がその手順です。

# 手順

## テストコードの記述

例えば以下のように記述します。

  await expect(usingTheGridForm).toHaveScreenshot(); が該当部分です。

```jsx
test('radio buttons', async ({ page }) => {
  await page.getByText('Forms').click();
  await page.getByText('Form Layouts').click();
  const usingTheGridForm = page.locator('nb-card', { hasText: 'Using the Grid'});
  await usingTheGridForm.getByRole('radio', { name: 'Option 1' }).check({ force: true });
  const radioStatus = await usingTheGridForm.getByRole('radio', {name: 'Option 1'}).isChecked();
  
  await expect(usingTheGridForm).toHaveScreenshot();
});
```

## テストを実行する。

通常通りテストを行います。すると、１回目と２回目では実行結果が変わります。

### １回目の実行結果

以下の様になります。

![名称未設定.jpg](https://prod-files-secure.s3.us-west-2.amazonaws.com/e02a7c36-3d50-4be6-95c4-29a0ad0a7254/ea69f208-0a01-44b9-bcb7-8f4f9eaaa1ac/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A.jpg)

![名称未設定.jpg](https://prod-files-secure.s3.us-west-2.amazonaws.com/e02a7c36-3d50-4be6-95c4-29a0ad0a7254/03aabb7b-fc24-4d63-8d1a-347e2e516ef5/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A.jpg)

このエラーは：

- **スナップショットが存在しない**:
- 期待値となるベースラインのスクリーンショット（radio-buttons-1-chromium-darwin.png）がまだ存在しないことを示しています。
- **新しいスナップショットの作成**:
- writing actual は、現在の状態のスクリーンショットを新しく作成していることを示しています。実際に、以下の画像 tests/uiComponents.spec.ts-snapshots/radio-buttons-1-chromium-darwin.pngが作成されました。２回目以降のテストでは、このスクリーンショットと実際の見た目が合致しているかをテストすることができます。

![radio-buttons-1-chromium-darwin.png](https://prod-files-secure.s3.us-west-2.amazonaws.com/e02a7c36-3d50-4be6-95c4-29a0ad0a7254/6891a9fb-e058-4d6f-8851-f4d0f55f3453/radio-buttons-1-chromium-darwin.png)

### ２回目の実行結果

１回目で撮影したスクリーンショットと実際の見た目が合致している場合、至って普通にテストが通ります。
while文

```java:Ex1_11_1
/*-< 演習：Ex1_11_1 >---------------------------------
6の目がでるまでサイコロを降り続けるプログラムを作成してください。
----------------------------------------------------*/
class Ex1_11_1 {
	public static void main (String[] args) {
		
		int dice;
		
		while(true){
			dice = 1 + (int)(Math.random() * 6.0); // 1～6までのランダムなint型を取得する
			System.out.println("dice :" + dice);
			
		    // 6が出るまで降り続け、6が出たらif文の最後にbreakを付けて終了するようにした
			if (dice == 6){     
				System.out.println("6が出たのでを終了します");
				break;
			
			}
		}	
	}
}
```

反省点
・最初出力したときは、diceをwhile文の外で定義してしまったので、数字が固定されたまま無限ループを繰り返してしまった。
・if (dice == 6)とif (dice = 6)の表記の違いに気を付けること。数学の表現と一緒にしないように、比較するときは==。

改善点
・定義するときは、ループの外側で行うこと。
・条件を設定するときに注意深く書くようにする。

8~10行目の別の表記方法
```java:Ex1_11_1
		int dice = 0;
		
		while(dice < 6){
  ```

  ～～～whileの条件の「true」と「dice < 6」の違い～～～
  
・trueは、while+ifで組み合わせる。
メリット
１，終了条件をifで明示できる
２，初期化エラーが起きにくい
└diceの初期値を外側で定義する必要がなくなる

デメリット
１，読む人にとってif文を探して理解しなければならない
２，breakを忘れると無限ループのリスクがある

dice < 6
メリット
１，自然な条件式
└６がでるまでループすることがすぐ確認でき条件が明確
２、breakが不要
３、読みやすさ
└コードを読む順番が複雑ではない

デメリット
１，初期化が必要
└diceの初期値をループ外で設定する必要があり、忘れるとエラーや意図していない動作が発生する
２，ループ条件の変更が面倒
└条件式が固定されるため、終了条件を柔軟に変更しにくい

～～～whileとforの使い分け～～～
while文は繰り返し処理が前提となるため、条件に関連する変数はループ内で更新されることが一般的。そのため、変数を適切に更新する必要があるかどうかを常に意識することが重要。

if文は1回限りの条件分岐を行うため、変数を更新する必要がない場合が多く、条件判定に使用する変数はループの外側で定義されるケースが多い。
【教訓】ヤフオクで1ラックNASサーバー買ったらやらかした話。

# 何をやらかしたのか
当時NASサーバーが欲しかった私はヤフオクで以下のものを買いました

- HDD1tb × 4
- 例のNASサーバー

当時の私は
「どうせ初期化したら使えるっしょ！」
って気持ちでジャンクの業務用NASサーバーを買いました。
まあ1000円だったので頭より先に手が動いたんでしょうね...()

## 悲劇
例のNASが届いたので電源をつけてみました。
電源ランプが光ってたら成功..!
と思ったらずっと点滅している...?
説明書を見てみると起動中だけ点滅するようでしたので放置

### ~1時間後~

まだ光ってやがる...
OSでもイかれてるのか?
と思ったので初期化ボタンを押してみます
#### ポチ

.........反応なし

「え？なんで？」
説明書を見てみたところ

### 初期化ボタンは無効化できます。設定から~

「a-(察し)」

## 結論

多分業務用として使ってたらOSが破損?したのか動かなくなって初期化しようにもできないんだと思います。

## 最後に
めっちゃ適当に書いた記事なんでめちゃくちゃ短いですね...
まあヤフオクで安いジャンクは動かない可能性高いんで気をつけようって話です。
いい勉強代になりました。
Google Cloud Certified: Professional Google Workspace Administrator受験記

# はじめに
Google Cloud Certified: Professional Google Workspace Administrator試験の受験記録です。
本試験は、2024年12月31日で廃止することが決定しています。
記事執筆時点で、別試験（Associate Google Workspace Administrator）が受験可能となっているため、そちらの受験を検討している方のご参考になれば幸いです。

# Professional Google Workspace Administratorとは
Google Cloudの試験の中でも、Google Workspaceの管理・運用に関する能力を評価する試験です。
具体的に評価される能力については以下となっています。
※[公式サイト](https://cloud.google.com/learn/certification/google-workspace-administrator?hl=ja) より抜粋

- オブジェクトの管理
- サービスの構成
- トラブルシューティング
- データのアクセスと認証
- ビジネス イニシアチブのサポート

難易度としては、やや高めな印象したが、業務などでGoogle Workspaceの管理等を実施されている方は比較的容易に感じると思います。（私自身、Google Workspaceを扱う業務を実施していないため、各種機能、ツールのインプットから学習をはじめました。）

ただし、前述の通り、本試験は廃止が決まっており、2025年になると受験不可の試験となります。
Associate Google Workspace Administratorという別試験がβ版としてリリースされており、Google Workspaceに関する試験は、2025年以降はこの試験を受験することになります。
[Associate Google Workspace Administrator (coming soon)](https://cloud.google.com/certification/associate-google-workspace-administrator)

# 学習フロー
今回は以下のような学習フローで学習しました。

- [試験ガイド](https://services.google.com/fh/files/misc/professional_google_workspace_administrator_exam_guide_english.pdf?hl=ja) を確認する
- Udemyを受講し、Google Workspaceの基礎知識を身につける
  [Professional Google Workspace 認定試験が”ざっくり”「スッキリ」分かる講座　模擬(100)](https://www.udemy.com/course/pgw-professional-google-workspace/)
- G-genさんの対策ブログを見て、試験で問われるポイントを知る
  [Professional Google Workspace Administrator試験対策マニュアル](https://blog.g-gen.co.jp/entry/professional-collaboration-engineer)
  [Associate Google Workspace Administrator試験対策マニュアル](https://blog.g-gen.co.jp/entry/associate-google-workspace-administrator-exam)
- Udemy、G-genさんのブログを見て出てくるサービス、機能、ツールについて、公式ドキュメントを参照し理解を深める

普段業務でGoogle Workspaceを使用しない(できない)＆グループウェアに関する管理を行わないため、知識のインプットからはじめ、各サービスなどのユースケースを重点的に学習していきました。

また、お試しで、備忘録として他の記事に学習メモを残してみました。2025年にAssociate Google Workspace Administratorの受験にもチャレンジしてみようと思うので、私自身もその時読み返してみようと思います。

- https://qiita.com/ft510/items/1ebbdabfa5ca4b00581a
- https://qiita.com/ft510/items/b1a2851fe395e7512354
- https://qiita.com/ft510/items/3e848bd11563242a978d
- https://qiita.com/ft510/items/669c1c4ca3ad06b98e34

# まとめ
今回はProfessional Google Workspace Administratorについて書いてみました。
今後も精進していきます。
簡単な記事ではありますが、いつか、どなたかの参考になれば幸いです。