OmniAICreator/Qiita-1.07M huggingface dataset:
[応用情報技術者試験]情報システム開発について

## 概要
はじめまして、エンジニアのkeigoです！

本記事では、「応用情報技術者試験」合格のための学習のアウトプットを兼ねて、
分かりやすく整理して書いていこうと思います。

今回のテーマは「*情報システム開発について*」です！

情報システム開発の手法や、種類、具体的な開発の流れなどをまとめました！

では、一緒に頑張りましょう！

## 開発モデルについて

はじめに、開発のモデルについて説明します。
情報システム開発モデルの中でも代表的な２つを説明します。

1. ウォーターフォールモデル
2. アジャイル開発モデル

私は業務システム開発を仕事で行なっていますが、これまで経験した業務システムは全てウォータフォールでの開発でした。

### ウォーターフォールモデル
ウォーターフォール開発は、上流工程と言われる「要件定義」や「設計」など、お客様がどんなものを求めているのか、それをどのように実現していくのか、を決めていくフェーズと、下流工程と言われる「コーディング」や「テスト」のように、上流工程で決められたことを実際に作っていくフェーズに分かれています。

**1. 要件定義**
要件定義はエンドユーザーの希望を聞き出していき、どのようなシステムを開発していくのかすり合わせていくフェーズです。

*①機能要件*
エンドユーザーから求められる、搭載しなければいけない機能のこと。
エンドユーザーがないと困る機能のことです。
    
*②非機能要件*
機能要件以外の要件が非機能要件に当たります。
「質」を向上させるために重要となる要件です。
例えば、稼働時間や、レスポンスまでにかかる時間などがそれに当たります。

上記の機能要件と非機能要件を、コストや納期を踏まえて取捨選択していきます。

*③ステークホルダーの選別*
各工程で必要になる人などを洗い出し、システム開発における利害関係者が誰なのかを把握する必要があります。エンドユーザーはもちろんのことプロジェクトに関わる利害関係者全てが当てはまります。
    

**2. システム方式設計**
    要件定義に含まれることもありますが、要件定義と外部設計の間にあるフェーズです。
    ここでは、１で説明した非機能要件を定義します。

**3. 外部設計**
    画面や帳票など、レイアウト、操作方法などの、エンドユーザー向けの設計を行います。

**4. 内部設計**
    開発者からみた設計を行います。主に、システム内部の動作や機能、データベースのテーブル設計など、ユーザーに見えにくい部分の設計のこと。

**5. 詳細設計**
    プログラマから見た設計を行います。ロジックやデータ処理、具体的なアルゴリズムなどを定義して、プログラマが実際にコーディングできるように設計していきます。


### アジャイル開発
「計画・実行・評価」を短期間で繰り返すことによって機能を段階的にリリースしていく開発モデルです。

■[アジャイルソフトウェア開発宣言](https://agilemanifesto.org/iso/ja/manifesto.html)
有名なプログラマの人たちが集まって宣言したもので、ここがアジャイル開発の始まりです。

`プロセスやツールよりも個人との対話を`
`包括的なドキュメントよりも動くソフトウェアを`
`契約交渉よりも顧客との対話を`
`計画よりも顧客との対話を`

ウォーターフォールでは、工程が進めば進むほど要件の変更による手戻りは大きくなり、納期、コストなどへの影響も大きくなります。しかし、アジャイルでは短い期間でサイクルを繰り返しながら開発を進めていき、変化に柔軟に対応することで、開発後期の要件の変更も歓迎することが書かれています。

■XP（エクストリームプログラミング）
アジャイル開発におけるアプローチ方法の一つになります。
下記に、関連する重要なワードを並べたいと思います。

- イテレーション：XPにおける開発を繰り返す単位
- ペアプログラミング：「書く人」「検証する人」の２人１組でプログラミングを行う。
- リファクタリング：外部からみた動作は変えずに、内部のプログラムのみを改善すること。
- テスト駆動開発：テストを先に作成し、そのテストをパスするようにプログラムを作成していく方法
- YAGNI：You Aren't Going to Need It(今必要なことだけをする)


■スクラム
    こちらもアジャイル開発におけるアプローチ方法の一つになります。
    XPと相容れないものではなく、共存することができます。
    下記に関連する重要なワードを並べます。

- スプリント：スクラムにおける開発を繰り返す単位
- プロダクトオーナー：完成した製品に責任を持つ人
- プロダクトバックログ：プロダクトの機能をユーザーストーリー形式で記述したリスト。プロダクトオーナーが管理。
- スクラムマスター：プロジェクトの推進に責任を持つ人。プロジェクトリーダー的な存在。


## 組み込みソフトウェア開発
組込みソフトウェアの開発の手法を紹介します。

■プラットフォーム開発
    複数の異なる機器について共通して利用できるプラットフォームを最初に設計・開発しておいて、その土台から機器ごとの異なる機能を開発していく手法です。

MDA：モデル駆動アーキテクチャ。プラットフォームに依存する部分と依存しない部分に分けてモデル化する技法。

■コンカレントエンジニアリング
翻訳：
`コンカレント（concurrent）= 同時`

複数の工程を順番に進めるのではなく、同時進行できるところは並行して進めることで開発期間短縮を図る方法です。


## リバースエンジニアリングとフォワードエンジニアリング
既存のソフトウェアを利用して、新しいソフトウェアを作成することを**リエンジニアリング**といいます。

- リバースエンジニアリング：既存ソフトウェアから仕様を解析すること。
- フォワードエンジニアリング：解析した仕様から新しいソフトウェアを作成すること。


## おわりに
ひとまずざっくりですが情報システム開発分野についてまとめました。
長くなり読みにくい文章でしたが、少しでも理解の助けになれば嬉しいです。
また明らかな誤りがありましたら、ご連絡いただけたらありがたいです。

では、応用情報技術者試験の学習、引き続き頑張りましょう！


参考：
令和６年秋版：参考書の著者直伝！【応用情報技術者試験　午前版】講座 　合格に必要な知識の徹底解説＋過去問題解説　石田宏実
https://www.udemy.com/course/ouyou_joho/

応用情報技術者合格教本　大滝みや子 + 岡嶋裕史
Raspberry Pi Pico 2 でLチカ

# Raspberry Pi Pico2が日本でも発売されました

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💡発売開始のお知らせ💡<br>Raspberry Pi Pico 2を本日発売いたしました！👏<br>超小型でありながら柔軟性を損なうことなくRP2350マイコンのフル機能にアクセスできます！<br>税込価格：913円<br>ご注文お待ちしております💁‍♂️<br>詳細はこちら⬇️<a href="https://t.co/BGp7IlKYRe">https://t.co/BGp7IlKYRe</a> <a href="https://t.co/ACOiVLURsc">pic.twitter.com/ACOiVLURsc</a></p>&mdash; KSY@Raspberry Pi (@KSY_RasPi_Shop) <a href="https://twitter.com/KSY_RasPi_Shop/status/1830476016378425543?ref_src=twsrc%5Etfw">September 2, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

搭載されているRP2350(ARM版)は、従来のRP2040に比べて [大幅に高速化](https://www.switch-science.com/blogs/magazine/raspberry-pi-pico-pico-2)されているようです。[FPUも乗ってますし](https://www.arm.com/ja/products/silicon-ip-cpu/cortex-m/cortex-m33)。何に使うかはさておき、Lチカしないと始まりませんね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/be578167-3ff5-27b3-2f58-271a44c9efc4.png)
なお、個人的な趣味でリセットスイッチを追加してあります。最初からリセットスイッチ付き＆TypeCの秋月版も楽しみ。

# 開発環境
- Window 10 Pro 22H2
- MicroPython
- VS Code

# ファームウェアの入手とアップロード
まずはファームウェアの書き込みが必要です。マイコンが変わっているので、従来のファームは使えません。公式HP（[MicroPython Pico2](https://micropython.org/download/RPI_PICO2/)）からファーム（RPI_PICO2～.uf2)をダウンロードしてください。

次に書き込みモードで起動します。購入直後はBOOTSELボタンを押さずともファームの書き込みモードで起動し、USBメモリとして動作します。
あとはダウンロードしたファームをドラッグアンドドロップで保存すればOKです。
正しく認識すれば、デバイスドライバの認識が始まるはずです。

# MicroPythonでのLチカ
[詳しい説明は別の方の記事に譲ります。](https://qiita.com/IoriGunji/items/ebe6cefd3562639f7ca2)
一応プログラムはこちらです。

```python:main.py
from machine import Pin
from time import sleep

led = Pin('LED', Pin.OUT)

while True:
    led.on()
    sleep(0.25)
    led.off()
    sleep(0.75)

```
# 動作
もちろんちゃんと動作しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/6fd0687b-e019-350e-6925-c5c0ac5c52a2.png)

# 今後
RISC-V版も出たら買おうと思います。チップ単体での値段も楽しみ。
（そうえいば、少し前のマイコン高騰時はRP2040だけは入手しやすくて助かりました）
株式会社グロースバリュの開発チームで働いてみての感想

## はじめに
初めまして。
webエンジニアの松本です。

この度、1年4ヶ月間携わらせて頂いていた株式会社グロースバリュの開発メンバーから離れることを決断いたしました。

離れることを決意した背景としましては、簡潔に言うと「僕がエンジニアの世界以外にも、もっと違う世界に触れるための余白と時間を作りたかったから」になります。

決して「働く環境として良くなかったから」とかではないのでそこだけ勘違いないようにだけいただければと思います。

開発メンバーから離れるに至って、実際に働いてみての感想をQiita記事として残せればなと思い今回執筆していきたいと思います。


## 働いてみての感想
正直なところ、働いてみてよかったことしかありませんでした。笑
すごく風通しがよく、雰囲気もとてもよかった印象。

そんな環境に身を置き、働いてみてよかったことを3つに絞ってお話ししていきたいと思います！


### ① 新規事業のアプリ開発を任せてもらえたこと
弊社では現在「Withマーケ」のほかに「skimama」というママ向けの在宅ワーク支援スクールを運営しております。この「skimama」のアプリの開発に多く携わらせていただきました。DB設計やアプリ設計は技術リーダーの方をメインに共に考えさせて頂いて、アプリの実装面は大まか実装面は任せて頂き、フィードバック頂くと言う形で開発を進めさせていただきました。

当時僕は実務経験約1年6ヶ月ほどで、新規事業のアプリを0から開発しローンチさせるまでの経験がなかったのでとても良い経験をさせて頂きました。

エンジニアは「システムを開発/保守運用」することが主の仕事ですが、必ずその企業が扱うビジネスありきでの開発/保守運用を行っていると思います。

ただ開発ができるだけではエンジニアとして少し弱く、扱っているビジネスを理解しそれを実現するためにはどう開発をしたら良いかまで考え開発をすることの大切さを少し知れたようなそんな貴重な経験をさせて頂きました。

### ② DB設計などの上流にも携わらせていただけたこと
2つ目はDB設計などの上流にも携わらせていただけたことです。
こちらも①の新規事業アプリ開発時含め、機能開発/修正の際に新規でテーブル、カラムを作成したり修正したりするケースがあると思います。そのような際もどのような構成にするかなどの考案の場に参加させて頂き学ばせて頂くなんてことも多々ありました。

繰り返しこのような経験をさせて頂くにつれて、ただ現状のシステムを見てベストな設計を行うのではなく、そのアプリケーションの将来のことを見越して上で設計を考えられるようになっていきました。

アプリケーションを綺麗な形を保ち保守運用を行うことはとても大事なことになりますので、その経験に触れることができたすごくいい学びでした。


### ③ エンジニアがやらなそうなこともやらせてくれたこと
3つ目はエンジニアがやらなそうなこともやらせてくれたことです。
エンジニアは技術力を上げていくことも前提として必要な要素ですが、「ビジネスに貢献できるエンジニア人材であること」もすごく大切なスキルだと言うことを学びました。

僕の場合だと「無料版のサイトの利用者数を上げるためにどうしたら良いか」と言う業務を携わらせて頂いていました。

ここでは
・どうしたら新規利用者を増やせるか。
・どうしたら平均使用率を上げられるか。
・どうしたら価値を感じてもらえるか、giveすることができるか。
など過去のデータや施策を実施し、そこから得られたデータ確認しPDCAを回して改善向上に努めました。

このようなことを繰り返しブラッシュアップしていくことによってユーザー体験的にいいアプリケーションが出来上がっていくということを業務を通して実感することができました。

## 最後に
ここまでご覧いただきありがとうございました。

この記事を通して、エンジニアに興味がある人や弊社の開発チームの魅力などがお伝えできたら幸いです。
Githubのリポジトリを移動する方法

# はじめに
GitHubでリポジトリを別の場所にコピーまたは移動したい場合、主な方法として「フォーク」と「手動コピー」があります。この記事では、それぞれの方法を具体的に説明し、どちらを選ぶべきかの判断基準も紹介します。

# 方法①：リポジトリをフォークする
フォークは、オリジナルのリポジトリをコピーしつつ、オリジナルのリポジトリとの接続を保つ方法です。このため、オリジナルのリポジトリに変更があった場合でも、フォークしたリポジトリにそれらの変更を取り込むことができます
。
### 1. リポジトリにアクセスする
リポジトリのメインページに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/e71f2143-a1e3-d435-1d03-5b77ba00738f.png)

### 2. リポジトリをフォークする
リポジトリページの右上にある Fork ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/69654e4f-cd3a-2ef2-dc16-8fd4e22d2afc.png)

リポジトリをフォークするターゲットの組織またはアカウントを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760374/eba0b95a-fc00-b81b-7e5f-fc4104f15bb6.png)

