OmniAICreator/Qiita-1.07M huggingface dataset:
lsのなぞ

# ハードリンクの数のなぞ
ls -lで表示される情報の左から2番目の数値はハードリンクの数を表している。これが1であれば何の疑問も持たないが、例えばディレクトリを作成するといきなり2となる。

~~~bash
drwxr-xr-x. 2 ec2-user ec2-user 6 12月 18 10:36 dir1
~~~

ディレクトリへのハードリンクを作成した覚えはないが、いったいこれはどういうことなのか？実は作成したディレクトリ配下には以下のハードリンクが自動的に作成される。

「.」はカレントディレクトリを参照するハードリンク
「..」は一つ上の階層のディレクトリを参照するハードリンク

つまり「.」が自分自身へのハードリンクということで、ハードリンクの数がひとつ増えて2となる。ディレクトリ名そのものもハードリンクなので、それとプラスして2ということである。

しかし「.」と「..」ってハードリンクだったのか。なるほど・・・。ハードリンクなんて何のために必要なのかと思っていたけど、すでに自分も便利に使っていたわけか。というかファイル名やディレクトリ名もそもそもハードリンクだった。つまりすべてはハードリンクだったという謎解き。Linuxすげー。

# ディレクトリのサイズのなぞ
ls -lで表示されるディレクトリのサイズはファイルシステムがディレクトリを管理するために使用しているディスク容量のサイズ。ディレクトリ内に格納されているファイルサイズの合計ではない。(以下の6という数値)

~~~bash
drwxr-xr-x. 2 ec2-user ec2-user 6 12月 18 10:36 dir1
~~~

なんでこんな参考にならない数値を見せているのか？たぶんlsの動作をシンプルにするためだろう。ファイルサイズを表示する仕組みをそのまま何も変えずにディレクトリにも適用させているのではないかというのが個人的憶測。

# 合計のなぞ
-lや-sで表示される合計は、ディレクトリ内のファイルのディスク上のファイル領域割り当てブロック数の合計。ディレクトリ内に格納されているファイル数の合計ではない。ファイルサイズの合計でもない。
-lsオプションで表示すると分かりやすい。先頭の数値が割り当てブロック数である。

~~~bash
$ ls -ls
合計 4
0 drwxr-xr-x. 2 ec2-user ec2-user 6 12月 18 10:36 dir1
4 -rw-r--r--. 1 ec2-user ec2-user 8 12月 18 11:01 file1
0 -rw-r--r--. 1 ec2-user ec2-user 0 12月 13 23:05 file2
~~~

なんでこんな紛らわしい合計なのか。たぶんディスクがいまよりずっと高価で、常に容量を気にしながら使っていたころの名残ではないかと思っている。このディレクトリは4ブロック使用しているのか、ならディスク容量は大丈夫だな。と常に意識していたのだと思う。いまとなってはただただ紛らわしい。初見だと「何の合計だよ」となるのは間違いない。
情報系のソフトウェアガチガチ学科卒から見た、ある日の半導体

# 目的
わからないまでも半導体についてさらーっと説明してみるメモ
# 背景
「コンピュータは０と１で出来ています」
どうやらそうらしいです。そうらしいんですが、私たちは気が付いた時にはWindows95のマウスをカチカチしていたような気がします
（MS-DOS？PC88？懐古厨は帰って下し亜）

あのデスクトップをダブルクリックしてインターネットエクスプローラを起動して「ぴーひょろろ」して
果たして「０と１で出来ています」と言えるのでしょうか？
ただ、この説明に関してはまた別のお話…

# 中学校か高校くらいの知識で半導体
中学か高校かどっちかで習ったはずです。
* 導体
* 絶縁体
あーね、じゃあ半導体はこういう事ね
* 半導体=抵抗

微妙につながってる状態

半分導体で半分絶縁体（高抵抗）で半導体…

ですよね？違うんですか？違うんですね？知らんがな

# それっぽい会社に入って1年後ぐらいの知識で半導体

あー、なるほど、トランジスタだ、MOS-FETだ、NMOSだ、PMOSだ
これが半導体。異論は認めない。俺は半導体のすべてをすることが出来た。ありがとう…

…ありがとう

# それっぽい会社に入ったある日（本編）

💡

「とある条件において、導体（抵抗が下がる）。とある状態において絶縁体（抵抗が上がる）なデバイス」

* NMOS（理想的なやんわりと）いうと
    * ゲートにHighが来ると、NMOSのソース―ドレイン間が低抵抗
    * ゲートにLowが来ると、NMOSのソースドレイン間が高抵抗

* PMOS（理想的なやんわりと）いうと
    * ゲートにLowが来ると、PMOSのS-D間が低インピーダンス
    * ゲートにHighが来ると、PMOSのS-D間がHi-Z

パイボーラは小電流でコントロールしますが
使い方はほぼ一緒です。
MOSしか使ったことが無い人は、ゲートがソースかドレインに電流が漏れていくイメージを忘れずに…

あくまで「抵抗値」が変わって「導体」か「絶縁体」を切り替えれる。
特に、この2つを切り替えるものが電圧
電圧を使ってMOSの電流を変え、そのあとの電圧をコントロールできる、ので

うまーーーーーーーく、使うことが出来れば
2ビットの概念があれば
デジタル回路が作れる！

# 余談
アナログはこのゲートに微妙な電圧を入れることでS-D間の電圧を微妙にコントロールすることでいろいろやるんです
半導体=抵抗
ただただ、それはまた別のお話・・・・

Thank you.
Docker × Laravel がクソほど重い件

## 概要
- Dockerを用いてLaravelのWEBアプリ開発を行おうと考えた。
- パソコンを買い替えたばかりであるのに、画面遷移やAPI応答に15～30秒程度の時間がかかってしまった。
- メモリが8GBであることが原因であるかと考えたが、設定の問題であった

## 補足記事
:::note info
同じ内容を次の記事で書き直したため、こちらも参照しながら解決してください。
:::
https://qiita.com/koinunopochi/items/d63d961dcabf2ebd2a6e

## 最新版

https://qiita.com/koinunopochi/items/5240c121b3ac69835acd

## 問題点
- LaravelをDockerを用いて開発しようとすると、ストレスが半端ない。
## 原因
- `/storage/framework`,`/vendor`が原因である
- キャッシュの書き換えなどで大量にファイルを書き換えるようで、Volumeをマウントすると、書き換え処理の影響で重くなってしまうっぽい

## 解決策
- 単純にこれらをマウントしなければよい

:::note info
自分はDocker初心者なので、手順を踏んでいますが、おそらくもっと効率のいい方法があるはず！！！
:::
### 1.まず、通常通りにvolumをマウントします。
```docker:compose.yaml
    volumes:
      - ./src:/var/www/html
```
### 2.次に、通常通りにbuildと起動を行います。
```sh
docker compose up -d
```

### 3.Laravelをインストールします。
```bash
composer create-project --prefer-dist "laravel/laravel=10.*" .
```

### 4.通常通りインストールが完了したら、compose.yamlに以下を追記し再ビルドします。
```docker:compose.yaml
    volumes:
      - ./src:/var/www/html
      - storage-volumes:/var/www/html/storage/framework
      - vendor-volumes:/var/www/html/vendor

volumes: 
  storage-volumes:
  vendor-volumes:
```

https://qiita.com/suin/items/e53eee56da23d476addc

```sh
docker compose build
docker compose up -d
```

### 5.localhost:8080等設定したポートにアクセスします。エラーが発生しています。解決します。
```sh:error

Warning: require(/var/www/html/public/../vendor/autoload.php): Failed to open stream: No such file or directory in /var/www/html/public/index.php on line 34

Fatal error: Uncaught Error: Failed opening required '/var/www/html/public/../vendor/autoload.php' (include_path='.:/usr/local/lib/php') in /var/www/html/public/index.php:34 Stack trace: #0 {main} thrown in /var/www/html/public/index.php on line 34
```

`/var/www/html/public/../vendor/autoload.php`がないと怒っていますねえ、、

コンテナidを調べます。
```sh
docker container ls
```

エラーを消すために、ホストマシンのvendorとstrageフォルダをdocker内の作業ディレクトリにコピーします。
```sh
# idは適宜変更してください。
docker cp ./src/vendor cdd242978d2e:/var/www/html
docker cp ./src/storage cdd242978d2e:/var/www/html
```
### 6.もう一度アクセスします。違うエラーが発生しています。
```sh:error
file_put_contents(/var/www/html/storage/framework/sessions/iKVv2XjaoEEY8msML26fhhGBCwh9mKqG4VnFPGjS): Failed to open stream: No such file or directory
```
権限が足りないと怒っているので、権限をあげます。

:::note alert
開発環境なのでフル権限を与えていますが、本番環境では慎重に権限を与えるようにしてください。
:::

```sh
chmod -R 777 /var/www/html/storage
```

### 7.再々度アクセスします。動いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/bcd2bddb-253f-74e0-172b-cf9697472b0d.png)

適当に、パスをいじって画面遷移すると、おそらく1秒未満で画面遷移ができるはずです！

### 8.コンテナを消して、再度アクセスしたときにきちんと実行されるかの確認をします。
```sh
docker compose down
docker compose up -d
```

動かない場合は、手順4の空のボリュームあたりの設定が間違っていないか確認してみてください。それでもダメな場合は、以下に参考サイトを列挙するので試してみてください！

## まとめ
Qiitaにまとめる中で、Dockerファイルの設定などを変更できそうな部分が思いついたので、また設定をいじろうと思います！

## 参考サイト
https://qiita.com/suin/items/e53eee56da23d476addc

