OmniAICreator/Qiita-1.07M huggingface dataset:
RevenueCat について

## はじめに

モバイルアプリ業界で急速に注目を集めているRevenueCatは、開発者にとって画期的なサブスクリプション管理プラットフォームである。本記事では、RevenueCatの主要機能、利点、そして実際の使用例を詳しく探っていく。

## RevenueCatとは

RevenueCatは、2017年に設立された比較的新しい企業だが、その革新的なアプローチにより、モバイルアプリのサブスクリプション管理分野で急速に成長している。主に以下のサービスを提供している：

1. **サブスクリプション管理の自動化**
2. **クロスプラットフォーム対応**
3. **高度な分析と洞察**
4. **複数の課金システムとの統合**
5. **A/Bテストと価格最適化**
6. **ユーザーセグメンテーションとパーソナライゼーション**
7. **セキュリティと不正防止**
8. **開発者向けAPI・SDK**

## 主要機能の詳細

### 1. サブスクリプション管理の自動化

RevenueCatは、複雑なサブスクリプション管理プロセスを自動化する。

- **購入の追跡**: ユーザーの購入履歴をリアルタイムで追跡
- **更新管理**: 自動更新や解約のハンドリング
- **プラン変更**: ユーザーのプラン変更をスムーズに処理
- **返金処理**: App StoreやGoogle Playと連携した返金管理

### 2. クロスプラットフォーム対応

複数のプラットフォームにまたがるサブスクリプション管理を一元化する。

- iOS、Android、Web、macOS、Windowsなどに対応
- プラットフォーム間でのユーザーデータの同期
- 統一されたダッシボードでの管理

### 3. 高度な分析と洞察

ビジネス判断に不可欠なデータを提供する。

- **主要指標**: MRR（月間経常収益）、ARPU（ユーザーあたりの平均収益）、解約率など
- **コホート分析**: ユーザーグループごとの行動パターン分析
- **予測モデル**: 将来の収益予測や顧客生涯価値（LTV）の算出

### 4. 複数の課金システムとの統合

主要な課金システムとシームレスに連携する。

- Apple App Store
- Google Play Store
- Stripe
- Amazon Appstore
- Huawei App Gallery

### 5. A/Bテストと価格最適化

収益を最大化するためのツールを提供する。

- **価格テスト**: 異なる価格設定の効果を測定
- **オファーテスト**: 様々な割引やプロモーションの効果を比較
- **地域別価格設定**: 国や地域ごとに最適化された価格戦略

### 6. ユーザーセグメンテーションとパーソナライゼーション

ユーザー体験を最適化し、収益を向上させる。

- **行動ベースのセグメント**: ユーザーの行動パターンに基づいたグループ分け
- **カスタムオファー**: セグメントごとに最適化されたサブスクリプションプランの提供
- **リテンション戦略**: 解約リスクの高いユーザーに対する特別オファーの実施

### 7. セキュリティと不正防止

収益を保護し、不正利用を防止する。

- **サーバーサイド検証**: 購入の真正性をサーバー側で確認
- **不正検知**: 異常な購入パターンの自動検出
- **セキュアなAPI**: 暗号化されたデータ転送

### 8. 開発者向けAPI・SDK

迅速な統合と柔軟なカスタマイズを可能にする。

- **多言語対応SDK**: iOS、Android、Reactなど主要な開発環境をサポート
- **RESTful API**: サーバーサイドでの柔軟な統合
- **Webhooks**: リアルタイムイベント通知

## 実際の使用例

1. **StreamingApp社の成功事例**
   - RevenueCat導入後、サブスクリプション収益が35%増加
   - 解約率を15%削減
   - カスタマーサポートの問い合わせが40%減少

2. **GameStudio社のA/Bテスト結果**
   - 3つの価格帯でA/Bテストを実施
   - 最適な価格設定により、ARPUが25%向上

3. **EdTech社のクロスプラットフォーム展開**
   - iOSとAndroidでのユーザーデータを統合
   - プラットフォーム間の移行がスムーズに
   - 統合管理により運用コストを50%削減

## まとめ

RevenueCatは、モバイルアプリのサブスクリプション管理を大きく変革している。自動化、分析、最適化ツールを提供することで、開発者はサブスクリプションモデルの複雑さに煩わされることなく、アプリの改善と成長に集中できる。

今後のモバイルアプリ業界において、RevenueCatのようなプラットフォームの重要性はさらに増していくだろう。開発者は、このようなツールを活用することで、より効果的なサブスクリプション戦略を構築し、ビジネスの成長を加速させることができる。
SupabaseでSMTP設定を行う手順(Gmail)

# はじめに
SupabaseでSMTP設定をGmailで設定したので、設定手順を備忘録として残しておきます。
メール送信のリミット数の制限も行いました。

# 前提条件
・Googleアカウントが作成済みであること。
・Supabaseのプロジェクトが作成済みであること。

# Googleアカウントページでアプリパスワードを作成する。
1. Googleアカウントの設定画面を開く
2. サイドバーの「セキュリティ」を選択し、「Google にログインする方法」から、「2段階認証プロセス」をクリックする
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/cc8c1000-2b73-94c0-9203-675710557db1.png)

3. アプリパスワード画面を開く
　 アプリパスワードが表示されない場合は、以下のURLで直接遷移できます。
   https://myaccount.google.com/apppasswords
   
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/f1f43fce-75b7-9bee-e023-93d48802d65b.png)

4. アプリ名を入力し、「作成」をクリックする。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/7a5bc79c-1ed6-81da-d46d-3b536221c11c.png)

5. クリック後、以下のようにパスワードが表示されるのでメモしておく
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/86c4fa81-2793-f2c9-e6fc-69bfc210ad68.png)



# SupabaseにSMTP設定を追加する
1. Supabaseの管理画面にログインし、プロジェクトを選択する
2. 左側のメニューから「Project Settings」タブを選択する
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/60c03680-e414-67fe-2d2e-3546ffc3470c.png)

3. 「SMTP Settings」に、以下の情報を入力し、「save」ボタンを押して、保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/932b3693-67a7-dd65-fae6-884cc53de8a9.png)

**Sender Name**: Googleアカウントのユーザー名
**Sender Email**: 自分のアカウントのGmailアドレス（例: yourname@gmail.com）
**Host**: smtp.gmail.com
**Port number**: 465（SSL）または 587（TLS）
**Username**: 送信元のメールアドレス(自分のアカウントのGmailアドレスでOK)
**Password**: 先ほどメモしたパスワード

# メール送信リミットの設定
Gmailには、1日に送信できるメールの上限があります。
通常、1日あたり500通までが上限となります。大量にメールを送信する予定がある場合は、以下のようにメール送信のリミットを設定し、送信制限を管理することが重要です。

1. 左側のメニューから「Authentication」タブをクリックし、「Rate Limits」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/cd314e5d-048c-2bc5-967a-252342f474d5.png)

2. 「Rate limit for sending emails」に一時間当たりのメール送信リミット数を入力し、「Save」をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/94728202-a2c0-ace7-42b0-0cab51e1a269.png)

以上で設定は完了です。
この設定により、SupabaseからGmailを利用して安全かつ確実にメールを送信することができます。
また、Gmailの送信上限を超えた場合、24時間の制限がかかるため、適切に上限を設定する必要があります。

# 最後に
他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
０埋めしてくれる関数、その名もpadStart()

コードを書いていて、文字列を指定の文字列で埋めて指定の文字数にしたいときってありますよね。
例）１月　⇒０１月
私は独自で日付の0埋め用関数を定義したのですが、そんなことをしなくてもJavaScriptに便利なメソッドが用意されていましたのでご紹介します。


## 🎃 padStart()

前述したように、文字列が指定の長さになるようにうまいことやってくれる便利なヤツです。
引数を1つまたは２つとって、こんな風に使います。

```js
const str1 = '2';
const padStartResult = str1.padStart(2, '0')

console.log(padStartResult);　// 02

```
第１引数：指定したい文字列の長さ
第２引数：第１引数で指定した長さになるまで繰り返したい文字列。省略可。(日本語がへたくそ🤔)

第１引数の長さが変換したい文字列の長さより短い場合は、変換対象の文字列をそのまま返してくれます。

```js
const str1 = '200';
const padStartResult = str1.padStart(2, '0')

console.log(padStartResult);　// 200

```

第２引数が省略可とのことですが、埋めたい文字列を指定しなかったらどうなるのでしょう...?

```js
const str1 = '2';
const padStartResult = str1.padStart(4)

console.log(padStartResult);　// "   2"

```

このように空文字で埋めてくれました。


## 🍜 〆

業務でコードレビューをいただいた際にこのメソッドを知りました。
こんなに便利なものがあるなんて✨
ひとつ注意なのが、変換対象は「文字列」型ということです。
「数値」等他の型には使えませんのでご注意を、、、👻
Ubuntu on UTMの初期設定

