OmniAICreator/Qiita-1.07M huggingface dataset:
【2024年01月版】Linuxの passwd, chage コマンドメモ 【中年エンジニアのためのLinuxメモ】

# はじめに

`passwd`, `chage` コマンドで期限外すのどうやるんだっけ？
とかいう時のためのメモ

# `passwd` コマンドとは

`passwd` コマンドは、ユーザーのパスワード等を変更するために使用される。

# `chage` コマンドとは

`chage` コマンドは、ユーザーのパスワード有効期限ポリシーを管理するために使用される。

# 使用例

## 自分のパスワードを変更する

```
passwd
```

## 別のユーザーのパスワードを変更する

```
sudo passwd [ユーザー名]
```

## パスワードの有効期限等を確認する

```
sudo passwd -S [ユーザー名]
```

### `passws -S` の実例

```terminal
$ sudo passwd -S dev
dev P 12/15/2023 0 99999 7 -1
```

1. ユーザー名: dev
1. パスワードステータス: P  
P はパスワードが設定されていることを示している（"Password"）。他の設定される値としては、L（ロックされている）、NP（パスワードなし）などがある。
1. 最後のパスワード変更日: 12/15/2023  
この日付は、最後にパスワードが変更された日。
1. パスワードの最小年齢（日数）: 0  
パスワードを変更した後、再び変更するまでに待つ必要がある最小日数。0は制限なしを意味する。
1. パスワードの最大年齢（日数）: 99999  
ユーザーがパスワードを変更する必要があるまでの最大日数。99999は実質的に無制限を意味する。
1. パスワード変更前の警告期間（日数）: 7  
パスワードの有効期限が切れる前に警告が表示される日数です。
1. アカウントの無効化までの期間（日数）: -1  
パスワードが期限切れになった後、アカウントが無効になるまでの日数。-1はアカウントが自動的に無効にならないことを意味する。

この出力は、dev ユーザーのパスワードが有効であり、特に厳格なパスワードポリシーが設定されていないことを示している。パスワードは設定されており、最小・最大の年齢制限は実質的に無効で、パスワードの有効期限が近づくと、7日前に警告が表示される設定になっている。また、パスワードの期限切れ後にアカウントが無効になることはない。

## パスワードの有効期限切れを設定する

```
sudo passwd -e [ユーザー名]
sudo chage -d 0 [ユーザー名]
```

```
sudo usermod -e 今日の日付 [ユーザー名]
```
`usermod` でも、似たような結果にはなるが、明日以降に期限がきれる


## パスワードポリシーを変更する

```
sudo passwd -n [日数] [ユーザー名]
sudo chage -m [日数] [ユーザー名]
```

ユーザーがパスワードを変更する最小日数を設定できる。例えば、`sudo passwd -n 30 dev`は、devユーザーがパスワードを変更できるまでに最低30日待たなければならないことを意味する。

## パスワードをロックする

```
sudo passwd -l [ユーザー名]
```

## パスワードのロックを解除する

```
sudo passwd -u [ユーザー名]
```

## パスワードの変更を強制する

```
sudo passwd -x [日数] [ユーザー名]
sudo chage -M [日数] [ユーザー名]
```

指定した日数後にユーザーへパスワードの変更を強制する。`-1` を指定することで無期限になる。

## パスワードの警告期間を設定する

```
sudo passwd -w [日数] [ユーザー名]
sudo chage -W [日数] [ユーザー名]
```

パスワードの有効期限が切れる前に、ユーザーへ警告メッセージを表示する日数を設定する。

```
sudo passwd -i [日数] [ユーザー名]
sudo chage -I [日数] [ユーザー名]
```

# 参考リンク