↓↓↓自分より丁寧です！↓↓↓

https://qiita.com/ryo_one/items/cced7c7b6e21527ad81e

↓↓↓理由とかいろいろ書いてあるので、参考になります！↓↓↓

https://www.sukerou.com/2022/07/docker-php-laravel.html

↓↓↓初心者には荷が重かったです↓↓↓

https://lhaplus.biz/docker-mount-slow/
bat 条件分岐して、install／uninstall　と一部の文字だけ色を変更

# bat 条件分岐して、install／uninstall　と一部の文字だけ色を変更

```bat
@echo off

set 赤=[31m
set 緑=[32m
set 白=[37m
set デフォルト=[0m

:INPUT_START
set exe_Path=C:\Users\test\Downloads\picture\
set f32bit=32bit
set f64bit=64bit

echo *****************************************
echo 1. %1%白%ポリシー指定でインストール%デフォルト%
echo 2. %1%緑%Defaultポリシー指定でインストール%デフォルト%
echo 3. %1%赤%アンインストール%デフォルト%
echo *****************************************
set /p ui=1～3を選択してください: 

echo +-------------------------------------------------------+
echo  入力した文字は%緑%[%ui%]%デフォルト%でよろしいですか？
echo （Y / N）
echo +-------------------------------------------------------+
SET CONF_SELECT=
SET /P CONF_SELECT=
 
IF "%CONF_SELECT%"== SET CONF_SELECT=Y
IF /I NOT "%CONF_SELECT%"=="Y"  GOTO :INPUT_START

if "%PROCESSOR_ARCHITECTURE%" EQU "x86"   goto :WIN32
if "%PROCESSOR_ARCHITECTURE%" EQU "AMD64" goto :WIN64
echo %赤%手動でインストールを行ってください。%デフォルト% & goto :FINISH

:WIN32
set f32bitPath=%exe_Path%%f32bit%
pushd %f32bitPath%

rem echo where /r %f32bitPath% /f *.exe
FOR /F %%i in ('where /r %f32bitPath% /f *.exe') DO @SET oput_exe=%%i

if exist %oput_exe% (
 Call :Main %oput_exe%
) else (
 echo "32bitのexeファイルは見つかりませんでした。"
)
rem 切断
popd
goto :FINISH

:WIN64
set f64bitPath=%exe_Path%%f64bit%
pushd %f64bitPath%

rem echo where /r %f64bitPath% /f *.exe
FOR /F %%i in ('where /r %f64bitPath% /f *.exe') DO @SET oput_exe=%%i
if exist %oput_exe% (
 Call :Main %oput_exe%
) else (
 echo "64bitのexeファイルは見つかりませんでした。"
)
rem 切断
popd

goto :FINISH

:FINISH

:Main
echo %oput_exe%
if %ui%==1 (
  rem ポリシー指定でインストール
  %oput_exe% /install /norestart ポリシー指定
) else if %ui%==2 (
  rem Defaultでインストール
  %oput_exe% /install /norestart
) else if %ui%==3 (
  rem アンインストール
  %oput_exe% /uninstall 
) else (
  echo %赤%1～3のどれかを選択してください。%デフォルト% 
)

pause
exit

```

# 設定できる色の一覧
```bat
@echo off
echo [30m黒[0m
echo [31m赤[0m
echo [32m緑[0m
echo [33m黄[0m
echo [34m青[0m
echo [35mマゼンダ[0m
echo [36mシアン[0m
echo [37m白[0m
echo [90m明るい黒[0m
echo [91m明るい赤[0m
echo [92m明るい緑[0m
echo [93m明るい黄[0m
echo [94m明るい青[0m
echo [95m明るいマゼンダ[0m
echo [96m明るいシアン[0m
echo [97m明るい白[0m
pause
```
Dockerが8080:8080とか、ポート3000番で接続を待つとかのもっと前のところで分かってなかったじゃん。

こんにちは。

フロントエンドエンジニアでバックエンドも頑張りたいみつです:relaxed:

最近、
- 「**Dockerを操作する時、8080:8080でポートを繋いであげる**」
- 「**フロントエンドで3000番ポートに接続をしてあげる**」

などポートという単語が色々なところで出現し、もやもやが晴れない感覚がありました。

**神出鬼没なポート。どんなものなの**？？って疑問が湧くよね・・・・？？:frowning2:

そこで、ポート自体の理解が足りないということに気がついたので、記事にしました。

出てくるキーワードは下記です。
- ポート
- Docker
- Express

Dockerの使い方やExpressについてではなく、前段階のポートに繋いでる（それぞれの関係性が）イメージができる記事です。

