OmniAICreator/Qiita-1.07M huggingface dataset:
初歩的な状態管理プログラムについて

個人的に案件などでゲームやプログラムを作っていて基礎的な部分だが一番大事だなと思う部分が適切な状態管理です。
その状態管理について書いてみようと思います。

## 状態管理とは
大雑把に言えば
```
// ゲーム内全体のState管理用
enum GameState{
    タイトル,
    ゲーム,
    リザルト
}

// タイトル画面内のStateの管理用
enum TitleState{
    ロゴ,
    オープニングアニメーション,
    タイトルページ,
    モード選択画面,
    セーブ選択画面,
}
```
というようなもの

今回の例で言えば
GameStateはGame全体の状態の管理用で
TitleStateはタイトル画面での状態の管理用
という感じです。

## どう使うのか
Unityでの使い方にはなりますが
他言語でも似たようなものになると思います

```
var m_state = TitleState.ロゴ
var m_stockState = TitleState.ロゴ

// 毎フレームの処理
private void Update() {
    if(m_state != m_stockState){
        OnChangeState(m_state);
    }
    ~~ 各TitleStateでのフレーム毎処理

}

public void SetTitleState(TitleState s){
    m_state = s;
}

private void OnChangeState(TitleState s){
    ~~ 各TitleStateでの初期化処理

    m_stockState = s;
}
```

frameのupdateごとにStateの変化を取得する動作です
SetTitleState : 外部からStateを変更する場合のメソッド
OnChangeState : Stateが変化したときに各Stateごとの初期化処理をする部分

ちなみに　SetTitleStateでそのままOnChangeStateした方がm_stockStateの変数いらなくて便利！
という人も要ると思います。
今回のコードはUnityでの作成でのコード例で
`m_state`を`[SerializeField]`にして、インスペクターから変更した際にも反応できるようにした形になります。
ちなみにUniRxなどの反応型のフレームワークを使う場合や、`m_state`をPlay中に直接いじれないような環境は不要にはなると思います。

## なぜ使うのか
これによりStateごとの初期化処理と各Update時の処理の分けることができるのと
スクリプトを見たときにかなり分け方がわかりやすいものになります。
また、デバック時に該当のステートに変更するだけでそのステートだけのテストも楽にできるようになりテストの効率も上がります。

## 応用など
ゲームだけに限らずライブラリを作る際などにも状態を管理する場合によく使います
Stateでクラスが現在どのような状態になっていて、その状態の場合にどのような処理をするのかというのを目で見てすぐわかるような仕組みにするには便利なので覚えて損はないはずです。

例: フェードの状態を管理するスクリプトの状態管理
```
enum State
{
    Idle, // 透明状態
    FadeOut,
    FullScreen, // 全画面隠れた状態
    FadeIn, 
}
```
内部・外部ストレージをふんわり復習(Cドライブ・Dドライブも)

### ▼HDD（Hard Disk Drive）
ストレージの1つ。ディスク状でデータの記録する。
容量大きく単価が安い。
PCに内蔵されているストレージとして標準的な存在。
外付けHDDもあり。

#### ・Cドライブ：ローカルディスク(C:)
⇒PCに内蔵されているHDD。
OSやアプリケーションファイル入等の重要ファイルが入っている。
余裕持って容量を確保しておきたいので、なるべく余計なデータは入れない。
※容量に余裕が無い場合、システム動作に遅延やフリーズ等の不具合が発生するため
リカバリ(PC初期化)するとCドライブデータはすべて削除される。

#### ・Dドライブ：ローカルディスク(D:)
⇒PCに内蔵されているHDD。初期PC環境によって有無。
初期から存在しない場合や、CドライブとDドライブで分割（パーテーション）されて存在する場合がある。
ユーザーファイル関係（アプリで作成したファイルの保存先や個人作成したファイル等、またはバックアップ用）で使用するのに推奨。
通常、リカバリ実行してもDドライブの内容は削除されない。

※Aドライブ、Bドライブはフロッピーディスクドライブのディスクのため、現在使われていない。
はるか昔はデータ保存方法がハードディスクではなく、フロッピーディスクドライブでした。。

### ▼SSD(Solid State Drive)
データの「保存」が得意な記録デバイス。
USBと比べて、高価だが、耐久性高い、データ消えにくい、転送速度速い。
※SSDはパソコンに接続するとOSから、ローカルディスクとして認識される。

### ▼USBメモリ
データの「受け渡し」が得意な記録デバイス。
SSDと比べて、安価だが壊れやすい、転送速度遅い、故障しやすい。
※USBメモリはパソコンに接続するとOSから、リムーバブルディスクとして認識される。

### ▼リムーバブルディスク
取り外し可能な記録装置のこと。
例：USBメモリ、外付けHDD、SDカード

・removable＝取り外し可能な
・Disk＝記憶装置
中学英語レベルの純日本人理系大学生が、1ヶ月ちょいでAI駆使して卒論7割終わらせながらTOEIC 900超えた話

# はじめに
データサイエンティストを目指して日々勉強している、慶應大学理工学部4年生（2023.11.14時点）

取得資格、コンペ優勝経験など、リアルタイムの情報は👇👇👇をみてね

X: <a href='https://twitter.com/A7_data'>@A7_data</a>←こういう者です。
プロフィールページ👇👇👇

https://mohki7.notion.site/Mototsugu-Oki-c478f842c4de48f394e2e24b58e206bb

※全て、個人の意見です。個人差もあります。

# TOEICとは
TOEICは、Test of English for International Communicationの略で、非英語圏の人々がビジネスシーンで英語を使う能力を測るためのテスト。

リスニングとリーディングの2つのセクションで構成されており、それぞれ495点満点、合計990点が最高得点。

TOEICスコアは、企業の採用や昇進、学校の卒業要件など、多くの場面で英語力の指標として利用されている。

https://www.iibc-global.org/toeic.html

# TOEICを受けた理由
僕が目指している外資系企業も、TOEICの分布を見ると800以上しかいないとかのレベルで、僕は受けたことがなかったから（800以上取らないとまずいな）って思い、就活のために受験した。

けど、どうせやるなら中途半端に終わりたくないからキリよく900以上を目指した。スコア900以上を取っている人は、全受験生のうちの約4%。

英語の先生とか、帰国子女とか、YouTubeでよく見るTOEICガチ勢とかも含めて4%。ここに入れたらすごくない？？？って思って目指しちゃった。

https://www.iibc-global.org/toeic/official_data/lr/data_avelist.html

ちなみに、YouTubeで「理系大学生×TOEIC 900の価値」っていう動画見て、「え、これマジで取ったら俺、ChatGPTコンペも優勝して統計検定準1級も取って、データサイエンス、AI勉強して、めっちゃすごくね？」ってニヤニヤしてた。

https://youtu.be/k9cpszA6J_A

https://youtu.be/J-d0o78X6mM

理系大学生の皆さんはここら辺でモチベ高めてね

# 勉強開始時の英語レベル
TOEIC 900を1ヶ月で超えたって言ってるけど、「どうせ元々レベル高かったから1ヶ月でできたんでしょ」って思ったそこのあなた、違います。

**英語は苦手だと自覚してた。**

## 中学3年で英検2級落ちた
落ちました。なんか勘違いして受かったと思ってたけど落ちてた。

中学生で英検2級取ってたらまあちょっとすごいぐらいだと思うけど、落ちてます。

そのあとは高校に進学してなぜか上級クラスに配属され、3年間ネイティブレベルの先生の授業を受けた。英語でビートルズのこと習ったり、AIの思考実験の難しい議論したり、向こうの小説数冊読んだり、経済学を英語でやったり。

もちろん、3年間何言ってるかわからないまま終わったし、先生に当てられても「あっ、えっ、Ah,,,」で終わったし、期末テストは毎回平均-20〜10の間を右往左往してたし、英文法は一切習わなかった。

そんな感じで大学へ。（内部進学しました。なので、受験で英語やったというわけではないです。）

## TOEICスコア診断テスト
大学に来てからは1, 2年生で英語の授業があっただけで、そこからほぼノータッチ。

ぼちぼち、（就活で忙しくなる前にTOEIC取っておかないとなあ〜）って思ってて、気づいたら大学4年の9月になってた。（院進するから就活はM1の春から）

つまり、**英文法は中学レベルでストップしてた。**「前置詞って何？」「Whenの中って、なんか現在形にするんだっけ？」「仮定法って、とりあえずifの後過去形にするんよね」とかのレベル。

https://santa.alc.co.jp/

流石にまずい、と思って、まずはTOEICスコア診断テストを受けてみた。

結果は、Reading 400、Listening 290で合計690点レベルって言われた。

（え、意外に高くね？///）なんてなぜか自惚れた笑

まあ、何も対策なしでReading 400は割とすごいと思うけど、正直雰囲気で回答してまぐれ当たりが多かったから、実力は多分もっと下だった。

そんな感じでTOEICの勉強を開始した。

# ここから先はNoteに移行しました。
こちらからご覧ください。

https://note.com/a7_data/n/n4880a4e8e41c
AndroidStudio: Timber の使い方

ログ出力ライブラリー Timber の使い方です。

## 環境

```app/build.gradle.kts
（省略）
dependencies {
  implementation("com.jakewharton.timber:timber:5.0.1")
（省略）
```

## プログラム