### 3. オリジナルのと同期する
フォーク後、オリジナルのリポジトリに新しい変更があった場合、それらをフォークしたリポジトリに取り込みたいことがあります。その際には、以下の手順でアップストリームリモートを設定します：
```bash
git remote add upstream https://github.com/original-owner/repo.git
git fetch upstream
git merge upstream/main
```
この操作により、オリジナルのリポジトリの変更をフォークに反映させることができます。

# 方法②：リポジトリを手動でコピーする
オリジナルのリポジトリとは完全に独立したコピーを作成したい場合、リポジトリをクローンし、新しい場所にプッシュする「手動コピー」の方法があります。これにより、オリジナルリポジトリとのリンクが完全に切れた状態で、新しいリポジトリを作成できます。

### 1. リポジトリをクローンする
ターミナルを開き、リポジトリをローカルにクローンします：
```bash
git clone https://github.com/original-owner/repo.git
cd repo
```

### 2. リモートオリジンを削除する
オリジナルリポジトリとの接続を解除するために、リモートオリジンを削除します：
```
git remote remove origin
```

### 3. 新しいリポジトリを作成する
GitHubにアクセスし、新しい組織またはユーザーアカウントの下に新しいリポジトリを作成します

:::note alert
README や .gitignore を初期化しないでください。
:::

### 4. 新しいリモートを追加する
新しいリポジトリをリモートオリジンとして追加します：
```
git remote add origin https://github.com/new-owner/new-repo.git
```

### 5. 新しい場所にプッシュします。
ローカルのコピーを新しいリポジトリにプッシュします：
```
git push -u origin main
```

# どちらを使うのか
1. **フォーク** ：オリジナルリポジトリとの接続が維持されるため、オリジナルリポジトリの変更を簡単に取り込むことができます。しかし、完全に独立したリポジトリを必要とする場合には不向き
1. **手動コピー** ：完全に独立したリポジトリを作成したい場合に適しています。ただし、オリジナルリポジトリの将来的な変更を取り込みたい場合は、手動で同期する必要がある

あなたが選ぶべき方法は、オリジナルリポジトリとのリンクを保つかどうかに依存します。フォークはリンクを保持したままのコピー、手動コピーは独立したリポジトリを作成する方法です。

# まとめ
リポジトリを別の場所にコピーするには、フォークまたは手動コピーのいずれかの方法があります。用途に応じて、最適な方法を選択してください。
次世代仮想言語を考えてみる編 目次編

まずは、言語構成の目次から叩きだい的に出してみた。こっちがいい、ここがまずいなど、これを追加等々
みんなで推敲し、改良改善していくことを目指す。改善後→「全体書式」の推敲、改善→次　次　次

# 目次構成
## 全体書式
### インデント形式or括弧形式か？
## 型編
## 定数定義編
## 変数定義編
## 配列編
### リスト編
### タプル編
### 静的定義編
### 動的定義編
## 構造体定義編
### 構造体
### 共用体
## クラス定義編
## 関数定義編
### 一般関数
### 無名関数
## スレッド定義編
## 条件編
## ループ編
### 原始変数編
### イテレータ編
## スイッチ文編
## 複数ファイル編
[docker compose]同じサーバーで同じイメージ名のコンテナを動作させる

# はじめに
お久しぶりです。ponponnsanです。プライベートで精神を整えていると4ヶ月ほど空いてしまいました。
ワークライフバランスのライフの部分を充実させるのが幸福につながるんだなぁと実感しています。仕事もほどほどに頑張りつつやってきましょう。

# 経緯
オンプレで開発をしており、一つのサーバーにGPUが2つあるという仕様のため、同じサーバーでprod, stgを確認する際に起きた事象です。

# 問題
同じサーバー、同じリポジトリ、違うポートで立ち上げると、prodとstgでコンテナがrecreateされるものがある。

確認すると、動いていないまたはrecreateされるコンテナは、Image名がstgとprodで被っていた。

```
CONTAINER ID   IMAGE              COMMAND                   CREATED          STATUS          PORTS                            NAMES
3072c9ec39d5   nginx:1.24         "/docker-entrypoint.…"   12 seconds ago   Up 10 seconds   0.0.0.0:80->80/tcp                nginx-stg
49915da1dedd   nginx:1.24         "/docker-entrypoint.…"   14 seconds ago   Up 11 seconds   0.0.0.0:3080->3080/tcp            nginx-prod
```

# 解決策

1. imageのタグをdocker composeに追加する
1. 別のリポジトリに移動し、docker-composeファイルを立ち上げ直す

それぞれを詳しく見ていきます。

## imageのタグをdocker composeに追加する
このようにすることで、recreateされてしまう問題は回避。
```docker-compose-stg.yml
version: '3.9'
name: stg #追加

services:
  nginx-stg:
    image: nginx:1.24
    container_name: nginx-stg
    ...
```

しかし、`image: nginx:1.24`というように、docker-composeのymlファイルにimageをそのまま設定していると立ち上がらなかった。