## 目次
- [Dockerを簡単に:point\_up:](#dockerを簡単にpoint_up)
- [Expressを簡単に:point\_up:](#expressを簡単にpoint_up)
- [ポートへの自分のもやもや:cloud:](#ポートへの自分のもやもや)
  - [ポートの語源について調べてみた:writing\_hand:](#ポートの語源について調べてみた)
  - [じゃあ、ポートって？？](#じゃあポートって)
- [まとめ](#まとめ)


## Dockerを簡単に:point_up:
> Docker provides the ability to package and run an application in a loosely isolated environment called a container. 

> Dockerは、コンテナと呼ばれる疎に隔離された環境でアプリケーションをパッケージ化して実行する機能を提供する。

Dockerについての説明は、様々な記事があるのと自分はもっと前の段階で分かっていなかったため今回はざっくりと。

公式ドキュメントでは、looselyに隔離された環境を作ってアプリケーションを実行する環境を作ると説明されてます。

https://docs.docker.com/get-started/overview/

## Expressを簡単に:point_up:
> Fast, unopinionated, minimalist web framework for Node.js

> This app starts a server and listens on port 3000 for connections. 

Expressについての説明も、上に述べた理由と同じなのでざっくりと。

公式ドキュメントでは、Expressは軽量なWebフレームワークで、appは起動後、3000番のポートで接続を待つと説明されてます。

ただ、なんでListen（聞く）なの？普通にListenの意味で良いんだよね？？という疑問があったので単語の語源も調べて見ました。

> このルーツは、サンスクリット語の srnoti「聞く」、srosati「聞く、従う」、アヴェスタ語の sraothra「耳」、中期ペルシア語の srod「聴覚、音」、リトアニア語の klausau, klausyti「聞く」、šlovė「輝き、名誉」、古代教会スラブ語の slusati「聞く」、slava「名声、栄光」、slovo「言葉」、ギリシャ語の klyo「聞く、呼ばれる」、kleos「報告、噂、名声、栄光」、kleio「有名にする」、ラテン語の cluere「自分自身が呼ばれることを聞く、話題になる」、古アイルランド語の ro-clui-nethar「聞く」、clunim「私は聞く」、clu「名声、栄光」、cluada「耳」、ウェールズ語の clywaf「私は聞く」、古英語の hlud「大声で」、hleoðor「音、曲」、古高ドイツ語の hlut「音」、ゴシック語の hiluþ「聴く、注意する」の語源でもあります。

まぁそうだよね。

Express自体はよしなにやってくれるものではあるんだろうけど、Listenする箇所だけでいうとほんとにJust listenしているだけ。

ハチ公みたいに座り、待っているものなんだろうなと思ったのがここまでのところです。

https://expressjs.com/ja/

https://www.etymonline.com/jp/word/listen

## ポートへの自分のもやもや:cloud:
分からないのは、8080:8080でローカルポートからDockerコンテナに接続をするぞというその動き。

そして、3000番ポートで待つぞというその動き。

でかい箱の中にケーキ:cake:が入ってるの想像したんですが、箱開けりゃ上からに側面からにどっからでも見えるじゃん？っていう感覚もあるし、**なぜそんなピンポイントから覗いてるの**？？というモヤモヤが始まります。

### ポートの語源について調べてみた:writing_hand:

ポートという単語自体は、**通路**など通り道的な意味が語源にあるらしい。

> 元々は"入り口、通路"を意味し、porta "市の門、門、ドア"に関連している。

https://www.etymonline.com/jp/word/port

### じゃあ、ポートって？？

ポートというものに対して理解していないうちは、色々やってくれる最強なもの（？）という妄想がありました。

でもただのドアらしい。

そうなると、

- Dockerでやってるローカルのドアとコンテナのドアを一緒と定義してあげる。
- Expressでどこからやってくるか分からない通信を3000番でただListenしている。

の説明にもやっと納得がいきます。

ポート自体が何かを提供しているというよりただの通る道、ドア的なものなのかと思うと、色々なツールで単語が確かに出てくるよねぇという感じ。

さらにいうと、多分実家というでかい家の中に、息子の部屋がありそれを開ける感じなんだろうなと。

:::note info
ポートとは、やっぱり、「通り道」であり「ドア」的なもの。
:::


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1841912/f8a9c0e6-769d-2afb-3fb6-382898b04e98.png)

## まとめ
Dockerについての説明やExpressについての説明は嬉しいことに記事がたくさんあるんですが、その前段階でモヤモヤしていた最近。

DockerやExpressという違ったものなのに同じ単語が同じように使われていることで知識足らねぇなぁの感覚があったんですが、ポートという1つの共通的な考え方（そしてそれは特に何があるものでもなかった）のを知れたのがすごくスッキリしました。笑

納得納得。

今日も頑張るぞ〜〜

おわり。
Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'.に苦しめられた話

## 誰向けの記事？
こんな人たちへの助けになればと思って書いた記事です。
- ローカルでビルドしたコンテナイメージをECRにプッシュし、それを使ったタスク定義からサービスを作成しようとすると、「Error occurred during operation 'ECS Deployment Circuit Breaker was triggered'.」と CloudFormationに表示されてサービスがデプロイできなかった人
- CPUアーキテクチャ違い※がないことを確認しても上記が発生して、原因がわからない人
    -※ https://qiita.com/masaozi3/items/801e07979696051ae93b

## 結論
私※の場合、下記が原因でデプロイに失敗していました。
※AWS初心者ですので、他に設定ミスがある可能性があります。が、下記に対処するとデプロイに成功することは確認済みです。
- **ECRのエンドポイント（com.amazonaws.region.ecr.dkr, com.amazonaws.region.ecr.api）を設定し、プライベートサブネット両方に関連付けしていた**
    - 関連付けていたのはプライベートサブネットですが、パブリックサブネットへのサービスのデプロイに失敗していました。
    - エンドポイントを削除したら、パブリックサブネットへのデプロイに成功しました。
- **ビルドした環境とは異なる環境（例えばwindows）でdocker commitを行って更新したイメージをECRにプッシュした**
    - 私の場合、タスク定義のCPUアーキと同じ環境でイメージを作成し、それをdocker desktop for windows上でcommitして更新したイメージを使ってサービスを作成しようとすると、デプロイに失敗しました。
    - docker desktopでcommitしなかったイメージを用いると、デプロイに成功しました。
【ServiceNow】CMDB検討前に知っておきたかったこと

この記事は、Qiita ServiceNow アドベントカレンダー18日目の記事です。
**ServiceNowのカレンダー | Advent Calendar 2023 - Qiita**

http://qiita.com/advent-calendar/2023/servicenow

### はじめに
はじめまして。ServiceNow歴はParisから３年、
得意かは置いておいてすっかりファンになったMINAです。

いよいよクリスマスまであと1週間になりましたね:santa_tone1::star2:
みなさんは、どんな１年でしたでしょうか？

私の2023年は構成アイテム（CI）の自動収集（Discovery）の検討からスタートしました。

最近、CMDB(構成管理データベース)を導入したいといった話をよく耳にしますが、
背景には、
「今までは部門や組織ごとに個別管理していたけど、ServiceNowで全社情報を一元管理していきたい！」
 「人の手で管理していたけど、自動収集で工数削減したい！」
 　など、様々な想いがあると思います。

そんな想いを受け取り、手探りに検討を始めた頃に早く知っておきたかった内容を書き留めていきます。
完全に個人的なアウトプットになりますが、みなさんの参考になればうれしいです。

### CMDB(構成管理データベース)とは？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623258/cfe08b32-ff12-faea-c24c-d9cb35e0cbff.png)

CMDBは、ServiceNow Technology Workflow の核となるデータベースです。
企業のIT資産を構成アイテム（CI）として管理します。

「Discoveryを導入することで管理工数・コスト削減しよう！」といった目的で構築した場合でも、
正しく導入することで、インシデントの解決までの時間を短縮することができたり、
問題の特定までの時間を短縮することができたり、
構成管理に限らず、さまざまな嬉しいメリットが期待できます。

ServiceNowではただ単にデータを管理するだけではなく、
依存関係をシームレスに表示することができたり、
依存関係ビュー）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623258/50979ba7-b028-2a93-8178-5ad9e107a589.png)
CSDM（共通サービスデータモデル）を活用することで
テクニカルな視点だけでなくビジネス視点、コンシューマー視点と多角的にCMDBを管理することも可能になります。

### CMDBの構築は簡単じゃない！

「やっぱりServiceNowは開発者の味方☆
　ノーコード・ローコードの開発ツールだからCMDBの構築も簡単だよね？」という認識は間違いです。
 CMDBは正しく導入しようとすると奥が深く、とても難しいものです。
 
ServiceNowのあらゆる製品に影響するため、
まずはServiceNowのOOTB（Out Of The Box）に乗っ取った導入を目指しましょう。

CSDMを活用し、全社で必要な管理項目の精査や定義を実施するところから始め、
段階的に導入を行うことを推奨されていると理解していますが、
正しく構築しようとすると長い年月が必要になると思います。
YoutubeでCSDMの動画を見ましたが、一度聴いただけではconfusingな内容だとトレーナーの方も言っていました。

ひとまず、自動収集だけを検討する場合も、テクニカルな知識が必要になります。

**ServiceNowにはいろいろな検出方法がある**

- Discovery：指定したIP範囲でスキャンしたすべてのデバイスを検出する
- ServiceMapping：指定したIP範囲で特定のデバイスを検出する
＋DEXやACC,その他独自製品など

:::note warn
対象機器によって認証情報が違ったり、
WindowsサーバーはWindowsサーバーで構築したMIDサーバーからでないと収集できないなどの制約があります
:::

**インフラの知識が必要になる**

MIDサーバーの構築や収集対象に認証を通すために、
インフラ関係者の協力が必要になるかもしれません。
企業のNW強度に構築難易度は依存します。

:::note warn
自動収集ではCMDBのすべての項目を収集できるというわけではなく、
ペルソナなどの項目など手動管理が必要な項目もあります。
:::
### まとめ

ServiceNowにとってのCMDBの位置づけと構築には知識や時間が必要になることをきちんと理解した上で、導入メリットを感じてもらえるようなCMDBの構築を目指していきましょう！

個人的には、一度Discoveryを構築すると、
きちんと定期的に自動収集されるのでとても感動しました。（ちゃんと動く…！）
ちなみに、個人環境で検証しようとすると、AWSの無償枠内でスペック不足で検証できませんでした…。

ServiceNowはユニークで画期的な機能が盛りだくさんで
私もまだまだ勉強中なのでなにかあれば、コメントお願いします。
読んでいただき、ありがとうございました。

### 参考

**ServiceNow公式Docs**

- [共通サービスデータモデル (CSDM) とは？](https://www.servicenow.com/jp/products/it-operations-management/what-is-csdm.html)
- [Configuration Management Database（CMDB）](https://www.servicenow.com/jp/products/servicenow-platform/configuration-management-database.html)

**その他**

https://special.nikkeibp.co.jp/atclh/NXT/23/mds0901/servicenowjapan/

https://servicenow-lab.com/what-is-ootb/
ノーコードBubbleを使って爆速開発した話

## この記事は何か

とあるサービスを新規で開発する際
- 収益が見込めるか分からないのでとりあえずシュッと作りたい
  - 工数をかけずすぐサービスを公開したい
  - PDCAを高速に回したい

という背景からノーコードのBubbleを使って開発する機会をいただきました。

通常の開発（RailsでのWeb開発を想定）で軽く見積もって4, 5ヶ月かかるところを、1.5ヶ月程度でリリースまで持っていくことができ、どのように進めていったのかを紹介できたらと思います。

## 概要と期待値

- 開発ボリューム
- ざっくりスケジュール
- 進め方解説
- 振り返り
- まとめ

「読者の身の回りの業務でノーコード活用を検討する材料」になれば幸いです

## 開発ボリューム

「求職者と人手が欲しい事業所をマッチングするサービス」を作成しました。
ユーザ別で下記のような機能を作成することになりました

### 求職者

- 求職者のプロフィール情報が入力できる
- 求人を探せる
- 求人に応募できる
- 事業所と直接メッセージを交わせる
- 勤務日に勤怠入力が行える

### 事業所

- 求人を掲載できる
- 求職者と直接メッセージを交わせる
- 求職者の勤怠管理が行える

合計で**30画面**程度の開発ボリュームでした

## ざっくりスケジュール

![1214_qiita_zakkuri_schedule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/72ec42da-c8e2-c567-96e9-492dd40f8e53.png)


上述したボリューム感を1.5ヶ月かけてリリースまで持っていけました。
一般的な開発と比べての大きな差異は「**すべての工程が並行して進行した**」ということだと思っています。
具体的にどのように開発を進めていったのかを紹介していきます。

## 進め方解説

まず前提としてリリースまでの1.5ヶ月は基本的に
- ENG
- IA（サービスの全容を把握し画面要件、仕様など検討する人）
- QA
の各1名ずつで進めていました。

### 要件定義

*〜曖昧な状態ですぐ開発を開始〜*

要件定義はの段階では、「こんな機能・あんな機能が欲しい」という文書からIAの方がざっくりとした画面設計を1日程度で作成いただきました。
その画面要件をもとに「特に仕様の深掘り検討をせず即実装」で開発を開始します。

### 開発・デザイン

この工程でノーコード開発ならではだなと思ったことを紹介していきます
**開発・デザインを並行した**
![スクリーンショット 2023-12-18 9.57.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/1b302437-603f-1cd9-9e86-6031d2c7ec28.png)



bubbleはブラウザからの操作でほぼすべての開発が行えます。
今回はENGが必要機能とざっくりとした画面を実装し、完了次第IAの方もbubbleを通してデザインを調整というやり方で開発していきました。
「開発とデザイン調整」を並行して進めるというのは今までの開発では中々できなかったことなのかと思います。

**仕様調整しながら開発**

要件定義の段階で仕様の深掘り検討をしていなかったので、開発していて「この場合はどうなるんだろう。」ということが度々生じていました。
これに対しては都度相談の上実装を進めていくということで対応していきます。
多少実装を作り直してしまうこともありましたが「ノーコードによる圧倒的スピード感でカバー」で解決（？）していました。

**圧倒的なスピード感**
![スクリーンショット 2023-12-18 11.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23308/d2214c73-df8e-d101-cb8f-4a7e17015b9e.png)



QA・開発が並行している際にいただいた指摘をチャットでやり取りしながら「13分で解決」することができました。
開発の中でこのように「圧倒的なスピード感」で開発を進めていけたことはノーコード開発ならではかと思っています。

### QA

*〜QAの負担大〜*

スケジュールがタイトであったこともあり、デザインの調整、細かな残対応が少し残っていても機能が全てできていたらQAを始める。というスタンスで開発とQAが並行して進行しました。
その結果デグレ・QA指摘が 160件程度にのぼり、大量の指摘を「ノーコードによる圧倒的スピード感でカバー」で解決（？）していきました。

## 振り返り

開発を振り返り、通常の開発（railsでのwebサービス開発とします）と今回の開発を比較してみました。

| | 通常の開発 | ノーコード開発 |
| --- | --- | --- |
| 要件定義 | 要件から仕様を深く検討して曖昧な部分をなくす | 要件から曖昧な状態で開発 |
| デザイン | デザイナーがhtml, cssを作成の上ENGが組み込み | ENGが開発しながら非デザイナーがスタイルを調整していく |
| 開発 | インフラ構築<br>DB設計<br>機能実装<br>テスト実装<br>コードレビュー | DB設計<br>実装<br>コードレビュー |
| QA | 実装が完了してからQA | 実装と並行してQA |

通常の開発と比較して「LT短縮することはできたんだけれども、QAの負担が大きくなってしまった」と言った結果だったかなと思っています。

## まとめ

- ノーコードを利用してすべての開発工程を並行して進めた
- LT短縮にはつながった
- 曖昧なまま開発し「圧倒的スピード開発」でカバーしていたが、QAの負担が大きくなった

がお話ししたかったことになります。

ノーコードの利用ケースとしては「コストを抑えて早くサービスをリリースして、市場の反応を見たい」、「定型的な業務を非ENGでも対応できるようにしたい」などがあるのかなと思っています。
参考になれば幸いです
コラボフローの申請書に埋め込みする！

昨年に引き続き、今年もやっています！
「[コラボフロー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/collaboflow)」19日目です✨✨

最近初めてインフルエンザになりまして、あまりの関節の痛さに身動きが取れませんでした😭
今年は病気をたくさんしたので、来年はぜひとも健康でいたいものです…😭

さて、今回はコラボフローの申請書に「埋め込み」をしてみたいと思います！

## 申請書に埋め込みをする

試しに、グーグルマップでやってみたいと思います！

1. グーグルマップで任意の場所を検索し、共有＞地図を埋め込む から、HTMLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/1107c3b5-96a2-da32-da5a-79e46c09815f.png)

1. コラボフローのフォーム編集でラベルパーツを配置します。
1. 配置したラベルパーツを開き、手順1でコピーしたHTMLをラベル内容に貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/eb2559cc-bc1e-7797-8a06-5f7209361724.png)
1. 作成したフォームで経路を作成します。
1. 作成した経路を新規文書から開くと、地図が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/0e2992a3-dbe8-02be-3447-98ba45a658b2.png)


## 申請時に埋め込み画像をする

以下を参考にして、申請入力画面でYouTubeの埋め込みを表示して遊んでみます。
[外部APIを使ってランダム画像を取得し、表示する](https://collaboflow.zendesk.com/hc/ja/articles/360000531036)

1. YouTubeのお好きな画像を開き、共有＞埋め込む から、HTMLをコピーします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/3caa90a6-d5b7-ba50-72c4-5159e33fac7b.png)

1. コラボフローのフォーム編集でテキスト1行パーツ（パーツID:fidHtml）と、ラベルパーツを配置します。
1. 配置したラベルパーツを開き、ラベル内容を `<div id="embeddedDisplay"></div>` とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/ec96c6f7-1267-7877-2bbf-5d1046375fa8.png)

1. 以下コードをJSファイルに保存し、フォーム編集＞カスタマイズから、アップロードします。
    ```javascript
    (function () {
        'use strict';
    
        collaboflow.events.on('request.input.fidHtml.change', function (data) {
    
            const parts = data.parts;
            const embeddedHtml = parts['fidHtml'].value;
    
            const embeddedDisplay = document.getElementById('embeddedDisplay');
    
            if (embeddedDisplay) {
                embeddedDisplay.innerHTML = '';
                embeddedDisplay.insertAdjacentHTML('afterbegin', embeddedHtml);
            }
        });
    })();
    ```
1. 作成したフォームで経路を作成します。
1. 作成した経路を新規文書から開き、テキスト1行パーツに手順1でコピーしたHTMLを貼り付けると、YouTubeが表示されます。
　![umekomi.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044070/aae255fe-120e-22ba-9473-c14aa37be1a3.gif)

## おわり

色々な埋め込み試してみてください！
20日目は @taroyamada5963 さんです✨
Salesforce フローを使用して ヘッダーで認証パラメーターを渡す【現状ではできない】

なかなか興味深い話題です。

+ [フローを使用した SFMC API への API 呼び出しの認証と実行](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007CGtaoSAD)

名前付き認証情報/認証を使用してみました。認証目的のプロバイダー/外部認証情報ですが、SFMC はこれらの認証を好まないようです。そのため、アクセス トークンを生成する JSON 本文に必要なパラメーターを渡すカスタム認証で HTTP コールアウトを使用しました。

認証でアクセス トークンを渡す必要がありますが、フローのアクションにはそのためのオプションがありません。API リクエスト パラメーターで認証トークンを渡そうとしましたが、最終的にはエラー 401: 認証されていませんという結果になりました。

+ 解答１

これは現時点では不可能です。それを行う唯一の方法は Apex です (やり方がわからないのでできませんでした)。 

私は最終的に MuleSoft を使用して、カスタム オブジェクトとレコードにトークンを隠し、それを MuleSoft に渡してヘッダーとして渡すことができました。 

＋ 解答2

私も同じ問題に直面しました。これらの記事を見て、そこで見つけたアプローチを実装し、最終的にヘッダーで認証パラメーターを渡すことができました。以前は 401 応答が返されていましたが、今では 202 応答が返されます。おそらく、あなたのシナリオでは機能するでしょう。

https://forcepanda.wordpress.com/2022/11/15/how-to-set-up-header-based-api-key-authentication-in-external-services/

https://help.salesforce.com/s/articleView?id=sf.nc_cred_custom_headers.htm&type=5

https://help.salesforce.com/s/articleView?id=sf.nc_custom_headers_and_api_keys.htm&type=5

+ 解答3

これが役立つかどうかはわかりませんが、私も「Bearer」を使用しています。認証。この記事の手順に従いました。

https://forcepanda.wordpress.com/2022/11/15/how-to-set-up-header-based-api-key-authentication-in-external-services/ 

ステップ 2 で説明したように、トークンを認証パラメーターとして追加しました。これは、「APIKey」に保持されている値です。変数。

「カスタムヘッダー」についてステップ 3 で説明したように、次のように実行しました。

```
Name: Authorization
Value:  {!'Bearer ' & $Credential.ExternalCredentialAPIname.APIKey}
```

要約すると、記事の手順に従い、'Bearer' を追加してカスタム ヘッダー認証値を変更しただけです。文字列に。

この記事もご覧ください。この記事は、私が見つけなければならなかった解決策と、「Bearer」という単語の組み合わせに関して、私を正しい軌道に乗せてくれたものです。そしてトークン:

https://help.salesforce.com/s/articleView?id=sf.nc_custom_headers_and_api_keys.htm&type=5

+ 回答4

フロー HTTP コールアウト アクションの主な問題 (これも重大) は、動的ヘッダー値がサポートされていないことだと思います。たとえば、x-msg-key または x-amzn-trace-id です。この種のヘッダー値は、オンザフライで生成する必要があります。ただし、名前付き資格情報もフロー コールアウト アクションも、動的値をヘッダーにマージすることをサポートしていません。

そのため、高度なセキュリティ ポリシー (API 呼び出しのユーザーごとのアクセス トークンなど) を適用したり、各 HTTP 呼び出しでトレース ID を単に要求したりする組織の場合は、 Apex Callout を使用する以外に選択肢はありません。

+ [Named Credential Custom Headers not included in HTTP Callout from Flow (Klaviyo)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4PeISAV)

資格付き認証情報に対して追加したカスタム ヘッダーが含まれていないことに気付きました。
 
それはなぜでしょうか?これが、ステータス 415 - リクエストでサポートされていないメディア タイプ エラーが表示される原因ではないかと思われます (フローが停止しないことに注意してください。デバッグ ログにエラーが表示されます)。
 
このエンドポイントには秘密キーやユーザー名/パスワード認証はありません。必要なのは、エンドポイント URL とパスに company_id=STRING URL パラメーターを追加することだけです。デバッグ ログでは、Flow を使用した HTTP コールアウト セットアップによって正常に構築されたことがわかります。
 
Postman では、company_id 値を使用してこのエンドポイントへの呼び出しをテストすることに成功しましたが、content-type、accept、revision ヘッダーを設定する必要がありました。これらを名前付き資格情報に対するカスタム ヘッダーとして追加し、以前に外部資格情報にも追加しようとしましたが、どちらも機能しませんでした。

+ [Named Credential Custom Headers not included in HTTP Callout from Flow (Klaviyo)](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007LUJFESA5)
シンプルCPU通信設定でGC-1000と通信する

# はじめに

セーフティコントローラと通信する設定について記載します。
PLC側はGX Works3で設定します。

https://www.keyence.co.jp/products/safety/safety-controller/gc/models/gc-1000/


# GX Works3の設定

こちらを参考にシンプルCPU通信設定を行います。

https://dl.mitsubishielectric.co.jp/dl/fa/document/catalog/plcr/bcn-89999-8215/BCN-89999-8215-A.pdf

PLC入力側デバイス
・B0～B1F（32点)

PLC出力側デバイス
・B100～B14F(80点)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/6a4c96ba-5350-c308-275b-f0a486d06e2f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/e4616862-3054-ade8-65ea-e4304c048266.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/a14c897e-56e2-4d9d-8dab-7dd13f480383.png)