```MainActivity.kt
package com.example.log02

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import timber.log.Timber

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)
Timber.plant(Timber.DebugTree())

        Timber.v("*** Verbose *** aaa ***")
        Timber.v("*** Verbose *** bbb ***")
        Timber.d("*** Debug *** aaa ***")
        Timber.d("*** Debug *** bbb ***")

        Timber.i("*** Info *** aaa ***")
        Timber.i("*** Info *** bbb ***")
        Timber.e("*** Error *** aaa ***")
        Timber.e("*** Error *** bbb ***")
        Timber.w("*** Warning *** aaa ***")
        Timber.w("*** Warning *** bbb ***")
    }
}
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/79a38637-1767-93be-cb5d-40e8ec69f2a0.png)

## 関連情報
[AndroidStudio: Timber でログ出力をファイルにする](https://qiita.com/ekzemplaro/items/c8e0493d9c94f21cc56e)
watchexec cliでファイルの変更に伴ってコマンドを実行する

https://watchexec.github.io/

https://github.com/watchexec/watchexec/

# インストール(apt)
aptでパッケージ管理をするlinuxを想定
適宜sudoを使ってください
その他のインストール方法については以下を参照

https://github.com/watchexec/watchexec/blob/main/doc/packages.md

```bash
curl -fsSL https://apt.cli.rs/pubkey.asc | tee -a /usr/share/keyrings/rust-tools.asc
curl -fsSL https://apt.cli.rs/rust-tools.list | tee /etc/apt/sources.list.d/rust-tools.list
apt update
apt install watchexec-cli
```

# 基本的な使い方
https://github.com/watchexec/watchexec/tree/main/crates/cli

1. js, css, htmlファイルが変更された際にmakeコマンドを実行する
```
watchexec --exts js,css,html make
```

2. カレントディレクトリとそのサブディレクトリに変更があった際ls -laコマンドを実行する
```
watchexec -- ls -la
```

# 想定されるユースケース
docker-compose.yamlに変更があった際にcompose upする
```
watchexec -w docker-compose.yaml docker compose up
```

requirements.txtに変更があった際、自動でインストールする
```
watchexec -w requirements.txt pip install -r requirements.txt
```

# ニッチな問題
WSL2, devcontainerで開発していると、ファイルシステムが影響してファイルの変更が検知されないのでポーリングを設定しておきましょう。
```
alias watchexec="watchexec --poll 100"
```
Azure AI Search(旧Cognitive Search) ベクトル クエリの python ライブラリバージョンアップ対応

# 背景
- Azure AI Search でベクトルクエリができる
- python で実行する場合、`azure-search-documents` ライブラリをバージョン指定してベータ版をインストールしていた
    - ドキュメントでも記載あり
    - https://learn.microsoft.com/ja-jp/azure/search/vector-search-how-to-query?tabs=python-vector-query%2Cfilter-2023-11-01
- b が取れた `11.4.0` がリリースされたので、ライブラリのバージョンアップや API の変更点に対応していく
    - https://pypi.org/project/azure-search-documents/11.4.0/

# ライブラリアップデート
- ライブラリをアンインストール
    - `pip uninstall azure-search-documents`
- バージョン指定してライブラリをインストール
    - `pip install azure-search-documents==11.4.0`

# プログラム修正
11.4.0 のインタフェースに合わせて修正する
参考までに過去バージョンサンプルも載せる
```python:11.4.0
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizedQuery
:
:
results = search_client.search(
    search_text=tmp_search_text,
    vector_queries=[
        VectorizedQuery(
            kind="vector", vector=tmp_vector, k_nearest_neighbors=3, fields="embedding"
        )
    ],
)
```

```python:11.4.0b08
from azure.search.documents import SearchClient
from azure.search.documents.models import Vector
:
:
results = search_client.search(
    search_text=tmp_search_text,
    vectors=[Vector(value=tmp_vector, k=3, fields="embedding")],
)
```

```python:11.4.0b06
from azure.search.documents import SearchClient
:
:
results = search_client.search(
    search_text=tmp_search_text,
    vector=tmp_vector,
    vector_fields="embedding",
    top_k=3)
