OmniAICreator/Qiita-1.07M huggingface dataset:
AI Builder の AI モデルごとのクレジット使用量目安まとめ (2023/7 更新)

# 本記事の目的
AI Builder で提供される複数の AI モデルには、モデルごとに消費されるクレジットが異なります。
本記事では、Microsoft が提供する AI Builder のクレジット計算ツールで確認した情報をもとにモデルごとのクレジットの使用量を調査した結果をまとめています。

# 免責事項
この記事は、2023 年 7 月時点の AI Builder のクレジットの概算を計算するツールで確認された情報をもとに作成しています。
あくまで概算であり、計算方式や実際に使用されるクレジットと異なる可能性があります。
本記事の内容はあくまで現時点における目安として参照いただき、正確な内容を確認したい場合は、マイクロソフトに確認をお願いします。

https://powerapps.microsoft.com/ja-jp/ai-builder-calculator/


# クレジットの考え方
クレジットは、使用する AI モデルごとに異なります。
例えば、AI Builder のクレジット計算ツールにおいて、文書を解析するエンティティ抽出モデルでは、40,000 件で 1 ユニット (100 万クレジット) を必要とする旨の記載があります。

**[エンティティ抽出の使用例]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/7079397b-3930-ac34-e12e-2a50b86d461a.png)
※ https://powerautomate.microsoft.com/ja-jp/ai-builder-calculator/ から画像抜粋

PDFや画像の領収書から文字を抽出する領収書処理モデルでは、2,000 件で 1 ユニット (100 万クレジット) が必要とするといった記載があります。


**[領収書処理の使用例]**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547452/f7997b16-7567-aaaa-d0a8-b1deff9f4dc4.png)
※ https://powerautomate.microsoft.com/ja-jp/ai-builder-calculator/ から画像抜粋

上記の通り機能ごと消費されるクレジットが異なります。以下の項目では、このモデルごとのクレジット使用量を一覧にしてまとめます。

# AI モデルごとのクレジット使用量
計算ツールを用いて確認した AI モデルごとのクレジットは以下のとおりとなります。(2023 年 7 月現在)

| AI モデル名 | 1 ユニットで処理できる量 |単位 | 単位あたりのサービスクレジット |
|:-----------|------------:|:------------|------------:|
| 名刺リーダー            | 31,250   | 枚                                    | 32    |
| カテゴリ分類            | 50,000    | テキスト文字列                        | 20    |
| エンティティ抽出        | 50,000    | テキスト文字列                        | 20    |
| ドキュメント処理            | 10,000     | 枚                                    | 100    |
| ID ドキュメント リーダー| 31,250    | 件                                    | 32    |
| 画像の分類| 250,000    | 件                                    | 4    |
| 請求書処理              | 31,250     | 枚                                    | 32    |
| 重要なフレーズを抽出    | 500,000    | テキスト文字列                        | 2    |
| 言語を検出      | 500,000    | テキスト文字列                        | 2    |
| オブジェクト検出        | *1   |                                 |     |
| 予測                    | *2  | |     |
| 領収書処理              | 31,250    | 件                                    | 32    |
| センチメント分析        | 500,000    | テキスト文字列                        | 2    |
| テキスト認識            | 333,333    | 枚                                    | 3    |
| テキストの翻訳          | 50,000    | テキスト文字列                        | 20    |

*1  モデル数とトレーニングする画像数、処理する画像数に応じて決定する
*2 モデル数と予想される結果数、予測の更新頻度に応じて決定する

# おわり
AI Builder には、新たなモデルの追加や日本語への対応など多くのアップデートが行われています。
容易にノーコードで AI 機能を利用することできる大変魅力的なツールですので、今後のアップデートも楽しみです。
100日後くらいに個人開発するぞ！day042

## 今日は配列と繰り返し処理をやってみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/d862e127-a4f6-bdbb-91c4-8f3f589c27d0.png)


## 今日の学び

### 配列
* 配列は複数の値をまとめて管理することができる
* 配列は[値1,値2,値3]のように作る
* 配列に入っているそれぞれの値を要素と呼ぶ
* 配列は値の一種なので変数に代入することができる
* 配列を代入する変数名は複数形にすることが多い
* 配列の要素の値も変数展開を用いて文字列の中に含められる
    * 例："私の名前はYamadaです"と出力したい場合
        * `names=["Yamada","Suzuki","Tanaka"]`
        * `puts "私の名前は#{names[0]}です`


### インデックス番号
* 配列の要素には前から順に「0,1,2,...」と数字が割り振られており、その番号をインデックス番号という
* インデックス番号は0から始まる
* 配列の各要素を`配列[インデックス番号]`で用いることができる
    * 例：names配列の0番目の要素を出力したい場合
        * `names=["Yamada","Suzuki","Tanaka"]`
        * `puts names[0]`

### 繰り返し処理
* 繰り返し処理とは配列の要素を順番に取り出して処理を行うこと
* 繰り返し処理にはeach文を使う
* each文は以下のように記述する
    * `配列.each do |変数名|`
    * `end`
* 例：全ての要素それぞれに関して「００語を話せます」と出力したい場合
    * languages = ["日本語", "英語", "スペイン語"]
    * languages.each do |language|
    * puts "#{language}を話せます"
    * end
* each文で定義した変数はeach文の中でしか使えない


### スコープ
* 変数が使用できる範囲のことをスコープと呼ぶ
* each文で定義した変数のスコープはeach文の中のみ
Serverless Framework で、APIのパスの変数を変更した時にエラーが発生する問題を解決する

Serverless Framework を使っていて、

既にデプロイしている API のパスを更新しようと、パスの変数を `/users/query/{userId}` から、`/users/query/{teamId}` に変更した時に、

Before
```
  users:
    handler: src/users.handler
    events:
      - httpApi:
          path: '/users/query/{userId}'
          method: GET
          authorizer:
            name: cognitoAuthorizer
```

After
```
  users:
    handler: src/users.handler
    events:
      - httpApi:
          path: '/users/query/{teamId}'
          method: GET
          authorizer:
            name: cognitoAuthorizer
```

下のようなエラーが発生した。同じメソッドで同じパスの時に変数名だけ変更しようとすると発生する。

```
 Serverless Error ----------------------------------------
 
  An error occurred: HttpApiRouteGetUsersQueryTeamidVar - The provided route key "GET /users/query/{teamId}" has a conflicting variable on the same hierarchical level as "GET /users/query/{userId}" (Service: AmazonApiGatewayV2; Status Code: 409; Error Code: ConflictException; Request ID: 8f2813aa-9e77-44e0-835a-171a7cf9d925; Proxy: null).
```

## 解決方法

この Issue にも書いてある通り、一旦該当の API をコメントアウトしてデプロイし、再度コメントアウト戻して削除するとデプロイできる。

> Workaround for now:
Comment out the function from your serverless.yml, run a full deployment. This will delete the API gateway endpoint entirely, and then you can uncomment the function and run a deployment to deploy the new function with the new pathParam.

https://github.com/serverless/serverless/issues/3785#issuecomment-340784848
ヴァイパーゲーム【C++】

