OmniAICreator/Qiita-1.07M huggingface dataset:
Flexera OneでIBMソフトウェアライセンス管理を行う場合に使用するURLおよびポート

IBMソフトウェアライセンスの管理を行うために、Flexera One with IBM Observability（以降 Flexera Oneと表記します） を利用することが可能です。
本記事では、Flexera Oneを使用してIBMソフトウェアライセンスの管理を行う場合の構成例と、Flexera One を構成するコンポーネント間通信で使用されるURLおよびポートについてまとめます。

# Flexera One構成例
Flexera OneをIBMソフトウェアライセンスの管理ツールとして利用する場合、次の3つのコンポーネントが必要です。

- Flexera Oneインスタンス: ライセンス管理サーバー。SaaSで提供されます。
- Inventory Beacon：ビーコン・サーバー。配下のInventory Agentから送信されるハードウェア、ソフトウェアのインベントリ情報をFlexera Oneインスタンスへアップロードします。
- Inventory Agent: ソフトウェアやハードウェア情報を収集するエージェント。ライセンス管理対象となるIBMソフトウェアが導入されたサーバーに導入します。

Inventory BeaconやInventory Agentは、IBMソフトウェアが導入されたサーバーのあるオンプレミスやパブリック・クラウドに配置します。

下図のような構成となります。
![Flexera_arch(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/d818698e-e29d-aae5-fa70-24b779a40e44.png)


# コンポーネント間の通信
IBMソフトウェアライセンス情報を収集し管理するために、Flexera One インスタンス、Inventory Beacon、Inventory Agent間で以下の通信が発生します。各コンポーネント間にファイアウォールが存在する場合、以下の通信を許可する必要があります。
図中の矢印の向きは通信の方向を示します。

![Flexera_communication.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/11033add-2b27-471f-5e99-8a8dc4528aa6.png)

各通信の詳細を下表にまとめます。
|No. |用途|URL、接続先アドレス | ポート
|---|---|---|---|
|①|IT Asset Management 認証|https://app.flexera.com/login|443
|②|アプリケーションサーバー接続|https://app.flexera.com/|443
|③|バッチサーバー接続|https://beacon.flexnetmanager.com|443
|④|インベントリーサーバー接続|https://data.flexnetmanager.com|443
|⑤|証明書失効チェック|http://crl.sca1b.amazontrust.com/sca1b.crl<br>http://crt.sca1b.amazontrust.com/sca1b.crt<br>http://ocsp.sca1b.amazontrust.com|80
|⑥|ビーコン接続|Inventory BeaconのIPアドレスまたはホスト名|80(http)<br>443(https)




以上がFlexera OneでIBMソフトウェアライセンス管理を行う場合に使用するURLおよびポートです。


参考リンク：
Flexera One Help - Ports and URLs for Inventory Beacons
https://docs.flexera.com/flexera/EN/ITAssets/FIB-PortsAndURLs.htm?Highlight=port
JavaとgRPCで2Dバーチャルオフィスっぽい何かを作る ①概要編

この記事は [TLB Enjoy Developers Advent Calendar 2022](https://qiita.com/advent-calendar/2022/tlb-enjoy) 、2日目の記事です。

# これは何？
リモートワークの普及により、オンラインでのコミュニケーション促進を目的とした2Dバーチャルオフィスツールが人気なようです。具体的には、[Gather](https://www.gather.town/)や[MetaLife](https://metalife.co.jp/)などです。Youtubeでチュートリアル動画を観たのですが、一言で感想を言えば **「楽しそう!!」** 。2Dドット絵がかつて遊んだゲームを彷彿とさせ、えもいわれぬ懐かしみを感じさせます。

- **2Dバーチャルオフィスツールっぽいものを自分で作ってみたい！**
- **ネットーワーク経由で同期をする学習にもなる！**

ということで、学習がてら2Dバーチャルオフィスツールぽいものを制作しようと思い立ちました。

# 実現したい事
以下のような機能が実現できればそれっぽいものが実現できるのではと考えました。

- ツールに接続したプレイヤーは、2Dドット絵のマップ上でキャラクターとして表現される。
- キャラクター同士、マップ上の位置をリアルタイムに共有できる。
- 画面上でキー入力やクリックなど何らかの操作を行うことで、他のプレイヤーとテキストでの会話や音声通話、ビデオ通話をすることができる。 ※大変そうなのでできたらやる

# 構成
サーバー・クライアント構成にして、各クライアントはサーバー経由でお互いの位置を共有します。
双方向通信の実現にはgRPCを使用します。また、データを保存しておくためにKVSを配置した方が良いと考えました。
具体的に使用する技術要素としては以下の通りです。
- Java & SpringBoot
- gRPC
- Redis
![qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710108/f8eea794-ff3b-4412-8528-42894f23da0c.png)

# gRPCについて
gRPCの通信方式には、 **Unary**・**Server streaming**・**Client streaming**・**Bidirectional streaming** が利用できます。
これらの通信方式を組み合わせてアプリケーションを作っていくのですが、今回はプレイヤー同士の位置の共有にBidirectional streamingが使えそうと考えました。
![qiita2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710108/92aa62ec-ef5f-4d59-df31-e6d7dd7b3190.png)

# マップ・キャラクターについて
過去に作ったものを再利用できそうです。
[ミノ駆動本を読んで不変の大事さを知る](https://qiita.com/kdr250/items/6df7befab118b6d6982a)

# 鋭意製作中
ちなみに今(2022年12月2日時点)の制作状況はこんな感じです。
アドカレ期間中に完成できるよう頑張ります...
![qiita3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710108/b79580f4-eb50-8604-9975-5344c00f26f4.gif)


明日は @Miyayan さんの記事です。お楽しみに！
debパッケージを作ってlaunchpadでPPAとして公開するまでの手順

ACCESS Advent Calendar 2022 の７日目になります。

みなさんは自分で作ったプログラムをaptでインストールできたらいいのにな。と思ったことはありませんか？
私は時々インストール手順とかもう書きたくない。aptでインストールして設定部分だけドキュメントにしたい！！
と何度か思ったことがあり、自分でレポジトリを作成してホストしたことがあります。

しかし、launchpadを使えばセルフホストなんてしなくていいんです。
ソースパッケージを登録すればビルドもやってくれます。

なのでそのやり方について書いていこうと思います。
英文 https://packaging.ubuntu.com/html/getting-set-up.html


launchpadのアカウントの作り方はもう覚えてないのでその後から…

やることは下記
- SSHキーの登録
- GPGキーの登録 - PPAの作成
- ソースパッケージの作成
- ビルドの確認
- アップロード

# sshキーの登録

下記のボタンを押してsshの公開鍵を登録します。流石に今どき持ってないということはないと思うので作り方は割愛
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8707/ab983e54-e6be-b78e-25ae-160b8463f0ed.png)

テキストの公開鍵をコピペしてImport Public Keyを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8707/4979c22c-d8c6-1278-da30-0a566db93fd1.png)

# GPGキーの登録

まずはGPGキーの作成
```
gpg --gen-key
```

ubuntuのキーサーバーに転送します
```
gpg --send-keys --keyserver keyserver.ubuntu.com <KEY ID>
```

launchpadのアカウントにGPGキーの紐付け

作成したGPGキーのフィンガープリントを表示します。

```
gpg --fingerprint <メールアドレス>
```

OpenGPG keysの横のマークから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8707/b2ea9600-b675-27ba-e7f4-8374db37cd45.png)

GPGの登録ページに行きます。（途中アカウントの再ログインがある場合があります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8707/01a85080-ba21-c0e7-d814-38c9fa589d25.png)

# ソースパッケージの作成
ソースパッケージを作成します。

まずパッケージ作成時に自動でGPGでサインしてくれるように環境変数を設定します。
```
export DEBFULLNAME="hisayoshi suehiro"
export DEBEMAIL=<メールアドレス>
```

今回はサンプルとしてGNU Helloを使います。
helloパッケージ自体はすでに登録されているのでリネームしてbolshelloとしました。

```
wget -O hello-2.10.tar.gz "http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz"
mv hello-2.10 bolshello-2.11
tar czvf bolshello-2.11.tar.gz bolshello-2.11/
```

ソースパッケージを作成します。
ソースパッケージは dh_make を利用してテンプレートを作成します。 cmake,autotools,makeなどメジャーなビルドツールは自動検出してくれます。パッケージタイプは今回は "s" となります。

```
dh_make -f ../../pkg_tmplate/bolshello-2.11.tar.gz 
rm debian/*.ex
```
ビルド時にcleanを走らせようとして失敗するので debian/rules に下のように追記します。override_で始まるこれはパッケージのビルド時の動作を変更します。

```
override_dh_auto_clean:
```


依存関係に"gettext, texinfo,"をdebian/controlに追記し、ubuntuのバージョン名とパッケージセクションを変更します。
バージョンとパッケージセクションが存在しているものでないと launchpad が受け入れてくれないので注意してください。
```
sed -i "s/UNRELEASED/jammy/" debian/changelog
sed -i "s/debhelper-compat/gettext, texinfo, debhelper-compat/" debian/control
sed -i "s/unknown/devel/" debian/control
sed -i "s/\<insert the upstream URL, if relevant\>/http://www.lnc.jp/" debian/control

debuild -S
```

以上でソースパッケージが作成できます。