```

# 参考
以下ソースの tag を切り替えるとインタフェースを確認できる
https://github.com/Azure/azure-sdk-for-python/blob/azure-search-documents_11.4.0/sdk/search/azure-search-documents/azure/search/documents/_search_client.py
dotnet CLIでNugetパッケージ追加時に出たエラーの対処

VSCodeでC#の開発環境を構築しようとしている際、dotnet CLIを用いてNugetパッケージの追加しようとしたのですがエラーが出たのでその時の対処内容のメモです。

OS：Windows10
利用SDK：.NET 7.0 SDK(v7.0.404)

# 症状

Nugetパッケージの[Azure.AI.OpenAI](https://www.nuget.org/packages/Azure.AI.OpenAI/#readme-body-tab)をインストールしようとして以下のコマンドを実行しました。

```powershell
dotnet add package Azure.AI.OpenAI --prerelease
```

すると以下のようなエラーが出力されました。

```
error: パッケージ 'Azure.AI.OpenAI' に使用できるバージョンがありません。
```

# 原因・解決方法

原因はdotnet CLIのパッケージソースにnuget.orgが登録されていないためでした。

以下を実行することでnuget.orgをNugetソースとして登録することができ、Azure.AI.OpenAIの追加コマンドが正常に実行できました。

```powershell
dotnet nuget add source https://api.nuget.org/v3/index.json -n nuget.org
```

参考：https://learn.microsoft.com/ja-jp/dotnet/core/tools/dotnet-nuget-add-source
【Git】特定のファイルだけ差分を取り消して元に戻したい場合

こんにちは、新卒のエンジニアです。

先日、プルリクエストのレビューで先輩から指摘されたコードを修正する時に役立ったことをメモ代わりに投稿しようとおもいます。

状況としては、複数コミットがあり、取り消しでは戻せない状態。また、戻したいファイルのコミットに他のファイルのコミットも含まれている状態の時に必要になるかと思います。

> 私の場合は、APIのコードを実装しており、実装に直接関係Visual Studioのソリューションファイル(.sln)にバージョンアップの差分がありコミットしてしまった。

## 手順

1. まず、元に戻したいコミットのハッシュを見つけます。`git log` コマンドを使用して、コミットのハッシュを見つけることができます。

2. 次に、`git checkout` コマンドを使用して、元に戻したいコミットハッシュからファイルをチェックアウトします。たとえば、コミット `abc123` で `file.txt` に行われた変更を元に戻したい場合は、次のコマンドを使用します。

   ```
   git checkout abc123 -- file.txt
   ```

   これにより、`file.txt` のバージョンがコミット `abc123` からチェックアウトされ、現在のファイルのバージョンが上書きされます。

3. 最後に、`git commit` コマンドを使用して変更をコミットします。次のコマンドを使用して、元に戻した変更を含む新しいコミットを作成できます。

   ```
   git commit -m "Revert changes made to file.txt in commit abc123"
   ```

   これにより、元に戻した変更を含む新しいコミットが作成されます。
盗まれても安心（？）Android端末管理（前編）

後編：

## 最近のお話
いつものようにゴロゴロしながらX(旧twitter)を眺めていると[「デモに紛れて強奪が発生。Apple Storeが襲撃された」](https://news.tv-asahi.co.jp/news_international/articles/000317657.html)というセンセーショナルな記事が目につきました。
しかしながら自分の居住地は日本。対岸の火事よろしく「大変そうだなぁ」なんて思っていたところ
続報で[「強奪されたiPhoneは遠隔操作ができるようになっている」](https://front-row.jp/_ct/17367545)との情報が目に飛び込んできました。

日本でも物騒なニュースが見られる昨今。
いつ何時、暴力が支配する弱肉強食の世界へと変貌するやもしれません。
ヒャッハーと言いながらスマホを強奪していくモヒカン頭が現れる可能性もあります。
そんな時 **「盗られても安心。そうiPhoneならね」** と、Apple最強卍みたいになるのは避けなければなりません（Android狂信者）

というわけで、 <INS>**Androidでも同じようなの作れるんだぞ！実際に作ってみよう!** </INS>というのが今回のコンセプトになります。


## 仕様を考えるフェーズ
### 挙動の確認
ひとまずなんとなく調べたところ、盗まれたiPhoneは以下のような挙動をしていることが分かりました
* 店舗から離れるとロックされる
* ロック後インカメラで撮影（動画？）が行われる
* 撮影と同時にアラートが鳴る

この挙動をもとに、もっと仕様を考えていきましょう

### 技術的なところ

* 店舗から離れるとロックされる ＆ アラートが鳴る

これは、おそらく[ここ](https://support.apple.com/ja-jp/guide/deployment/depb980a0be4/web)とか[ここらへん](https://support.apple.com/ja-jp/guide/deployment/depb980a0be4/web)のことをしてるんだと思います。デバイスを監視対象モードにしといて、GPSが離れたら紛失モードにするって感じかな？
自分の記憶が正しければ、SIMなしだとこいつ動いてくれなかったような気がするのでSIM入ってるんですかね（自信なし）。自分の浅学がガガガ
位置情報もちゃんと取ってそうですね

* ロック後インカメラで撮影

これ知らない子でした
もう完全に店頭のものが盗まれたとき用ですよね。Appleの **許さん…** って気持ちが伝わってきます

[ドキュメント](https://support.apple.com/ja-jp/guide/deployment/dep739685973/web)見ると
> カメラの使用
> この制限は監視対象ではないiPhoneおよびiPadデバイスでは非推奨です。今後のリリースでのみ監視対象になります。

こんな感じらしいです


### 仕様
なんとなく言葉でまとめて

* 店舗から離れるとロックされる
    * GPSで位置情報を取って、指定の場所から10m程度離れたらロック
* 撮影と同時にアラートが鳴る
    * 指定の場所から10m程度離れたらアラート
    * 鳴る時間は作りながら検討（最良はずっと鳴る）
* ロック後インカメラで撮影（動画？）が行われる
    * 動画を撮影してローカル保存

こんな感じの仕様となりました
動画をサーバに保存もやってみたかったんですが、時間的制約と自分の知識量的なところできつそうなので、今回はローカル保存を目指します


## つくるぞー
Android Management API（以下AMAPI）を使って作っていきます
ブログのネタを考えたときはAMAPIの紛失モードで行けるんじゃないかなと思ってたけど調べてみたらカメラの起動はダメっぽい？
（想定外だった…勉強になりました）

https://developers.google.com/android/management/lost-mode?hl=ja

なので、仕様の機能を持ったアプリを作成して、キオスクモードで固定でいきます！
もっといいやり方もありそうだけど、今回はこれで作っていきます


### 専用端末の設定とか
今回は前述したようにAMAPIを用いて専用端末化します
AMAPIではポリシーというのを作って端末に適用することで、機能の制限やアプリのインストールなどを行います。



https://zenn.dev/yusukeiwaki/articles/b8fb86d5790df9


https://developers.google.com/android/management/quickstart?hl=ja


AMAPIのQickStratと上記のブログを参考に作っていきます

https://console.cloud.google.com/project

GoogleCloudからプロジェクトを作って、Android Management API（以下AMAPI）を有効にします
プロジェクト名は好きなもので大丈夫です
（MDM全然できないのと、オレオレを合わせてore-no-mdmにしときました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2699725/94ec9eac-87c4-f0a9-32df-5bb29d0315ca.png)

次は認証情報を登録します
今回はお試しで１台しか登録するつもりがないので簡単なOuth2で認証とします

https://colab.research.google.com/github/google/android-management-api-samples/blob/master/notebooks/quickstart.ipynb?hl=ja

Outh2の認証についてはQickStratのcolaboにのっとって進めていく…

んですがちょっと長くなりすぎたので、ポリシー作成とアプリつくりは次のブログで書いていきます

----
後編：
【Ruby on rails】Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)　エラー対処法

# はじめに
プログラミングを勉強して3か月ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

今回は私がPCを再起動したときに起こるエラーの対処法について共有させていただきます。
下記の記事を参考にさせていただきました。

https://medium.com/wado-jp/%E3%82%88%E3%81%8F%E3%81%82%E3%82%8Bmysql%E3%82%A8%E3%83%A9%E3%83%BC%E9%9B%86-a6dc33e77a9a

# 今回のエラー内容
今回のエラーはPC再起動時に「MySQLにサーバーが接続できません」という内容のエラーです。
[![Image from Gyazo](https://i.gyazo.com/045c5f8c90dd44a02541384f9d790517.png)](https://gyazo.com/045c5f8c90dd44a02541384f9d790517)

# エラー対処法
まずターミナルでtmpディレクトリに移動します。
`cd /tmp`
次にlsコマンドでファイルを一覧表示します。
`ls`
その中にmysql.sockがなければ作成します。
`touch mysql.sock`
最後にMySQLに接続します。
`mysql.server start`

# 終わりに
今回はMySQLのエラー対処法について共有させていただきました。
エラー原因についても調査していきたいと思います。
この記事が誰かの役に立てば幸いです。

最後まで読んでいただきありがとうございました！！！
PMBOK学習記

# 趣旨

PMBOKについて、自身で記してみることで理解を深める

# PMBOKとは？

- PMIが作成しているプロジェクトマネジメント知識体系
- デファクトスタンダード

## 第7版

- 750ページ → 250ページ
- 10の知識エリア　→ 8の活動領域
- 5つのプロセス → 12の原理原則
- 対象読者：プロジェクト・マネージャー → プロジェクトに関わる全ての人
- 割愛された内容は PMIstandards+ に掲載されている

### 主な変更点

- 成果物ではなく、結果の価値を重要視
- プロセスベースから原理原則ベース
- テーラーリングを重要視
    - 継続的に改善を実施する

:::note info
常に最適を模索し続けることが重要
:::

# 用語

## プロジェクト

**独自** のプロダクト、サービス、所産を創造するために実施する **有期** 的な業務 ≠ 定常業務

## 成果物

プロジェクトで作成するプロダクト、サービス、所産

## 目的

「何のために実施するのか」を明記したもの

:::note
「アプリを完成させること」ではなく「アプリが顧客にもたらす価値」に焦点をあてる
:::


## 目標

目標達成の道程における具体的な評価指標

## 成功、失敗の判断基準

合意された制約条件を満たした上で目標を達成できたか？

### 代表的な制約条件

- 品質 Q
- コスト C
- 納期 D

## プロジェクト・オーナー (PO)　または スポンサー

- プロジェクトの資金や資源などを確保・提供する人または組織
- プロジェクト予算に責任を持つ人

## プロジェクト・マネージャー (PM)

- プロジェクトの目標達成に責任を持つ人
- 権限は組織によって異なる
    - プロジェクト型組織：要因・資源の調達、予算内での決済
    - 機能型組織（事業部制)：権限は限定的
    - マトリックス型組織：制限があるもののある程度の権限

## プロジェクトマネジメント・オフィス (PMO)

複数プロジェクト間の調整やプロジェクトのマネジメントを支援する組織

## プロジェクトマネジメント・チーム

- PM
- サブ・マネージャー
- PMO

## プロジェクト・チーム・メンバー

- 設計者
- プログラマー

## プロジェクト・チーム

- プロジェクトマネジメント・チーム
- プロジェクト・チーム・メンバー

## ステークホルダー

プロジェクトの意思決定、活動または成果に、影響を及ぼしたり、影響を及ぼされたりする人や組織

# プロジェクトマネジメント

プロジェクト要求事項を満たすために、知識、スキル、ツールと技法をプロジェクト活動へ適用すること

# プロジェクトマネジメント12の原理原則

1. 価値
1. 品質
1. ステークホルダー
1. 変革
1. チーム
1. リーダーシップ
1. 複雑さ
1. リスク
1. システム思考
1. テーラーリング
1. スチュワードシップ
1. 適応力と回復力
カラー液晶ILI9341のまとめ



![o_cop482.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ba3a2fdf-a65d-9fde-1144-9cdbb563fa21.jpeg)



https://qiita.com/caa45040/items/3c57c159be0fd0f7a718


https://qiita.com/caa45040/items/544fd9928309e7b6ed94



------------------------------------------


https://qiita.com/caa45040/items/208431c5aca51ae58935


https://qiita.com/caa45040/items/be6e185cab2b3ed72ce3


https://qiita.com/caa45040/items/6efb9f87e59300463383


https://qiita.com/caa45040/items/e6e6ced4ca83833be4c1


https://qiita.com/caa45040/items/7bd318d940bb310e3eeb


https://qiita.com/caa45040/items/a8c3f2957a0d255c18ec


https://qiita.com/caa45040/items/d4929d28d6962cb5422b


https://qiita.com/caa45040/items/219ee49f5cbc84ff80ac


https://qiita.com/caa45040/items/aa4ca2a54abd4156b88d


https://qiita.com/caa45040/items/060d0715ad7aab6f3387
useEffectの依存配列の使い分けについて

## 概要
React Hooksの一つである useEffect は、副作用（データの取得、購読や手動でのDOMの変更など）を実行するためのHookです。この記事では、useEffect の依存配列の使い分けについて詳しく説明します。

## 基本的な使い方
まずは、useEffect の基本的な使い方から見てみましょう。

```ts
"use client";
import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```
上記のコードでは、ボタンをクリックする度に count ステートが更新され、その結果として useEffect がトリガーされます。そして、document.title が更新されます。つまり、全てのレンダリング後にトリガーされます。

### 特定の値が変化したときだけトリガーしたい
しかし、全てのレンダリング後に副作用を実行したくない場合はどうすれば良いでしょうか？ここで useEffect の第二引数、依存配列が役立ちます。

```ts
"use client";
import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  }, [count]); // この行に注目

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```

上記のコードでは、useEffect の第二引数として [count] を指定しています。これは、count ステートが変更された時だけ useEffect 内の副作用を実行することを意味します。

### 初回レンダリング時だけトリガーしたい
useEffect 内の副作用はコンポーネントがマウントされた時（初回レンダリング時）だけ実行されます。これは、特定の処理をコンポーネントが画面に最初に表示された時だけ行いたい場合に有用です。

例えば、データのフェッチなどは通常、コンポーネントがマウントされた時に一度だけ行います。

```ts
"use client";
import React, { useState, useEffect } from 'react';