## 別のリポジトリに移動し、docker-composeファイルを立ち上げ直す
```
├── project_stg
│   ├── conf
│   │   └── docker-compose-stg.yml
└── project_prod
    └── conf
        └── docker-compose-prod.yml
```

上記のようにリポジトリを分けることで、同じサーバー上で、同じイメージを上げることができる。

# 最後に
最近はクラウドが主流のため、このようにオンプレでのちょっとしたつまづきは少ないのかもしれません。
今日も頑張っている誰かのためになれば幸いです。
mysqldumpでハマった話

# 経緯
EC2にあるDBをバックアップしようと`mysqldump`を実行したら見慣れてるエラーが出た。

```
sudo mysqldump -u tiikawa -p rou_kusamusiri_db > 2024_0905_rou_kusamusiri_db.sql

mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) while connecting to the MySQL server
```

mysqlにsudo権限でログインできる&ステータスでアクティブなのは確認してるので
ソケットファイルがないのはおかしいと思い設定ファイルを見てみる

## mysqld.cnf
```
[mysqld]
socket=/run/mysqld/mysql.sock
```

## /var/run/mysqld/
```
mysql.sock
mysql.sock.lock
mysqlx.sock
mysqlx.sock.lock
```

`mysqld.cnf`でソケットファイルの指定があり
`mysql.sock`を名前指定してるから`mysqld.sock`が見つからず接続できないってコト？(ちいかわ感)
mysql起動時にソケットファイルは自動作成されるため`mysqld.sock`が作成されないと思われる。
既存環境なのでsockファイルの名前を変更するのは流石に影響がデカすぎる‥

# 結論
`-h`オプションを使用してTCP/IP経由でコマンド実行する必要があった。

## 補足
どうやらソケットファイル経由ではなくTCP/IP経由でやる必要があるらしい。
ホストのIPを明示的に指定する必要があるらしい。

```
sudo mysqldump -h 127.0.0.1 -u tiikawa -p rou_kusamusiri_db > 2024_0905_rou_kusamusiri_db.sql
```

上記のようにローカルのIPを指定したらうまくいった。
そういえば別件でRDSからEC2にmysqldumpしたときは確かにホスト指定してたなと。
初歩的なことですが解決して良かったです。
GROWI 7.0.17リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.0.17がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 改善点

- UserモデルとAttachmentモデルのシリアライザ修正
- 翻訳の修正
- 無効ユーザー登録用UIとロジックを追加
- html要素のlang属性を追加

## 不具合修正

- コメント操作APIの修正
- データのインポート機能の修正

他、幾つかの不具合修正と各種メンテナンスも行われています。詳細は[Release v7.0.17 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.0.17)を参照してください。

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。
元・ご案内資料／ITパスポートを独学で学ぶことと講師から学べることの違い

古い記事（スライド）ですが、陳腐化したので全体公開します。

## 本稿の主張
試験勉強は独学でもできる。
未経験でも現場に飛び込めば仕事はできる。

試験勉強を通じて現場を知れる機会は、独学やプログラミングスクールで探してもなかなか見つからない。

:::note
<font color="white">この機会をチャンスだと捉えて、最後までやり切る環境を一緒に作っていきましょう！</font>

:::

---

## 受講を想定している方のイメージ
- エンジニアを目指している方
- エンジニアまでは言わないが、IT技術の証明をしたい方
- AIやDXを含む、ITの勉強が必要だと感じている方
  - （資格を取るまでは考えていない方を含みます）

:::note
<font color="white">本講座ではIT知識だけでなく、マーケティング知識など包括的に学ぶ事ができます</font>
:::

:::note
<font color="white">特にITパスポート試験ではプログラミングスキルを問わないため、後述するデジタルスキル標準（経済産業省）に沿ったスキルを身につける事ができます。</font>
:::

---

## 卒業後イメージ
- 一般のプログラミングスクールと同程度のIT知識を保有している
- Webマーケター、システムオペレーターとして現場で活躍できるスキルを保有している
- システム開発者とある程度専門用語を使用した対話ができる

また、ハードスキルだけでなくソフトスキルとして「IT業界で通用する人材になる」心構えや慣習に対する知見なども、学習を通じて体験・理解する事ができます。

:::note
<font color="white">先輩受講生の方も、最初は全くの未経験！「パソコンとは？」というお話しから始めます。</font>
:::

---

### 本コースで得られるハードスキル・ソフトスキル
| 項目 | ハードスキル | ソフトスキル |
| --- | --- | --- |
| 試験勉強 | IT知識 | 現場思考 |
| 模擬実務 | マーケティング | 自己肯定感 |
| その他 | 学習サポート・就職など | 持続可能なキャリア意識 |

:::note
<font color="white">技術や知識も大切ですが、試験に向けてのマインドフルネスや現場での考え方を学ぶ事ができます。</font>
:::

---

# 講義体験版

---

## 講義体験版：ソフトスキルが重要視されるIT業界の傾向
![デジタルスキル標準 2 DXリテラシー標準.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/71aae266-d37f-b180-887f-a4b1962c3bb7.png)

引用元：経済産業省「デジタルスキル標準」

https://www.meti.go.jp/policy/it_policy/jinzai/skill_standard/main.html

---

# よくある質問（Q&A）

---

## 凡例
各ページに重要なポイントを以下の形式で書いています。

:::note
<font color="white">大丈夫！</font>
:::

:::note warn
<font color="white">注意あり</font>
:::

:::note alert
<font color="white">重要！</font>
:::

---

## Q. ITパスポート試験は、プログラミングスキルは必要ですか？
:::note
<font color="white">A. なくても問題ありません</font>
:::

- ITパスポートの次の目標に位置付けられる「基本情報者試験」でもプログラミングスキルは不要です
  - ただし、アルゴリズム能力が問われるため、ただ暗記するだけでなく、論理的思考能力を養わなければなりません

---

## Q. IT業界で働く場合、ITパスポートは必要ですか？
:::note warn
<font color="white">A. 必須ではありません</font>
:::

- 業界未経験なら持っておくと、スキルの証明ができます
  - 交渉がうまい人やエピソードトークができるなら資格はなくても説得力があります
- 特に理由がなければ敢えて取らないという選択肢はないかなと思います
  - ただし、資格の有無よりは実務経験を重視される傾向があるため、資格すらない未経験だとかなり厳しいです

---

## Q. マーケティングを学びたいのですが、IT知識は必須ですか？
:::note warn
<font color="white">A. 必須ではありません</font>
:::

- A. ITパスポート試験の知識が部分的に必要になる事が多いため、実務で必要なものから順番に学習していく方法もあります
  - 昨今のマーケティングはWebを使う事がほとんどです
  - WebマーケでもWebシステムの概要は知っておいた方がよく、実務でもITパスポートレベルの知識の保有が期待される事が多いです

---

## Q. 本コースを受けたら、試験に受かりますか？
:::note alert
<font color="white">A. 試験の手続きはご自身で行う必要があります</font>
:::

- 残念ながら受講するだけで資格が取れる講座ではありません
- とはいえ、独学で勉強を頑張るよりは効率的に学習できます
  - 講師の指導実績として、皆さんと同じ状況ではじめてパソコンに触れ、プログラミング学習を2ヶ月学んだ方が **基本情報者試験** に合格した実績が多数ございます

---

## Q. ITパスポート試験と基本情報者試験の違いはなんですか？
:::note
<font color="white">A. 出題範囲の広さが少し違うだけでITシステムへの理解度は同じです</font>
:::

- ITパスポート試験は、比較的知っているかどうかがポイントになるため、文系・理系はあまり関係ないと言えます
  - 試験ではパソコン操作スキル自体は求められませんが、ある程度のパソコン操作スキルがあることを前提とした内容があります
  - 講義の中で、パソコン操作を学んでいきましょう
- 基本情報者試験はアルゴリズム問題（覚える事がなく、考える問題）があります
  - 丸暗記が難しい内容のため、独学だと突破できる人と難しい人の差が大きく出てきます

---

## Q. 試験に受かるコツはありますか？
:::note
<font color="white">A. とにかく何でもいいので１時間に１回は講師に質問をすることです</font>
:::

- 「講師に質問をすると受かる」のではなく「講師に質問できるように勉強をする」ことで、結果的に学習効果が高まったり、**どこまで勉強すれば大丈夫なのか**という指標にできます
- 指導実績・データとして「質問をする人」と「質問をしなかった人」で比べると、質問をした方が成績が高くなる傾向があります
- 質問の内容は高度である必要はなく「教科書に書いている内容では納得できないので解説して欲しい」というレベルで問題ございません
VECTOR_DISTANCEについて調べてみた

## はじめに

VECTOR_DISTANCEはOracle Databaseの最新バージョン23aiで登場した関数です。

リファレンスには以下のような記載があります。
> VECTOR_DISTANCEは、パラメータとして2つのベクトルを取ります。オプションで、距離を計算するための距離メトリックを指定できます。距離メトリックを指定しない場合、デフォルトの距離メトリックはコサイン距離です。
オプションで、次の短縮ベクトル距離ファンクションを使用できます。
> - L1_DISTANCE
> - L2_DISTANCE
> - COSINE_DISTANCE
> - INNER_PRODUCT

https://docs.oracle.com/cd/G11854_01/sqlrf/vector_distance.html