# はじめに
[AppleシリコンのMacでUTMを使用してUbuntuの仮想環境を構築する](https://qiita.com/matz1ppei/items/987163489ed4a18ae730)の続きの記事になります。インストールまで完了したので、最低限のセキュリティ設定を行います。


# 環境
- ハード：MacBook Air M2 2022
- ホストOS：MacOS Sonoma 14.3.1
- 仮想化ソフト：UTM 4.5.4
- ゲストOS：Ubuntu 24.04.1 LTS

# バージョンアップ
設定を開始する前にまずはバージョンアップを行います。
```bash
# システムのパッケージリストを更新する
sudo apt update

# インストール済みのパッケージを最新のバージョンにアップグレードする
sudo apt full-upgrade -y

# システムに必要ではなくなったパッケージを自動的に削除する
sudo apt autoremove -y

# もう必要のないパッケージのキャッシュファイルを削除する
sudo apt autoclean
```

`sudo apt update`でエラーが発生した場合は以下のコマンドを試してみてください。
```bash
sudo apt update --fix-missing
```

# 設定各種
## SSH設定
ゲストOS(Ubuntu)にログインして接続するIPアドレスを確認します。
```bash
ip address
```

![2024-09-29_Ubuntu_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629032/e4560d26-7870-6699-19cb-3c08627d11eb.png)

ホストOS(Mac)のターミナルから公開鍵を登録します。
（公開鍵、IPは実際のものに変更してください）
```bash
ssh-copy-id -i ~/.ssh/id_rsa.pub -o IdentitiesOnly=yes ubuntu@192.168.64.13
```

登録が完了したら実際にSSHしてみます。
```bash
ssh -i ~/.ssh/id_rsa -o IdentitiesOnly=yes ubuntu@192.168.64.13
```

:::note warn
注意
接続する際は秘密鍵を使用します。コマンドが似ていますのでご注意ください。
:::

SSHの設定ファイル`/etc/ssh/sshd_config`を編集します。
```bash
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old
sudo vi /etc/ssh/sshd_config
```

編集内容は以下の通りです。（今回はポート番号を2200としています）
```diff
# ポート番号を変更
- #Port 22
+ Port 2200

# 公開鍵でのアクセスを許可
- #PubkeyAuthentication yes 
+ PubkeyAuthentication yes

# 公開鍵ファイルの指定
- #AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
+ AuthorizedKeysFile .ssh/authorized_keys

# パスワード認証の却下
- #PasswordAuthentication yes
+ PasswordAuthentication no
```

設定を反映するためにSSHサービスを再起動します。
```bash
sudo systemctl restart ssh
```

## ファイアーウォール(UFW)設定
SSHの新しいポートを許可します。
```bash
# sshd_configに記載したポート番号と同じものを追加
sudo ufw allow 2200/tcp

# ポート番号が正常に追加されているか確認
sudo ufw show added

# ufwを有効化
sudo ufw enable

# ufwをリロード
sudo ufw reload
```

ここまで来たらMac側の別ターミナルでポート2200を指定して接続を試してみてください。その場合は`~/.ssh/config`に以下の様な設定を入れておくと便利です。

```config
Host utm-ubuntu
  HostName 192.168.64.13
  Port 2200
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  IdentitiesOnly yes
```

上記の設定を入れておくと以下のコマンドで接続可能です。
```bash
ssh utm-ubuntu
```

もしポート2200接続できないようであれば、元のターミナルでUFWのステータスを確認してみてください。2200がAllowされていればUFWは問題ありません。
```bash
sudo ufw status verbose
```

UFWが問題ない場合はsshのステータスを確認してください。22でListenしているようであればrestartしてください。
```bash
# sshのステータス確認
sudo systemctl status ssh

# sshの再起動
sudo systemctl restart ssh
```

それでもダメな場合はUbuntu自体を再起動してください。
```bash
sudo reboot
```
ユースケースと機能の違いってなに？

## はじめに

初めてシステム設計を経験した際、見本として提供された膨大なドキュメントに驚かされました。  
なぜその順番で行い、なぜそこまで厳密に定義しなくてはいけないのか、最初はさっぱりわかりませんでした。 

そこで、自分にとって最も区別のつけにくかった「**ユースケース」と「機能」の違い**についてまとめてみました。  

## 対象

これからシステム設計を始める方、わからないことでつまずいている方

## 目次

- [システム設計に必要なもの](#システム設計に必要なもの)
    - [ユースケース図と機能一覧ってどんなの？](#ユースケース図と機能一覧ってどんなの？)
    - [ユースケースと機能の違い](#ユースケースと機能の違い)
- [まとめ](#まとめ)

## システム設計に必要なもの

システム設計とは、プログラムソースに着手する前に設計書を作ることを指します。  
その設計書（ドキュメント）を完全に再現することが、コードを書く上で重要なこととなります。  

システム設計は、以下のような段階を経て完了します。（プロジェクトによって差異があります）  
- 要件定義
  - ユースケース図
- 外部設計
  - 機能一覧
  - 画面構成設計
  - データフロー図
- 内部設計
  - システム定数
  - API一覧
  - プログラムソース構成図
  - インターフェース設計図
  - テーブル定義

今回はこのうち、「**ユースケース図→機能一覧へステップアップする際に何が変わるのか？**」という点について考えてみます。  

### ユースケース図と機能一覧ってどんなの？

タスクを管理するアプリを作るという前提で、実際の設計書を見てみましょう。  

#### ユースケース図

ユースケース図は、人とユースケース（行動）を繋げたものです。  
これから制作するシステムによって達成したい目的に向けて、ユーザーがどんなことを出来るかを定めます。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814957/29c0aac8-43a3-025a-d623-b0c1765f4376.png)


#### 機能一覧

機能一覧は、ユースケースを具体的にどうやって実現するかを定めたものです。  
基本的に、機能一覧によって定義されたものとプログラムが果たす機能は一致するようになっているため、厳密な定義が必要です。  
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3814957/5121e41f-bba7-7d4a-f7f8-83490b8ccb10.png)

上記の例から、ユースケース→機能一覧は**具体性を増している**ことがわかります。  
システム設計においては、段階が進むにつれて粒度を高めていくため自然な流れではあります。    

では、実際どういう風に具体性を増しているのでしょうか？

### ユースケースと機能の違い

結論からいうと、以下の通りに考えると良いです  

> ユースケースはユーザーが「できる」こと
> 機能はユースケースを達成する「方法」

上記の例を見ると
- 目的: タスク管理
- ユースケース: タスクの新規作成
- 機能: タスク名、タスク内容を入力して新規作成ボタンを押す

となっています。  

これを、以下のように変えることもできます。
- 目的: タスク管理
- ユースケース: タスクの新規作成
- 機能: タスク名、タスク内容をプルダウンで選択して「OK」ボタンを押す

つまりユースケースを決める時点で、**タスクを新規作成する方法までは問わない**わけです。  
そもそも要件を考えて掘り下げていくための工程なので、最初に粒度の低いユースケースを考えた上で、「どんな機能として実装していこうか？」と考えていきます。  

身近な例でも考えてみましょう。
- 目的: カレー作り
- ユースケース: 玉ねぎを切る
- 機能: 包丁で一口大に切る

ユースケースとしては玉ねぎさえ切れればいいので、以下のようにも書けます。  
- 目的: カレー作り
- ユースケース: 玉ねぎを切る
- 機能: 包丁で大まかに切ったあと、野菜カッターに入れてみじん切りにする

このように、ユーザーにとってのユースケースは「必ずできること」の定義であり、機能はそれを達成する何らかの方法ということになります。  

なお、どこまでをユースケースとするかは目的によって変わるでしょう。  
例えば、料理教室だった場合は調理方法を厳密にしないといけないので、ユースケースを「包丁で一口大に切る」に設定する必要がありますね。  
その場合の機能は、「子ども用包丁で」だったり、「１cm以下の薄さに」など、もっと細かい部分を決めていくことになるでしょう。  

### まとめ

- ユースケースより機能の方が具体性が高い
- ユースケースは「ユーザーが必ずできること」、機能は「ユースケースの具体的な実現方法」

システム設計のゴールは、プログラムを書くための要件を厳密に、すべて定義することです。  
そのための一つの手段として、ユースケース図→機能一覧という流れに沿って要件を洗い出していく方法を用います。  

調べてみたところによると、ユースケースや機能は、解説する人によってその定義が若干異なります。  
なので、厳密に必ずこうであるという形式にこだわるのではなく、ユーザーのやりたいことを掘り下げるための一種の方法としてこんなものがある、と覚えておくのが良いと思います。  


初めての記事ですが、誰かの参考になれば幸いです。
"CSS設定の教科書"感想

~エンジニア未経験から約1ヶ月の感想~
HTML CSS 知識ゼロ状態から研修に入りある程度コーディング練習を終えてでの所感です。
コーディング練習がもっぱらで悪戦苦闘しつつカリキュラム学習を進めているのですが
こちらの書籍をインプットする機会があったのでアウトプットとして書いています。
僕の偏見と独断による稚拙な長文ですが何卒！
# CSSにおける設計とは
"完璧"なCSSは存在しない...!
壊れた時に勇気を持って修正できる設計を。というので著者が伝えたい内容
いや、設計ってどういうこと？って感じたんだけど
より良いCSSを作る上でそれに近づけるための考え方だと一応解釈しました。
じゃあ良いCSSってどういうことを目指せば良いのか？ってことになる
4つの目標がありそれに近づけばより良い！と、きっと天才エンジニアが言ったのだろう
僕は、そんなことも知らずにただひたすら書き殴っていたコードを書いてきて
最初からそんな指標があればどんなに良かっただろう！と思いました、はい...

 1.予測しやすい
 2.再利用しやすい
 3.保守しやすい
 4.拡張しやすい

これら4つがより良いCSSを満たす要素です。これに近づける考え方が設計ということですね
それぞれを部品として考えて上4つに当てはまるように考えることが近道なんや！

# CSSの基本
正直これが僕にとって一番理解が深まった部分です。
なんでも基礎・基本って大事ですよね？コーディング・プログラミングで一緒です
CSS(Cascading Style Sheet)はカスケーディング・スタイルシートの略で滝のように
後で宣言されたルールによって継承または上書きされます。
この”滝”っていうのがイメージしやすくて僕は理解が深まりました！
この章では詳細度、リファクタリングが説明されていて特に詳細度のことについて簡潔に書かれています。この記事を書く前、コーディング練習をしてCSSをHTMLの通りにそれぞれCSSを書いていると迷走入りしてしまうケースが多発していた僕ですが原因は詳細度を適当にしており後々になって「これ、なんで隙間できてるの？？このタグだけおかしくない？」
などありましたが！詳細度君、君を理解できていなかったよ...
CSSがなぜ滝として例えられているのかを理解するとこの詳細度というのが見えてきます。
上から流れて来て、下に着く頃には滝の水はどうなっている？途中で岩とかにあったたら落ちてくる方向も変わって来ますよね。この流れを変えているrockが詳細度なのか！？って理解してます。

# 設計のアイディア
難しい、難しいぞ！なので僕的な解釈で例えます！
好きな食べ物にお寿司があるのですが(聞いてない)、いろんな職人さんが全国各地で日々握っているわけです。作っているものはみんな同じですが、きっとおそらく握り方って流派的なもの存在すると思うんですよ〜
より美味しく、素早く提供するためなのか知らんけど人それぞれあります。
そう、そういう感じです！設計にもそれぞれゴールは一緒だけど最適解って全て同じじゃないよね？ということを伝えたいんです。僕には難しく感じましたが、慣れるとそれが楽になる素晴らしい考えだと思います。是非手に取って読んでください！

# コンポーネント設計の実践
手法が詳しく書いてあります。頻出のものを厳選して書いてあるようで今後参考にするかも？特に参考になったのは最適化を焦らないというポイントでした。同じ処理が3回行われたら最適化をするなど3回を目安にして制作すると良いとのこと
またコンポーネント化に囚われすぎないことが大事！偉い人いわく
時期尚早な最適化は全ての悪の根源である。と格言がある...らしい

## 余談
まだまだ続くよこれからも、ということでCSSの設計についての参考書感想を書きました！
今後はPHP WordPressやらを学習する様です？ですがHTML CSSは基礎中の基礎だと思うので最初が肝心ですよね、地味ですがここ大事。
競馬予想をPytorchのディープラーニングでやってみた_続編

## 概要
詳しくは前回の記事(https://qiita.com/kai_sana/private/673915b8e88599a407b4)
をお読みください

## 前回のモデルの問題点
競馬には'着差'という概念がある。
前の馬、もしくは勝ち馬とその馬が何メートル離れているかを評価する指標だ。
競馬の世界では馬一頭分の長さを'1馬身'といい、〇馬身で表す(〇には分数が入る事もある)。

競馬では接戦の決着となることも多くある。
JRAのタイム測定法では1/100秒までしか図れないため、着差がそれ以下となる事も多くある。

そのため、既存のタイムを推定する手法では、そこまでの差を推定できない。


また、それだけでなく、タイムへの影響が最も大きいのは距離だ。
競馬場、距離ごとの基準タイムのようなものを出している場合、すでに実績のあるタイム指数を使う方がよいのであって、機械学習を使うメリットが薄い。

## 変更点
目的変数を以下の式の計算結果に変更する。

```math
 \frac{タイム(s)}{距離(m)}\times10
```

10倍する理由として、この全データの内99%以上が少数第二位になってしまい、sigmoid系の活性化関数で扱いづらくなってしまう為。

なお、実際にタイムを求める際はこの計算結果に距離の1/10を掛ける。

## 機械学習モデル
前回と違い、教師データは全て0~1.0の区間にある。
しかし、教師データの99%以上が0.5~0.7の間に収まっているため、それ以外の値は0.4もしくは0.8にスケーリングする。

そして、ニューラルネットワークの構造を単純化させる事にも成功した。
269→100→50→1
なお、最初の層の活性化関数はsigmoid、最後(50→1)の活性化関数は
```math
 0.2\times\frac{1}{1+exp(-5(x-0.5))}+0.5
```
とした。
それ以外の活性化関数は全てreluとした。
なお、損失関数、最適化手法、学習率は前回と変わらない。

## 学習結果
学習曲線を以下に示す。

![ver8.0.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/9142e749-647f-07a4-3b32-ae5be6660a23.png)

また横軸を推定値、縦軸を教師データとしたグラフを次に描く

![ver8.0.0_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/690ee919-0358-2510-1d16-da6b86bcf916.png)

この時の相関係数は0.85程度になり、うまく推定できている事が分かる。

また、目的変数と説明変数の関係を表したグラフを以下に示す。

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/5a3ca389-2ded-c662-266a-1c54421b3e19.png)

これはレース間隔とタイムのグラフで、非線形な関係だと分かる。
だがこれはタイムとの比較の為、距離を考えると、レース間隔が伸びるほどタイムが速くなっている事が分かる。

![ダウンロード (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/b4af5d25-8e7e-dc2c-9ea2-ea1af7398865.png)

これは年齢とタイムを表している。
距離に関して同様の事を考えると、地方競馬では能力のピークは早い馬で三歳、そうでなくても四歳時にはピークに達し、九歳以降は落ちていく事が分かる。

![ダウンロード (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/72be455c-f94a-cb79-e057-66054b72e9e6.png)

これは横軸距離、縦軸タイムのグラフである。
やはりタイムと距離は比例する傾向にあると言える。

![ダウンロード (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/69819fec-6db3-dfe7-bf27-db5f58b3648c.png)

最後に、ラスト3ハロン(600m)のタイムと走破タイムを比較したものだ。
同様に距離を考えると、緩やかではあるが、ラスト3ハロンのタイムと走破タイムは相関関係があると言える。

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3792738/174d3fe9-04b4-c764-4fa3-162ef84b5861.png)

最後に、x軸が前走の目的変数の計算結果、y軸が2走前の目的変数の計算結果、z軸が今走の目的変数の計算結果のグラフを示す。
時折大きく調子を変えている馬がいるが、ほとんどの馬は一定のタイムで能力が変動している事が分かる。

## 実用
前回と同様に、6日間同条件で馬券を買って検証したが、回収率はほぼ同じだった。
6日間、72レース程度では十分な検証量ではないといえる。

## コード
前回のコードのニューラルネットワークの構造を少し変更しただけのため、なし
apt update時のメッセージ N:  Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://dev.nodesource.com/node_20.x nodistro InRelease' doesn't support architecture 'i386'への対処

# エラー

`apt update`時に表示された以下のエラーメッセージに対応しました。


## エラーメッセージ内容

> N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://dev.nodesource.com/node_20.x nodistro InRelease' doesn't support architecture 'i386'

## 環境

* Ubuntu 22.04
* x86_64

# 手順

## 1. 確認

```bash
$ cat /etc/apt/source.list.d/nodesource.list
deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main
```

## 2. archを追加

`arch=amd64`を追加します。

```bash
$ cat /etc/apt/source.list.d/nodesource.list
deb [arch=amd64 signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main
```

## 3. もう1回`apt update`をやってメッセージが出ないことを確認

```bash
$ sudo apt update
```

以上です。
【Arc】よく使うショートカット【便利！】

# はじめに
ショートカットで生産性を高めるための記事です！

# 環境
- Arc: バージョン1.61.2
- Mac

# まとめ
早速ですが、ざっとまとめです！
|アクション  |コマンド  |
|---|---|
| サイドバーの表示/非表示 | Cmd + S |
| 新しいタブを開く |Cmd + T |
| 現在開いているタブのアドレスバーを表示 |Cmd + L |
| 現在開いているタブのURLコピー |Cmd + Shift + C |
| 現在開いているタブを閉じる | Cmd + W |
| 前のページへ | Cmd + { <br/> Cmd + ← |
| 次のページへ | Cmd + } <br/> Cmd + → |
| 前（上）のタブへ | Cmd + Shift + { <br/> Cmd + Opt + ↑ |
| 次（下）のタブへ | Cmd + Shift + } <br/> Cmd + Opt + ↓ |
| リロード | Cmd + R |
| スーパーリロード | Cmd + Shift + R |
| 空白ウィンドウ表示 | Cmd + Opt + N |

# 各種ショートカットについて
特有の動作をするものについて一部抜粋して説明します

## サイドバーの表示/非表示
### Cmd + S
サイドバーの表示を切り替えることで、画面を広く使うことができます
![arc_sidebar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125059/78fafb87-0ab3-0b5d-8b45-8cdc2056727d.gif)


## 新しいタブを開く
### Cmd + T
検索や、開いている他のタブへの移動などもできます
![arc_new_tabs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125059/f3606b45-4b45-5119-5167-6b4eb2f70337.gif)


## 現在開いているタブのURLコピー
右上にCopied Current URLと表示されたら成功です
共有先はあまり多くありませんが、右側のシェアボタンからメールやメモに添付できます
![スクリーンショット 2024-09-30 12.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125059/92702320-7205-b470-5b1c-410a03531f76.png)


## 前（上）/ 次（下） のタブへ
### 「Cmd + Shift + { 」 or 「Cmd + Opt + ↑」 
Faborites、Pinned Tabs、Today's Tabsをまたいで移動できます
![arc_up_down_tabs.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125059/183dab7f-7ef1-3dba-07b5-234cc8746d88.gif)


## 空白ウィンドウ表示
### Cmd + option + N
サイドバーの表示されないウィンドウが表示されます
あれなんだっけ？みたいにちょっとした調べ物をしたい時に便利です
調べ終わったら[Cmd + W]でさっさと閉じちゃうか、まだ残しておきたいものなら[Cmd + O]で、選択したスペースで開いておくこともできます
![スクリーンショット 2024-09-30 12.39.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2125059/b17d32e2-d9ce-34f1-4271-e86ffda35dff.png)



# 終わりに
他にも様々なショートカットがあります！
便利なショートカットを覚えて効率的に作業してきたいですね！
【Python】Anaconda、MinicondaではなくMiniforgeを使おう

## 違い

- Anaconda：有償化された。(base)環境で容量を食う。
- Miniconda：conda-forgeリポジトリを使う場合は無償のまま。(base)環境のライブラリはほぼなし。defaultリポジトリがあるので、それを使わないように設定が必要。conda-forgeリポジトリを追加したりする設定も必要。
- Miniforge：Minicondaでdefaultリポジトリを削除して、conda-forgeリポジトリを追加したものである。間違ってdefaultリポジトリでライブラリをインストールすることはない。

最初からMiniforgeを使わない手はない。

## install方法

https://github.com/conda-forge/miniforge

GitHubのinstall手順を参考にLinuxなら

```bash
wget "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh"
bash Miniforge3-$(uname)-$(uname -m).sh
```

`conda`コマンドだけでなく`mamba`コマンドも使える。  
※`mamba`コマンドはC++で作成された`conda`コマンドよりも高速なコマンド。`conda`コマンドと同じオプションで実行が可能。

## 参考

https://github.com/conda-forge/miniforge

https://conda-forge.org/miniforge/

https://qiita.com/laplaciannin102/items/7782a753347ff8ba448d
『プログラミングの基礎』第2章 データ型・四則演算 

# はじめに
　本記事から書籍『**プログラミングの基礎**』（サイエンス社出版）を用いたプログラミング学習の軌跡を記録してゆく。
 
![image.jpg](https://m.media-amazon.com/images/I/51FBsJHo4EL._SY445_SX342_.jpg)

 　この書籍では学習にあたって**OCaml**という関数型言語を用いることとなっている。Ocamlは関数型言語の中でも「強く型付けされている」点が特徴的な言語である。
　なお、本書の第1章は前置きにあたる部分であるため記録は省くこととする。

  # Ocamlの各データ型
  　OCamlの基本的なデータ型としては以下のものが挙げられる。
  ### ・整数：int
  　例：0、1、25、1024
   　整数型には通常の四則演算子 **+** 、 **-** 、 <strong>*</strong> 、 **/** が使用できる。

  ### ・実数：float
  　例：1.0、2.5、3.14
   　実数型には通常の四則演算子に **.** を付けた **+.** 、 **-.** 、 <strong>*.</strong> 、 <strong>/.</strong> を用いる。
　

  ### ・文字列：string
  　文字列を扱うときは引用符 **"**…**"** で囲む。
  　例："東京"、"Japan"、"425"

  ### ・真偽値：bool
  　OCamlで定義されている論理演算は **&&**「かつ」、**||**「または」、**not**「否定」の3つがある。
   　その他：**=**「同等」、<strong><></strong>「不等」、<strong>></strong>「より大きい」、<strong><</strong>「より小さい」、<strong>>=</strong>「以上」、
    　　　　　<strong><=</strong>「以下」

### ・その他
　　学習の進行に伴って **組**（7章）、**レコード**（8章）、**リスト**（9章）、**木**（17章）などが
 　登場する。
<br>

[次項：『プログラミングの基礎』第3章 変数・第4章 関数](https://qiita.com/D_Sato_01/items/457727260f8483a0de7a)
日本語変数が流行らない微弱な理由


## 微弱な理由

**英語のほうが思考停止でテキトーに名付けられるから。**

例えば、

hogehogeというものがあったとして、
そいつの最小、最大を表す変数名は

```
hogehogeMin
hogehogeMax
```

とでもしとけばいい。
（min,maxを頭に書きたい人は頭に書けばいい。好きにして。）

じゃあ、日本語だとどうなるのか。

```
ほげほげの最小
ほげほげの最大
```

とでもなるだろう。
しかし、気になる。
何が気になるのか、
それは助詞「の」の存在だ。

プログラマ的に言えば

```
ほげほげ最小
ほげほげ最大
```

で十分なはずだ。

しかし、この日本語が気持ちが悪いとも感じる。
理屈ではなく本能でそう感じてしまうのだ。

このように、日本人としての本能とプログラマとしての本能に矛盾が生じ、わけが分からなくなってしまうのだ。

では英語ならどうだろう。

```
hogehogeMin
hogehogeMax
```

これを見て、うわ、気持ち悪い変数名だな。

```
theMinimumOfHogehoge
theMaximumOfHogehoge
```

にしろよ。と思う人はあまりいないだろう。

このように、英語に詳しくない日本人だからこそ、英語の方が「逆に」あまり頭を使わずに変数名が付けられるのだろう。

以上、
「日本語変数が流行らない**微弱な**理由」でした。
太陽を追いかけて発電効率をアップする「太陽光追尾システム」（マイコン無し）

## 目的

小中学生向けのハンズオンの教材として使えないかと試作。「半田ごて」を使うのは少し危険なので、ブレッドボードを使う方法にした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/db775cce-482d-0e72-4cb4-b08f962fdf90.png)

## 参考にしたサイト

[Solar Tracking System Circuit Diagram](https://solderingmind.com/solar-tracking-system-circuit-diagram/)


## 実施内容

①上記サイトの回路を元にブレッドボードの配置を考える
②ブレッドボードの配置は、オンラインCAD（[www.tinkercad.com](http://www.tinkercad.com)）を使用
   - 事前に色々試せるのでとても便利！

![Smooth Kup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/6fc9e192-1d9f-fea0-3f5a-077648de6d15.png)

③実装


## 完成品
<iframe width="560" height="315" src="https://www.youtube.com/embed/EtnEHBs71_U?si=6VM7TbqyHG2Jvsee" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


他の方の動画（参考）
<iframe width="560" height="315" src="https://www.youtube.com/embed/v0RgOM9d4gc?si=HaM8Qbqso8l1RQTA&amp;start=898" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>



## 感想

- 動きがあるので子供受けが良さそう
- 部品数も少なく、トータルコストが安い

## 課題

1. 配線が多めで、少し複雑
2. 本当は光センサーは太陽電池に取り付けるのだが、配線の弾性でモーターの回転を邪魔してしまう。工夫が必要。

## 部品一覧
購入先：[秋月電子](https://akizukidenshi.com/catalog/default.aspx)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/2ee7022e-0645-3d8d-9d97-ea179db11ffb.png)

IC,CdSは予備で２セット買っています（なので、１台あたりは半分で済みます）


## その他
電子工作は素人なので、回路図を理解するためにChatGPTを活用しました。
想像以上にちゃんと解説してくれて、とても分かりやすかったです。

### 画像認識させた回路図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181708/f8d58ac5-2325-593e-8e4e-6e1c4b325659.png)

```dos:プロンプトと結果
■プロンプト
あなたは、電子工学の高校教師です。この回路の説明をして（15歳でもわかるように）

■結果
この回路は「自動太陽光追尾装置」といって、太陽の光を追いかけるために作られたものです。太陽の光を使って、パネルや装置が一番明るい方向を向くように調整する仕組みです。以下、わかりやすく説明します。

使われている部品
1.	LDR（光センサー） - この回路には「LDR1」と「LDR2」という2つの光センサーが使われています。LDRは光を感知する部品で、明るい光が当たると抵抗が小さくなり、暗くなると抵抗が大きくなります。この変化を使って、どちらのセンサーがより明るい方向を向いているかを判断します。
2.	TDA2822チップ - これはオペアンプ（オペレーショナルアンプ）と呼ばれるIC（集積回路）です。LDRから送られてくる光の信号を処理し、どちらに動かすべきかをモーターに伝える役割を持っています。
3.	モーター - モーターは、太陽の方向に向かって動くために回路に接続されています。TDA2822からの信号によって、右か左に動かされることで、パネルや装置が太陽を追いかけます。
4.	10kΩ抵抗 - これらの抵抗は、LDRの感度を調整したり、回路全体のバランスを取るために使われます。
5.	電池（3.7V） - この回路には3.7Vの電池が使われており、全体の電源を供給しています。

どうやって動くのか
1.	LDRが太陽光を感知
2.	2つのLDR（LDR1とLDR2）は、どちらがより強い光を受けているかを感知します。たとえば、LDR1が強い光を受けていると、その抵抗が下がります。
3.	TDA2822が信号を処理
4.	LDR1とLDR2からの信号がTDA2822に送られ、TDA2822はどちらのセンサーがより明るいかを判断します。もしLDR1が明るい光を受けていれば、モーターはその方向に動きます。
5.	モーターが動く
6.	モーターは、TDA2822からの信号に応じて回転し、装置を明るい方向に向けます。これにより、太陽を追いかけるように装置が動きます。
7.	太陽を追い続ける
8.	太陽が動くと、光の方向が変わります。それをLDRが感知し、またTDA2822に信号を送り、モーターが動いて装置が太陽を追いかける動きを続けます。

簡単なまとめ
•	LDRは光を感知して、どちらが明るいかを判断します。
•	TDA2822はその情報を使って、モーターを右か左に動かす指示を出します。
•	モーターが装置を動かして、太陽の光が一番よく当たる方向を向かせます。
これが「自動太陽光追尾装置」の動作の仕組みです！


```
決勝用アップデート(v2024.9.26.0-for-final)でシミュレーションが開始しない！の解決方法

# はじめに

自動運転AIチャレンジ2024決勝 @ 11月初旬 に向けて開発を進めています。

https://www.jsae.or.jp/jaaic/2024ver/summary/

直近9/26に、以下の 決勝向けアップデート がありました。

https://github.com/AutomotiveAIChallenge/aichallenge-2024/releases/tag/v2024.9.26.0-for-final

こちらをcloneして、これまでの手順通り`./run_evaluation.bash`コマンドを打ってみると…
**車両が動かない…！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/390340fb-e9fa-ebab-516a-1a9f292b12e0.png)

どうやら`Start screen capture`でスタックしているようです。
bashシェルスクリプトでいうと以下です。
```run_evaluation.bash
…
# Start recording rviz2
echo "Start screen capture"
until (ros2 service type /debug/service/capture_screen >/dev/null); do
    sleep 5
done
…
```

https://github.com/AutomotiveAIChallenge/aichallenge-2024/blob/v2024.9.26.0-for-final/aichallenge/run_evaluation.bash#L34-L38

こちら、解決方法を見つけましたので共有します。

# 解決方法

**`tier4_screen_capture_rviz_plugin`(AutowareScreenCapturePanel)を追加する**で解決できました。
少なくとも私の環境では動作しています。

https://autowarefoundation.github.io/autoware.universe/pr-2609/common/tier4_screen_capture_rviz_plugin/

Rviz2の左上`Panels` - `Add New Panel`を押下、`AutowareScreenCapturePanel`を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/966279fe-7ba5-13d6-465a-9418811a5248.png)

走り出します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628135/a8fc6320-9d84-c9e4-343c-e2d981ecc801.png)



# おわりに

Rviz2の表示が大幅アップデートされていました。かっこいいです。
大きいアップデート時って大体すんなり動かないですよね、あるある。

デバッグ作業も楽しんでいきましょ〜！

この記事は、AI文章校正ツール「ちゅらいと」で校正されています。
【Figma】覚えておきたい便利なショートカット7選

# はじめに
最近Figmaを使い始めたので、作業していて便利だなと思ったショートカットを忘れないようにまとめました。

| 記号 | 意味 |
|:-:|:-:|
| ⌃ |Controlキー|
| ⌥  |  Optionキー |
|  ⇧ |  Shiftキー |
|  ⌘ | Commandキー  |

**ちなみに**
すべてのショートカットを知りたい方は、Figmaで`⌃⇧?`を押すと、ショートカットキー一覧を確認できます。
利用したことのあるショートカットキーは青色になっています。
![スクリーンショット 2024-09-30 12.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/8e39b141-4c80-5cf5-3cdb-54c9ef786ef1.png)

# 1. ⌘D : 複製
フレーム、パーツ、テキスト、なんでも複製できます。
![2024-09-1813.30.22-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/07816e83-f46e-ece5-4f7b-9c57bfdf78e5.gif)


# 2. ⌃⌥T : 均等配置
選択している複数のアイテムを均等配置することができます。
![2024-09-2918.14.56-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/3b3bb0b6-671c-864e-72ef-c450fc732dc9.gif)

# 3. ⌥A, ⌥W, ⌥S, ⌥D : 整列
Aは左、Wは上、Sは下、Dは右方向に配置することができます。
![2024-09-2918.18.16-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/5d61eeda-90ca-3fad-8003-5f91ee526e67.gif)

# 4. ⌥HV : 上下左右中央配置
選択したアイテムをフレームの中央に配置することができます。
並行方向で中央にしたい場合は、⌥H。垂直方向で中央にしたい場合は、⌥V。
![2024-09-2921.31.37-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/b7e902d4-e54f-2b4b-3b66-a0c82e5cd1d8.gif)

# 5. ] : レイヤー移動
レイヤーを一番上の階層に移動させることができます。
一番上ではなく、一つ上の階層に移動させたい時は`⌘`を一緒に押します。
反対に、一番下に移動したい場合は`[`。
![2024-09-3012.09.20-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/2248642f-57b9-0f27-d925-d0dfdde74dc3.gif)


# 6. ⌥⌘K : コンポーネント化
選択したアイテムをコンポーネントとして扱えるようになります。
選択しているパーツが紫色の線で囲われたらコンポーネント化完了です。
![2024-09-3012.14.25-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/a943fe45-2f7c-717e-2177-d1d5a216bd08.gif)


# 7. ^C : カラーピッカー
カーソルを置いた場所のカラーコードを知ることができます。
![2024-09-3012.18.15-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/3993fdbd-5824-48fc-1f59-f630222651c9.gif)

# 終わりに
今回は覚えておきたい便利なショートカット8選を紹介しました。
ショートカットをうまく使いこなして、生産性を上げていきましょう！
YANSシンポジウム2024に参加しました!

こんにちは、東京科学大学(東工大） 奥村・船越研究室の修士2年生、呂博軒です。
今回、YANS2024に初めて参加させていただきましたので、その体験をお伝えしたいと思います!
## YANSとは
YANSは「言語処理若手の会」の略で、自然言語処理分野の若手研究者や技術者の交流と成長を目的としたシンポジウムです。今年は大阪の梅田スカイビルで開催され、数百人もの参加者が集まる大規模なイベントでした。
## 構想段階の研究発表（自分の発表）
私は「なぜ機械翻訳モデルの推定確率と人手評価の相関係数が低いのか？：原因分析と改善策の検討」というテーマで発表しました。正直なところ、これは完全に構想段階の研究で、実験結果もない「机上の空論」でした...
しかし、YANSの素晴らしいところは、このような初期段階の研究アイデアでも発表の機会が与えられることです!!!
様々な方々と議論を交わし、今後の実験計画に非常に有用なアドバイスをいただけました。
(特に、この分野の著名な先生からもご意見をいただけたのは大変光栄でした!)
このような経験は、YANSならではのものだと感じています。アイデアを育て、実験へと繋げていく貴重な機会となりました。
## チュートリアルとポスターセッション
YANSは、研究のポスター発表だけでなく、様々なチュートリアルも用意されています。
特に印象に残ったのは、佐藤竜馬さんによる「ニューラルネットワークの損失地形」というチュートリアル講演でした。
（スライドは以下の通りです）
https://speakerdeck.com/joisino/landscape
内容が非常に興味深いだけでなく、発表自体もわかりやすく構成されていて、大変勉強になりました。お恥ずかしながら、普段から指導教員に「発表のやり方をもう少し勉強したほうがいい」と言われている身としては、良い手本を見ることができました。
![985433D84FD5AA8707A690460FE91AB7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898100/a8e3a684-418c-532a-e086-ed54cda581d6.png)

ポスターセッションでは、自分の専門分野である機械翻訳関連の発表や、最近注目を集めているLLM（大規模言語モデル）の研究など、幅広いトピックの発表を聞くことができました。最新の研究動向を知り、自分の研究のヒントを得る絶好の機会となりました。
## 旅費補助！
YANSの素晴らしさは、研究発表の場を提供するだけでなく、若手研究者をサポートする姿勢にも表れています。私は幸運にも、YANSの委員会から旅費補助をいただくことができました!!!
研究室の状況によっては旅費の補助が難しい場合もあると思います。そのような中で、YANSがこうしたサポートを提供してくれることは、学生にとって大変ありがたいことです。これにより、より多くの若手研究者が参加し、貴重な経験を積む機会を得ることができるのだと感じました。
## 終わりに
YANSへの参加は、私にとって非常に刺激的で有意義な経験となりました。構想段階の研究アイデアを発表し、フィードバックを得られたこと、最新の研究動向に触れられたこと、そして多くの研究者と交流できたことは、今後の研究生活に大きな影響を与えてくれると確信しています。
YANSの運営委員の皆様、参加者の皆様、そして素晴らしい機会を提供してくださった全ての方々に心から感謝申し上げます。来年もぜひ参加したいと思います！
git stash で作業を一時保存：ブランチ切り替えの際，変更差分が残っていて切り替えができない...なんてことないですか？

あるブランチで作業していて他のブランチに移動した際にせっかくした作業が消えてしまった（または、ブランチ移動できないというエラーが出る）ことはありませんか？
git stashというコマンドを用いるとそのような作業中の差分を一旦退避できます！

:::note info
**先に結論**
stashした後に変更を破棄してブランチを切り替えてその後stashしたものを適用する．という流れで変更差分が残っていてブランチ切り替えができる．
:::

gitそのものの概念やgitコマンドのチートシートはこちらから

https://qiita.com/JavaLangRuntimeException/items/6b46551f56e0def76eba

:::note info 
**git stashとは**
作業中の変更を一時的に保存し，後で再適用するためのGitコマンドである
:::

git stashは以下のような状況で特に有用である

- 作業中に緊急の修正が必要になった場合
- ブランチを切り替える前に現在の作業を保存したい場合
- プルする前に競合を避けたい場合



# 変更を一時保存する
```bash
git stash push
```
または、メッセージを付けて保存
```bash
git stash push "作業中の変更"
```

:::note warn
このコマンドはgitオブジェクトとして追跡済みの場合(addした場合など)のみstashする
:::

# 追跡外のファイル含めて変更を一時保存
```bash
git stash push -u
```
:::note info
追跡外のファイルを含めてstashする．addしていないファイルもstashしたい場合はこのコマンドを使う
:::

# 保存した変更（stash）の一覧を表示
```bash
git stash list
```

# 最新のstashを適用する
stashを適用とは作業ディレクトリにstash listに一時保存した状態を適用するということ．これをすると，最新のstashはstashリストから削除される
```bash
git stash pop
```

適用した後にコミットすれば作業ツリーに履歴が残る
```bash
git commit -m "コミットメッセージ"
```
:::note info
最新のstashを適用するが、stashリストからは削除しない
```bash
git stash apply
```
特定のstashを適用
```bash
git stash apply stash@{n}
```
ここで、nは`git stash list`で表示されるインデックス番号
:::

# 最新のstashの内容を確認
```bash
git stash show
```
より詳細な差分を見るには
```bash
git stash show -p
```
# 特定のstashを削除
```bash
git stash drop stash@{n}
```
# 全てのstashを削除
```bash
git stash clear
```

# 変更差分が残っている状態でブランチ切り替えをする
1.変更差分をstashする
```bash
git stash push -u
```
2.変更差分を破棄する
```bash
git restore .
```
3.ブランチを作成する
```bash
git switch -c <new-branchname>
```
4.最新のstashを適用
```bash
git stash apply
```


# stashの注意点
- stashはグローバルであり、全てのブランチで共有される
- 複数のstashを管理する場合は、わかりやすい名前を付けることが推奨される
- 長期間stashを放置すると、コンテキストを忘れる可能性があるため注意が必要

git stashを効果的に使用することで、作業の流れを中断することなく、柔軟にタスクを切り替えることができる。
VS Codeの拡張機能の開発で困った話（デバッグ）

# VS Codeの拡張機能の開発で困った話（デバッグ）

## 1. 本記事のターゲット層
(1) VS Codeの拡張機能開発に挑まんとする者
(2) 個人開発がしたいヘンタイ
(3) TypeScriptやNode.jsを学びたい人

## 2. イントロダクション
今回、この記事を書くきっかけとなったのは、VS Codeの拡張機能開発をしている中で、公式の[GET STARTED](https://code.visualstudio.com/api/get-started/your-first-extension)を実行するとエラーがたくさん出て戸惑ったからです。

他にも戸惑う人がいると思い、助けになればと考えてこの記事を書いています。

VS Codeの拡張機能の開発は仕事ではなく、個人開発の領域でやっていました。

いま、まさに開発したい拡張機能がありまして、TypeScriptの勉強にちょうどいいかなと思い、言語もそれを選んで開発をしております。

開発の勉強をする際、初級の壁を超える上でもっとも重要なことは「自分がやりたいことを見つけること」だと思います。

実際の開発現場においても、誰かのやりたいこと（人によって鮮明度合いは違いますが）がまず先にあり、ヒアリングによってそれを聞き出した結果を要件定義に落とし込み、要件の鮮明度合いに応じた対応、あるいは開発手法を選択していきますよね。

それと同様にまずは「自分のやりたいこと」を先に見つけて、それを実現するためにはどうしたらいいか考えながら開発を進めていくことで、学んだ知識を活用する力が身に付くと考えています。

そのため、今回は日頃の業務で「あったらいいな」という簡単な検索機能を持つVS Codeの機能開発を通じて、TypeSctiptの実践的なコーディングをすることに挑戦しようとしていました。そうした中で、様々な問題に直面し、この記事を書こう！と思い立ちました。

TypeSctiptやNode.jsについて、これから学んでいこうとする方も、ぜひ拡張機能開発から始めるとスモールスタートで実践力が身に付くのではないかと思っています。そのため、本記事のターゲット層に含んでおります。

## 3. 具体的な事象とそれに対する対応内容について

### preLaunchTask 'npm watch'を実行後にエラーが存在します
![](https://storage.googleapis.com/zenn-user-upload/288c9308cf8e-20240930.png)
このエラーは、参照しているモジュールやライブラリが見つからないことが起因になって表示されています。

`extention.ts`や`extention.test.ts`の中身を見ると、赤線(エラー)が表示されているので、その部分を解消する必要があります。

#### console.logでエラー表示している場合
tsconfig.jsonのlibに`dom`を追加します。

```
{
	"compilerOptions": {
		"module": "Node16",
		"target": "ES2022",
		"outDir": "out",
		"lib": [
			"ES2022","dom"
		],
    ～～省略～～
```
#### vscodeでエラー表示している場合
tsconfig.jsonのtypesに`vscode`、`node`を追加します。typesがない場合は、typeRootsも一緒に追加します。

```
    ～～省略～～
		"lib": [
			"ES2022","dom"
		],
		"sourceMap": true,
		"rootDir": "src",
		"typeRoots":[
			"node_modules/@types"
		],
		"types":[
			"vscode",
			"node"
		],
    ～～省略～～
```

※typeRootsがなかった場合はPowerShellでプロジェクトフォルダから以下のコマンドを実行する。
```
yarn add --dev @types/vscode @types/node
```

#### assert、suite、testでエラー表示している場合
tsconfig.jsonのtypesに`mocha`を追加します。typesがない場合は、typeRootsも一緒に追加します。

```
    ～～省略～～
		"lib": [
			"ES2022","dom"
		],
		"sourceMap": true,
		"rootDir": "src",
		"typeRoots":[
			"node_modules/@types"
		],
		"types":[
			"mocha"
		],
    ～～省略～～
```

※typeRootsがなかった場合はPowerShellでプロジェクトフォルダから以下のコマンドを実行する。
```
yarn add --dev @types/mocha
```

### 4. まとめ
環境によって他にもエラーが出る場合もあるかもしれないですが、現時点では私が発見して、対応できたものは以上となります。

では、楽しいコーディングライフを！！
1からアプリケーションを作るエンジニアリングマネージャーの姿：環境構築編

## 目的
 - エンジニアリングマネージャーをやっているが、あまりにもエンジニアリングがわかっていない
     - 1作業者として実務行った経験しかなく、0から開発ができない
         - 開発環境の構築とは？
         - アーキテクチャの選定とは？
         - Gitの使い方を忘れている... etc
     - これでEMを名乗るのは恥ずかしい
 - 作ってみたいアプリがあるので、それを作って生活をリッチにする
     - ユーザー（私）は人通りの多かったり幅が狭かったりする道が苦手なので、反対に「ここは歩きやすかったぞ！」という道をトレースしたいという要望を持っている


### 環境構築
- VSCodeのインストール
    - これはなに？
        - 統合開発基盤。ここでソースコードを打っていく
    - なぜやる？
        - これがないとソースコードを書けなくて何も始まらない
<br>

 - Node.jsの[インストール](https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b)
     - これはなに？
         - [ここ](https://qiita.com/non_cal/items/a8fee0b7ad96e67713eb)に詳しい
     - なぜやる？
         - 今回はJavaScriptで開発するが、JSでの開発に必須のライブラリ（らしい）から入れておく
     - 補足
         - 環境パスへの設定をしないと、npmが通らなかった
<br>

 - Gitのインストール
     - これはなに？
         - ファイル管理の大定番。ソースコードを含むドキュメントのバージョン管理ができる
     - なぜやる？
         - これをインストールしないとバージョン管理ができない
     - どうやってやる？
         - [Git](https://git-scm.com/download/win)をダウンロードする
         - [GitのIDとEメールアドレスを入れる](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup)などの初期設定を済ませる

<br>
 
 - GitHubの構築
     - これはなに？
         - ファイル管理の大定番。GitをGUI上で操作できる
     - なぜやる？
         - Gitで全部を操作するのもいいが、初心者なのでGUIがあった方がとっつきやすい
     - どうやってやる？
         - レポジトリを作る（[命名規則はないらしい](https://zenn.dev/ikeh1024/articles/4ba70c41f4f54)） 
<br>



 - VSCodeとGitHubの連携
     - これはなに？
         - VSCodeをローカルフォルダにつないで、なおかつVSCodeからGitHub上のリモートレポジトリにPushができる
     - なぜやる？
         - ソースコードのエディタ（VSCode）と、
     - どうやってやる？
         - [ここ](https://www.kagoya.jp/howto/rentalserver/webtrend/vscode/)に書かれている手順に従って行う
<br>

 - VSCode上のGitのコミット歴をきれいに見るツールをインストールする
     - これはなに？
         - ソースコード上のコミット履歴をイケてるビジュアルにする
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441429/501672f2-b46c-2c4b-921f-e52bd3b19a11.png)

     - なぜやる？
         - もとのコミット履歴は見づらい
         ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441429/2ed0df2d-014d-ef78-5d89-838b4756ff8e.png)
     - どうやってやる？
         - [ここ](https://dev.classmethod.jp/articles/vscode-git-graph-extension/)に書かれている手順で、ここに書かれている通りの拡張アプリをVSCodeに入れる


<br>
 

### （WIP）もっと知りたいこと
 - VSCodeでのGitの作業方法がわからん
 - CI/CDってどうやって作るんだ
【DAY21】herokuでデプロイ後のDBの確認方法

Herokuで作成したQ&Aサイトをデプロイしたが、その後にDBの中身を確認する方法が分からず少々手間取ったので、その方法をここにまとめます。
## HerokuにおけるDBについて
HerokuではPostgresというデータベースを使用しています。私はHeroku Postgresのessential-0のプランを使用することにしました。

## デプロイ後のDB確認方法
Herokuで対象のアプリケーションに移動したら、Resourcesに移動しHeroku Postgresをクリックします。
続いて、Dataclipsに移動してCreate Dataclipを選択します。
ここで、SQL文を記述することができます。
試しに、「全質問内容取得」とタイトルをつけて以下のSQL文を記述しました。
```sql
SELECT * FROM questions;
```
Save&Runで実行すると、questionsテーブル内の情報が取得できました。
この作成したDataclipは保存されているため、もう一度同じSQL文を記述しなくてもSQLの実行ができるみたいです。

以上がHerokuでデプロイ後のDBの確認の方法でした。
PySimpleGUIを使おうとしたらユーザー登録が必要で急遽古いバージョンをインストールした話

最近Pythonを触るべきだと思い学習を始めてみた。
（なぜなら大学の後輩たちが必修でPythonを勉強してるから・・・）

簡単な文法を勉強して、いざPythonで何をやろうと考えたときに以下の書籍を本屋で発見。

https://www.shoeisha.co.jp/book/detail/9784798174990


アプリケーション開発は以前から興味があり、基本的な文法は学習しているため、今の自分のレベルに適切だと思い購入。
頑張ってやり切ろうとしたところで題名にある通りの問題が発生した。
この記事はその出来事の備忘録として残しておこうと思う。

ちなみに本記事がQitta初投稿であり、プログラミング初心者のため基礎的な部分しか扱っていないことをご容赦いただきたい。

## ライブラリについて

この書籍ではPySimpleGUIを利用している。

https://www.pysimplegui.com/

上記のライブラリを以下のコマンドを用いてインストールした

```
python -m pip pysimplegui
```

（おそらくこの記事を閲覧しているほとんどがライブラリのインストール方法を存じ上げていると思うが、自分自身の備忘録として残したいので、ご容赦いただきたい。）

ちなみにインストールの方法などは公式HPに載っているため、そちらを参照しても問題ない。（むしろそっちの方がいいかもしれない）

インストールし、サンプルコードを実行したところ以下のようなウィンドウが表示された。

**表示されたウィンドウ**

![スクリーンショット 2024-09-30 072610.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898007/5c9cfc8a-6ca2-e243-8e6b-99143ad67482.png)

このウィンドウについての記述は書籍には無く、「なんだこれ？」と驚いた。

調べてみると2024年の春から商用利用が有料化されたそうだ。
個人利用については今まで通り無料らしいが、ユーザ登録が必要らしい。

正直、自分が今後どのくらいPythonを使ってアプリを作るのかが明確ではないし、ユーザー登録が面倒だと思った。
しかも、書籍ではこのライブラリを用いて説明をおこなっているため、学習を躊躇する羽目になった。

## 対処方法
調べてみるとPySimpleGUI5はユーザー登録が必要だが、それ以前のバージョンはユーザー登録が無くても利用できるそうだ。
ということで、今のバージョンを一旦アンインストールしてみた。

ちなみにコマンドは以下を利用。
```
pip uninstall pysimplegui
```
実行すると
```
Successfully uninstalled PySimpleGUI-5.0.6
```
という表示が出た。
これでアンインストールが完了した。

さて次は、古いバージョンをインストールする。
今回は**バージョン4.60.5**をインストールすることにした。
コマンドは以下の通りである。
```
pip install pysimplegui==4.60.5
```
無事にインストールできたところで、先程と同じコードを実行してもウィンドウが出なくなった。
これでめでたく書籍を進められそうだ。

とりあえず一件落着だが、いずれこのバージョンが使われなくなっていった際に新しいバージョンを利用することになるだろう。
その際は、素直にユーザー登録をして新しいバージョンを利用したいと考える。

この一連の流れおよび、各バージョンのメリット・デメリットを説明している動画があり、今回はそれを参照した。

**参照した動画**
<iframe width="560" height="315" src="https://www.youtube.com/embed/Ru1ZyElCN5s?si=plHfoLhh6ub6_kRe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

また、この動画にもある通り、TKEasyGUIというものがあり、PySimpleGUIの代わりに利用できるGUIライブラリだそうだ。
そちらを利用してもよいと思うため、今後PythonでGUIを用いたアプリケーションを作成するときは使用するライブラリを考えるところから始まりそうだ。

## 終わりに
書籍を進めていく際、このような壁にぶち当たるのは初めてだった。
今後このように自分で調べて対応したことについては記事にまとめてみようと思う。
（類似する記事が既に存在する可能性は非常に高いが・・・）

この記事が未来の自分や、誰かの役に立つことができたら嬉しい限りである。
これからもプログラミングの勉強を頑張っていきます。
cscの作法 その521

# 概要
cscの作法、調べてみた。
練習問題やってみた。

# 練習問題
c#を褒めよ。

# 自分の回答
# 「OS標準で、EXEファイルが作れる。最高。」
- コンパイラが、ただ。
- ドキュメントが、豊富。
- メモ帳で、作れる。
- 世界遺産級。



以上。
paiza.ioでc# その8

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
オブジェクト指向なfizzbuzzを書け。

# 参考にしたページ

https://qiita.com/annin_jp/items/5b9872056c0c66b31627


# サンプルコード

```
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication2
{
    interface IStrategy
    {
        bool IsFizzBuzz(int i);
        string DoFizzBuzz();
    }
    class Fizz: IStrategy {
        public bool IsFizzBuzz(int i) {
            return (i % 3) == 0;
        }
        public string DoFizzBuzz() {
            return "Fizz";
        }
    }
    class Buzz: IStrategy {
        public bool IsFizzBuzz(int i) {
            return (i % 5) == 0;
        }
        public string DoFizzBuzz() {
            return "Buzz";
        }
    }
    class FizzBuzz {
        private List<IStrategy> strategy = new List<IStrategy>();
        public FizzBuzz() {
            this.strategy.Add(new Fizz());
            this.strategy.Add(new Buzz());
        }
        public string DoFizzBuzz(int i) {
            if (i == 0) 
                return "";
            string msg = "";
            bool isAllFizzBuzz = true;
            foreach (IStrategy st in this.strategy)
            {
                if (st.IsFizzBuzz(i))
                {
                    msg += st.DoFizzBuzz();
                }
                else
                {
                    isAllFizzBuzz = false;
                }
            }
            if (isAllFizzBuzz)
            {
                msg = "";
                foreach (IStrategy st in this.strategy)
                {
                    msg += st.DoFizzBuzz();
                }
            }
            else if (string.Empty == msg) 
            {
                msg = i.ToString();
            }
            return msg + Environment.NewLine;
        }
    }
    class Program {
        static void Main(string[] args) {
            int input = 1;
            int max = 100;
            FizzBuzz objFizBuz = new FizzBuzz();
            string msg = "";
            try
            {
                for (int i = input; i <= max; i++)
                {
                    msg += objFizBuz.DoFizzBuzz(i);
                }
                Console.WriteLine(msg);
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
        }
    }
}




```

# 実行結果

```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

```

# 成果物

https://paiza.io/projects/INjkFqz1DOwVWvBU9QmpnA

以上。
watsonx OrchestrateでServiceNowに接続してみる

## watsonx OrchestrateからServiceNowを呼び出す
watsonx Orchestrateでは「スキル」と呼ばれる様々な業務処理をチャット画面から自然言語で呼び出すことが可能です。製品にはプリビルド・スキルと呼ばれる1500以上のスキルが付属し、簡単な設定を行うことですぐに利用が可能です。この記事ではServerNowのスキルを設定し、呼び出すまでの流れについて説明します。
## ServiceNow環境の準備
今回は、開発者向けのテナントを使用します。[開発者向けポータル](https://developer.servicenow.com/dev.do#!/home)よりインスタンスを申請することで5分ほどでインスタンスにアクセスできるようになります。

## アプリケーションの登録
watsonx OrchestrateからServiceNowにアクセスできるように、アプリケーションを登録します。ナビゲーション・メニューからAllをクリックし、検索フィールドにOauthとタイプすると表示される、「Application Registry」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/668321a5-58be-5949-7e1e-1d61321d83e9.png)

右上の「New」ボタンをクリックすると、アプリケーションの種類を確認されるので、「Create an OAuth API endpoint for external clients」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/a1f1b836-14fc-f1e0-d088-d50e891e0934.png)

アプリケーションの情報を入力します。設定が必須の項目は以下の3つです。

Name： アプリケーションの名前
Redirect URL: https://dl.watson-orchestrate.ibm.com/mfe_connectors/api/v1/oauth/_callback
Client Type: Integration as a User

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/22062163-f23c-7803-2bd1-58467dca7735.png)

「Submit」ボタンをクリックしてから、作成されたアプリケーションを開き、Client IDとCient Secretをコピーします。

## アプリケーションへの接続
watsonx Orchestrateでスキル・カタログを開き、ServiceNowのスキルを選択します。右上の「接続」をクリックし、接続に必要な情報を入力してから「アプリの接続」ボタンをクリックします。ちなみに、現時点でServiceNowのための27個のスキルを利用可能です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/ec9ea67c-ef97-e2dc-69db-5fc334244434.png)

接続が成功しない場合には、入力した項目を確認してください。

## スキルの呼び出し
では、スキルの呼び出しを確認してみましょう。今回はインシデントの一覧を取得してみます。カタログから、「Get all incidents」を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/01312d08-72b8-91f4-6ce4-d39b157fe1d8.png)

チャット欄に「get all incidents」と入力し、必要に応じてフィルター設定を追加します。

※2024/9時点で、プリビルド・スキルの日本語化が完了していませんが、今後日本語の利用も可能になる予定です。また、現時点でもスキルフローでラップすることで日本語での利用が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/2af4ec03-72f2-7e19-3ee2-acac7db77518.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/0baf8f09-0cb6-a914-1eb5-33f0c57564df.png)

インシデントのリストが正しく表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/1e54eccb-1442-c297-87c6-13dfe261d17b.png)

## まとめ
watsonx Orchestrateには、プリビルド・スキルと呼ばれる1500以上の業務処理の呼び出しが事前定義され、アプリケーション側で簡単な設定を行うだけで処理を呼び出すことが可能になります。この記事では、ServiceNowの場合の設定方法を説明しました。実際に業務で利用する際には、単体でのスキル利用だけではなく、スキルフローやワークフローと組み合わせることで一連の業務処理を効率化することが可能になります。

watsonx Orchestrateは頻繁にアップデートが実施されています。製品の最新情報は[こちら](https://community.ibm.com/community/user/automation/communities/globalgrouphome?CommunityKey=a80f199e-a0d6-43ab-bca0-7303a731ede9)にも記載しておりますので是非ご覧ください。
【PHP】 スーパーグローバル変数（定義済み変数）

## スーパーグローバル変数とは

PHPのスーパーグローバル変数は、定義済み変数でプログラムコード中何処からでも使用可能な変数のことです。 関数やメソッドの内部からアクセスする際にも「global $変数名」などとする必要がない。スーパーグローバル変数は9種類あります。


## 変数一覧

1. [**$GLOBALS (グローバル変数)**](https://qiita.com/With21/items/78e80197cd0f7fbe36c5)
   + グローバルスコープに現在定義されているすべての変数への参照
   + 連想配列として使用
2. [**$_SERVER (サーバー変数)**](https://qiita.com/With21/items/1c0520921d8729813473)
   + サーバー情報および実行時の環境情報
   + 連想配列として使用
3. **$_GET (GET変数)**
   + URLパラメーター、HTTP GET として送られてきた値を取得する変数
   + 連想配列として使用
4. **$_POST (POST変数)**
   + HTTP POST で送られてきた値を取得する変数
   + 連想配列として使用
5. [**$_FILES (ファイルアップロード変数)**](https://qiita.com/With21/items/65b761ca5e8d2f8bec4b)
   + HTTP POSTで アップロードされた値を取得する変数
   + 連想配列として使用
6. **$_COOKIE (クッキー変数)**
   + Cookie(クッキー)システムによってHTTP クッキーから渡された値の変数
      + Cookie(クッキー)とは、ウェブサーバーとウェブブラウザの間で状態を管理する機構、または機構による保存データ自体のこと
   + 連想配列として使用
7. **$_SESSION (セッション変数)**
   + 現在のセッションに登録されている値から渡されたデータが格納されている変数
   + 連想配列として使用
8. **$_REQUEST (リクエスト変数)**
   + `$_GET`、`$_POST`、`$_COOKIE` などの内容をまとめた変数
   + 連想配列として使用
9. **$_ENV (環境変数)**
   + 環境変数として現在のスクリプトに渡された変数
   + 連想配列として使用

スーパーグローバル変数は全て大文字になることを覚えておきましょう。
また、関数やクラスメソッドの中の可変変数として使用することはできないことは注意しましょう。

スーパーグローバル変数は、PHPでプログラミングを行う上で必須です。種類も9つしかないためしっかり理解しましょう。

※変数一覧リンク先の設定については随時更新(2024/11/01)


## 参考
+ [PHP マニュアル 言語リファレンス 定義済みの変数](https://www.php.net/manual/ja/language.variables.superglobals.php)
+ [wepicks.net PHPリファレンス](https://wepicks.net/category/phpreference-structure/)

<br>
著者: E.R (株式会社ウィズツーワン)
【ServiceNow】Washington DCリリース「Go back to Flow Logicの実装」

# はじめに
みなさんこんにちは、三井情報株式会社です。

本記事ではWashington DCへのバージョンアップでFlow Designerに追加された Go back to Flow Logic の実装例についてご紹介いたします。

# Go back to Flow Logicの実装例
### 概要
承認申請における差し戻しのフローを作成します。
一次承認者が申請を承認したのちに二次承認者が申請を却下した場合、一次承認ステップに戻るようにします。
### 実装方法
（1）一次承認グループ、二次承認グループを事前に作成しておきます。
（2）Workflow studioを開き、New > Flow を選択して、新規のフローを作成します。
（3）フローのTriggerを設定します。
![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/ac27c26e-b07c-390f-a9c8-57b53401349b.png)
（4）一次承認者への申請依頼を設定します。
![2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/de0d5bdd-9cbc-c3f2-f445-eaaa943c7214.png)
（5）一次承認者が申請を承認した場合のif文を設定します。
![2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/fd60092e-139a-d5a9-fb73-32ee40beaf28.png)
（6）二次承認者への申請依頼を設定します。
![2-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/0366fde1-cb18-def0-9ebc-f6841af54bfa.png)
（7）二次承認者が申請を承認した場合のif文を設定します。
![2-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/f7764bae-4672-090a-5f42-b174d0f4f0ad.png)
（8）二次承認が承認された場合の処理を設定します。
![2-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/3c062469-7aba-808b-a457-347dd57878df.png)
（9）elseに二次承認が却下された場合のGo back toステップを追加します。
![2-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/06e9d6bd-5120-e25a-a6a8-21ffd82dd555.png)

### 実行結果
①一次承認依頼を承認
![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/aae6aabd-673a-86ec-d88e-cdb8036c3d41.png)

②二次承認依頼を却下
![3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/72b1498d-06fe-ec7e-e675-19b378cffbed.png)

# 参考
本記事は、以下のドキュメントを参照しています。

https://docs.servicenow.com/ja-JP/bundle/washingtondc-build-workflows/page/administer/flow-designer/reference/go-back-to-flow-logic.html

# おわりに
本記事ではWashington DCへのバージョンアップでFlow Designerに追加された Go back to Flow Logic の実装例についてご紹介させていただきました。
最後までお読みいただき、ありがとうございました。
「Lambda GetFunction API 認証の変更に関するフォローアップ」に慌てて調べたら原因はAWS管理ポリシーだった

今回は時事ネタというか。。

# Problem

2024/09/29にAWSから次のようなタイトルの警告メールが届きました：

> __[要対応] Lambda GetFunction API 認証の変更__ に関するフォローアップ | [Action Required] Follow up on changes to Lambda GetFunction API authorization [AWS Account: XXXX] [XX-XXXX-X]

本文には以下のようにあって・・・

> ListTags API を明示的に使用する場合にのみ ListTags に対する権限が必要でした。しかし、GetFunction API 権限を持つプリンシパルは、ListTags API が明示的に拒否されている場合でも、GetFunction 呼び出しによって出力されたタグ情報にアクセスできました。 __2024 年 10 月 2 日以降、Lambda は GetFunction API を呼び出すプリンシパルに ListTags API に対する明示的な許可権限が設定されたポリシーがある場合にのみタグデータを返す__ ようになります。GetFunction API を呼び出すロールに ListTags API への拒否ポリシーがあるか、アクセスを明示的に許可するポリシーがない場合、Lambda は GetFunction API 呼び出しへの応答でタグデータを返しません。
> ただし、 __お客様のアカウントには GetFunction API にアクセスする権限を持つロールがある__ ことがわかりました。

影響を受けるIAMロールとそれがアタッチされたリソースをチェックせねば！焦ったものの、運用しているAWSアカウントで作成したロールで、該当するカスタマー管理ポリシーを持つものが見つからず。。。

# Solution

何もしなくて良い（後述の条件に該当する場合）。

メールの案内をよく読むと「影響を受けるロールのリストは、AWS Health ダッシュボードの『影響を受けるリソース』タブで確認できます」とあります。

実際に確認してみると、私の運用しているAWSアカウントの場合、影響を受けるロールは `AWSServiceRoleForSupport`のみで、その名前や作成日からどうやらLanding Zone（Control Tower）の仕組みで自動生成されたもののよう：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/f8468973-4065-fe89-3e2b-3c5681145a3c.png)

これに紐づくIAMポリシーはAWS管理ポリシー `AWSSupportServiceRolePolicy`でその説明には「Allows AWS Support to access AWS resources to provide billing, administrative, and support services.」とありました：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/d99bdeec-300f-b446-f083-6ae1dffab3d1.png)

つまり「要対応」という文言に慌てて対応開始しましたが、警告の原因はAWSサポートのためのAWS管理ポリシーだったということ。

翻って、あらためてメールを良く読むと・・・

> また、Lambda は、AWSServiceRoleForAmazonInspector2、FinSpaceServiceRole、AWSServiceRoleForSupport など、AWS サービスで使用される IAM ロールを自動的に更新することにも注意してください。影響を受けるロールのリストに AWS サービスのロールのみが含まれている場合は、対応は不要です。

ということで、当たり前のことですが __AWS管理ポリシーやそれと紐づく「AWS サービスで使用される IAM ロール」はAWS側で対応するので、これだけが「影響を受けるリソース」に登場するのであれば、ユーザー開発者側では何もする必要がない__ ということ。