OmniAICreator/Qiita-1.07M huggingface dataset:
【DB】データベースの概念を説明してみる

最近業務でデータベースをさわるようになって、概念が理解できず苦労しました。
本記事では調べて理解したことを図を用いながら、なるべく初心者にわかりやすいように説明していきます。

# はじめに

この記事は、株式会社スピードリンクジャパン Advent Calendar 2023 の８日目の記事です。

https://qiita.com/advent-calendar/2023/slj				
						
						
						
# 目次
- [概念図](#概念図)
- [データベースクラスタ](#データベースクラスタ)
- [データベース](#データベース)
- [テーブル](#テーブル)
- [まとめ](#まとめ)
- [最後に](#最後に)

# 概念図
それぞれの関係性を図に表すとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/35053cfc-baec-432f-f1ea-86195f55723f.png)

細かく説明していきます。

# データベースクラスタ
:::note info
cluster(クラスタ)
訳：房(ふさ)、群れ、集団
参考　https://ejje.weblio.jp/content/cluster
:::
英語でクラスタは房や群れなど何かが集まっている様子を表します。

データベースクラスタはその名の通り、複数のデータベースがグループ化されたものです。
これにより、データの冗長性、可用性、パフォーマンスを向上させることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/e61db396-ae0e-7936-6a24-cd1d3fcb0278.png)



# データベース
データベースは、情報を効果的に管理するための組織化された仕組みで、データの集合体です。
通常、データベースは複数の関連するテーブルやクエリ、インデックス、ビュー、ストアドプロシージャなどを含みます。データベースは情報の保管、検索、更新、管理を行うための仕組みです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/0d05e27a-b06a-0197-4330-d55e2146c2f7.png)

図のように各データベースはコマンドラインからアクセスをすることが可能です。

例えばpostgresqlでは`psql`のコマンドがアクセスする際のコマンドになります。

# テーブル
テーブルは、データベース内で情報を保持するための構造です。
テーブルは行と列で構成され、それぞれが特定のデータ項目を表します。
例えば、顧客情報を保持するためのテーブルは、名前、住所、電話番号などの列で構成されます。
データベース内で関連する情報を整理して格納するために使用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/b7d08e87-53bd-2523-0c70-927a2c44244c.png)


# まとめ
細かく説明してきましたが、簡単にまとめるとデータベースクラスタの中に複数のデータベースサーバーがあり、その1つ1つの中に複数のテーブルがあるという構造になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/35053cfc-baec-432f-f1ea-86195f55723f.png)


# 最後に
ここまで読んでいただきありがとうございます。
記事の不備などございましたら、コメントまでお願いいたします。

### 参考

https://note.com/sho_tokyo/n/n77f071c8805d
CSVファイルをJSON形式に変換する

これまで私の中の天才くんが覚醒して色々作成しては、忘却の彼方に追いたコードたち。
その天才くんが言い残すのは『それじゃぁもったいない！どこかに書き残しておいて』

だったらここに書いて、シェアしておこうと思います。

Laravel10環境で書いています。

``` php
    /**
     * CSVファイルを1行目をキーにしたJSON形式にコンバート
     *
     * @param Request $req
     * @return array|false
     */

    public function csvConvertToJson(Request $req)
    {
        $req->validate([
            'file' => 'required|mimes:csv,txt|max:2048'
        ]);
        
        if ($req->file()) {
            $file = $req->file('file');
            $fileName = time().'_'.$file->getClientOriginalName();
            $filePath = $file->storeAs('/storage/public/uploads', $fileName);

            // CSVを読み込んでJSONに変換
            $csvData = array_map('str_getcsv', file(Storage::path($filePath)));
            array_walk($csvData, function(&$a) use ($csvData) {
                $a = array_combine($csvData[0], $a);
            });
            $titles = array_shift($csvData); // タイトル行はいらない
            $json = json_encode($csvData);

            return [
                'json_data' => $json,
                'columns_titles' => $titles,
                'file_name' => $fileName,
                'file_path' => $filePath,
            ];
        }
        return false;
    }
```

これを動かすには、ファイルアップロード部が必要です。
ご利用の際は、↑いい感じで作ってね。

もう１つ。これは同一のデータ番号でナンバリングされたものを、１JSONファイルに纏めてしまうもの。

```php
    /**
     * CSVファイルのカラムタイトルとデータでJSON形式にする２
     *
     * @param Request $req
     * @return array|false
     */
    public function csvConvertToJson2(Request $req)
    {
        $req->validate([
            'file' => 'required|mimes:csv,txt|max:2048'
        ]);

        if ($req->file()) {
            $file = $req->file('file');
            $fileName = time().'_'.$file->getClientOriginalName();
            $filePath = $file->storeAs('/storage/public/uploads', $fileName);

            // CSVを読み込んでデータの準備
            $csvData = array_map('str_getcsv', file(Storage::path($filePath)));
            $columnTitles = array_shift($csvData); // $csvDataタイトル行削除し、$columnTitlesに格納

            // データ識別番号ごとにグループ化
            $groupedData = [];
            foreach ($csvData as $row) {
                $row = array_combine($columnTitles, $row);
                $identifier = $row['データ番号'] ?: 9999999999;
                $number = isset($row['データ番号']) ? $row['ナンバリング'] : [];
                $groupedData[$identifier][$number] = $row;
            }
            $json = json_encode($groupedData);

            return [
                'json_data' => $json,
                'columns_titles' => $columnTitles,
                'file_name' => $fileName,
                'file_path' => $filePath,
            ];
        }
        return false;
    }
```
取り出して配列にコンバートさえすれば、データの取扱いが楽になります。


X: @mighty5_development
@mighty5
dotenv を使って環境変数を設定

# 初めに

git を使用している関係上、API キーや DB のURLを直書きしてしまうと、push 時に取り消される (あたりまえ) ため、最近は環境変数ファイルを用意しています。

普段であれば、Docker を立ち上げる際に指定するのですが、作業環境で流動的に env ファイルを使いたいなんてこともあります (openai API key とか)。

なので今回は、dotenv を利用して、環境変数を指定することにしました。

公式 git

https://pypi.org/project/python-dotenv/

# 結論

`python-dotenv` はインストール済みとする

```python:main.py
from dotenv import load_dotenv
from os.path import join, dirname, abspath


dir_path = dirname(abspath("__file__"))
dotenv_path = join(dir_path, '.env')
load_dotenv(dotenv_path, verbose=True)
```

# 解説

たまに下記のような説明も散見される、が、Jupyterなどでは動作しないことがある

```python
# dir_path = dirname(abspath("__file__"))
dir_path = dirname(__file__)
print(dir_path)
```

しかし、エラー

```bash
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-8-755a91d3a9c3> in <module>()
      3 > NameError: name '__file__' is not defined
      4 '''
----> 5 print(dirname(__file__))

NameError: name '__file__' is not defined
```

回避方法を検索すると、`__file__` を `"` で囲めと書いてあるので試す

```python
# dir_path = dirname(abspath("__file__"))
dir_path = dirname("__file__")
print(dir_path)
# ''
```

何故か値が入っていない。

対話型モード (ipynb) だと、上手く動作しないらしい。

更に検索を重ねること1時間、ようやく答えにたどり着く

```python
dir_path = dirname(abspath("__file__"))
print(dir_path)
# '/your/path'
```

`abspath` とすることで、ようやく path が表示できた。

めでたしめでたし

# 手順

## python-dotenvのインストール

```bash
> pip install python-dotenv
```

## 環境変数ファイルを main.py と同じディレクトリに置く

階層構造イメージ

```bash
 .
 |-- python
 |   |-- .env
 |   |-- main.py 
```

環境変数ファイル

```properties:.env
OPENAI_API_KEY=[ここにAPIキーを入れる]
OPENAI_RESOURCE_ENDPOINT=https://[your].openai.azure.com/ 
OPENAI_API_TYPE=azure
OPENAI_API_VERSION=2023-07-01-preview #これは参考までに
OPENAI_DEPLOYMENT_NAME=[ここにモデルネームを入れる]
```

Python 実行ファイル

```main.py
from dotenv import load_dotenv
from os.path import join, dirname, abspath


# langchain の読込み
from langchain.chat_models import AzureChatOpenAI
from langchain.schema import HumanMessage
from langchain.callbacks import get_openai_callback

dir_path = dirname(abspath("__file__"))
dotenv_path = join(dir_path, '.env')
load_dotenv(dotenv_path, verbose=True)

# GPT settings
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("OPENAI_RESOURCE_ENDPOINT")
API_TYPE = os.getenv("OPENAI_API_TYPE")
API_VERSION = os.getenv("OPENAI_API_VERSION")
DEPLOYMENT_NAME = os.getenv("OPENAI_DEPLOYMENT_NAME")

model = AzureChatOpenAI(
    openai_api_base=BASE_URL,
    openai_api_version=API_VERSION,
    deployment_name=DEPLOYMENT_NAME,
    openai_api_key=API_KEY,
    openai_api_type=API_TYPE,
    temperature=0.0
)

model("こんにちは")
# こんにちは。私はAIアシスタントです。何かお手伝いできますか？

```

あとは実行して Chat-GPT が使えることを確認すればOKです。

# 参考文献

https://qiita.com/harukikaneko/items/b004048f8d1eca44cba9.md
曜日の列から土日フラグを作成する(SPSS Modeler データ加工逆引き1-14)

# 曜日の列から土日フラグを作成する

![スクリーンショット 2023-12-01 13.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/46281106-6ac0-de43-7139-4b946694c39a.png)

日付から曜日の列を作成する場合には逆引き1-3を参照ください。

## 1.想定される利用目的

・土日の持つ目的変数への重みの算出
・回帰モデルによる時系列予測作成のための説明変数作成

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/weekend_flg.str

## 3.サンプルストリームの説明

![スクリーンショット 2023-12-01 13.43.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2d64cd8d-71a4-a0c6-0349-eed3d10e5d05.png)

a.対象データは以下の通りです。

![スクリーンショット 2023-12-01 13.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/afcaeea8-dee2-4603-937d-d12c8a30e995.png)

日付から曜日を算出するaまでのプロセスは逆引き1-3を参照ください。

https://qiita.com/416nishimaki/items/1c9f1e1ebe7f14f6f79f

#### データ分類を利用する方法

b.[データ分類]ノードを編集します。
![スクリーンショット 2023-12-01 13.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/85992d7a-ffc7-66e0-5540-e8d164036f36.png)

#### フィールド作成を利用する方法

c.[フィールド作成]ノードを編集します。[派生：]を　[フラグ型]にして赤枠の式ビルダを起動します。
![スクリーンショット 2023-12-01 13.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4814cd53-4472-a6aa-8dc6-db32b69d6a15.png)

![スクリーンショット 2023-12-01 13.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/60e8d020-c02f-69e3-bdac-fef2a1194530.png)

[テーブル]を表示します。

![スクリーンショット 2023-12-01 13.47.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e8df6a41-def8-71e8-cb5a-37438882317a.png)

#### 注意事項

データ分類ノードの上流ではデータ型ノードで[値の読み込み]ボタンを押してデータの型を確定しておく必要があります。

## 4.参考情報

#### 祝日マスタを日付で割り当て休日フラグを作成する

https://qiita.com/416nishimaki/items/19f91717c2df52211f81

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
【Python】`pywinauto`の"Simple Example"は日本語環境だと動かない

## はじめに

PythonのRPA用ライブラリ、[`pywinauto`](https://github.com/pywinauto/pywinauto)は非常に便利なライブラリであり、WindowsのGUI操作に強力な機能があります。

https://github.com/pywinauto/pywinauto

しかし、そのドキュメントは日本語で十分に充実しているとは言えず、GitHubの`README.md`にある"Simple Example"は日本語環境では動きません。
これがなぜ動かないかをエラーメッセージやソースコードから見抜くのは非常に困難なので、技術選定の段階で挫折しているプロジェクトが多いのではと考えています。
この記事では、「とりあえず"Simple Example"と同等物を動かせるようにする」ことを目標に解説していきます。

## "Simple Example"実行時のエラー

"Simple Example"のコードは、下記のようにシンプルです。
```py
from pywinauto.application import Application
app = Application().start("notepad.exe")

app.UntitledNotepad.menu_select("Help->About Notepad")
app.AboutNotepad.OK.click()
app.UntitledNotepad.Edit.type_keys("pywinauto Works!", with_spaces = True)
```

仕様がわからなくても、クラス名や関数名、プロパティ名から、なんとなく「メモ帳を起動して、情報ウィンドウを開いて、OKを押下して閉じて、`"pywinauto Works!"`と入力するものだ」ということが把握できるかと思います。

しかし、これを実行すると、下記のようなエラーとなります。

```py
Traceback (most recent call last):
  ...
  File "...\pywinauto\controls\hwndwrapper.py", line 1084, in menu_select
    self.menu_item(path, exact=exact).select()
  File "...\pywinauto\controls\hwndwrapper.py", line 1028, in menu_item
    return self.menu().get_menu_path(path, appdata = menu_appdata, exact=exact)[-1]
  File "...\pywinauto\controls\menuwrapper.py", line 110, in check
    return method(instance, *args, **kwargs)
  File "...\pywinauto\controls\menuwrapper.py", line 569, in get_menu_path
    best_item = findbestmatch.find_best_match(
  File "C:\Users\komoj\pywinauto\pywinauto\findbestmatch.py", line 133, in find_best_match
    raise MatchError(items = text_item_map.keys(), tofind = search_text)
pywinauto.findbestmatch.MatchError: Could not find 'Help' in 'dict_keys(['ファイル(&F)', '編集(&E)', '書式(&O)', '表示(&V)', 'ヘルプ(&H)'])'
```

メッセージから「どうやら操作対象画面要素をマッピングしている辞書のキーに`"Help"`がない」からエラーになっていることがわかりますが、ここからどうやってエラーを解決すべきかは、これから開発しようとしているプロジェクト/プロダクトに`pywinauto`を使うべきかという技術選定段階ではなかなか見つけられないでしょうし、事実、メソッドの実装はかなり複雑な呼び出し経路をたどっています。

## 日本語環境で動くコード
動作環境を考慮しつつ、"Simple Example"を日本語環境で動くコードにするとこうなります。

```py
from pywinauto.application import Application
app = Application().start("notepad.exe")

app.UntitledNotepad.menu_select("ヘルプ->バージョン情報")
app.バージョン情報.OK.click()
app.UntitledNotepad.Edit.type_keys("pywinauto Works!", with_spaces=True)
```

1. `menu_select("Help->About Notepad")` -> `menu_select("ヘルプ->バージョン情報")`
  これは比較的わかりやすいですが、表示されているメニュー画面の通りに指定する文字列を直しただけです。
  `menu_select`は、`"->"`で渡された文字列を分割して、各文字列で指定されたメニューアイテムを押下し続けていくメソッドです。日本語で指定されたことにより日本語環境メモ帳の「バージョン情報」ウィンドウを開くことができます。
2. `app.AboutNotepad.OK.click()` -> `app.バージョン情報.OK.click()`
  日本語で属性の指定を行っている、少し奇妙なコードとなります。これは`Application`には`__getattr__`や`__getattribute__`が実装されており、動的な属性アクセスを行うためです。
  `Application`は指定された属性と同名(`.`や`-`や` `など、Pythonの文法的に変数名やメソッド名に指定できない文字がリプレースされることが考慮されつつ)の画面要素を取得します。なので"Simple Example"にある英語環境と同じ属性参照が使えず、日本語の属性を参照する必要があります。

## 展望
現在、実行環境の言語に関する言及をREADMEに導入することを、discussionsで提案しています。

https://github.com/pywinauto/pywinauto/discussions/1340

これが受け入れられれば、「しょっぱなサンプルコードが動かない!」で導入をあきらめるプロジェクトが減って、`pywinauto`コミュニティが活性化するのではと期待しています。
Salesforce 開発者 Web サイトのディスカッション フォーラムは、Trailblazer コミュニティに移行した？

そういえば、過去の内容を見ようとすると頻繁に以下のような画面になりますねぇ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/efd0d49d-37bf-1dfe-4ec4-fa730a2985c8.png)

今まで開発者 Web サイトのディスカッション フォーラムはTrailblazer コミュニティと違って、質問して結果を得たら即削除ということが無かったので貴重な情報元でした。始めは誰か消したのかとあまり気にしてはなかったのですが、頻繁にこの画面が出るのでおかしいと思い調べてみると


https://trailhead.salesforce.com/trailblazer-community/groups/0F94V0000002DJRSA2?tab=discussion&sort=LAST_MODIFIED_DATE_DESC

移行したみたいですね。

# 何が移行しているのか

移行は進行中であり、 2023 年 12 月 4 日に完了する予定です。すべての開発者のディスカッションを統合し、Trailblazer コミュニティでより統一されたエクスペリエンスを提供するために、開発者フォーラムのディスカッションを Trailblazer コミュニティに移行しています。移行前に、古いフォーラムのディスカッションをクリーンアップし、古いもの、不正確なもの、重複したもの、またはスパムをすべて削除しました。 

# このサポート ハブに期待できること

このグループは、新しい Trailblazer コミュニティで行われる開発者向けのディスカッションの「出発点」です。古い友人とつながり、新しい友人に会い、Salesforce 製品のエキスパートと知り合いになることができます。開発者ディスカッション フォーラムでは、フォローしたディスカッション トピックの多くも見つかるので、引き続き投稿して会話を続けることができます。 

ここでは仲良くやっていますよ！このグループには開発者フォーラムの他の寄稿者が含まれているため、おなじみの名前がいくつか表示されるはずです。さらに、Salesforce 開発者コミュニティの著名人もここに来て、Trailblazer コミュニティへの参加を支援します。このグループで移行に関するサポートを依頼することもできます。

# 移行されたトピック/ディスカッションのマップ

参考として、移行されたトピック/ディスカッションのマッピングを次に示します。**太字の項目**は注目のトピックです。開発者フォーラムのトピックは左側にあります。右側は、2023 年 12 月 4 日以降の Trailblazer コミュニティ内の対応するトピック名と場所です。

# 古い開発者フォーラムのトピック| Trailblazer コミュニティのトピック

+ Apex_コード_開発 |  Apex
+ API と統合 | **Integration**
+ AppExchange_Directory_Packaging | **Appexchange Apps**
+ アーキテクチャ | Enterprise Architecture
+ Chatter_and_Chatter_API_開発 | **Salesforce Developer**
+ デスクトップ統合 | **Integration**
+ 数式_検証_ルール_ディスカッション | **Formulas**
+ 一般_開発 | **Salesforce Developer**
+ Java_開発 | Java Development
+ 求人_ボード | Jobs 
+ Lightning | **Lightning Experience**
+ モバイル | **Mobile**
+ .NET_開発 |  Net Development
+ 予測サービス | Einstein Platform
+ Salesforce_Labs_Open_Source_Projects | **Salesforce Labs**
+ スキーマ_開発 | **CRM Configuration**
+ セキュリティ | **Security**
+トレイルヘッド | Trailhead
+ Visualforce_開発 | Visualforce
+ ビジュアルワークフロー | **Flow**

# 助けが必要？

この Trailblazer コミュニティのようこそとナビゲーションのビデオをご覧ください。Trailhead ヘルプに移動し、Trailblazer アカウントの問題の Trailhead チケットを開きます。

# 参加すべきもう 1 つの重要なグループ

[公式のSalesforce Developers Trailblazer コミュニティ グループ](https://trailhead.salesforce.com/trailblazer-community/groups/0F93A000000DJbJSAW?tab=discussion&sort=LAST_MODIFIED_DATE_DESC)に気軽に参加してください。そこでは、開発者が質問し、互いに学習し、問題を解決するのに役立ちます。私たちのチームもそこに更新情報を投稿します。これは、最新情報を入手し、他の 20,000 人の開発者や Salesforce コミュニティの専門家とつながるための優れた方法です。
Ruby未経験者がRubyな会社で生き延びるための三種の神器

[SmartHR Advent Calendar 2023](https://qiita.com/advent-calendar/2023/smarthr)シリーズ2の6日目です。

SmartHRは、[RubyKaigi2023](https://rubykaigi.org/2023/)や[Kaigi on Rails 2023](https://kaigionrails.org/2023/)などRuby系のテックカンファレンスや[Railsガイド](https://railsguides.jp/)に協賛しており、また、イベントでの登壇や書籍の執筆などRubyに精通したエンジニアが数多く在籍しています。
それゆえ、多くのプロダクトでRuby(Rails)が採用されたりもしています。

そんなRubyな会社にRuby未経験で入社(2023/4〜)した私が、これまで生き延びるために~~すがりついている~~活用しているツールやサービスを「三種の神器」として紹介します。

## その1 RubyMine
言わずとしれたJetBrains社製のIDEです。以下の機能をよく利用しています。

### コードジャンプ
調べたい変数やオブジェクトの定義元にジャンプします。定義元では、使用箇所の一覧を参照することもできます。

### コード補完
かなり精度高く、書きたいコードをサジェストしてくれます。

### ブレークポイント
ブレークポイントを設定した箇所で処理が中断され、中断された時点のプログラムの状態をGUIで参照できます。対話形式のコンソールを操作することも可能で、任意の変数やオブジェクトを参照したり操作したりできます。

※今気づいたのですが、[RubyMine公式サイト](https://www.jetbrains.com/ja-jp/ruby/)でより詳細に機能が紹介されているので、併せて参照してみてください。

## その2 binding.pry
[Pry](https://github.com/pry/pry)
ソースコード内に`binding.pry`を差し込んでプログラムを実行すると、該当箇所で処理が中断され、中断時点のスコープでPryセッションが開始されます。Pryセッションでは対話的操作でプログラムの状態を参照したり操作したりできます。デバッグの際に重宝します。
IDEのブレークポイントでも同じことができますが、なんら設定が不要で思い立ったら即使えるため、よく利用しています。

※今気づいたのですが、SmartHR TechBlogでより詳細な解説記事がありましたので、併せて参照してみてください。[binding.pryキホンのキ](https://tech.smarthr.jp/entry/2021/11/08/143649)

## その3 AIサービス


### GitHub Copilot
ReturnキーとTabキーを連打するだけでプログラムがかけてしまう魔法のツールです。(※これはボケです)
設計や処理内容が頭に入ってさえいれば、適切なコメントを書くだけでほぼ正確なコードをサジェストしてくれます。未だにRubyの細かなシンタックスに慣れていない部分があるので...本当に心強いです。

※今気づいたのですが、GitHub Copilotさんに頼り切っているからいつまで経ってもシンタックスを覚えられないのかもしれません。

### ChatGPT
ハマったときによく相談します。私自身がそうですが、誰かに相談するとき、相談内容の整理に時間をかける方は少なくないと思います。ChatGPTさんは、わからないことがわかってない状態の相談でも真摯に対応してくれます。怒られることも馬鹿にされることも絶対にないので、安心して相談ができます。

※実際に困ったことを相談してシュッと解決できた図
![chatGPTに相談した際の画面スクショ1枚目](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362273/e72b5b28-0dc7-64bb-5fc6-aa4ad7214eab.png)
![chatGPTに相談した際の画面スクショ2枚目](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362273/812b962d-0759-b547-05d4-58219d3aa381.png)
![chatGPTに相談した際の画面スクショ3枚目](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362273/28da01f9-24fc-51c6-f235-0dcf11a803ce.png)
![chatGPTに相談した際の画面スクショ4枚目](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362273/82a1013c-64e4-9c9f-d9cc-634b775ddb6c.png)

※これらAIサービスは[SmartHRにおけるAIサービス利用方針](https://tech.smarthr.jp/entry/2023/04/14/161428)に基づき、その範囲内で利用しています。

## まとめ
以上、Ruby未経験者がRubyな会社で生き延びるための三種の神器として
- RubyMine
- binding.pry
- AIサービス

を紹介しました。

私はこれらのツールやサービスを駆使することで、曲がりなりにも成果を上げ(ているはず...多分)、なんとか生き延びることができています。
これすなわち、適したツールやサービスを駆使することで特定領域の経験/知識不足を多少は補える。ということなんだと思います。
本当にいい時代...。

使えるものは使い頼れる人には頼りながら、引き続きチャレンジングな仕事に首を突っ込んで行きます！！
Discord.pyでスラッシュコマンドリセットする

## 問題
古いスラッシュコマンドがDiscord上のサジェストで出てきてしまい邪魔になる。
これらをリセットしたい

## 解決方法
以下のソースを実行する
botが起動し次第がコマンドのリセット処理が走る。
```python
import discord
from discord.ext import commands

intents = discord.Intents.all()
bot = commands.Bot(command_prefix="!", intents=intents, help_command=None)


# bot起動時
@bot.event
async def on_ready():
    bot.tree.clear_commands(guild=None)
    await bot.tree.sync(guild=None)

bot.run("ここにbotのトークンを書く")

```

## これだけで解決しない場合
対象のbotをサーバーからキックして招待し直す
GPTの「インプット」改善により、Chatbot正答率が80%→95%になった話

本記事は[リンクアンドモチベーション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/lmi)の7日目になります。
## はじめに
私は過去、GPTにプロダクトのヘルプページを読み込ませて、顧客の質問に回答してくれる
chatbotシステムのプロダクトマネージャーを務めていました。
しかし、chatbotの正答率がなかなか思うように上がってくれず、かなり難航しました。

今回は、そこで学んだGPTの「インプット」の重要性を記事にしようと思います。

## きっかけ
正答率改善のため、まずはプロンプトの変更やステータスの変更を行いました。
しかし、正答率は80%程度で、質問したら教えてくれるchatbotシステムとしては頼りない
正答率となっていました。

GPTのスペックはどんどん良くなっているのに、なぜか訳のわからないヘルプを
引っ張ってきて、トンチンカンな回答をすると言うことが多発してしまいました。

そこで、GPTの性能やプロンプトによって正しい回答を導き出せていないのではなく、
GPTが読み込ませているヘルプを正しく理解できていないのではと考えました。

## 教材が悪いと頭のいい子は育たない、GPTは悪くない
私たちは、GPTが間違った回答をしたときに、どのようなヘルプを参照にして回答
したのかを同時に吐き出させるようにしました。

どんなヘルプを参照した場合にGPTが間違った回答をしてしまうのかを
分析することにしたのです。

すると、間違った回答が参照したヘルプページには主語がなかったり、字ではなく画像で
説明されていたりと、GPTにとって分かりにくいインプットであるという共通点がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986847/55a28dd8-72eb-66d5-9868-51cb96b35584.png)
※イメージ図




## GPTが理解しやすいインプット
ここからは、私がこのプロジェクトで学んだ、GPTが理解しやすいインプットをまとめます。


#### 主語を明確にする
**❌「操作前に必ずご確認ください」
⭕️「反映ボタンを操作する前に必ずご確認ください」**
ヘルプの種類や文の流れからおおよそわかるだろうは、GPTには通用しません。
何の操作を行う前なのか、しっかりと主語を明確にしましょう。

#### 目的語を明確にする
**❌「公開や修正を行うことはできません。」
⭕️「結果の公開や修正を行うことはできません。」**
1つ目は、2文目に目的語(結果の)がないため、GPTが理解しにくいです。
2つ目は、目的語を追加して何の公開や修正を行うことができないのかを明確にしています。

#### 端折らず全てを明確に書く
**❌「ユーザーの編集などを行っても」
⭕️「ユーザーの編集や削除を行っても」**
大体予想がつくから書かなくてもいいよねはNGです。
しっかりと全ての事実を明記することが大切です。

## 結果
このプロジェクトの場合では、上記のようなGPTが理解しにくいインプットを修正し、
再度正答率を計測すると、正答率が80%→95%まで改善しました。

GPTのプロンプトや性能ではなく、インプットの質を高めることによって、
より精度の高い回答をしてくれることが分かりました。
## まとめ

GPTは画期的な技術ですが、人間ではありません。
書いていること以外を読み取ることはできません。
つまり、どれだけ質の高いアウトプットをしてくれるかは、どれだけ質の高いインプット
をしているかにかかっているのです。

みなさんも、GPTが思い通りに答えてくれない！GPTポンコツ！と思わず、
教え方が悪いのかな？とインプットを見直してみましょう🔥
AZ-204の勉強についてまとめ

## 概要
As a candidate for this exam, you’re responsible for participating in all phases of development, including requirements gathering, design, development, deployment, security, maintenance, performance tuning, and monitoring.

## AZ-204の対象範囲

You should be proficient in Azure:

- SDK
- Data storage options
- Data connections
- APIs
- App authentication and authorization
- Compute and container deployment
- Debugging

To implement solutions, you partner with:

- Cloud solution architects
- DBAs
- DevOps
- Infrastructure admins
- Other stakeholders

As a candidate, you should have at least two years of professional development experience and experience with Azure. You should be:

- Able to program in an Azure-supported language.
- Proficient using Azure CLI, Azure PowerShell, and other tools.

## AZ-204勉強　公式

AZ-204: Implement Azure App Service web apps
1 hr 45 min 4 Modules

https://learn.microsoft.com/en-us/training/paths/create-azure-app-service-web-apps/

AZ-204: Implement Azure Functions
51 min 2 Modules

https://learn.microsoft.com/en-us/training/paths/implement-azure-functions/

AZ-204: Develop solutions that use Blob storage
1 hr 22 min 3 Modules

https://learn.microsoft.com/en-us/training/paths/develop-solutions-that-use-blob-storage/

AZ-204: Develop solutions that use Azure Cosmos DB
1 hr 19 min 2 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-develop-solutions-that-use-azure-cosmos-db/

AZ-204: Implement containerized solutions
1 hr 42 min 3 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-implement-iaas-solutions/

AZ-204: Implement user authentication and authorization
1 hr 25 min 4 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-implement-authentication-authorization/

AZ-204: Implement secure Azure solutions
1 hr 5 min 3 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-implement-secure-cloud-solutions/

AZ-204: Implement API Management
42 min 1 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-implement-api-management/

AZ-204: Develop event-based solutions
54 min 2 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-develop-event-based-solutions/

AZ-204: Develop message-based solutions
57 min 1 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-develop-message-based-solutions/

AZ-204: Troubleshoot solutions by using Application Insights
24 min 1 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-instrument-solutions-support-monitoring-logging/

AZ-204: Implement caching for solutions
48 min 2 Modules

https://learn.microsoft.com/en-us/training/paths/az-204-integrate-caching-content-delivery-within-solutions/

## AZ-204勉強　YouTube

https://youtu.be/jZx8PMQjobk?si=atvBCtCOGAk3oMTw

https://youtu.be/Ny5SZcV7mbE?si=naJC3zKT4xp_UKIv

https://youtu.be/k4Gm7HnIpcg?si=74r_iPRAhMvR9nJU

https://youtu.be/tB_tBPfQJMI?si=erB26_XegSDksddw
【TIPS】Elixirのdefp（モジュール内関数）は型定義を書けない？

この記事は、[Elixir Advent Calendar 2023 シリーズ8](https://qiita.com/advent-calendar/2023/elixir) の10日目です

昨日は、 @mnishiguchi さんで [「Elixir で fortune を楽しむ」](https://qiita.com/mnishiguchi/items/b3364f01d18698a2dec8) でした

---

【本コラムは、3分で読め、3分で試せます】

[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:

@im_miolab さんから、こんな質問がありました

https://twitter.com/im_miolab/status/1731991515847602285

普段、defpをほぼ書かない私には、新鮮なネタでしたので、軽くコラム化してみました

# 実際にdefpでspecを書くと…

defpでspecを書いてみます

```elixir
defmodule Sample do
  @SPEC hoge(integer, string) :: {string, string}
  defp hoge(a, b) do
    {#{a}, #{b}}
  end

  def foo(), do: hoge(1, 2)
end
```

コンパイルすると、下記の通り、関数未定義エラーとなります

```
$ mix compile
Compiling 1 file (.ex)

== Compilation error in file lib/bright.ex ==
** (SyntaxError) lib/bright.ex:2:9: syntax error before: hoge
    |
  2 |   @SPEC hoge(integer, string) :: {string, string}
    |         ^
    (elixir 1.15.5) lib/kernel/parallel_compiler.ex:377: anonymous fn/5 in Kernel.ParallelCompiler.spawn_workers/8
```

# defpはインライン化されるためspecが書けない…

[黒田さん](https://twitter.com/tkrd_oiax) 曰く、defp関数はコンパイル時にインライン化されるため、specが意味を持たないようです

https://twitter.com/tkrd_oiax/status/1732035209720381475

# 諦めないとダメ？

Elixirへの型システム導入（下記動画）により、この状況も変わる可能性はあるかも知れません

https://www.youtube.com/watch?v=giYbq4HmfGA

---

明日は、私で [「【TIPS】マップ：文字列キーとアトムキーの相互変換」](https://qiita.com/piacerex/items/c283492fdd649cc73837) です
mock interview - Uber編


https://youtu.be/umWABit-wbk?si=L_hI_UtO_fKJKa1z

https://youtu.be/R_agd5qZ26Y?si=TXCjLrQaWEyv7WQs

https://youtu.be/ZotHUoS-RCE?si=8cIY0WZRDK1U6b0u
早い、うまい、安いブラウザでのデバッグ方法

# はじめに
WebApp開発の際に有用かつ便利なブラウザでのデバッグ方法をいくつか見つかりました。
その中に、特に利用頻度が多い方法を紹介します。
※本記事はChrome の機能をご紹介します。
# 本題

### ログポイント

ブレークポイントに、console.logを追加することで、実行中のプログラムを中止せずにログを残すことが可能です。
![logpoint.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/3cb252cb-646c-bfcf-a38f-52c84749cb5e.gif)


その他、console.logではなく、console.countを使用すると、そのラインが何回実行されるかも確認できます。

### Watch Pane

Watch Paneにもconsole.logを追加可能です。例えば、プログラムがデバッガーで停止する度、localStorageを確認したければ、Watch Paneにconsole.table(localStorage) を追加するだけでOK.
![Screenshot 0005-12-03 at 12.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/9fdaef69-8a76-cbfa-2238-ec161e293124.png)
また、DOMの変更後に式を実行するか、DOM変更ブレークポイントを設定するには（要素インスペクター内で）`subtree modification`を選びます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/2a15d492-2843-4cd0-2352-d4771242cb06.png)
そして、DOMのスナップショットなどを確認したい場合、Watch Paneに`(window.doms = window.doms || []).push(document.documentElement.outerHTML)`を追加すると、DOMサブツリーが変更される度に、デバッガーが実行を中止し、新しい DOM スナップショットは window.doms 配列の最後に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/fbc6e20a-dc1a-a211-9702-9648cc7a2c71.png)

### コールスタックの追跡
ぐるぐるスピナーを表示させる関数と非表示させる関数があるとします。しかし、コードのどこかで表示関数に対応する非表示関数を行わずに放置してしまい、ページがず～っとぐるぐる状態になってしまいました。この場合で有用なのは`console.trace`です。
![CallStack.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/5fb297e1-988f-de00-539e-7f4dd00b89b5.gif)

### プログラムの動作を変更
プログラムの動作に副作用がある表現を使用することで、ブラウザ内でプログラムの動作をその場で変更することができます。例えば、以下のGifにはid=1を指定し、`getData`に`1`の引数を渡しました。そうすると、Typescriptの方は`4`の引数を渡したにもかかわらず、`id=1`で出力されています。
また、`false`を追加することで、プログラムを中止せずに済みました。
![programChange.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/724a4856-429e-196e-2caf-edc29f23bc00.gif)


### パーフォマンス測定
ちょっとしたパーフォマンス測定をしたいのにわざわざプログラム修正したり、ブレークポイントを貼ったりするのもめんどいですね。そんな時には、console.time()を使うと便利です。測定し始めたい起点にconsole.time('hogehoge')を追加し、終点にはconsole.timeEnd('hogehoge')を追加するだけでOKです。
![timer.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/6fa8126b-78a9-a996-ebdd-2bf9358e3910.gif)



### 時間でブレークタイミング指定
- ページロード時
    ページがロードされた５秒以内に、プレークポイントがヒットしても停止してほしくなければ、条件付きブレークポイントに`performance.now() > 5000`を追加するといいです。
- スキップ
    ページロードではなく、任意なタイミングでスキップしたい場合はどうしましょう。条件付きブレークポイントに`window.baseline = window.baseline || Date.now(), (Date.now() - window.baseline) > 5000`を追加、そしてコンソールに`window.baseline = Date.now()`を実行します。そしたら、コンソール実行後、５秒以内プログラムが停止されません。　

### 特定の関数呼び出しと引数を監視
Chrome コンソールでは、特定の機能を監視できます。 例えば`func1`という関数があるとします。
```
var func1 = function(x, y, z) {
//....
};
```
そうすると、コンソールで`monitor(func1);`を追加すると、`func1`関数が呼び出されるたびに、渡された値が記録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623071/afd04555-50f8-3d07-0335-3cfe834665e5.png)

# まとめ
Chromeでのデバッグ方法を７つ紹介しました。
ぜひご活用ください。
Flutterでアプリリリースしたって話

この記事は海洋大技術系サークル Advent Calendar 2023の6日目です。

## はじめに
こんにちは！
Qiita記事を書き始めてから、二日に１投稿ペースでQiita記事を書いてる大学生です。
アドベントカレンダーで毎回締め切りに追われてる感じがします。笑

今回は、私がFlutterでモバイルアプリをリリースした件について話していこうと思います。
また、この記事を書く背景として、私がFlutterで最初のアプリ開発をした経験談と、これから個人開発をしようとしている人へ少しでも参考になればと思いこの記事を書きました。
## リリースしたアプリ紹介
下のURLが、私が初めて個人開発をしたモバイルアプリです！


https://play.google.com/store/apps/details?id=com.newexample.famous_quote_app

簡単にこのアプリを紹介すると、このアプリはユーザーの好きな時間に名言を通知して、人々のモチベーションを上げてくれる名言通知アプリです！

## 名言通知アプリを作る背景
このアプリを作る背景としては、自分が普段の筋トレや勉強をしている時にモチベーションが保てないということがありました。
そんな時、私はよく名言系のmadを見てモチベーションを高めているのですが、その名言をスマホで通知してくれたらよくね？！
と思い名言通知アプリを作ろうと思いました。

## 苦労したこと
#### ローカル通知がなかなか動かなかったこと
Flutterのflutter_local_notificationsを使ってローカル通知機能をつけるときに、
```
void initializeNotification(){
    flutterLocalNotificationsPlugin.initialize(
    const InitializationSettings(
      android: AndroidInitializationSettings('ic_stat_'),
      iOS: initializationSettingsIOS（）,←これ
    ),
  );
  }

```
initializationSettingsIOSの部分では: iOSデバイスで通知を初期化するための設定なのですが、これが当時最新のflutter_local_notificationsのバージョン（15.1.1）では動かなかったのです。

そのため、公式ドキュメント見たり、記事を漁ったり、ChatGPTに聞いたりしましたが、なかなか解決しませんでした。公式ドキュメントは、その時更新されていなかった。

しかし、ある記事を見つけて
initializationSettingsIOS（）→DarwinInitializationSettings()に変わったよという記事を見つけて解決しました。（その記事のURLは探し中です。）
これを見つけるのに何日かかったのやら。

今検索してみるとDarwinInitializationSettings()って書いてる記事結構見つかるんですよね。おそらく自分の検索力がまだまだだったのでしょうね。（反省）

でも、これはハッカソンの時にもあった話なのですが、公式ドキュメントが間違っていたり更新されてないことがある時に記事を漁って解決する力は必要ですよね。
（Qiitaバンザイ）

#### 申請まで時間がかかったこと
また、アプリをリリースするためのGoogle PlayとApp Storeに申請するのが初めての場合結構時間がかかりました。ライセンスとか証明書とか。

## App Storeにはリジェクトされまくっている件

今現在では、Google Playには、アプリをリリースできているのですが、App Storeには リジェクトされまくっています笑

理由は、**4.3.0 Design: Spam**という項目に違反しているということです。
簡単にいうと、アプリが独自性や創造性を欠いている、または他の既存のアプリと非常に似ているから、ユニークなアプリを作れってことらしいですね。

App Storeで名言通知アプリと検索したところ、自分の上位互換のアプリがあり、ここで初めて自分の作ったアプリが世の中で似たようなものがあることに気がつきました。

しかし、そこで諦めるのではなく、自分のアプリならではの良さをアピールしたりUIに操作方法を載せたりとPDCAサイクルを回しましたが、４回くらいリジェクトされました笑。
けれど、これからもアプリをリリースできるように追加の機能をつけて申請します！


## まとめ
色々ありましたが、とにかくアプリを作れてよかったというのが第一です。

次アプリを作るとしたら、似たようなアプリがないことは先に見た方がいいですね。
次に作りたいアプリの構想はできているので、楽しみです。自分が普段こんなのあったら便利だよなっていうものを考えていて、そのコンセプトはApp Storeにはないので、多分通るはず！
自分の身近な人や多くの人に使ってもらいたいですね！

いつかApp Store　にリジェクトされまくった件っていうタイトルで、リリースできたよ！っていう記事書きたいですね笑
AI-102試験対策のまとめ「LUISにおけるエンティティの種類」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### LUISにおけるエンティティの種類
* エンティティは、ユーザーの意図に関連する項目/要素  
⇒発話から抽出できるデータを定義するもの  
    | 発話 | 予測される意図 | 抽出されたエンティティ | 説明 |
    | --- | --- | --- | --- |
    | I want to order a small pizza | orderPizza | small | `Size`エンティティは`small`として抽出 |
    | Buy 3 tickets to New York | buyTickets | 3, New York | ・`ticketsCount`エンティティは`3`として抽出 <br>`Destination`エンティティは`New York`として抽出 |
* エンティティを作成するには、名前と種類を指定する必要がある

#### **リストエンティティ**
* 固定かつ限定された関連単語セットとそのシノニムを表す
* 複数のシノニムやバリエーションを認識し、それらの正規化された出力を抽出可能
* 照合は大文字と小文字が区別され、完全に一致している必要がある
    | 正規化された値 | シノニム |
    | --- | --- |
    | Small | `sm`,`sml`,`tiny`,`smallest` |
    | Medium | `md`,`mdm`,`regular`,`average`,`middle` |

#### **正規表現エンティティ**
* 指定された正規表現パターンに基づいてエンティティを抽出
* 構造化テキスト、または特定の形式で想定される英数字値の定義済みシーケンスに最適
    | エンティティ | 正規表現 | 例 |
    | --- | --- | --- |
    | Flight Number(便名) | `flight [A-Z]{2} [0-9]{4}` | `flight AS 1234` |
    クレジットカード番号 | `[0-9]{16}` | `5478789865437632` |

#### **事前構築済みのエンティティ**
* 日付、時刻、数字、測定値、通貨など、一般的な情報の種類を認識するためのセットが含まれている
* 動作は事前にトレーニングされており、変更はできない
    | エンティティ | 値の例 |
    | --- | --- | 
    | PersonName | James, Bill, Tom |
    | DatetimeV2 | `2019-05-02`, `May 2nd`, `8am on May 2nd 2019` |

#### **Pattern.Anyエンティティ**
* エンティティの開始位置と終了位置を示すためにパターンのテンプレート発話でのみ使用される可変長プレースホルダー
* 特定のルールやパターンに従っており、構文構造が固定された文への使用が最適
    | 発話の例 | パターン | エンティティ |
    | --- | --- | --- |
    | Can I have a burger please? | `Can I have a {meal} [please] [?]` | burger |
    | Can I have a pizza? | `Can I have a {meal} [please] [?]` | pizza |

#### **機械学習(ML)エンティティ**
* コンテキストを使用し、ラベル付けされた例に基づいてエンティティを抽出
* 機械学習アルゴリズムに依存しており、アプリケーションに合わせて正しく調整するにはラベル付けが必要
* 常に正しい形式とは限らないものの同じ意味を持つデータの識別に最適
    | 発話 | 抽出されるproduct(商品)エンティティ |
    | --- | --- |
    | I want to buy a book | `book` |
    | Can I get these shoes please? | `shoes` |
* 1つのMLエンティティは、それぞれが独自のプロパティを持つ、より小さいサブエンティティで構成可能
    - Addressエンティティの例
        - Address：4567 Main Street, NY, 98052, USA
            - Building Number：4567
            - Street Name：Main Street
            - State：NY
            - Zip Code：98052
            - Country：USA

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/luis/concepts/entities

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「QnA Makerクライアントライブラリを使用したナレッジベースの作成」**

https://qiita.com/fsd-jume/items/fdfc240b7f88378481ae

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
実際にアジャイルをやってみて感じたこと

元々ウォーターフォール開発をしていて
今アジャイル開発（スクラム開発）を3年ほどしています。

<br>

今では、「これからもアジャイル開発をやっていきたいな」
と思うくらい魅力を感じています。
（まだ序ノ口の魅力しか感じられてないかもですが）

# はじめに
初めの1年弱くらいは

>手順は分かった。
>目的や意図もなんとなく分かった。
>…けどなんか上手くいっている感じがしない

みたいな感じでした。

ですが色々繰り返すうちに、現在、少しは
アジャイル的な思考回路になってきた気がします。
<br>

自分の考えを整理するためにも
備忘メモを残したいと思います。



:::note info
前置きですが、私はウォーターフォールを否定するつもりはありません。
「ウォーターフォールと比較してより良い」といった表現に
なってしまっている箇所があるかと思いますが
アジャイル開発の良さを書きたいだけなのです。
:::

# 短期間で繰り返しリリースを行う開発
<img width="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469116/a70e210c-1922-7618-a40d-d37414398300.png">

出典：[^1]


両者の比較といえばこういった図です。
* ウォーターフォール
  * 要望のシステムに対して、各工程を順に実施して最後に一度だけリリースする
* アジャイル
  * 要望のシステムに向かって、各工程を順/並行に実施して、動かせるシステムを何度もリリースする


<br>

この

> 要望のシステムに「向かって」、
> 各工程を順または「並行」に実施して、
> 「動かせる」システムを「何度も」リリースする

という進め方による、具体的な違いはどう出てくるのか？
私が実際に経験して感じたものの一つに

> 成果物・計画の作り方が全く違う

があります。


今回は一旦はじめのメモとして
ある絵を見ながら、上記について感じたことを書いていきます。


# 

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469116/61ba3c98-68e0-476a-f1d3-f39d1ea78567.jpeg">

出典：[^2] 


<br>
「ある地点からある地点までより速く移動できるように」という顧客要望から
移動可能なものを常に作っているというものです。

徒歩よりは早く移動できそうなスケボー、スケボーより方向転換しやすそうなキックボード…という形かと思います。
<br>

この図を見ると
そうそう、アジャイルは下の図のようにやってくんだよな〜と思うのですが
私は、気付かぬうちに上の図のように進めてしまっていることがあります。

<br>

それは個人的には

* とりあえず常に顧客が使えるように作る
* 発想の転換

の不足が一因としてあるなのかなぁと思いました。



## とりあえず常に顧客が使えるように作る

アジャイル開発のよくある誤解で

> ウォータフォールよりも早く手戻りなくリリースできる

というものがあるかと思います。

「最短経路で」や「必要になるもののみ作るから」みたいなことを
指しているのではと思いますが、この考え方で臨むと
上の図のようにいきがちなのかなぁと思いました。

<br>

一見上の図のように各パーツを作っていく方が
作った全てのものが無駄にならない
（4の段階で全て使用されている状態）し、
着実に最短経路で完成形に向かっているような気がしてしまうからなのかなと…。

<br>

でも、そうすると絶対に「とりあえず常に顧客が使える」形で作れない気がします。
上の図みたいに「あと、これとこれのパーツが揃えばいけるんです…！」という感じでズルズルとのびます。

<br>

あと実際の現場は、完成形が本当に「車」なのかも
実はあやしい形で進んでいくのではと思います。

新しく作る機能だと、0の状態から完成形を明確にイメージするのは
そもそもとても難しいことのはずです。

<br>

だからこそ、上記絵での顧客の要望は「速く移動できるようにしたい」なので

> 「もちろん今後どんどん改良を重ねていく予定ですが
> 一旦徒歩よりは速く移動できそうなスケボーを作りました」

という形で
常に顧客が使えるものを作成し・使ってもらって・FBをもらう…を繰り返していくように進めていく必要があるんだと思います。

<br>


## 発想の転換

結構大事なのではと思っています。

<br>

「この機能を一旦こういう風にすれば、すぐ出来るし一旦使える状態にはなるか」とか
「この機能は必須だと思っていたけど、要望的にはこういう風にすれば、一旦無くてもいけるんでは？」
という感じで、言葉にするとそうでもな感じなんですが

システム開発に落とし込むと、もはや「発見」に近い感覚があります。

でも前述の下の図のように進める時に
効率よく確実に進めるには、必須なのではと思っています。


<br>

この発見を、少しでも早く確実にできるようにするために
私が意識しているのは、以下です。

* 顧客が欲しいものでなく、顧客がどういうことが出来るようになりたいのか
* 機能もっと削れるはず
* 開発コストもっと削れるはず
* 少しだけ「いや流石にそれは…」みたいなことも持ち出してみる

<br>

「欲しい」をイメージするとあれもこれもってなりがちですが

「最低限どういうことができないと操作がままらないか」や
「今よりマシにするには最低限何がいるか」

という感じで考えながら
チームメンバーとあれこれうんうん話していると
発見出来ているような気がします。

<font color=gray>（今も絶賛試行錯誤中です）</font>

# 最後に
言語化が難しい。
語弊のある・誤解を招くような書き方になっているかもしれないです。

続きはまた別途書きたいです🏃‍♀️

[^1]: https://seleck.cc/agile
[^2]: https://blog.crisp.se/2016/01/25/henrikkniberg/making-sense-of-mvp
[OCI] Oracle Cloud コンソールへのログイン履歴を確認する

## Oracle Cloud コンソールへのログイン履歴を確認してみる
OCIのリソースが突然なくなった事象が発生し、原因を探す必要がでてきました。
その過程でコンソールへのログイン履歴を確認しました。

:::note warn
Oracle Cloudの仕様変更が予定されており、2024年5月以降は方法が変わる可能性があります
:::

## IDCSのログインレポート確認方法

OCIにはOCIの監査ログとIDCSの監査ログがあります。
今回IDCSの監査ログの話です。
直近ではIDCSの監査ログをみれば問題ないと思います。
ドメインの構成によって多少操作が異なります。

「ドメイン」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/c3442ba9-7381-01c8-c801-ff2800d610f2.png)

OracleidentityCloudServiceを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/7a18bdf0-2967-4a90-92f4-421c015d7ef9.png)

左のメニューから「レポート」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/85e64ce1-f15c-c62a-938d-aae866abcf16.png)

ユーザー・データ・レポートのエリアに直近30日の ログイン成功回数と失敗回数が表示されます。
成功の方の「レポートの表示」からログイン履歴が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/31d936ec-be69-023c-e686-f2f37f9a1aff.png)

ユーザ名とともに、ログイン日付が表示されました。
上部の「開始日」「終了日」でレポートを表示する条件を指定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/2950ef6e-3bbd-e819-e12a-e5ef83c6a51b.png)

失敗のレポートはコメント欄に理由が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2551183/8ed334e4-6fe0-e5d3-6b43-ba6eb47855dc.png)
フレームワークを改修した話（laravel-admin）

こんにちは！

前回、[フレームワークを改修した話（Ethna）](https://qiita.com/yam_dev/items/a6c18eb19ad66f11c0b9)を書きました。

今回は、laravel-adminを改修（カスタマイズ）した経験について書こうと思います。

# はじめに
サービス開発を行なう際、ユーザー画面だけでなく、管理画面も必要ですね。
要件定義で様々なご要望をいただくのですが、利用するフレームワークによって、以下のパターンに分かれます。
- すぐに実現できる機能
- カスタマイズしないと実現できない機能

フレームワークは便利ですが、万能ではありません。
そこで、どのようにカスタマイズできるか、というのが大事になります。

今回は、お客さまのご要望を実現するために奮闘したお話です。

# どのような要件だったか

たとえば、このような画面。
よくある検索画面です。
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/5bfb4c7b-4e77-e740-6d34-986541a1d540.png)

ここで、エンジニアとユーザーで検索機能に対するイメージに違いが生じることがあります。

**エンジニア：**
項目間（会社名と担当者名など）はANDで検索すればOK！
絞り込んだ方が効率がいいので、問題なし。

**ユーザー：**
できるだけ広く検索したいから、AND/ORを選びたい。
ANDだけだと、見つからない可能性があるかも。

この検索画面では、これですね。
![bbb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/5419118d-668d-264d-0a7c-c24e63a92529.png)

なぜ？？と思う方もいらっしゃるかもしれませんが、要望されるお客様は、とても多いです。
お客さまの運用に合わせて作るべきなので、ここはお客様のご要望が正となります。

## 普通にできるのでは？
そうですね、たいていの場合は、オーバーライドしてうまいことやれば、実現は可能です。
しかし、今回使ったライブラリでは、それができなかったんです。

# 利用したライブラリ
laravel-adminのGridを使いました。

## Gridとは
Gridは検索フォームや一覧画面の表示、フィルタリングを行うライブラリです。以下のように使用します。
```php
$query->where(.......)
```

## OrとかOrWhereを使ったらいいのでは？
そうなんです。あれば使えばいいんです。
ところが、無かったんです。。
Filterクラスを確認してみましたが、ありませんでした。（私の見落としだったらすみません）
![スクリーンショット 2023-12-06 2.54.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/9fdd645f-625e-27c6-f3a7-832523748efe.png)

## では、どうするか
そうなると、選択肢は2つあります。
- 他のフレームワークやライブラリを使う
- 思い切ってカスタマイズする

前者だと理想的ですが、私は後者を選択しました。
理由は単純で、前者を選択すると、絶対に納期に間に合わなかったんです:innocent:

# どのようにカスタマイズしたのか
- src/Grid/Filter.phpにorWhere、orWhereBetween、orWhereInを追加
![スクリーンショット 2023-12-06 2.55.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/0dcf4a88-fd5e-9434-f4aa-06ad1ea54915.png)

- where、between、inを複製し、orが使えるように修正
![スクリーンショット 2023-12-06 2.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407770/9f1916b0-d382-daef-17de-a3e6f188fe71.png)

これによって、無事にorWhereが使えるようになりました:slight_smile:

バージョンアップしたときが心配ですが、そこはドキュメントに明記してあります。

# まとめ
ライブラリを選択する際は、カスタマイズのしやすさを前提で選択した方がいいです。
しかし、要件の変更などで当初の想定と異なることもしばしば。
まずは要件を最優先で、どんなご要望にも応えられるカスタマイズ力を身につけましょう！
BigQueryテーブルをパーティション分割するストアド

巨大なBigQueryテーブルを適切な列でパーティション分割するとパフォーマンスの向上が望めます。

https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja

しかし、ALTER TABLE文でパーティション分割はできないので、既存のテーブルのパーティション分割をするストアドを作成しました。

対応しているパーティションテーブルのタイプは時間単位列パーティションニングで日単位のパーティションのみですが、多くのケースでこれで十分です。
https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja#date_timestamp_partitioned_tables

```sql
create procedure `プロジェクトID.データセットID.partitionize_table`(project_id string, dataset_name string, table_name string, partition_key string)
begin
  declare backup_dataset_name string default '作業中のバックアップテーブルを配置するデータセット';
  declare backup_table_name string default table_name || "_backup_" || format_date("%Y%m%d", current_date("Asia/Tokyo"));
  declare create_backup_table_statement string default format("create table %s.%s.%s copy %s.%s.%s;", project_id, backup_dataset_name, backup_table_name, project_id, dataset_name, table_name);
  
  declare partitionized_table_name string default table_name || "_partitionized_" || format_date("%Y%m%d", current_date("Asia/Tokyo"));
  declare partition_expression string;
  declare partition_key_data_type string;
  declare create_partitionized_table_statement string;
  
  -- パーティション列の型によってPARTITION BY句を生成する
  -- TODO: 他の型の対応や、1時間・1ケ月などの異なるパーティション分割単位の指定
  execute immediate format("select data_type from %s.%s.INFORMATION_SCHEMA.COLUMNS where table_name = '%s' and column_name = '%s'", project_id, dataset_name, table_name, partition_key) into partition_key_data_type;

  case partition_key_data_type
  when 'TIMESTAMP' then set partition_expression = "partition by date(" || partition_key || ")";
  when 'DATETIME' then set partition_expression = "partition by date(" || partition_key || ")";
  when 'DATE' then set partition_expression = "partition by " || partition_key;
  else RAISE USING MESSAGE = "Unsupported type of partition_key: " || partition_key_data_type;
  end case;

  -- パーティション分割されたテーブルを生成するSQL文
  set create_partitionized_table_statement = format("create table %s.%s.%s %s as select * from %s.%s.%s;", project_id, dataset_name, partitionized_table_name, partition_expression, project_id, dataset_name, table_name);

  -- 最初にバックアップテーブルを作成する。この後の処理でオリジナルテーブルが喪失した場合にここから復旧させる
  execute immediate create_backup_table_statement;

  -- パーティション分割されたテーブルを作成する
  execute immediate create_partitionized_table_statement;

  -- オリジナルテーブルを削除してバックアップテーブルに置き換える
  -- drop tableの完了からalter table renameの完了までの期間はテーブルが存在しなくなり、参照する処理が落ちるので要注意
  execute immediate format("drop table %s.%s.%s;", project_id, dataset_name, table_name);
  execute immediate format("alter table %s.%s.%s rename to %s;", project_id, partitionize_table_name, table_name);

  -- バックアップテーブルを削除する
  execute immediate format("drop table %s.%s.%s;", project_id, backup_dataset_name, backup_table_name);end;
```
[PMO領域]機能実装からPMO業務に関わり始めて

こんにちは、Latte@社内業務の人です:information_desk_person_tone2:
ProductDesignチームでPMOやそれに紐づく機能実装や保守を行なっています。
<b>この記事は [airCloset Advent Calendar 2023](https://qiita.com/advent-calendar/2023/air-closet) の 07 日目です。</b>

#### 今回は今期関わった業務（PMOとしての案件進捗管理）について書こうと思います。
(去年・一昨年はPMO業務における機能実装の具体として、GASと各種アプリケーションとの繋ぎ込みに関する実装方法についての記事を[Zenn](https://zenn.dev/lattest)で書いていました。)

## 前提となる管理構造
- 全体感(案件単位)管理
    - SpreadSheet
(見え感)
![スクリーンショット 2023-11-29 15.13.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/f3ff7d58-eb3f-8fa2-e3e5-37c094cae4aa.png)
- 案件ごとの詳細管理
    - Backlog
    - Slack
(見え感)
![スクリーンショット 2023-11-29 15.12.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540209/c5b744cc-ea74-be0f-1dc3-a1cbf3830d31.png)

## 課題感とアクション
- <b>[進捗管理]Backlogが更新されないので案件の正しい進捗具合が把握できない　→ リリース日遅延</b>
    - 更新されない要因のヒアリング
    - 案件内でのリマインド強化
    - 使いやすい＆分かり易い機能化と運用改善

## どうなったか
- <b>[進捗管理]</b>
    - 遅延率が約19%ほど改善した 

## 具体例
#### ヒアリングからの施策
■ 誰に対する何をヒアリングしたか
 　→実際に実装と更新作業を行うエンジニアへ更新が漏れる要因について仮説と合わせて確認
■ここから判明したこと
　→バッチで事前通知機能はあるものの一定、見落としがある 
　→期日管理・進捗に関わるステークホルダーになっている時といない時で対応の有無が分かれる
    
■対応したこと
> 一定、見落としがある

 →フォーマットを作り、日次のリマインドを強化する
 
> 期日管理・進捗に関わるステークホルダーになっている時といない時で対応の有無が分かれる
    
　→前後関係を把握してステークホルダー担当者に後続担当者の作業時間確保と連絡の依頼を行う
 
■変化したこと
<b>Good</b>
・遅延数が総数に対して1/2~2/3程に減少した
・リマインド前に連絡や更新が行われることが増えた

<b>More</b>
・属人的に遅延が起こるということと、リマインドを無くした時も継続して遅延が起こらないという保証がない

## 最後に
元々通知機能があるところに属人的なリマインドを追加することで改善はあるのか？という疑問がありましたが、数値で見ても結果がでたので驚いています。
実際に自分が動いたことでわかることもあり、機能化のメリットだけでなく属人的に行うことのメリットも感じました。
現在、今回の対応で改善したものとは別に発生する課題が判明しています。
今回のように一つずつ課題改善し、より使いやすい体制へと整えていけたらと考えます。
<br>
[エアークローゼットのアドベントカレンダー2023](https://qiita.com/advent-calendar/2023/air-closet)はまだまだ続きますので、ぜひ他のエンジニア、デザイナー、PMの記事もご覧いただければと思います。

また、エアークローゼットはエンジニア採用活動も行っておりますので、興味のある方はぜひご覧ください！
[![採用特設ページ](https://slack-imgs.com/?c=1&o1=ro&url=https%3A%2F%2Fcorp.air-closet.com%2Fimages%2Frecruiting%2Fogp.jpg)](https://corp.air-closet.com/recruiting/pmo-designer-2/)
urllib.request.urlopenはエラーメッセージを捨てる

## バージョン
Python 3.11.6

## 何が起きたか

外部モジュールを使わずに[**Notion API**](https://developers.notion.com/reference/intro)を叩こうと以下のようなコードを書いていました。

```python:分かりやすくしてます.py
from json import dumps, loads
from urllib import request

endpoint = "https://api.notion.com/v1/pages/**"
headers = {
    "Authorization": "Bearer **",
    "Notion-Version": "2022-06-28",
    "Content-Type": "application/json",
}
payload = {
    "properties": {
       "リリース日": {
            "date": {
                "start": "2023-12-01"
            }
        }
    }
}
req = request.Request(endpoint, dumps(payload).encode("utf-8"), headers, method="PATCH")
try:
    with request.urlopen(req) as res_:
        res = loads(res_.read().decode("utf-8"))
        ...
except Exception as err:
    ...
```

このコードはしばらくの間なにごともなく動いていたのですが、ある日ログにこのようなメッセージを見つけます。

```
HTTP Error 400: Bad Request
```

なんもわからん。

とりあえずExceptionに何か入ってるだろうと思い中身を漁ってみても`Bad Request`以上の情報が見つからず…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245527/bdad2109-e4cc-df79-fdee-85b34f156eaa.png)

[**APIリファレンス**](https://developers.notion.com/reference/patch-page)を見るとどうやらレスポンスのbodyにオブジェクトが入っているらしいということが分かったので、試しにcurlから同様のリクエストを送ってみました。

```bash: リクエスト
curl 'https://api.notion.com/v1/pages/**' \
  -X PATCH \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer **' \
  -d '{"properties":{"リリース日":{"date":{"start":"2023-12-01"}}}}'
```

すると…

```json: レスポンス
{
  "object": "error",
  "status": 400,
  "code": "validation_error",
  "message": "リリース日 is not a property that exists.",
  "request_id": "**"
}
```

めちゃくちゃ書いてありました。
あとはこれを`urlopen()`のどこかから見つけることが出来ればOKです。

## どうしたのか
結論から言えば無理でした。

[**urlopen**](https://docs.python.org/ja/3/library/urllib.request.html#urllib.request.urlopen)や[**HTTPError**](https://docs.python.org/ja/3/library/urllib.error.html#urllib.error.HTTPError)の仕様を確かめにいったのですが、やはり`urlopen()`がステータスコード4\*\*や5\*\*を受け取った場合に送出する`HTTPError`にはbodyの内容は渡されていないようです。

というわけで諸々の条件を考えた結果、今回はsubprocess経由でcurlを呼び出すことにしました。

```python: curl使う.py
from json import dumps, loads
from subprocess import run

endpoint = "https://api.notion.com/v1/pages/**"
headers = {
    "Authorization": "Bearer **",
    "Notion-Version": "2022-06-28",
    "Content-Type": "application/json",
}
payload = {
    "properties": {
       "リリース日": {
            "date": {
                "start": "2023-12-01"
            }
        }
    }
}
proc = run(
    ["curl", "-Ssi", endpoint, "-X", "PATCH"]
    + [opt for hd in [f"{k}: {v}" for (k, v) in headers.items()] for opt in ["-H", hd]]
    + ["-d", dumps(payload)],
    capture_output=True,
    encoding="utf-8",
)
h, b = proc.stdout.split("\n\n")
res = {
    headers: h.split("\n")
    body: loads(b)
}

...

```

当然実行環境にcurlがインストールされている必要があるぶん汎用性は落ちますが選択肢のひとつに持っておいて損はなさそうだなと思います。
主要な言語のHelloWorld

# #1 はじめに
メリークリスマス！！←早くない？？
いかがお過ごしでしょうか！！
僕はめちゃくちゃ元気ですよーー！！←風邪引いてます
:santa:｛今日はみんなにささやかなプレゼントを贈るよ！！）
今回は主要な言語のHelloWorldの例についてまとめてみました。

# #2 さっそく見てみよう
### C
~~~helloworld.c
#include <stdio.h>
int main(void)
{
	printf("HelloWorld\n");
	return 0;
}
~~~

### Python
~~~helloworld.py
print("HelloWorld")
~~~

### Java
~~~helloworld.java
public class Main {
    public static void main(String[] args) {
        System.out.println("HelloWorld");
    }
}
~~~

### Javascript
~~~helloworld.js
console.log("HelloWorld")
~~~

### PHP
~~~helloworld.php
<?php
    echo "Hello World！";
?>
~~~
# #3 さいごに
今回は主要な言語のHelloWorldをまとめてみました。
この記事が皆さんの助けになれば幸いです。
第一世代　AIBO Data Wizardの表示内容についてのメモ

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の9日目です。

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
この記事について作者はいかなる責任も負いません。
置き換えるファイルはバックアップを取ることをお勧めします。
:::

メモリースティックにまとめて記録されているers-11xのモーションや音声の圧縮ファイルはAIBO Data Wizardで展開することができるようです。

#### AIBO Data Wizard
AIBO Data Wizardは.odaというモーションや音声の圧縮ファイルを展開するためのツールのようです。
AiboPet's AiboHack Siteが紹介していました。ありがとうございます。
https://www.aibohack.com/111/wizard.htm

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/31bdfbf4-04fd-0227-60e7-c17ba7d12fa3.png)

今後、モーションや音声を変更するにあたりどこにあるか知っておく必要がありますが、それぞれのモーションや音声はグループ分けされていたので、その内訳を調べてまとめました。

Extraxt AIBO Dataをクリックすると、Editable Data Pathの場所にしていたModeにあるモーションや音声のファイルが展開されました。
下記はAIBO-ware ver1.1 ERA-111Mの結果です。

#### mode0とmode1
ともにファイル数が170でした。
aibohackの紹介にあるように、mode1のファイルをリネームしたものがmode0に入っているようです。
AIBO BrowserのBrowse actionで見つかるのはMode1の方の名前でした。

例　std018.mtn
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/df5bbc3d-dc70-47f8-21b9-bab4df1adee3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/3e6df320-8f28-9d85-76c4-b125ee8644bc.png)

#### mode2とmode3
ともにファイル数が827でした。
mode2のファイル名はARAWやMRAWから始まるファイルが多く、それに続く名前のファイルがmode3にありました。

例　aku_sit3.mid
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/578ed57f-f6da-089c-02ec-f1ffd6da5d87.png)

#### mode4
ファイル数が997でした; (mode0) 170 + (mode2) 827 = 997ということだと思います。

YART 11xの場合、一部のmodeで展開時にエラーが発生しました。

#### まとめ
圧縮ファイルであるODAファイルを展開するAIBO Data Wizardの結果を、AIBO BrowserやYART 11xの表示内容と対比しました。
上記のようなファイルのありかを把握しておくことで、入れ替えるモーションや音声のファイル名を決めやすくなると思います。