ここからわかることは以下の3点です。
1\. VECTOR_DISTANCEは2つのベクトル間の距離を出力する関数である。
2\. デフォルトではコサイン距離を出力する。
3\. メトリックを使用するとL1_DISTANCE、L2_DISTANCE、COSINE_DISTANCE、INNER_PRODUCT関数を呼び出せる。

次から、どのような値を出力するのか見ていきます。

## L1_DISTANCE 
L1_DISTANCEはマンハッタン距離を出力します。
マンハッタン距離とは、2点間の座標の差の絶対値の和で、碁盤の目状の道を移動する際の距離のことです。

<img width="300" src="https://upload.wikimedia.org/wikipedia/commons/d/de/Manhattan_distance_bgiu.png">

以下のように記述します。
```
VECTOR_DISTANCE(expr1, expr2, MANHATTAN);
```
```
L1_DISTANCE(expr1, expr2);
```

## L2_DISTANCE
L2_DISTANCEはユークリッド距離(EUCLIDEAN)を出力します。
ユークリッド距離とは、空間内の2点間の最短直線距離のことです。

以下のように記述します。
```
VECTOR_DISTANCE(expr1, expr2, EUCLIDEAN);
```
```
L2_DISTANCE(expr1, expr2);
```

## COSINE_DISTANCE
COSINE_DISTANCEはコサイン距離を出力します。
コサイン距離は、ベクトル同士の向きの違いを測るための指標であり、2つのベクトルがどれだけ同じ方向を向いているか、またはどれだけ違う方向を向いているかを表します。
**コサイン距離の値が小さいほどベクトルの向きが同じになります。**
コサイン距離は次のように表されます。

```math
\text{cosine distance} = 1 - \text{cosine similarity}
```

ここで出てきたコサイン類似度(cosine similarity)は、2つのベクトル間の角度のコサインを用いて、それらの方向の類似性を-1から1の範囲で表す指標です。
**コサイン類似度が1に近いほどベクトルの向きは似ており、0だと2つのベクトルのなす角が直角、-1に近いほどベクトルの向きが逆向きになります。**
コサイン類似度は次のように表されます。

```math
    \text{cosine similarity} = \frac{A \cdot B}{||A|| \times ||B||}
```
ベクトルA,Bの内積をAのノルムとBのノルムの積で割ったものです。ここではノルムをベクトルの距離や大きさと考えてもらえればと思います。

以下のように記述します。
```
VECTOR_DISTANCE(expr1, expr2, COSINE);
```
```
L2_DISTANCE(expr1, expr2);
```
### 具体例で考えてみる①
例えば、以下のような2つのベクトルがあるとします。

- ベクトルA = [1, 0]
- ベクトルB = [0, 1]

これらのベクトルは直交しており内積が0になることからコサイン類似度は0になります。
このことからコサイン距離は次のように計算されます。

```math
\text{cosine distance} = 1 - 0 = 1
```

### 具体例で考えてみる②
以下のような2つのベクトルがあるとします。

- ベクトルC = [1, 1]
- ベクトルD = [2, 2]

これらのベクトルの内積は4、大きさの積も4であることからコサイン類似度は1になります。
このことからコサイン距離は次のように計算されます。

```math
\text{cosine distance} = 1 - 1 = 0
```

## INNER_PRODUCT
INNER_PRODUCTは内積(ドット積)を出力します。
内積は、2つのベクトルがなす角のコサインと各ベクトルの大きさとの積で表され、ベクトルの方向の一致度と大きさを同時に反映した値です。

以下のように記述します。
```
VECTOR_DISTANCE(expr1, expr2, MANHATTAN);
```
```
-1*INNER_PRODUCT(expr1, expr2);
```

## まとめ
リファレンスを参考に、備忘録も兼ねて自分なりの解釈を記載しました。
コサイン距離やコサイン類似度の定義を調べることで理解が深まりました。

### 参考
https://docs.oracle.com/cd/G11854_01/sqlrf/vector_distance.html
C/C++を使用したFlutterプラグイン開発においてVSCode+clangd拡張を使用する方法

# はじめに
FlutterではDartのFFIを使用することでC APIを公開している既存のネイティブライブラリを使用することができます。[^1]
そのため、Flutterプラグイン開発でC/C++を使用する場面が出てくることが予想されます。
ぼくはC/C++開発においてVSCodeのclangd拡張を使用しており、Flutterプラグイン開発でclangdの設定に手こずったので設定方法を残します。

# 前提条件
* OS: Ubuntu20.04
* Flutter: 3.24.1
* Linux向けのFlutterプラグイン開発を行っている
* エディタ: VSCode
    * [clangd拡張](https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd)をインストール済みであること

# 手順

## 1. `compile_commands.json`を作成する

Flutterプラグインのディレクトリ構成は以下のようになっているはずです。(https://codelabs.developers.google.com/codelabs/flutter-ffigen?hl=ja#2 より)

```
<開発中のFlutterプラグイン名>
├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android
│   ├── build.gradle
│   ├── ffigen_app_android.iml
│   ├── local.properties
│   ├── settings.gradle
│   └── src
├── example
│   ├── README.md
│   ├── analysis_options.yaml
│   ├── android
│   ├── ffigen_app_example.iml
│   ├── ios
│   ├── lib
│   ├── linux
│   ├── macos
│   ├── pubspec.lock
│   ├── pubspec.yaml
│   └── windows
├── ffigen.yaml
├── ffigen_app.iml
├── ios
│   ├── Classes
│   └── ffigen_app.podspec
├── lib
│   ├── ffigen_app.dart
│   └── ffigen_app_bindings_generated.dart
├── linux
│   └── CMakeLists.txt
├── macos
│   ├── Classes
│   └── ffigen_app.podspec
├── pubspec.lock
├── pubspec.yaml
├── src
│   ├── CMakeLists.txt
│   ├── ffigen_app.c
│   └── ffigen_app.h
└── windows
    └── CMakeLists.txt
```

このうち`<開発中のFlutterプラグイン名>/example`に移動し、以下のコマンドを実行してビルドを行います。

```
flutter run
```

そうすると以下のようビルドに失敗した旨のエラーが出ますが一旦無視します。

```
Error: Build process failed
```

その後`<開発中のFlutterプラグイン名>/example/linux`に移動し以下のコマンドを実行し`compile_commands.json`を生成します。([参考](https://qiita.com/ousttrue/items/1ad9761272b82c035a01))

```
mkdir build && cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
```

## 2. clangd拡張の設定をする

VSCodeのclangd拡張から「拡張機能の設定」メニューに進み、ワークスペースタブを選択したあと「Clangd: Arguments」で以下の項目を追加します。

```
--compile-commands-dir=${workspaceFolder}/example/linux/build
```

上記の項目を追加後、ウィンドウをリロードするとclangd拡張が使えるようになります。


[^1]: https://codelabs.developers.google.com/codelabs/flutter-ffigen?hl=ja#0
Xplenty中級編 Part8：変数の参照範囲について

# はじめに
Xplentyはプログラミングの経験が少ないユーザのためのローコード・ノーコードツールであり、ユーザの手間を掛からないように日々のデータ転送業務にはスケジューラーを利用したジョブ実行をお勧めします。

このスケジューラーによるジョブの定期実行に必ず登場するのがスパイス役割を担う変数です。
スケジューラーの実行時に多彩な条件付与へよく使われる変数には、参照範囲が存在するのはそれほど知られていないようです。

一般のプログラミング言語のようにXplentyの変数も参照範囲が存在してこれをうまく使えば、効率よくジョブ実行に必要な値の設定が可能になります。
それほど複雑な概念では無いので、この記事で変数の参照範囲についてみてみましょう。

# 変数の参照範囲の説明
参照範囲ごとの変数の設定や確認は、パッケージ編集画面の１箇所でまとめて行えます。下記の図のようにパッケージ編集画面の右上にある3点のアイコンをクリックすると、Edit package variablesというサブ画面が右側から開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c73630a2-9972-bf6c-32d5-b892e13e74c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c111ee18-baeb-2013-0bfd-cf9bc3bf57d5.png)
現時点でご覧のように４種類の変数の参照範囲がございます。
変数の定義はタイプに問わず、VARIABLEに変数名を入れてEXPRESSIONに値や関数を設定して完了です。変数の順番を入れ替えるには、VARIABLEの左側にある上下の矢印をマウスでドラッグして移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/499604cb-aa5a-1923-4b7e-93d9875606e3.png)
では、各々の変数タイプについて詳しくみてみましょう。

### 1. パッケージ変数、またはユーザ変数(Packageタブ)
パッケージ変数は、パッケージの中ならどこでも参照できる変数の集まりです。
*  参照範囲
    *  変数を定義したパッケージの中
*  変数タイプ
    *  数字（int, long, float, double）、ブール値、文字列

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/bc181120-bc04-7b3c-cf69-c1f2f21c89eb.png)

### 2. シークレット変数（Secretsタブ）
2024年4月に追加されてシークレット変数は、下記のような特徴持っています。
* 参照範囲
    * 変数を定義したパッケージの中
* 変数タイプ
    * 文字列のみ設定可能（シングルクォーテーションはいらない）
* 特徴
    * APIキーなどの**他のメンバーに隠したい値**の設定に有効
    * 同じ変数名がGlobalやPackageにあるとエラーになる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/2bbcc751-1475-963e-6ea0-96b20bcf9577.png)