[man passwd](https://man7.org/linux/man-pages/man1/passwd.1.html)
[man chage](https://man7.org/linux/man-pages/man1/chage.1.html)

# さいごに

あんまりつかわないので、よくわすれすぎる
PythonでQRコードを作成する

PythonでQRコードを作成する手順及びサンプルコードです。

## ライブラリインストール

```text
pip install PyQRCode
pip install pypng
```

## QRコード作成

```python
import pyqrcode

def main_logic():
    target_text = 'https://docs.saurus12.com/python/qrcode'
    output_png_file = 'c:/tmp/test.png'

    code = pyqrcode.create(target_text, error='L', version=3, mode='binary')
    code.png(output_png_file, scale=5, module_color=[0, 0, 0, 128], background=[255, 255, 255])

main_logic()
```

## 本記事へのリンク

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708851/8dc5cedb-1bb8-b0e4-67a8-eef081eec033.png)

[https://docs.saurus12.com/python/qrcode](https://docs.saurus12.com/python/qrcode)

## 👇参考URL

[【簡単】QRコードの作成と読み取り in Python](https://qiita.com/PoodleMaster/items/0afbce4be7e442e75be6)

[keywords]  
Python QRコード

[PythonでQRコードを作成する](https://docs.saurus12.com/python/qrcode)

更新日:2024/01/09
ゲームプランナーに必要とされている物とは

今回読んだ本（amazon）

https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%A9%E3%83%B3%E3%83%8A%E3%83%BC%E2%80%95%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%A5%E3%81%8F%E3%82%8A%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E4%BA%95-%E5%8E%9A%E5%BF%97/dp/4297135752

# ゲームプランナーとは
ゲームを売る力＋ゲームを作る力　幅広い知識や能力を有する

## 前提
ゲーム→作って初めて意味がある。
成果（プレイヤーの遊べるゲーム）が必要

ゲームを作る力＝面白いゲームが何かを理解し計画的にゲームを作る力

ゲームを売る力＝売れるゲームを作る力、ゲームを”継続的”に売り続ける力


# ”儲けることが必須条件”
・継続性
・利益

プロジェクトに関わる人は少ない方が管理が楽
→究極的には一人で全部行うのが最も正確に作業が行える

ゲームの高度化
・膨大な作業量
→個人の限界
・他人と協力する必要性

役職
・連携
・人を動かす
・確認作業
gpt2-large-japanese-charは『雪国』の冒頭をどうトークナイズするのか

昨年12月27日に[京都大学言語メディア研究室](https://nlp.ist.i.kyoto-u.ac.jp/)から、日本語GPT-2モデル[gpt2-large-japanese-char](https://huggingface.co/ku-nlp/gpt2-large-japanese-char)が発表された。モデル名の末尾がcharなので、たぶん単文字トークナイザを使っているようだ。ちょっと試してみよう。

```
>>> from transformers import AutoTokenizer
>>> tkz=AutoTokenizer.from_pretrained("ku-nlp/gpt2-large-japanese-char")
>>> print(tkz.convert_ids_to_tokens(tkz("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"]))
['åĽ½', 'å¢ĥ', 'ãģ®', 'éķ·', 'ãģĦ', 'ãĥĪ', 'ãĥ³', 'ãĥį', 'ãĥ«', 'ãĤĴ', 'æĬľ', 'ãģĳ', 'ãĤĭ', 'ãģ¨', 'éĽª', 'åĽ½', 'ãģ§', 'ãģĤ', 'ãģ£', 'ãģŁ', 'ãĢĤ', 'å¤ľ', 'ãģ®', 'åºķ', 'ãģĮ', 'çĻ½', 'ãģı', 'ãģª', 'ãģ£', 'ãģŁ', 'ãĢĤ']
```

う、「国」が「åĽ½」ということは、もしや

```
>>> text="国境の長いトンネルを抜けると雪国であった。夜の底が白くなった。"
>>> x=tkz(text,return_offsets_mapping=True)
>>> for i,(s,e) in zip(x["input_ids"],x["offset_mapping"]):
...   print(text[s:e],text[s:e].encode("utf-8"),ascii(tkz.convert_ids_to_tokens(i)))
... 
国 b'\xe5\x9b\xbd' '\xe5\u013d\xbd'
境 b'\xe5\xa2\x83' '\xe5\xa2\u0125'
の b'\xe3\x81\xae' '\xe3\u0123\xae'
長 b'\xe9\x95\xb7' '\xe9\u0137\xb7'
い b'\xe3\x81\x84' '\xe3\u0123\u0126'
ト b'\xe3\x83\x88' '\xe3\u0125\u012a'
ン b'\xe3\x83\xb3' '\xe3\u0125\xb3'
ネ b'\xe3\x83\x8d' '\xe3\u0125\u012f'
ル b'\xe3\x83\xab' '\xe3\u0125\xab'
を b'\xe3\x82\x92' '\xe3\u0124\u0134'
抜 b'\xe6\x8a\x9c' '\xe6\u012c\u013e'
け b'\xe3\x81\x91' '\xe3\u0123\u0133'
る b'\xe3\x82\x8b' '\xe3\u0124\u012d'
と b'\xe3\x81\xa8' '\xe3\u0123\xa8'
雪 b'\xe9\x9b\xaa' '\xe9\u013d\xaa'
国 b'\xe5\x9b\xbd' '\xe5\u013d\xbd'
で b'\xe3\x81\xa7' '\xe3\u0123\xa7'
あ b'\xe3\x81\x82' '\xe3\u0123\u0124'
っ b'\xe3\x81\xa3' '\xe3\u0123\xa3'
た b'\xe3\x81\x9f' '\xe3\u0123\u0141'
。 b'\xe3\x80\x82' '\xe3\u0122\u0124'
夜 b'\xe5\xa4\x9c' '\xe5\xa4\u013e'
の b'\xe3\x81\xae' '\xe3\u0123\xae'
底 b'\xe5\xba\x95' '\xe5\xba\u0137'
が b'\xe3\x81\x8c' '\xe3\u0123\u012e'
白 b'\xe7\x99\xbd' '\xe7\u013b\xbd'
く b'\xe3\x81\x8f' '\xe3\u0123\u0131'
な b'\xe3\x81\xaa' '\xe3\u0123\xaa'
っ b'\xe3\x81\xa3' '\xe3\u0123\xa3'
た b'\xe3\x81\x9f' '\xe3\u0123\u0141'
。 b'\xe3\x80\x82' '\xe3\u0122\u0124'
```

ううう、UTF-8の[Byte-Pair Encoding](https://huggingface.co/learn/nlp-course/chapter6/5)がナマで使われてる(ただし0x00～0x20・0x7f～0x9fはU+0100～U+0120・U+0121～U+0141へマッピング)。`decode`は実装されてるかしら。

```
>>> print([tkz.decode(t) for t in x["input_ids"]])
['国', '境', 'の', '長', 'い', 'ト', 'ン', 'ネ', 'ル', 'を', '抜', 'け', 'る', 'と', '雪', '国', 'で', 'あ', 'っ', 'た', '。', '夜', 'の', '底', 'が', '白', 'く', 'な', 'っ', 'た', '。']
```

`decode`が準備されてるので、とりあえず何とかなりそうだ。ただ、[常用漢字表2136字](https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kijun/naikaku/kanji/)は、どの程度サポートしているのだろう。

```
>>> import urllib.request
>>> with urllib.request.urlopen("https://www.unicode.org/wg2/iso10646/edition6/data/JapaneseCoreKanji.txt") as r:
...   k=[chr(int(t,16)) for t in r.read().decode().strip().split("\n") if not t.startswith("#")]
...
>>> for i,j in zip(k,tkz(k)["input_ids"]):
...   if len(j)>1:
...     print(i,tkz.convert_ids_to_tokens(j))
...
剝 ['åī', 'Ŀ']
塡 ['å¡', '¡']
頰 ['éł', '°']
𠮟 ['ð', 'ł', '®', 'Ł']
```

「剝」「塡」「頰」「𠮟」の4字がサポートされておらず、いずれも複数のトークンに泣き別れとなっている。うーん、「剝」「塡」「頰」は2トークンなので、`merges`を追加すれば何とかなりそうだけど、「𠮟」を救うのは無理かなあ。それとも`Replace("𠮟","叱")`を`normalizer`に入れるべきかなあ。
Quest3とLLMで現実世界で魔法を使おう！　~現代の魔法の使い方~

# 概要
魔法を使ってみたい。
人間だれしも一度は思ったことがあると思います。
今回は、その魔法を現実で使えるアプリを作ったので、その紹介と仕組みの解説をします。
技術的には主に、XRデバイスである[Quest3](https://amzn.to/41tceFL)のAR機能と、OpenAIが提供しているGPT3.5-turboのAPIを利用しています。

具体的には以下のような感じです。
<iframe width="560" height="315" src="https://www.youtube.com/embed/PXYA0oH0iX4?si=-NpVLBTMJQh2WZ5s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 特徴
このアプリの特徴は、魔法の詠唱によって魔法の内容や規模を自在に変えることができること！
映像を見ていると、魔法の詠唱をしただけで魔法が忽然と現れています。
これは魔法の詠唱から、LLMに魔法の種類や規模、数、持続時間などを推測させて、その値を使用して魔法を変化させています。
それをQuest3のAR機能を使用することで、あたかも、現実で魔法を使っているかのような体験を生み出すことができます。

# 仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315420/fa4b2456-71aa-0956-4109-ed8a0fdfc21e.png)


このシステムの仕組みは上記のようなシステムによって構成されています。
具体的には以下のような手順になります。

1. Userが魔法の詠唱の音声をQuest3のマイクに入力する
2. 入力された音声が録音されて、WhisperのAPIに飛ばされる
3. Whisperが音声認識をして、その結果を文字としてUnityに渡す
4. Unityは音声認識した文字を処理したうえで、ChatGPTに渡す
5. ChatGPTは詠唱を魔法のパラメータ（数、規模、種類など）に変換してUnityに返す
6. Unityはその魔法のパラメータを使用して魔法を出現させる
7. 出現した魔法をQuest3でAR表示する
8. 人間の目には、あたかも自分が現実で魔法を使っているかのように映る。

こんな感じで、魔法を使えることができます。
続いて、実際に色んな魔法を使ってみましょう。

# 魔法１　炎の魔法
## 詠唱
炎よ、手のひらの上で燃え続けろ
## 実際の映像
<iframe width="560" height="315" src="https://www.youtube.com/embed/WQfMdn4kroE?si=XJBOEb_F7qhUn2AO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 魔法２　雷の魔法
## 詠唱
雷よ、一条の光となって飛べ
## 実際の映像
<iframe width="560" height="315" src="https://www.youtube.com/embed/ahaWyLcnkX0?si=9TyBBOSkQcFEvJje" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 魔法３　風の魔法
## 詠唱
小さな風よ、手のひらの上で吹け
## 実際の映像
<iframe width="560" height="315" src="https://www.youtube.com/embed/EAdLhYaaLGE?si=2BACQQQG-X2gRgPm" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 魔法４　風の魔法をたくさん
## 詠唱
風よ、嵐となって手の上で吹け
## 実際の映像
<iframe width="560" height="315" src="https://www.youtube.com/embed/V75gt_hPR2w?si=gsagnCAaKE9o19oO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# おわりに
どうですか？
実際に現実にはまだ影響を及ぼすことはできないですが、魔法って感じがしませんか？
Quest3のAR機能を使用すると、こんな風に本当に現実世界で魔法を使えるような体験を簡単に作ることができます。
今後このようなAR技術はさらに広まって、SF映画のような世界になる日もそう遠くないと思われます。
非常に楽しみですね。

次は、時間があればこの魔法を二人で打ち合ったりして対戦するゲームを作りたいと思っています。
AlmaLinuxにおけるApache自動起動しない問題の解決方法

## 概要
CentOSをAlmaLinuxに置き換えた際に発生したApache自動起動の問題とその解決方法を共有します。
## 解決方法
/etc/crontabで以下の行を追加しました。
```
@reboot root /sbin/service httpd restart
```
C＃でAtCoder Beginners Selection ABC088B Card Game for Two

https://atcoder.jp/contests/abs/tasks/abc088_b

自分が書いたコード

```c#
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
		int N = int.Parse(Console.ReadLine());
		List<int> A =  Console.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray().ToList();
		A.Sort();
		
		int alice = 0;
		int bob = 0;
		bool isAliceTurn = true;
		for (int i = 1; i <= N; i++)
		{
			if (isAliceTurn)
			{
				alice += A[A.Count - 1];
			} else
			{
				bob += A[A.Count - 1];
			}
			isAliceTurn = !isAliceTurn;
			A.RemoveAt(A.Count - 1);
		}
		Console.WriteLine(Math.Abs(alice - bob));
    }
}

```

最初はPythonのように末尾を指定する際の添え字に-1が使えると思っていた。

途中でできないことが分かったので無理やり末尾を取得する方法を検索して修正。

リストを降順にして先頭を取得するようにしたコードが以下。

```c#
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
		int N = int.Parse(Console.ReadLine());
		List<int> A =  Console.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray().ToList();
		A.Sort();
		A.Reverse();

		int alice = 0;
		int bob = 0;
		bool isAliceTurn = true;
		for (int i = 1; i <= N; i++)
		{
			if (isAliceTurn)
			{
				alice += A[0];
			} else
			{
				bob += A[0];
			}
			isAliceTurn = !isAliceTurn;
			A.RemoveAt(0);
		}
		Console.WriteLine(Math.Abs(alice - bob));
    }
}

```
【Docker】Docker Desktopでメモリ大量消費を防ぐ方法【Windows】

# 状況
Docker Desktop起動中、しばらくするとメモリ使用率が100％近くになる。
他の作業に影響が出てしまう。

# 解決策
Docker DesktopのGUI上で以前は設定できていた気がしますが、現在はできないようです。

今回は下記の通り、設定ファイルを作成します。

`"C:\Users\*ユーザー名*\.wslconfig"`　を作成し、
`[wsl2] memory=2GB`　と記述する。

※ 今回はメモリ使用量を2GBに制限。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087304/0ca05a5d-3603-2027-dad8-6a59e4543b6e.png)

# 結果
メモリ使用率が設定した使用量に収まりました。

開発中にあれもこれも開いていると、
メモリ不足でPCが固まっていたので対策できて良かったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3087304/e238f00d-e811-2215-db98-52c7944a2b3a.png)
アナログ回路 その29

# 概要
問題みつけたので、解いてみた。

# 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6238013b-ba4d-3fcc-43d9-bf71ea7c3f0c.png)

# シュミレーション結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6f729a16-f2be-0c41-e8f7-f4c8a8819a17.png)

上手く行ってないが、答えは２かな

# 成果物

https://embed.plnkr.co/plunk/37WBI0nzh4VARcku


以上。
2024年のオフィスで必須の8つのAI効率ツール

1. ChatGPT
ChatGPTは無料で利用可能な人工知能システムで、これを使えば誰でも対話や質問を通じて仕事を完成させることができます。これは、AIの波の中で最初の人工知能ツールの一つでもあります。

2. Midjourney
   Midjourneyの最新バージョンv6は再トレーニングされたモデルで、生成される画像の品質が大幅に向上しています。文章を生成した図、デザイン作成、執筆の挿絵、漫画デザイン等、あらゆる用途に適しています。
   
3. Canva
   Canvaはソーシャルメディア投稿のための画像作成ツールで、ポスター、プレゼンテーション、視覚的なコンテンツを作成するのに便利です。ほとんどの機能が無料で利用可能で、全世界で3,000万人以上が利用しています。
   
4. Runway
   Runwayは文字から動画を生成する先駆者で、非常に強力な機能を備えています。わずか数行の文章で、見事な効果のある動画を生成でき、ビデオ広告素材の作成に適しています。
   
5. MindAI.jp
   MindAI.jp は「マインドマップ+AI」を組み合わせた製品で、ワンクリックでマインドマップを生成します。モバイル端末向けに特化して開発され、AIの能力を利用してマインドマップを生成し、作業効率と利便性を大幅に向上させます。
   
6. Gamma
   GammaはPPTとAIを組み合わせた製品で、ワンクリックでPPTを生成します。操作は簡単で便利で、生成した内容は素早くテンプレートを調整して簡単に共有できます。
   
7. Screen Studio
   Screen StudioはMac向けの画面録画ソフトウェアで、易しい操作で高品質なビデオを録画できます。スクリーンショットと同じように簡単に使用でき、無料で試用できますが、全機能の利用には購入が必要です。
   
8. Felo 瞬訳
   Felo 瞬訳はリアルタイム翻訳ツールです。アプリを開き、ヘッドホンをつけて操作せずにリアルタイム翻訳を開始することができます。特に外国語の学習ビデオを視聴する際に非常に便利です。
KISSの原則 の解釈 ※この記事の生産性は0

# はじめに
なんとなあく、**KISSの原則**について調べました。

出てきた[Weblio辞書](https://www.weblio.jp/content/Keep+it+Simple%2C+Stupid)

> **KISS**とは、サイトデザインや[SEO](https://www.weblio.jp/content/SEO "SEOの意味")で[用いられる](https://www.weblio.jp/content/%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%82%8B "用いられるの意味")[言葉](https://www.weblio.jp/content/%E8%A8%80%E8%91%89 "言葉の意味")で、「[構造](https://www.weblio.jp/content/%E6%A7%8B%E9%80%A0 "構造の意味")を[できるだけ](https://www.weblio.jp/content/%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A0%E3%81%91 "できるだけの意味")[簡単に](https://www.weblio.jp/content/%E7%B0%A1%E5%8D%98%E3%81%AB "簡単にの意味")せよ」という[趣旨](https://www.weblio.jp/content/%E8%B6%A3%E6%97%A8 "趣旨の意味")の[格言](https://www.weblio.jp/content/%E6%A0%BC%E8%A8%80 "格言の意味")である。

うんうん。そうだね。

> KISSは「[Keep It Simple](https://www.weblio.jp/content/Keep+It+Simple "Keep It Simpleの意味"), Stupid.」の[略語](https://www.weblio.jp/content/%E7%95%A5%E8%AA%9E "略語の意味")で、

(((ｕдｕ*)ｩﾝｩﾝ

> [和訳](https://www.weblio.jp/content/%E5%92%8C%E8%A8%B3 "和訳の意味")すれば「[単純に](https://www.weblio.jp/content/%E5%8D%98%E7%B4%94%E3%81%AB "単純にの意味")しろよ、[バーカ](https://www.weblio.jp/content/%E3%83%90%E3%83%BC%E3%82%AB "バーカの意味")」といった意味となる。

ｳ…ﾝ??(･ω･ﾉ)ﾉ
# 私の意見
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/XXNXpdgpVZ">https://t.co/XXNXpdgpVZ</a><br>&gt; KISSは「Keep It Simple, Stupid.」の略語で、和訳すれば「単純にしろよ、バーカ」といった意味となる。<br><br>ほんとに？？w<br>&quot;stupid&quot;は「シンプルで愚直」「バカでもわかる」だと思ってた。相手に対してではなく、&quot;simple&quot;に重ねて強調してるイメージ</p>&mdash; たま / SamuraiStats⚾ (@SamuraiStats) <a href="https://twitter.com/SamuraiStats/status/1744634353047794167?ref_src=twsrc%5Etfw">January 9, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

つまり、**stupid** 部分の解釈ですね。

- 相手に対して（あるいは自分への戒めで）の **stupid**
- **simple, stupid** と、重ねて強調している
  
  つまり、
  - **Hey, stupid? Keep it Simple!** 
  - **Keep it simple, and stupid.** 

のどちらのニュアンスが近いか、だと思います。

## ChatGPT大先生に聞いてみましょう
まずは、**KISSの原則**を知っているか確認。
> #### Q. keep it simple, stupidはどういう意味？
> #### A.「Keep it simple, stupid」（KISS）は、複雑さを避け、単純さを維持することの重要性を強調する原則です。
> このフレーズは、特にエンジニアリングや設計の分野でよく使われますが、一般的な生活の中でも有用なアドバイスとして広く受け入れられています。

よし。さすがに知ってるね。

> この原則は、無駄を排除し、複雑さによって引き起こされる問題や誤解を避けるために、物事をできるだけシンプルに保つことを奨励します。
> **ここでの「stupid」という言葉は、人を侮辱するためではなく、不必要に複雑な解決策を避けるための強調として使われています。**

……あれ？聞く前から答えが返ってきた……優秀……😘

ということで、ChatGPT大先生は**こちら側**でした。ﾔｯﾀﾈ

### 追加で聞いてみた（聞きたいだけ）
> Q. つまり、`keep it simple, stupid`は、`Hey, stupid? Keep it Simple!`よりも`Keep it simple, and stupid.`に近い？

> A. はい、その通りです。「Keep it simple, stupid」のフレーズは、「Hey, stupid? Keep it simple!」という意味ではなく、「Keep it simple, and stupid」という意味に近いです。このフレーズでは、「stupid」という言葉は、相手を侮辱するために使われているのではなく、むしろ「無駄に複雑にしないで、シンプルに保つことが賢明だ」という意味で使われています。つまり、このフレーズは、物事を単純化し、不必要な複雑さを避けることの重要性を強調しています。
# 終わりに
#### いかがでしたか？
と、締めくくってきそうな、
いかにもどうでもいい大したことを書かない記事になってしまいました。

まあでも、どちらが正しいかはどうでもいいんです。同意者がいたから満足。
どちらでもいいですし🍣

むしろ、
#### どちら派が、どのくらいいるのか気になります。
知り合いのベテランプログラマは **Hey, stupid? Keep it Simple!** の解釈でした。
Instanaエージェントのデバッグログを取得する

# はじめに
Instanaを利用していて「あれ、このエージェントちゃんと動いている？」「このログレベルじゃ、何が起きているのかいまいち分からない。。。」そう思ったことありませんか？今日はInstanaエージェントのデバッグログを取得して、トラブルシュートに活用する方法をお伝えします。

# 対象とする読者
既にInstanaをご利用中の方

# ゴール
Instanaエージェントのデバッグログの取得方法を習得する。

# デバッグログの取得方法
## 前提
Instanaエージェントのログレベルはデフォルトでは、"INFO"です。しかし設定を変更すれば"DEBUG"を取得することができます。

## デバッグログ取得の手順
1.InstanaのGUIを開き、左メニュー＞その他＞エージェントを選択します。
![Screenshot 2024-01-09 at 17.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/a4a5962e-befd-96fd-e4c9-896d6c1be3ae.png)

2.任意のエージェントを検索、選択します。
![Screenshot 2024-01-09 at 17.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/3cdf6c03-a9f0-7c29-47df-740b57d3266d.png)

3.エージェントの詳細画面を開いたら、「管理」セクションから「ログ・レベルの変更」を選択します。
![Screenshot 2024-01-09 at 17.39.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/80c7664d-9e5b-5e02-1eef-f0bb37c6b8b4.png)

4.「DEBUG」を選択し、「ログ・レベルの変更」をクリックします。
![Screenshot 2024-01-09 at 17.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/94af255e-9e3e-8d80-c253-7fde21791b1c.png)

5.出力されたログの確認
手順3の画面を下にスクロールし、「ログ出力」のセクションを確認します。
無事、DEBUGログが取得できていますね。

![Screenshot 2024-01-09 at 17.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492942/8599eb74-3b25-a64a-6e01-aadcd6aa541e.png)

これでInstanaのトラブルシュートがよりスムーズになります！お試しあれ〜
C＃でAtCoder Beginners Selection ABC083B Some Sums

https://atcoder.jp/contests/abs/tasks/abc083_b

自分の書いたコード

```c#
using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
		int[] NAB = Console.ReadLine().Split(' ').Select(i => int.Parse(i)).ToArray();
		int N = NAB[0];
		int A = NAB[1];
		int B = NAB[2];

		int sum = 0;
		for (int i = 1; i <= N; i++)
		{
			string strI = i.ToString();
			int sum_ = 0;
			foreach(char d in strI)
			{
				sum_ += (int)Char.GetNumericValue(d);
			}
			if (sum_ >= A && sum_ <= B)
			{
				sum += i;
			}
		}
		
		Console.WriteLine(sum);
    }
}

```
Laravel + Xdebug でカバレッジレポートを確認する on Docker

# 大まかな流れ
1. Dockerfileにxdebug関連のライブラリをインスコする記述を書く
1. オリジナルの ini ファイルに、xdebug 関連の設定を書く
1. phpunit.xmlにレポート出力設定を書く
1. コマンドを実行する

## 環境
- Laravel 8.x
- PHPUnit 9.x
- Docker (and docker-compose)
- Xdebug 3.1.x

# 仮想ディレクトリ構成
```
├── myapp -> Laravelプロジェクト
│   ├── app
│   ├── bootstrap
...
│   ├── tests
│       └── coverage
│   ├── phpunit.xml
│       
├── config
│   ├── xdebug.ini
├── Dockerfile
```

# Dockerfile
```Dockerfile
FROM webdevops/php-nginx:8.0

# xdebug install
RUN pecl install xdebug && \
    docker-php-ext-enable xdebug

# xdebugに関する php.ini の設定ファイルをイメージに追加
ADD config/xdebug.ini /usr/local/etc/php/conf.d/custom.ini
```
`php/conf.d`　に追加された　`.ini` ファイルは、最終的に `php.ini` に合体されるので、ここに追記する xdebug に関する設定を書く。


# xdebug.ini
```ini
[xdebug]
xdebug.client_host = host.docker.internal
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.discover_client_host = 0
xdebug.client_port = 9005
xdebug.log=/tmp/xdebug.lo
```

# phpunit.xml
```html
<logging>
    <log type="coverage-html" target="tests/coverage" showUncoveredFiles="true"/>
</logging>
```

# 実行する
コンテナに入って、Laravelのプロジェクトルートディレクトリで以下を実行する。
```bash
XDEBUG_MODE=coverage php artisan test --coverage-html tests/coverage
```

以下でも可。
```bash
XDEBUG_MODE=coverage vendor/bin/phpunit --coverage-html tests/coverage
```

先頭に `XDEBUG_MODE=coverage` を追加しないとレポートが出力されないので注意。
`tests/coverage` はレポートの出力先ディレクトリなので任意の場所を設定する。


# おわりに
これでカバレッジレポートが出力されます。

![スクリーンショット 2024-01-09 17.09.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/9bebaeab-4af3-da1a-d0ed-a77d1670ea02.png)
FlutterKaigi 2023で勉強になったことまとめ

書籍やインターネットだけでは中々得られない経験知的なところが勉強になったのでメモしておきます。
一人でやっているだけでは得ることのできない知識や感覚に触れられたので、大変為になりました:blush:
世の中のFlutterエンジニアはすごいな、自分まだまだだな、と思いました。

元の講演動画はこちらから：https://flutterkaigi.jp/2023/sessions

#### 1.ゆめみのFlutterエンジニア育成方法
・正方形を書くときは、SizedBoxよりAspectRationの方が可読性が高い。
・レスポンシブ対応はMediaQueryではなく、FractionallySizedBoxを使用しているか。
・sleepはUI処理をブロックする。Future.delayedはブロックしない。

#### 2.Flutterアプリのセキュリティ対策を考えてみる。
・shared_preferenesを使用して保存したデータはroot化やjailbreakされていると見れる
　→flutter_secure_storageを使うと暗号化される。
・WebView Cookieは適切なタイミングで削除する。
・アプリがバックグラウンドに移動すると画面のスクショを撮られるので、機密情報が見えないようにWidgetを切り替える(secure_applicationと言うライブラリもある)

#### 3.なぜわれわれはRiverpodを使うのか
・UI = f(State), UIは常に状態(State)のbuildメソッド(f)の実行結果。
・親子関係はElementが保持している。
・どのような状態管理手法でも、ElementのmarkNeedsBuildが呼び出されることでWidgetがリビルドされる。
・RiverpodはInheritedWidgetの再実装を目指しているパッケージ。StatefulWidgetの代替ではない。
・Provider：stateにアクセスするためのキー。存在することが意義でProvider自体は何もしない。
・初めてアプリ内でref.read/.watch/.listenしたときにProvider,Notifier,Stateが生成される。
・命令的に状態を更新するときは、Notifierに用意したメソッドでしか状態を変更できない。と言う思想。StateNotifierは非推奨になった。
・RiverpodのState管理はWidget(Element)ツリーとは独立している。

#### 4.魅せろ！Flutterで目を惹くUIデザインを実装する。
・RenderObjectツリー：画面上に何をどのように描画するかを決定する。
・RenderView:RenderObjectツリーのルート
・Constrains(height,widthのmax, min)が親から子に伝播していく。->末端で決定したSize(height, width)が親に返される。Position(親の座標系からの子の位置)は親が保持する。
・RenderObjectのカスタマイズは難易度が高いのでまずはCustomPaintなどを検討する。
・Riveと言うアプリで2Dアニメーションを作れる。


#### 5.Master of Flutter Lifecycle
・ライフサイクルには、Widget自体のライフサイクルとアプリ全体のライフサイクルの2種類がある。
・Widgetにconstをつけると親のstateが変わってもdidUpdateWidgetが呼ばれず子のリビルドを避けれる。
C＃でAtCoder Beginners Selection ABC087B Coins

https://atcoder.jp/contests/abs/tasks/abc087_b

自分が書いたコード

```c#
using System;
					
public class Program
{
	public static void Main()
	{
		int A = int.Parse(Console.ReadLine());
		int B = int.Parse(Console.ReadLine());
		int C = int.Parse(Console.ReadLine());
		int X = int.Parse(Console.ReadLine());
		
		int count = 0;
		for (int i = 0; i <= A; i++)
		{
			for (int j = 0; j <= B; j++)
			{
				for (int k = 0; k <= C; k++)
				{
					if (500 * i + 100 * j + 50 * k == X)
					{
						count++;
					}
				}
			}
		}
		Console.WriteLine(count);
	}
}

```
[Three.js] r155からライトの光度単位が変わりました

## 先に結論だけ

Three.js r155からデフォルトの光度単位が変わりました。PointLightとSpotLightのデフォルトの光度は1カンデラになり、大幅に暗くなっています。

Three.jsを更新してシーン全体が暗くなったり、モデルにハイライトが入らないと感じたら、以下の2点を調整してください。

1. PointLightとSpotLightの光度を数百倍に強くする
2. それ以外のライトの強度をMath.PI倍にする

## はじめに

この記事は、Three.js r155での照明の変更とその対処を共有するためのものです。

### 対象とする読者

この記事は、すでにThree.jsを利用しているユーザーを対象にしています。Three.jsの解説やインストールガイドは含みません。

### 対象とする環境

この記事は、Three.js r155以降を前提としています。記事を読む前にお手元の環境をご確認ください。

## Three.js r155での変更点

2023年7月にリリースされたThree.js r155から[WebGLRenderer.useLegacyLightsのデフォルト値がfalseに変更されました](https://github.com/mrdoob/three.js/pull/26392)。この情報は、[公式フォーラムのトピック](https://discourse.threejs.org/t/updates-to-lighting-in-three-js-r155/53733)でも扱われています。

新しい照明モードでは、座標値1を1メートルとして扱い、PointLightとSpotLightの明るさは距離に応じて減衰します。

### なぜ変更するのか？

この変更は、WebGPURendererとWebGLRendererの照明を統一するために導入されました。r155以降では、レンダラーを切り替えても同じシーンが同じ明るさでレンダリングされます。また、距離と光度の単位を国際単位系に統一することで、他の3Dアプリケーションとの互換性を高めます。

### useLegacyLightsフラグはいつまで使える？

useLegacyLightsフラグはr165まで維持される予定です。それまでは、ユーザーが`WebGLRenderer.useLegacyLights = true`を設定すると古い照明モードが適用されます。r165以降では、このフラグ自体が削除される予定です。

## 影響

新しい照明モードでは、以下の2点が影響を受けます。

1. PointLightとSpotLightの光度単位がカンデラになる
2. それ以外のライトの光度が変わる

## マイグレーション

それぞれの照明について、新しい照明モードに対応させる方法を解説します。

### PointLightとSpotLight

PointLightとSpotLightのデフォルト光量が1カンデラになりました。これはおおよそロウソク1本分の明るさです。メートル単位の空間を照らすには弱いので、この[光量](https://threejs.org/docs/#api/en/lights/Light.intensity)を調整してください。これらの照明は、何倍にすれば古い照明モードと同じ明るさになるという基準がありません。レンダリング結果を見ながら調整してください。

PointLightとSpotLightには[decayプロパティ](https://threejs.org/docs/#api/en/lights/SpotLight.decay)があります。このプロパティの既定値は2で、これは`距離の2乗`で明るさが減衰するという設定です。decayを0に設定すると、古い照明モードに近いレンダリング結果を得られますが、物理的にありえない照明になります。decayの変更は注意深く行なってください。

### それ以外のライト

AmbientLight、DirectionalLight、RectAreaLightなどの照明は、太陽光を表現するためのものです。太陽は無限遠にあると考えられるので、距離による減衰は起きません。

これらの無限遠にある照明は[intensity](https://threejs.org/docs/#api/en/lights/Light.intensity)をMath.PI倍に調整すると古い照明モードと同じレンダリング結果を得られます。

以上、ありがとうございました。
mindの研究 その67 edge起動

# 概要
mindが、謎なので調べてみた。
練習問題やってみた。

# 練習問題
mindでedgeを起動して、「mind」を検索せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8ebd9819-df2f-22bf-3d3d-de20d855b7b5.png)


# サンプルコード

```


送信とは
　数１は　変数
　結果は　変数
　数１に　入れ
　数１をつみ
　０をつみ
　０をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
　数１をつみ
　０をつみ
　２をつみ
　０をつみ
　"user32"と　"keybd_event"で　ＡＰＩ呼出し４　結果に　入れ
　エラー？
　ならば
　　エラー文字列を　一行表示し　終り
　つぎに
。

メインとは
　「"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"」を　プログラム実行
　一秒待つ
　04dhをつみ　送信し
　049hをつみ　送信し
　04ehをつみ　送信し
　044hをつみ　送信し
　０dHをつみ　送信し
　「ok」を　一行表示する
。



```



以上。
【2024年01月版】Linuxの SUID と SGID 【中年エンジニアのためのLinuxメモ】

# はじめに

`SUID` のやり方ってどうだったっけ？
前に `SUID` したスクリプトってどこいったっけ？
前に `SGID` した共有ディレクトリってその後どうしたっけ？
という時に、読み返すためのメモ。

# `SUID`、`SGID` とは？
Linux の `SUID（Set User ID）` と `SGID（Set Group ID）` は、ファイルやディレクトリに特別なアクセス許可を設定するための機能。
これらの設定は、ファイルの所有者やグループに関係なく、特定のファイルを実行する際に、ユーザーやグループの権限を一時的に変更することができる。

# `SUID（Set User ID）`
## 概要

`SUID` が設定された実行ファイルは、ファイルの所有者の権限で実行される。

## 使用例

### パスワードの変更

`passwd` コマンドは、一般ユーザーが自身のパスワードを変更できるようにするため、`SUID` が設定される。
このコマンドは、実行時にroot権限で動作し、システムのパスワードファイルを安全に更新する。

### システム管理ツール

特定のシステム管理ツールは、root権限でのみ実行可能ですが、限定的に通常ユーザーにも使用させたい場合に`SUID`が使われる。例えば、システムの設定を変更するコマンドなどがこれに該当する。

## 設定方法

`chmod u+s ファイル名` 
ファイルに`SUIDビット`を設定できる。

## セキュリティリスク

不正に利用されるとシステムのセキュリティに大きな影響を与える可能性があるため、慎重に使用する必要がある。

# `SGID（Set Group ID）`

## 概要

`SGID` が設定された実行ファイルは、ファイルのグループの権限で実行される。

## 使用例

### 共有ディレクトリ

チームやプロジェクトごとのディレクトリに `SGID` を設定すると、そのディレクトリ内で作成されたファイルやサブディレクトリは、作成者個人のものではなく、チームやプロジェクトグループに属することとなる。
これにより、グループ内でのファイル共有が容易になる。

### 共有ファイルの編集

特定のファイルを複数のユーザーが共同で編集する必要がある場合、そのファイルに `SGID` を設定することで、新しいファイルやデータが元のグループに所属することとなり、アクセス管理が容易になる。

## 設定方法

`chmod g+s ファイル名`
ファイルに`SGIDビット`を設定できます。

## セキュリティリスク

`SUID` と同様、不正利用されるとセキュリティに影響を与える可能性がある。

## 注意点

`SUID` / `SGID` はセキュリティ上のリスクを伴うため、必要な場合にのみ使用し、常にセキュリティを意識することが重要。
定期的なシステム監査を通じて、不要なSUID/SGID設定がないか確認することが推奨される。

# 不要な `SUID` / `SGID` がないか監査する方法

システム上のすべての `SUID` / `SGID` 設定されたファイルを探すために、`find` コマンドを使用できる。

### SUID設定されたファイルを探す

`find / -perm -4000 -exec ls -ldb {} \;`

`SUIDビット` が設定されたすべてのファイルをルートディレクトリから探し、それらのリストを表示する。

### SGID設定されたファイルを探す

`find / -perm -2000 -exec ls -ldb {} \;`

`SGIDビット` が設定されたすべてのファイルをルートディレクトリから探し、それらのリストを表示する。

# さいごに

しっかり理解しておきたい
認証APIとOAuth

## はじめに
APIについて調べている際にログインとOAuthについて触れる機会があったのですが、
そもそもログインの仕組みやOAuthについて詳しく説明できる状態ではなかったので、
いい機会だと思いまとめました。

## OAuthとは
OAuthとは一言でいうと「APIにおいて認可を行うための仕組み」です。
例えば、あるサービスAが別のサービスBのAPIを利用した機能を提供しているとき、
サービスBに登録しているユーザーがサービスAを使う際には、
サービスAはサービスBにアクセスして、そのユーザーの情報（リソース）を利用したいはずです。
その際に、ユーザーがサービスAに対してサービスBに登録しているリソースを使っていいよ〜、と
許可することのできる仕組みのことを言います。

図で示すと下図のようになります。

![スクリーンショット 2023-12-27 0.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1654510/c6199f42-255a-caa7-abc4-6f1dc0761e4b.png)

このようにOAuthを利用してログインすることのメリットの1つとして、
`ユーザーはサービスAに対してサービスBのパスワードを渡すことなくログインできる`、ということが挙げられます。
別のサービスに対して不要にパスワードを渡さないので、
高いセキュリティを維持することが可能です。


## OAuthのバージョン
OAuthには1.0と2.0というバージョンが存在します。
2.0は2012年10月にRFC6749として標準化されており、
特に理由がなければ2.0を利用するのが良いでしょう。

## OAuthを利用する利点
上記で挙げたセキュリティ上の理由以外にもOAuthを利用することには利点があります。
それは、OAuthは標準化され、広く認知された仕組みであるということです。
広く認知されているため、サーバー、クライアントともに多くの言語でライブラリが提供されており実装が容易です。

## アクセストークンの渡し方
先の図でOAuthを使った認証にはアクセストークンを使用していることを説明しました。
ではアクセストークンはどのように渡されるのでしょうか?

図の`4.トークンを渡す`では、レスポンスヘッダでアクセストークンを渡しています。
このとき、アクセストークンは`access_token`というヘッダに格納されます。
また、`token_type`には`bearer`が指定されます。
ここで受け取ったトークンをAPIへのアクセス時に送ることでアクセスが可能になります。

## まとめ
今回OAuthについて学ぶことで、APIでの認証の仕方についての理解が深まりました。
一方でOAuthを使用する際のデメリットや注意点についてはまだちゃんと理解できていないので、
今後更に学んでいきたいと思います。
【Gitエラー】yarn.lockのコンフリクトを解消する

# 起こったエラー
forkアプリ内でmasterを最新の状態にし、ローカルのdevelopにpullしようとした際に、
```
error: Your local changes to the following files would be overwritten by merge: 
    hogehoge/yarn.lock
```
というエラー文が出現した。
<br><br>

# 解決法
一度対象のyarn.lockファイルを削除してからもう一度pullをしたら成功した。
<br>

pull前に削除したyarn.lockファイルの中身と差異があったときのために、念のため、対象のディレクトリ下で

```
yarn install
```
を行った。
[AWS] CDKでAppRunnerのカスタムドメインを設定する（カスタムリソース）

## CDKでApp Runnerにカスタムドメインを設定することはできない

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-apprunner-alpha-readme.html

↑を見てもカスタムドメインを設定することはできなそう...

実際にGitHubにissueがあり、202４年1月現在、AppRunnerのカスタムドメインはCloudFormationはサポートされていないっぽい。

https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/1092

しかし、APIはサポートされている。↓

https://docs.aws.amazon.com/apprunner/latest/api/API_AssociateCustomDomain.html

→ **カスタムリソースで設定できる！**

どういうことか、説明します。

## カスタムリソースとは

カスタムリソースはCloudFormationが用意してくれている機能。以下は公式の引用
>カスタムリソースを使用すると、テンプレートにカスタムのプロビジョニングロジックを記述し、ユーザーがスタックを作成、更新(カスタムリソースを変更した場合)、削除するたびに AWS CloudFormation がそれを実行します。たとえば、AWS CloudFormation のリソースタイプとして使用できないリソースを含める必要があるとします。それらのリソースは、カスタム リソースを使用して含めることができます。この方法により、すべての関連リソースを 1 つのスタックで管理できます。

- 要は、CloudFormationが対応していないリソースの作成に使えるってことらしい。
- CloudFormationやCDKのL2コンストラクタでは設定ができないが、SDKやAPIからは設定できることを設定。
- そのリソースが作成・更新・削除されるときに指定した Lambda 関数を実行して、何らかの操作ができる。
- CDKのL2コンストラクタは、CloudFormationのリソースに対応するL1コンストラクタで設定できるすべての項目に対応しているとは限らない。そのため、L2コンストラクタを使いつつもL2コンストラクタではできないことをカスタムリソースで補うということはよく行われる。
<br>
今回、App Runnerを作成するために`@aws-cdk/aws-apprunner-alpha`（L2コンストラクタ）を使用している。ここでカスタムドメインはサポートされていないが、APIはサポートされているのでカスタムリソースで実現する。

## 実装
カスタムリソースをインポート
```typescript
import * as cr from 'aws-cdk-lib/custom-resources'
```

```typescript:application-stack.ts
new cr.AwsCustomResource(this, 'customDomain', {
    onCreate: {
      //AppRunnerを指定
      service: 'AppRunner',
      //APIを指定
      action: 'associateCustomDomain',
      parameters: {
        DomainName: 'testtest.example.com',
        //AppRUnnerのARN
        ServiceArn: service.serviceArn
      },
      physicalResourceId: cr.PhysicalResourceId.of('customDomainCreate')
    },
    onDelete: {
      service: 'AppRunner',
      action: 'disassociateCustomDomain',
      parameters: {
        DomainName: 'testtest.example.com',
        ServiceArn: service.serviceArn
      },
      physicalResourceId: cr.PhysicalResourceId.of('customDomainDelete')
    },
    policy: cr.AwsCustomResourcePolicy.fromSdkCalls({
      resources: [service.serviceArn]
    })
  })
```
- `service`はL2コンストラクタで作成されたAppRunnerを指しています。
- `AwsCustomResource`を使用します。
- `onCreate` には作成時、`onDelete`にはリソース削除時に実行されるアクションを記述します。今回はonCreateに`associateCustomDomain`、onDeleteに`disassociateCustomDomain`を指定します。
- `policy`には、`onCreate`および`onDelete`アクションにおいてAppRunnerサービスに対して必要な権限を与えています。

<br>
上記をデプロイすれば、指定したドメインをAppRunnerに設定することができます。
ただ、マネコンで確認するとわかるのですが、指定のCNAMEレコードをDNSに登録しないとドメインの所有確認がされないので、実際にそのドメインで使えるようにはなりません。なので最後にDNSにCNAMEレコードを追加して完了です。

![スクリーンショット 2024-01-09 15.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655825/bdf78d67-85a6-1e05-bfc0-9540a2f7c413.png)
AWS ANS-C01 合格までの道のり

## はじめに
先日、**AWS Certified Advanced Networking – Specialty (ANS-C01)** に合格しました。

感想として、年末にAWS SAPとDOPに合格していたので自信はあったのですが見事に跳ね返された印象です。SAPの1.5倍は難しかった。

そこで、私自身が参考にしたサイトや勉強方法について共有したいとおもいます。

## 使用した問題集
問題集に関しては、SAPやDOPでもお世話になった**Cloud License**のWeb問題集を使用しました。

https://cloud-license.com/

この問題集は、一問解くたびに正答がわかり解説も読むことができるので効率がいいです。

試験で出題されるサービスは、ほぼほぼ網羅しているので理解が浅いサービスを中心に下記で示すサイトなどで確認を行いました。

結果的にこの問題集は3周ほどしました。


## 参考にしたサイト
**Route53**
ざっくりDNSについての概要を押さえることができます。

https://en-junior.com/route53/

**Route 53 Resolver**
図があるので非常にわかりやすいです。

https://dev.classmethod.jp/articles/explain-route53-resolver-ram/

**DNSSEC署名**
DNSSECの設定方法について理解しましょう。

https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-configuring-dnssec.html

**VPC Traffic Mirroring**

https://dev.classmethod.jp/articles/201906-release-vpc-traffic-mirroring/

**Site to Site VPN**
オンプレミスとAWSの接続方法はいくつかあるのでそれを理解しましょう。

https://dev.classmethod.jp/articles/whitepaper-translate-jpn-vpc-connectivity-options-01/

**Direct Connect**

https://docs.aws.amazon.com/ja_jp/directconnect/latest/UserGuide/Welcome.html

**Transit Gateway**
図で理解するとスムーズです。

https://www.ashisuto.co.jp/db_blog/article/aws-transitgateway.html


## 最後に
他にも調べたことはありますが、上記のサービスを理解できると学習がスムーズに行くと思います。

まだまだ理解が浅い箇所があるので実務で使用できるように理解を深めたいと思います。

この記事が誰かのためになれば幸いです。
指定の元素種を含む POSCAR ファイルパスのリ ストの取得（ログ）

## 目標

ここでは，POSCARファイルが存在するパスのリストを用いて，特定の元素種を含むPOSCARファイルパスのリストを取得する．
例として，元素種C, Oを含むPOSCARファイルパスのリストを取得したいときは，以下のようにPythonスクリプトの第1引数以降に，その元素種を半角英字で引き渡す．尚，複数の元素種を指定する場合には，半角スペース1文字で区切って入力する．


## 実行手順ログ
ここでは，元素種P，Hを含むPOSCARファイルパス一覧を取得する．
```terminal
pwd
/mnt/ssd_elecom_c2c_960gb/scripts/get_some_speceis_existed_poscar_path_list

ls -CF
C_O_existed_poscar_file_path_list.npy*    N_H_existed_poscar_folder_path_list.npy*       get_some_speceis_existed_poscar_path_list.py.sh*
C_O_existed_poscar_folder_path_list.npy*  get_poscar_existed_path_list.py*               poscar_existed_file_path_list.npy*
N_H_existed_poscar_file_path_list.npy*    get_some_speceis_existed_poscar_path_list.py*  poscar_existed_folder_path_list.npy*
```


```terminal
time python3 get_some_speceis_existed_poscar_path_list.py P H
```
len(poscar_abs_path_list_loaded): 308325
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 308325/308325 [12:26<00:00, 413.25it/s]
len(P_H_existed_poscar_file_path_list): 39122
P_H_existed-poscar file, and folder path list were saved as .npy!!!

real    12m36.668s
user    4m10.564s
sys     9m20.628s


```terminal
ls -CF
C_O_existed_poscar_file_path_list.npy*    P_H_existed_poscar_file_path_list.npy*         get_some_speceis_existed_poscar_path_list.py.sh*
C_O_existed_poscar_folder_path_list.npy*  P_H_existed_poscar_folder_path_list.npy*       poscar_existed_file_path_list.npy*
N_H_existed_poscar_file_path_list.npy*    get_poscar_existed_path_list.py*               poscar_existed_folder_path_list.npy*
N_H_existed_poscar_folder_path_list.npy*  get_some_speceis_existed_poscar_path_list.py*
```
Ruby on Rails　変数params

# はじめに
備忘録です。
Ruby on Rails5 学習レッスン III　・URLからidを取得しようを学習中paramsがわからなかったのでそこら辺の知識をまとめます

# Q変数paramsがなぜハッシュなのか
A、Ruby on Railsにおけるparamsがハッシュとなる理由は、HTTPリクエストに含まれるクライアントからの情報を扱いやすくするためです。

Webアプリケーションでは、ブラウザからのHTTPリクエストには様々な情報が含まれます。例えば、フォームから送信されたデータ、URL内のクエリ文字列、HTTPヘッダーなどがあります。これらの情報を扱うために、Railsではparamsという変数が使われます。

paramsはリクエストから送られてきた情報を取り出すための手段であり、その情報は通常ハッシュ（Hash）として提供されます。なぜなら、HTTPリクエストに含まれるデータはキーと値のペアの形式で渡されることが多いためです。


# 情報を受け取る流れ（ルーティングからコントローラ）　
例えば、以下のようなURLがあり：http://example.com/posts/1

また、config/routes.rbファイルで次のようにルーティングを設定した場合
```
get "posts/:id" => "posts#show"
```
config/routes.rbファイルではURLの「posts/1」のところを「：id」が受け取っている

そしてposts#showを用いてどのコントローラーのどのアクションを関連付けるかを示す。
ここでの"posts#show"とはpostコントローラーのshowアクション見てね、ということを示しています。


# 情報を受け取る流れ（paramsの役割）
コントローラのアクション内では、ルーティングで設定したURLの「:id」の値を取得することができます。その値はparamsという変数にハッシュとして入っています。
params[:id]とすることで、その値を取得することができます。

 params自体がエンジニアがする前から、自動的にルーティングで受け取った「:id」の値を取得していたという事ですね・



# 終わりに
この備忘録はチャットGPTとprogateの解説を元に作成しました。
PyTorch+CUDAのバージョン合わせメモ

自分用のメモです．

# この記事が役に立つケース
既存のML（だいたいDL）アプリケーションでちょっと遊びたい時にCUDAを一つのバージョンだけインストールしていると，依存関係のPyTorch関連ライブラリをそのCUDA対応バージョンに合わせなければならない．

- dockerで仮想環境ごと切り替える
- update-alternativesを使う

などの解決策もあるが，そこまでワークステーションの設備が良くない僕はできるだけインストールするCUDAを一つだけにしたい．なので

**可能な限り単一CUDAで環境を作る場合やることをメモしておく**

# 基本手順

1. requirements.txtのCUDA依存部分をコメントアウトする
2. nvcc -VでインストールしてあるCUDAバージョンを確認する
2. **2.で確認したCUDAバージョン対応**かつ，**requirements.txt内のPyTorchバージョンにできるだけ近い**PyTorchをインストール（ただしMajor releaseが変化する場合などはmajor releaseが変化しない方向にアップグレードorダウングレード）
2. 残りのPyTorch関連ライブラリをインストール．時には対応づけミス？により普通にpip installできない or みつからないライブラリがあるので（torch-scatterなど）直接wheelからpip installする．


もっと頭のいい方法があるかもなので適宜更新必須
WingetでMinicondaとVS.Codeをインストールする

# はじめに

　毎日やる作業ではないのですが、開発環境を作る作業は、毎回面倒だけど避けて通れません。
できれば、スクリプトでワーッと全部やってくれればいいと思うのですが、パッケージマネージャごとにクセがあり、結局調べることになったりするので、備忘録としてこの記事を書いています。

# Wingetをインストールまたはアップグレードする

Windows 11の場合は初めからWingetがインストールされているはずです。Windows 10の場合はインストールされていないので、まずはWingetをインストールします。

## WinGetをインストールする(Windows 10のみ)

大まかな手順は以下の通りです。MS Storeにアクセスできるのであれば、そこからインストールするのが容易です。

MS Storeサイトへのアクセスが禁じられている組織（企業・会社）の場合は、この手順ではインストールできません。[こちらの記事](https://learn.microsoft.com/ja-jp/windows/package-manager/winget/)に別の方法が記載されています。

1.  Storeの[アプリインストーラー](https://apps.microsoft.com/detail/9NBLGGH4NNS1?rtc=1&hl=ja-jp&gl=JP#activetab=pivot:overviewtab)にアクセス
1.  ```インストール``` ボタンを押す
あとは、Microsoft Storeが起動するので、画面の指示に従います。

一度、Wingetをインストールしてしまえば、WingetでWinget自体をアップグレードできるようになります。

# WingetでMinicondaをインストールする

次にMinicondaをインストールします。

> 本当はAnacondaのインストールをしたかったのですが、現在(2023.09版)のAnacondaのインストーラではExtractが失敗しうまくインストールができなかったので断念しました。次のAnacondaのバージョンが出たらまた試そうと思います。

Windows TerminalからWingetを使うのが便利ですが、未インストールであればPowerShell / コマンドプロンプトを使う形でも問題ないです。

WingetをTerminalから起動してみます。以下のように入力すると、Wingetのバージョン情報が表示されます。

```(shell)
> winget -v
```
バージョンが表示されることを確認したら、今度はMinicondaを探してみます。

```(shell)
> winget search miniconda
```

現時点（2024.01）では以下の結果が返ってくる。
```
名前       ID                  バージョン  一致           ソース
----------------------------------------------------------------
Miniconda3 Anaconda.Miniconda3 py39_4.10.3 Tag: miniconda winget
```

Minicondaが見つかったので、早速インストールしてみます。

```
> winget install Anaconda.Miniconda3
```

インストールの際は、名前とIDのいずれかを指定してインストールができます。上記ではIDを指定してインストールしています。
> 後で出てきますが複数のバージョンが見つかったりする場合では名前で一意にならないことがあるので、ID指定をするほうが確実です。

インストールが始まったら、あとは画面の指示に従います。おそらく特に何も聞かれずにセットアップが完了します。インストール後は、一度ターミナルを終了して、再起動してからcondaコマンドを実行して使用できることを確認します。

## Visual Studio Codeをインストールする

同様に、Visual Studio Codeをセットアップします。

```
> winget search "visual studio code"

名前                                      ID                                      バージョン ソース
-----------------------------------------------------------------------------------------------------
Visual Studio Code - Insiders             XP8LFCZM790F6B                          Unknown    msstore
Visual Studio Code                        XP9KHM4BK9FZ7Q                          Unknown    msstore
Microsoft Visual Studio Code              Microsoft.VisualStudioCode              1.85.1     winget
Microsoft Visual Studio Code Insiders CLI Microsoft.VisualStudioCode.Insiders.CLI 1.86.0     winget
Microsoft Visual Studio Code Insiders     Microsoft.VisualStudioCode.Insiders     1.86.0     winget
Microsoft Visual Studio Code CLI          Microsoft.VisualStudioCode.CLI          1.85.1     winget
```

今度は、複数のバージョンが出てきた。最新機能を試す必要はないので、```Microsoft.VisualStudioCode```を選択することにします。

```
> winget install Microsoft.VisualStudioCode
```

インストールが終わったら、早速 VS.Codeを起動する。codeの後に.(ピリオド)をつけて起動すると、カレントディレクトリを開きます。ここではターミナル起動時のホームディレクトリを開いています。

```
> code .
```
![vs-code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351917/d44f854b-d7d4-3795-b524-103c0637ad11.png)

あとは、VS.Codeの拡張機能をインストールしたり、必要なパッケージをcondaコマンドでインストールしてあげれば環境の出来上がり。
RAID6故障率

# RAID6故障率

## 1. ディスク1本あたりの故障率

ディスク1本あたりの故障率は、「SAS_Segate」で仕様書にはMTBF 200万時間と記載されております。

このMTBFとは、平均故障間隔を指しております。
これを件／時間で計算すると

λ=1/MTBF=0.0000005（件／時間）
となります。これを件/日で計算すると
0.0000005*24=0.000012(件/日)
となります。

## 2. RAID6 の故障確率

RAID６での全体障害となるのはディスク3本同時障害なった場合になるので組合せのrは3となるため、以下式となる。

AFR = 1-(AFR^3)* nC3

AFR ... 年間故障率0.000012(件/日)
n   ... RAID6 を構成するディスク本数
C   ... 組合せ Combination
組合:nCr=n!/r!(n-r)!

11本構成の場合
1-(1.2*10^-5)^3*(11*10*9)/(3*2)
=165*(1.2*10^-5)^3
=1-2.8512*10^-13
=1-0.000000000000003

(1-0.000000000000003) ってことで、まあまあもう壊れないですね…

## 最後に

数字だけ見ると稼働率Five9どころじゃないですが、まぁ理論値であって実際は違うんですけど…www
あくまでも、上記はディスクの偶発故障であり初期不良や経年劣化を指すものではありません。また、HDDメーカーでは3年で定期交換するように仕様書に書かれているものもありますので仕様書をよく確認してください。
ComfyUIをApple M1で試してみる

# まえがき
pythonスクリプトを起動して、ブラウザからUI画面に入って操作できる仕組みのようです。
ノードベースのUIでフローを組むことができるのでアーティストやデザイナー的な感覚でも
AIフローを組んで遊べるようになれそうだったのでまずは遊べるところまでのメモです。

 手軽に楽しみたい方は親切な方がGoogle Colabバージョンを作っていただいてるようです。 https://colab.research.google.com/github/mkshing/notebooks/blob/main/stable_video_diffusion_img2vid.ipynb?authuser=2#scrollTo=aaimSFWfLPgb
 
 


# ComfyUIをM1AppleSiliconインストール
HomeBrewとPython3.xが事前にインストールされている状態からスタートします。

スペックはこんな感じ。

![Screenshot 2024-01-09 at 15.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/660f6a60-d55d-1a09-b385-7ff3e1e961d6.png)


英語が得意な方は、ReadMeにわかりやすく書いてあった。

ComfyUIをローカルにクローン

インストールしたいところにcdで移動してgitクローン。

```
git clone https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file
````

次にAccelerated PyTorch training on Mac の指示に従ってconda環境整備。

https://developer.apple.com/metal/pytorch/

```
curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh
sh Miniconda3-latest-MacOSX-arm64.sh
````

pip3が入っていたのでこちらでインストール。

```
pip3 install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
````


動作確認
ターミナルにpythonと打ってインタラクティブモードで起動して、以下を貼り付ける。

```python
import torch
if torch.backends.mps.is_available():
    mps_device = torch.device("mps")
    x = torch.ones(1, device=mps_device)
    print (x)
else:
    print ("MPS device not found.")
````

結果にこれが出れば成功らしい。

tensor([1.], device='mps:0')


## 次にComfyUIで画像生成してみる。

ComfyUIのディレクトリに移動
```
cd ComfyUI
````

PIPインストールで依存したライブラリーをインストール

```
pip install -r requirements.txt
````

学習モデルをComfyUI/models/checkpoints/ に格納する必要がある。

以下のリンクから学習済みモデルをインストール。v1-5-pruned-emaonly.safetensorsってモデルをダウンロードして先ほどのフォルダに格納。

![Screenshot 2024-01-09 at 15.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/42447db4-1378-148e-b361-7cb84206d0c6.png)


https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main


main.pyを起動。

```
python main.py
````


ブラウザを開いて http://127.0.0.1:8188/ を開く

![Screenshot 2024-01-09 at 15.01.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/cd85b42c-67eb-1d43-ae31-ebcaba66d18b.png)


プロンプトを適当に打って、Queue Promtで実行する。

![Screenshot 2024-01-09 at 15.01.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152481/d28a6a44-f08e-047f-fd69-a221eb9bc2ee.png)

数秒待つと、一番右のノードに猫ちゃんが出てきた。わーい🙌


これでノードをつなげてAIパイプラインを感覚的に組めそう。いっぱい遊べそうすな。
おわり。



# 参考リンク

https://medium.com/@ingridwickstevens/comfyui-stable-diffusion-installation-for-apple-silicon-m1-m2-m3-a7bd78e86495

https://github.com/comfyanonymous/ComfyUI?tab=readme-ov-file#manual-install-windows-linux
EventBridgeのルールをboto3で一括削除

# はじめに
EventBridgeのルールを数百個削除する必要があったので作成しました。
ただコンソールから手動で削除する場合でも、チェックボックスがあるので少数であれば比較的楽に消せると思います。
削除結果をログとして残しておきたい場合などに参考にしてもらえたらと思います。

# 目次
1. [コード](#コード)
1. [boto3のエラーハンドリング](#boto3のエラーハンドリング)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#コード"></a>
# コード
```python
import boto3
from botocore.exceptions import ClientError

delete_rules = ["rule_0","rule_1"]

client = boto3.client('events')

print(f'all rules: {len(delete_rules)}')
cnt = 0
fails = []
for delete_rule in delete_rules:
    print(f'start: {delete_rule}')
    try:
        res_targets = client.list_targets_by_rule(Rule=delete_rule)
    except ClientError as e:
        if e.response['Error']['Code'] == 'ResourceNotFoundException':
            print(f'{delete_rule} not found, skip\n')
            fails.append(delete_rule)
            continue
    targets = [target['Id'] for target in res_targets['Targets']]
    res_rules = client.describe_rule(Name=delete_rule)
    if res_rules['State'] == 'DISABLED':
        client.remove_targets(Rule=delete_rule,Ids=targets)
        print('delete targets\n')
        cnt+=1
    else:
        print('status is ENABLED, skip\n')
        fails.append(delete_rule)
        continue
    client.delete_rule(Name=delete_rule)
    print('delete rule\n')
    
print(f'total deleted rules count: {cnt}')
print(f'fails: {fails}')
```

<a id="#boto3のエラーハンドリング"></a>
# boto3のエラーハンドリング
削除対象のルールが実際には存在しなかった場合を想定して**ResourceNotFoundException**を指定します。

なお、直接
```python 
try:
    res_targets = client.list_targets_by_rule(Rule=delete_rule)
except ResourceNotFoundException:
```
のように指定すると
```python 
NameError: name 'ResourceNotFoundException' is not defined
```
となるので注意が必要。



<a id="#reference"></a>
# 参考文献
- [Error handling - Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/error-handling.html)
AZ-104 更新した内容

# AZ-104 失効2週間前…
去年に取得し、更新1回目。
3回受験し無事合格しました。更新にまつわるネット情報が少なかったので記録します。

（2024/1/9時点）
# ■AZ-104: Azure Administrator Associate
・この試験は１年に１回更新が必要です。
・受験料は無料
・失効半年前から受験可能
・Microsoftからお知らせメールは全部で3回程度（見逃さないように）
・受験は何回でも可能ですが、3日目以降は24時間程度空けることが必要です
・当方は26問、時間無制限で受験できました（45分という表記はありました）
・57％以上が合格ライン
・すべて選択問題(4～6択程）
・正答詳細は教えてもらえないので、試験終了後も答えは自分で探すしかない

# ■Microsoftからのメール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166782/3ac97150-a83f-a3b3-2990-11d6727f2654.png)


# ■受験結果
1回目：35％
2回目：28％（勉強した後なのに?）
3回目：60％（ギリギリ合格）

※2回目までは45分以内に試験を完了していましたが、無制限に気付いた3回目は3時間くらいかけて調べました。

![合格1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1166782/46ae761b-1508-785d-3cd0-575b39b8204c.png)


# ■感想
難しかったです。
去年積んだはずの知識が失われていることもありますが、それ以上に新しく更新されているサービス内容や、Azureアーキテクト構築経験がある人向けの試験に感じました。
選択肢も教科書やLearnにある基本的なものではなく、例えばドロップダウンリストのどのプランがこのケースで必要なのか？といった実務的な問いが多かったように思います。
自分を信じず(笑)問題に対して、しっかり調べながら受験しました。

# ■試験について
きっと随時更新しているので、この試験もすぐに変わると思いますが、当方の場合は以下の知識をしっかり調べる必要がありました

## （出題の傾向）※本当の問題ではありません
1.GitHubを使ったAzureWebAppsをデプロイする場合、AzurePotalのどの設定を変更する必要がありますか？

　‐4択くらいの選択肢から選ぶのですが、調べてもなかなかコレ！という正解は見つからない。経験が必要に感じました。

 
 文章読解力も必要となり、使用ワードに慣れも必要に感じました。
 時間をじっくりかけて調べて受験してみてください。

当たり前ですが皆さんも頑張ってる、精進せねば。と背筋が伸びました。
Power Apps でギャラリーのデータソースをコンボボックスで選択する


# はじめに

Power Apps のギャラリーでデータを表示する際、コンボボックス/ドロップボックスでデータソースを切り替えたいというケースがあると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/27330b74-2f4e-7c90-64df-6bf81ab73819.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4bdc56e1-8dac-249b-dc6b-1268029181d7.png)

簡単ですが、今回はこちらの方法を紹介します。

# アプローチ

今回は、以下の二つのリストをコンボボックスで切り替えてギャラリーに表示するようにしたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1a55b006-1fa8-f672-f57c-0659e3c1e62f.png)

## 上手くいかないパターン

まず、上手くいかないパターンについて書きます。ある意味、そのため、こちらの記事を書きました。

まず、コンボボックスの`[Items]`プロパティにダイレクトに以下のようにデータソースを追加すると、候補が表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/383175dd-08d7-d4b0-6ca8-0f1ea6e59887.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/fbe806d4-f2c5-a1a7-c27f-926bfa7d28c5.png)

逆に、以下のようにテキスト形式にすると、候補の選択はできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c377b559-77bd-81d8-68c2-c071088ce767.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7313e373-8ad8-bd43-afbf-c46bdc414bdc.png)

しかし、ギャラリーの方で以下のようにコンボボックスで選択された値を指定しても上手くアイテムが表示されません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/88cdf1cd-ac92-cc38-c0a4-90abfa4d8607.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/10d2ac18-0950-e901-6ad0-c98024716fb9.png)

## 解決策

以下のようにすることで解決できました。
まず、以下のようなコレクションをあらかじめ作成しておきます。name がテキスト、list がデータソース自体を意味します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/963421b7-a787-2653-4ff0-df24cbc17d51.png)


```
ClearCollect(
    colLists,
    {
        list: 問い合わせ,
        name: "問い合わせ"
    },
    {
        list: 問題追跡,
        name: "問題追跡"
    }
)
```

そして、コンボボックスの`[Items]`プロパティを以下のようにコレクションにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e90d0e39-1e8c-def9-37bc-449ff5c41bda.png)

フィールドを name (テキストの方) にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/aceb6f7f-7bc0-20b5-200c-83dae89e4dcc.png)

そして、ギャラリーの`[Items]`側は以下のようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3c5ffa56-3f77-49c3-2545-2b44edf5b480.png)

```
ComboBox1.Selected.list
```

こちらにより、無事にデータソースの切り替えが出来ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2ed67dd4-efd6-bd6b-21fc-dd48bba0a451.png)

# まとめ

今回は、Power Apps のギャラリーでデータを表示する際、コンボボックス/ドロップボックスでデータソースを切り替える方法について紹介しました。データソースが複数ある場合、Power Apps 内で選択して切り替えたいというケースもあると思うので、参考になれば幸いです。