function Example() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('/api/data')
      .then(response => response.json())
      .then(data => setData(data));
  }, []); // この行に注目

  return (
    <div>
      {data ? `Fetched data: ${data}` : 'Fetching data...'}
    </div>
  );
}
```

上記のコードでは、useEffect の第二引数として [] を指定しています。これは、コンポーネントがマウントされた時だけ /api/data からデータをフェッチすることを意味します。

## まとめ
依存配列を使うことで、特定のステートやプロップスの変更時だけ副作用を実行することができます。これにより、不要な副作用の実行を防ぎ、パフォーマンスを向上させることが可能です。

## 備考
この記事はお試しで7割くらいGPT4によって書かれています
UbuntuでWi-Fi子機を利用する方法

# はじめに
本記事では、**スタンドアロンのUbuntuPCにWi-Fi子機のドライバをインストールして利用する方法**を紹介します。何らかの理由でPCに有線LAN接続ができず、またWi-Fiも未搭載の場合にご参照ください。

有線LANでの接続が可能、またはPCにWi-Fiが搭載されている場合は、[参考URLの記事](https://tech.nosuz.jp/post/2021-09/ubuntu_wifi/)をご参照いただく方が簡単かと思います。


# 前提条件
以下の機器をご準備ください。
* スタンドアロンのUbuntuPC
* Wi-Fi子機
* USBメモリ等の外部記録媒体
* ネットワーク接続可能なPC


# 手順
### 1. ドライバのダウンロード
ネットワーク接続可能なPCで、[GitHub](https://github.com/RinCat/RTL88x2BU-Linux-Driver)からドライバをダウンロードします。
対応するWi-Fi子機の記載はページ中段の「Supported Devices」にあるのでご確認ください。
ダウンロード方法は、下図赤枠を「Code」「Download ZIP」の順にクリックします。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3585135/358a7864-dbf3-6bee-e8af-6f2a7e7e321e.png)

### 2. スタンドアロンPCへドライバを保存
ダウンロードしたZipファイルを、外部記録媒体経由でスタンドアロンPCに移動します。

### 3. ドライバのインストール
以下のコマンドをスタンドアロンPCで実行します。
デスクトップ直下にZipファイルを保存した場合で記載しています。
再起動後、Wi-Fi子機が自動的に接続されます。

```
$ cd Desktop
$ unzip RTL88x2BU-Linux-Driver-master.zip
$ cd RTL88x2BU-Linux-Driver-master
$ sudo make uninstall
$ make clean
$ make
$ sudo make install
$ sudo modprobe 88x2bu
$ sudo reboot
```


# 参考URL
以下の記事を参考にしました。

https://araki.tech/tips/article_1148/#%E5%8F%82%E8%80%83

有線LANでの接続が可能、またはPCにWi-Fiが搭載されている場合は、以下の記事をご参考ください。

https://tech.nosuz.jp/post/2021-09/ubuntu_wifi/
直角三角形の出力 (paizaランク D 相当)

今日の問題はこれ。
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__variable_array_step3

出力された数字に従って下記の様に出力する問題
たとえば４だったら
1
1 2
1 2 3
1 2 3 4
というふうに出力する。
これが直角三角形に見えるように出力するという意味

今までの積み重ねから、難しくはなかった

```py
N = int(input())

for i in range(1,N+1):
    for j in range(1,i+1):
        if j == i:
            print(j)
        else:
            print(j,end=" ")
```
GPSの取得データと測位原理についてのまとめ

## 前回の続き
1つ前の記事では、GPSのデータをラズパイ(Raspberry pi)で取得して保存するプログラムを作成しました。

https://qiita.com/umashikate/items/843a2c018202c9388d0c

取得したデータには
1. $GPGGA
2. $GPGLL
3. $GPGSA
4. $GPGSV
5. $GPRMC
6. $GPVTG
7. $GPZDA

がありました。

これらは、<font color="red">NMEA 0183</font>と呼ばれる標準的な形式のGPSデータセンテンスで、GPSレシーバーやその他の位置情報を提供するセンサーからのデータを標準的なフォーマットで伝達するために使用されています。少し調べてみました。
&emsp;

## NMEA 0183 形式のGPSデータセンテンス

1. **$GPGGA (Global Positioning System Fix Data):**
   - GPSの基本的な位置情報
   - 受信機の日付、時刻、緯度、経度、修正情報などが含まれます。
&emsp;
2. **$GPGLL (Geographic Position - Latitude/Longitude):**
   - 緯度と経度の情報
   - 緯度、経度、およびUTC（協定世界時）時刻が含まれます。
&emsp;
3. **$GPGSA (GPS DOP and Active Satellites):**
   - 使用中の衛星と、位置の精度を示すDilution of Precision（DOP）情報
   - 使用中の衛星番号、PDOP、HDOP、VDOPなどが含まれます。
&emsp;
4. **$GPGSV (GPS Satellites in View):**
   - 受信機が視野に入れることができる全てのGPS衛星の情報
   - 衛星の数、PRN番号（識別番号）、仰角、方位、信号強度などが含まれます。
&emsp;
5. **$GPRMC (Recommended Minimum Specific GPS/Transit Data):**
   - 推奨される最小限のGPSデータ
   - 位置のステータス、UTC時刻、緯度、経度、地上速度、進行方向などが含まれます。
&emsp;
6. **$GPVTG (Track Made Good and Ground Speed):**
   - 地上速度と進行方向の情報
   - 進行方向、地上速度、真北からの進行方向などが含まれます。
&emsp;
7. **$GPZDA (Time and Date):**
   - UTC日付と時刻の情報
   - 年、月、日、UTC時刻、時刻調整などが含まれます。
&emsp;

NMEA 0183プロトコルをサポートするほとんどのGPSレシーバーやGNSS（Global Navigation Satellite System）受信機から得られる一般的なデータです。アプリケーションやデバイスがこれらのデータを解釈できれば、位置情報やタイミング情報などのGPSデータを取得することができます。

## GPSの測位方法ってどうなっているのか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/1f3db903-7a4a-c96e-31bd-e44bf17254a7.png)

GPS（Global Positioning System）は、人工衛星の信号を使用して、地球上の位置を特定するための測位システムで、GPS測位は受信機が複数のGPS衛星からの信号を受信し、それらの信号を解析することによって行われています。

### 基本的なGPS測位の手順

1. **GPS衛星信号の受信:**
2. **受信機位置の計算:**
3. **位置の交点の計算:**
4. **高度の計算:**
5. **補正と改善:**
6. **最終位置の表示:**

GPS測位は、非常に正確で広範な用途に利用されています。ただし、建物や樹木などの遮蔽物が多い環境では、GPS信号の受信が妨げられる可能性があるため、これらの状況では補助的な位置情報や他の測位技術が使用されることがあります。
&emsp;

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/d9d88e44-96e1-808b-a163-81e4105056b5.png)

地上の受信機に内蔵された時計が正確である場合、3つの人工衛星からの信号を利用して位置を特定できます。ただし、受信機の時計にはわずかな誤差があるため、より正確な時刻情報が必要な場合には、さらに1機の追加の人工衛星の情報が必要です。
&emsp;

### GPSにおける人工衛星との距離計算
人工衛星との距離は、電波の伝播時間によって計算されます。

GPS（Global Positioning System）において、人工衛星との距離は電波の伝播時間を基に計算されます。

```math
\text{距離} = \text{電波の伝播時間} \times \text{電波の速度}
```

ここで、電波の速度は約 \(299,792,458\) メートル/秒（光速）です。電波の伝播時間は、GPS受信機が人工衛星からの信号を受け取るまでの時間と、その信号が受信機に戻るまでの時間の合計です。
&emsp;

この合計時間を2で割ることで、一方向の伝播時間が得られ、それを電波の速度で乗算することで、人工衛星との距離が求められます。

```math
\text{伝播時間} = \frac{\text{受信までの時間 + 戻りの時間}}{2}
```
Bootstrap備忘録～グリッド～

# はじめに
仕事でBootstrapを使う機会があったので、備忘録としてまとめました。
あくまでも自分用。間違い等あればご指摘ください:bow:

# Bootstrapとは
HTML、CSS、JaveScriptなどが組み込まれたフレームワーク。
ボタンや入力フォームなどのデザインがあらかじめ用意されているため、手軽にWEBページのデザインができる。

公式ドキュメント

https://getbootstrap.jp/docs/5.3/getting-started/introduction/


# グリッドシステムとは
デバイスの画面を縦に12分割して管理する仕組み。
グリッドシステムを利用することで、異なるデバイスからアクセスしても崩れないレイアウトで作成できる。
**container**、**row**、**col**という要素を用いて設定する。

container：一番外枠の部分。この中を12分割することができる。
row：分割する行を選択する。
col：分割する幅を選択する。

イメージはこんな感じ。
![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519886/44e8d30d-222f-cd24-9ac2-c416efa56130.jpeg)



#### 書き方
まずはcontainerを用意する。
```html:
<div class="container">
</div>
```
この中にrowを入れる。
```html:
<div class="container">
 <div class="row">
 </div>
</div>
```
さらにその中に分割したい分だけcolを入れる。

colに何も設定しないと、均等に分割される。
以下の例では均等に3分割される。
```html:
<div class="container">
 <div class="row">
   <div class="col">
   　分割１
   </div>
   <div class="col">
   　分割２
   </div>
   <div class="col">
   　分割３
   </div>
 </div>
 ```
colに大きさを設定すると、自由な大きさに分割することができる。
以下の例では左が小さく、右が大きく分割される。
```html:
<div class="container">
 <div class="row">
   <div class="col-5">
   　左が小さい
   </div>
   <div class="col-7">
   　右が大きい
   </div>
 </div>
 ```

# 実例
#### コーディング例
先ほどの例を元に作成した。
rowを複数指定しているため、行ごとに異なる分割が実現できている。
```html:
<div class="container">
  <div class="row"><!--等分-->
    <div class="col bg-primary text-center">
      <img src="フルーツサンド.png">
    </div>
    <div class="col bg-success text-center">
      <img src="亀パン.png">
    </div>
    <div class="col bg-warning text-center">
      <img src="シナモンロール.png">
    </div>
  </div>
  <div class="row"><!--左を小さく-->
    <div class="col-5 bg-primary text-center">
      <img src="フルーツサンド.png">
    </div>
    <div class="col-7 bg-success text-center">
      <img src="亀パン.png">
    </div>
  </div>