### 3. グローバル変数（Globalタブ）
2023年5月に追加されたグローバル変数は、１つのアカウント下の全てのパッケージからアクセス可能です。
変数の設定箇所は、下記の図の通りにsettings（歯車のアイコン）- Account Settings - Global Variablesにて設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/6536053c-1519-0f8c-9f9c-4f408b2f213a.png)

設定後は、必ずValidate and Saveボタンをクリックして入力した値が正しいかチェックしてから保存します。

* 参照範囲
    * １つのアカウント下の全てのパッケージ
* 変数タイプ
    * 数字（int, long, float, double）、ブール値、文字列
* 特徴
    * パッケージ変数に同じ変数名が存在する場合、**パッケージ変数を優先**する

以前はアカウントの全体で使い回している共通変数がある場合は、各々のパッケージに共通変数を一々設定する必要がありました。パッケージが少ない時はそれほど問題にならないですが、エンタープライズ規模になると力技のかなり辛い作業に違いありません。
ちょっと気を抜いてしまうと同じ変数名なのにパッケージ毎に異なる変数値が設定されやすかったり、せっかく初期設定で変数値を揃えておいたのに後続作業で何度も同じ誤りが起きる可能性も高まってしまいます。

そんな最中にグローバル変数は、いろんな意味で救世主的な存在です。
グローバル変数を使用することで、複数のパッケージにわたる共通変数の設定が１回で済み、設定ミスや予期せぬ変更のリスクが減少します。特定のパッケージだけ変数値を変更したい場合、同じ変数名のパッケージ変数を定義すれば、そのパッケージ変数が優先されます。これにより、煩雑な作業を減らし、効率的な変数管理が可能となります。

### 4. システム変数（System）
Xplentyの内部で使われている変数です。こちらの変数項目の詳細については、[Xplenty中級編 Part2: System変数または事前定義済み変数について](https://qiita.com/Integrateio/items/ab7a054e1391eb1d1727)をご参考ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/47dc5d37-4da4-d0b9-a696-c9c22bbe2a7a.png)

* 参照範囲
    * １つのアカウント下の全てのパッケージ
* 特徴
    * パッケージ全体に渡って同じ値が設定されるが、値の変更も可能
    * 値の変更があった場合、参照範囲は設定したパッケージのみに有効
    * 他の変数にシステム変数と同じ変数名の変数設定は不可能(保存されない)

# 終わりに
変数はXplentyによるパッケージ（データパイプライン）の定期実行に欠かせない内容です。
この記事で変数についてはしっかり特徴を掴んでしてパッケージ作成に柔軟性を高めてみるのはいかがでしょうか？

ホームページの[今すぐデモ予約](https://www.integrate.io/jp/demo/)のボタンをクリックすることで、気軽にXplentyを２週間に渡って無料でお試し頂けます。
AzureBlobServiceにローカルのバイナリファイルを転送する

## はじめに
ローカルのExcel、PDF、画像などのバイナリデータをクラウドに保存したい場合、Azure Blob Storageを使うのは非常に便利です。
ですが、毎回Azureのコンソール画面で手動によるファイルをアップロードするのは手間がかかります。
そこで、ローカルにファイルが置かれたら自動的にクラウドへ転送する仕組みをPowerShellとAzCopyを使って構築できるかどうかを検証しました。

## 本記事の対象者
・Azureの基本的なサービス（Blob StorageやSASキーなど）や仕組みを理解している方
・Azure StorageアカウントとBlobコンテナが既に作成されていること
・PowerShellやバッチスクリプトの実行に慣れている方

## 準備
Azureアカウントがあり、サービスを利用できる方

## 検証

### Auzre Blobの作成
まずは、AzureポータルからBlobストレージを作成します。
これはファイルを保管する領域になります。

#### 手順
1.Azureポータルにログインし、"Storage account"を選択。
2.新しいストレージアカウントを作成し、Blobストレージを有効化します。
3.作成したストレージアカウント内に、新しいBlobコンテナを作成して、ファイルを保存する場所を確保します。

### SASキーの発行

#### 手順
AzureポータルのBlobコンテナページに移動。
「Shared access signature」をクリックし、必要なアクセス権限を設定。
「Generate SAS and connection string」をクリックし、SASトークンをコピーします。

・SASキーのアクセス権限と有効期限を決めて発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/f38ef54c-75a4-7238-60be-82907534f3b1.png)


### PowerShellでAzCopyをインストール

ファイル転送に使うツールとして、AzCopyを使用します。
AzCopyはMicrosoftが提供しているコマンドラインツールで、簡単にファイルをAzure Storageへコピーできます。
インストールするのに時間がかかります。
インストール対象をAzCopyモジュールの一部に絞れば早く終わるかも。

・PowerShellにAzモジュールをインストールするコマンド
```
Install-Module -Name Az -AllowClobber -Scope CurrentUser
```
・Azモジュールをロードするコマンド
```
Import-Module Az
```
・コマンド実行後、フォルダにモジュールファイルがダウンロードされる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/b5f88f82-dbc2-6813-46ed-7fc1f5105400.png)

### PowerShellスクリプトの作成と実行
PowerShellスクリプトを実行すると、ローカルの指定したフォルダに新しいファイルが追加された際に、AzCopyが自動でAzure Blobにアップロードします。

```
$context = New-AzStorageContext -StorageAccountName "ChangeYourAzureStrageAccount" -SasToken "ChangeYourSasToken"

$directory = "ChangeYourLocalDirectory"
$filter = "*.pdf"

Write-Host "ディレクトリ内のファイルをアップロード中..."

# 指定したディレクトリ内の既存のPDFファイルをすべてアップロード
Get-ChildItem -Path $directory -Filter $filter -Recurse | ForEach-Object {
    $file = $_.FullName
    Write-Host "アップロード中: $file"
    try {
        Set-AzStorageBlobContent -File $file -Container "bunpaidoc" -Context $context
        Write-Host "ファイルをアップロードしました: $file"
    } catch {
        Write-Host "エラーが発生しました: $_"
    }
}

Write-Host "既存のファイルのアップロードが完了しました。"

# ファイルシステム監視を開始
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $directory
$watcher.Filter = $filter
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true

Write-Host "ファイルシステム監視を開始しました。"

$action = {
    $file = $Event.SourceEventArgs.FullPath
    Write-Host "新しいPDFが検出されました: $file"

    try {
        Set-AzStorageBlobContent -File $file -Container "bunpaidoc" -Context $context
        Write-Host "ファイルをアップロードしました: $file"
    } catch {
        Write-Host "エラーが発生しました: $_"
    }
}

Register-ObjectEvent $watcher 'Created' -Action $action

Write-Host "イベントが登録されました。"
```
### 結果
ローカルの指定したフォルダにファイルを新規で登録するとBlobにアップロードされた。
![20240905_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822850/5367fa4e-fbef-6ab8-1603-1d1daccf65a0.png)


## 感想
この方法を使用することで、社内文書や他のファイルをクラウドへ簡単にアップロードできるだけでなく、
クラウドからローカルへのダウンロードもAzCopyを使用して同様に簡単に実行できます。
ファイルの転送を自動化することで、手作業の時間を削減し、効率化が期待できます。
Windows評価用仮想マシン逆引きメモ

必要に迫られたWindows評価用仮想マシンの逆引きメモになります

## Windows 11 Enterpriseの日本語化