# ビルドの確認
作成したソースパッケージがビルドできるか確認します。
```
pbuilder-dist jammy build bolshello_2.11-1.dsc
```
ビルドが成功すると ~/pbuilder/jammy_result/ 以下にパッケージが生成されます。

# アップロード

サインがされていれば下記コマンドでソースを転送することでパッケージがビルドされて公開されます。
```
dput ppa:bols-blue/hello bolshello_2.10-1_source.changes
```
初回のみ、しばらくの間(数時間)エラーが出るので気長に待ちましょう。

以上で launchpad で PPA として公開できるようになりました。
ちょっと便利なretoolの使い方

GxPの上野です。

この記事は[グロースエクスパートナーズ アドベントカレンダー](https://qiita.com/advent-calendar/2022/gxp)の4日目の記事となります。

現在案件で使用しているretoolについてご紹介したいと思います。


概要はnyasbaさんの[こちらの記事](https://qiita.com/nyasba-gxp/items/b07fcd62946bfa62b80a)で詳しくわかりやすく説明されています。

私は開発でretoolを使用していく中で「こういう時どうすればいいんだろう？」
と思ったこととその対処法をまとめていきたいと思います。

retoolはあらかじめ用意されたフォームやテーブルやボタンなどの
    コンポーネントを組み合わせてwebアプリを作成していくツールです。

チュートリアルは[こちら
](https://gxpretool.gxp.jp/about/docs-quickstart)

retoolの開発画面の初期状態はこんな感じです。
![new.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/adc82fec-4093-0331-7df0-f8d80a7bccad.png)



画面右側にあるコンポーネントをドラッグ＆ドロップして
追加していくことで自分がイメージする画面を形にすることができます。
![form.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/c27b4358-fdda-91df-ba32-54a689576d37.png)


またデータベースに接続してSQLを書くことで画面に表示するデータ
や画面で加工したいデータを取得できます。
SQLを動かすタイミングも画面の初期表示時、特定のボタンが押されたとき
テーブルの値が変わったときなど選ぶことができます
![query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/ef956160-6dbd-fb3b-3b21-46c5706b3af2.png)




### 必要事項を全部入力したときだけボタンを押せるようにしたいとき

モーダルを実装するときに入力項目がすべて入力されている場合のみ
ボタンを押せるようにするよう実装する必要がありました。

入力フォームやプルダウンを選択し、INTERACTION -> Event Handlersを
クリックするとボタンの制御の設定を行うことができます。

下の画像では
・item1の入力フォームに文字が入力されている
・item2のプルダウンで値が選択されている
・item3のプルダウンで値が選択されている

の3つの条件を満たしているときにbutton1を活性化するよう制御しています

![modal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/b2f4fde0-1581-0705-c57e-bc7436705f31.png)


### プルダウンで選んだ値によってフォームを制御したいとき

下の画像のように職業の選択肢が3つ（会社員、自営業、その他）あり、
その他を選んだ時だけ自由記述のフォームを活性化したい、といったケースがあると思います。
![job.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/6dd972c0-8b56-8174-0619-3682003be950.png)

その時はテキストフォームのINTERACTION -> Read Onlyで
「その他」以外の選択肢が選ばれたときは入力できないよう制御することができます。

![job2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/1fbe5300-21ff-7fc9-fed6-f20668471185.png)

### プルダウンで選んだ値によってフォームをクリアしたいとき

先ほどの続きでプルダウンで「その他」を選択して値を入力した後、
プルダウンを「会社員」や「自営業」に変更した場合はテキストフォームは
空欄に戻す必要があります。

その場合はセレクトボックスのINTERACTION -> Event Handlersで
「その他」以外の値が選択されたときはテキストフォームの値をクリアするよう
設定できます

![job3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952071/1be3d37d-80fc-f78d-6862-9a3788ed1bfc.png)

Javascriptの実装経験がある皆さんは
retoolを活用することで楽しくwebアプリを開発することができるのではないかと思います。
休止しててすみませんでした&結果の報告

# 休載事由
就職活動の波が来ていたこと、午後試験が不安過ぎて余裕がなかったことでお休みをいただきました。申し訳ありません。
ゼミの後輩向けに、内容を改めて考えていきたいと思っています。近々また更新していく予定です。

# 結果報告
9月にゼロから勉強を始めた基本情報技術者試験を、11/21,11/25日に受けてきました。
結果としては……**合格です！！！**　いや～ホントによかった。

# 午前試験について
午前試験は僕の得意なインプット作業でもあったため、かなり余裕がありました。
以下は得点内訳です。

総合点85
- ストラテジ系  95%
- マネジメント系  80%
- テクノロジ系  82%

**過去問道場を使って5回分くらい回して** 、見直しをある程度しておけば落ちることはないかなという印象です。

# 午後試験
過去問の大問1必答、選択4問、アルゴリズム必答1問、プログラミング言語選択1問の形式を想定して練習していました。
対策は **とにかく演習** です。アウトプットの仕方に慣れないと何もできません。

アルゴリズムは基本的に安定がなく、30~80%をうろうろしていました。春秋併せて6年分くらいを解き、ようやく平均60に落ち着いたところで本番に臨みました。
Pythonについても当初に掲載したテキストの想定問題と、サンプル問題のみが対策として解ける問題となっており、かなり演習量に不安が残っていました……さぁどうしようか。

前半の選択4問でもたまに下振れてしまうことがあり、**「Pythonもアルゴリズムも相性悪かったら終わりだな」** と考えていました。
そんなこんなで不安いっぱいの中…受けてきました。
以下が得点内訳になります。

総合点77.5
- 問1 情報セキュリティ（必答）  100%
- 問2~5 からソフトウェア、プロマネを選択  100%
- 問6 アルゴリズム  40%
- 問7~11 からPythonを選択  88%

問題形式が少し変わっていて面食らっていましたが、過去問から類似問題が出ていたりと、前半はかなり稼げました。
逆に後半はアルゴリズムが相性が悪くて、ギリギリアウトくらいの点数を叩き出していますね…💦
Pythonは、アルゴリズムの過去問とサンプル問題の合いの子！って感じで解きやすかったですね。ここで救われたと思います。

所感としては、やはり **とにかく過去問を回すこと！** 本当によく似た問題が出ることもあるので、春秋4年分とか解いて臨めれば尚更いいと思います。アルゴリズムに関しては多少時間オーバーしても **トレースを普段からサボらない** のが重要です。
Pythonに関しては慣れだと思います。まずはテキストに載っている問題を解ききりましょう。

# G検定も受けてきました
基本情報技術者試験の対策の裏で、こっそりと勉強していたG検定ですが……**こちらも合格でした！！**
11月頭の試験だったので「いやいや基本情報大丈夫かよ」と思いつつ、色々調べたところ
**「想定学習時間は60時間程度……ギリギリいけるな！」**
となったのが受験のきっかけですね。就活でデータサイエンティストへの興味を示せる貴重な資格でもありましたし。

以下が得点内訳です。

- 人工知能とは.  人工知能をめぐる動向. 人工知能分野の問題：66%
- 機械学習の具体的手法：95%
- ディープラーニングの概要：70%
- ディープラーニングの手法：70%
- ディープラーニングの社会実装に向けて：72%
- 数理・統計：100%
- 法律・倫理・社会問題：85%

総合得点率、設問個別の正解・不正解、本試験の合格ライン等は開示されないのでこれ以上の情報はないです。

まずはこの試験の良し悪しなのですが、**ネット受験なので自宅PCから受けられる** のがかなり気軽でいいですね。
一方で **自宅PCで受ける前提の難易度** に調整されていることには、かなり驚きました。

どういうことかというと、運営のJDLAが出版している公式テキストの内容が、試験合格ラインを取れる内容ではありません。
テキストだけでは3割が限界で、あとは都度ググって得点を稼いで7割（噂されている合格ライン）取ろう！と言わんばかりです。
インプレス出版の対策問題集でも「もう少し得点伸ばせるかな？」くらい。**推奨はされていません** がググりはほぼ必須。
僕みたいに前提知識なしで最短で取ろうとすれば尚更要るんじゃないかなと思います。試験時間も短いので。

試験の対策としては**インプレス出版の対策問題集を全部暗記する**、もしくはカンペを作ることですね。検索と同様に、カンペももちろん推奨はされていませんが。僕は暗記しました。

ここまでクレーマーのような文章になってしまいましたが、実はG検定の勉強が基本情報技術者試験にも活きました。

それは **とにかく機械学習、データサイエンス領域に強くなる** 点です。

午前はインプットなのでG検定対策で学んだことをそのまま答えればいいし、午後試験でもPythonでパーセプトロンなんか出た日には試験中に踊り出したくなるレベルですらすら解けると思います。
私が使っていたPythonのテキストでは実際にパーセプトロンが例題として載っていましたが、初見で迷いなく解けましたね。

こういった相乗効果もあるので、受験に迷っている方は是非受けてみてはどうでしょうか？
Azure Pipelinesで過去の.NET SDKを使用していたCIがコケるようになった対策

# あらすじ

これまで元気に走っていた自動テストが突然コケた
``` bash
Framework: 'Microsoft.AspNetCore.App', version '3.1.0' (x64)
.NET location: /usr/share/dotnet/
The following frameworks were found:
  6.0.11 at [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  7.0.0 at [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]

...

Test Run Aborted.
##[error]Error: The process '/usr/bin/dotnet' failed with exit code 1

```

対象プロジェクトが依存している .NET Core 3.1 がサポート切れになったため、標準でPipelinesのubuntu環境にSDKが含まれなくなったためと思われる。

こういうとき、最善手としては.NETのバージョンをサポート対象のバージョンまで上げればいいが、そうともいかない事情もある。

# 対策
## global.jsonを定義する
https://learn.microsoft.com/ja-jp/dotnet/core/tools/global-json

dotnet CLIを使用してビルドを行う際には、インストール済みのSDKから最新のバージョンを使用するが、このglobal.jsonを使うとバージョンを指定することができる（知らなかった）。
今回は関係あるかどうかわからないが、通常のビルド時にも適切な依存バージョンのSDKを使うためにちゃんと用意しておくことにする。

``` json
{
  "sdk": {
    "version": "3.1.415",
    "rollForward": "latestFeature"
  }
}
```

## .NET Core 3.1 SDKを事前にインストールする
テストやビルドのタスクを実行する前に、SDKをインストールするタスクをpipelinesのymlに定義する。

``` yaml
- task: UseDotNet@2
  displayName: 'Use .NET Core sdk 3.1.x'
  inputs:
    version: 3.1.x
```

# 結果

エラーが消えて通ったよ！やったね！
type-challengesの「Permutation」で詰まった話

# はじめに
この記事はHRBrain Advent Calendar 2022カレンダー2の7日目の記事です。

https://qiita.com/advent-calendar/2022/hrbrain

株式会社HRBrainでは毎週TypeChanllengeを行っています。
この取り組みを紹介した記事があるので興味がある方は御覧ください。

https://times.hrbrain.co.jp/entry/2021/11/17/how-to-use-type-challenges

その中で「Permutation」という特段難しい問題に詰まったので紹介します。
復習がてら記事にしました。

# type-challengesとは

TypeScriptの型の問題集のようなリポジトリです。
Vue.js コアチームメンバーでVitest、Slidevの作成者である[@antfu7](https://github.com/antfu)さんという方が開発しています。

https://github.com/type-challenges/type-challenges

# Permutation
https://github.com/type-challenges/type-challenges/blob/main/questions/00296-medium-permutation/README.md

Union 型を Union 型の値の順列を含む配列に変換する順列型を実装する問題です。

```ts
type perm = Permutation<'A' | 'B' | 'C'>; // ['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
```

# 参考にさせていただいた回答
こちらが最もコメントの多く、recommendのラベルが付けられている回答です。
本記事もこちらを参考にさせて頂いています。
丁寧に解説してくださっているので、興味がある方は下記のリンクを御覧ください。

https://github.com/type-challenges/type-challenges/issues/614
```ts
type Permutation<T, K = T> = [T] extends [never]
    ? []
    : K extends K
    ? [K, ...Permutation<Exclude<T, K>>]
    : never;
```
# 解説

まとめては理解しにくいと思うので分けて解説します。

## [T] extends [never] ? [] : K 

```ts
type Permutation<T, K=T> =
    [T] extends [never] ? [] : K 
```
もう既にわけがわかりませんね
これは一言でいうと**Tがneverか判定している処理**です。

下記の式ででいけるのでは？と思う方がいるかも知れませんが、期待通りの動作はしません。
TSのPlaygroundを見ていただくと理解が早いと思います。
```ts
T extends never ? [] : K 
```
https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABASQM4DkCmA3TAnAHgBUA+ACmwEMAbETALkSMUwA8pMwATVRMHfIgD8iKHjqJGwGqkwBKRAG8AvgChVaLLkKoxMMAHNyYunIDcGjAML9tx8fItA

型引数に渡されたneverは条件分岐の際、無視されるので機能しません。
そのため評価される前にタプル型にして、条件分岐できるようにしています。

かなりhack的な方法ですが、neverを判別するにはこれしか無いようです。

詳しくはこちらをご覧ください。

https://github.com/microsoft/TypeScript/issues/23182

## K extends K

```ts
type Permutation<T, K = T> = K extends K
    ? [K, ...Permutation<Exclude<T, K>>]
    : never;
```

TypeScriptはunion型を型引数に渡すと下記のように分散する性質があります。
```ts
 T extends U ? X : Y 
 T = 'A' | 'B'

(A extends U ? X : Y) | (B extends U ? X : Y)
```
それを利用して`K extends K`にunion型を渡してそれぞれ条件分岐を行わせることができます。
このように渡されたunion型でループ処理のようなことをさせています。

## ? [K, ...Permutation<Exclude<T, K>>]: never

```ts
[K, ...Permutation<Exclude<T, K>>]
```
`'A'`が型引数`K`に渡されたとします。
再帰的にPermutationの引数として`T('A' | 'B' | 'C')`から`K('A')`を除外した`'B' | 'C'`を型引数として渡しています。
配列に　`K('A')`とPermutationの結果を展開しています。

この再帰的な流れを理解するのに下記の表がとてもわかりやすかったのでぜひご覧下さい。

https://github.com/type-challenges/type-challenges/issues/614#:~:text=%2C%20click%20me-,Iteration,-T

最終的に全てのパターンが結合され順列を網羅した型になります。
```ts
['A', 'B', 'C'] | ['A', 'C', 'B'] | ['B', 'A', 'C'] | ['B', 'C', 'A'] | ['C', 'A', 'B'] | ['C', 'B', 'A']
```

# さいごに
type-challengesをやっていて着実に型表現力がついてきていると日々実感しています。
TypeScriptに自身がない方、TS力を上げたい方は一度チャレンジしてみてはいかがでしょうか？
paiza.ioでelixir その111

# 概要
paiza.ioでelixirやってみた。
再帰、書いてみた。

# サンプルコード

```
defmodule Main do
	def dn(0) do
	    0
	end
	def dn(a) do
	    a - 1
	    |> IO.inspect
	    |> dn
	end
end

Main.dn(10)
#|> IO.inspect

```

# 実行結果

```
9
8
7
6
5
4
3
2
1
0
```

# 成果物

https://paiza.io/projects/KgIcbXPndGfhfgH1WSpY3A


以上。
Databricksの新たなノートブックエディタ(実験段階)

[New notebook editor \(Experimental\) \| Databricks on AWS](https://docs.databricks.com/notebooks/notebook-editor.html) [2022/11/30時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、Databricksノートブックで使用するエディタを、VS Codeを強化しているオープンソースコンポーネントである[Monaco](https://microsoft.github.io/monaco-editor/)に移行しつつあります。本書では、新たなエディタで利用できる幾つかの機能を説明します。

# 新規エディタの有効化

新たなエディタを有効化するには:

1. ワークスペースの右上のユーザー名をクリックし、ドロップダウンから**User Settings**を選択します。
1. **Notebook Settings**タブをクリックします。
1. **Turn on the new notebook editor**の隣のチェックボックスをクリックします。

# オートコンプリート(IntelliSenseのサポート)

ノートブックがクラスターに接続されると、あなたが入力しているセルに、[VS Code IntelliSense](https://code.visualstudio.com/docs/editor/intellisense)によるオートコンプリートの提案が自動で表示されます。提案を選択するために上、下のキーやマウスを使い、選択内容をセルに入力するには**Tab**や**Enter**を使います。
![](https://docs.databricks.com/_images/code-suggestions.png)

# 変数のインスペクション

ノートブックで定義されている変数の情報を表示するには、変数名の上にマウスカーソルを移動します。
![](https://docs.databricks.com/_images/variable-inspection.png)

# コードの折りたたみ

コードを折りたたむことで、コードのセクションを一時的に非表示にすることができます。この機能によって、長いコードを開発している際に、作業している特定のセクションにフォーカスできる様になるので便利です。

コードを非表示にするには、セルの左端にカーソルを移動します。非表示にできるコードセクションである論理的ポイントに表示される下向き矢印が表示されます。コードセクションを非表示にするには矢印をクリックします。コードを表示するには矢印(右向きの矢印)を再度クリックします。
![](https://docs.databricks.com/_images/code-folding.gif)

キーボードショートカットを含む詳細については、[VS Code documentation](https://code.visualstudio.com/docs/editor/codebasics#_folding)をご覧ください。

# マルチカーソルのサポート

以下の動画に示す様に、同時編集を容易にするためにカーソルを複数作成することができます。
![](https://docs.databricks.com/_images/multi-cursor.gif)

セルでカーソルを複数作成するには:

- MacOSでは、`Option`キーを押したままカーソルを追加する場所をクリックします。
- Windowsでは、`Alt`キーを押したままカーソルを追加する場所をクリックします。

垂直に揃えられた複数カーソルを作成するには:

- MacOSでは、キーボードショートカット`Option+Command+up`か`Option+Command+down`を使います。
- Windowsでは、キーボードショートカット`Shift+Alt+up`か`Shift+Alt+down`を使います。

# カラム(ボックス)選択

カラムの負数のアイテムを選択するために、キャプチャしたい領域の左上をクリックします。そして:

- MacOSでは、`Shift + Option`を押し、1つ以上のカラムをキャプチャするために右下にドラッグします。
- Windowsでは、`Shift + Alt`を押し、1つ以上のカラムをキャプチャするために右下にドラッグします。
![](https://docs.databricks.com/_images/select-columns.gif)

# 括弧のマッチング

括弧、大括弧、中括弧の近くをクリックすると、エディタは対応する括弧をハイライトします。
![](https://docs.databricks.com/_images/bracket-matching.png)

# 隣り合わせでのバージョン履歴のdiff

[以前のノートブックバージョンを表示](https://qiita.com/taka_yayoi/items/dfb53f63aed2fbd344fc#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86)している際、エディタは色のハイライトとともに隣り合わせで表示します。
![](https://docs.databricks.com/_images/code-diffs.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
エラーコード"Value of type '[indexPath]?' has no member 'row'"の表示について

テキスト学習中に以下のエラーに遭遇しました。
Value of type '[indexPath]?' has no member 'row'

訳すと。
タイプ '[indexPath]?' の値は、メンバー 'row' を持っていません。

![スクリーンショット 2022-12-02 11.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2978721/c7728a92-219a-01f3-7a56-9b71f8c12b4b.png)

以下の検索結果を実行
https://developer.apple.com/forums/thread/76086

以下のコードへ変更
修正前
indexPathsForSelectedRows → 
修正後
indexPathsForSelectedRows?.first

![スクリーンショット 2022-12-02 11.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2978721/40b9fb1e-41f5-0d4b-f0d8-8ab265bcaced.png)
解決しました。

記事にも記載の通りこの状況だと複数のdexPathを返す可能性があったため、エラーが発生したのかなと思います。そのため.firstにより配列の中から一つの要素を選択させる必要があったのかなと思います。

**終わりに
すぐ検索結果に辿り着けてよかったです。
教材の通り進めていてもこういったことが多々あるのでその都度調べて対応していけたらなと思います。
イケメンかどうか判定するAI作ってみた！

# はじめに
自分の顔がイケメンかどうかが気になりすぎるのでイケメン判定AIを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/d0955187-4a6a-386a-022c-9d3d91f3bb18.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/77e2e736-4cb1-bba5-187c-7b8775878b31.png)



ソースコードはこちら↓
https://github.com/Kentea-Watanabe/Handsome_judgement


# 構成
1. Yolov5を用いて顔部分を切り取る
2. imgsimで画像の類似度計算

# 1. Yolov5を用いて顔部分を切り取る
![image_crop_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952830/fc6e5a41-41f3-2123-2a36-9a32dd924571.jpeg)


```python
# Yoloの顔検出器を使用する
yolo_weight = "/content/Handsome_judgement/yolov5_face_detection/weights/best.pt"
yolo_dir = "/content/Handsome_judgement/yolov5_face_detection/yolov5"
d_model = torch.hub.load(yolo_dir, 'custom', path=yolo_weight, source='local')

input_im = cv2.imread(input_im_path)
input_pred_im = d_model(input_im) 
input_det_im = input_pred_im.crop(save=False)
input_cropped_im = input_det_im[0]["im"]
```
# 2. imgsimで画像の類似度計算
イケメンを以下のように定義します。
* イケメンだけのデータベースを作成し、イケメンの顔と入力画像の類似度が閾値を超えていたらイケメンであると判定する



```python
  # {画像パス: 画像の距離}の辞書を作成
  im_dist_dic = {}

  # 画像同士の距離が近いほうが似ている画像となる。
  min_dist = 1000 # 初期化する。
  # 類似度判定のためのベクトル化
  db_vec = vtr.vectorize(input_cropped_im)
  input_vec = vtr.vectorize(db_cropped_im)
  dist = imgsim.distance(db_vec, input_vec)
  im_dist_dic[db_img_path] = dist

  # 類似度が高いものを更新する。
  if min_dist > dist:
    min_dist = dist

# イケメン判定
if min_dist < 20:
  print("イケメン判定結果 : True")
else:
  print("イケメン判定結果 : False")
```


# 最後に
イケメンだけのデータベースに、こっそり自分の顔画像をいれておこうと思います。
それでは、良いイケメンライフを。
なぜQiitaにアウトプットするのか -Qiita史上最多記録をつくろう！アウトプットはいいぞカレンダー Advent Calendar 2022-

# はじめに

この記事は[Qiita史上最多記録をつくろう！アウトプットはいいぞカレンダー Advent Calendar 2022](https://qiita.com/advent-calendar/2022/output)の11日目の記事です。

始めまして、Watanabe Jinと申します！
普段はWeb系のエンジニアをやっており、頻繁にアウトプットをするようにしています。

[Qiita](https://qiita.com/Sicut_study) (2022年12月2日)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/23d7ef0d-3511-f2bc-0e0e-fb97b4561a5f.png)

[Zenn](https://zenn.dev/jinwatanabe) (2022年12月2日)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/43acec66-6cb0-6ea6-a35c-448335bfd8e4.png)

約2年間で合計250個の記事を書いてきました (3日に1度のペース)
その経験の中でよく「どうやってアウトプットしているの」「何をアウトプットしているの」「なぜアウトプットしているの」という5W1Hのような質問が良く来るので今回はまとめていきたいと思います。

最近行いました社内LTの中で発表した「アウトプットしか勝たん！」の内容を簡単にまとめた記事となります

# 自己紹介

名前: Watanabe Jin
エンジニア歴: 3年目
スキル: 機械学習回り少々、Web周り

現在別のアドベントカレンダーで1人完走目指して投稿しています

https://qiita.com/advent-calendar/2022/mob_torikumi_example

# なぜ記事を書くのか

大きく4点の理由があってQiitaやZennに技術記事を投稿しています

## 1. 将来の自分のため
みなさんは少し昔にやった技術を再度調べなおした経験はないでしょうか。昔みた記事がどこにあったか調べなおしていく作業などです。私はRailsを書いていてDeviceなど最初に利用するものは特に何度も調べて昔見たわかりやすいサイトを探して時間を無駄にしていた記憶があります
自分で記事にして方法をまとめておくことで、その時間が他の開発に任せられるので時間の削減になりますし、わかっているのを学びなおす手間も省けます

## 2. 同じことをしようとして困っている誰かのため
自分がつまづいたことは他の人も必ずつまづくと考えています
この人もかならずネットで調べているはずなので、そういう人が早く解決できるように私が記事を書く
それが大きな各モチベーションになっています

また、社内の人にもまとめた記事を渡すことができます。社内の人は同じ技術を利用しているので、必要になる可能性はとても高いです
私のWSL2でDocker環境をたてる記事は社内で殿堂入りしているほど読まれています

## 3. 技術の証明になる

こちらは転職ドラフトを利用して一番実感しました
詳しい転職ドラフトのお話は以下の記事で公開しています

[準備中]

指名の頂いた多くの企業でアウトプットについては触れられていて、面接でも話題として上がりました
実際にレジュメからはわからない技術力は記事をみればある程度予測ができるようになるので、市場価値も正確になるかと思います

アウトプットをしていないと技術力を証明するのがレジュメの深堀しかないので大変になりそうだなと感じました

## 4. 技術を深く理解することができる

人に教えられるようになるには深く理解している必要があります
記事にすることで見た人がわかりづらいと感じるところを丁寧にかく必要がりあります
この過程で深く理解して、定着した技術力になると思っています

# なぜ記事を書けるのか

みなさんは開発していてつまづくことが毎日のようにあると思います
このつまづいた内容を記事にする方法で私はアウトプットしています
Qiitaにあげている記事は基本的につまづいた問題と解決方法のみとなります

ここですべてのつまづいたこと、調べたことを調べていては記事をあげるのが大変なので以下の2つの条件どちらかに当てはまるものを記事にします

## 1. 解決時間がどれほどかかったか

もし解決するのに時間がかかったのならば、仮に解決方法があったとしてもその記事はタイトルがわかりづらかったり、内容がわかりづらかったりすることが多いです。
そういう場合はもっとわかりやすく、検索に引っ掛かりやすい適切な名前を考えて記事を書くようにしています

## 2. 解決方法がネットにない/日本語記事がない

この場合は大きなチャンスだと思って書くようにしています。
自分の投稿した記事が多くの方にみられるので、なるべく丁寧に記事を作成しています

# QiitaとZennの使い分け

私はどちらも投稿しているのですが、使い方を分けています

Qiita: 問題と解決方法を書いた記事
Zenn: ハンズオンなど分量と写真が多い記事

記事の書きやすさはQiitaのほうがよいですが、Zennであれば以下のVSCodeの拡張が利用できます

https://zenn.dev/zenn/articles/install-zenn-cli

このCLIを使うことで、簡単にマークダウンでブログがVSCode上で書けます。
Gitを使った管理もできますので、修正してPushすれば反映されますし、修正箇所のプルリクも受け取れます

# おわりに

私は記事の数が成長の数だと思っています。1年間でどれだけつまづいたかが記事の数としてわかるので気に入っています
また、誰かの為になるというのは「いいね」の数ではなく、それ以外の人もきっと見ているはずです。誰かのためになっていると常に考えるようにしています

今後さらに新しいことをやっていくので、たくさんアウトプットします！
Neutrinoを使ってきりたんに歌わせてみた

# はじめに
この記事は[SLP KBIT AdventCalendar2022](https://adventar.org/calendars/7569) 2日目の記事です。
こんにちは！12月に入ってかなり寒くなってきましたよね。皆さん、体調管理は万全でしょうか？風邪はひかないように気をつけましょうね。
さて、最近VOICEVOXやVOICEROIDに歌わせる動画が有名になってきていますよね。
そこで、今回はNEUTRINOを用いてきりたんに歌を歌わせてみたいと思います。
ちなみに、歌わせる曲は、TrySailさんの「adrenaline!!!」です。
NEUTRINOとは、無料の音声合成（ボーカルシンセサイザー）ソフトで、VOICEROID+の東北きりたんにも対応しています。
この記事では、前述のソフトウェアを使ってどのように歌わせたのかを紹介していきます。
# 環境
- Windows10
- [NEUTRINO](https://studio-neutrino.com/)
- MuseScore3
- Cakewalk by BandLab
# 前提知識
### NEUTRINOとは
ニューラルネットワークを用いた、フリーの歌声シンセサイザーです。
無料で使うことができ、東北きりたんにも対応しているということで、今回はこのソフトを採用しました。
### MuseScore3とは
NEUTRINOは「MusicXML」という譜面データを元に音声合成を行うため、この譜面データを出力することができるこのソフトを使いました。
GUI操作で簡単に譜面を作ることができたので、使い勝手は良いほうでした。
### Cakewalk by BandLabとは
無料で使えるDAWソフトです。
MuseScore3ですべての音符を手打ちするのは手間がかかるため、このソフトを使って時短しました。
# NEUTRINOのインストール
NEUTRINOの[公式サイト](https://studio-neutrino.com/)からDownloadを選択し、GoogleドライブからNEUTRINO-Windowsを選択しダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/e8a6b69b-b5f4-51ae-a67d-0e5611ea2fc0.png)
また、歌声ライブラリからきりたんの声をダウンロードしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/d0e100fd-b667-ffea-fc3c-2d2cdfd93f02.png)
どちらもzipファイルなので解凍しておきましょう。
# 譜面データを作ってみる
Cakewalk by BandLabのインストール方法は、[こちら](https://1176fire.com/cakewalk-by-bandlab-howto-install/)を参照してください。
Cakewalk by BandLabにて、簡単ではありますが、譜面データを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/602a4e48-904e-4990-e823-91bda837d6a4.png)
この譜面データをmidファイルとしてエクスポートし、MuseScore3でインポートします。
MuseScore3はmicrosoft storeでダウンロードできます。
その結果、以下のように出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/94e44f52-459b-014f-2e6b-da0d1232e0e3.png)
この譜面に歌詞を入れ、いろいろいじくった結果、このようになりました。
基本的に一つの音符に対して一文字喋らせるようにしましょう。
また、ブレス記号を挿入すると息継ぎをしてくれますが、これを入れることで一気に人間っぽさが出るのでおすすめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/c590e6f7-3f3d-822c-1b09-0f234a686d31.png)
この譜面データをmusicxml形式でエクスポートします。
エクスポート先は解凍したNEUTRINOフォルダのscore/musicxmlの中です。
# 実際に歌わせてみる
さて、これで譜面データを作ることができたので実際に歌わせてみましょう。
NEUTRINOフォルダのmodelフォルダの中に解凍したきりたんの音声データを入れておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/50341fbe-5975-713e-d5cc-5e9de244c096.png)
NEUTRINO/Run.batファイルの記述を書き換えます。
Run.batを右クリックして編集から、メモ帳で編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366974/f69cb601-3545-e2b4-3b44-f65de9d90962.png)
赤丸で囲った部分を変更します。
上の赤丸のBASENAMEの部分を先程作ったmusicxmlファイルを拡張子抜きで書き込みましょう。
下の赤丸のModelDirの部分をKIRITANに変更します。
その後、cmdでRun.batを起動してください。
数秒待つと、NEUTRINO/outputに音声データができています。
これできりたんに歌わせることができました。
# 終わりに
今回は、NEUTRINOを使って、きりたんに歌わせてみました。
今回作った音声ファイルはこちらに公開しておきます。https://drive.google.com/file/d/1EcPbILofvf9_1rS4IBqYKUdkzVPVIYov/view?usp=sharing
意外と簡単に歌わせることができたので興味を持った方は好きな曲を歌わせてみてはどうでしょう。
自作の曲を歌わせるのも面白いかもしれませんね。
Google Apps Script で window.confirm のような挙動を実現する

## やりたいこと
JavaScript の [window.confirm](https://developer.mozilla.org/ja/docs/Web/API/Window/confirm) のように後続処理をユーザーが選択できるようにします。今回のケースでは選択したセルに UUID を入力するという処理を行いました。

![apps-script-confirm.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/531c618a-9574-5e2e-3caf-8180e1622165.gif)

## 概要

スプレッドシートと連携する Google Apps Script を作る際に、後続の処理を実行させるかどうか選択させたい場合があります。例えば請求書を作成するスクリプトで、既に請求書が作成済みの場合に **上書きする** か **作業を中断する** か、など一度実行した結果に対して再度処理をするかどうか選択するケースが多いと思います。

そのような場合に JavaScript でいう [window.confirm](https://developer.mozilla.org/ja/docs/Web/API/Window/confirm) のような機能が欲しくなります。

## 実現方法

Apps Script には [Ui](https://developers.google.com/apps-script/reference/base/ui.html?hl=en) クラスが用意されており、これが使用できるケース（※）では以下のような記述で confirm メソッドを実装することができます。

```JavaScript
const confirm = (message) => {
  const ui = SpreadsheetApp.getUi()
  return ui.alert(message, ui.ButtonSet.YES_NO) === ui.Button.YES
}
```

上記の関数は以下のように呼び出せます。

```JavaScript
if (confirm('更新してもよろしいですか？')) {
  // 更新処理
}
```

※ 公式ドキュメントの通りコンテナバウンドされたケース（スプレッドシートや Docs, Slide, Form のファイルから Apps Script を作成するケース）に限られます。

> A script can only interact with the UI for the current instance of an open editor, and only if the script is container-bound to the editor.

https://developers.google.com/apps-script/reference/base/ui.html?hl=en

## サンプルの全ソースコード
上記サンプルの全ソースコードを以下に記載しましたので、ご参考ください。

```JavaScript
const onOpen = () => {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('UUID', [
    { name: '生成', functionName: 'main' },
  ])
}

const main = () => {
  const cell = SpreadsheetApp.getActiveSheet().getActiveCell()
  const value = cell.getValue()
  if (!value || confirm('既に値が入力されています。上書きしますか？')) {
    cell.setValue(Utilities.getUuid())
  }
}

const confirm = (message) => {
  const ui = SpreadsheetApp.getUi()
  return ui.alert(message, ui.ButtonSet.YES_NO) === ui.Button.YES
}
```

以上！
リファレンスゲノム間の座標の変換に必要になるChain形式

## はじめに

リファレンスゲノム間の変換をするときには、Chain形式のファイルが必要になることがあります。この記事ではこのChain形式を理解します。

参考文献：[UCSCの公式のリファレンス](https://genome.ucsc.edu/goldenPath/help/chain.html)

## Chain ファイルの一例

```
    chain 4900 chrY 58368225 + 25985403 25985638 chr5 151006098 - 43257292 43257528 1
     9       1       0
     10      0       5
     61      4       0
     16      0       4
     42      3       0
     16      0       8
     14      1       0
     3       7       0
     48

     chain 4900 chrY 58368225 + 25985406 25985566 chr5 151006098 - 43549808 43549970 2
     16      0       2
     60      4       0
     10      0       4
     70
```

まず最初にヘッダー列があり、

```
    chain 4900 chrY 58368225 + 25985403 25985638 chr5 151006098 - 43257292 43257528 1
```

それから、３つ組の数字が並んで

```
     9       1       0
     10      0       5
     61      4       0
     16      0       4
     42      3       0
     16      0       8
     14      1       0
     3       7       0
```

最後は

```
     48
```

数字一つで終わっているのが見えると思います。前者はヘッダー行で、後者はアラインメントデータ行です。このヘッダー行とアラインメントデータ行のセットが繰り返されてChain形式のファイルは構成されています。

### ヘッダー行

tはtarget（変換先）, qはquery（問い合わせ元）を意味しています。

具体例：

```
chain 4900 chrY 58368225 + 25985403 25985638 chr5 151006098 - 43257292 43257528 1
```

```
chain score tName tSize tStrand tStart tEnd qName qSize qStrand qStart qEnd id 
```

| キーワード | 説明 | 配列 | 備考 |
|---|---|---|---|
| chain | ヘッダー行であることを示す ||
| score | chain score || 
| tName | 染色体 | 参照/ターゲット配列 | | |
| tSize | 染色体のサイズ | 参照/ターゲット配列| | |
| tStrand | ストランド | 参照/ターゲット配列 | + または -|
| tStart | アラインメントの開始位置 | 参照/ターゲット配列| 0-base の半開区間 |
| tEnd | アラインメントの終了位置 | 参照/ターゲット配列 | 0-base の半開区間 |
| qName | 染色体 | クエリ配列 | | |
| qSize | 染色体のサイズ | クエリ配列 | | |
| qStrand | ストランド | クエリ配列 | + または -|
| qStart | アラインメントの開始位置 | クエリ配列 | 0-base の半開区間 |
| qEnd | アラインメントの終了位置  | クエリ配列 | 0-base の半開区間 |
| id | chain ID | |

注意が必要なのは、アラインメントの開始位置と終了位置は、**0-base の半開区間** として表現されていることです。
バイオインフォマティックスの世界では、1-base と 0-base が混じり合って非常にややこしいですが、Chain形式は、0-base なので間違えないように注意する必要がありますね。

またChainファイルによっては、最後の chain ID とは名ばかりで、全部に 0 が入っていたりするケースもあるようです。

### アラインメントデータの行

例

```
     9       1       0
     10      0       5
     61      4       0
     16      0       4
     42      3       0
     16      0       8
     14      1       0
     3       7       0
     48
```

```
size dt dq
```


| キーワード | 説明 | 備考 |
|---|---|---|
| size | ギャップのないアライメントのサイズ |
| dt | このブロックの末尾と次のブロックの先頭の差（参照/ターゲット配列） |
| dq | このブロックの末尾と次のブロックの先頭の差（クエリ配列） |

中国の[Zhongxu blog](https://www.zxzyl.com/archives/838/)というサイトの[liftover,crossmap进行坐标转换时用到的chain文件介绍](https://www.zxzyl.com/archives/838/)というページにわかりやすい図が掲載されていたので転載します。

[![2018-02-11-liftover-chain-description.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/928c6d24-9db9-415f-2fbc-5eafeeb7b980.png)](https://www.zxzyl.com/archives/838/)

このようにして、ギャップのない配列の数、ターゲット配列のギャップの数、クエリ配列のギャップの数が、順番に記載されています。

最後のブロックには「次のブロック」というものがないので、一行に数字が１つだけになるようです。

## まとめ

Chainがどのようなファイルフォーマットなのか概説しました。
非常に簡単なフォーマットなので、その気になれば、自分でLiftOverを行うスクリプトを書くこともできるような気がします。とはいえ、バイオインフォの世界では細かい例外が多いので、既存の信用できるツールを使って座標を変換するのが良いと思います。

この記事は以上です。
【WP-SCSS】WordPressでSCSSをコンパイルしてくれるプラグイン

## WP-SCSS

**SassのSCSS記法ファイルコンパイラープラグインです。**

https://ja.wordpress.org/plugins/wp-scss/

WordPressでSassのSCSS記法を使いたいときはこのプラグインを使ってコンパイルしてます。

## WP-SCSSの使い方

### 導入

1. 「WP-SCSS」をインストールし、有効化
2. 管理画面のメニューバーの設定からWP-SCSSを選択
3. Base Locationは「Current Theme」を選択
4. SCSS LocationでScssファイルを格納するパスを記述
    
    themeファイル/style/style.scssと配置する場合「/style/」と記述します。
    
5. CSS LocaitionでScssからコンパイルされたCSSファイルを書き出すパスを記述
    
    themeファイル直下にstyle.cssを書き出してほしいので「/」と記述します。
    

### 使い方

1. scssファイルを変更
2. style.scssを保存することでコンパイルされます。
3. ページをリロードしてスタイルの反映を確認できます。
    
    （変更が確認できない場合はimportしているかと、キャッシュクリアをチェック）
    

### リロードでコンパイルさせる方法

style.scssには変更を加えていないのに毎回保存するのめんどくさい…。

function.phpに次のコードを追加することでリロードをトリガーにコンパイルさせることができます。

```php
/**
 * リロード毎にSCSSファイルを強制コンパイルさせる
 */
define('WP_SCSS_ALWAYS_RECOMPILE', true);
```

デプロイしてコンパイルする必要がなくなったら無効化してください。

## エラー

### Fatal error: Uncaught Error: Class 'ScssPhp\ScssPhp\Block\MediaBlock’

今まで問題なく使えていたのに `Fatal error: Uncaught Error: Class 'ScssPhp\ScssPhp\Block\MediaBlock’` というエラーが表示されて使えなくなった。

`@include` とか `@mixin` とか `@media` とかを記述するとエラー。

**解決方法**

1. WordPressからのインストールではなく、以下からダウンロード
    
    [https://scssphp.github.io/scssphp/](https://scssphp.github.io/scssphp/)
    
2. `wp-content/plugins` 配下に設置or管理画面から新規追加
    
    既にWP-SCSSをインストール済みの場合は削除。
    

または、問題がある部分は `wp-content/plugins/wp-scss/scssphp`の中にあるらしいので、

1. ダウンロード
    
     [https://github.com/scssphp/scssphp/archive/refs/heads/master.zip](https://github.com/scssphp/scssphp/archive/refs/heads/master.zip)
    
2. 「src」フォルダを展開
3. フォルダーを wp-content/plugins/wp-scss/scssphp/ にコピーし、すべてのファイルを上書き

参考：[https://wordpress.org/support/topic/3-0-php-errors/](https://wordpress.org/support/topic/3-0-php-errors/)
CakePHP4.3 Deprecated ルーティング内のプレースホルダーの記載方法の変更


CakePHP4.2 以前から CakePHP4.3 にあげるとこんな警告が表示される。

```php
Deprecated Error: Colon prefixed route placeholders like `:foo` are deprecated. Use braced placeholders like `{foo}` instead.
/var/www/html/api/vendor/cakephp/cakephp/src/Routing/Route/Route.php, line: 301
You can disable all deprecation warnings by setting `Error.errorLevel` to `E_ALL & ~E_USER_DEPRECATED`. Adding `vendor/cakephp/cakephp/src/Routing/Route/Route.php` to `Error.ignoredDeprecationPaths` in your `config/app.php` config will mute deprecations from that file only.
In [/var/www/html/api/vendor/cakephp/cakephp/src/Core/functions.php, line 321]
```

基本的にはCakePHPのバージョンを上げる際には公式ドキュメントの「移行ガイド」とにらめっこしながら進めていく。

- 4.3 移行ガイド - 4.x
https://book.cakephp.org/4/ja/appendices/4-3-migration-guide.html

まぁメッセージどおりなのですが、 
```
Colon prefixed route placeholders like `:foo` are deprecated. Use braced placeholders like `{foo}` instead.
```

```text:適当和訳
`:foo` のようなコロンプレフィックスでのプレースホルダーは非推奨になりました。`{foo}` のようなカッコでプレースホルダーを定義してください。
```

実際に移行ガイドにも同様の記載があります。

```text:Routing
:controller のようなコロンの付いたルートプレースホルダーは非推奨です。 代わりに {controller} のような波括弧付きのプレースホルダーを使用してください。
```
リンク: https://book.cakephp.org/4/ja/appendices/4-3-migration-guide.html#routing


実際に書く場合はこのように置き換えます。

```php:CakePHP4.2以前

$builder->connect('/:id', ['controller' => 'Articles', 'action' => 'view'])
    ->setMethods(['GET'])
    ->setPatterns(['id' => '\d+'])
    ->setPass(['id']);
```

```php:CakePHP4.3以降

$builder->connect('/{id}', ['controller' => 'Articles', 'action' => 'view'])
    ->setMethods(['GET'])
    ->setPatterns(['id' => '\d+'])
    ->setPass(['id']);
```
本年の1 week game jamにおける極限低支出一人旅


# 作成したゲーム

unityroomの1週間ゲームジャムにて以下の作品を投稿しました。

https://unityroom.com/games/jinnaigaentadeyarupuyopyo

https://unityroom.com/games/mycraft

# 作成環境
ハードウェア
IdeaPad Flex 5（CPU:AMD Ryzen 7 メモリ:16GB)

ソフトウェア
Clip Studio

本年3月よりIdeaPadを導入しました。
ペン操作ができるので、Unityの開発環境と画像作成環境を統一できたので作業速度の向上が望めます。

# 開発方針
・一人で開発を行い、外注は行わない（当然だな。）
・有料アセットや素材は使用しない（BOOST？興味ないね。）
・高額なハードウェアは使用しない（脱Apple、脱Surface、脱ハイスペ）
・高額なソフトウェアは使用しない（脱アドビ、脱高額CGソフト）
・作りたいものを作る（超大事！）

近年は物価高もあり、ある意味時代の最先端の開発手法であるといえなくもない。たぶん。

# 開発記録

https://qiita.com/Kenzaburou_Aoi/items/d06b5ca71879b9278aad

https://qiita.com/Kenzaburou_Aoi/items/bdf54949bfbc0e8a905f
TeleportHQ ハンズオン (FigmaのデザインをNext.jsのコードに変換するまで。)

追記 2023年6月11日
TeleportHQが日本語に対応していました。

追記終了

---


FigmaのデザインからNext.jsのプロジェクトを作るまでのハンズオンです。

# TeleportHQとは
FigmaのデザインファイルをNext.jsのコードに変換します。
無料です。
（他にもたくさん便利な機能があります。）

## サイト
TeleportHQ
Low-code Front-end Design & Development Platform | TeleportHQ
https://teleporthq.io/
デザインのコード化ツール
無料 (3プロジェクトまで)


Figma
https://www.figma.com/
デザイン設計ツール
無料 (3つのFigmaファイルと3つのFigJamファイルまで)

Next.js by Vercel - The React Framework
https://nextjs.org/
無料 (オープンソース)

# 想定
Figmaの基本的な使い方を知っており、デザインを一通り書けてプロトタイプまで作ることが出来る。
Figmaプラグインの基本的な使い方を知っている。
Next.jsのインストールをしたことがある。
VSCodeを使える。



# ハンズオン
## Figma上に移動

### デザインの作成
まず最初にFigmaでデザインを書き、プロトタイプまで作ります。
デザインの一部のみをコード化することも可能です。
TeleportHQはフレームもコンポーネントも区別なくコード化出来ます。

※ 今回利用した自分がデザインしたファイルは
* 1ページのみの単純なデザインファイル
* 複雑なことはしていない
と至極単純なものです。

### デザインが出来上がったら

![加工済み_Figma プラグイン検索 右クリックメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/6b94a7fe-f363-3992-8806-10315d58dd70.png)

Figma上の右クリックメニューからTeleportHQのプラグインを探します。

![加工済み_Figma プラグイン検索結果.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/535abe76-7ea5-6cbf-1e31-c2ee6cbe4a56.jpeg)

検索キーワードは「TeleportHQ」と入力し、見つけたらインストールします。

Figmaの右クリックメニューから
プラグイン＞TeleportHQを選択。
そうすると、コード化するエレメントを選択してくださいと出ます。
コード化したい部分を選択します。


![加工済み_FigmaからTeleportHQへExport画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/5b750bc5-4a8e-32a2-3783-5aece04d4173.png)


そうすると、上図のような画面に変化をし、
選択すると上図のように、一部分を選択しコピーするか、全体をコピーしTeleportHQに新しいプロジェクトを作るかを選択します。

今回は右側の「Export as a new project」を選択します。

（ここでGoogleアカウントか、Githubのアカウント認証が求められるはず・・・（忘れた））



※ここでブラウザ上のTeleportHQのサイト（プレイグラウンド）に移動します。
プレイグラウンド（＝サンドボックス）とはブラウザ上で色々操作できる場所を提供してくれるサービスです。

ブラウザ上でTeleportHQサイトに来ました。
そしてうまくいっていればFigmaでデザインしたものがTeleportHQのプレイグラウンドで見ることが出来ているはずです。









## TeleportHQ上に移動
![加工済み_TeleportHQ 左Home選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/12549df3-6182-10b5-abcc-edecb7dd1d2b.png)

次に、コード化したいフレームorコンポーネントを選択します。
※重要：選択を間違えた場合、Next.jsのプロジェクト画面が真っ白になったり404ページが見つかりませんとなったりします。

![加工済み_TeleportHQ 右上メニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/3db1e389-048c-c3f3-9ee3-ded1cbf3dd27.png)

デザインの選択を確認しましたら、
右上メニューの青い「Publish」公開ボタンの左隣にダウンロードボタンがあります。
（その隣はコード表示ボタンになります。）
ダウンロードボタンを押します。



![加工済み_TeleportHQ ダウンロードメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/0d107099-ceec-5ea8-902c-2f03256fb24e.png)

ここでどのフロントエンドのコードをダウンロードするかの選択が出来ます。

選択しましたら、下の「Export Code as ZIP」ダウンロードボタンを押します。






## VSCode上に移動
後はダウンロードしたファイルを解凍して、
VSCodeで開きます。

`npm install`
or
`yarn`
でインストールをします。

`npm run dev`
or
`yarn dev`
でローカルサーバーを立ち上げます。

成功していれば、デザインしたファイルが
http://localhost:3000/
上に表示されているはずです。
「陣〇がエンタでやるぷ〇ぷ〇」の開発記録

この作品はUnity1週間ゲームジャム お題「そろえる」の投稿作品です

https://unityroom.com/games/jinnaigaentadeyarupuyopyo

# 開発目標
陣内智則氏のコント「ぷよぷよ」を1週間でゲームに再現する

参考資料：

https://www.youtube.com/watch?v=suc9iufN-0E&t=218s

# スケジュール
最初の半日：構想
土日までの間：画像を完成させる
土日：プログラミング・録音・ビルド・公開

アイデアを考えている時間を限りなく０にすることが1週間で完成させるコツです。
細かいところは画像を描きながら考えるしかないです。
プログラムする段階に入ったら、仕様はほぼ動かせないと思っていいです。

# 構想
「そろえる」というお題から陣内智則氏の「ぷよぷよ」を連想し、再現するにあたり
採用するネタを絞り込むことにしました。採用基準は
・見た目のインパクト
・ぷよぷよのゲームシステムを維持したまま取り込めるか
・陣内智則氏のネタを連想できるか

＜採用組＞(カッコ内は動画内に登場する時間)
・バボちゃん(6:35)
　　　　→頭上のぷよを自陣にランダムに飛ばすお邪魔キャラとして採用
・ねば～る君(5:18)
　　　　→設置後高さ方向に伸び、自陣を３ブロック封鎖するお邪魔キャラとして採用

＜不採用組＞
・皮の柔らかいぷよ(2:10)
　　　　→ゲームシステムを維持できないため不採用
・同じ色しか落ちてこない(2:40)
　　　　→見た目が面白くないため不採用
・いろいろなバリエーションのぷよ(3:15)
　　　　→見た目が面白くないため不採用
・連鎖によってゲームが全部消える(4:20)
　　　　→ゲームシステムを維持できないため不採用
・パワプロの絶好調・絶不調(4:58)
　　　　→陣内というより別のゲームを連想させるため不採用
・ニコちゃん大王みたいなの(5:08)
　　　　→陣内というより別の漫画を連想させるため不採用
・テトリス(5:15)
　　　　→陣内というより別のゲームを連想させるため不採用
・でっかいお邪魔ぷよ(6:05)
　　　　→ゲームシステムを維持できないため不採用

# 画像作成
ぷよは面倒でも1枚ずつ書き出したほうが結果的に早いのではないかと判断しました。
![sprite1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953253/22e16127-dbd8-ae12-677f-378ef30ea905.png)


背景は時短のためシンプルに、だた、コントを意識して陣内智則氏の表情差分はある程度用意しました。
![sprite2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953253/901d1fed-7c2c-138d-d2c1-fa9803689dc4.png)

# プログラミング
よくできたところ
・プログラミングする時間があんまり取れていない割にうまく動いてくれているところ
・バボちゃんちゃんとトスするし、ねば～る君はちゃんと伸びるあたりの原作再現度合

いまいちなところ
・細かいところで最新のぷよぷよと動きが異なる。縦1マスの溝に入ったときのぷよの回転など
　正直最近のぷよぷよ知らないのと、熱心なぷよらーでもないのでそのまま（おい）
・ゲームに集中すると陣内智則氏の表情差分とかどうでもよくなってしまって、
　頑張って実装する意味があったかどうかが謎。

# 録音
よくできたところ
・ボイスを入れることによって原作再現度が増した。満足。

いまいちなところ
・関西弁わからん。たぶんイントネーション間違ってる（大問題）
・演技力ぅ。。ですかね。
・マイクいいやつほしい。

# 総評
1週間でできることとして、ほぼベストを尽くし原作再現ができたと思う。
ただ陣内智則氏に全盛期のころの勢いはもうない。
「ぼくのクラフト」の開発記録

この作品はUnity1週間ゲームジャム お題「ためる」の投稿作品です

https://unityroom.com/games/mycraft

# 開発目標
マインクラフト風の採掘ゲームを作る
ただし、1週間で開発する都合上、２Ｄゲームとし、建築は行わないものとする

# スケジュール
最初の半日：構想
土日までの間：画像・アニメーションを完成させる
土日以降：プログラミング・ビルド・公開

アイデアを考えている時間を限りなく０にすることが1週間で完成させるコツです。
細かいところは画像を描きながら考えるしかないです。
プログラムする段階に入ったら、仕様はほぼ動かせないと思っていいです。

# 構想
「ためる」というお題から、以前からマインクラフトの採掘だけやりたいと思うことがあり、
建築を行わず採掘だけ行うマインクラフト風のゲームを作ってみることにした。
マイクラの基本システムで採用したものは以下の通り

＜採用組＞
・ワールド自動生成（それなりに）
　　　　→原作の雰囲気再現
・木/土/石によって斧/シャベル/ツルハシを使い分ける
　　　　→原作の雰囲気再現
・モブを登場させ、プレイヤーと戦わせる
　　　　→ゲームの戦略性向上のため
・防具を装備する（防具の効果を今回のゲームシステムに合わせて変更）
　　　　→ゲームの戦略性向上のため
・木/石/銅/鉄/金/ダイヤを採掘する
　　　　→アイテムごとにポイントに差をつけることで、深く掘るメリットを与える
・採掘アイテムや防具の強化
　　　　→各アイテムをまんべんなくとることにメリットを与える

＜不採用組＞
・ブロックを設置する
　　　　→はしごの設置で代用
・バイオーム
　　　　→ゲームの大半地下にいるため省略
・非敵対モブ
　　　　→ゲームに関与しないため省略
・食事/満腹度
　　　　→操作が複雑になるため省略
・水/溶岩
　　　　→詰み要素になるため省略
・村/村人との交易
　　　　→操作が複雑になるため省略
・ネザー/エンド
　　　　→実装に時間がかかるため省略

# 画像作成
ボタンUIやプレイヤーを含むモブなどひとまとめの画像にして作成しています。
複製して色を変更するだけなので、こちらのほうが早いと判断しました。
![sprite3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953253/81b659bf-105b-7951-8844-d42a95dc054c.png)

# アニメーション
今回はボーンアニメーションではなく、位置や角度にたいしてアニメーションするようにした
これによりスプライトの差し替えによって使いまわせるようにした。

# プログラミング
よくできたところ
・広大なワールドをランダム生成することに成功し、原作の再現度が高い。
・モブの存在やアイテムの強化機能によって採掘に戦略性が一応ある
・脱力した雰囲気がなかなかいい。

いまいちなところ
・ワールドが広く採掘が単調。もう少し狭いワールドにすればよかったか。
・一応はしごの設置という救済措置はある者の、最下層まで掘ると詰みかねない

# 総評
やっぱマイクラは建築が楽しい。
呪文：&[]bool{true}[0], aws.Bool(true)

Golangを書いている時に、ワンライナーでbooleanのポインタを実装したいと考えていたら出会ってしまった**悲しき化け物**を紹介します。

### ワンライナーでbooleanのポインタを実装

ある日、Golangを書いているときにbooleanのポインターをワンライナーで実装したいという願望が生まれました。
そこで生まれたのがコイツです。

```Golang
		IsFoo: &[]bool{true}[0]
```
~~`IsFoo: &true`~~　のように書ければいいのですが、Golangではbooleanのポインタを取ることはできません。

どうしてもワンライナーで実装したかったので、booleanのスライスの要素のポインタを取ることで解決しました。

### ワンライナー実装の仲間

booleanワンライナー実装は、以下の書き方でも可能です。
```Golang
        IsFoo: aws.Bool(true)
```
`aws-sdk-go`を使っているプロジェクトであればこんな書き方もできます。

でもawsを使っている場所でもないのに`aws.Bool`がいきなり出てきたら違和感がかなりありますね笑。


ちなみに、Githubを`aws.Bool`で検索するとGolangで46,392ヒットしますが、この中にはawsに関係がないのに`aws.Bool`が使われている箇所があるようです。ぜひ探してみてください。

## まとめ
Golangのbooleanをワンライナーで実装したい時やレビュワーを困らせたい時がありましたら、`&[]bool{true}[0]`や`aws.Bool(true)`を使ってみてくだいさい。
setup & sample run android app with appium + python in Mac

# Outline

先日、webのtest自動化するための構築,sample codeを記載した
<a href="https://qiita.com/emurin/items/230e080bf3bd9a9f19d2">[Set up] Robot framework - python in mac</a>
<a href="https://qiita.com/emurin/items/acca2043879c444ce908">Selenium WebDriver Java Simple Program - Login</a>

今回は、NativeAPPをテストするための第一歩までを記述する。

# Condition

| APP, OS | Version 等 | 
|:-----------|:------------|
| Mac       | Monterey version 12.4        |
| Python | 3.9.6 |
| Appium | 1.22.3 |

# Setup

### Install Appium

appiumのinstallはこちら参考
<a href="https://qiita.com/emurin/items/0dd3ad5a64addfc99992">setup appium in Mac for iOS APP (Monterey)</a>


### Install Homebrew

Pythonをinstallするにあたり、パッケージ管理ツールHomebrewをinstallする
terminalを起動し、以下コマンドを入力する

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```


### Install Python

macはdefaultでPython2.7がinstallされている。
しかし、最新にして動かしたいので、Python3をinstallする
※python3がdefaultで入っていれば、ここはskip

homebrewを使って、python3をinstallする

```
brew install python3
```

install後、version確認をする
```
python3 --version
```


### PATH 設定

pip のpathを設定する
基本的に、user （${USERNAME}）　のLibraryにinstallされる。
まず、installされた先を確認する


```
/Users/${USERNAME}/Library/Python/3.9/bin
```

bashを使用している場合、.bash_profileにexportでPATHの追加をする

```
vi ~/.bash_profile 
```

export例
```
export PATH="/Users/${USERNAME}/Library/Python/3.9/bin:$PATH"
```

改めて、terminalを起動し、PATHを有効にする。

### Install pip 
pythonのpackage管理ツールをinstallする

```
python3 -m pip install pillow
```

install確認をする
```
pip3 --version
```


### Install Appium-Python-Client

```
pip3 install Appium-Python-Client
```


# Script

今回のsampleは、あくまでappiumを使って自動化が動くかの疎通確認のため
kdreams appの”その他”をクリックするテストにとどめる。

appium serverはlocalにてdefaultの設定で起動する

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/cfcccbbf-f0ae-212b-14d7-59512f0d4829.png" width=300>


```
# 1. import
import os
import time
import unittest
from appium import webdriver
from time import sleep


# 2. capabilities
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '10'
desired_caps['deviceName'] = 'XPERIA5'
desired_caps['app'] = 'kdreams.apk'
desired_caps['appPackage'] = 'jp.xxxxx.kdreams'
desired_caps['autoGrantPermissions'] = True
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 3. main test step

time.sleep(5)

print("click ETC")
el1 = driver.find_element_by_accessibility_id("その他, タブ: 4/4")
el1.click()

```
Streamlit AG-Grid　の横幅max値について

小ネタです

横幅の固定は、引数で辞書を与えると出来ました。
まさにソースを読めという感じですね。

https://github.com/mokdarren/analytics-streamlit/blob/main/grid_options_builder.py

```
 **other_default_column_properties:
                Key value pairs that will be merged to defaultColDef dict.
                Chech ag-grid documentation.
```

こんな感じで与えます。
```**{"maxWidth":"150"}```

**は辞書型の引数を与えるpython記号です。



```python.py
gd= GridOptionsBuilder.from_dataframe(df_sel)
gd.configure_default_column(min_column_width=10,**{"maxWidth":"150"})
gridOptions = gd.build()
grid_table = AgGrid(df_sel, 
   gridOptions=gridOptions,  height=500,
               width = 20,key='grid3',
                fit_column_on_grid_load = True
  )
```
AWS CLIの自動補完機能が効率が良い！

AWSは多分みんな知ってます、色々のサービスを使えます、データベースでも、サーバーでも、なんでもあります。使い方としてはもちろん画面操作ありですし、CLIでも使えます。

そのCLIはピッタリの文字じゃないともちろんエラーになります、それでドキュメントを読んで、テキストエディターを使いたいコマンドを作成して、ターミナルにコピペが一般の使い方です。

でも、前から知らなかった便利の使い方がありました！

## cli-auto-promptについて

経験者でもあんまり知られてない機能です、AWS CLI バージョン 2 では、aws コマンドの実行時にコマンド、パラメータ、およびリソースのプロンプトを表示できます。



![Screen Shot 2022-11-29 at 20.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/75d14681-9c32-6b3d-d812-14baebfced63.png)

有効にすると、自動プロンプトが Enter キーを使用して部分的に入力されたコマンドを完成できるようにします。Enter キーを押すと、続けて入力する内容に基づいて、コマンド、パラメータ、およびリソースが提案されます。提案には、左側にコマンド、パラメーター、またはリソースの名前、右側にそれらの説明が記載されます。提案を選択して使用するには、矢印キーを使用して行をハイライト表示してから、Space キーを押します。コマンドでの入力が終了したら、Enter を押してコマンドを使用します。以下の例は、自動プロンプトから提案されたリストがどのように表示されるかを示しています。

各サービスを見えます！サービスのcliコマンドとサービスの名前も表示してます！

### 設定方法

表示し方どしては２パターンで出来ます：

- `aws --cli-auto-prompt`のコマンド
    - aws cliがバージョン２であれば、無事にコマンドプロンプトが表示されます。
- awsの`config`ファイルに変更
    - `$ ~/.aws/config`を変更して、`cli_auto_prompt = on`を設定する
        ```text:~/.aws/config
        [default]
        aws_access_key_id = XXXXXXXXXX
        aws_secret_access_key = XXXXXXXXX
        region = ap-northeast-1
        cli_auto_prompt = on
        ```
        それで`aws`コマンドだけでも行けます

        :::note warn
        コンフィグファイルは色々プロファイルありなす
        各プロファイルに設定出来ますので気をつけてください



### 使い方

* 先にプロンプトを呼びます
それでデフォルト画面のプロンプトが表示します！
    ```bash
    $ aws
    ```
* 次はサービス一覧を上から🔽のキーで見るか、欲しいサービスの名前を書くか。例えば RDSをやってみます
    
    ```bash
    $ aws rds
    ```
* を書くとRDSのサービスを選べます！
![Screen Shot 2022-11-29 at 20.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/ad899f6c-ce00-695e-ebfa-bc8cbba3acb1.png)
* スペースで反応して、最初はサービスを選びます！次はコマンドを選べます：
![Screen Shot 2022-11-29 at 21.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/134050a9-7469-b445-7930-8009695eb549.png)
* コマンドを選んだら、次はオプションを選べます！
![Screen Shot 2022-11-29 at 20.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/7625ffcc-6450-69d9-692d-97310e9afba2.png)
オプションの中ではたまにリソースのIDや名前を入れなきゃ、これはちゃんとしてます！AWSのアカウントが設定されてるも選べます！優秀です。

    ![Screen Shot 2022-11-29 at 21.02.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/e62c2fbc-d583-3a16-c3b0-f47471451280.png)

* オプション追加も出来ます、普通に`--`を書けば出来ます！
    ```bash
    $ aws rds describe-db-clusters --db-cluster-identifier XXXXXX --
    ```
    ![Screen Shot 2022-11-30 at 19.58.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/10709a43-4873-289a-0f29-b5dc0da3763e.png)


でもそれだけではない！ちょっと重いAWSのドキュメントも、その場で読めます！F3を押したら下にドキュメントがありますし、早い！
    ![Screen Shot 2022-11-29 at 21.07.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/4344ac8f-8fa0-5226-31fc-a84b94296175.png)

* F2を押したら上と下のパネルを選べます、ドキュメントの中を特別の情報探したら、F2して、`/`を押して、検索出来ます！
    ![Screen Shot 2022-11-29 at 21.09.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/eba5bcd8-15bd-559a-f0b8-8cac2b105120.png)


## まとめ

AWSのドキュメントをずっと見るより、コマンド書く時に全部試せすが良い！見つかった時から結構使ってます！