:::note info

Y2520やX1000はGC-1000側のデバイスなので、PLCのデバイスではありません

:::



# GC-1000の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/8aea4b27-08eb-191f-9316-51e5dae50a12.png)

通信出力の登録：`機器リスト`→`通信入力/出力`→ラベルを登録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/903e23de-202c-5a60-8544-02181a9c359a.png)

登録したラベルを使用できるようになるのでプログラムで使用する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/756d7757-585f-7757-709a-37d09b8263d5.png)


# 参考ページ

http://soup01.com/ja/2023/10/05/keyencegc-1000-part1_getting-started_jp/
Box for Salesforce 2023年主なアップデート

# はじめに
またまたBox for Salesforceについて書かせていただきます。
以前の記事の一部はこちらから
[Boxとの連携でSalesforceをより便利に活用しよう(Box for Salesforce)](https://qiita.com/kamadhi/items/006626ddb0b66a70e902)
[Box×Salesforce活用のススメ](https://qiita.com/kamadhi/items/bcada53ca82d9aa7403a)

2023年もいろいろなアップデートがありました。今日はその中で主なものを4つ紹介したいと思います。

# 目次
1. レコード作成時に特定のフォルダ構成を自動作成
2. ルートフォルダの変更が可能に
3. Experience CloudにUI Elementが埋め込めるようになりました
4. Box Signで複数のドキュメントを利用


# 1. レコード作成時に特定のフォルダ構成を自動作成
デフォルトの状態ではSalesforceのレコードを作成した際、[Create Folder]というボタンが表示され、そのボタンをクリックすることで空のフォルダが作成されます。
それがフローを用いて、特定の構造を持ったフォルダ構成を自動で作成できるようになりました。![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/ecdb8893-0444-c92b-8f32-528f52f35719.png)

Box for Salesforceをインストールした際、Account Folder Templateというフローが自動でインストールされます。こちらを利用することで実現可能です。
同じフォルダ構成を毎回作成していて面倒・・・という時はぜひ利用してみてください！

# 2. ルートフォルダの変更が可能に
Salesforceと連携させる際、Box上にルートフォルダを作成する必要があります。このルートフォルダの変更が意外と大変で。。。これまではアンインストールする必要がありました。が、この変更が手動で実行できるようになりました！
詳しくは下記記事を参照してください
[Box for Salesforceルートフォルダの変更](https://support.box.com/hc/ja/articles/360044192813)

# 3. Experience CloudにUI Elementが埋め込めるようになりました
これまで、Experience Cloudでは[こちらの記事](https://qiita.com/kamadhi/items/730b5d98d6b48f9ca013)にあるようにBoxの利用に大きな制限がありましたが、ついにUI Elementが埋め込めるようになりました！
下の画像のように、コンポーネントから任意のUI Elementを利用することができます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/57cabff4-acc4-1f59-39b9-4d851d761946.png)

# 4. Box Signで複数のドキュメントを利用
Boxでは、Box Signを利用するときに複数ドキュメントを選択して利用することができますが、Box for SalesforceからBox Signを呼び出す時はこれまでこの機能が活用できず、単一ドキュメントのみに限られていました。
しかし、直近のアップデートによってついにBox for Salesforceでも複数ドキュメントを利用したBox Signを活用できるようになりました！
下の画像のようにチェックボックスが表示されるようになりました。
![スクリーンショット 2023-12-18 10.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986270/2a72becc-e453-5f16-b292-0d55b57e40fa.png)

# さいごに
Box for Salesforceのアップデート、非常に多く走っておりまだまだフローを活用したらできそうなことなどがたくさんあります。検証できたものから下記資料にどんどん載せていく予定ですので時々覗きにきていただけたらうれしいです！

https://cloud.box.com/s/0vu17hx6q5rokmlyyp7llxwduwehd09j
Optunaの最適化クラスを作った話

株式会社ブレインパッドでデータサイエンティストをしている23新卒のまーしです。

この記事はBrainPad Advent Calender 2023 17日目の記事です。

# 本記事の目的
Optunaをシステムに組み込むために作った最適化クラスのコード共有です。

# はじめに
みなさんは、Optunaを使ったことはあるでしょうか？
Optunaとは、日本のPrefferdNetworks社が開発したハイパーパラメータ（ハイパラ）の自動最適化フレームワークです。より広義にはハイパラ最適化を含むブラックボックス最適化全般に使用可能なフレームワークです。

業務でハイパラ最適化でないブラックボックス最適化でOptunaを用いる必要がありました。その際に工夫した点が次の2つです。

1. 制約遵守解のみを出力
2. 最適化クラスを設計


# 工夫点
## 1. 制約遵守解のみを出力
Optunaには制約付きブラックボックス最適化ソルバーがいくつか実装されています。ただし、どのソルバーも制約条件をソフト制約として扱います。つまり、探索で得られる解には制約違反解と制約遵守解両方が混在します。業務上、制約遵守解のみ出力したかったため、以下のような制約遵守解だけ取り出す関数[^1]を作成しました。

```python
def get_feasible_trials(self):
    # 全ての試行のうち、制約条件を全て満たすものだけを抽出し、目的関数の値でソート(昇順)
    feasible_trials = sorted(
        [t for t in self._study.trials if all(np.array(t.user_attrs["constraints"]) <= 0)],
        key=lambda t: t.value,
    )

    return feasible_trials
```

## 2. 最適化クラスを設計
機械学習モデルをクラスとして定義するように、Optunaもクラスとして定義することで、よりシステムに組み込みやすくしました。目的関数や制約条件とクラスの実装は以下の通りです（まだまだ改良点があるのでコメント頂けたら幸いです）


```python
import optuna
import numpy as np

#目的関数1
def f0(X):
    return 4 * X[0] ** 2 + 4 * X[1] ** 2
#目的関数2
def f1(X):
    return (X[0] - 5) ** 2 + (X[1] - 5) ** 2

# 制約条件1
def g0(X):
    return (X[0] - 5) ** 2 + X[1] ** 2 - 25

# 制約条件2
def g1(X):
    return -((X[0] - 8) ** 2) - (X[1] + 3) ** 2 + 7.7
```

```python
class OptunaModel:
  def __init__(self):
    super(OptunaModel, self).__init__()
    self._sampler = optuna.samplers.TPESampler(
        constraints_func=lambda x: x.user_attrs["constraints"],
    )

    self._study = optuna.create_study(
        directions=["minimize"],
        sampler=self._sampler,
    )

  def _add_variables(self,trial):
    self._X = [trial.suggest_int(f"x{i}", -15.0, 30.0) for i in range(2)]


  def _add_constraints(self, X, trial):
    C = []
    for const_func in [g0, g1]:
        C.append(const_func(X))
    trial.set_user_attr("constraints", C)

  # 目的関数の重み付け和をとり、単目的最適化にする
  def _get_objective(self, X, trial):
    total_obj = 0
    for i, obj_func in enumerate([f0, f1]):
        total_obj += 10**(-i) * obj_func(X)
    return total_obj

  def _objective(self, trial):
      # 決定変数の作成
      self._add_variables(trial)
      # 制約条件の作成
      self._add_constraints(self._X, trial)
      # 目的関数の作成
      obj = self._get_objective(self._X, trial)
      return obj

  def optimize(self):
    self._study.optimize(self._objective,timeout=2000)
```

上記のクラスは次のようにして使用できます。

```python
model = OptunaModel()
model.optimize()
feasible_trials = model.get_feasible_trials()
# 制約条件を満たす試行のうち最良の目的関数値と解を表示
print(feasible_trials[0].value)
print(feasible_trials[0].params)
```


# まとめ
Optunaをハイパラ最適化以外のブラックボックス最適化に適用する場合、「制約遵守解のみ欲しい」や「システムに組み込める実装にしてほしい」の要望が出るかもしれません。その際、上記のコードがわずかながらでも参考になれば幸いです。



[^1]: 単目的の最小化問題を前提としたコーディングになっています。
【Rails】rails newで--skip -testし忘れて、すでにtestフォルダにファイルたくさんができていた時の対処法

この記事は「[はじめてのアドベントカレンダー Advent Calendar 2023](https://qiita.com/advent-calendar/2023/first-time)」の19日目に参加しています🎅

## はじめに
こんにちは、あっぴー(@super-appy)と申します。
プログラミングスクールに通ってRuby on Railsを学習しています。
初学者のため、記事に誤りなどがありましたらコメントにてご指摘いただけますと幸いです。
よろしくお願いします。

### 記事のきっかけ
先日、WEBアプリを作り始めました。Dockerで環境構築をして、いざ`rails new`しました。
```bash
rails new . --database=postgresql -j esbuild --css tailwind
```
何度も確認して、ドキドキしながら`rails new`しました。
そして、開発を進めること数日。`rails g ~~~`するたびに、`test`ファイルが増えている👀
今回はRSpecを導入する予定なので、このデフォルトで生成されるtestファイルは使いません。
消しても`rails new`したら増えるし...と悩んでいました。

そんなとき、スクールの講師の方から「**testファイルは全部消してgeneratorの設定をしましょう！**」とアドバイスいただいたので、調べて実装してみました。

### 環境
- Ruby 3.2.2
- Ruby on Rails 7.0.8

## 手順
### 1. 既存のテストファイルを削除する

方法は2つあります。
- ターミナルでコマンドを使って削除する
- 手動でファイルを削除する 



#### ①ターミナルでコマンドを使って削除
プロジェクトのルートディレクトリに移動し、以下のコマンドを実行

```bash
rm -rf test
```
:::note warn
rmコマンドは削除の前の確認がなく、ファイルが直接削除されます。
:::

#### ②手動でファイルを削除
この場合、削除したファイルはゴミ箱に移動されるため、比較的安全に削除することができます。


### 2.　ジェネレータのデフォルト設定を変更

```ruby:config/application.rb
module YourAppName
  class Application < Rails::Application
    # 以下の設定を追加
    config.generators do |g|
      g.test_framework false
      g.helper false
      g.stylesheets false
      g.javascripts false
    end
  end
end
```

`g.test_framework` : テストフレームワークを生成しないようにする
`g.helper` : ヘルパーファイルを生成しないようにする
`g.stylesheets` : CSSを生成しないようにする
`g.javascript` : JSファイルを生成しないようにする

その他、生成しなくてもいいファイルがあれば適宜追加する。

**Railsサーバーを再起動すると変更が反映されます**

## おわりに
テストファイルが必要なければ、最初でスキップしておきましょう。
```bash
rails new . --database=postgresql -j esbuild --css tailwind --skip -test
```
同じような状況の方のお役に立てますと幸いです！
カスタムアプリの個人アップロードについて

Teams管理センターにアクセスが前提

1.セットアップポリシーのカスタムアプリをアップロードをオンにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/e6d090ae-4ee9-c5ec-e5bf-d89b02ca4ed8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/d179ef95-34cd-9298-9115-9091be74118a.png)





2.アプリを管理にて　カスタムアプリのユーザー個別のアップロード利用をオンにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/17ea89da-ccf6-1a57-ecf8-c271ee0f7477.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/4fb8e210-8e9d-ad26-92ff-cec8e86baf95.png)




3. カスタムアプリをユーザー個別でアップロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/b5bbf89f-0a05-fa6d-b2fe-586aa5d3faf1.png)


カスタムアプリ用ファイルを指定してアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/172ce7fb-10b3-0eed-df52-05b4eb42ec37.png)