`Hyper-V`の[評価用仮想マシン](https://developer.microsoft.com/ja-jp/windows/downloads/virtual-machines/)を使用しています

1. `Settings`->`Time & Language`->`Language & region`
1. `Preferred languages`の`Add a language`で`日本語`をインストール
1. `Windwos display language`を`日本語`に変更
1. `Country or region`を`Japan`に変更
1. `Administrative language settings`->`Copy settings...`
1. `Velcome screen and system accounts`、`Newuser accounts`にチェックを入れて`OK`ボタン
1. `Install-Language ja-jp`をPowerShellのコンソールから実行[^1]

## 参考情報

- [Windows11の日本語化でハマった話 #PowerShell - Qiita](https://qiita.com/nekomisaka/items/73b99eda53c880373894)

 
[^1]:`Install-Language ja-jp`の実行には結構時間がかかるので完了まで待つ
ゾンビプロセスの消し方

## ゾンビプロセスとは
Linuxのプロセス管理において、親プロセスに適切に終了処理をされなかった子プロセスがゾンビプロセスになる。

### ゾンビプロセスを放置すると…
ゾンビプロセスが占有しているメモリ領域が解放されない。

## ゾンビプロセスの確認方法
- `ps aux` で`STAT`がZになっているプロセスがゾンビプロセスである
- 末尾に`<defunct>`の表記も確認される

```bash
$ ps aux | grep Z
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user1     1234  0.0  0.0      0     0 ?        Z    15:30   0:00 [my_process] <defunct>
```

## ゾンビプロセスの削除方法
- `ps -o ppid= -p <PID>`で子プロセスが属している親プロセスのIDを確認して親プロセスを終了させる

```bash
$ ps -o ppid= -p 1234 # child process ID
5678 # parent process ID

$ kill -9 5678
```
WPF でテンプレートの親を取得する

## 環境
VisualStudio 2022
WPF

## テンプレートの親を取得する
WPF でテンプレートなどを使う時、たまに VisualTree が途切れてしまう時がある。その時、途切れた要素に ContentPresenter が使われている時には、TemplateParent プロパティを使って、親要素を取得できることがある。

```cs:
private void RoutedEvent(object sender, RoutedEventArgs args)
{
    var border = args.OriginalSource as Border;
    if(border == null)
    {
        return;
    }
    var cp = border.Child as ContentPresenter;
    if(cp == null)
    {
        return;
    }
    Debug.WriteLine("cp:" + cp.TemplateParent.ToString());
}
```

としてやると、テンプレートの親要素の型を取得できる。
DataGrid に横付けの DataGrid を更に表示させて、DataGrid でない要素を選択した時に消せなくて困ったため、メモ。

## 参考
[ContentPresenter](https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.controls.contentpresenter?view=windowsdesktop-8.0 "ContentPresenter Microsoft Learn")
How to Create Awesome Divider Lines in Microsoft Word (Easy!)

Divider lines are a simple yet powerful way to make your Microsoft Word documents more organized and visually appealing. Whether you’re working on a report, flyer, or resume, adding a stylish divider line can help separate sections and make your content easier to read. Here’s a quick and easy guide to creating awesome divider lines in Microsoft Word.

How to 
Insert Divider in Word
Step 1: Use the keyboard shortcut.
A keyboard shortcut is one of the easiest ways to create a divider line in Microsoft Word. Here are some common shortcuts you can use:

Dashes (“-“): Type three dashes in a row (---) and press Enter. This will create a simple horizontal line.
Underscores (“_”): Type three underscores (___) and press Enter. This will create a thicker horizontal line.
Asterisks (“*”): Type three asterisks (***) and press Enter. This will create a dotted line.
Equal signs (“=”): Type three equal signs (===) and press Enter. This will create a double line.
Hash symbols (“#”): Type three hash symbols (###) and press Enter. This will create a bold line.
These shortcuts automatically convert the characters into a full-width line that spans the entire page, making it quick and effortless to add dividers.

Step 2: Add a personalized divider line.
Do you still want a different kind of divider line? No problem, you can just insert it:

Head to the “Insert” tab. On the top bar of the screen, find the “Insert” tab.
Click on “Shapes”: Use the “Illustrations” group to click on “Shapes” and narrow it down to Line.
Draw the Line: With a cursor, click on the place where you want to start the line and drag to the direction where you want to end it.
Adjust the Line: A simple line can also be adjusted by clicking on it then going to “Format Shape.” This part allows you to change the color, weight, and style, among others.
Step 3: Use the “Borders” Tool
Another method for adding divider lines is using the “Borders” tool:

Highlight the text: Place your cursor where you want the line to appear or highlight the text above which you want the divider.
Go to the “Home” tab. Click on the “Home” tab in the ribbon.
Click on “Borders”: In the “Paragraph” group, click on the “Borders” dropdown menu (it looks like a square with lines).
Select “Horizontal Line”: Choose “Horizontal Line” from the dropdown. This will insert a line at your cursor’s position.
You can further customize this line by right-clicking on it and choosing “Format Horizontal Line.”
Googleカレンダーの過去の予定を全て非公開にする

## 背景
他の人と予定を共有する際に過去の日程は見せずに今後の予定のみを共有したいときのメモ。  
以前の予定はその人に公開することを前提として登録してきました。  
そう大したことが書いてある訳ではないですが、公開することには抵抗があり、とはいえ削除してしまうのも後から見返せないため微妙です。  
また、別のカレンダーを作成して、今後はそちらに登録していくことも考えましたが、それでは過去の予定と別々になってしまい、あまり嬉しくありません。  

## やりたいこと
過去の予定は非公開にしたまま、今後の予定のみを公開したい。  
過去の予定については中身のみを非公開とし、枠は残して置くこととした。
今後の予定は公開設定で登録していきたい。

## やったこと
1. Googleカレンダーよりカレンダーをエクスポート
```
設定→インポート/エクスポート→カレンダーをエクスポート
```
2. エクスポートしたファイルを編集
エクスポートしたzipファイルを展開し、目的のカレンダーのicsファイルを編集する。  
```zsh
awk '/^BEGIN:VEVENT/ {in_event=1} /^END:VEVENT/ {if (!class_found) print "CLASS:PRIVATE"; in_event=0; class_found=0} /^TRANSP:/ {print "TRANSP:OPAQUE"; next} /^CLASS:/ {print "CLASS:PRIVATE"; class_found=1; next} {print}' input.ics > output.ics
```
すべての予定に対して下記を行っています。
- TRANSP: TRANSPARENT → TRANSP:OPAQUE
- CLASS: PUBLIC or CLASS行自体が未定義 → CLASS:PRIVATE

3. 目的のカレンダーからイベントを全削除
（メインカレンダーの場合のみ必要な手順。他のカレンダーでは不要な可能性があるので要確認）
編集したicsファイルをGoogleカレンダーにインポートすればよいのですが、過去の予定が残っていると権限の問題でインポートできません。  
そこで、過去の予定を削除します。  
※危険な操作のため挙動を事前に別のカレンダー等で確認してください
```
設定→マイカレンダーの設定→{目的のカレンダー}→カレンダーの削除
```

4. エクスポートしたファイルをGoogleカレンダーにインポート
```
設定→インポート/エクスポート→目的のカレンダーにインポート
```

## 参考
- [Googleカレンダーの過去の予定を非公開にする方法](https://kohki.hatenablog.jp/entry/googlecalendar)  
やり方や仕組みの詳しい解説があります。
レビューアイで 叙々苑 新宿中央東口店 のレビュー分析をしてみた


弊社リテジーリンクではレビュー分析AI[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
レビューアイ (英語表記 ReviewAI) は、商品・サービスのレビューを分析し、
観点ごとに強みと改善点を明らかにする、レビュー分析AIです。

本記事では、叙々苑 新宿中央東口店 のレビューを例に
レビューアイで明らかになった強みと改善点を1つずつ紹介します。

## 強み

レビューアイでレビュー分析すると、レビューでよく出てくる観点が一覧できます。
**雰囲気** は特に好評であることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/6d7bd9e6-7991-a609-e72a-567b3b812591.png)

**雰囲気** の詳細を確認すると、**店内** を筆頭にすべて好評になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/5884f39b-17ca-41b5-782e-7526017632c9.png)


**店内** のレビューを見ると、高級感がありつつ落ち着いた雰囲気のようです。
ハープの演奏まであるようですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/7206dfa9-c666-5cd9-6015-d6aaa5a3f663.png)




## 改善点

レビュー分析で見つかる観点を改善順で見ると、**注文** は改善の余地があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/26c55ab8-2f93-093a-fa49-07843a57ba7e.png)

**注文** の詳細を確認すると、**タレ** に要改善がついています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/da910e43-a614-ea7b-f9a4-b60edd7d4f8f.png)


**タレ** のレビューを見ると、真ん中のレモンが両側のタレに混ざってしまう
という問題が見つかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/854fa3dd-7f6d-5584-1055-22b64025d3ac.png)


## まとめ

レビューアイで 叙々苑 新宿中央東口店 のレビュー分析をしました。
結果として
- 高級感がある落ち着いた雰囲気
- 真ん中レモンが両側のタレに混ざってしまう
ということが判明しました。

今回は紹介できていませんが、
- 叙々苑サラダ
- ビビンバ
などについても貴重な知見があります。