</div>
```

#### 画面イメージ
実際の画面は以下の通り。
![Web キャプチャ_15-11-2023_222618_.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519886/0e7f14b3-d2ac-10d8-7939-7966414b3df3.jpeg)


# 参考サイト
[Bootstrapのグリッドシステムの概要](https://qiita.com/blue_camel/items/7e554a448b39f3641caf)
[Bootstrapのグリッドを理解する【図解たっぷりBootstrap入門】](https://skillhub.jp/courses/168/lessons/915)
NRQL で日時をフォーマットする

# 動機
NewRelic の Issue 情報 (`NrAiIssue`) を NRQL で SELECT しようとして思った。

俺は生粋の日本人だから `November` とか言われても、瞬時に「ああ 11 月ね」とはならん！
あと `November 16, 2023` の月・日・年という並び順も地味にキショいんじゃい！

# NRQL で頑張る
dateFormat 的な関数は無いのか！？
しゃーない。有り物で頑張ろ・・・

```sql
FROM NrAiIssue
SELECT
  concat(
    yearOf(timestamp), '-',
    monthOf(timestamp, `numeric`), '-',
    dayOfMonthOf(timestamp), ' ',
    hourOf(timestamp, `numeric`), ':',
    minuteOf(timestamp, `numeric`), ':',
    mod(timestamp / 1000, 60)
  ) as `datetime`,
  getfield(entity.names, 0) as `entity_name`,
  title,
  issueLink
WHERE
  event not in ('acknowledge', 'close')
  and contains(entity.names, 'MY-SERVICE-X')
WITH TIMEZONE 'Asia/Tokyo'
```

ポイントは
- `secondOf` が無いので剰余で算出
- TIMEZONE を指定する　(指定しないと UTC になる)
  - https://docs.newrelic.com/jp/docs/query-your-data/nrql-new-relic-query-language/get-started/nrql-syntax-clauses-functions/#sel-timezone
  > タイムゾーンが指定されていない場合、デフォルトのタイムゾーンは常にUTCです。結果の生のタイムスタンプ値（JSONビューで表示）は常にUTCです。UIには、アカウント設定で指定したタイムゾーンで結果が表示されます。タイムスタンプ文字列のタイムゾーンは常に機能します。これは、WITH TIMEZONEゾーンより優先されます。

# あとがき
むしゃくしゃしてやった、後悔はしていない。
tmuxでSSHの接続が切れてもコマンドを実行し続ける方法


```
# 名前付きセッションの作成
tmux new-session -s hogehoge

# セッションからの離脱
Control + b

# 実行中のコマンドのプロセスを見る
ps aux | grep sleep

# セッションの一覧を表示する
tmux ls

# セッションにアタッチする
tmux attach -t hogehoge
Cloud Functionsのデプロイ時に色々はまった

この記事は [ここのえ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/99no_exit) Day 14 の記事です。

# Cloud Functionsのここに気を付けよう 2023

[Advent Calendar](https://qiita.com/advent-calendar/2023/99no_exit) の11日目の記事でも書いたのですが、ちょっと前にGCPのCloud Functionsを使い始めました。

前回は無料枠周りで引っかかった話だったのですが、それ以外にも細々としたところで悩んだ箇所があったので、その辺の情報の共有です。

# Cloud Functionsで.gcloudignoreを作るときの注意

GCPには `.gcloudignore` というignoreファイルを書くと、デプロイ時に無視してくれるという特徴があります。

https://cloud.google.com/sdk/gcloud/reference/topic/gcloudignore

Cloud Functionsのデプロイで、バンドルをデプロイしようとすると対象ファイルはごく一部だけなので、こんな感じの `.gcloudignore` を書きます。

```.gcloudignore
*
!dist
!package.json
```

package.jsonでは`"main": "dist/index.js"` を書いているので、本来であればこれは動くはずなのですが、実際には **正常にデータをデプロイできず、ビルドが失敗** します。

これについてはStackOverFlowに投稿があります。

https://stackoverflow.com/questions/52976199/gcloudignore-doesnt-allow-standard-wildcard-whitelist

実はCloud FunctionsとApp Engineなどで `.gcloudignore` の実装が違う(?)のか、Cloud Functionsの時だけ「カレントディレクトリそのものを無視する」という謎の挙動になり、`*` を入れると想定外の挙動が起き、正常にデプロイされないのでCloud Buildが走らなくなるようです。

一番無難なのは、素直にignoreしていくことです…

```.gcloudignore
.idea
.parcel-cache
node_modules
src
.env
.eslintrc.cjs
.gitignore
tsconfig.json
```

# gcp-buildに空の値は入れられない

今回の環境ではローカルでビルドしたものをデプロイするようにしたので、クラウド上でTypescriptのビルドや、ESLintを走らせたくありませんでした。
また`depDependencies` に入れてあるので、GCP上でビルドが走ったらパッケージ不足でビルドがコケてしまいます。これを回避しようとします。

ドキュメントを見ると、以下のように記載されています。

https://cloud.google.com/functions/docs/concepts/nodejs-runtime?hl=ja

> デフォルトでは、package.json で build スクリプトが検出されると、Node.js ランタイムによって npm run build が実行されます。アプリケーションを開始する前にビルドステップをさらに制御する必要がある場合は、gcp-build スクリプトを package.json ファイルに追加することで、カスタム ビルドステップを提供できます。
>
> 次のいずれかの方法で、ビルドで npm run build スクリプトが実行されないようにすることができます。
>
> - package.json ファイルに "gcp-build":"" という値を持つ gcp-build スクリプトを追加します。

そこで `package.json` をこうします。

```package.json
"scripts": {
  ...
  "build": "parcel build --no-source-maps",
  "gcp-build": ""
},
```

そうするとこうなります。

```bash
error An unexpected error occurred: "Script must exist".
```

実は **空の `gcp-build` を作るというのは罠** で、これを消しても特に問題ありませんでした。

ビルド時のログに特にエラーが出ていないので、`build`が走ったような感じもしません（ParcelもdevDependenciesなのでインストールされないはずです。またsrcもデプロイしてないですし、万が一parcelが動いてもコケるはずです）。

邪推ですが、Cloud Functionsでのビルド処理は`build`を見ずに `gcp-build` を呼び出すように変わったのでしょうか？

いずれにせよ真相は闇の中です……

# まとめ

自分がGCP慣れしていないのもそうですが、さすがにドキュメントの通りやったら足をすくわれるのは勘弁してくれ～って感じです。

GCPといいAWSといい、実際に触ってないとわからない知見が多すぎるので、使いこなすのはまさに職人技ですね……

クラウドの道は一日にしてならず、ってコト！？

# 参考

- .gcloudignoreのやつ

めちゃくちゃ困っている時にこの記事のコメントに助けられました。本当にありがとうございました🙇

https://zenn.dev/satohjohn/articles/11df180df878ac

- `gcp-build` の罠

https://cloud.google.com/functions/docs/concepts/nodejs-runtime
Dockerでsudoがないとき


# 起こったこと

Docker に vim をインストールしたかったが，sudo がないと怒られた．
未来の自分の備忘録として残しておく．

```bash
$ sudo apt-get install vim
bash: sudo: command not found
```

# 解決策

sudo をインストールする．

```bash
$ apt-get update
$ apt-get install sudo
```

これで無事に sudo が使えるようになり，vim をインストールすることができた．

# 参考

https://qiita.com/TakuyaMiyashita/items/46542a2b94f86a7bc740
【Google Cloud Next Tokyo ’23レポート】DAY2 これからはじめる Vertex AI Codey と Duet AI の アプリ開発

# 講演概要
生成 AI の波に乗り遅れている開発者向けに、Vertex AI Codey や Duet AI for Workstations といった開発者向けサービスはどのような特徴があって、どういう場面で活用すれば良いのかイチから解説します。

セッション レベル：初級
取り上げる主な Google Cloud 製品 / サービス
Vertex AI
Vertex AI Generative AI Studio

https://cloudonair.withgoogle.com/events/next-tokyo?talk=d2-app-01

# 所感
一通りCordyを使っていくための情報を得られて、まずは使ってみようかなと思える内容でとても有意義でした。
また、プロンプトデザインについてはCordyだけでなく全ての生成AIで使える内容でした。

普段使っているCopilotと比較すると日本語対応がより良くできていそうという印象。
また、BiqQueryへの対応はGoogleならではでした。

状況に応じてコーディング支援のAIを使い分けられるようにまずは比較をしてみる必要ありそうです。

# セッションメモ

## 開発を支援する生成AIサービス
Vertex and Duet AIはエンタープライズ向けのユースケースに対応している
Codeyはコーディング向けのモデルをAIで提供し、Deute AIはそのAPIを使ってAIによるアシストを提供する

## 生成AIの基礎知識
LLM（膨大なデータセットでトレーニングされた言語モデルのこと、自然言語を生成、理解することが目的）
PaLM2（Googleが開発したLLMの１つ。特長：多言語対応、推論、コーディング）
PaLMのモデル（ユースケースとモデルサイズによって分かれる。Gecko、Ottter、Bison、Unicornとモデルサイズが大きくなる）

## Vertext AI Codey
PaLMをコーディング向けにカスタマイズしている
コード生成、会話型チャットbot、コード補完などを提供
BiqQueryの生成もできる

###　設定
温度（低いと確定的で自由度が低くなり、高いと多様で創造的な結果を生成する）
Max Output Token（生成するトークンの最大数）

### モデルのファインチューニング（微調整）
自社の環境に合わせてコードを応答できるように調整する

## Duet AI in Google Cloud
IDEに統合された形でAIアシストを利用可能
VSCodeで拡張機能（Google Cloud Code）あり
生成、補完、説明、テストコード生成、チャットでの質問、

## プロンプトデザイン
曖昧な指示ではなく、より明確に指示をすることが大切（状況や役割をしっかり与える）
トークン数が少なくなるようなプロンプトをデザインするとコスト効率が良い
命令、コンテキスト、入力データ、出力形式といった要素を含めると良い

# 資料リンク
Microsoft Fabric の停止/再開/SKU変更をスケジューリングする

## はじめに

GAしたということで、この辺のオートメーションが必要になると思い、APIを確認し、ロジックアプリのデプロイテンプレートを作りました

※利用APIについてはPortal操作から解析したもののため、現時点ではdocsの公開情報も見つけられなかったので、変更の可能性があります。

## 注意事項

2024/4/15追記
以下の記載より、停止すると停止した時点で、本来時間をかけて完済されるはずの平滑化CUや超過分のCUは一気に請求に回る記述があるので停止処理の実行は注意してください

https://blog.fabric.microsoft.com/ja-JP/blog/capacity-platform-updates-for-pause-resume-and-capacity-metrics-for-copilot-and-vnet-gateways/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2123a006-8830-d7e9-4b32-56a37ccf6243.png)


### 関連記事

https://qiita.com/ryoma-nagata/items/210d5ec61cbb7037bb74

## 手順

1. 以下のリポジトリのデプロイボタンを押します。入力パラメータはパラメータ横のiマークから確認してください
https://github.com/ryoma-nagata/FabricAutomation/blob/main/README.md
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3afbdc15-0619-9892-1f58-798efc695776.png)  　　
　　
なお、ロジックアプリは有効済みの状態でデプロイされます。
　　
2. ロジックアプリに権限を振ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/11b2da1d-2d07-514f-ef8e-0862ad3de636.png)