カスタムアプリをTeams アプリとして追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769629/80ca73b7-6507-e5ab-1d5d-2994bd1f00c7.png)
Salesforceで使うためのテキストデータの加工



+ [awkを使ったデータ加工](https://qiita.com/Keiji_otsubo/items/b299b93a399849808ff7)
+ [データのインポート関係](https://qiita.com/Keiji_otsubo/items/bb3b509d63fa75d6584f)
+ [十何万件もの××__Shareオブジェクトのレコードをロジック組んで作成し本番へインサートしたいです。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007T4drr)

:::note
もし私が実装するなら件数が多いので、シェルでのバッチ処理になると思います。

1. データローダ等を使って関連するオブジェクトのレコードを取得してcsvファイルにします。（後でマッチング処理をするためのキーがあれば必ず含めておきます）

2. csvファイルをカンマ区切りからブランク区切りに変更します。（このフォーマットでは’’は_に変換しておきます。こうしておかないと項目が抜けます。）

3. ２のフォーマットならシェルのコマンドで色々と処理が可能です。awkなんかもそのまま使えます。

マッチング用のコマンドなどは一から作ると大変なので以下のようなツールを使えば楽ができます。私はphpやpythonでコマンドを作りましたが...

https://uec.usp-lab.com/TUKUBAI/CGI/TUKUBAI.CGI?POMPA=ABOUT

4\. Unix系のOSを使えば文字コードはUTF-8の可能性が高いので、そうであれば、データローダで使うCSVファイルも簡単に作成できると思います。
:::

# awkの覚え

+ 日付

```
myDate=`date +"%Y-%m-%d"`
echo $myDate
```

+ 変数を使う

```
awk -v foo=$myDate '{print $0, foo }' |
```
Maya プレイブラストでコマを抜きたい

mayaのプレイブラストをコマ抜いて実行したいなぁ
という場面がありまして

先人達にどうやってるって聞いたら
- AEに持ってってコマ抜く
- フレームレート落して実行する
- レンダリングのbyFrameを使って

などなど

え。プレイブラスト単体ではできねぇの？
（maya2022)

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/playblast.html

frame フラグで、特定のフレームだけ出せるは出せるけども・・・

カメラシーケンサに何かそういう感じの機能ないのかしら・・・

難しく考えるのをやめた
-
とりあえず確実かつ、シーンをぶっ壊さない方法を。

- 通常通り連番でプレイブラストを行う
- 連番ファイルの中でキーとなるフレームのファイルで、次のキーとなるフレームまでのファイルを上書き

うん　パワー

雑実装
-

```python
import os
import shutil
def overwiteStepFrames(step,seqFiles,dirPath):
    for i in range(0,len(seqFiles),step):
        sourceFile = seqFiles[i]        
        for ii in range(1,step):
            if len(seqFiles) > i + ii:
                targetFile = seqFiles[i + ii]               
                shutil.copy2(dirPath+sourceFile,dirPath+targetFile)

step = 3
dirPath = "C:/Users/kubo/Desktop/New Folder/"
seqFiles = []

for item in os.listdir(dirPath):
    if os.path.isfile(os.path.join(dirPath, item)):
        seqFiles.append(item)

sorted(seqFiles)
overwiteStepFrames(step,seqFiles,dirPath)
```

こんな感じの出力結果に上記を実行してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e681b749-14d9-1d72-3cd6-f5079ded9042.png)