[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
ぜひ[こちら](https://reviewai.next-seed.work/)からお申込みください。
How to Fix Exit Code 6 and Exit Code 7 Installation Errors in Adobe Photoshop

Adobe Photoshop is an industry-standard tool for photographers, designers, and creative professionals worldwide. However, installing or updating this powerful software can sometimes be a bumpy ride, especially when you encounter issues like Exit Code 6 or Exit Code 7. These errors can be frustrating, but with the right guidance, you can get back to your creative projects in no time.

In this blog, we’ll walk you through how to resolve these installation errors and provide insights on how Adobe Photoshop support and Adobe Photoshop experts can help you when needed.

Understanding Exit Code 6 and Exit Code 7
Before diving into solutions, it’s essential to understand what these error codes signify:

Exit Code 6: This error often indicates a problem with the installation files or a conflict with existing software on your system. It can occur during installation or update processes, suggesting that something went wrong while Adobe Photoshop was trying to set up on your computer.
Exit Code 7: This code typically points to issues related to permissions, corrupted installation files, or problems with Adobe’s installer itself. It can also occur if there’s an existing version of Photoshop or a conflicting application that interferes with the installation process.
How to Fix Exit Code 6
Check System Requirements: Ensure your computer meets the minimum system requirements for the version of Adobe Photoshop you’re trying to install. Insufficient hardware or software incompatibilities can lead to installation errors.
Verify Internet Connection: A stable internet connection is crucial for downloading and installing Adobe Photoshop. Ensure you have a reliable connection and try restarting your router if needed.
Update Operating System: Sometimes, outdated operating systems can cause compatibility issues. Check for any available updates for your OS and install them.
Clear Adobe Cache: Corrupted cache files can cause installation problems. To clear the Adobe cache:
Open the Adobe Creative Cloud app.
Go to Preferences > Creative Cloud > Files.
Click on “Clear” next to “Clear Cache.”
Run as Administrator: Sometimes, running the installer with administrative privileges can resolve permission-related issues. Right-click on the installer and select “Run as administrator.”
Disable Antivirus Software: Occasionally, antivirus programs can interfere with installations. Temporarily disable your antivirus software and try reinstalling Adobe Photoshop.
NiFi で 推論したスキーマを出力する

# 問題意識

NiFi の CSV Record Reader では Infer Schema という Schema Access Strategy を選択することができます。

![Screenshot 2024-09-05 at 15.24.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/70429b61-5b47-8eca-9f1a-5108ece1a06b.png)

CSV には型の情報がありませんが、この設定を使って1行目がヘッダー（項目名）になっている CSV を読み込むことで、2行目以降のデータの内容をもとに各項目の型を推論したスキーマを当てはめて処理してくれます。

これはとても便利なのですが、「推論された型が本当に合っているのか？」という課題もあります。

かといって、項目数が多い CSV の場合、全項目のスキーマを手作業で定義するのは大変です。

そこで、「Infer Schema を使って推論されたスキーマを、何らかの形で出力して、それを検証・修正する形で本チャンのスキーマを作れないか」という話がこちらの雑談会で話題になりました。

https://x.com/i/spaces/1yoKMyOwwBeKQ

# 結論

NiFi で 推論したスキーマを出力することは**可能**でした！

## やりかた

ExtractRecordSchema プロセッサーを使います。
使い方はこんな感じ！

Fetch 系など、CSVファイルを取得した処理の後続に ExtractRecordSchema を配置して、Record Reader に CSVRecordReader を指定します。CSVRecordReader の Schema Access Strategy で、Infer Schemaを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/f94609e2-98ee-170b-ce4f-0f42bed10232.png)

ExtractRecordSchema から出力されるフローファイルの attribute に、avro.schema という項目があり、そこに推測されたスキーマが入っています。

![Screenshot 2024-09-05 at 15.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5673da97-456e-a0cd-fb78-85f4e65fb425.png)

これをベースに、必要に応じて型や null の許容有無などを修正することで、本番運用に耐えるスキーマを楽に作れるのではないでしょうか！
参入時のセットアップ忘れがちだから備忘録に残す

## 前提
- これは完全に自分のための備忘録です


## GitHub SSH 公開鍵の作成
1. sshに遷移する
1. `ssh-keygen`を実行する
1. `cat`コマンドを使って、sshキーを取得する
1. あとは`github`に遷移して、`setting`から`SSH and GPG keys`を選ぶ
1. `new SSH keys`を押下し、先ほど取得したsshキーを貼り付ける
```shell
$ cd ~/.ssh

$ ls
authorized_keys2  id_dsa       known_hosts
config            id_dsa.pub

$ ssh-keygen

$ cat ~/.ssh/id_rsa.pub
```

## dampファイルもらうけどどう扱う？
- docker とか使ってるのであれば基本的にdockerの中でコンテナ立ててるのでdockerに入れてあげれば良い
- あとはDBverとかを使っているのであれば、DB接続できたらなそっちから突っ込むのも手
→ ただ、dampファイルのデータが大きいと実行が難しい可能性もあるので注意（固まる）

### dockerに上げるにはどうすべき
1. まずはdockerを立ち上げる
1. その後、docker内の適当な場所にdampファイルをコピーする
1. DockerDesktopを開き、コンテナからDBを選択し、画像1のページに遷移する
1. 遷移後、赤枠で囲っているExecを押下
1. ターミナルになるのでmysqlコマンドを実行する
1. ターミナルやDBverからデータが投入されていることを確認する

＊コマンドでdockerの中に入ることも可能だが、DockerDesktopのExecから行うこともできるので今回はDockerDesktopからデータ投入することを採用
```shell
# 適当な場所にdampファイルをコピーする
docker cp ~/Desktop/dump.sql プロジェクト名:/tmp/dumpfile.sql

# mysqlコマンドを実行
mysql -u user -p < /tmp/dumpfile.sql
```
- 画像1
![スクリーンショット 2024-09-05 15.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2606285/bee02c01-f6ec-9ddb-1688-329c39d663d6.png)
3Dモデルの作り方

3Dモデルとは何ですか?

3D モデルは、コンピューターで生成された 3 次元オブジェクトのデジタル表現です。これらはデザイン、アニメーション、ゲーム開発、エンジニアリング、仮想現実でよく使用されます。 3D モデルは、あらゆるオブジェクトの形状、サイズ、テクスチャを表現できます。

![b935ed2adfbd12fd6cf282a574dc5cc1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/e91c3da0-559c-9100-077d-40c7d4bcd375.png)
MINI2 3D スキャナーからのモデル https://www.revopoint3d.jp/products/industry-3d-scanner-mini

3D モデルを使用する場所と方法
3D モデルは、多くの分野で幅広い用途に使用できます。
エンターテインメント業界: 3D モデルは、映画、アニメーション、ビデオ ゲームでキャラクター、シーン、特殊効果を作成するために使用されます。
建築およびエンジニアリング: 建築設計、建設シミュレーション、構造解析用。
医療分野: 手術シミュレーション、解剖学的研究、義肢設計に使用されます。
製造: 製品設計、プロトタイピング、3D プリント用。

3D モデルを作成する 2 つの主な方法
1. 3Dモデリング
3D モデリングは、コンピューター ソフトウェアを使用してデジタル モデルを手動で作成するプロセスです。一般的に使用されるソフトウェアには、Blender、Maya、3ds Max などがあります。 3D モデリングのいくつかの手順は次のとおりです。
![4c5c591d85e0ea4546b1bcac7ac0a1e4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/542da77e-54a5-4b5f-47bd-feae23cb8870.png)


モデリング手法を選択します。
ポリゴン モデリング: 頂点、エッジ、面を使用して複雑な形状を作成します。
サーフェス モデリング: 曲線とサーフェスを使用して、滑らかなモデルを生成します。
ボリューム モデリング: 基本的なジオメトリを使用して、複雑なモデルを作成します。
詳細の追加: 頂点とエッジを調整してモデルの詳細を調整します。
マテリアルとテクスチャを適用する: 色、テクスチャ、照明効果をモデルに追加します。
2. 3Dスキャン
3D スキャンでは、機器を使用して実際のオブジェクトの形状と外観をキャプチャし、デジタル モデルに変換します。一般的に使用される 3D スキャン技術には次のものがあります。
![22efa1d0feabd22df31e857854bd243c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/52f85410-e667-54fc-9340-826e46e168c2.png)

レーザー スキャン: レーザーを使用して物体の距離と形状を測定します。
光学スキャン: 光学センサーを使用して物体の表面特徴をキャプチャします。
構造化光スキャン: ライト グリッドをオブジェクトに投影して、変形したパターンをキャプチャします。
3D スキャンは、アーティファクトの再現や人体のスキャンなど、高精度かつ高速なモデリングが必要な場面でよく使用されます。

3D モデリングと 3D スキャニング技術を組み合わせることで、さまざまな分野のニーズを満たす高品質でリアルな 3D モデルを作成できます。ゼロからデザインする場合でも、既存のオブジェクトを複製する場合でも、3D モデリング テクノロジーは革新と開発を推進し続けます。
1.1.1.1について

## アジェンダ
1.1.1.1はインターネットの中で特定のサービスを指しますが、この記事では、これを理解するために、1.1.1.1が何であるか、なぜ重要なのかについて簡単にまとめます。

## 1.1.1.1とは

1.1.1.1は、Cloudflare社が提供するパブリックDNSサービスのIPアドレスの一つです。このサービスの目的は、インターネットの利用速度を向上させると同時に、ユーザーのプライバシーを保護することにあります。DNSの変更は比較的簡単で、デバイスの設定を通じて行うことができます。

## 1.1.1.1の利点

- **速度**：Cloudflareは世界中にサーバーを持っており、DNSの問い合わせを迅速に処理することができます。
- **プライバシー**：1.1.1.1はユーザーのDNS問い合わせログを24時間以上保持しないというポリシーを持っています。これにより、オンラインでの行動が追跡されるリスクを低減できます。
- **セキュリティ**：悪意のあるウェブサイトへのアクセスをブロックすることで、ユーザーを保護します。


## もし基本用語がわからない方のために
### インターネットとは
インターネットは世界中のコンピュータが繋がっている巨大なネットワークです。あなたがウェブサイトにアクセスする時、実際にはあなたのコンピュータ（またはスマートフォンなどのデバイス）がインターネット上の別のコンピュータ（ウェブサーバ）に接続して、情報をやり取りしています。

### IPアドレスとは
インターネット上の各デバイスには、住所のようにユニークな「IPアドレス」が割り当てられています。これにより、デバイス同士が互いを識別し、通信することが可能になります。例えば、"192.168.1.1" や "1.1.1.1" のような数字で表されます。

### DNSとは
「ドメインネームシステム（DNS）」は、人間が覚えやすいウェブサイトのアドレス（例：www.example.com）を、コンピュータが理解できるIPアドレス（例：93.184.216.34）に変換するシステムです。これにより、私たちは複雑な数字の羅列を覚えることなく、インターネットを利用できます。

## まとめ
1.1.1.1は、インターネットの利用体験を改善するためのシンプルで効果的な方法です。速度の向上、プライバシーの保護、そしてセキュリティの強化を求めるユーザーにとって、DNSを1.1.1.1に変更することは有益な選択肢だと思います。

## 参考
- [1.1.1.1 とは？DNSリゾルバーとは？ | Cloudflare](https://www.cloudflare.com/ja-jp/learning/dns/what-is-1.1.1.1/)
【データベース】RDBの正規化を理解する〜第3正規系〜

## はじめに
今回は、第3正規形について学んだことをまとめていきます！

前回の記事はこちら

https://qiita.com/rgj0830/items/e7e38cd69eb581c21146

## 第3正規形とは？
第3正規形とは、1つのテーブル内にある推移的関数従属を解消した状態のことを指します。

### 推移的関数従属とは？
推移的関数従属とは、ある属性が別の属性を通じて間接的に主キーに依存する関係のことです。段階的な関係とも言えます。例えば、以下のような「生徒情報テーブル」に「生徒がどの部活に所属しているか」を表す「部活コード」と「部活名」が追加されたとしましょう。

#### 生徒情報テーブル
| **生徒ID** | **生徒名** | **クラスID** | **部活コード** | **部活名**   |
| ---------- | ---------- | ------------ | -------------- | ------------ |
| 1          | 山田太郎    | 1            | 101            | サッカー部   |
| 2          | 鈴木花子    | 1            | 102            | バスケット部 |
| 3          | 田中次郎    | 1            | 103            | テニス部     |
| 4          | 佐々木一郎  | 2            | 104            | 野球部       |
| 5          | 伊藤美咲    | 2            | 105            | 陸上部       |
| 6          | 木村健太    | 3            | 101            | サッカー部   |
| 7          | 渡辺陽子    | 3            | 102            | バスケット部 |
| 8          | 山口幸子    | 3            | 103            | テニス部     |
| 9          | 加藤大輔    | 3            | 104            | 野球部       |

このテーブルの主キーは「生徒ID」です。主キーである「生徒ID」が決まると、他の全ての列（生徒名、クラスID、部活コード、部活名）が一意に決まるため、このテーブルは第2正規形の状態にあります。具体的には、以下のような関数従属があります：

1. 生徒ID  ⇨  生徒名
2. 生徒ID  ⇨  クラスID
3. 生徒ID  ⇨  部活コード
4. 生徒ID  ⇨  部活名

しかし、この状態では「生徒が存在しない部活のデータを追加することができない」という問題が発生します。これは、以下のような別の隠れた関数従属が残っているためです：

- 部活コード ⇨ 部活名

つまり、次のような2段階の関数従属が存在します：
- 生徒ID ⇨ 部活コード ⇨ 部活名

このような段階的な従属関係のことを「推移的関数従属」と呼びます。

### 解決方法
推移的関数従属を解消するためには、第2正規形と同様にテーブルの分割を行います。具体的には、段階的な従属関係になっている部分を別テーブルに切り出します。この例では、「部活コード」と「部活名」を別テーブルに分割し、「部活情報テーブル」を作成します。

### 第3正規形のテーブル
#### 生徒情報
| **生徒ID** | **生徒名** | **クラスID** | **部活コード** |
| ---------- | ---------- | ------------ | -------------- |
| 1          | 山田太郎    | 1            | 101            |
| 2          | 鈴木花子    | 1            | 102            |
| 3          | 田中次郎    | 1            | 103            |
| 4          | 佐々木一郎  | 2            | 104            |
| 5          | 伊藤美咲    | 2            | 105            |
| 6          | 木村健太    | 3            | 101            |
| 7          | 渡辺陽子    | 3            | 102            |
| 8          | 山口幸子    | 3            | 103            |
| 9          | 加藤大輔    | 3            | 104            |

#### 部活情報
| **部活コード** | **部活名**   |
| -------------- | ------------ |
| 101            | サッカー部   |
| 102            | バスケット部 |
| 103            | テニス部     |
| 104            | 野球部       |
| 105            | 陸上部       |

これで、生徒が一人もいない部活のレコードも登録できるようになりました。部活情報を登録する際に、生徒の情報が必要なくなったためです。

### まとめ
以上、第3正規形についてのまとめでした。第3正規形では、テーブル内の推移的関数従属を解消することで、データの冗長性を排除し、データベース設計をより効率的で一貫性のあるものにすることがわかりました。

後は、第2正規形で行う部分的な関数従属の解消と、第3正規形で行う推移的関数従属の解消は、どちらも「問題となる列を別のテーブルに切り出す」という点で似ているなと思いました。どちらも、データの冗長性をなくし、不整合（例えば、生徒がいないと部活が追加できないなど）を防ぐための手法だったので。

また、正規化を進めるとデータベースのパフォーマンスに影響を与える可能性があるということも聞いたので。これについても、今後は学んでいきたいと思います。

### 参考書籍

https://www.shoeisha.co.jp/book/detail/9784798186627
ブランチプロテクションの設定をcurlで変更する方法

## 目的
テストブランチをブランチプロテクションで保護設定をして削除できないようにしていますが、少しの間だけブランチ削除を許容する必要がありました。そのためcurlでブランチプロテクションの強制削除を有効化にするための方法をメモしておきます


## エンドポイント

ブランチプロテクションのREST APIエンドポイントが用意されているので、そちらを叩きます。
ブランチプロテクションのエンドポイントを叩くにはpersonal_access_tokenが必須です。
```
curl -L \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: Bearer ${PERSONAL_ACCESS_TOKEN}" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/${owner}/{repository}/branches/${branch}/protection
```

https://docs.github.com/ja/rest/branches/branch-protection?apiVersion=2022-11-28

## ブランチプロテクションの設定を変更

設定を変更するときはPUTで実行します。
注意事項としてリクエストボディは変更したい設定以外は、既存のブランチプロテクションの設定と同一になるように設定をいけません。仮にすべてtrueにしてしまうと、すべてのブランチプロテクションの設定が有効化になってしまうので慎重に設定を見比べながら実行してください

```
❯ curl -X PUT -L -H "Authorization: token $PERSONAL_ACCESS_TOKEN" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/st-tech/${repository}/branches/develop-test/protection" -d '{
  "required_status_checks": {
    "strict": true,
    "contexts": []
  },
  "enforce_admins": false,
  "required_pull_request_reviews": {
    "dismiss_stale_reviews": false,
    "require_code_owner_reviews": false,
    "required_approving_review_count": 1
  },
  "restrictions": null,
  "required_linear_history": false,
  "allow_force_pushes": false,
  "allow_deletions": true,
  "block_creations": false,
  "required_conversation_resolution": false,
  "lock_branch": false,
  "allow_fork_syncing": false
}'
```
今回はallow_deletionsをtrueにしたいので、`"allow_deletions": true`に設定します。

実行後にブランチプロテクションの設定を見に行くとAllow deletionsが有効化になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469304/7aee110c-31fc-28c6-7440-4d7b2359e6d9.png)

逆に無効化したい場合は、`"allow_deletions": false`に設定して再度実行します。
```
curl -X PUT -L -H "Authorization: token $PERSONAL_ACCESS_TOKEN" -H "Accept: application/vnd.github+json" "https://api.github.com/repos/st-tech/${repository}/branches/develop-test/protection" -d '{
  "required_status_checks": {
    "strict": true,
    "contexts": []
  },
  "enforce_admins": false,
  "required_pull_request_reviews": {
    "dismiss_stale_reviews": false,
    "require_code_owner_reviews": false,
    "required_approving_review_count": 1
  },
  "restrictions": null,
  "required_linear_history": false,
  "allow_force_pushes": false,
  "allow_deletions": false,
  "block_creations": false,
  "required_conversation_resolution": false,
  "lock_branch": false,
  "allow_fork_syncing": false
}'
```

無効化になったことを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469304/81ecc5b1-3734-f5f6-aa2a-b0d620664488.png)