3. 必要に応じて実行のタイミングを調整してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/29026833-2c4e-799a-88ca-022948b9c5f7.png)

## 結果

トリガー実行などで確認するとこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/c1c78595-2b8b-a79c-57e3-7e4ab5fdaf14.png)

アクティブになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/a4896999-4763-2c20-ef01-a2aacf12e6fc.png)
Azure OpenAI GPTを利用したSlack ChatBotをCloud runで作った話し

# 概要
普段プログラミングをしないインフラメインのエンジニアが社内で業務利用できる生成AIchatbotをAzureとGCP、Slackを連携させて作って導入した話しです。

こんなやつ
![スクリーンショット 2023-11-16 11.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/79a2a1ce-c529-f3ce-44dd-08e32442a636.png)

# 開発の目的
- Chatgptから乗り換えたい
    - 学習のオプトアウトは申請できるとはいえ、保証はない(開発当時はその辺りが不透明だった)
    - 使い方によっては社内情報が漏洩する可能性がある
    - MicrosoftのAzure自体は一部サービスで利用実績があり、日本リージョンがある
    - Azure OpenAIであれば自分のAzureリソース内でしか学習されないことが明言されている
    - gpt-4を含め気兼ねなく業務でAIを使いたい
- 新技術へのチャレンジとノウハウの取得
    - 最先端の人工知能技術を活用してAIの応用に関する知識やスキルを向上させていきたい
    - ゆくゆくは社内情報を学習データとして投入していきたい
      - githubレポジトリの内容を食わせたり出来るとリファクタなども楽に
      - 情報システム周りの問い合わせ自動化
      - 事務手続き自動化
    - ...etc


# 主な仕様
- pythonのslack_boltで作成
- アプリケーションを載せるインフラはCloud Run
- GPTバージョンは3.5-turbo-16k
- ボットとのチャットは、ダイレクトメッセージ（DM）で行う
- ボットに対してメッセージを送ると、スレッドで返信される
- 受付時点でスタンプ応答する
- スレッド内容を過去の会話記憶として使用する
- 会話トークン数が16k近くになると古いものから記憶を消していく

Azureのノウハウをほとんど持っていないためそこの学習に時間をかけるよりはAPIサーバとしての利用に留めて、手慣れているGCP上(Cloudrun)にアプリケーションを構築することを選択しました。
pythonコードはAzure OpenAI Studio Chat のプレイグラウンドでAIと対話しながら作成。

# そのほか仕様
- Clourun側でのリクエスト署名検証
    - chatbotがインストールされたSlackワークスペースからのアクセスかどうかをX-Slack-Signatureを使用して検証
        - slack_bolt組み込みの機能を使用
- Slack app へのIPアドレス制限
    - Cloudrunの送信元IPアドレスを固定(VPC connector & CloudNATを利用)
    - Slack app側で受け付けるIPアドレスを制限
- 会話履歴の保存
    - システム管理者しかアクセスできないGCPプロジェクト側に難読化をほどこして保存
- botとのDMに制限
    - ユーザープライバシーを保ちながらボットとの対話が可能
    - ボットが他のチャンネルで混乱を引き起こす可能性を排除


# 構成図
![スクリーンショット 2023-11-16 18.26.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/07f09047-bdc3-a2f8-9823-e3547810fc09.png)



# 導入まで
開発作業より手間暇がかかったのが社内調整。

- 全従業員利用想定のインフラ＆生成AI費用見積もりと予算確保
- セキュリティ要件を担保できるかAzure OpenAIの利用規約の読み込みと社内法務へのプレゼンを実施
- 法務でのでリーガルチェックを待ちつつ、導入に合わせて社内の生成AI利用規約を刷新して公開
- chatbotの利用マニュアルを作成して関連部署のレビュー

そして、ようやく導入となりました。

# 現状わかっている課題など
- ファインチューニングは難しい
    - キーバリュー形式でデータは簡単に食わせられるが、期待した回答はなかなかしない
    - 膨大なパターンを含めたデータを投入する、AIが回答しやすい質問に再生成等の工夫が必要
    - RAGで上手いことやりたいけどまだ手を動かせていない
- 会話ログの取り扱い
    - AIの学習のためには実使用時の会話が重要だが、会話自体が機密情報でもある
    - 貯めたデータはどう扱うかは検討中
- Cloudrun費用が結構かさむ
    - Always on CPU必須なため
- CloudrunだとSlackのソケットモードと相性が悪い
    - ライフサイクルで自動的にコンテナが落ちるのでソケットモードを利用する場合は別途キックの仕組みが必要になる
    - これがうまく使えればIPアドレス制限のセキュリティ対策は必要なかった
- Azure OpenAI APIサーバの機能
    - 月に何度かは落ちていた(開発当時)
    - 機能追加はOpenAI純正の後追いで遅い

# 作ってみての感想とか
- プログラミングは普段ほぼしないが、AIと会話しながらでかなり捗った
- Azure OpenAIに会話を投げつけること自体はとても簡単
- Slackを使うとコンテキストを理解させるための会話ログの取得はSlack上に残っているものを使えば良いので、別途ストレージ用意しなくてよくて楽チン
- slack appの仕様を理解するのとか運用設計に時間がかかった

ということでツラツラ書いてきましが、生成AIを使うとコードの作成を含め色々と捗ります。
開発当時は不安定だったAzure OpenAIも今は安定してレスポンスも早くなりました。
実現したいことがあるけどプログラミングは苦手なので後回しにしていた...なんて方は生成AI使うと幸せになれますよ。
formDataでデータを送信するとLaravel(PHP)側で空配列になる原因

## はじめに
Laravelとフロントエンド（例えばReactやNext.js）の間で画像ファイルを送信する際にバイナリデータの送信ではなく、マルチパートフォームデータで送信する際は、`formData`で送らないといけないのですが、AxiosでAPIを叩いてFormDataを送信する際になぜかLaravel側でデータが空配列になってしまう現象です。

https://apidog.com/jp/blog/form-data-content-type-introduction/#:~:text=form%2Ddata%E3%81%A8%E3%81%AF%E3%80%81Web,%E3%81%A6%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E5%BD%A2%E5%BC%8F%E3%81%A7%E3%81%99%E3%80%82

## エラー内容
問題の典型的なシナリオは、フロントエンドからLaravelのAPIへフォームデータを送信しようとすると、Laravel側で`$request->all()`や`$request->input()`が空の配列を返す状態です。

## 試したこと(現状)
- Content-Typeヘッダーの確認
    - リクエストヘッダは問題なく`multipart/form-data; boundary=....`となっている
- Laravelのルーティングとコントローラーの確認。
    - 問題なし
- ブラウザのデベロッパーツールを使用してリクエストのペイロードを確認。
    - 問題なくデータは入っている

```typescript: **.ts
    const formData = new FormData();

    // テキストフィールドを追加
    // formData.append('_method', 'PATCH');
    for (const [key, value] of Object.entries(inputData)) {
      if (key !== 'profileImage') {
        formData.append(key, value);
      }
    }

    // ファイルデータを追加
    if (inputData.profileImage && inputData.profileImage instanceof File) {
      formData.append('profileImage', inputData.profileImage);
    }
    


axios.patch('/user/setting/profile', formData),
```

```PHP: **.php
    Route::patch('/user/setting/profile', PatchUserSettingProfileController::class)->name('user.setting.profile.patch');
```


## 原因
問題の主な原因は、HTTPメソッドPATCHやPUTを使用している場合、PHPがFormDataを正しく解析できないことにありました。

https://github.com/laravel/framework/issues/13457#issuecomment-341973180


## 解決策
解決策としては、以下の二つの方法があります：

- ①擬似的なPATCHメソッドの使用:

    - フロントエンドでPOSTメソッドを使用し、FormDataに_methodキーを追加してPATCHを指定して擬似的にpatchでPHP側に解釈させる
    - 例: `formData.append('_method', 'PATCH');`を追加
        - axiosはpostにすることを忘れずに


- ②HTTPメソッドのオーバーライド:

    - Axiosリクエストのヘッダーに`'X-HTTP-Method-Override': 'PATCH'`を追加して、Laravelに対してHTTPメソッドをPATCHとして解釈させる
        - axiosはpostにすることを忘れずに

```typescript: **.ts
        axios.post('/user/test', formData, {
           headers: {
             'X-HTTP-Method-Override': 'PATCH',
           },
        }),
```

## 結果
上記のいずれかの方法を採用することで、FormDataを使用した際にLaravel側でデータが空になる問題を解決でき、
フォームデータとファイルを正しく送信し、期待通りのサーバー応答を得ることができます。