はいで来ました。
ただオリジナルのファイルを上書きしてしまうので、別フォルダに出力にした方が安全ではあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f4431a9c-b9bc-7654-e8d8-b7b49099caf9.png)


うーん　もう少しだけ続く？
Google Drive APIの紹介

＃ はじめに
皆さんはGoogle Drive APIをご存知でしょうか。このサービスはGoogle Drive上のファイルを操作することのできるREST APIです。また、このサービスは無料で利用できるのでAPIに興味のある方にはぜひお勧めしたいと思います。ではこれより実際にGoogle Drive APIを利用するための設定とGoogle Drive APIを使用する上でのメリットを紹介していこうと思います。



＃ Google Drive APIの設定
Google cloudからGoogle Drive APIを有効にする方法を紹介していきます。
1.Googleアカウントを作成します。（すでにGoogleアカウントがある方はログインでいいです。）
2.google developer consoleにアクセスします。
以下google developer console link
https://console.developers.google.com/
3.ライブラリにてGoogle Drive APIを有効にします。
4.認証情報を作成する。認証情報の作成の欄をクリックしその後　OauthクライアントIDを選択して設定します。
5.同意画面設定をクリックします。そこにてアプリケーション名やアプリケーションのロゴの設定等を行います。
6.pip installする。

以上の6つのステップにてGoogle Drive APIが使用することができます。

#まとめ
今回はGoogle Drive APIの紹介と使用するための簡単な接待方法の手順について紹介しました。今回の手順の最中にあるOAuthクライアント情報のクライアントIDとクライアントシークレット情報はとても重要ですので鍵情報の保管には注意してください。

参考文献
https://zenn.dev/wtkn25/articles/python-googledriveapi-auth
Git 特定のコミットを取り込む(cherry-pick) と コミットをまとめてマージ(merge --squash)

## 特定のコミットだけを取り込みたい！(cherry-pick)
git cherry-pick は特定のコミットのみを取り込みたいときに使用します。
![スクリーンショット 2023-12-18 10.16.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655825/507efc18-ed99-3440-a04a-83e064ce19b8.png)
上の図で自分がブランチ2(作業ブランチ)で複数コミットをして、そのうちのコミットA,Bのみを親ブランチであるブランチ1に含ませたいとき、git cherry-pickが有効です。
<br>
差分を取り込みたいブランチ(図の場合ブランチ1)に移動し、取り込みたいコミット番号を指定してcherry-pickをします。(オレンジはコミット番号です)
```

git checkout ブランチ1
git cherry-pick abcd0001 abcd0002

```
これだけで指定したコミットを取り込むことができます。また、このときログを見ると新たなコミット番号が追加されています。取り込んだ後にコミットまでされるので、一旦差分のみ取り込みたいときは`-n`オプションをつけることで解決できます。

```
git cherry-pick -n abcd0001 abcd0002
```

![スクリーンショット 2023-12-18 10.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655825/f69dc97d-fa17-461f-9a11-d77419d242f2.png)


また、連続したコミットを取り込みたいときは...

```
git checkout ブランチ1
git cherry-pick abcd0001..abcd0004
```

とすると連続したコミットを取り込むことができます。

<br>
## コミットをまとめたい！(merge --squash)

普通のマージとスカッシュマージの違いについて

下図のような状態があったとします。
![スクリーンショット 2023-12-18 10.23.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655825/0f8846e1-4b34-3dfc-3649-c0397c57431d.png)


ブランチ2で作業をして、ブランチ1にマージするとき

```
git checkout ブランチ1
git merge ブランチ2
```


をしたとき、当たり前ですが、ブランチ1にブランチ2の差分がマージされます。このとき、B,C,Dのコミットはそのままマージされるので、ブランチ1でgit log を確認すると3つのコミットのログが確認できると思います。

![スクリーンショット 2023-12-18 10.24.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655825/dc66d761-d7d5-d030-4c27-10e2f2e4e982.png)

<br>
これでも問題ないのですが、例えば、ちょっとした修正がありコミットが多くなると、細かいコミットが何個も生成され、ログも増え、確認したいときに困惑することがあるかもしれません。
<br>
<br>
<br>
そこで、複数コミットを1つにまとめる、**squash merge**を使います。使い方は先ほどのmergeコマンドにオプションを指定するだけです。