## 終わりに
あまりブランチプロテクションを弄りたくはないですが、もし必要になった場合は参考にしていただけると幸いです。
【fastlane】GooglePlayConsoleに前回アップロードしたアプリのversionCodeを取得する

:::note info
fastlaneでAndroidのストア申請を自動化していた時のこと
:::

![バージョンコード10はすでに使用されています 別のバージョンコードをお試しください](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3841535/122e6041-7bf2-bb6d-e951-c9778d39b211.png)

**↑versionCodeは重複できないんだった！**

前回アップロードしたアプリのversionCodeをGooglePlayConsoleから取得して+1すれば解決できそう...　（上の図だと10を取得してきて11に上げるイメージ）

iOSにはビルド番号を取得できるactionがあるけど
Androidにもそういうのがあるのかな？と思い1時間ぐらい調べてみましたが...
#### 出てこないぃぃ！！！！！


## と思ったら公式ドキュメントに書いてありました...
```ruby: GooglePlayConsoleに前回アップロードしたアプリのversionCodeを取得するaction
google_play_track_version_codes
```
↓公式ドキュメント

https://docs.fastlane.tools/actions/google_play_track_version_codes/

いやはや..公式ドキュメントは見なきゃダメですね...
<br>
以下は製品版（production）トラックのversionCodeを変数に入れる例文です。
```ruby:例文
production = google_play_track_version_codes(track: 'production')[0]
```
:::note info
引数`(track: 'production')`で製品版トラックを選択します。
`google_play_track_version_codes`は要素が１つだけの配列として返ってくるため`[0]`で要素を指定しています。
:::

fastlane本当に便利です！！