## 参考

https://github.com/laravel/framework/issues/13457#issuecomment-341973180

https://note.com/rottenmarron/n/n4fe174f79f58

https://qiita.com/ky0he1_sec/items/6cd8264f646bdf86cdb9
arm64とx86どっちをインストールする？

# はじめに
pgadmin4をブラウザからインストールしようとした時に、arm64とx86で迷ったのと、違いがよくわからなかったので少し整理します。

# 問題
pgAdmin4(macOS)のインストール先

https://www.pgadmin.org/download/pgadmin-4-macos/

最新版をダウンロードしようとしたら、
こんな画面が

![スクリーンショット 2023-11-16 12.08.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627753/f9ae6032-bb46-f1ed-5c37-db69595d4d60.png)

Filesタブのところで、2つが出てきて自分はどっちをインストールすればいいんだろうって思いました。

- pgadmin4-7.8-arm64.dmg
- pgadmin4-7.8-x84_4.dmg


# 解決方法
Linuxコマンドで自分のPCがどっちか確認する

```
$ uname -m 
x86_64
```

そこで該当するものをインストールする


# おわりに
`x86` `x64` `arm`の違いってなんだろうって思ったので軽くまとめておきます。

`x86` `x64`は `CISC(Complex Instruction Set Computer) `と呼ばれる命令セットのこと。


※ 複雑な処理」を「少ない命令」で実行しようとする思想

- `x86`は`32bit`のこと
- `x64`は`64bit`のこと

`arm`は`RISC(Reduced Instruction Set Computer)` と呼ばれる命令セットのことを示します。

- `arm`について、`ARMv7`では`32bit`のこと

割愛

# 参考
https://www.wakuwakubank.com/posts/809-it-cpu-x86-x64-arm/
「Haskell 入門」 Attoparsec①

Haskell技術の勉強のため、技術評論社の「Haskell入門」をつまみ食いしながら読んでいます。
文章の構造を解読する構文解析、またそれを解読するためのパーサーについては以前から少し気になっていたのですが、Haskellは構文解析にもってこいの言語だということを知ったので、今回は上記の本を参考に勉強をしました。Haskellはコンパイル型の言語ということもあり、コードを書けば書くほどファイルが増えてしまって面倒なのでQiitaに覚書としてまとめることにしました。
間違いなどあればご指摘いただければ幸いです。

### モジュールData.List.SplitのsplitOn
まずはパッケージsplit-0.2.4のモジュールData.List.Splitの中にあるsplitOn関数を使って簡単なパーサーを作っていきます。
このsplitOn関数は与えられた文字列に対して、与えられた記号("/"や"."など)で分割を行ってくれる関数です。以下のように定義されています。第一引数が分割したい記号、二つ目が分割したい文字列になります。
```
ghci> :t splitOn
splitOn :: Eq a => [a] -> [a] -> [[a]]
```
例えば"abc/d"という文字列に対して、"/"で分割を行うならば以下のように実装されます。
```
ghci> splitOn "/" "abc/d"
["abc","d"]
```
この関数を使って2023/11/16のように与えられる文字列をYMDと呼ばれるデータ型を使って、(YMD 2023 11 16)というように分解していきます。コードは以下の通り。

```
import Data.List.Split

data YMD =YMD Int Int Int deriving Show

parseYMD :: String -> Maybe YMD
parseYMD = listToymd . splitOn "/"
    where
        listToymd :: [String] -> Maybe YMD
        listToymd (y:m:d:_) = Just $ YMD (read y) (read m) (read d)
        listToymd _ = Nothing

main = print $ parseYMD "2023/11/16"
```
splitOn関数で["2023","11","16"]と分割した上で、listToymdでYMD型に変換してきます。read関数を使っていますが、これは文字列として認識されている2023などをInt型に変換するために使っています。
これを以下で実行
```
stack runghc par.hs --package split
```
なお、stackを除いて以下のように実行するとうまくいかないので注意
```
runghc par.hs --package split
```
この場合、Data.List.Splitというモジュールはないと返事されてしまう。

実行結果は以下の通り。
```
Just (YMD 2023 11 16)
```
これで簡単なパーサーを実装できたが、例えば入力にどのような型でも入れることができるなど、問題点は多い。2023/11/16を分解するという単純なパーサーでもちゃんと実装するとかなり大変であることがここからもわかる。
【ChatGPTほか】ニュースしかないw


　どうも、カーブミラーです。

　今回は、ニュースしかない。

:::note info
本記事は、
　ニュースしかないです。
　　あしからず。
:::
　まずは、ニュース。
　　いや、
　　　それしかないんですけどねw