```
git checkout ブランチ1
git merge --squash　ブランチ2
```


![スクリーンショット 2023-12-18 10.24.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655825/8f46467c-035f-fb9c-07bf-dc7c85f3382a.png)

<br>
<br>
ログはすっきりしますが、変更箇所が分かりにくくなるというデメリットもあるので、故意にコミットを細かく分けているときは気をつけた方がいいかもしれません。
JavaScript: テキストフィールドに入力した日本語の確定と変換後の[enter]キーの押下を切り分ける

たとえば、検索ボックスに入力した語句を、[enter]キーの押下で検索実行したい場合があります。日本語の入力では、[enter]キーの操作を変換の確定とは切り分けなければなりません。


# 結論: `KeyboardEvent.keyCode`プロパティで[enter]キーを調べる
日本語入力が確定したあとの[enter]キーの押下かどうかは、[`KeyboardEvent.keyCode`](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/keyCode)プロパティで調べるのがよいでしょう。テキスト入力フィールド(`<input type="text">`要素)が変数`eventTarget`で参照されている場合は、つぎのようなコードです。

```js
eventTarget.addEventListener('keydown', ({ keyCode }) => {
	if (keyCode === 13) {
		// 日本語入力確定後の[enter]キーの処理
	}
});
```


# `KeyboardEvent.keyCode`プロパティは非推奨
ところが、話は簡単ではありません。mdnのドキュメント「[KeyboardEvent: keyCode プロパティ](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/keyCode)」には、いきなりこう書かれています。

> **非推奨**: この機能は非推奨になりました。

