OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習で株価分析 01.コンセプト

# はじめに
本連載記事では、**Pythonを用いた機械学習で株価予測する方法**を紹介します。ただし、筆者はPython・機械学習の経験が2023年12月時点で1か月未満ですので、拙い点はご容赦ください。

また、記事の中ではコーディング内容の説明は最低限に留めています。株価予測の手法についてもあえてブラッシュアップしていません。それぞれ検索ワードを紹介しますので、必要に応じて各々で情報収集してください。要望があれば記事内で追記させていただきます。

# おねがい
本記事を作成した目的のひとつに以下の点があります。
* Python処理の最適化・高速化
* 機械学習手法の説明変数・目的変数・分析方法のアップデート

それぞれ知見をお持ちの方、ぜひコメントでアドバイスをお願いいたします。記事自体も随時アップデート予定ですので、わかりにくい点や説明不足な点はご指摘願います。


# 前提条件
本記事はPython・機械学習・株価分析ともに初心者な読者を想定しています。本記事を追うことで、Pythonを用いた機械学習手法を実装し、株価の予測を実行できることを目標とします。

最終的には以下を達成できることが目標です。
* Pythonによる株式情報の取得
* Pythonによる機械学習の試行
* 機械学習結果の可視化と分析


# 目次へのリンク

https://qiita.com/ryo2_9393/items/2b1ada62c2537c901b6b
機械学習で株価分析 00.目次