　ChatGPT Plusの
　　GPT-4が、GPT-4 Turboに
　　　なっているそうです。
　　　　サム・アルトマンが
　　　　　昨日、X-Twitterで
　　　　　　投稿していました。
[there is a new version of GPT-4 Turbo now live in ChatGPT; you should hopefully find it a lot better!](https://x.com/sama/status/1723480961177010597?t=G41Uxr1lOeKAMRypfZk-KA&s=03)

　内容をDeepL翻訳
>GPT-4ターボの新しいバージョンがChatGPTにあります！

　　（詳しくは、下に書きます）

　しかも、サム・アルトマン、
　　どっかのインタビューで
　　　GPT5にまで言及している。
　　　　具体的なことは
　　　　　言っていないが
　　　　　　開発を進めていることは
　　　　　　　認めたそうです。

　　　それから
　　　　Microsoftからの
　　　　　資金提供を
　　　　　　交渉していることも。
***
　翌日（つまり今日）、
　　Microsoft Ignite 2023という
　　　年次イベントが開催され、
　　　　多くの発表がされました。

　ここでは、
　　そのすべてを書きません。
　　　だって、見た人からの
　　　　受け売りだしw
　　　　　量も多いしw

　GoogleSGEからだと
>Microsoft Ignite 2023 では、次の発表がありました。﻿
・独自設計のAIチップ「Azure Maia」
・Copilot用ローコード開発ツール
・インフラ
・データとAIの関係
・開発者向けの新しいツール
・セキュリティ

　　ということです。
　　　詳しくは、
　　　　みなさんで調べてください。
　　　　　あちこちに転がってますw

　私が注目したのは、こちら。
　・ローコード開発ツール
　　　Copilot Studio
　・BingChatを
　　　Copilotにリブランド

　Copilot Studioというのは、
　　Microsoft版GPT Builderです。
　　　なるほど、
　　　　これが資金提供の元ネタか。

　BingChatについては、
　　もとからCopilot的な感じ
　　　でしたから、違和感はない。
　　　　ただ、これから
　　　　　なんと呼ぼう？
***
　GPT-4 Turboについてですが、
　　ゆうべ、
　　　確認しました。
　　　　本当になっていました。
　　　　　web版もアプリ版もです。

　ChatGPT本人に聞きました。
　　入力枠への入力文字数について
>一つの入力につき最大4,096文字まで扱うことができます。この文字数には、スペースや改行も含まれます。

　また、ファイルについても
>テキストファイルやPDFファイルにも同様に約10MBのサイズ制限が適用されます。PDFの場合、テキストだけでなく画像やデザイン要素も含まれるため、ファイルサイズが大きくなりやすい点に注意が必要です。10MBを超えるPDFファイルを扱う場合は、ファイルを分割するか、必要な部分だけを抽出してアップロードすることを検討してください。
***
　いやぁ、もうお腹いっぱい。

　本題に行く前に、
　　倒れそう。

　だから、
　　今回は、ここまで。

　PS.
　　ChatGPT無料版も有料版も
　　　UIがこまごまと
　　　　変更されています。
　　　　　履歴の頭とか
　　　　　　回答のアイコンとか。
　　　　　　　NewChatが＋でない
　　　　　　　　とかとか。

　ほかにも
　　変わっているかも
　　　しれません。

　ちょっと注意して
　　見てみましょう。では。
Rを使用したGLMM（binomial）の結果を論文に書いたり、Word やパワーポイントに移すのが少し楽になるコード

以下のコードを入力すると、表にそのままコピペできる形になります。
output に、本文中で使える (Estimate = ., SE = ., = . , z = ., p < .) の形に出力してくれます。
outputTable に、エクセルでデータ分割をすればそのまま貼り付けられるようにできるデータが入っています。

```R
# GLMMを実行し、summaryの結果を表示する
summary_result <- summary(作成したモデルの名前)

# 固定効果の抽出
fixed_effects <- round(summary_result$coefficients[,"Estimate"], 3)
se <- round(summary_result$coefficients[,"Std. Error"], 3)
z_values <- round(summary_result$coefficients[,"z value"], 3)
p_values <- summary_result$coefficients[,"Pr(>|z|)"]

#p値の整形
p_values_text <- ifelse(p_values < 0.001, "p < .001", paste("p =", gsub("^0", "", formatC(p_values, format = "f", digits = 3))))

#整形した結果の出力
output <- matrix(paste("Estimate =", fixed_effects, ", SE =", se, ", z value =", z_values, ",", p_values_text, sep = " "), ncol = 1)
outputTable <- matrix(paste(fixed_effects, se, z_values, p_values_text, sep = ","), ncol = 1)
colnames(output) <- "Fixed Effects"
print(output) 
print(outputTable) 
```
【Rails】Amazon Bedrockを使用して生成AIと会話してみた

どうもこんにちは。今回は前回のAmazon Bedrockの記事に続いての投稿となります。

https://qiita.com/PDC-Kurashinak/items/84b1a7b7598e8a3d4443

今回は、最近話題の`anthropic`の`Claude2`を使用してみたかったのですが、まだAWS東京リージョンでは使用ができなかったので、`Claude Instant`というモデルを使用しました。（バージニア北部かオレゴンリージョンならもう使用できるようですね。）

今回の記事ではBedrockとは何者なのかという説明は省略して、早速実装手順を説明していきます。

# 実装

## 0. AWSコンソール上で必要な設定を行う

この時に、自分のアカウントのアクセスキーとシークレットアクセスキーを入手しておいてください。

## 1. Gemで必要なライブラリを追加する

Gemfileに以下を記述します。

```Gemfile
gem 'aws-sdk-bedrockruntime'
```

## 2. bundle install

ターミナルで`bundle install`をします。

```
$ bundle install
```

## 3. 処理を書く

コメントを送信する処理に入れ込みます。

先に自分が実装したコードを示します。

```ruby
comment = 'おはようございます。私はお腹が空きました。'
access_key = 'XXXXXXXXXXXXX'  # 事前に取得したアクセスキー
secret_access_key = 'YYYYYYYYYYYYYYYYYY'　　# 事前に取得したシークレットアクセスキー

# Bedrockインスタンスを作成
credentials = Aws::Credentials.new(access_key, secret_access_key)
bedrock_client = Aws::BedrockRuntime::Client.new(region: 'ap-northeast-1', credentials: credentials)

# Bedrockに送信するためのプロンプトのBodyを作成
body_data = {
    "prompt": "\n\nHuman: #{comment}\n\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.5,
    "top_k": 250,
    "top_p": 1,
    "stop_sequences": [
        "\n\nHuman:"
    ],
    "anthropic_version": "bedrock-2023-05-31"
}

# 指定の形式に載せてリクエストを投げてレスポンスを受け取る
response = bedrock_client.invoke_model({
    accept: "*/*",
    content_type: "application/json",
    body: body_data.to_json,
    model_id: "anthropic.claude-instant-v1",
})

# レスポンスを出力
string_io_object = response.body
string_io_object.rewind
string_io_object.each_line do |line|
    puts line
end
```

まず、`Aws::BedrockRuntime::Client.new`でBedrockのインスタンスを作成します。

次に、以下の形式でリクエストを投げられるようにコードを書きます。

```JSON
{
  "modelId": "anthropic.claude-instant-v1",
  "contentType": "application/json",
  "accept": "*/*",
  "body": {
    "prompt": "\n\nHuman: ここにコメントを入れます\n\nAssistant:",
    "max_tokens_to_sample": 300,
    "temperature": 0.5,
    "top_k": 250,
    "top_p": 1,
    "stop_sequences": [
      "\n\nHuman:"
    ],
    "anthropic_version": "bedrock-2023-05-31"
  }
}
```

ただ、このままBodyのところにJSON形式のままで入力すると、「`"expected params[:body] to be a String or IO like object that supports read, rewind, and size, got class Hash instead."`」とエラーが出て怒られてしまうので、bodyの値は`to_json`メソッドで`String`型に直してからリクエストを投げるようにした方が良いです。

次に、`invoke_model`メソッドでリクエストを投げます。response変数でBedrockから返ってきたデータを格納します。

```ruby
response = bedrock_client.invoke_model({
    accept: "*/*",
    content_type: "application/json",
    body: body_data.to_json,
    model_id: "anthropic.claude-instant-v1",
})
```

次にレスポンスを見たいわけですが、response.bodyの中身は`StringIO`クラスになっているのでちょっと工夫が必要です。

```ruby
string_io_object = response.body
string_io_object.rewind
string_io_object.each_line do |line|
    puts line
end
```

上記コードのように、StringIOクラスのメソッドを使用して中身を出力します。

## 4. 処理結果

そうすると以下のような結果が出ました。

```
{"completion":" はい、お腹が空いたのは大変だと思います。朝食は体にとって大切な食事なので、できるだけ早く食べることをおすすめします。美味しい朝食を楽しみにしてください!"}
```

「お腹が空いた」ことに対してこんなに丁寧に返事されるとは思いませんでした笑

## まとめ

今回もrailsでAmazon Bedrockを使用する方法をまとめました。

前回のAmazon Titan Embeddingsモデルよりも生成AIを使用している感じがあってわかりやすいですね。

以上
【AWS re:Invent 準備編】re:Inventを満喫する為のTips５選

# はじめに

AWS re:Inventまで後わずか1週間ちょっととなりました！
来週の土曜日には出国していることを考えると、時間が経つのは早いものですね:airplane:

過去のre:Invent参加経験から得た感想をTipsとしてまとめましたので、
今年の参加者の皆さんや、来年以降の参加を検討されている方々のお役に立てれば幸いです！
re:Invent準備編として以下も投稿していますので、併せてご覧ください:sunglasses:

https://qiita.com/mizuki_hori_POHD_CCoE/items/baf357e3857370cd3067

https://qiita.com/mizuki_hori_POHD_CCoE/items/c36d04252e288d04f78f

# AWS re:Inventとは
AWS 最大規模のラーニングカンファレンスで、世界中から約5万人の参加者が集まります。会期中は、新サービスやサービスアップデートの発表が大量に行われます。re:Inventに参加することでAWSの最新情報を入手する事が出来ます！

つまり、約１週間にわたってAWSにずっぷり浸かることができるカンファレンスです:writing_hand:
AWS re:InventはAWSユーザーの武者修行といっても過言ではないです:lifter:

詳細は公式サイトをご確認ください。

https://reinvent.awsevents.com

# 1. 予約したセッションは１０分前入場がマスト

予約があっても、セッション開始10分前になると当日の待機列での入場が始まり、予約が無効となったり満席で入れなくなるリスクがあります。そのため、開始時間10分前には必ず入場しましょう！

会場間だけでなく会場内の移動も時間がかかることも想定されるので、スケジュールはタイトにせず、最低でも30分の余裕を見ておくことを推奨します:writing_hand:

# 2. 無理のないスケジュールをたてる
1に記載した内容と少し重複しますが、とにかく日本と規模が違うので少し移動するだけでも10分ほどかかってしまいます:cold_sweat:

特にシャトルバスやモノレールで移動する場合は待ち時間もありますのでキチキチにスケジュールをいれてしまいますと、予約した時間に間に合わなくなってしまいますので要注意です。
予め、今予約しているセッションの中でも更に優先順位をつけて絶対に拝聴したいものに絶対に間に合うスケジュールをたてられると良いかなと思います。

今年は、移動時間を考慮してタイトなスケジュールですとシステム側ではじかれるようになっているそうですので誤って予約してしまうことは避けられますが、少しの移動であっても体力をかなり消耗しますので現時点では少し余裕を持ったスケジュールくらいで丁度良いかと思います！

また、参加者の皆さんの中には日本とのMTGを考慮してスケジュールされている方もいらっしゃるかと思います。しかし、日本との時差は17時間あるので、無理に日本側に合わせてMTGを調整しますと興味があるセッションを諦めないといけないという悲しいことも起こり得ます:sob:

ここは、日本のメンバーを信じてre:Inventを満喫するために緊急時以外は日本とのネットワークは遮断するように業務調整することをオススメします:thumbsup:


# 3. AWS Eventsアプリはこまめにチェックする

AWS Eventsアプリはかなり役に立つので、頻繁にチェックしましょう:sunny:
特に下記のタイミングでの確認をお勧めします。

#### **KeyNoteでの新サービス/新アップデート発表直後**
会期中はKeyNoteで沢山の新サービスやアップデートの発表が予想されます。

発表された新サービスは、発表後すぐにAWS Events内でセッションが発表され予約がスタートしますので
新サービス発表後は特にAWS Eventsアプリを確認してみて下さい:eyes:

#### **予約し損ねた（既に埋まっていた）セッションの直前１時間**
既に予約をしていた人が直前で予約をキャンセルして空きがでることが稀にありましたので、もし予約し損ねたセッションがありましたら、当日の待機列に並ぶ前に予約に空きが出ていないかを再度確認してみることをオススメします！

#### **シャトルバスの運行情報に乱れがある時**
昨年は大通りでの交通事故発生の影響で、シャトルバスが運休したりルートの変更が急遽発生していましたが、Amazon Eventsアプリですぐに最新情報を反映してくれていましたのでスムーズにホテルに戻ることができました。

各シャトルバス乗り場のスタッフさんも呼びかけをしてくれていますが、聞き取れないこともありますので、困ったらEventsアプリをチェックすることをオススメします:trolleybus:

# 4. 各会場に設置されている展示物もチェックする

re:Inventの各会場には、セッション会場近くに様々な展示や企画を行っています。
例えば、サステナビリティのブースがあったりAWSで行われている社会福祉活動について知ることができるブースもあります。

あまり興味がないなと私も最初は思っていたのですが、グローバル企業がテクノロジー以外にも力を入れていることを知ることで日本にも将来この波がくるのではないかと想像することができますので、ぜひ今年もブースが出ていたら立ち寄ってみていただければと思います！

# 5. AWS認定者ラウンジを活用する

AWS認定者ラウンジはとても快適です:relaxed:

認定者限定ですが、利用者が増えているため混雑はしますが、電源やテーブルが完備しているので、PCの充電スポットに困った際にはぜひラウンジを利用してください！

それ以外にも、終日軽食が準備されていたり認定者グッズを配布していますのでぜひこの機会にゲットしてください！日本に帰ってきて自慢しましょう:sunglasses:


# 最後に

この貴重な機会をより有意義にすごしていただくために、役立つTipsを記載しました！
参加される皆さんにとって参考になれば幸いです:robot:

ぜひ、日本では味わうことができない特別な体験を現地で楽しんでください:relaxed:

# :airplane: 弊社では一緒に働く仲間を募集中です
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。

https://engineer.po-holdings.co.jp/