とはいえ、情報を検索してみても、`KeyboardEvent.keyCode`プロパティ以外の妙案は見つかりませんでした。それどころか、mdnの「[Element: keydown イベント](https://developer.mozilla.org/docs/Web/API/Element/keydown_event)」のページには、以下のようなコード例が示されています。

> 変換操作中の`keydown`イベントをすべて無視するには、次のようにしてください（229は、IMEによって処理されたイベントに関連する`keyCode`に設定される特別な値です）。

```js
eventTarget.addEventListener("keydown", (event) => {
	if (event.isComposing || event.keyCode === 229) {
		return;
	}
	// 何かを行う
});
```


# `KeyboardEvent.isComposing`プロパティは変換中であるかどうかを示す
上記mdnのコード例で気になるのは、[`KeyboardEvent.isComposing`](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/isComposing)プロパティです。変換操作中であるかどうかをブール値で示します。このプロパティを使えば、`KeyboardEvent.keyCode`に頼らなくて済むのではないでしょうか。何より「非推奨」ではありません。

けれど、今のところ最大の難点は、値がブラウザによって異なることです。具体的には、Safari / macOSで起こります。連文節中のひとつひとつの語句を変換しているときは、`KeyboardEvent.isComposing`プロパティの値は`true`です。ところが、連文節全体の変換を確定したとき、Safariでは`false`が返されてしまいます。本稿冒頭の検索ボックスの例でいえば、検索が実行されるということです。

環境によって結果はバラつくことが想定されます。興味のある方は、つぎのサンプルでお試しください。mdnのコード例でも認めているように、`KeyboardEvent.isComposing`プロパティの値がブラウザ間で揃うまでは、`KeyboardEvent.keyCode`を用いるしかないでしょう。

#### サンプル■JavaScript: Handling the enter key with IME
<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="rNPbRQd" data-user="FumioNonaka" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/FumioNonaka/pen/rNPbRQd">
  JavaScript: Handling the enter key with IME</a> by Fumio Nonaka (<a href="https://codepen.io/FumioNonaka">@FumioNonaka</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
trocco のカスタム変数ループ実行で BigQuery に作成した UDF をコピーする

※ この記事は [trocco® Advent Calendar 2023](https://qiita.com/advent-calendar/2023/trocco) シリーズ2 、 [Yappli Advent Calendar 2023](https://adventar.org/calendars/9554) （2枚目）の 20 日目の投稿です。

この記事では、 trocco の [カスタム変数ループ実行](https://documents.trocco.io/docs/loop-using-custom-variables) を使い、 BigQuery に作成した UDF をコピーする方法について記します。

## 何が嬉しいのか

UDF の別データセットへのコピーを手軽に行えることです。

例えば、 BigQuery でデータセットを複製する場合、 BigQuery DataTransfer Service が手段として挙げられます。しかし、 2023年12月現在、 BigQuery Data Transfer Service ではルーティンはコピーされません。 UDF もコピーしたい場合、この記事の方法を用いることで実現することができます。

## どうやって実現しているのか

ルーティンの情報は `INFORMATION_SCHEMA.ROUTINES` というテーブルに記録されています。このテーブルの `ddl` というカラムに、 UDF を作成した際の DDL が格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489030/1f750299-48a2-be16-d86b-1cdcd106a8c7.png)

trocco のカスタム変数ループでこの `ddl` カラムの値をカスタム変数に渡し、カラムの値＝DDLを trocco のデータマート定義で実行します。これにより、 `ddl` カラムに入っていた DDL がループで実行されていき、 UDF が作成されていきます。

## 手順

まず、trocco に次のデータマート定義を作成します。

* カスタム変数: `$ddl$`
* プロジェクトID: コピー先の BigQuery 接続
* 実行クエリ: `$ddl$`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489030/3bc07056-6670-8da9-57ef-fdd9b20874d5.png)

次に、作成したデータマート定義を使ってワークフロー定義を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489030/0f535822-485d-dfd9-527c-2ba7ebafe66e.png)

最後に、カスタム変数ループを次のように設定します。

* ループの種類: 「Google BigQueryのクエリ結果でループ」
* 対象カスタム変数: `$ddl$`
* Google BigQuery接続情報: コピー元の BQ 接続
* クエリ:

```sql
SELECT
  REPLACE(
    ddl,
    "CREATE FUNCTION `SOURCE_PJ_ID`",
    "CREATE OR REPLACE FUNCTION `DESTINATION_PJ_ID`" -- REPLACE も入れることで、ワークフローの再実行に対応
    ) AS ddl -- プロジェクトIDをコピー先のものに変更
FROM
  `SOURCE_PJ_ID.SOURCE_DATASET`.INFORMATION_SCHEMA.ROUTINES
ORDER BY
  created -- 作った順に登録することで、 DDL 内で別の UDF が参照されていた際のエラーを回避する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489030/195b3554-ef85-d7be-253c-f687eb1d28dc.png)

手順は以上です。あとは、この状態でワークフローを実行すれば UDF をコピーすることができます。

## 結び

今回は trocco のカスタム変数ループ実行で BigQuery に作成した UDF をコピーする方法について記しました。

実は、今月は trocco のカスタム変数ループ実行と BigQuery の `INFORMATION_SCHEMA` を組み合わせた記事をもう1本書いています。

https://qiita.com/yamamoto-yuta/items/474e03cd28dec55fd5a2

この組み合わせ、思いの外汎用性が高いかもしれません。今後も色々試してみようと思います。

もし記事内に誤りがあったり、もっと適切な方法があったりしたらコメント等でご教示いただければ幸いです。

ここまでお読みいただきありがとうございました :bow:
ロックされたレポートフィルタ


+ [なぜ「ロック」ではないのかレポートのフィルターは機能していますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UpK5H)

私は管理者で、レポートを作成し、パブリック フォルダーに保存しました。ロックしておきたいフィールドが 1 つあります、それはレコード タイプ フィールドです。ユーザーがフィルターを追加/変更できるようにしたいのですが (既存のレポートを保存することはできませんが、自分の個人フォルダーに保存することはできます)、レコード タイプが常にフィルターされていることを確認したいと考えています。レポート作成時に「ロック」にチェックを入れました。フィルター上のボックス。 

 

ただし、ユーザーがレポートを実行すると、(ロックされたアイコンが表示されていても) このフィルターを編集および削除できます。レポート フォルダーはパブリック グループと共有されており、そのグループには「表示」権限があります。アクセスのみ。プロファイルのシステム設定を確認しました - プロファイルには「表示」があります。パブリックフォルダーへのアクセスは可能ですが、すべての「管理」が許可されていることを確認しました。権限はチェックされません。権限の観点から何が足りないのでしょうか?それとも「ロック」されているのでしょうか？フィルタ機能がそのように機能しないのですか


+ [ロックされたレポートフィルターを削除する方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Dykq8SAB)

:::note
レポートのリンク/URL を見ると、URL に奇妙なテキストが追加されています。それはロックされたフィルターです。そのため、別のレポートとして保存する場合でも、URL にこの奇妙なフィルターが追加されます。 URL に追加されたこのテキストを削除すると役に立ちます。 
:::

+ [ロックされたフィールド値がライトニングレポートのクエリパラメータとして受け入れられない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8DWGSA3)

2019年　この機能は classic で動作していますが、lightning に移行すると動作しなくなります

念のために言っておきますが、これは Winter 19 では機能していました。Spring 19 アップデートの時点で、ロックされたレポート フィルターが渡されたパラメーターを受け入れなくなったとユーザーから報告がありました。

これは設計によるものであり、フィルタ ロックの意図によるものです。 https://help.salesforce.com/articleView?id=reports_builder_filtering.htm&type=5 には、 と記載されています。 「Lightning Experience でレポートを表示中に ユーザがフィルタを編集できないようにフィルタをロックまたはロック解除する」。
 

そのため、これは Spring 19 より前は意図したとおりに機能していなかった可能性が高く、URL パラメーターによるレポートの変更を許可すると、フィルター ロックの抜け穴になる可能性があります。これを解決する唯一の方法は、リンクされたレポートのフィルターのロックを解除することです。これにより、URL パラメーターがフィルターを更新できるようになります。
AWS IAM Identity Centerを使ってAWSアカウントを本気で守る

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではAWS IAM Identity Centerに関連する内容を超詳細にまとめています。

具体的には以下流れで説明します。

- AWS IAM Identity Centerとは
- AWS IAM Identity Centerの仕組み
- AWS IAM Identity Centerの活用
- AWS IAM Identity Centerのベストプラクティス

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- AWS IAM Identity Centerがどういうサービスか説明できるようになりたい人
- AWS IAM Identity Centerを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# AWS IAM Identity Centerとは
AWS IAM Identity Centerとは、AWSのマルチアカウント環境で、ユーザーとアプリケーションのアイデンティティとアクセス管理を簡単に行えるサービスです。

![](https://storage.googleapis.com/zenn-user-upload/11af238353ee-20231218.png)

AWS IAM Identity Centerは、AWS Organizationsと連携して、組織内のすべてのアカウントに対して一元的に権限を付与したり、アプリケーションを割り当てたりすることができます。

また、属性ベースのアクセス制御（ABAC）を利用して、ユーザーの属性やコンテキストに応じて柔転なアクセスポリシーを設定することができます。

# AWS IAM Identity Centerの仕組み
AWS IAM Identity Centerの仕組みは、以下のようになっています。

## マルチアカウント権限
AWS Organizationsで管理されているマスターアカウントから、メンバーアカウントに対してIAMロールを作成し、信頼関係を設定することで、マスターアカウントからメンバーアカウントへの権限委任が可能になります。
このようにして、マスターアカウントでユーザーを管理し、メンバーアカウントでリソースを管理することができます。

## アプリケーションの割り当て
AWS IAM Identity Centerでは、AWS SSOやAWS Cognitoなどのアイデンティティプロバイダーと連携して、ユーザーに対してアプリケーションを割り当てることができます。
アプリケーションは、AWSサービスやサードパーティのSaaSサービスなどが対象になります。
アプリケーションの割り当ては、ユーザーの属性やグループに基づいて行うことができます。

## 属性ベースのアクセス制御
AWS IAM Identity Centerでは、ABACを利用して、ユーザーの属性やコンテキストに応じて柔転なアクセスポリシーを設定することができます。
属性は、ユーザー名や所属部署、役職などの情報を指し、コンテキストは、時間や場所、デバイスなどの状況を指します。
属性やコンテキストは、タグや条件演算子を使ってポリシーに組み込むことができます。

# AWS IAM Identity Centerの活用方法
AWS IAM Identity Centerの活用方法は、以下のようなシナリオが考えられます。

## 組織内で共通の権限管理基準を適用したい場合
マスターアカウントからメンバーアカウントに対してIAMロールを作成し、信頼関係を設定することで、組織内で共通の権限管理基準を適用することができます。
例えば、開発者グループに対しては開発用アカウントへのフルアクセス権限を付与し、運用者グループに対しては本番用アカウントへの読み取り専用権限を付与するといった使い方です。

## ユーザーに応じて必要なアプリケーションへのアクセスを提供したい場合
AWS IAM Identity Centerでは、ユーザーに対して必要なアプリケーションへのアクセスを提供することができます。
例えば、営業部のユーザーに対してはSalesforceやGmailなどのSaaSサービスへのアクセスを割り当て、開発部のユーザーに対してはAWSコンソールやGitHubなどの開発ツールへのアクセスを割り当てるといった使い方です。

## ユーザーの属性やコンテキストに応じてアクセス制御を行いたい場合
AWS IAM Identity Centerでは、ABACを利用して、ユーザーの属性やコンテキストに応じてアクセス制御を行うことができます。
例えば、所属部署や役職に基づいてリソースへのアクセスレベルを変更したり、時間や場所に基づいてリソースへのアクセス可能性を変更したりするといった使い方です。

# AWS IAM Identity Centerのベストプラクティス
AWS IAM Identity Centerのベストプラクティスは、以下の表にまとめられます。

|ベストプラクティス | 説明|
|--- | ---|
|最小限のアクセス権限の適用 | ユーザーには必要最小限のアクセス権限を付与します。|
|マルチファクタ認証の使用 | セキュリティを強化するために、マルチファクタ認証（MFA）を適用します。|
|定期的なアクセス権のレビュー | 定期的にアクセス権をレビューし、不要な権限を削除します。|
|ABACの利用 | 属性ベースのアクセス制御を活用して、より細かくアクセスを制御します。|
|統合ID管理の採用 | 既存のID管理システムとの統合を通じて、ユーザー管理を効率化します。|


# まとめ
この記事ではAWS IAM Identity Centerに関連する内容を超詳細にまとめました。

- AWS IAM Identity Centerとは
- AWS IAM Identity Centerの仕組み
- AWS IAM Identity Centerの活用
- AWS IAM Identity Centerのベストプラクティス

次回はAWS WAFを超詳細解説します。
【UiPath】iOSショートカットからジョブを実行してみた


みなさん、こんにちは。:santa:

UiPathのiOSアプリでOrchestratorがあるのは皆さんご存じでしょうか。
![IMG_7224.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/1b8fb1c5-ff74-4d31-eda5-bc0859dfaae6.png)


このアプリはiPhoneからOrchestratorの操作ができるアプリです。
スクショを見ると、ダッシュボード、プロセス、ジョブ、トリガー、、、などさまざまな機能にアクセスが可能です。（詳しくは使ってみてね～）
![IMG_7228.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/4bc2ab28-88dc-accd-8ff3-43c3c52838aa.png)

今回はiOSアプリOrchestratorから、iOSショートカットにジョブを登録できたので、
iOSショートカット内の「オートメーション」を利用して、登録したショートカット（ジョブ）を起動させようと思います。

具体的には、会社に一定範囲近づいたら（出勤したら）、タイムカードの打刻を起動することをやってみます。


ジョブ→ジョブの詳細から、iOSショートカットに入れたいジョブを選択したら、
「ジョブをお気に入りに追加」を押します。
![IMG_7225.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/d0818fdb-6e1b-3ea9-faf1-2add59124c11.png)

そうすると、アプリ内の「クイックアクセス」にお気に入りしたジョブが登場するようになるので・・・
![IMG_7226.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/bacc54bc-d8d0-6b00-eed6-11b832230b87.png)

ここから、ジョブの右上にある、点々3つから下のメニューがでてきて「Siriに追加」がでます。
![IMG_7230.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/d9f4b487-b2f9-383b-809e-25332d3c4d84.png)

こんな感じで追加ができます。笑
音声から起動もできるなんて便利ですね～。かっこいい必殺技名で登録してもいいかもしれません。「オペレーションクロノス発動！」とかね。完全不審者だけど笑
Siriから起動なので、アップルウォッチから起動することなんかも可能です。
![IMG_7231.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/920d9b5e-a6af-ee56-9ba6-ec36fc651773.png)

さて、iOSのショートカットに登録ができたら、iOSショートカット内の「オートメーション」を作成してみましょう。オートメーションの作り方は、ネットで探すとでてくるのでここでは割愛します。

私はこんな感じに設定しました。
出勤する時間の幅を指定し、かつ、時刻内に自分が指定住所に使づいたら、ジョブを実行させます。
![IMG_7233.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654526/0470ebc7-f35f-6b41-4e8d-4eb1a140efd0.png)

実行されたジョブは私のPC端末で起動し、自社の勤怠管理システムへログイン、
そして、出勤・在籍ボタンを押してくれるようになりました。席に着くころにはジョブは終わってます。
わー便利便利。

タイムトリガー、キュートリガー、イベントトリガー、最近はAPIトリガー
なんてありますが、これは、場所トリガーなんて分類されたりして笑

まあでも、事前にStudioX等で、プロセスを作ってしまえば、
比較的簡単に、iOSショートカットの登録が簡単なので、なんか使い道ありそうだなーとは思いました。
ハイキングのワークアウト開始したら、登山計画書まで勝手に作って、県警まで出してくれる～とか。
ジムに到着したら、レッスンの予約しておく～とか。

みなさんもアイデアあればコメントください笑

ではまた～。
AI-102試験対策のまとめ「Azure AI Visionにおける配色の検出」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### Azure AI Visionにおける配色の検出
* Azure AI Visionでは色に関して下記を検出
    - ドミナントカラー：画像内のメインの色
    - アクセントカラー：画像内で最も鮮やかな色
    - 白黒の評価：true/false

#### **ドミナントカラー**
* イメージ内の色が分析され、3種類の色セットと属性が利用可能
    - 前景のドミナントカラー
    - 背景のドミナントカラー
    - イメージのドミナントカラー
* 検出可能な色は特定の色のセットのみ
    - 白、グレー、茶、黒、ピンク、赤、オレンジ、黄、緑、青緑、青、紫

#### **アクセントカラー**
* ドミナントカラーセットと彩度の組み合わせに基づき抽出
* 16進数のHTMLカラーコードとして返される

#### **APIの利用**
* 配色検出機能はAnalyze Image APIに含まれている
* ネイティブSDK/RESTを呼び出すことでAPI呼び出し可能
* `Color`を`visualFeatures`クエリパラメータに追加して使用

<br>

* 参考
    - https://learn.microsoft.com/ja-jp/azure/ai-services/computer-vision/concept-detecting-color-schemes

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Azure AI Video Indexerのショット/シーン/キーフレーム検出」**

https://qiita.com/fsd-jume/items/fab8f77eb50e3be9f938

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d