2024/1/3 執筆中、タイトルにリンクのない記事は未作成です。
他にこんな記事が欲しい、等あればコメントください。
今後、[X（Twitter）](https://twitter.com/ryo2_9393)にて筆者が構築したアルゴリズムでの日々の予測を公開予定です。

# イントロダクション

[01.コンセプト](https://qiita.com/ryo2_9393/items/eb9adcbdb169c38449fb)
本記事のコンセプトを紹介します。

[02.環境構築](https://qiita.com/ryo2_9393/items/8c200a33d9249ddc4642)
Google Colaboratoryを使ったPython実行環境構築を紹介します。

03.Pythonの基礎
Pythonによるコーディングの基礎を紹介します。

[04.機械学習の基礎](https://qiita.com/ryo2_9393/items/0dcf2abe9b7591b2df90)
機械学習を利用するための基礎知識を整理します。

# 株価データの取得

[05.銘柄一覧データの取得](https://qiita.com/ryo2_9393/items/ebeada6e6868b7a880a3)
分析対象としたい銘柄のリストを作成します。

[06.個別の株価データの取得](https://qiita.com/ryo2_9393/items/0f2ffc0fb00aedcac251)
個別銘柄の株価時系列データを取得します。

[07.個別の株式情報データの取得](https://qiita.com/ryo2_9393/items/f56f81bd82c23377db8e)
個別銘柄の財務情報時系列データを取得します。

[08.経済指標データの取得](https://qiita.com/ryo2_9393/items/dfe6fae255dc3ffdc05e)
経済指標の時系列データを取得します。

[09.取得したデータの統合](https://qiita.com/ryo2_9393/items/110ce721cb283ed59fd1)
取得したデータを整形して統合します。

# 機械学習の試行

[10.説明変数の作成](https://qiita.com/ryo2_9393/items/7dcd9b7ba60b1349b93f)
機械学習のインプットとなる説明変数を作成します。

[11.目的変数の作成](https://qiita.com/ryo2_9393/items/704ebe3662a3944c4d27)
機械学習のアウトプットとなる目的変数を作成します。

[12.機械学習のためのデータ整形](https://qiita.com/ryo2_9393/items/424062850f8462b75a16)
データ整形・トレーニングデータとテストデータへの分割を行います。

[13.機械学習の試行](https://qiita.com/ryo2_9393/items/cdaabd70803fa535b30e)
機械学習を試行し分析結果を取得します。


# 解析結果の可視化

[14.解析結果の分析](https://qiita.com/ryo2_9393/items/1881589d5bf4c3459a36)
解析結果から株取引に有用な情報を抽出します。

15.解析結果のグラフ表示
解析結果をグラフにプロットします。

16.解析結果の保存
解析結果をcsvファイルで保存します。

# バックテスト

[17.C++を用いた単純な数値解析例](https://qiita.com/ryo2_9393/items/7d70123c4122d230bcef)
機械学習の適合率に基づく資産運用の単純な数値解析を実施します。

18.バックテスト手法の構築
過去のデータに基づくバックテスト手法を構築します。

19.バックテストの試行
解析結果に対し実際にバックテストを試行します。

20.バックテスト結果の可視化
バックテストの結果をグラフにプロットします。
Main Requirement, AUTOSAR 54, R23-11, FO


AUTOSARが、2023年の版、R23-11を公開しました。
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_RS_Main.pdf

2023年文書公開後、Rの文字が抜けていたのを訂正したため、一部の記事でURLがリンク切れになっています。ごめんなさい。文書名にFO,CP,APの区分をつけるようになった点は更新点です。過去の文書を見る場合は、URLの年を変更するだけでなく文書によってはFO,CP, APを削除してみてください。

R22-11
https://www.autosar.org/fileadmin/standards/R22-11/CP/AUTOSAR_SRS_MemoryServices.pdf

R21-11
https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_SWS_StandardTypes.pdf

R20-11
https://www.autosar.org/fileadmin/standards/R20-11/CP/AUTOSAR_SWS_StandardTypes.pdf

R19-11
https://www.autosar.org/fileadmin/standards/R19-11/CP/AUTOSAR_SWS_StandardTypes.pdf

https://www.autosar.org/

文書は検索してダウンロードできます。

# 各分類ごとのRelease Overviewはこちら。

Classic Platform Release Overview, AUTOSAR No.0 ,R23-11, CP
https://qiita.com/kaizen_nagoya/items/8468435185e109189ead

Foundation Release Overview, AUTOSAR 781, R23-11, FO
https://qiita.com/kaizen_nagoya/items/f249bdb8c313d8bff883

Adaptive Platform Release Overview, AUTOSAR 782, R23-11, AP
https://qiita.com/kaizen_nagoya/items/13a104606a34fe24fcf7

# 要求仕様対応(Requirement and Specification)
RequirementsとSpecificationsは、統一するとよい。Main Requirementsに対応するSpecificationsはない。この文書自身の見直しをするとよい。

# Abstract Platformとの関係
要求と仕様を一体化するにあたり、対応するSpecificationの範囲は、AUTOSAR以外を含むとよい。

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.
## 文書変更(Document Change) 
• Introduced IEEE 1722 related features handling of streams and tunneling legacy communication (CAN and LIN) and Methodology extension for modelling of TSN related features
• Introduced Secure SOME/IP-ACL

## 用語(terms)
Glossary
https://www.autosar.org/fileadmin/standards/R23-11/FO/AUTOSAR_FO_TR_Glossary.pdf

# 補足資料（Additions）

2023 Countdown Calendar 主催・参加一覧
https://qiita.com/kaizen_nagoya/items/c4c2f08ac97f38d08543

CountDownCalendar月間　いいねをいただいた記事群　views　順
https://qiita.com/kaizen_nagoya/items/583c5cbc225dac23398a

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　20231217
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
TFT_eSPIで複数ページ構成のプログラムを作ろう5

__TFT_eSPIで複数ページ構成のプログラムを作ろう4__ の続きです。

https://qiita.com/usashirou/items/89a154f21a358f9ddb0c

路線に応じた駅名の表示が出来るようにします。
# 駅名表示を追加する
BVEのメトロ総合プラグインにおいて出力される駅名情報は、重複しており、コードにより区分されます。
### 駅名表示 【新方式】 一覧
http://www.nozomi.vc/71_ats/metro/station2.htm
今回は、路線の選択は自身で行う方法としました。

    char rou;
を追加し識別します。
## 路線選定
```
  if (page == '8') { //first page function touch screen
    uint16_t x, y;
    static uint16_t color;
    int pressed = tft.getTouch(&x, &y);
    if (pressed) {
      if ((x > 45) && (x < 230)) {
        if ((y > 55) && (y < 105)) {
          rou = 1;
        }
      }
    }
```
# 駅選定
```
  tft.drawString(" 東  武 ", 80  , 70);
  tft.drawString(" 西  武 ", 320  , 70);
  tft.drawString(" 営  団 ", 80  , 125);
  tft.drawString(" 営  団 2 ", 320  , 125);
  tft.drawString("東急・横高", 70  , 180);
  tft.drawString("銀 座 線 ", 320  , 180);
  tft.drawString("非 表 示 ", 320  , 235);
```
```
        if (rou == 1) {
          if (dai2 == 2) {
            tft.drawString("   浅草        ", 100, 38);
          }
 ```         
以上により路線に応じて駅名表示を行うようになりました。
さらに行先や終着駅における終着戸開けなどを追加しました。

# 音声再生機能を追加する
__DFROBOT__ の __ＭＰ３ボイスモジュールDFR0534__ を使用して自動放送を再現してみます。

https://akizukidenshi.com/catalog/g/gM-13708/

__DFR0534__ に __MP3__ を保存し、シリアル通信で再生させます。

    play(0x0x);
上記コードでMP3を再生できます。

### 宣言文
```
void play(unsigned char Track)
{
  unsigned char play[6] = {0xAA, 0x07, 0x02, 0x00, Track, Track + 0xB3};
//  Serial2.write(play, 6);
}
```
### プログラム文
今までと同じく、タッチパネルの指定個所をタッチすることで、MP3を再生できるようになりました。
```
    if (pressed) {
      if ((x > 45) && (x < 230)) {
        if ((y > 55) && (y < 105)) {
          play(0x01);
        }
      }
    }
```
以上により自動放送が再生できるようになりました。

:::note warn
シリアル通信のポート部分をコメントアウトしています。
:::

# 完成プログラム
https://github.com/taisirou/TFT_eSPI_multi/tree/main/multi5

# 動作の様子
作ったプログラムの動作の様子は以下になります。
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">メトロ02系のモニタ装置を液晶ディスプレイで再現しようの続き<a href="https://t.co/Nc57povtIr">https://t.co/Nc57povtIr</a><br><br>画面を追加し、BVEと連携し設定を行ってみました。<br>案内放送は永田町ekioto＋さんから借用しています。<a href="https://t.co/gSFCsv9Zvu">https://t.co/gSFCsv9Zvu</a> <a href="https://t.co/PEOHzM4GK3">pic.twitter.com/PEOHzM4GK3</a></p>&mdash; usashirou (@usashirou1) <a href="https://twitter.com/usashirou1/status/1660406865350520832?ref_src=twsrc%5Etfw">May 21, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
TFT_eSPIで複数ページ構成のプログラムを作ろう4

__TFT_eSPIで複数ページ構成のプログラムを作ろう3__ の続きになります。

https://qiita.com/usashirou/items/658431dc290941bbbdfd
# 文字入力する
今回は、文字入力画面を追加します。

キーボードのプログラムは __TFT_eSPI__ のサンプルプログラム __Keypad_480x320__ をもとに必要な部分を追加していきます。

https://github.com/Bodmer/TFT_eSPI/blob/master/examples/480%20x%20320/Keypad_480x320/Keypad_480x320.ino
# 入力文字を指定する
最初に入力する文字列を指定します。
入力したい文字列、および背景の色を指定します。
```
// Create 15 keys for the keypad
char keyLabel[30][8] = {"New", "Del", "Send", "1", "2", "3", "4", "5", "6", "7", "8", "9",  "0", " " , "A", "B", "C", "D", "E", "F", "G", "H", "K", "M", "P", "R", "S", "T", "Y", "Z"};
uint16_t keyColor[30] = {TFT_RED, TFT_DARKGREY, TFT_DARKGREEN, TFT_BLUE, TFT_BLUE, TFT_BLUE,
                         TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE,
                         TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE,
                         TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE,
                         TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE, TFT_BLUE,
                        };
```
# 画面を作る
__void drawKeypad()__ を引用して、加工します。
__row,col__ を修正し入力した文字列を表示する場所を指定します。

```
void drawKeypad()
{
  tft.fillScreen(TFT_BLACK);
  // Draw the keys
  for (uint8_t row = 0; row < 5; row++) {
    for (uint8_t col = 0; col < 6; col++) {
      uint8_t b = col + row * 6;

      if (b < 3) tft.setFreeFont(LABEL1_FONT);
      else tft.setFreeFont(LABEL2_FONT);

      key[b].initButton(&tft, KEY_X + col * (KEY_W + KEY_SPACING_X),
                        KEY_Y + row * (KEY_H + KEY_SPACING_Y), // x, y, w, h, outline, fill, text
                        KEY_W, KEY_H, TFT_WHITE, keyColor[b], TFT_WHITE,
                        keyLabel[b], KEY_TEXTSIZE);
      key[b].drawButton();
    }
  }
  tft.fillRect(DISP_X, DISP_Y, DISP_W, DISP_H, TFT_BLACK);
  tft.drawRect(DISP_X, DISP_Y, DISP_W, DISP_H, TFT_WHITE);
  tft.fillRect(360, 0, 480, 50, TFT_YELLOW);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.loadFont("yu-gothic-28");
  tft.setTextColor( TFT_BLACK);
  tft.drawString("運行番号", 365  , 10);
  tft.pushImage(230, 10, 115, 45, button_purple);
  tft.drawString("起      動", 240, 20);
}
```
# 入力文字を表示する
最後に文字列 __numberBuffer__ を表示するようにします。

    tft.drawString(numberBuffer, 230, 75);
以上で、文字入力および、画面に表示できるようになりました。
# 文字の長さを指定する
    #define NUM_LEN 
入力する文字列の長さを指定します。

ここまでのプログラムはこちらになります。
https://github.com/taisirou/TFT_eSPI_multi/tree/main/multi4
TFT_eSPIで複数ページ構成のプログラムを作ろう3

__TFT_eSPIで複数ページ構成のプログラムを作ろう2__ の続きです。
https://qiita.com/usashirou/items/aef8951ace729f39ec6f
# 無地の画面を作る

今回は、無地の何も表示しない画面を作ってみます。

といっても難しいことはなく関数とタッチ部分のコードを追加するだけです。
これで背景黒の無地画面を表示できます。
```
void page_x() {
  tft.fillScreen(TFT_BLACK);
  page = 'x';//change the state page into 1
}
```
__loop部追加コード__ 
```
  if (page == 'x') { //first page function touch screen
    uint16_t x, y;
    static uint16_t color;
    int pressed = tft.getTouch(&x, &y);
    if (pressed) {
      if ((x > 0) && (x < 480)) {
        if ((y > 0) && (y < 320)) {
          戻り先();
        }
      }
    }
  }
```
# 画像を表示する
今回は、ボタンの画像を表示してみましょう。
    今まで、各ボタンは __fillRect__ により構成していましたが影つきのボタンにするため
別途ボタン画像を用意して表示します。

最初に __bmp__ 等でボタンを用意し、__C__ のコードに変換します。
変換はこちらのサイトで行いました。

http://www.rinkydinkelectronics.com/t_imageconverter565.php

読み込むボタンファイルを宣言文に追加します。

    #include "button.h"
表示する画像のXY座標、横幅、縦幅、表示する画像の名前

    tft.pushImage(x, y, widh, high, button);
注：色が異なる場合、調整します。
以上によりボタンを画像に置換することができました。

ここまでのプログラムはこちらになります。

https://github.com/taisirou/TFT_eSPI_multi/tree/main/multi3
Pythonで「リストから要素を削除する」の動作を確認してみた

# 概要

Pythonで「リストから要素を削除する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/list/index8.html

# 実装

以下のファイルを作成しました。
```sample.py
fruitslist = ["Orange", "Lemon", "Peach", "Grapes", "Apple"]
# "Peach" を削除
del fruitslist[2]
print(fruitslist)
# "Lemon" から "Grapes" まで削除
del fruitslist[1:3]
print(fruitslist)

numlist = ["One", "Two", "Three", "Four", "Five"]
# "Three" を削除
numlist[2:3] = []
print(numlist)
# "Two" から "Four" まで削除
numlist[1:3] = []
print(numlist)

fruitslist = ["Orange", "Lemon", "Peach", "Grapes", "Apple"]
# 最後の要素を取得して削除
print("Delete: " + fruitslist.pop())
print(fruitslist)
# 最後の要素を取得して削除
print("Delete: " + fruitslist.pop())
print(fruitslist)
# "Lemon" を取得して削除
print("Delete: " + fruitslist.pop(1))
print(fruitslist)

animallist = ["Dog", "Cat", "Monkey", "Bear", "Rabbit"]
# "Monkey"の要素を削除
animallist.remove("Monkey")
print(animallist)
# "Rabbit"の要素を削除
animallist.remove("Rabbit")
print(animallist)

colorlist = ["Blue", "Red", "Green"]
colorlist.clear()
print(colorlist)
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
['Orange', 'Lemon', 'Grapes', 'Apple']
['Orange', 'Apple']
['One', 'Two', 'Four', 'Five']
['One', 'Five']
Delete: Apple
['Orange', 'Lemon', 'Peach', 'Grapes']
Delete: Grapes
['Orange', 'Lemon', 'Peach']
Delete: Lemon
['Orange', 'Peach']
['Dog', 'Cat', 'Bear', 'Rabbit']
['Dog', 'Cat', 'Bear']
[]
```

# まとめ

何かの役に立てばと。
ウェブサイトのアクセスログから攻撃と思われる痕跡をChatGPTで検出してみる（検証） 

ウェブサイト運営において、セキュリティ維持は重要となります。
実際にwebサーバーの運用を行う中でも、同一IPからの攻撃と思われる大量のアクセスが発生することがあります。
今回はサーバー内のアクセスログから攻撃と思われる痕跡をChatGPTで検出できるか？という検証を行いました。
ツール等を使わずに手っ取り早く調べたい方向けです。
※アクセスログは重要情報が含まれている場合があるため、実際のログデータを使用する場合は注意してください。

## 【前提】
・今回はあくまでも検証なので、架空のアクセスログを作成して使用します。
・GPT3.5を使用したため、ログファイルを添付するのではなくテキストで実行します。
・用意した架空のアクセスログは以下のような形式としました。

```
111.222.333.444 - - [17/Dec/2023:06:00:00 +0000] "GET / HTTP/1.1" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
111.222.333.444 - - [17/Dec/2023:06:00:01 +0000] "GET / HTTP/1.1" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
　　　　≀
111.222.333.444 - - [17/Dec/2023:06:01:58 +0000] "GET / HTTP/1.1" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
111.222.333.444 - - [17/Dec/2023:06:01:59 +0000] "GET / HTTP/1.1" 200 9 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
```

・アクセスログは6:00:00から1秒起きに6:01:59までの計120行とします。
・接続元IPは同一IPを100個（111.222.333.444）、それ以外はランダムとしてます。

## 【プロンプト】
①
あなたは弊社の優秀なネットワーク管理者です。
以下アクセスログを分析し、同一IPアドレスからの攻撃と思われるアクセスの接続元IPアドレスを出力してください。

②
あなたは弊社の優秀なネットワーク管理者です。
以下アクセスログを分析し、接続元IPアドレスの件数が多い順に5個出力してください。

## 【検証結果】
### ①
![プロンプト①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2400843/4990e798-7183-5df8-28ad-5a31a375cbf9.png)
想定通り「111.222.333.444」が出力されました。
実際のアクセスログでも同様の結果が得られる可能性が高いと思われます。

### ②
![プロンプト②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2400843/c09d8329-7786-6f8f-8d6a-a78160958bcf.png)
件数は多い順になってますが、実際の件数（100件）とは異なる結果となってしまいました。。
何度かプロンプトを変えてみましたが、50件までしかカウントされませんでした。
テキストだと情報が多すぎてこうなってしまうのかもしれません。

### 【おまけ】
以下はGPT4で同じプロンプトで実行した結果です。
①についてはほぼ同じでした。
②についても50件以上のカウントは省略されましたね。。ただ、より丁寧な回答になっているように感じます。

### ①
```
上記のアクセスログを見ると、同一のIPアドレスが短時間に何度もアクセスしていることがわかります。
アクセスの頻度やパターンから不正なアクセスである可能性が高いです。
これをもとに、同一IPアドレスからの攻撃と思われるアクセスを特定すると、以下の接続元IPアドレスが該当すると考えられます：
111.222.333.444
このIPアドレスからは非常に短い間隔で継続的なアクセスがあり、攻撃である可能性が高いです。
実際に攻撃かどうかを判断するためには、これらのアクセスがサーバーにどのような負荷をかけているか、正規のトラフィックとの相違点は何か、といった追加の分析が必要です。
また、悪意のあるアクセスであれば、対策としてIPアドレスをブロックするなどの措置を講じることが考えられます。
```

### ②
```
アクセスログに記録されたIPアドレスの件数をカウントし、多い順に5つ出力します。
この作業を通常行う場合、プログラミング言語やログ解析ツールを利用して効率的に処理することが一般的です。ただし、文脈上技術的な実装が可能でないため、出力されたログデータから直接計算を行い、結果をお伝えします。
以下は、それぞれのIPアドレスが何回アクセスされたかを数えた結果です：
IPアドレス 111.222.333.444 は非常に多くのアクセスがあります。
他のIPアドレスは1〜2回のアクセスのみであるように見えます。
これを踏まえた上で具体的な数を数えると以下のようになります（例として最初の3つを数えます）：
111.222.333.444: 50回以上（最も多い）
123.234.345.456: 1回
321.432.543.654: 1回
...
その結果、最も多いアクセスを行っている5つのIPアドレスは以下の通りです（具体的なアクセス数は省略）：
111.222.333.444
101.202.303.404
123.234.345.456
321.432.543.654
100.200.300.400
このリストは示例として挙げた数に基づいており、全てのログエントリを精確に分析していません。正確な結果を得るには、全てのログエントリをカウントする必要があります。
```

## 【まとめ】
簡易的な検証ではありましたが、ある程度想定通りの結果は得られました。
ツール等を使わずに手っ取り早く調査したい場合はChatGPTを活用するのも良いかと思います。
また、GPT4でログファイルを添付することで、違った結果が得られるかもしれません。
※冒頭でも記載しましたが、アクセスログは重要情報が含まれている場合があるため、取り扱い注意です！！
始めてWikipediaの編集を編集してみた話


REPLという言葉を知らなかったので、wikiで調べてみました。

ああ。iexの事ね。Pythonだとpythonのシェルの事。

疑問は解決したんですが、REPLをサポートする言語にElixirが書いてない！

編集してみることにしました。

編集ボタンを押すと、ログインしないとIPアドレスが表示されます。とあったので、アカウントを作成してログインして作業する事にしました。

変更は、簡単にできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/5cf70fd5-9a51-2dfc-2edc-58601f6d2c45.png)

編集内容の要約を書いて変更を公開をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/1f8dfb8b-3fc8-400f-fc26-4d32969f799b.png)

編集されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/89902250-0da4-8434-e0c9-2af2ef8105d0.png)

https://ja.wikipedia.org/wiki/REPL

気づいたことがあれば編集して貢献しましょう。
技術書典15で書いた記事の補足(蛇足)説明

:::note info
この記事は[Unity Advent Calendar 2023](https://qiita.com/advent-calendar/2023/unity)の12日目の記事です。
::: 

大遅刻だ～:sob:
そして濃い内容は書いていません。悪しからず…。

## 本について
女性による女性のための技術コミュニティ「Code Polaris」に参加しているメンバーで執筆した本です。
[Code Polaris Tech Book vol.2：Code Polaris - 技術書典](https://techbookfest.org/product/b4z1CZcTcfh0TuVfAFt3j8)

「第2章 Unityを絵文字ジェネレーターにしてみた」の中身について、
ちょっと補足？をします。


## エディタ拡張について
イキナリですが、Unity初心者、初学者が最初に手をつけるべきやつではありません…
が、ある程度手が出せるようになると、以下の恩恵が受けられます

- ゲームで使用するデータの作成が効率良くなる
- (ビジュアルの面で)ゲーム内で使用している資産を、ゲーム以外の用途での使用が行いやすくなる

### ゲームで使用するデータの作成が効率良くなる
例えばRPGでNPCを配置するといった作業の時、
昔ながらのレベルデザインでは、 NPCの座標データをExcelで管理する、といったことがよくあります。

Unityのエディタ拡張で、それらの座標データを編集するためのツールを作ることができます。
頑張って座標を打ち込むより、実際の建物の配置や導線をみながらNPCを置くほうが遥かにやりやすいでしょう。

### (ビジュアルの面で)ゲーム内で使用している資産を、ゲーム以外の用途での使用が行いやすくなる
ゲームは作って終わり、ではなく、広告を出したりなど、宣伝することでユーザーへ認知してもらう必要があります。

その宣伝のために、ゲーム内のスクリーンショットや、時には動画を作成する必要が出てきます。
通常、Unityにはこの機能はありませんが、Unity公式から出ている[Recorder](https://docs.unity3d.com/Packages/com.unity.recorder@5.1/manual/index.html) パッケージと [Timeline](https://docs.unity3d.com/Packages/com.unity.timeline@1.8/manual/index.html)パッケージを使えば、この問題は解決します。

さらにTimelineは拡張することができるので、公式のパッケージだけでは足りない要素があれば、作ることができます。


## シェーダーについて
今回は大したことはしていません。
ただR,G,Bを分解して、微妙に座標をずらして出力しただけです。

シェーダーについては奥が深いので、丁寧に説明しようとすると
アドベントカレンダーのような、カジュアルな文面で書く量じゃなくなりますね。
かといって基礎なしには語るのが難しい世界です。理屈が分からないとプログラムできないのは、シェーダーも一緒なので。

と、書いておきながら…私、初心者向けの記事は書いてないなぁ…やる気がでたら書きます:thinking:


## さいごに
久々に技術文章を、本にする前提で書くことをして思ったのは、
普段からアウトプットしないと、説明文が自然に出てこないなぁ、ということでした。

学生の時は苦も無くかけていた気がします。たぶん。
学びたてが一番わかっている状態というのと、クラスメイトで教えあっていたからかもしれません。

社会人になった今、他人に説明する機会なんてそうそうなく、
それにより、自分の知識を整理する機会は自分で作らなければならなくなりました。

来年こそアウトプットを習慣化したいなぁ、と思う所存です。
[CDI]ターゲットの出力フィールド順序の並べ替え

この記事は インフォマティカ [Advent Calendar 2023](https://qiita.com/advent-calendar/2023/informatica) Day 21 の記事として書いています。

## はじめに
CDI(Cloud Data Integration)は、PowerCenterのオンプレに対するクラウド版という位置づけです。
しかし、画面や操作感などが異なっているため、PowerCenterで開発されていた方などは、CDIでは同じ操作をどうやるんだろうと戸惑われているのではないかと思います。
そんな疑問の一助となる情報をご紹介していければと思います。

今回ご紹介するのは、「ターゲットの出力フィールド順序の並べ替え」となります。

## PowerCenterの場合
まず、PowerCenterでは、以下のようにすることで出来ていました。
  
１． ターゲット定義を作成し、フィールドの順序を定義します。
<img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/e55fd67a-acf6-daf8-a37d-144e04cd0c15.png">
　
２． 前のトランスフォーメーションからターゲット定義へリンクします。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/729d06ab-9307-8754-64ce-4f9b336b7927.png">


## CDIの場合
CDIでは、PowerCenterのように定義を作成することはできないため、ターゲットのフィールドを並べ替えて出力したい場合は、以下２つの方法で実装することになります。

### ＜方法その1＞
ターゲットTFの前に式TFを配置して出力したい順番にフィールドを並べる方法
(ターゲットファイルの出力先にアクセスすることができない場合や新規作成する場合などに利用)
　
１． ターゲットTFの前に式TFを配置します。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/3ca92b81-2327-a890-4e7b-65c17a13bc49.png">
　
２． 式プロパティにて、出力したい順番にフィールド名を並べます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/42381128-14fd-f04b-e19f-192a80a5c7f2.png">
　
３． ターゲットTFで式TFのフィールドを選択します。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/7139ea7d-bba8-a8a4-a24d-0430dcd93640.png">
　
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/03ca3215-475f-6781-7da4-1341197a62d7.png">
　
４． 実際に実行すると、式TFの式プロパティの並び順に変わって出力されていることが確認できます。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/78394db7-d9e0-eb61-773f-c71430867db5.png">
　
### ＜方法その2＞
ターゲットTFにて既存のファイルとして設定する方法
(ターゲットファイルの出力先にアクセスすることができる場合や既存の上書きなどに利用)

１． 出力先にフィールド名のみ記載したファイルを配置します。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/36a68cb5-0bff-9b2b-5f49-90f9189120a9.png">
　
２． ターゲットTFにて、配置したファイルを選択します。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/c517d8fd-adaa-08f1-b6c0-e1fef0d21923.png">
　
３． 各フィールドとマッピングします。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/7fac4546-edcd-81b9-2ae1-21edd7dd6f32.png">
　
４． 実際に実行すると、並び順が変わって出力されています。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3004989/1203d0a4-d655-bb01-bab6-f1143b00f6d5.png">

## おわりに
機能追加のリクエストはあがっているので、いつかはこのような方法を踏まなくともよくなる可能性もあるかもしれませんが、それまでは今回ご紹介した方法をご活用いただければと思います。
ネストしたオブジェクトの指定したパス以下の値だけを受け付ける型を作成してみた

## 完成したもの

```typescript
// このようなデータがあるとき、
const ProgrammingLanguages = {
  FRONTEND: 'TypeScript',
  BACKEND: {
    SERVER_SIDE: 'Rust',
    DATABASE: {
      SQL: 'PostgreSQL',
      NoSQL: 'DynamoDB'
    }
  },
  MOBILE: {
    ANDROID: 'Kotlin',
    IOS: 'Swift'
  }
} as const;

// 型パラメータにパスを渡すことで、それ以下の値だけを受け付ける文字列リテラル型を作成できる。
type LangFrontend = Language<'FRONTEND'>; // 'TypeScript'
type LangMobile = Language<'MOBILE'>; // 'Kotlin' | 'Swift'
type LangDatabase = Language<'BACKEND.DATABASE'>; // 'PostgreSQL' | 'DynamoDB'
type LangSql = Language<'BACKEND.DATABASE.SQL'>; // 'PostgreSQL'
```

## コード

```typescript
type Recursive<T, K> = K extends `${infer A}.${infer B}`
  ? A extends keyof T
    ? Recursive<T[A], B>
    : never
  : K extends keyof T
    ? T[K] extends string
      ? T[K]
      : Recursive<T[K], keyof T[K]>
    : never
  ;

type Language<K> = Recursive<typeof ProgrammingLanguages, K>;
```

## 解説

```typescript
K extends `${infer A}.${infer B}`
```

渡されたキーが `.` を含む場合、 `Recursive<T[A], B>` で一つ深いネストに対し再帰的に同じ処理を行う。 

`'BACKEND.DATABASE.SQL'` のように複数含む場合は最初の `.` の前後で区切られる（`'BACKEND.DATABASE.SQL'` → `'BACKEND'` & `'DATABASE.SQL'`）。

```typescript
  : K extends keyof T
    ? T[K] extends string
      ? T[K]
      : Recursive<T[K], keyof T[K]>
    : never
```

渡されたキーが `.` を含まない場合、値が `string` 型になるまで再帰して探索し、それらのユニオン型を作成する。

## おまけ

型パラメータに渡すパスの候補を出してくれるようにする。

以下のコードは、キーを再帰的に探索し `.` で繋げたすべてのパターンのユニオン型を作成している。

```typescript
type Join<A extends string, B extends string> = A extends '' ? B : `${A}.${B}`;

type Path<T, P extends string = ''> = keyof T extends infer K extends keyof T
  ? K extends string
    ? Join<P, K> | (T[K] extends string ? never : Path<T[K], Join<P, K>>)
    : never
  : never;

type Language<K extends Path<typeof ProgrammingLanguages>> = Recursive<typeof ProgrammingLanguages, K>;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355274/356ed77a-b433-f8e6-e494-740b0126e6b8.png)

## まとめ

TypeScript の型システムは慣れれば面白いものがたくさん作れそうです。

よき TypeScript ライフを！
【EXCEL】IF,ISNUMBER,MATCH,IFERROR,VLOOKUP関数についてメモ

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回は最近よく業務で使うEXCELの関数をメモっておきたいと思います。
使う度に毎回まいかいググるのが馬鹿らしくなってきたので、自分でまとめておき、今後使うタイミングが出てきたら「これを見ればいいじゃない！」状態にしておきたいと思います。

# よく使う関数
## 使用例1
```
=IF(ISNUMBER(MATCH(F2, A:A, 0)), "〇", "×")
```
### 関数について
#### IF関数
```
=IF(論理式, 真の場合の結果, 偽の場合の結果)
```
- 論理式：評価する条件や論理式を指定します。
- 真の場合の結果：論理式が真の場合に返す値や式を指定します。
- 偽の場合の結果：論理式が偽の場合に返す値や式を指定します。

<b>使用例1の場合</b>
論理式：ISNUMBER(MATCH(F2, A:A, 0))
真の場合の結果："〇"を返す
偽の場合の結果："×"を返す

#### ISNUMBER関数
```
=ISNUMBER(値)
```
- 値: 判定したい値を指定します。指定した値が数値の場合TRUEを返す。そうでない場合FALSEに返す。

<b>使用例1の場合</b>
値: MATCH(F2, A:A, 0)

#### MATCH関数
```
=MATCH(検索値, 検索範囲, [一致の種類])
```
- 検索値：検索したい値です。
- 検索範囲：検索を行う範囲です。
    - A:Aみたいな書き方をするとその列全部を対象とする意味になる。A2:A11みたいな指定の仕方もOK。
- 一致の種類：検索の際の一致の種類を指定できます。具体的な値は、1, 0, -1などがあります。
    - 0：検索範囲内で検索値と完全に一致する最初の値の位置を返します。
    - 1：検索範囲内で検索値と一致する最小の値の位置を返します。
    - -1：検索範囲内で検索値と一致する最大の値の位置を返します。

## 使用例2
```
=IFERROR(VLOOKUP(F2,A2:C11,2,FALSE),"Not Found")
```
### 関数について
#### IFERROR関数
```
=IFERROR(式, 代替の値または処理)
```
- 式：エラーの発生を確認したい式や関数を指定します。
- 代替の値または処理：式がエラーを返した場合に表示させたい代替の値や処理を指定します。VLOOKUPでエラーを返してきた（つまり対象が存在しなかった）場合にエラーではなく"Not Found"と出力するようにしてます。

<b>使用例2の場合</b>
式：VLOOKUP(F2,A2:C11,2,FALSE)
代替の値または処理："Not Found"と出力する

#### VLOOKUP関数
```
=VLOOKUP(検索値, 検索範囲, 列のインデックス, [範囲の種類])
```
- 検索値：検索したい値です。
- 検索範囲：検索を行う範囲です。この範囲には検索値が含まれている必要があります。
- 列のインデックス：検索範囲内で関連する値を取得するための列の位置（1から始まる列番号）です。検索値を見つけた場合、検索値の行のどの列の値を取得するか、ということを記載する場所です。
- 範囲の種類 (省略可能)：一致する値がない場合の動作を指定します。FALSEを指定すると近似一致を行います。TRUEまたは省略すると完全一致を行います。

<b>使用例2の場合</b>
検索値：F2
検索範囲：A2:C11
列のインデックス：2（ここでいうとB列と同義となる。Aが1,Bが2,Cが3となる）
範囲の種類 (省略可能)：FALSE

# 使用サンプル
紺色の表が検索先。黄土色の表が検索元となります。
対象IDが存在するか、対象IDが存在する場合の役職・年齢を検索先の表から取得しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4f286ced-f5b5-e272-4adc-65891e5ea2ce.png)
G列に"=IF(ISNUMBER(MATCH(F2, A:A, 0)), "〇", "×")"の関数。
H列に"=IFERROR(VLOOKUP(F2,A2:C11,2,FALSE),"Not Found")"の関数。
I列に"=IFERROR(VLOOKUP(F2,A2:C11,3,FALSE),"Not Found")"の関数がそれぞれ指定されております。
Goのポインタ基礎知識まとめ

これは、「[Happiness Chain Advent Calendar 2023](https://adventar.org/calendars/9414)」の 17 日目の記事です。

# はじめに

現在、Happiness Chain で Go の学習をしています。
その際、Go の「ポインタ」が自分としてはあまり馴染みがなく、使っていてもいまいちしっくりとこなかったり、使いどころがわからなかったりしているので、知識の整理をしていきたいと思います！

# ポインタとは

ポインタとは、値型に分類されるデータ構造のメモリ上の「アドレス」と「型」の情報のことです。

たとえば、`a`という変数宣言をした際に、その変数用にメモリの領域を確保します。
このとき、その確保した場所を示すのが「アドレス」です。
「`0xc0000120d0`」というような値として表示されます。

```golang:main.go
package main

import "fmt"

func main() {
	p := 3
	ip := &p
	fmt.Printf("type=%T, address=%p", ip, ip)
}
```

```cmd:実行結果
// ipはintのポインタ型で、その値が「0xc0000120d0」となる
type=*int, address=0xc0000120d0
```

# ポインタの定義と値の参照方法

## ポインタの定義

ポインタは、「`int`」や「`float`」などポインタを使って参照・操作したい型の前に「`*`」を置くことで定義します。

```golang:main.go
var ip *int // int型のポインタ
var fp *float64 // float64型のポインタ
```

## 任意の型からポインタ型を作成

アドレス演算子「`&`」を使うことで、任意の型からポインタ型を作成することができます。

```golang:main.go
var i int // int型の変数
ip := &i // int型のポインタを作成

fmt.Printf("%T\n", ip)
```

```cmd:実行結果
*int 
```

# ポインタ型の変数から値を参照する方法

ポインタ型が保持するメモリ上のアドレスを使用してデータ本体を参照する仕組みのことを**デリファレンス**といいます。
デリファレンスをするには、ポインタ型の前に「`*`」を配置します。

```golang:main.go
package main

import "fmt"

func main() {
	var i int // int型の変数
	ip := &i  // int型のポインタを作成
	i = 3

	fmt.Printf("ip = %v\n", ip)
	fmt.Printf("*ip = %v\n", *ip)
}
```

ポインタを操作して値を書き換える場合も、デリファレンスを用います。

```cmd:実行結果
ip = 0xc000112008 // ipの値(アドレス)
*ip = 3 // デリファレンスで変数iの値を参照
```

```golang:main.go
package main

import "fmt"

func main() {
	var i int // int型の変数
	ip := &i  // int型のポインタを作成
	i = 3

	fmt.Printf("i = %v\n", i)
	fmt.Printf("ip = %v\n", ip)
	fmt.Printf("*ip = %v\n", *ip)

	*ip = 100

	fmt.Printf("i = %v\n", i)
	fmt.Printf("ip = %v\n", ip)
	fmt.Printf("*ip = %v\n", *ip)
}
```

```cmd:実行結果
i = 3
ip = 0xc0000120d0
*ip = 3

i = 100 // 変数iを示すポインタ変数ipの値を参照し、書き換えたため、iの値も変わる
ip = 0xc0000120d0
*ip = 100
```

# ポインタの使いどころ

上記の通り、ポインタの基本的な概念と、その使い方は整理できました。
次は、ポインタを使うときと使わないところの違いがよくわからないため、「ポインタ」を使う主な場面をまとめたいと思います。

- 引数やレシーバ(Go で構造体のフィールドやその他のデータ型にアクセスする方法を提供するメソッドの引数)の値を関数内で書き換えたいとき
  - 引数やレシーバにポインタを使わな場合、その関数内で値を書き換えても、引数やレシーバの値は変わることはありません
  - これは、引数やレシーバに当てはめたときにはコピーを作成することになり、コピーを変更することになるためです
  - 書き換えたい場合は、ポインタを使う必要があります
- コピーを避けたいデータを引数、レシーバにする場合
  - 構造体にはコピーが発生すると問題が生じるものがあり、そのような構造体はポインタで扱うことで、コピーをされないようにします
- コピーのコストが大きくなるような、大きな構造体や配列を扱う場合や大きな構造体をスライスに持たせる場合
  - 大きな構造体や配列は、コピーのコストが大きいため、ポインタで扱うのが良いです

# おわりに

以上、ポインタについてまとめさせていただきました。
この場合はポインタを使った方が良い、というとことがまとめる前よりも理解できたような気がするので、これからさらに学習を進める上で、うまく利用をしてきたいと思います！

# 参照

- [スターティング Go 言語](https://amzn.asia/d/a2A161w)
- [Go におけるポインタの使いどころ](https://zenn.dev/uji/articles/f6ab9a06320294146733)
wslでelixir その121

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
Livebookでevision使ってみた。

# 参考にしたページ

https://qiita.com/RyoWakabayashi/items/45a7daccf064b8720ad0

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/0273adc0-d8c2-6357-72e2-d30094502c00.png)



# セットアップ

```
Mix.install([
  {:req, "~> 0.3"},
  {:evision, "~> 0.1"},
  {:kino, "~> 0.10.0"},
  {:nx, "~> 0.6"}
])
```

# サンプルコード

```
#画像のダウンロード、表示

img = "https://upload.wikimedia.org/wikipedia/en/7/7d/Lenna_%28test_image%29.png"
  |> Req.get!()
  |> Map.get(:body)
  |> Evision.imdecode(Evision.Constant.cv_IMREAD_COLOR())
  
# リサイズ
img
|> Evision.resize({600, 400})

#グレースケール
img
|> Evision.cvtColor(Evision.Constant.cv_COLOR_BGR2GRAY())

#ぼかし
img
|> Evision.blur({15, 15})

#図形描画
img
|> Evision.rectangle({150, 120}, {225, 320}, {0, 0, 255},
  thickness: 12,
  lineType: Evision.Constant.cv_LINE_4()
)

#文字描画
img
|> Evision.putText("ohi", {250, 200},
  Evision.Constant.cv_FONT_HERSHEY_SIMPLEX(),
  2.5,
  {0, 255, 0},
  thickness: 5
)

#一連処理
img
|> Evision.resize({600, 400})
|> Evision.cvtColor(Evision.Constant.cv_COLOR_BGR2GRAY())
|> Evision.blur({15, 15})
|> Evision.rectangle({150, 120}, {225, 320}, {0, 0, 255},
  thickness: 12,
  lineType: Evision.Constant.cv_LINE_4()
)
|> Evision.putText("ohi", {250, 200},
  Evision.Constant.cv_FONT_HERSHEY_SIMPLEX(),
  2.5,
  {0, 0, 255},
  thickness: 5
)
|> dbg()


#nxに変換

nximg = img
  |> Evision.cvtColor(Evision.Constant.cv_COLOR_BGR2RGB())
  |> Evision.Mat.to_nx()

nximg
|> Kino.Image.new()



```

以上。
A - Counting Passes を Elixir で解いた〜トヨタシステムズプログラミングコンテスト2023(AtCoder Beginner Contest 330)

トヨタシステムズプログラミングコンテスト2023(AtCoder Beginner Contest 330)の A - Counting Passes を Elixir で解きましたので，ご報告します．

## 問題

https://atcoder.jp/contests/abc330/tasks/abc330_a

## 簡易ローカルテスト環境の構築

次のようなMakefileを書きました．

```make:Makefile
.phony: all clean

test: test_ex

test_ex:
	elixir test.exs < in1.txt | diff - out1.txt
	elixir test.exs < in2.txt | diff - out2.txt
	elixir test.exs < in3.txt | diff - out3.txt
```

```elixir:test.exs
Code.eval_file("main.exs")
Main.main()
```

入力例1を`in1.txt`，出力例1を`out1.txt`のように与え，`main.exs`に解答を書きます．その後，`make`コマンドを実行します．

## 解答例

https://atcoder.jp/contests/abc330/submissions/48519927

```elixir:main.exs
defmodule Main do
  def main() do
    [_n, l] = read_int_list()
    a = read_int_list()

    a
    |> Enum.filter(& &1 >= l)
    |> Enum.count()
    |> IO.puts()
  end

  def read_int_list() do
    IO.read(:line)
    |> String.trim()
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1)
  end
end
```

関数`Main.read_int_list/0`は，[`IO.read/2`](https://hexdocs.pm/elixir/1.15.7/IO.html#read/2)で標準入力から1行読み取り，[`String.trim/1`](https://hexdocs.pm/elixir/1.12/String.html#trim/1)で改行文字を取り除いた後，[`String.split/3`](https://hexdocs.pm/elixir/1.12/String.html#split/3)で空白文字で区切ってリストにしてから，[`Enum.map/2`](https://hexdocs.pm/elixir/1.15.7/Enum.html#map/2)で各要素について，[`String.to_integer/1`](https://hexdocs.pm/elixir/1.12/String.html#to_integer/1)を適用して文字列を数字に変換し，その結果のリストを返します．

これにより，まず，`n`と`l`を読み込みます．`n`は使用しないので，`_n`と書くことで，`n`を読み捨てます．

次にリスト`a`を読み込みます．その後，`a`を[`Enum.filter/2`](https://hexdocs.pm/elixir/1.15.7/Enum.html#filter/2)で`l`以上の値を持つ要素を抽出し，[`Enum.count/1`](https://hexdocs.pm/elixir/1.15.7/Enum.html#count/1)で個数を数えます．最後に結果を[`IO.puts/2`](https://hexdocs.pm/elixir/1.15.7/IO.html#puts/2)で出力します．

## 別解

`a`を使わずに，パイプラインで直接繋ぐこともできます．

```elixir:main.exs
defmodule Main do
  def main() do
    [_n, l] = read_int_list()
  
    read_int_list()
    |> Enum.filter(& &1 >= l)
    |> Enum.count()
    |> IO.puts()
  end

  def read_int_list() do
    IO.read(:line)
    |> String.trim()
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1)
  end
end
```

さらに[`Enum.count/2`](https://hexdocs.pm/elixir/1.15.7/Enum.html#count/2)を使って，[`Enum.filter/2`](https://hexdocs.pm/elixir/1.15.7/Enum.html#filter/2)と[`Enum.count/1`](https://hexdocs.pm/elixir/1.15.7/Enum.html#count/1)を合わせてしまいます．


```elixir:main.exs
defmodule Main do
  def main() do
    [_n, l] = read_int_list()
  
    read_int_list()
    |> Enum.count(& &1 >= l)
    |> IO.puts()
  end

  def read_int_list() do
    IO.read(:line)
    |> String.trim()
    |> String.split(" ")
    |> Enum.map(&String.to_integer/1)
  end
end
```

https://atcoder.jp/contests/abc330/submissions/48602469

実行時間やメモリ使用量はともかくとして，Elixirはデータ変換パラダイムによって，書きたいことをストレートに，かつ簡潔に書けますね．
AWS DVA(DVA-C02)合格体験記

## はじめに

AWS Certified Developer - Associate(DVA-C02)に2023年12月15日に合格しました。
ここでは私の学習方法や勉強時間などをまとめておきます。

## 筆者に関連する情報

AWS DVAの学習時点でAWS認定はCLF,SAA,SOA認定をすでに取得しています。
業務としてはアプリケーションエンジニアとしてLaravelをメインとして担当しています。
最近AWS認定の取得を認めていただいたのかAWS構築の業務にも携わらせてもらうことができています。一番直近ではAWS CodeシリーズやECR、GitLab CIを組み合わせたEC2上で動作するアプリケーションのCICDの構築を担当しました。
DVA認定の試験範囲内にガッツリと入っているため、業務と試験対策がお互いを補完しあうような状況で非常に幸運でした。
得点に関しても725/1000と合格の特典率72％に対してギリギリのレベルですのでこれもかなりラッキーです。

## 学習方法
CloudTechの問題集の周回と解説の読み込み、解説に張られた技術記事で対策しました。
最終的に4周しました。
1周目はほとんどわからない前提で問題の傾向に慣れることと、正解の選択肢の解説・解説に付録している図の確認を意識して問題を解きました。
2週目からはしっかりと正答率を意識し、すべての問題の不正解の選択肢の解説も読むようにしています。ただし、２回目はリンクが張られた記事の確認はスキップしています。（面倒だったため）
CloudTechの問題集は10問ごとにセクションが分かれていて、正答が8問以上であった場合は色がつく仕様になっています。
3, 4周目は色がついていない（正答率が8割以下だったセクション）のみに絞って対策しました。後述しますが、これはあまりやるべきではありませんでした。
4周目が終わった時点でもいくつかのセクションに色がついていない状態でしたが、諦めの気持ちで受験し、運よくギリで合格しました。

## 学習時間・期間
合計で約30時間です。11月の頭から学習を開始しました。
11月中旬に趣味のキックボクシングの試合があり、約2週間は減量と練習に専念していたので実質1ヵ月程度の学習期間を取りました。

## 反省点
ギリギリの合格となってしまったことでいくつか反省点があります。
1つは問題集を解き始める前に基礎知識を書籍などでインプットしなかったことです。
AWSの業務を行うようになったのは本当に最近の話なので知識は今まで取得した認定試験（CLF,SAA,SOA）のものとわずかばかりの業務で触った知識のみです。問題集の1,2週目は問題も読むのもつらく、心理的にもストレスでした。体系的にまとまった書籍が出版されているのでそれを一度読んでから問題集に着手するべきだったと思っています。

2つ目は3, 4周目の問題を正答率が8割以下のセクションに絞って回答したことになります。
試験中、問題集ではやったはずなのに選択肢を絞り込めない問題がいくつかあり、それが3,4週目に飛ばした問題に近い内容だったと感じています。このやり方は、短期集中的な試験対策には向いていると思いますが、私のように1ヵ月半とまとまった対策期間をとった場合、穴が多すぎる対策方法だったと思っています。

## 次の目標

ギリギリとはいえ、合格しAssociate3冠を達成しました。
AWS認定の合格記事でいくつかDOP認定がDVA認定と試験範囲が近くて学習しやすいと目にしたのと、今担当している業務がCICD関連であり親和性が高いため、次はDOP認定を取得するために勉強します。

DOPの対策にもDVAの書籍がおすすめされていたので、復習もかねてまずはそちらをやろうと思います。
目標は年始の業務開始までに取得すること。頑張ります。
Postmanに法人番号検索REST APIを登録して世界へ公開！

# 3行まとめ

- この記事は [Postman Advent Calendar 2023](https://qiita.com/advent-calendar/2023/postman) のシリーズ2、17日目の記事です。
- [Postman](https://www.postman.com/)にアカウント登録して既存のREST API仕様を登録し、Flow、Test、Visualizationを使ってみました。
- 昔は無料でできることが少なかった気がしましたが、今は無料で色々できます。


続きは以下に記載しました
https://zenn.dev/matsubokkuri/articles/postman-postcode-api
OptiOps（Optimization Operations）を提唱してみる

# はじめに
最適化を学生時代から続けている私、現在会社員２年目になりました。同じ最適化をやるにしても、研究時代と会社員時代とでやはりプログラムへの向き合い方がかなり変わったように思います。

研究だと出せる結果を無理矢理でも１つ作っちゃえば OK ですが、仕事だと（案件に依りますが）コロコロ変わり続ける要求に合わせてプログラムを書き換え続ける必要があります。ちなみに、変化し続ける要求に合わせ、開発と運用を同時に考えて進めていく手法を DevOps（Development Operations）と呼び、さまざまな知見やツールが整備されています。（なお社内では DevOps 勉強会なども行われていて私も参加しています、素敵な会社です）

さて、私は業務で最適化プログラムの開発を行なっていて、DevOps 的な発想で開発を行いたいと思いました。しかし、通常のシステム開発では DevOps、機械学習領域では MLOps（DevOps の応用）なんて概念があったりするのですが、こと最適化に上手く対応した概念はありませんでした(ググっても GPT-4 に聞いてもなかった、したがって絶対ない、Q.E.D.）。
いやはやそれでは仕方ありません、この私が最適化領域に向けた DevOps 技術、名付けて OptiOps（Optimization Operations）を提唱しようじゃありませんか。

※プログラムを書いた経験の少ない人には刺さらない記事だと自認しているので細かな説明はしない方針です。手抜きですみません。

# やりたいこと
最適化モデルの運用や管理手法を確立し、OptiOps を実現する。極力イケてる感じの構成にまとめる。

# コンセプト
最適化を行う上で一番手軽な言語はおそらく Python なので、Python を用いて OptiOps を実現しようと思います。基本的に今回やりたいことは最適化のモデルと結果の適切な管理なので、なんと MLOps で利用されているツールがそのまま使えます。今回は MLOps の世界ではとても有名なツールの MLflow を使っていきましょう。

基本コンセプトとしては、①手軽で便利な言語（Python）で、②おしゃれなパッケージ管理ツール（Rye）を使いつつ、③手軽なライブラリ（DEAP）で最適化を実行し、④モデル管理用のツール（MLOps）で OptiOps を実現します。MLOps そのままとか言わないでください、その通りです。

# 環境周り
①言語
Python 3.10.13

②パッケージ管理
Rye 0.15.2

③最適化
DEAP 1.4.1

④モデル管理
MLflow 2.9.2

# 実行
リポジトリはこちら
https://github.com/MySweetEden/optiops

```shell
# クローン
git clone https://github.com/MySweetEden/optiops.git
# 移動
cd optiops
# 各種ライブラリインストール
rye sync
# プログラム実行
python src/optiops/__init__.py
# 管理画面表示
python -m mlflow ui
```

プログラム実行結果（DEAP による最適化過程を Plotly で描画）
![Screenshot 2023-12-17 at 3.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511606/38bcd9ab-af57-08bc-7f1f-31d0f56e0f8d.png)

管理画面（MLflow によるモデルや結果の管理画面）
![Screenshot 2023-12-17 at 3.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511606/e3e32df8-1658-3001-5ed3-6a1ed1864abe.png)

![Screenshot 2023-12-17 at 3.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511606/6e4dcb59-72aa-ceae-d8cf-69e88121ce71.png)

# 振り返り
最適化モデルや結果の管理を実現できました。OptiOps 完成です。しかしながら現状ではただ MLOps の技術を最適化に展開したのみで、特段の発展性はなかった気がするので、今後は最適化の理論に紐づいた独自拡張ができればなと思っています……。


# おわりに
ふと思いついたアイデアをその日の晩のうちに形にできて楽しかったです。Rye と MLflow をそろそろ使ってみたいと思っていたのでとても良い機会でした。アジャイルを推進していきましょう、今後とも OptiOps をよろしくお願いします。

# 参考
https://github.com/mitsuhiko/rye

https://zenn.dev/watany/articles/f69db9e33d4427

https://github.com/mlflow/mlflow

https://qiita.com/c60evaporator/items/e0eb1a0c521d1310d95d

https://github.com/DEAP/deap

https://github.com/DEAP/deap/blob/master/examples/ga/knapsack.py

https://amzn.asia/d/dMfyxgG
new Dateに入れる引数による挙動の違い

Date型に入れる引数でちょっとつまづいたので、メモ。引数の形を変えると、出力される値も変わります。


```js
console.log(new Date(`2020/7/7 00:00:00`));
// Tue Jul 07 2020 00:00:00 GMT+0900 (日本標準時)
console.log(new Date(2020, 7, 7, 0, 0, 0, 0));
// Fri Aug 07 2020 00:00:00 GMT+0900 (日本標準時)
console.log(new Date(`2012-10-12`));
// Fri Oct 12 2012 09:00:00 GMT+0900 (日本標準時)
```
2つ目の指定の仕方は月が0から始まります。なので、7月を指定したければ、
3つ目は下記サイトで紹介されているように時間の指定が、9時になっています。
間違えないようにセットするには、1つ目の指定にするのが良さそうです。


#### 参考
https://qiita.com/t-yama-3/items/29bd686f2a8b3cb9e784

https://zenn.dev/shinkano/articles/6da260427dcd77
音量やデータを滑らかに変化させる ～ 積分器で簡単に

[<B>MATLAB/Simulink Advent Calendar 2023</B>](https://qiita.com/advent-calendar/2023/matlab)

[<B>JUCE Advent Calendar 2023</B>](https://qiita.com/advent-calendar/2023/juce)

に参加しました。


・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/n515e7b36ffef"</a> [<B>note</B>]にUpしました。</H4>
ZTX、日本でのサービス開始に向けてパートナーシップを締結

:::note info 
ZTX、日本市場でより大規模なコミュニティを構築するために現地パートナーを選定
::: 

![ztx1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/5f6d469c-20e5-416d-0490-d1a152b3510f.jpeg)

2023年12月15日、東京： Web3メタバースとクリエイター・プラットフォームで世界的な人気を誇る[ZTX](https://ztx.io/)は、日本での市場参入戦略、マーケティング、実行を専門とする日本の企業、[Metaverse Collection](https://metaversecollection.llc/)とパートナーシップを結ぶと発表しました。

Metaverse Collectionには、TezosやBig Timeなどのプロトコルやアプリケーションの日本市場への参入支援の実績を持つマーケティングチームが所属しています。

また、Metaverse Collectionのマーケティングチームは、ZTXコミュニティのメンバーでもあり、ZTXのレガシーWeb2プラットフォームにも精通していることから、他のWeb3プロジェクトと比較して、ZTXが日本市場で成功する可能性に自信を持っています。

Metaverse CollectionのプロジェクトマネージャーであるLee Nomura氏は、「ZTXは日本進出の際に通常のWeb3ゲームやメタバースプロジェクトと比較して、多くのアドバンテージを持っています。ZTXの基盤となるWeb2プラットフォームはソフトバンクの支援を受けており、すでに日本で数百万人のユーザーを抱えています。また、12月にはフジテレビと共同でバーチャル歌手・アイドルオーディションを開始するなど大きな注目を集めています。日本での経験豊富なマーケッターとして、我々はZTXのポテンシャルを日本で最大限に発揮するためのサポートに尽力します。」と述べました。 

ZTXのチーフ・フューチャリストであるAlexxは、さらに次のように語った：「我々は、MZ Web3 Fundのような日本の素晴らしい投資家たちと協力し、日本の小売業者の手にZTXトークンをより多く届ける方法について一緒に戦略を練っています。現在、Metaverse Collectionのような有能なパートナーと共に、オンラインとオフラインのコミュニティ形成イニシアチブを開発することによって、その戦略を拡大するよう努力しています。日本特有のキャンペーンを管理することができる現地パートナーの存在は、以前から日本でのZTXキャンペーンを増やしてほしいと要望していた日本のZTXコミュニティと多くのタッチポイントを作ることを目指す上で、非常に重要です。」

ZTXチームは来週、待望のベータ版をリリースする予定であり、さらなる詳細については、[X](https://twitter.com/ztxofficial)と[Discord](http://discord.gg/ztx)のソーシャルメディアアカウントからアクセス可能です。

メディア連絡先
ロバート・ペニントン
Robert@thronepr.com
【ABC333】コンテストメモ【AtCoder】

## 結果
- 順位: 7558位
- 点数: 600点
- 時間: 95:18
- pef: 423相当
- R: 148 → 169 (+21)Highest更新
- 3完 ABC

## 総評
3完ではあるもののC問題がすぐに解けなかった。ローカル環境での出力では333のときの出力が正しくなかったが、時間がないためとりあえず流してみたらACできたので頭の中が「？？？」となってしまった。実質2完くらいのパフォーマンスな気がする。ローカル環境でもしかしたらおかしい部分があるかもしれないため調査しようと思う。

:::note warn
「未着手」は手を付けていない問題。
「未提出」は手を付けたけれど提出はしていない問題。
:::

## 問題別評価

### A問題
- AC 3:54
- [実行結果](https://atcoder.jp/contests/abc333/submissions/48539931)
to_stringを使用する必要はなく、NをN回出力するループ処理を行うべきだった。

<details><summary>サンプルコード</summary>

```
  for (int i = 0; i < n; i++) {
    cout << n;
  }
```

</details>

### B問題
- AC 15:48
- [実行結果](https://atcoder.jp/contests/abc333/submissions/48552641)
文字同士の差分を比較する。そのときにsとtの差分が同じまたは1と4または2と3のとき。
実行結果の内容はmodを使用して処理を省略しようと試みた。しかしMECEな処理ではないためもう少し考えたい。

<details><summary>サンプルコード</summary>

```
  if(s == t ||
    (s == 2 && t == 3) || (s == 3 && t == 2) ||
    (s == 1 && t == 4) || (s == 4 && t == 1)) {
    cout << "Yes" << endl;
  } else {
    cout << "No" << endl;
  }
```
</details>

### C問題
- AC 95:18
- [実行結果](https://atcoder.jp/contests/abc333/submissions/48591815)
pow()関数で解こうとしたが小さな数字(5など)のときですら異なる数字となってしまう。よくわからないけど**やはりpow()関数は信用してはならない。**
三重ループを使用して該当する番号になった際にループを使用してレピュニット数を作成し、それを足し合わせて出力を行った。汚いコードになってしまったため整理したい。
解説に書かれていたものがとても参考になったのでこの記事にもリンクを貼ります。
[速い by ngtkana](https://atcoder.jp/contests/abc333/editorial/8004)

### D問題
- 未着手

### E問題
- 未着手

### F問題
- 未着手

### G問題
- 未着手

## まとめ
ある色になりたい時にはなりたい色の中央値のパフォーマンスを10回程度出す必要があると言われています(茶色を目指す場合だと600程度を10回)。目下の目標である入茶をするためには

- ABCにてABC3完(ある程度の速度で)
- ABCにてABCD4完

が必要であると思われます。現在の実力では上記の条件を継続的にクリアするには少し足りていないため今後精進していきます。
ゲーミフィケーションが変えるヘルスケアの世界

## ゲーミフィケーションの始まりと進化

ゲーミフィケーションは、ゲームの要素や手法をゲーム以外の分野に応用することを意味し、ヘルスケア分野においてもその波を受けています。健康増進、疾病予防、治療、そして医療従事者の教育に至るまで、多岐にわたる用途でゲーミフィケーションは活用されています。

1990年代から始まったこの動きは、1995年に心理学者ジェームズ・ウィリアムズ氏が開発した禁煙支援プログラム「チャンピオンズ・プロジェクト」によって加速しました。このプログラムは、プレイヤーが仮想キャラクターを通じて禁煙を達成し、ポイントやバッジを獲得することで、従来の禁煙支援プログラムと比較して禁煙率の向上を達成しました。

以降、運動、食事、睡眠といった健康行動の促進、慢性疾患の管理、精神疾患の治療、医療従事者の教育など、ゲーミフィケーションはヘルスケアの多様な領域で活用されています。

![gamification-20231215-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/e7a118a3-9c30-a6af-8c17-e6347e277173.png)


## ゲーミフィケーションのヘルスケアへの貢献

ゲーミフィケーションがヘルスケア分野で活用される理由には大きく2つあります。一つ目は、ゲームが人々のモチベーションを高め、行動を促進する効果を持つことです。例えば、SuperBetter社の開発した同名のゲームは、うつ病や不安障害の治療を目的とし、プレイヤーがチャレンジに挑戦することでポイントやバッジを獲得し、その結果、生活の質の向上をもたらしました。

二つ目は、データの収集と分析を容易にすることです。ゲームでは、プレイヤーの行動や成果を容易に記録・分析することが可能です。このデータを利用することで、プレイヤーの健康状態や行動の変化を把握し、適切な支援や指導を行うことができます。例えば、Medtronic社の開発したMyCareLink Encoreは、糖尿病患者向けのウェアラブルデバイスで、血糖値のコントロールをゲーム化し、改善結果を示しました。

![gamification-20231215-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/1b00f80c-01ad-bcd7-ed13-5cb612e5a3a5.png)


## ゲーミフィケーションの新たな展開

技術進歩によりゲーミフィケーションがどのように進化し、新たな可能性を秘めているかを紹介します。スマートフォンやウェアラブルデバイスの普及により、個人の健康データの収集や分析が容易になりました。また、ゲーム開発技術の進化により、より効果的で魅力的なゲーム化が実現可能になっています。人工知能（AI）や機械学習（ML）などの技術を活用することで、個々のプレイヤーに合わせた効果的なゲーム体験を提供することが可能です。

さらに、健康意識の高まりや医療費の増大などの社会的な要請も、ゲーム化のヘルスケアへの活用を後押ししています。健康意識の高まりは、より積極的な健康づくりに対する関心を促し、医療費の増大は医療費の削減や患者の生活の質（QOL）の向上が求められています。ゲーミフィケーションを活用することで、これらの課題の解決に貢献することが期待されています。

![gamification-20231215-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/86cd4d4f-ea96-c24c-d885-e09e393f2df1.png)


## ゲーミフィケーションの未来像

ゲーミフィケーションは、ヘルスケア分野において、多くの新たな可能性を秘めた技術です。健康増進や疾病予防、治療、医療従事者への教育など、さまざまな目的を達成することが期待されています。今後も、ゲーミフィケーションのヘルスケアへの活用は進展し、人々の健康や医療の質の向上に大きく貢献することが予想されます。

### まとめ

![gamification-20231215-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129712/c79fde2e-b966-72b3-b58d-dcc8a8b6bebf.png)

ゲーミフィケーションは、ヘルスケア分野において、以下のメリットを提供する可能性があります：

1. 人々のモチベーションを高め、行動を促進する。
2. データの収集や分析を容易にする。
3. 新たな技術やアイデアの創出につながる。

### 具体的な事例

1. **MangoHealth**: 糖尿病患者向けのモバイルアプリ。血糖値のコントロールをゲーム化し、改善を促進。
2. **Happify**: メンタルヘルスケア向けアプリ。心理トレーニングを通じてうつ症状の改善や生活の質の向上を図る。
3. **Re-mission**: がん患者向けのモバイルゲーム。がんに対する不安や恐怖の軽減、生活の質の向上を目指す。

これらの事例から、ゲーミフィケーションはヘルスケア分野において多様な効果をもたらすことが明らかです。今後も、ゲーミフィケーションの活用は進展し、ヘルスケアの未来を形作っていくことでしょう。
Project Phantoやーる（Quest3、Unity）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)19日目の記事です。
今日は、MRシューティングゲームのPhantoをやっていきます

https://github.com/oculus-samples/Unity-Phanto

# 開発環境
- Windows 11 PC
- Unity 2022.3.4f1
- Meta Quest 3
- Meta Quest Developer Hub 4.2.1
- iPhone 12 Pro 


# 導入

開発方法はこちらを参考にします

https://note.com/npaka/n/n3ff29118202d

## 開発者モード

1．iPhoneのQuestアプリを起動してログイン
2．デバイスを選択し、Quest3とペアリング
3．ヘッドセットの設定 -> 開発者モードを選択し、有効化

<!--
**4．デバッグモードをON**
~~4．開発者登録をしていない場合は、開発者登録を要求されるので登録。~~
~~5．USBケーブルで「Meta Quest」とPCを接続。~~
~~6．「Meta Quest」を被るとアクセス許可を要求されるので許可。~~
-->

## Meta Quest Developer Hubの設定
1．Meta Quest Developer Hub（MQDH 4.2.1）をダウンロード

https://developer.oculus.com/downloads/package/oculus-developer-hub-win/

2．Device Manager -> Set Up New DeviceでQuest3に接続

## Phantoをビルド

1．Unity-Phantoをクローン

https://github.com/oculus-samples/Unity-Phanto

2．Unity HubでUnity 2022.3.4f1をインストール（Android Build Supportにチェック）

https://unity.com/ja/releases/editor/archive#download-archive-2022

3．Unity-Phantoを開く

<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/74bd6ea1-dbc2-0846-d6d5-7c0c2e6594b7.png)
-->

4．シーン（Assets -> Phanto -> Scenes -> LobbyScene.unity）を開く

| シーン名 | 説明 |
|:--|:--|
| LobbyScene | イントロダクションシーンを含み、現在のメッシュを表示し、ゲームを開始できるシーン。|
| TutorialScene | プレイヤー向けのチュートリアルを提供し、操作方法とゲームダイナミクスを説明するシーン。|
| GameScene | 実際のゲームプレイに必要なアセットを含むシーン。Phanto、Phantoms、その他のアセットを含む。|
| ContentPlacement | メッシュを使用してコンテンツを配置する例を示すシーン。|
| MeshCollisions  | メッシュを物理に使用する方法を示すシーン。Ectoplasmaがメッシュからバウンスし、リアルな体験を提供。|
| AirNavigation | スキャンしたメッシュを空中ナビゲーション用のセンサーとして使用する方法を示すシーン。|
| MeshNavigation | メッシュを地面のナビゲーションに使用する方法を示すシーン。家具の境界ボックス情報の有無に関するデモ。|
| SceneVisualization | メッシュと家具の境界ボックス（利用可能な場合）を表示するデバッグシーン。|
| DebugDrawingScene | 開発者デバッグツールを紹介するデバッグシーン。|
| UserInBounds | シーンの境界を離れる際のユーザーへの通知方法を示すシーン。|

5．Build Settingsで、Platform -> Android、Texture Compression -> ASTCを選択し、Switch Platformをクリック

<!--
~~「Asset Store」で「Oculus Integration」(57.0)をインポート。~~
~~メニュー「Edit → Project Settings → Oculus」を開き、「Outstanding Issues」の「FIX All」の「Recommended Items」の「Apply All」をクリック。~~
-->

6．Run DeviceでQuest3を選び、Build And Run

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/db113e96-bbfa-131b-9b1a-b08a3656df9b.png)

# 実行結果

https://x.com/sotongshi/status/1736072024689402227?s=20

お疲れさまでした。
PHPの基礎知識

## シングルクォーテーションとダブルクォーテーション
* シングルクォーテーション
    文字列を表示するときにそのまま表示できる
    ```php
    $a = 'hoge';
    echo '$a の中身は ' . $a . ' です。';
    /* 結果
    $a の中身は hoge です。
    */
    ```
* ダブルクォーテーション
    文字列を表示するときに変数を展開して表示できる
    ```php
    $a = 'hoge';
    echo "$a の中身は " . $a . '　です。';
    /* 結果
    hoge の中身は hoge です。
    */
    ```

処理速度はシングルクォーテーションの方が速い
意図しない変数展開を避けるためにダブルクォーテーションの使用は必要最低限にする

## 同値比較と等値比較
* 同値比較(===, !==)
    対象をデータ型まで考慮して比較できる
    ```php
    $a = 1;
    $b = '1';
    if ($a === $b) {
        echo true;
    } else {
        echo false;
    }
    // 結果 false
    ```
* 等値比較(==, !=)
    対象をコンテキスト（文脈）で比較できる
    ```php
    $a = 1;
    $b = '1';
    if ($a == $b) {
        echo true;
    } else {
        echo false;
    }
    // 結果 true
    ```
処理速度は同値比較の方が速い
意図しない分岐を発生させないために等値比較は使用しない

## 参照渡しと値渡し
[PHPのリファレンスカウンティング](https://blog.serverworks.co.jp/tech/2009/05/13/php-reference-counting/) にわかりやすい解説が載っています。
* 参照渡し(&$argument)
    ~~メソッドに変数を渡す時に、渡す変数のリファレンス（ポインタ、アドレス）を別の変数にコピーして渡す~~
    ~~渡した変数の中身を更新できる~~
    ```php
    function method(&$arg)
    {
        $arg = 'hare';
        echo '2:' . $arg . "\n";
    }
    $arg = 'hoge';
    echo '1:' . $arg . "\n";
    method($arg);
    echo '3:' . $arg . "\n";
    /* 結果
    1:hoge
    2:hare
    3:hare ← 変化している
    */
    ```
* 値渡し($argument)
    ~~メソッドに変数を渡す時に、渡す変数の値を別の変数にコピーして渡す~~
    ~~渡した変数の中身を保護できる~~
    ```php
    function method($arg)
    {
        $arg = 'hare';
        echo '2:' . $arg . "\n";
    }
    $arg = 'hoge';
    echo '1:' . $arg . "\n";
    method($arg);
    echo '3:' . $arg . "\n";
    /* 結果
    1:hoge
    2:hare
    3:hoge ← 変化していない
    */
    ```
PHPではオブジェクトは参照渡しになるためメソッドに渡すときのアンパサンドは不要
オブジェクトを複製する場合はcloneを使う。
オブジェクトを複製する場合はシャローコピーとディープコピーの知識が必要
【Python】ディレクトリやファイルを操作するコード

# Pythonによるディレクトリやファイルの操作
この投稿ではPythonでのディレクトリやファイルの操作を実行する基本的なコードをいくつか紹介する。
なお前提として、jupiter等のPythonの実行環境は用意されているものとする。
# ディレクトリの作成
以下を実行し、osライブラリのmkdirメソッドを使用してディレクトリを作成することができる。newfolderという名称のディレクトリが作成されるが、作成されたディレクトリの作成先はmkdir_app.pyの格納先と同じである。
```py:mkdir_app.py
import os

os.mkdir("newfolder")
```


# ファイルの作成、読み取り
以下を実行することで、hello worldという文字が記述されたtest.txtというファイルを作成することができる。
```py:mkfile_app.py
file = open("test.txt","w+")
file.write("hello world")
file.close()
```
ここで使用されているopen,write,closeという関数はいずれもPythonの標準的な関数であるため、特にライブラリをインポートする必要はない。また、作成先についてはmkfile_app.pyの格納先と同じ場所に作成される。
何を実行しているのかはコードを見れば大体分かると思われるが、open関数の引数に入っている```w+```はファイルの読み書きの権限を与えるモードである。
モードには以下の種類がある。
・```w+```,```r+``` : 読み書き両用
・```w``` : 書き込み専用
・```r``` : 読み取り専用
・```x``` : 書き込み専用（新規ファイル作成のみ）

また、以下のようにopenの前にwithを実行すると、既存のファイルを開きファイルを閉じる操作を一括して実行できる。
```py
with open("test.txt","w+")
    file.write("hello world")
```




# ファイルの移動
上記で作成された、test.txtファイルをnewfolderディレクトリへ移動させる。コードは以下の通りである。
```py:movefile_app.py
import shutil

shutil.move("test.txt","newfolder")
```
shutilライブラリをインポートし、moveメソッドによりファイルを移動させている。このmoveメソッドはファイルもディレクトリも移動させることができる。
書き方として、```shutil.move("移動したいファイルorディレクトリのパス","移動先のパス")```と記述する。上記の場合、test.textもnewfolderも全て、movefile_app.pyと同じ場所に作成されていることを前提としているため、詳細なパスの記述は必要ない。

# ファイルの削除
以下を実行すると、newfolederに格納されたtest.txtファイルを削除することができる。
```py:mvfile.py
import os

os.remove("newfolder/test.txt")
```

# ディレクトリの削除
以下を実行するとディレクトリを削除することができる。また、中にファイルが入っている状態で実行すると、中のファイルもろとも削除される。

```py:mvdir.py
import shutil

shutil.rmtree("newFolder")
```
# 参考文献
久我涼子（2021） 『Pythonではじめるデスクトップアプリ開発入門』

https://www.amazon.co.jp/Python%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E4%B9%85%E6%88%91-%E6%B6%BC%E5%AD%90/dp/B09K21NXDZ/ref=asc_df_B09K21NXDZ/?tag=jpgo-22&linkCode=df0&hvadid=553931731904&hvpos=&hvnetw=g&hvrand=2928910813791791219&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009298&hvtargid=pla-1463190323030&psc=1&mcid=32a9ef52196b33198ad5b7f36f32f83f&th=1&psc=1