C++でヴァイパーゲーム(毒ヘビゲーム)というオリジナルゲームを制作しました。
このゲームは[ヘビゲーム](https://g.co/kgs/Mbckc9)を題材に、**毒**を吐いて相手の妨害を行いながら、ヘビを長くしていくゲームになります。
![概要プレイ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1495498/a3683658-f4b3-4383-0109-36d1ae814808.gif)
ソースコードとゲームのダウンロードは[こちら](https://github.com/kaito11201/ViperGame)になります。

# ルール

## 勝利条件
- **エサ(*)を食べて、身体の長さを20にすると勝利**
- **制限時間が過ぎた後、相手より身体が長いと勝利**

## 敗北条件
- **壁にぶつかる**
- **相手にぶつかる**
- **相手の毒に触れる**
- **自分の身体にぶつかる**

## その他
- **当たり判定は全て頭**
- **毒は自分の身体を消費して発射する(身体が短くなる)**
- **進行方向の逆方向には進むことができない**

# プレイ動画
実際にプレイしている動画が[こちら](https://youtu.be/4HVxweuYMaI)になります。
対戦要素の追加で、奥深さと難しい様子が伝わってくると思います。

# 制作背景
[こちら](http://vivi.dyndns.org/tech/cpp/cpp.html)のサイトでC++の勉強をしようと思ったところ、題材にヘビゲームがあったのがきっかけです。
ただ写経するだけでは身にならないという点と、せっかく作るなら何度もプレイしたくなるような面白いゲームを作りたい！という点から制作しました。

# 制作時の考え
1人用ゲームかつ単調でつまらない → **2人用ゲームにしよう** → ただエサを集めてスコアを競うと[Slither.io](https://ja.wikipedia.org/wiki/Slither.io)の劣化では → ヘビは毒で攻撃する → **毒を吐いて相手の妨害をしよう** → 毒を吐きまくれば有利になるのでは → **毒を吐いたら身体を縮めよう** →　エサを食べて身体を伸ばし続けるメリットがない → **一定の長さになったら勝ちにしよう** → 毒の妨害と長さの要素で長期戦になる → **制限時間を設けよう**
このゲームを制作するにあたって、以上のような思考回路で新要素を入れたり、ルールを変更したりしてました。

# ポイント
このゲームの面白いポイントは、勝ち筋が3つあるところです。
「制限時間による勝利」は、制限時間が過ぎた後、身体が長い方が勝利になります。長時間相手の妨害を避けつつ、ある程度エサを取って長さも保たないといけないので、ミスが許されない勝ち方になります。
「毒による勝利」は、毒を吐き続けて、相手の行動範囲を制限し、ミスを誘う勝ち方になります。毒を吐くと、自分の身体が縮むので、他の勝ち方ができなくなる欠点があります。
「長さによる勝利」は、身体が一定の長さになるまでエサを食べ続ける勝ち方です。身体が長くなると、行動範囲に制限がかかってしまい、ミスをしやすくなる欠点があります。
どの勝ち方を選ぶかによってプレイヤーの行動が変化するので、単純なゲームにならず、何度もプレイしたくなるようなゲーム設定の工夫をしました。

# まとめ
今回は、ヘビゲームにオリジナル要素を足したヴァイパーゲームを制作しました。
今後はグラフィックスライブラリや、Unityなどのゲームエンジンを用いて、見た目の向上や、シーン遷移などの要素も追加していこうと考えています。
現時点でも十分に面白いので、是非友達と肩を並べながらプレイしてみてください。

# 参考URL
- [スネークゲーム](http://vivi.dyndns.org/tech/games/snake.html)
【Git】in unpopulated submodule解消法

## 状況
`git add`を実行した際に以下のように出力され、`git add`を正常に実行できませんでした。

```:ターミナル
$ git add .
fatal: in unpopulated submodule 'sample_app'
```

## 解消法
以下のように実行することで解消しました。
```:ターミナル
$ git rm -rf --cached sample_app
$ git add .
```
【Rust】serde_jsonを使ってjsonから一部の項目だけ取得する

## 概要
Rustでjsonを読み込む際は、[RustでJSONを読み込みVecにデシリアライズする](https://swiswiswift.com/2021-12-01/)の記事にある通り、デシリアライズ対象のstructを用意した上で、`serde_json`を使って変換するという流れになると思います。
ただ、外部のAPIから情報を取得するときなど、レスポンスの全項目は不要というケースもあるかなと思い、その場合はstructを用意せず、対象の項目だけ取得できれば十分な時もあります。今回はserde_json`を使ってjson中の一部項目だけ取得する方法を紹介します。


## 対応方法
serde_jsonのReadMeの[Operating on untyped JSON values](https://github.com/serde-rs/json#operating-on-untyped-json-values)の項にある通り、jsonを一旦`serde_json::Value`で読み込むことで、指定した項目を取得できます。

## 実装サンプル
実装サンプルとして、以下のサンプルのjsonからresultsのidのみを抽出します。

```json:sample.json
{
  "count": 2,
  "results": [
    { "id": "id1", "name": "name1" },
    { "id": "id2", "name": "name2" },
    { "id": "id3", "name": "name3" }
  ]
}
```

```rust:sample.rs
pub fn sample_method(json: String) -> Result<Vec<String>, Box<dyn Error>> {
    let mut result_vec: Vec<String> = Vec::new();
    let v: serde_json::Value = serde_json::from_str(&json)?;

    let empty_vec: Vec<serde_json::Value> = Vec::new();
    // resultsの配列を取得
    let results = v["results"].as_array().unwrap_or_else(|| &empty_vec);
    for r in results {
        // jsonからidを取得
        let id = r["id"].as_str().unwrap();
        // 結果をVecに追加
        result_vec.push(id.to_string());
    }
    return Ok(result_vec);
}
```
shell 備忘録

## shellファイル作成
```sh
cd /home/
echo $SHELL
which bash > test.sh
chmod +x test.sh
```
```sh
more test.sh
/usr/bin/bash

1行目を編集
vi test.sh

編集後の内容
# more test.sh
#!/usr/bin/bash

```
|項目|説明|備考|
|----|----|----|
|#!/usr/bin/bash|シバン|シェルスクリプトの1行目に必ず書かなくてはいけない|
### Vim 操作早見表
https://qiita.com/YuichiTanaka007/items/60899ed3d3369a70cca2

## コメント
```sh
#コメント
```
## 変数
```sh
STR1="aaa"
echo "$aaa"

```


## パラメータ
```
#!/bin/bash
echo '$1 =' "$1"
echo '$2 =' "$2"
echo '$3 =' "$3"
```



## 外部ファイルから値を参照
```dev_file.txt
AAA1="a"
BBB1="b"
CCC1="c"
```

```test.sh
#!/usr/bin/bash
source ./dev_file.txt
echo ${AAA1}
echo ${BBB1}
echo ${CCC1}
```
## うまくいかない時
|項目|説明|備考|
|----|----|----|
|シバン|1行目が「#!」になっていない||


## リンク
https://qiita.com/b4b4r07/items/9ea50f9ff94973c99ebe

https://qiita.com/u-dai/items/5b2b23de29481bd9ac73

### 2>&1
https://qiita.com/TomohiroSaito/items/1393ce5a01b75adcbf30

## expect
https://qiita.com/ine1127/items/cd6bc91174635016db9b

https://www.softel.co.jp/blogs/tech/archives/1407

|項目|説明|備考|
|----|----|----|
|-c オプション|シェルの中でexpectを動かす場合は、-c オプションを付けます。|expectで処理する内容を "(ダブルクォーテーション) で囲みます|
|{}|複数行で書く場合はブレース{}で囲む。1行で書けるときは付けない。||
|set timeout|デフォルトのタイムアウトする秒数を指定します。<br />指定しない場合は10秒となっています。|
|spawn|expect内でプロセスを生成するコマンドです。|
|expect|expectスクリプトで、マシンからの応答を読み取り、パターンマッチをする時に利用します。<br />パターンマッチはswitch文、case文と同様の処理が実現できます。|
|-glob|globを使います。デフォルトではこれが指定されています。|
|-regexp|正規表現を使います。|-re|
|-exact|globや正規表現の展開方法を使わず、基本的に文字をそのまま解釈します。<br />Tclの変数展開は利用可能です。|
|send|マシンに文字列を返答するコマンドです。|
|exit|expectの処理を終了させ、返り値として指定した数字を返します。|

## 終了ステータス
https://shellscript.sunone.me/exit_status.html
|項目|説明|備考|
|----|----|----|
|$?|コマンド終了時には「終了ステータス　(exit-status)」と呼ばれるコマンドの成否を表す数値が特殊変数 $? に自動で設定される||
|exit |シェルスクリプトでは exit コマンドに指定したパラメータ (0 もしくは 1～255 の正の整数値のみ可) が、そのシェルの終了ステータスとなる。シェルスクリプトにおいても正常終了時は exit 0 で、異常終了時には exit 1 で終了するようにするのが慣例である。||
TypeScriptのファイルでVueファイルをimportしようとすると「Cannot find module '~~~~~' or its corresponding type declarations.」のエラーが出てしまう。

```vue:App.vue
<template></template>

<script lang="ts">
import { defineComponent } from 'vue'

export default defineComponent({
    setup() {
        
    },
})
</script>
```
```typescript:main.ts
import { createApp } from "vue";
import App from "./App.vue";

createApp(App).mount("#app");
```
上記のようにmain.tsでApp.vueをimportしようとすると、main.tsの2行目「"./App.vue"」部分に
```
Cannot find module './App.vue' or its corresponding type declarations.
```
のエラーが出てしまう。

これはmain.tsがApp.vueをTypeScriptとして扱えないことが原因である。（よく考えると拡張子が異なるからそりゃ扱えないよね...）

解決法は、main.tsと同階層に「shims.d.ts」というファイル（VueファイルをTypeScriptとして認識させるためのファイル）を作成してあげればいい！
```typescript:shims.d.ts
// コピペでOK!
declare module "*.vue" {
  import type { DefineComponent } from "vue";
  const component: DefineComponent<{}, {}, any>;
  export default component;
}
```

もし間違っている部分などございましたら、お手数ですがご教示いただければ幸いです！
英語初心者のITエンジニアが外資企業で感じたこと①（業務開始編）

# 概要
英語初心者が外資系企業の現場で働くことになり、実際に現場で感じたことのレポート

# 筆者は現場でどんな業務をしているの？
RPA開発運用と社内SEの業務を行っており、その中で英語の会議に参加したり、メールのやり取りをしたりしています。
基本的には日本語の仕事だがパートナーや他チームが海外にいるメンバで構成されているため、そことのやり取りが英語となっています。


# なぜ外資系企業で働いてみようと思ったの？
自分はＩＴ関連の知識を広く浅く網羅している感じのエンジニアだったのですが、その知識は現場で培われたものが多かったと感じています。
これからITエンジニアとして長期的に働いていくために英語を使えるということが一番コスパが良く、現場で英語の知識を培うことがよいと考えたためです。

# 英語が出来ないのにどうやって外資系企業の現場に入れたの？
企業や案件によって求められる英語レベルが違ってきます。
自分の場合、求められた英語レベルは「英語に対して強い苦手意識を持っていない」という非常に低いレベルのものでした。
そこから積極的に英語を使う機会を増やしていき今に至ります。

日本で英語環境下で働きたい時は、まず自分のレベルで入れる英語環境の企業に入ってみることが近道だと思います。


# 英語で業務をやってみて最初に感じた壁は？
メールをどのように書けばよいかわからない。

日本語のメールの場合は以下のような定型文が良く使われると思います。
＝＝＝＝＝
〇〇会社
〇〇様

いつもお世話になっております。
〇〇会社の〇〇です。
・・・
・・・
＝＝＝＝

英語の場合はどのような書き始めになり、どのように締めれば良いのかわからずネット検索で調べました。
そして調べた結果で問題ないかを同僚に確認するのですが、まるで新入社員のようになんの変哲もないメールを確認してもらっているため結構面倒くさがられました。

# 終わりに
ITエンジニアの中には英語が必要であると考えているエンジニアが多いと思いますので、
英語を使った働き方の例として参考になればうれしいです。
今後も同様の記事を更新していきます。
ApacheKafkaの終了の注意点【初歩】

## Apache Kafkaとは
Apache Kafkaとはデータパイプラインを構築するOSS（オープンソースソフトウェア）です。
データパイプラインとはその名の通りデータの通り道です。
例えばPowerBIとデータベース間でデータを送受信する際やJavaで書かれたWebアプリケーションからPythonで書かれた機械学習アプリケーションへデータを転送したい場合などに使えるでしょう。

Kafkaを用いずに実装しようとなると、上の例でいえば、まずJava,Pythonアプリケーション双方から内部Socket通信なりを用いた通信を実装しなければなりませんし、さらに一方から送られたデータを確実に相手に届けるような仕組み（同期制御やバックアップ）まで考えなければなりません。その他にもPython機械学習アプリケーションを並列に実行するとなれば、複数プロセスまたは複数ノードにデータを送信することになります。

このようにKafkaがカバーする部分はとても我々の労力を減らしてくれている訳です。

## Apache Kafkaの概要
以上の説明を踏まえ以下のURLを読んでみてください。
https://qiita.com/sigmalist/items/5a26ab519cbdf1e07af3#:~:text=Kafka%E6%9C%AC%E4%BD%93%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C,%E7%B5%84%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

## Kafkaの終了
今回はAPIではなく直接Kafkaのshファイルを用いて、サーバーを起動しているとします。

**Ctrl + Cで終了はするな！**

恐らくシェル上でサーバーおよびzookeeperを起動すると2シェル立ち上がっている状態になると思います。ここできちんともう一つさらにシェルを立ち上げ、kafka-server-stop.shおよびzookeeper-server.shを実行しないといけません。

さもないと以降kafka-sever-start.shを実行する際に前回のログのロードに失敗し、立ち上がりません。もしそうなった場合はserverのログを全消去しましょう。ログの位置はserver.propertiesおよびzookeeper.propertiesに書いてあります。
リダイレクトした時にHTTPメソッドはどうなる？

# はじめに

「リダイレクトするとGETリクエストになる」と無邪気に思っていたが、改めて聞かれると自身がなかったのでちゃんと調べてみた。

# やってみよう

簡単なスクリプトを作って実際にやってみた。

https://github.com/blue32a-sandbox/http-redirections

# 結果

GET、POSTでそれぞれリクエストした後にリダイレクトするとHTTPメソッドはどのようになるか？
※ 特殊リダイレクト２つは除く（300 Multiple Choice、304 Not Modified）

| 種類 | ステータスコード | GET | POST |
|:-:|:-|:-|:-|
| 恒久的 | 301 Moved Permanently | GETのまま | GETになる |
| 恒久的 | 308 Permanent Redirect | GETのまま | **POSTのまま** |
| 一時的 | 302 Found | GETのまま | GETになる |
| 一時的 | 303 See Other | GETのまま | GETになる |
| 一時的 | 307 Temporary Redirect | GETのまま | **POSTのまま** |

# まとめ

思い込みに反して元のHTTPメソッドを変更しないパターンがあった。
リダイレクトのステータスコードまで意識されているケースはほとんど見たことがなく、大抵はデフォルト（302）だったりするので「リダイレクトするとGETリクエストになる」と思っていた。

知識の裏をとっておくのは大事。

# 参考

https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections
Uipath OrchestratorとPCが接続できないときのメモ

初投稿になります。よろしくお願いします。
この記事ではRPAのUipathで、管理ツールOrchestrator（v20.10）からUnattendedライセンスを用いて自動実行したロボについて記載しています。

# はじめに
朝出社してメールソフトを開くと、Orchestratorからアラートメールが飛んできていました。
「フォルダー名＃プロセス名のジョブはロボット名で失敗しました。」
Orchestratorを確認すると、アラートの対象ジョブの一つ前に動くUnattendedロボのジョブがずっと保留中になっていました。
これにより後続ジョブがトリガー指示が来ても動けなかった模様。
対象が動くはずのPCを再起動することでジョブは実行されましたが、同様のことが頻発するのは避けたいところです。

# 調査
調査のため対象PCにて、
コンピューターの管理　＞　サービスとアプリケーション　＞　サービス　を見てみると、UiPath Robot が状態 "　"（空欄＝停止中）となっていました。
ネットでも調べると、どうやらUiRobotSvcとやらが起動していない状態とのことで。
このためOrchestratorとの接続ができず、ロボ実行が保留になっていたわけですね。

# 対応
下記を実行することでUipathRobotが起動してくれます。

・コマンドプロンプトなら
入力：net start UirobotSvc
出力：Uipath Robot サービスを開始します。
　　　Uipath Robot サービスは正常に開始されました。

・exeを直に実行
C:\Program Files (x86)\Uipath\Studio\Uipath.Service.Host.exe

私はロボを動かすPC（VDI）上で、タスクスケジューラにて毎朝再起動をさせているので、その後exeを直に起動させるタスクも組み込みました。
もしもともと立ち上がっていた場合でもスルーしてくれるので、組み込み得？ですのでご参考までにどうぞ。

# 関連
・この記事を書く直前に見つけました。CommunityEditionでも同様とのことで。アウトプットしていただきありがとうございました。
https://qiita.com/strBelgamot_007/items/0d5652e62217f3623798
VBA_10_Type_File_Folder_Date_CDate_サンプル

Keyword
---
Type
File
Folder
Date
CDate

Sample Code
---
```vb:Type活用
Option Explicit

Public Type MyType01
    FileName As String
    FileUpdatedDate As Date
    FileType As String
    FileSize As Long
End Type

Public Sub MySample20220607()
    Dim myFso As FileSystemObject
    Dim myFile As File
    Dim myfolder As Folder
    Dim myFolderPath As String
    Dim myDate As Date
    Dim myType(2) As MyType01
    Dim i As Long, j As Long
    
    myFolderPath = "H:\2022\Input"
    
    Set myFso = New FileSystemObject
    
    For Each myFile In myFso.GetFolder(myFolderPath).Files
        myType(i).FileName = myFile.Name
        myType(i).FileUpdatedDate = CDate(myFile.DateLastModified)
        myType(i).FileType = myFile.Type
        myType(i).FileSize = Round(myFile.Size / 1024)
    
        i = i + 1
    Next
    
    For j = 0 To 2
        Debug.Print myType(j).FileName
        Debug.Print myType(j).FileUpdatedDate
        Debug.Print myType(j).FileType
        Debug.Print myType(j).FileSize & "KB"
    Next j

End Sub
```
スキーマ(ユーザ)の削除方法

# 本記事について
OracleDBがインストールされているStaging環境のディスク容量が枯渇してきたため、
使用していないスキーマ(ユーザ)を削除する。
手順メモとして残します。


## ①SYSTEM権限でログイン

※ユーザでログインしても削除権限はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/269ec7b2-25f9-a155-0a37-47e1d40d520f.png)


## ②DROPコマンドを実行

[・表領域を削除する](https://www.projectgroup.info/tips/Oracle/SQL/SQL000007.html)
※引用リンク参照

```sql
DROP TABLESPACE 表領域名
[INCLUDING CONTENTS]   --表領域にオブジェクトが含まれる場合に指定する
[AND DATAFILES]        --物理ファイルも一緒に削除する場合に指定する
[CASCADE CONSTRAINTS]  --制約も含めて一緒に削除する場合に指定する
  ;
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/6cc65a5f-3742-4911-1d4e-1df089227eb8.png" width=50%>





[・ユーザを削除する	](https://oreno-it.info/archives/3462)
※引用リンク参照


```sql
DROP USER ユーザー名 [CASCADE]; --ユーザーがオブジェクトを所有している場合はCASCADEを指定し、ユーザーと所有オブジェクトを削除
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2614309/f3af2c09-269a-ec10-3e2f-a500439f62f7.png" width=50%>
【AWS】AWSの知識備忘録帳

- [SSO](https://aws.amazon.com/jp/what-is/sso/)に関する記事

https://aws.amazon.com/jp/blogs/startup/techblog-iam-sso-practice/

## 参考資料

## 個人ブログ

https://takuma-tech.com/2023/01/04/330/
Qiitaトレンドから気になる記事を自動で取得してDiscordへ

# はじめに
Qiitaのトレンドから気になるタグの記事だけ取得出来たら便利だなぁ～と思い、
せっかくならDiscordで流して情報共有できるようにしようと決意しました。
会社で使用する技術の情報収集/共有を効率化したい方はぜひ最後までご覧ください。

それでは始めましょう！

# 目次
* 参考文献
* 事前準備
    * APIを取得する
    * 送信先のDiscordサーバーのWebhook URLを取得する
* Pythonでコーディング
    * 検索タグを設定
    * Qiita APIを叩いて、検索タグに該当する記事のURLを取得する
        * APIでトレンド記事の情報を取得する(json形式)
        * 記事ごとにリンクとタグを取得する
        * 検索タグに該当するURLのみ取得する
    * POSTリクエストを送る
* おつかれさまでした

# 参考文献
こちらの記事/ドキュメントを参考にさせていただきました。
* [Netlify Functions を使って Qiita のトレンド API を非公式で作ってみた](https://qiita.com/HelloRusk/items/803f9599cde72810f1a8)
* [Intro to Webhooks (Discordの公式ドキュメント)](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)
* [DiscordにWebhookでいろいろ投稿する](https://qiita.com/Eai/items/1165d08dce9f183eac74)

# 事前準備
コーディングに入る前に、Qiitaのトレンド一覧を取得するAPIと、記事を送信したいDiscordのサーバーのWebhook URLを取得します。

## APIを取得する
Qiitaの公式APIにはトレンド記事一覧を取得するAPIが無いようです。
クローリングしてもよいのですが、今回は[@HelloRusk](https://qiita.com/HelloRusk)さんが作成された[API](https://qiita-api.vercel.app/)を使用させていただくことにしました。

## 送信先のDiscordサーバーのWebhook URLを取得する
[公式ドキュメント](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)が分かりやすいので見ていただければ一発ですが念のため。
「サーバー設定」→「連携サービス」→「ウェブフックを作成」→「ウェブフックURLをコピー」の順で取得できます。

# Pythonでコーディング
準備が整いましたので、Pythonを使ってコーディングしていきましょう！

## 検索タグとDiscordサーバーのWebhook URLを準備
収集したい情報のタグを事前に用意します。
今回は人気そうな「Python」や「機械学習」などを入れてみました。
```python:main.py
import requests
import json

# 検索タグの設定
search_tags = ["Python", "機械学習", "MachineLearning", "DeepLearning", "競技プログラミング", "R"]

# DiscordのサーバーのWebhook URL
webhook_url = "https://discordapp.com/api/webhooks/みなさんのWebhook_URL"
```
## Qiita APIを叩いて、検索タグに該当する記事のURLを取得する
### APIでトレンド記事の情報を取得する(json形式)
APIを叩くとトレンドのページの情報がjson形式で取得できます。
```python:main.py
api_url = "https://qiita-api.vercel.app/api/trend"
res = requests.get(api_url)
trends = json.loads(res.text)
```

### 記事ごとにリンクとタグを取得する
取得したトレンドデータ（json）からURLとタグを取得します。
```python:main.py
link_urls = []
tags = []
for i in range(len(trends)):
    link_url = trends[i]["node"]["linkUrl"]
    link_urls.append(link_url)
    tags_temp = []
    for j in range(len(trends[i]["node"]["tags"])):
        tag = trends[i]["node"]["tags"][j]["name"]
        tags_temp.append(tag)
    tags.append(tags_temp)
```

### 検索タグに該当するURLのみ取得する
興味のあるタグ（検索タグ）が含まれた記事だけ取得します。
```python:main.py
send_urls = []
for i in range(len(trends)):
    for search_tag in search_tags:
        if search_tag in tags[i]:
            send_urls.append(trends[i]["node"]["linkUrl"])
            break
        else:
            continue
```

## POSTリクエストを送る
前項までで興味のあるタグが含まれた記事のURLを取得することができました！
あとはDiscordのサーバーに対してURLをPOSTすれば完了です！。
```python:main.py
for send_url in send_urls:
    content = {
        "username":"Qiita2Discord",
        "content":f"{send_url}"
    }
    requests.post(webhook_url, content)
```
# おつかれさまでした
これにて任務完了です。
快適なQiita Lifeにつながれば幸いです。
お読みいただきありがとうございました。
PowerShellの配列、ArrayList、文字列、StringBuilderの速度をそれぞれ比較してみた。

# はじめに

ループで繰り返し追加するときに、配列や文字列を`+=`で拡張すると
パフォーマンスがよろしくないというのは割と常識となってますが、
じゃあどのぐらい差があるのかってあたりを比較してみました。

# 用意したもの

- 郵便局提供の郵便番号データ(CSV)
- PowerShell 5.1

# 比較対象

- 配列
- ArrayList
- 文字列
- StringBuilder

# ソース

```powershell
$data = Get-Content -Path ".\01HOKKAI.CSV"

Write-Output "Array"
$a = @()
ADD_Method $data $a

Write-Output "ArrayList"
$a = New-Object System.Collections.ArrayList
ADD_Method $data $a

Write-Output "String"
$a = ""
ADD_Method $data $a

Write-Output "StringBuilder"
$a = New-Object System.Text.StringBuilder
ADD_Method $data $a

function ADD_Method([object]$data,[object]$arr){
    $time = Get-Date
    foreach($d in $data){
        switch($arr.GetType().Name){
            ($_ -eq "Object[]" -or $_ -eq "String"){
                $arr += $d
            }
            "ArrayList"{
                $arr.Add($d) > $null
            }
            "StringBuilder"{
                $arr.Append($d) > $null
            }
        }
    }
    [Math]::Round(((Get-Date) - $time).TotalSeconds,3)
}
```

# 結果

```powershell
PS C:\work\test> . "c:\work\test\Array.ps1"
Array
5.585
ArrayList
0.042
String
13.129
StringBuilder
0.065
```

# 結論

正直ここまで差が出るとは思わなかったｗ
そりゃまあループに組み込むなら`ArrayList`や`StringBuilder`
一択になりますねｗ

# おまけ

```powershell
$data = [string[]](Get-Content -Path ".\01HOKKAI.CSV")

$time = Get-Date
$a = $data -join ""
[Math]::Round(((Get-Date) - $time).TotalSeconds,3)
```

```powershell
PS C:\Extract\01hokkai> . "c:\Extract\01hokkai\Array.ps1"
0.042
```

`-join` 速ぇ！
python学習 - 2日目

# はじめに
python初心者がこっそり学習する。
2日間が空いてしまいました。。

# 今日やること
- 文字列
- 数値

# 文字列
## 文字列の書き方
文字列の書き方は、
- "(ダブルクォーテーション)で囲む
- '(シングルクォーテーション)で囲む

pythonの場合はどちらで囲んでも結果は同じ。
ただ、他言語を学んでいる人は、なんとなくどっちで囲むか感覚が身についているみたい。
文字列を'か"で囲んでいないと、コードが動かなくなるので注意。
膨大なコードを書いたときに、ここでミスすると修正が大変そう。。
`入力例`

```
# 牛タンと表示
print("牛")
print('tongue')
```

`実行結果`
```
牛
tongue
```

## エスケープ文字の扱い方
'でも"でも、エスケープ文字を置換して出力する。
置換しない場合は文字列の前に r または R をつけると置換されなくなる。

`入力例`
```
# スクール水着の間を改行
print("スクール\n水着")
```

`実行結果`
```
スクール
水着
```

`入力例`
```
# スクール水着の間を改行しない
print(r'スクール\n水着')
print(R'スクール\n水着')
```

`実行結果`
```
スクール\n水着
スクール\n水着
```

# 数値
## 数値の書き方
数値の書き方は、"(ダブルクォーテーション)や'(シングルクォーテーション)で囲まない。
四則演算もすることができる。

`入力例`
```
print(10)
print(10 + 5)
print(5 - 2)
print(10 / 2)
print(10 % 5) # 余りを求める
```

## 数字の切り捨て
割り算で結果を割り切りたい場合は、以下のようにする。
```
# 切り捨ての計算
print(10//2)
```
## 優先順位の変更
算数と同じで、+と-よりも*や/を先に計算するが、()で囲むと優先度が変えられる。
`入力例`
```
# 割り算よりも引き算を先に計算
print((20 - 5) // 3) 
```


今日はここまでです。
おやすみなさい。
【AWS】AmazonConnectの電話番号に架電してから、着信するまでの流れについて、自分なりにまとめてみた

# はじめに
どうも、ARIの名古屋支社に勤務している愛知県民です♪
(/・ω・)/

最近、AmazonConnectについて初学者向けに発表する機会があり、AmazonConnectについて色々調べました。

そこで今回は**AmazonConnectの電話番号に架電してから、着信するまでの流れ**を記事にしたいと思います！
※何点か違う点があるかもですが、悪しからず・・・

AWS,AmazonConnectについて勉強中の方の参考になれば幸いです。
また、今回は初めてスライドモードで記事を作成してみました。
(*^^)v


***
# アジェンダ
1. 本記事を読んで理解出来ること

1. AmazonConnectとは
    * コールセンタ
    * コンタクトセンタ
    * AmazonConnect

1. AmazonConnectの仕組み
    * コンタクトフロー
    * エージェント・キュー・ルーティングプロファイル
    * 架電から着信までの流れ

***

# 1.本記事を読んで理解出来ること
本記事を読むと、以下が理解できる（はず）です。
　
* AmazonConnectはどのようなサービスか
* AmazonConnectの電話番号に架電してから着信までの仕組み

***

# 2.AmazonConnectとは

***

# AmazonConnectの前に、コールセンタ、コンタクトセンタとは何でしょうか？ 

***

# コールセンタとは「電話対応を行う拠点・窓口」のこと

***

# ではコンタクトセンタとは？

***

以下について5分ほど考えてみましょう♪

①1980年に普及していた通信手段は何でしょうか？
②2022年に普及している通信手段は何でしょうか？
（通信手段＝離れた相手と意思疎通する方法　とします。）

***

回答例
# 1980年
* 電話
* 手紙
* ポケベル

# 2022年
* 電話
* メール
* チャット
* Web会議室
* SNS
* お問い合わせフォーム

# ちなみに
1983年：ファミコンが発売
1985年：Windows1.0が発売

***

# 2022年はチャネルの種類・チャネル間でのやり取りが多様化

例：上司にチャットで質問　→　電話で回答
例：お客さんにWeb会議室で要件を確認　→　メールで回答

***

# 2022年は電話対応だけでは不十分な時代

***

# コールセンタが複数のチャネルに対応できるよう、進化したのがコンタクトセンタ

***


# つまり、コンタクトセンタとは「電話・チャット等、複数のチャネルで対応を行う拠点・窓口」のこと

***

![スライド12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/42ca30e9-456b-027d-972d-1fa949616026.png)


***

# 3.AmazonConnectの仕組み

***

# AmazonConnectの電話番号に架電してから、着信するまでの流れを説明します

***
# 架電から着信までの流れの概要は、以下の図の様になります

![スライド15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/7212a753-430f-f7f2-9517-7acfa3dd2ce1.png)


***

# 詳細な説明の前に、AmazonConnectに関する用語について説明します

***

![スライド16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/d1560510-b363-2d16-1603-a6f09658aa5d.png)

***

![スライド17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/1fb495c4-e04b-0b91-7a3f-49158c8f5b64.png)

***

![スライド18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/08d80b96-9141-c673-6f88-19018263256c.png)

***

![スライド19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/cb0f8a61-31df-1b53-bfc7-b61e3e073775.png)

***

# 架電から着信するまでの流れを詳細に説明します

***

# 顧客が架電した時、ニーズの把握のために音声アナウンスを流します

![スライド20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/366b3bde-b6de-2c38-45c4-8918fa569640.png)

***

# 顧客が番号を押し、押した番号に対応するキューに着信します

![スライド21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/e5082a44-62f9-3aca-b195-6adee520ab14.png)

***

# 着信したキューをルーティングプロファイルに持つエージェントに着信し、通話が開始されます

![スライド22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372071/fd29a2e7-4edf-44e0-009d-709ddcd32686.png)

***

本記事を読み、以下を理解できたでしょうか？

* AmazonConnectはどのようなサービスか
* AmazonConnectの電話番号に架電してから着信までの仕組み

***

# おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

基礎的な部分ではありますが、改めてAmazonConnectについて勉強することができ、
自社メンバにAmazonConnectの布教ができて楽しかったです！

また何か調べたことがあれば、記事にしたいと思います♪
(:3_ヽ)_
【Rails】rescue_fromによる例外処理


## はじめに

rescue_fromについて軽く調査したので記録する。この記事がだれかの役に立てば幸いです。

## 結論

raiseで発生させた例外を`rescue_from`で検知し、指定したメソッドの実行に繋げることができる。

### 詳細

大まかな使い方は以下の通りになります。



```app/controllers/application_controller.rb
# Forbiddenの例外を捕捉した場合に、rescue_403メソッドを実行する
rescue_from Forbidden, with: :rescue_403

private

def rescue403(e)
  render status: :forbidden, json: { message: "アクセス権限がありません" }
end
```

Forbiddenの例外を発生さえる流れとしては、


```app/controllers/application_controller.rb
# 管理者のみに実行権限を与える
def allowed_to_admin_user!
  unless admin_user?
　　　　　　　　　# 管理者でなければ例外を発生させる
    raise Forbidden
  end
end
```

application_controllerを継承したコントローラーで、

```ruby
before_action :allowed_to_admin_user!
```

を追加すれば、各アクションの前に上記の「管理者か否か」の検証を挟むことができる。

## おわりに

application_controller.rbの中身までは今まであまり詳しく見たことがなかったので、例外処理自体や、rescue_fromなど学びがあった。
RailsでTerser利用時にconsole.logを消したい

アセットパイプラインで、JavaScriptの圧縮にTerserを利用するとき、次のように設定しているケースが多いかと思います。

```ruby:config/environments/production.rb
config.assets.js_compressor = :terser
```
通常、この設定で問題はないのですが、
**本番リリース時は、console.logも合わせて消したい！** となると、非常に残念なお知らせとなります。
この設定ですと、JavaScriptに書かれた"コメント"は消えるのですが、console.logはそのままソースコードに残ってしまうためです。

そこで、Terserにオプションを渡してあげて、挙動を調整していきます。

# console.logを消すための設定
JavaScript圧縮時、console.logを含む「console.*」系も全て消したい場合

```ruby
config.assets.js_compressor = Terser.new(compress: { drop_console: true })
```

一方、console.debugだけ消したいケースもあるかと思います。
その場合は「pure_funcs」で個別に指定する事で可能となります。

```ruby
config.assets.js_compressor = Terser.new(compress: { pure_funcs: ['console.debug'] })
```

複数指定したい場合は、カンマ区切りで追加することで可能となります。
```ruby
config.assets.js_compressor = Terser.new(compress: { pure_funcs: ['console.debug','console.info'] })
```



# もっとできる事を探す
Terserには、他にも多くのオプションが用意されています。
詳しくは、READMEやAPIリファレンスをご覧ください。


Terser(gem) リポジトリ

https://github.com/ahorek/terser-ruby/

APIリファレンス

https://terser.org/docs/api-reference
ReactでObjectを受け取ってのObjectのstateを変更したい

タイトルそのままです。

```index.js
const initialState = {
   'user1': true,
   'user2': true,
    ...
};
const [user, setUser] = React.useState(initialState);
````
というようなstateがあったとして、例えばクリックされたユーザ番号のvalueを変えたいとします。で、すべてにチェックをチェックしたら、全チェックボックスがチェックされるようにしたい。
なので、1個チェックしたときは、Object内のチェックしたkey, valueペアだけ返してstateを変更し、全チェックしたときは、すべてのObject内のkeyに対してvalueだけ変更してObjectを丸々返すようにしたかったのですが、Objectを丸々受け取ってそれをReactのstateに渡すにはどうしたらよいのかが地味にわからなくて時間がかかりました。

Codesandboxは[こちら](https://codesandbox.io/s/sad-water-yrzxp7?file=/src/User.js:28-885)

```User.js
export default function User({ users, handleChange }) {
  function getUserObject(users, key, value) {
    if (key === null && value === null) {
      Object.entries(users).map(([key, val]) => {
        users[key] = !val;
      });
      return users;
    }
    return { [key]: !value };
  }
  return (
    <>
      <input
        type="checkbox"
        onChange={() => handleChange(getUserObject(users, null, null))}
      />
      <label>check all</label>
      {users ? (
        Object.entries(users).map(([key, value]) => {
          return (
            <div>
              <input
                type="checkbox"
                checked={value}
                onChange={() => handleChange(getUserObject(users, key, value))}
              />
              <label>{key}</label>
            </div>
          );
        })
      ) : null}
    </>
  );
}
```

```App.js
export default function App() {
  const initialState = {
    user1: false,
    user2: false
  };
  const [users, setUser] = React.useState(initialState);

  return (
    <div className="App">
      <User
        users={users}
        handleChange={(obj) =>
          setUser((state) => Object.assign({ ...state }, obj))
        }
      />
    </div>
  );
}
```

### ポイント1: Object.assignならObjectそのままを渡せる

ポイントはここです。`Object.assign`を使い、さらに`state`は`...state`ではなくて、`{...state}`で渡す必要があります。ちなみにObjectを変更するやり方は色々あって、`Object.assign`でなくても`{...state, key: val}`でも行けるようですが、そうすると、Objectはそのまま渡せません。

```index.js
setUser((state) => Object.assign({ ...state }, obj))
```

### ポイント2: key, valueを変数名で受け取ってObjectにしたい

全てのkey, valueに対してvalueの値を変更したい場合はこう。
```index.js
Object.entries(users).map(([key, val]) => {
        users[key] = !val;
});
```

一個のkey, valueペアについて単体でObjectを作って返したいとき。

こうする。ミソは`[key]`ここ。 `key: !value`だと、key名がそのまま`key`という名前のObjectになってしまいます...ので、`[key]`にしないと認識されません。

```index.js
{ [key]: !value };
```

コード例自体は別のところで使用したものをこれを書くためにサクッと書いたので、まあちょっとおかしなところありますが...
TCAでCore Locationを扱うComposable Core Locationのススメ

# TCAでCore Locationを扱うComposable Core Locationのススメ

## まえがき

The Composable Architecture(以下よりTCA)でCore Logationを使う機会があり、
Point Free製のComposable Core Locationが非常に便利でしたので
<https://github.com/pointfreeco/composable-core-location#basic-usage>、
備忘録として記録しておきます。

## どういうものか？

Viewからのユーザーの入力であったり、APIからのレスポンスやロジックなど、
Reducerが開発者が定義したActionをもとに、Stateを更新するという流れだと思いますが、

Core Loacationから緯度経度を取得する場合、
位置情報や位置情報の利用確認の結果、権限がどうなっているかなど、
Core Location側のDelegate関数から、
どのようにTCAのActionとして貰うかが不明でした！

が、このComposable Core Locationを使えば解決できます。

## 使い方

Composable ArchitectureでCore Locationを
<https://github.com/pointfreeco/composable-core-location#basic-usage>

EnvironmentにlocationMangerを定義し

``` swift
struct AppEnvironment {
    public var locationManager: LocationManager
}
```

EnvironmentにあるComposable Core LogationのLocationManagerに処理をDelegateする。
以下では
Reducer内でonAppearしたたときにLocationMangerにdelegateし、
locationManagerを通じて、位置情報の利用確認の許可を求めています。

``` swift
static var reducer = Reducer <AppState, AppAction, AppEnvironment> { state, action, environment in
    struct LocationManagerId: Hashable {}
    switch action {
    case .onAppear:
        return .merge(environment.locationManager.delegate()
                        .map(Action.locationManager)
                        .cancellable(id: LocationManagerId()),
                      environment.locationManager
                        .requestWhenInUseAuthorization()
                        .fireAndForget())
    // 省略
    }
}
```

``` swift
enum AppAction {
    case onAppear
    case locationManager(LocationManager.Action)
}
```

このLocationManager.ActionにCoreLocationのDelegate MethodがActionとして定義されています。

``` swift
   case didChangeAuthorization(CLAuthorizationStatus)
    case didDetermineState(CLRegionState, region: Region)
    case didEnterRegion(Region)
    case didExitRegion(Region)
    case didFailRanging(beaconConstraint: CLBeaconIdentityConstraint, error: Error)
    case didFailWithError(Error)
    case didFinishDeferredUpdatesWithError(Error?)
    case didPauseLocationUpdates
    case didResumeLocationUpdates
    case didStartMonitoring(region: Region)
    case didUpdateHeading(newHeading: Heading)
    case didUpdateLocations([Location])
    case didUpdateTo(newLocation: Location, oldLocation: Location)
    case didVisit(Visit)
    case monitoringDidFail(region: Region?, error: Error)
    case didRangeBeacons([Beacon], satisfyingConstraint: CLBeaconIdentityConstraint)
```

サンプルコードもありますので
是非是非、Composable Core Location使ってみてください。
https://github.com/pointfreeco/composable-core-location

## あとがき

Delegate使うパターンで、自作しないといけないシーンも出てきそうなので、
内部の実装もみていきたい。。。
SwiftUI x TCA x Firestoreでのお仕事募集中です〜！
Serverless Framework で DynamoDB のスキーマを変更した時に、変更のあったDBだけ更新する方法

## そもそも

Serverless Framework + DynamoDB で、データベースを使う API を構築している時に、DynamoDB のスキーマを変更した時に、

いつものように `sls deploy --stage=v1` を実行すると下のようなエラーが出ました。


```
 Serverless Error ----------------------------------------
 
  An error occurred: userTable - CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename your-api-user-v1 and update the stack again..

```

## やりたい事

ただ、複数のテーブルを使っていて、スキーマを変更したテーブルだけ更新したかったのですが、エラーメッセージを読むと、カスタムネームリソースが置き換えを必要とする場合は更新できないと書いてありました。

AWS の回答を見ていても、リソースネームを置き換えろと書いてありました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-custom-name/

## やったこと

なので、テーブルネームを、下のように変更して修正しました。

Before
`AWS_DYNAMODB_USER_TABLE_NAME: your-api-user-${opt:stage, self:provider.stage}`

After
`AWS_DYNAMODB_USER_TABLE_NAME: your-api-user-${opt:stage, self:provider.stage}-deploy1`

テーブルのデータはリセットされるので、データを再インポートしたい場合は、CSV で出力しておいて、再度インポートスクリプトを組む必要があります。

## 追記

上のやり方では、DynamoDB のリソース名が更新ごとに変わってしまいますが、一度別名に変更して、deploy 、その後再度最初の名前に変更して deploy する事でも解決できます。

こっちの方が良いですね。
ICから薄橙色の炎が出た

私が体験した1番ゾッとするインシデントの話

https://qiita.com/official-events/5d9db98800d6f7763fed

参加記事です。

本番環境でやらかしちゃった人 Advent Calendar 2021

https://qiita.com/advent-calendar/2021/yarakashi-production

で紹介させていただいた

「配電盤の電源を切る」

https://qiita.com/kaizen_nagoya/items/5fee2f3a4fb3cede675c

よりも、もっと恐い話。

ある電子基板のはんだづけをし、100万円以上する測定機器で測定しようとしたら、基盤から薄橙色の炎（ほのお）が、電子基板上のICから立ち上がったという事件。

恥ずかしながら、電気科を卒業しているにもかかわらず、ICから、炎が出るということを知らなかった。

個体電子という量子力学を使った電子材料の学科の単位を落としていたからかもしれない。

研究室が現代制御理論の研究室で、論理模擬試験のプログラムしか書いておらず、計算機実験以外の実験が研究対象でなかったからかもしれない。

一番、心配だったのは、測定機器を壊しはしなかったか。
よく考えてみれば、高額な測定機器は、過渡電流を防ぐ回路が入っているらしく、大丈夫だった。

測定装置であるため、「本番環境」ではないという考えに基づき、上記AdventCalendarには投稿しなかった話です。

# 電気安全

感電が一番危険な事象です。

卒業した大学でも、雷試験で学生が死んだことがあると聞いたことがあります。

まず、感電を防止することが大事です。

次が、発熱・発煙・発火だろうと思います。

発熱は、ノートPCで膝に置いて仕事をしていたら、膝が低温やけどになったという話を聞いたことがあります。
発煙は、ハードディスクでSCSIと書いてあるコネクタに、SCSIケーブルをつないだら、煙がでたことがあります。粗悪品で、パラレルケーブルで接続するハードディスクなのに、製造会社が、SCSIと刻印のあるケースを、パラレルケーブル接続する機器でも使っていたらしいです。マニュアルには、パラレルケーブルをつかいでくださいって書いてある。1980年代のことです。

いずれにしても、電気を使う仕事は、危険がつきものです。
電気安全の教育をちゃんとしてから、作業に入ってください。

# 導通試験
電源を入れる前に、かならず導通試験をする習慣をみにつけましょう。
テスタには、導通試験という項目があるものであれば、そこを使って、グランドとつながっているはずの端子がグランドとつながっているかを確かめましょう。
また、導通していないはずの端子の導通がないことを確かめるのもよいでしょう。

電圧測定、電流測定など、電源を入れてからする測定はその後でお願いします。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
vite 一括ファイルをロードしたい時 glob-import を使おう

# vite glob-import

🥺**目的:  ファイル一括ロード**

## glob ディレクトリの中を `import`文羅列でimportしたくない😅

![スクリーンショット_2022-06-08_21.34.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/52183f77-7e9d-320f-8a4e-2533e8635783.png)


## 一括ロードしよう〜やり方😇

main.js

```jsx
// main.js
const globModuels = import.meta.glob('./glob/*')　// 全てを読み込む

console.log(globModuels)
```

## ブラウザで確認

![スクリーンショット_2022-06-08_21.39.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/6d74cf06-e112-2c70-9a4a-5e4a1822093b.png)


glob配下のファイルを読み込んだMap Objectが返されます。

### forEachしてみる

```jsx
Object.entries(globModuels).forEach(([k, v]) => {
  console.log(k + ':', v)
})

```
![スクリーンショット_2022-06-08_21.47.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/08fa8e0a-48e6-5f0a-0fba-a4fd86e9fbe0.png)


これで利用できることではない

### Moduleを取り出す

```jsx
Object.entries(globModuels).forEach(([k, v]) => {
  v().then((m) => console.log(k + ':', m.default))
})
```

- v を実行して、非同期処理
- 戻り値の m は本当の Module になります

![スクリーンショット_2022-06-08_21.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/054659f7-ef77-e392-f16f-9495da9559d2.png)


## どんな時に使う：

- 多種言語jsonファイルの読み込み?

## ディレクトリのとある種類ファイル

### js ファイルのみ読み込み

```jsx
// main.js
const globModuels = import.meta.glob('./glob/*.js')　// jsのみ読み込む

console.log(globModuels)
```

![スクリーンショット_2022-06-08_21.54.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/049cc8ff-43fe-053e-67c8-49622f7eb1ee.png)


### 正規表現を用いる

```jsx
// main.js
const globModuels = import.meta.glob('./glob/*[0-9].js')  // jsのみかつ数字が末尾

console.log(globModuels)
```

![スクリーンショット_2022-06-08_21.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/a7322c67-84ec-b32e-303e-c2a69caaac98.png)


## コンパイルされたコード

この機能はesの機能ではなく、viteの機能

![スクリーンショット_2022-06-08_21.59.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/9f795315-739c-14f3-aeee-4f418e912db1.png)


importのpathはコンパイルされます。

上記の書き方を書いても、別のコンパイラーはエラーになる可能性はあります。

## 非同期でロードするのやっぱり不便〜どうしよう〜〜〜最初からコンパイルされた結果にしたい 😗

`import.meta.globEager`を使いましょ

```jsx
// main.js
const globModuels = import.meta.globEager('./glob/*')

console.log(globModuels)
```

全部 Module に

![スクリーンショット_2022-06-08_22.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/1d930693-477e-15cb-5df4-15c724a2db6a.png)

コンパイル結果：

![スクリーンショット_2022-06-08_22.07.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861686/7dc20a98-f7c3-6f40-5fd9-990b6d567f9d.png)


`import.meta.globEager` を使い便利になりますね！

これはこちらのライブラリによる機能：

[https://github.com/mrmlnc/fast-glob](https://github.com/mrmlnc/fast-glob)

気になった方はぜひ本家を見てみてください😸
scipy.stats: Brunner-Munzel 検定 brunnermunzel

# scipy.stats: Brunner-Munzel 検定 `brunnermunzel`

Brunner-Munzel 検定を行う。

`brunnermunzel(x, y, alternative='two-sided', distribution='t', nan_policy='propagate')`

- `distribution`　$p$ 値の計算に $t$ 分布を使う（デフォルト）とき `'t'`，標準正規分布を使うとき `'normal'` を指定する。


```python
from scipy.stats import brunnermunzel
import numpy as np

x = np.array([1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 1, 1])
y = np.array([3, 3, 4, 3, 1, 2, 3, 1, 1, 5, 4])
brunnermunzel(x, y)
```




    BrunnerMunzelResult(statistic=3.1374674823029505, pvalue=0.005786208666151538)




```python
brunnermunzel(x, y, distribution='normal')
```




    BrunnerMunzelResult(statistic=3.1374674823029505, pvalue=0.0017041417600383024)
esp32-camとの接続確認

![IMG_2992.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/c8df5653-5c9d-4021-7c04-93d481364a01.jpeg)
ネットで買ったesp32-camが届きましたが、技適マークが付いていないので、「技適未取得機器を用いた実験等の特例制度」を申請しました、早速使って接続確認したいと思います。

![IMG_2993.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/4bc410fa-3e82-cfdf-c7b6-5e970a0b6355.jpeg)

今回、私が買ったのは、USBシリアル変換器が載っているので、そのままUSBケーブルを挿したらプログラムを書き込めます。
## Arduino IDEの環境設定
Arduino IDEで初めてESP32をプログラムするには、ツールのボードマネージャnにESP32を追加する必要があります。まだインストールしていない場合は、このリンクを参考してください。

https://github.com/espressif/arduino-esp32

## ESP32-CAMをプログラムする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/8c9d6bdd-376d-133c-1bd7-4a5631db1597.png)
1. [ツール] > [ボード]に移動し、[AI-ThinkerESP32-CAM]を選択します 。
2. そして、[ファイル] > [スケッチ例] > [ESP32] > [Camera] > [CameraWebServer]を開います。
3. [ツール] > [シリアルポート]に移動し、ESP32-CAMが接続されているCOMポートを選択します。

今回CameraWebServerを使ってカメラとWIFIの動作を確認します。

```c:CameraWebServer.ino
// ===================
// Select camera model　
//自分使っているモデルを有効し、ほかのモデルコメントアウトする
// ===================
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_ESP32S3_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
//#define CAMERA_MODEL_M5STACK_UNITCAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
// ** Espressif Internal Boards **
//#define CAMERA_MODEL_ESP32_CAM_BOARD
//#define CAMERA_MODEL_ESP32S2_CAM_BOARD
//#define CAMERA_MODEL_ESP32S3_CAM_LCD

#include "camera_pins.h"
// ===========================
// Enter your WiFi credentials
// ===========================
const char* ssid = "**********"; //自分のWiFiのSSIDに変更
const char* password = "**********"; //自分のWiFiのパスワードに変更
```
## 動作確認
プログラムが書き込めましたあど、[ツール] > [シリアルモニタ]　を開います。

:::note warn
Arduino IDE 2.0 RC で ESP32 のログ出力できない場合は、Arduino IDE 1.8.19 を使って試してください。
:::

カメラサーバを起動終わったら、Camera Readyメッセージが表示します、そして、後ろのIP　 Address をブラウザからアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/4895ca1f-8f97-9607-b6ee-ba38730d0227.png)
アクセスしたら、下のStart Streamを押して、カメラの画面が映し出されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/cab84d0f-6a92-c4a5-f845-b2c8d6960001.png)
実際に撮影した画像は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2697457/b0277e34-bf02-0537-22a3-aeebd135577e.png)
会社の Python プロジェクト Template Repository を1日で作ってみた😆


# はじめに
会社の標準言語をとある言語からPythonに変えようと、一生懸命旗を振っています😆
しかし、私はPythonに触り始めて3年過ぎた程度の経験かつ管理職でありコーディングに時間を割けません。

標準言語をPythonに変えることは既定路線なのですが、どうやって移行の敷居を低くし、Pythonを魅力的な言語に見せるかが私の課題となっています。
そこでGitHubに[Template Repository](https://docs.github.com/ja/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)という機能があることを知り、早速[Python用のTemplate Repository](https://github.com/chiba-data/python-project-template)を作って公開しました。

https://github.com/chiba-data/python-project-template

# こだわり
全員がPython初心者であることを考慮し、以下の構成としました。
* パッケージマネージャーはPoetryに統一する。
    * [Poetry](https://python-poetry.org)
* Code Formatter や PEP8への準拠は自動で行う。
    * [flake8](https://flake8.pycqa.org/en/latest/)
    * [black](https://github.com/psf/black)
    * [isort](https://github.com/PyCQA/isort)
* Git のコミット時に自動チェックを行う。
    * [pre-commit](https://pre-commit.com)
* テストはpytestに統一、Coverageを計測する。
    * [pytest](https://docs.pytest.org/en/7.1.x/)
    * [pytest-cov](https://pytest-cov.readthedocs.io/en/latest/)
    * [CodeCov](https://about.codecov.io)

以上、[GitHub Actions](https://docs.github.com/ja/actions)でPush時に自動実行することとしました。

`black`と`isort`は初めて知りました。
# 最後に
こんなのもあるよーといったことをコメントやプルリクで教えていただけると幸いです😊
Vue.js propsのリアクティブ性

Vue.jsのpropsで理解が甘かったことがあるので備忘録として

# はじめに
親のコンポーネントから子のコンポーネントに値を渡す際、props プロパティとして渡すが、そのリアクティブ性について学んだ。

# 単方向データフロー (One way Data Flow)
基本的に、リアクティブに変化する流れ、データーフローは親から子に流れるのみで、子から親に流れることはない。
子が親からもらったプロパティを変化させようとしてもエラーが出る。
もし、親からもらったデータを変化させたいなら2つの方法があり、
 - **子のコンポーネントでローカルのデータとして使う**

ローカルのデータの初期値としてプロパティを扱う。
```javascript
props: ['initialCounter'],
data: function () {
  return {
    counter: this.initialCounter
  }
}
```

 - **プロパティを算出プロパティで使う**

特に加工する必要が無いなら算出プロパティで扱うこともできる。
```javascript
props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}
```

# 例外
ただし例外がある

**配列とオブジェクト**

である。
>JavaScript のオブジェクトや配列は参照渡しなので、プロパティが配列やオブジェクトの場合、子コンポーネント内でオブジェクトや配列自体を変更すると、親の状態に 影響してしまい、Vue はこれに対して警告できないことに注意してください。一般的なルールとして、オブジェクトや配列を含むプロパティの変更は避けるべきです。これは単方向のデータバインディングが無視されてしまい、望ましくない結果を引き起こす可能性があるからです。

配列とオブジェクトは参照渡しなため、子のコンポーネントで変更しても、親のコンポーネントに変更は反映される。

ただこれは単方向にするのに必要以上にコストがかかってしまうため仕方なく公式がそのままにしただけで、どちらにせよ子コンポーネントが親コンポーネントの状態を変えられるのは、コードリーディングをしづらくするので避けるべき。

基本的には子コンポーネントはイベントとemitでのやりとりが理想。

# 最後に
単方向データフロー自体は理解していても、配列とオブジェクトという例外があることを知らなかったことで、かなり困惑していたが、今回学習したことでかなりすっきりしました。


## 参考
https://v3.ja.vuejs.org/guide/component-props.html#%E5%8D%98%E6%96%B9%E5%90%91%E3%83%86%E3%82%99%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AD%E3%83%BC
AWS EC2サーバ AMIでタイムゾーンをUTCからJSTへ変更する。

# サーバータイムの確認
\# date

# clockファイルが存在するか確認
\# ls /usr/share/zoneinfo/

# localtime変更
\# cp -p /usr/share/zoneinfo/Japan /etc/localtime

\# vim /etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=False

ZONE=システムクロックタイムゾーンを指定
UTC=ハードウェアクロック（ハードウェアに内蔵されている時計）をUTCにするか否かを指定。true→ハードウェアクロックがUTCになります。 false→ハードウェアクロックがローカルタイムになります。

# 確認
\# date
【Rails】deviseの導入

# はじめに
課題で読んだ本の感想を投稿するアプリケーションを作りましたが、色々と苦戦しましたので備忘録として記事を投稿しようと思います。
今回はdeviseの導入についてを記載します。

# 環境
- 開発 (cloud9)
- 言語 (Ruby 2.6.3)
- フレームワーク(Rails 6.1.6)

# deviseとは
簡単に認証機能を実装できるgemの一つです。
サインアップ機能やログイン機能が簡単に作れます。

# Gemを導入する
まず、Gemの導入します。
Gemの導入の流れは以下のようになります。
- GemfileにインストールしたいGemを記載
- Gemをインストールする


#### Gemfileにdeviseを記載する
Gemfileに、以下のようにコードを記載します。
コードの記載場所は最後の行に追加すると良いみたいです。
```:Gemfile
gem 'devise'
```

#### Gemをインストールする
コードが追加できたらGemをインストールします。
インストールするためのコマンドは「bundle install」になります。
※bundle installとは、Gemfileに記述したGemをインストールするためのコマンドです。
```:terminal
$ bundle install
```

# deviseをインストールする
deviceはGemをインストールした後、改めてインストールの手順が必要になります。
deviseをインストールするコマンドは以下になります。
```:terminal
$ rails g devise:install
```
これでdeviseの導入は完了です。

# 最後に
記事をご覧いただきありがとうございました。
記事の内容に誤りや理解不足な点がありましたら、ご指摘いただけると幸いです。
JavaScript　文字列の中で変数の値を使う方法　テンプレートリテラル

## 文字列の中で変数の値を使う方法

```js:例
// 変数
var name = "田中";
var color = "赤";

console.log(`私は ${name} です。 ${color} チームです。`);
// 私は田中です。赤チームです。
```
**解説**
- 文字列自体をバッククオート 「`」 で囲む。
- 使いたい変数を 「{}」で囲み、先頭にドルマーク 「$」 をつける。

※変数が配列の場合でも可能。添字を指定して値を使うことも可能。
例　${hoge[0]}
List of known Issues of Secure Hardware Extensions, No.971, AUTOSAR 21-11 (334) CP

List of known Issues of Secure Hardware Extensions, No.971, 2021-11

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_ListOfKnownIssuesSecureHardwareExtensions.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,319文書読んだ。2022年6月初初旬にFO, AP, CP 全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
なし

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

Glossary も　参考に入れましょう。

https://www.autosar.org/fileadmin/standards/foundation/21-11/AUTOSAR_TR_Glossary.pdf


Specification of Secure Hardware Extensions

https://www.autosar.org/fileadmin/user_upload/standards/foundation/21-11/AUTOSAR_TR_SecureHardwareExtensions.pdf

2019-11 発行から変更がない。
なぜ、known issuesがあるといいながら、変更しないのだろうか。

内容を読んで考えてみる。

# 文書履歴(document history)
ver. 0.01 初稿 20220608