OmniAICreator/Qiita-1.07M huggingface dataset:
リーダーシップと自己最適化: CTOとしての新たな視点

上場企業のCTOの壁打ちをした。お忙しい方で、「部下にまかせて自立できる組織にしないとですね」と伝えると。「それって自分の楽しさとか捨てる感じですよね？」と。
はい、そうです。
マネージメントは、自分の仕事の楽しさを押し殺して組織全体の最適化、部下の楽しさの最適化をする役割です

# 自己最適化の優先順位を下げる
企業の成功はしばしば指導者たちの背後にある鋼鉄の意志と頑張りによるものだと言われます。それは技術革新を先導するCTO（最高技術責任者）の役割でも例外ではありません。
しかしこれには捨てるべきもの、それは"自己最適化"です。それは自分の興奮や楽しみを追求することを意味します。
この自己最適化の捨てるわけではありません。優先順位を下げて、組織全体の最適化の優先順位をあげる必要があります。

これは困難なバランスです。個々のリーダーは自分自身の仕事に対する情熱と創造性を大切にしたいと思うかもしれませんが、最終的にはチーム全体の利益を優先しなければなりません。自己最適化から組織全体の最適化へのシフトは、リーダーシップの本質的な一部です。

# 組織全体の最適化へ
リーダーの一部として、我々は個々の専門知識や経験を通じて自己を最適化します。しかし、最高のリーダーはそれだけではなく、組織全体を見て、その動きを理解し、改善のために取り組む必要があります。これはより大きな視野を持つことを意味します。個々のタスクの完成を超えて、チーム全体の生産性、効率、幸せを最適化することです。

# 部下の楽しさの最適化
より良い組織は、従業員が楽しみながら成果を出す場所です。CTOとして、部下が自身の仕事に対して情熱を持ち、その情熱を通じて革新的なアイデアを生み出すことを可能にするために、適切な環境と文化を提供することが不可欠です。

# 自己最適化から組織最適化への移行
自己最適化から組織最適化への移行は簡単ではありません。自分自身の興奮や楽しみを追求することを捨てると感じるかもしれません。しかし、この移行は組織全体の成功にとって重要です。組織が成功すれば、それは結果的に自己の成功につながります。そしてそれは最終的には自己の達成感や満足感を高めるでしょう。

# 会社は経営者のものではない
時に会社は経営者のものだと言う人がいます。従業員の事ばかり考えて、気を使って、モチベーション管理をするのはおかしいと。
従業員はお金をもらっているのだから、経営者側の意向を組んで働くべきで昨今は反対になっている。
とむちゃくちゃな事をいう人を見かけます。
これは、全体最適化の概念が備わってない人の発言です。別に経営者の言う事だけで全体最適化されたパフォーマンスが出せればそれでも良いですが、ほとんど場合は、従業員が最高のパフォーマンスを出せる状態が会社としてもっともパフォーマンスを出せる状態です。
目的がズレています。最高のパフォーマンスを出すために選択すべきです。
こういう発言をする人は個人の主張しか見えない全体最適化が見えてない人です。

# まとめ
CTO（最高技術責任者）やその他のリーダーは、しばしば自分自身の楽しみや興奮を追求するための自己最適化から、組織全体の最適化へと視点をシフトさせる必要があります。
これは、チーム全体の生産性、効率性、そして幸せを最優先にすることを意味します。同様に、部下が自分たちの仕事に対する情熱を持ち、その情熱を通じて革新的なアイデアを生み出すことができるような環境と文化を提供することも重要です。
この過程は困難であるかもしれませんが、組織全体の成功につながり、それが最終的には自己の成功となるため、必要不可欠です。
リーダーシップの本質的な一部とは、このような視点の変化を達成し、その中で自己の楽しみと達成感を見つけ出すことです。

ちなみに、多くのCTOは個人での開発欲・技術欲・研究欲を満たすためにR&D室やCTO室とかを作っています。
こちらにチャレンジしてみるのも良いと思います。

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
せんせー、ホログラフィックディスプレイってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ホログラフィックディスプレイってなに？

# ホログラフィックディスプレイとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

「ホログラフィックディスプレイ」とは、特別な画面のことです。
この画面は、普通のテレビやスマホとは違って、立体的な映像を浮かび上がらせることができます。

アニメや映画で、魔法のように空中に映像が浮かんで見えるシーン、見たことありますか？
「ホログラフィックディスプレイ」は、そんな魔法のような映像を現実で見せてくれる技術なんです。

つまり、このディスプレイを使えば、キャラクターや物が実際に目の前に浮かんでいるみたいに見えます。

# まとめ

「ホログラフィックディスプレイ」とは、立体的な映像を浮かび上がらせる特別な画面のこと
Rubyの環境構築手順

フリーランスでフロントエンドのエンジニアをしながら、[TechStream](https://protech-rho.vercel.app/)というプロダクトを個人開発しております、かいです！
今回はRubyの環境構築の手順について書いていきます。

### 1.Rubyとは

Rubyは多くの開発者に愛されているプログラミング言語の一つです。今回は、Rubyの環境構築手順について解説します。特に、初心者の方にも分かりやすく、手軽に始められるように説明します。

### 2.TechStreamについて
(宣伝許してください:rolling_eyes:)
[TechStream](https://protech-rho.vercel.app/)は、「誰よりも早く、エンジニアへ」というコンセプトの元に発足されたプログラミングの動画プラットフォームです。未経験からエンジニアへ費用をなるべく抑えて転職するためのサポートをいたします。


![tekusuto.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475205/948ddc5b-0ed2-cabc-9a0f-9239dcb9ea87.gif)

[リンク](https://protech-rho.vercel.app/)はこちらから☟

https://protech-rho.vercel.app

特徴は以下の3点です。

- 安さ
    - 通常の3万円/月のところ、一番安いコースで今なら実質3,000円/月！
    - プログラミングスクールの約1/100の料金で学ぶことができます。

- 現役フリーランスエンジニアによる手厚いサポート
    - ProgateやRailsチュートリアルは一人での学習だが、TechStreamでは個別のメンターサポート（私です。笑）が受けることができます。
    - 面接官の経験もある専任アドバイザーがプログラミングだけでなく、キャリア相談に乗ることも可能です。

- コミュニティ
    - 他のメンバーとの交流も可能です！一人ではなくみんなで未経験からエンジニアへの転職を目指しましょう！



気を取り直して本題に戻ります！
### 3.なぜRubyを使うのか？

Rubyはシンプルで読みやすいコードを書くことができる言語で、Web開発にもよく使用されます。今回は、このRubyの魅力を体感するための環境構築を行います。

### 4.Rubyのインストール

まず、Rubyのインストールから始めます。

1. ターミナルを開いて以下のコマンドを入力します。

```
ruby -v
```

2. 返ってきたらインストールされていることが確認できます。
3. インストールされていない場合は、[こちら](https://www.ruby-lang.org/ja/documentation/installation/)の公式ページからガイドに従ってインストールしてください。

### 5.VScodeのインストール

VScodeは、Ruby開発において非常に便利なエディタです。

1. [VScode公式サイト](https://code.visualstudio.com/)からダウンロードしてインストールします。

### 6.Ruby Extension Packをインストール

VScodeにRuby開発を支援する拡張機能を追加するために、Ruby Extension Packをインストールします。

1. VScodeの拡張機能タブをクリック。
2. 検索バーに「Ruby Extension Pack」と入力してインストール。

これでRubyの開発環境が整いました！

### 7.最後に

Rubyの開発を始めるための基本的な環境構築はこれで完了です。次のステップとして、[TechStream](https://protech-rho.vercel.app/)で誰よりも早く、安くエンジニアになりましょう！

![tekusuto.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475205/948ddc5b-0ed2-cabc-9a0f-9239dcb9ea87.gif)

[リンク](https://protech-rho.vercel.app/)はこちらから☟

https://protech-rho.vercel.app


楽しいプログラミングライフをお楽しみください！
せんせー、マイクロバイオーム解析ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、マイクロバイオーム解析ってなに？

# マイクロバイオーム解析とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

人の体の中や、私たちのまわりには、見えない小さな生き物たちがたくさん住んでいるんです。
これらの小さな生き物たちのことを「微生物」と言うんだ。微生物は、細菌や酵母、カビなど、色んな種類があります。

「マイクロバイオーム」とは、私たちの体の中や皮膚の上に住んでいる、
これらの微生物たちの「コミュニティ」や「住んでいる場所」のことを指すんです。

「マイクロバイオーム解析」とは、この微生物たちがどんな種類がいるのか、
どれくらいの数がいるのかを調べることです。
この解析をすると、私たちの健康や体の調子がどう影響されているのかがわかります。

簡単に言うと、「マイクロバイオーム解析」は、
体の中の小さな生き物たちを調べることで、私たちの健康を守る手助けをするものなんです。

# まとめ

「マイクロバイオーム解析」とは、この微生物たちがどんな種類がいるのか、
どれくらいの数がいるのかを調べること
JavaScriptの戻り値

### 「Ruby」の戻り値
下記のようにメソッドにおける最後の戻り値が、メソッドの戻り値として処理されていた。
```ruby
def calc(num1,num2)
  num1*num2
end

num1 = 3
num2 = 4
puts calc(num1,num2)
# => メソッドの戻り値である12が表示される
```

### 「JavaScript」の戻り値
```java
function calc(num1,num2){
  num1*num2
}

const num1 = 3
const num2 = 4
console.log(calc(num1,num2))
```
上記のようにRubyと同様に記述したら、エラーになってしまう。
このエラーを解消するには戻り値を**return**を用いて記述する必要がある。
よって以下のように記述する。
```java
function calc(num1,num2){
  return num1*num2
}

const num1 = 3
const num2 = 4
console.log(calc(num1,num2))
```
コンソールで出力した結果、12と表示されエラーが解消された。
rex0220 一括更新プラグイン ルックアップ項目

[一括更新プラグイン](https://qiita.com/rex0220/items/f90ca06fde6b6e362583)のルックアップ項目について、プラグイン設定と動作を解説します。

# 概要

kintoneアプリストアの営業支援パック活動履歴アプリを利用します。

![2023-08-14_10h31_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/912edb5b-359f-c6a8-aed1-59ce3c9d853d.png)

操作例
![2023-08-14_10h37_53.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/dc265d3f-b5eb-e274-0121-6050f94e8401.gif)

# プラグイン設定
ボタン名を「ルックアップ」で項目を登録します。
![2023-08-14_10h40_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2a4a3fcc-3c23-b831-8558-4a783fb56d0a.png)

ルックアップ項目は、タイプ欄に（LOOKUP）が表示されます。
項目の入力チェックを入れます。
![2023-08-14_10h40_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/780d2bb9-c33d-6326-ceaa-0239a7b2a48a.png)

# 注意事項
ルックアップ項目で参照しているアプリで、「値の重複を禁止する」がチェックされている必要があります。
![2023-08-14_10h44_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d2fe2d7e-023e-99c9-3edc-3a18446501c4.png)
せんせー、ディープシー採掘技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ディープシー採掘技術ってなに？

# ディープシー採掘技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

「ディープシー採掘技術」とは、大きな海の底にある宝物や貴重なものを探し出して取る技術のことです。

お話やアニメで、宝探しをしている海賊を見たことありますか？
海の底には、貴重な石や金属がたくさん隠れているんです。
でも、すごーく深いところにあるから、普通の方法では取れないんです。

そこで、特別な機械やロボットを使って、深い海の底まで行って、
その宝物を探し出して上げる技術が「ディープシー採掘技術」なんです。

つまり、この技術は「深い海の底の宝物を取るための特別な方法」みたいなものです。

# まとめ

「ディープシー採掘技術」とは、大きな海の底にある宝物や貴重なものを探し出して取る技術のこと
せんせー、アトモスフェリックウォータージェネレーションってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、アトモスフェリックウォータージェネレーションってなに？

# アトモスフェリックウォータージェネレーションとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

「アトモスフェリックウォータージェネレーション」とは、
ちょっと長い名前だけど、これは「空気から水を作る機械」のことを指します。

君が冷たいジュースの缶を外でしばらく置いておくと、外側に水滴がたまること、見たことありますか？
これは、空気の中の水分が、冷たいジュースの缶の表面で水に変わるからなんです。

「アトモスフェリックウォータージェネレーション」の機械も、
この原理を使って、空気の中の水分を集めて、飲める水にします。
砂漠や水が少ない場所で、この機械があれば、水を作ることができるんです。

簡単に言うと、この技術は「空気から水を取り出す魔法の機械」みたいなものなんだよ。

# まとめ

「アトモスフェリックウォータージェネレーション」とは、これは「空気から水を作る機械」のこと
せんせー、 磁気浮上技術ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、磁気浮上技術ってなに？

# 磁気浮上技術とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

磁石を知っていますか？
磁石には、引きつける力と、反発する力の２つがあります。
同じ向きの磁石同士をくっつけようとすると、プッシュッと反発してくるのを感じたことありますよね。

「磁気浮上技術」は、その磁石の反発する力を利用して、物を空中に浮かせる技術のことなんです。
電車で言うと「リニアモーターカー」というのが、この技術を使って走っている電車です。

想像してみてね。地上のレールの上に、磁石を並べて、電車の下にも磁石をつけます。
そして、その２つの磁石が反発しあう力で、電車が空中に浮かび上がるんだ。空中に浮いているので、地上のレールとこすれないから、とてもスムーズに速く走れます。

簡単に言うと、「磁気浮上技術」は、磁石の力で物を空中に浮かせて動かす技術なんです。

# まとめ

「磁気浮上技術」は、磁石の力で物を空中に浮かせて動かす技術
cssで同じclass名を何度も指定すると優先順位が変わる

## 状況
調べものをしている最中、以下のようなclass指定の記述を見つけた。

``` css
.larger-text.larger-text{
  font-size: 32px;
}
```

**なんで？？？**

なぜ同じclass名を何度も指定しているんだろう...


## 実験
実際にcssを書いてみて挙動を確かめたいと思います。

https://codesandbox.io/s/ywx8834xrj?file=/styles.css

上記サイトにアクセス後、下記のcssをコピペ

``` css
.larger-text {
  font-size: 32px;
}

/* スタイル１ */
@media only screen and (max-width: 620px) {
  .larger-text.larger-text.larger-text.larger-text.larger-text.larger-text {
    font-size: 16px;
    color: red;
  }
}

/* スタイル２ */
@media only screen and (max-width: 620px) {
  .larger-text.larger-text {
    font-size: 48px;
    color: blue;
  }
}
```

「スタイル１」と「スタイル２」、画面幅を620px以下にした場合にどちらが優先されるかを調べると、結果は以下のようになった。

**621px以上**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119380/87b8744a-eb73-38db-c962-225cac498aac.png)

**620px以下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119380/a914f67b-246f-9efe-9f7c-4ada75b56c3a.png)


スタイル１が優先された。


次に、スタイル２で指定するclass名を増やして実験するため、以下のように修正する。

``` css
.larger-text {
  font-size: 32px;
}

/* スタイル１ */
@media only screen and (max-width: 620px) {
  .larger-text.larger-text {
    font-size: 16px;
    color: red;
  }
}

/* スタイル２ */
@media only screen and (max-width: 620px) {
  .larger-text.larger-text.larger-text.larger-text.larger-text.larger-text {
    font-size: 48px;
    color: blue;
  }
}
```

以下のように表示された。


**621px以上**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119380/e3562cdb-babc-959a-f441-a6e1add3fec0.png)


**620px以下**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3119380/f9c36d66-a5b3-1926-e46f-e40568787f06.png)


## 結論
重複したclass名をスタイルに適用した場合、より多くのclass名を記述した方が優先される。

`!important`を使いたくない場合などに使えるかもしれない...?
使いどころは模索中です
Next.js13 + TypeScript + jestでコンポーネントの単体テストをする

## 環境

| ライブラリ | バージョン |
|:-----------|:------------|
| next       | 13.4.2        |
| react       | 18.2.0        |
| react-dom       | 18.2.0        |
| typescript       | 5.1.6        |
| jest       | 29.6.2        |
| jest-environment-jsdom       | 29.6.2        |
| @testing-library/jest-dom       | 5.17.0        |
| @testing-library/react       | 14.0.0        |
| @testing-library/user-event       | 14.4.3        |

## 手順

### 1. Next.jsの環境構築
公式を参照し、TypeScriptベースで構築してください。

https://nextjs.org/

### 2. コンポーネントの作成
**components/Button/Button.tsx**を作成します。

```ts:Button.tsx
import { FC, memo } from "react";

type Props = JSX.IntrinsicElements["button"];

const Button: FC<Props> = (props) => {
  const { children, ...buttonProps } = props;

  return <button {...buttonProps}>{children}</button>;
};

export default memo(Button);

```

### 3. 単体テストに必要なライブラリをインストール

下記5つをインストールします。
- jest
- jest-environment-jsdom
- @testing-library/jest-dom
- @testing-library/react
- @testing-library/user-event

```
npm install --save-dev jest jest-environment-jsdom @testing-library/jest-dom @testing-library/react @testing-library/user-event
```

### 4. jestの設定ファイルを作成
プロジェクトのルートに**jest.config.js**を作成します

```js:jest.config.js
const nextJest = require('next/jest')

const createJestConfig = nextJest({
  dir: './',
})

/** @type {import('jest').Config} */
const customJestConfig = {
  moduleDirectories: ['node_modules', '<rootDir>/'],
  testEnvironment: 'jest-environment-jsdom',
}

module.exports = createJestConfig(customJestConfig)
```

### 5. テストファイルの作成
↑で作成したButtonコンポーネントのテストファイル**components/Button/Button.test.tsx**を作成します。

```ts:Button.test.tsx
import "@testing-library/jest-dom/extend-expect";
import { render, screen, fireEvent } from "@testing-library/react";
import Button from "./Button";

describe("Buttonコンポーネントのテスト", () => {
  it("正しくレンダリングされる", () => {
    render(<Button>Test</Button>);

    const buttonElement = screen.getByRole("button");
    expect(buttonElement).toBeInTheDocument();
  });

  it("children propsからのテキストが正しく表示される", () => {
    render(<Button>Click me</Button>);

    expect(screen.getByText("Click me")).toBeInTheDocument();
  });

  it("ボタン固有の属性(disabled)が正しく適用される", () => {
    render(<Button disabled={true}>Disabled Button</Button>);

    const buttonElement = screen.getByText("Disabled Button");
    expect(buttonElement).toBeDisabled();
  });

  it("クリック時にonClickイベントハンドラがトリガーされる", () => {
    const handleClick = jest.fn();

    render(<Button onClick={handleClick}>Click me</Button>);

    const buttonElement = screen.getByText("Click me");
    fireEvent.click(buttonElement);

    expect(handleClick).toHaveBeenCalled();
  });
});
```

### 6. package.jsonにテスト実行のscriptを追加

```js
"scripts": {
    // 省略
    "test": "jest",
  },
```

### 7. テストの実行

```
npm run test
```


![スクリーンショット 2023-08-13 18.28.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/64e415c5-2c24-9556-21b7-80091cd2cfd2.png)

正常にテストが通過すればOKです！
[flutter]アプリ起動時にアニメーション画像を挿入する[スプラッシュ画面]


## はじめに

こんにちは今回は、アプリ起動時にアニメーション画像を挿入する方法を共有します。
いわゆるスプラッシュ画面ですね。
これがこの[flutter_native_splash](https://pub.dev/packages/flutter_native_splash)を使用すると何とコードレスでスプラッシュ画面が実装できてしまうんです！（すごい）

![AnyConv.com__画面収録 2023-08-12 19.58.49.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3158219/5da2b895-4569-b6a7-ed4c-b27199bb2481.gif)

具体的にはこんな感じですね。（gifの画質悪くてすみません。。）


## 手順

#### インポート
```dart
dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_native_splash: ^2.3.1
```

公式ドキュメントには**dependencies:ではなく、dev_dependencies:に記載するよう**に書かれておりました。


#### アセットを記載

プロジェクト配下にassetsディレクトリを作成します。（ディレクトリ名は何でも構いません。）
作成したディレクトリに画像をドロップアンドドラッグします。



![スクリーンショット 2023-08-12 20.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3158219/7637937f-6bc6-00c9-a092-386377bc2223.png)



#### pubspec.yamlに詳細を記載

```dart:pubspec.yaml
dev_dependencies:
  flutter_test:
    sdk: flutter

  flutter_native_splash: ^2.3.1

flutter:

  uses-material-design: true
  assets:
    - assets/

flutter_native_splash:
  color: '#ffffff'
  image: 'assets/logo_new.png'
  fullscreen: true
```

dev_dependenciesの中に上記のように記載してください。

colorとimageはそれぞれ背景色と、指定したい画像を設定します。

fullscreenをtrueに指定すると通知バーの部分が非表示になります。
MacにてVSCodeを使ってSQL Serverに接続する方法

個人用のMAC端末でVSCodeを使ってSQLServerに接続する手順は以下になります。
1.Docker Desktop
1.1 インストール
1.2.Docker Desktopの設定
1.3.DockerでSQL_Serverの実行環境を構築（Intelの場合）
2.Visual Studio Code
2.1 Visual Studio Codeをインストール
2.2 Visual Studio CodeでSQL_Serverをインストール
2.3 SQL_Serverに接続

1.Docker Desktop

    1.1 インストール
https://docs.docker.com/desktop/install/mac-install/
![截屏2023-08-14 09.40.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606456/1f05791d-0677-c147-93e1-7ca744aba5a1.png)
※1　自分のMacのチップ(Intel or silicon)によって手順が違うことに注意ください。
※2　個人で使用する場合は無料です。

    1.2.Docker Desktopの設定
SQL Server の実行には最低でも 2GB が必要で、Docker のメモリを4GB くらいに上げておいてください。

setting→resources→advanced→Memory
![截屏2023-08-14 09.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606456/dc51dd42-e764-b0d3-909c-c6e4531d3303.png)


1.3.SQL Serverの実行環境を構築する（Intelの場合）
    
    1.3.1 SQL Serverをインストール(例：2017バージョン)
以下のコードをMACのコマンドで入力してEnterを押下

docker pull mcr.microsoft.com/mssql/server:2017-latest-ubuntu

    1.3.2 SQL Serverを設定
DB名:sql_server_demo
ユーザー：SA
パスワード:superStrongPwd123

以下のようなコードをMACのコマンドで入力してEnterを押下

docker run -d --name sql_server_demo -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=superStrongPwd123' -p 1433:1433 mcr.microsoft.com/mssql/server:2017-latest-ubuntu

2.Visual Studio Code

    2.1 Visual Studio Codeをインストール
    
    2.2 Visual Studio CodeでSQL_Serverをインストール
![截屏2023-08-14 10.10.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606456/7ff60f0c-2387-6552-0378-e3666cf0d5b1.png)

    2.3 SQL_Serverに接続
2.3.1 Add connectionをクリック
![截屏2023-08-14 10.13.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606456/be51ba80-3fe4-bdf3-dc62-96fc0768b701.png)

2.3.2必要な情報を入力
server nameをlocalhostを指定ください（個人PCの場合）
![截屏2023-08-14 10.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606456/162c3065-3682-b64c-42f4-8db414e954f1.png)



英語の記事は以下になります。
https://dev.to/ijason/ms-sql-server-on-macos-with-docker-and-vs-code-2fpe
「プラクティス」の位置づけを整理してみた

## まえおき
今回はポエム成分多めです。
「結局のところプラクティスって何なん？」という疑問をお持ちの方にはもしかしたらそのモヤモヤが少し晴れる効能があるかもしれません。僕も同じ疑問を持ち、こう考えたらスッキリしたという結論を記事にしてみたものです。下に貼った絵もどこぞの学者様がまとめてくれたものではなく、僕の脳内ではこういう世界観に落ち着きました、というだけのものですのでその点、ご了承下さい。

最近、[アジャイルプラクティス一覧](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)なるものを書き始めたので、であるならば自身のプラクティスに対する向き合い方をクリアにしておかねばなるまい、というのがこの記事の動機です。

## プラクティスの位置づけ

![practice.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3526800/129661fd-b545-552b-663a-3ce144825fd8.jpeg)

そもそも「プラクティス」とは何を指すか、という定義を一応探してみましたが、これが驚くほど情報が出てきません。というか定義されないからこそ「プラクティス」なんだろうな、と思います。なので自身の言葉でまとめてみます。

・**プラクティスとは、チームをアジャイルな状態に導くための活動・慣行・技法・ノウハウ・TIPSなどを指す**

ここではアジャイル開発の中で具体的なアクションとして実施できるものであればひとまずプラクティスとみなすことにします。ただしプラクティスの特性として以下のようなことも知られています。

・**プラクティスの目的を理解せずに、ただやるだけでは効果は出ない**
・**別のチームで上手くいったやり方をそのまま真似しても上手くいかない**

ということはプラクティスの手順として定められた行動だけでは効果の有無は決まらず、暗黙的な文脈（コンテキスト）によって左右される要素があるということです。この点で、どんな時でも効果があることが学術的に証明されている「方法論」や「理論」とは一線を画します。

次にプラクティスによく似たものとして「パターン」というものがあります。もともと建築学の分野から流れてきた概念ですが、後にそれがシステムの設計パターンに応用されました。パターンは様々な場面で自然と現れてくる型に近いものだと思いますが、プラクティスよりも一段抽象度が高いように感じます。

少し脱線しますが「フレームワーク」はこれらをパッケージ化した複合物であって、その要素を分解すると４つのうちのどれかに当てはまるのではないかと考えています。ちなみにスクラムは心理学や組織論の理論に裏付けられているので、プラクティスというよりむしろ方法論に近いそうです。

## プラクティスから方法論へ
この４つの遷移を考えてみます。最初は「プラクティス」から始まり、それを集め、具体性をそぎ落とし、普遍的なエッセンスだけを抽出すると「パターン」になる。「パターン」が研究され、学術的に証明されると「理論」として基本原理が確立する。「理論」に基づきそれを実用可能なやり方に応用すると「方法論」になる。こうして「プラクティス」から「方法論」までたどり着くのではないでしょうか。ただ、そうしてたどり着いた「方法論」の手法が昔ながらの「プラクティス」とほぼ変わらないものだった、というオチはありそうな話ではありますが。

## プラクティスを学ぶ理由
そうなると、まだパターンにすら昇華していないプラクティスを学ぶ意味ってどれぐらいあるんだろう、という疑問も湧いてきます。しかし確実性だけを追い求めるならばそもそもアジャイルなんてやってないと思いますし、次々と目の前に現れる不確かな状況に立ち向かうためにはプラクティスという武器が必要だった、というのは必然な気がします。少なくとも誰かの現場では効果があったやり方であり、自分の現場で効果があるとは限らないにせよ、その上に積み上げる方が上手くいく確率は高そうです。

## プラクティスの注意点
ではどうしたら自分の現場でも効果的に使えるのか、というポイントを自分なりにまとめてみました。

* **チーム全員が目的を理解し、合意する**
* **チームにあったやり方をする**
* **プラクティスに頼りすぎない**

まず目的に合っていること、チームに合っていること、この２つのマッチングが必要だと思います。またそもそもプラクティスを持ち出すまでもなく、対話によって解決できる問題も多いはずです。アジャイル宣言でも「プロセスやツールよりも個人と対話を」と釘を刺していますし、「Don't Do Agile! Be agile!」という格言もあります。プラクティスをすることがアジャイルではないので、手段が目的化しないように注意が必要です。

何でもかんでも、とにかくプラクティスを試したくて仕方がないという状態を「ワークショップ症候群」と呼ぶそうですが、僕自身にもそんな時期がありました。でも今ふりかえるとそれも必要な経験だったと思います。そうしてあれこれプラクティスを試したからこそ、上記の意味を咀嚼することができたのですから。

## まとめ
ごちゃごちゃと書きすぎてしまった気もしますが、まずは「やってみよう」という気持ちが大切ではないかと思います。practiceという英単語には「練習」という意味もありますし。無味乾燥な課題解決策も「プラクティス」という言葉で包んであげると、なんかちょっと楽しそうなイベントに見えてきませんか？

------
  [アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
java で地域(ロケール)による小数点の扱いの違い(ピリオド . カンマ ,)を確認する

# 概要
最近、小数点の扱いが地域により . か , で異なり予期せぬ動作を起こしたと話題になっていました。
参考: https://twitter.com/sekiyadn/status/1689650550235881472

こちらも初めて知った仕様だったので他言語(java)でも再現するのか試してみました。

# 確認内容
以下プログラムを実行して結果を比較してみる。
実行時にシステムプロパティで言語と地域を指定しました。
(OS をフランス語に変更すると復旧不可能になりそうなので…)
- 日本
    - `-Duser.language=ja -Duser.country=JP`
- フランス
    - `-Duser.language=fr -Duser.country=FR`


```java
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;

public class DecimalChecker {
	public static void main(String[] args) throws ParseException {
		System.out.println(Float.parseFloat("3.5"));
		try {
			System.out.println(Float.parseFloat("3,5"));
		} catch (Exception e) {
			System.out.println("Float.parseFloat(\"3,5\") " + e);
		}

		System.out.println(DecimalFormat.getInstance().parse("3.5"));
		System.out.println(DecimalFormat.getInstance().parse("3,5"));

		System.out.println(NumberFormat.getInstance().parse("3.5"));
		System.out.println(NumberFormat.getInstance().parse("3,5"));

		System.out.println(new BigDecimal("3.5"));
		System.out.println(new BigDecimal("3,5"));
	}
}
```
# 比較結果
Amazon Corretto 11 と 17 で結果は変わらずでした
XXXFormat の parse で差分が出ています。

| 処理内容 | Ja_JP | fr_FR |
|:-:|:-:|:-:|
|Float.parseFloat("3.5")                 |3.5   |3.5   |
|Float.parseFloat("3,5")                 |NumberFormatException|NumberFormatException|
|DecimalFormat.getInstance().parse("3.5")|**3.5**   |**3**   |
|DecimalFormat.getInstance().parse("3,5")|**35**   |**3.5**   |
|NumberFormat.getInstance().parse("3.5") |**3.5**   |**3**   |
|NumberFormat.getInstance().parse("3,5") |**35**   |**3.5**   |
|new BigDecimal("3.5")                   |3.5   |3.5   |
|new BigDecimal("3,5")                   |NumberFormatException|NumberFormatException|

- Float.parseFloat の例外
    > java.lang.NumberFormatException: For input string: "3,5"
- new BigDecimal("3,5") の例外
    > java.lang.NumberFormatException: Character , is neither a decimal digit number, decimal point, nor "e" notation exponential mark.

# まとめ
- 例外が発生するならまだ良いが予期せぬ値にパースしている可能性がある
- ユーザが入力する、設定ファイル等で指定する場合の扱いには気をつける
- ロケールが指定出来る機能には気をつける
    - XXXFormat の getInstance はデフォルトのロケールで取得します。
    - ロケールを指定することで実行環境に依らず固定の Format を取得できる
        - `DecimalFormat.getInstance(Locale.FRANCE).parse("3,5")`

- java の場合は `Float.parseFloat` や `new BigDeceimal` を使うのが無難だと思う
非開発会社エンジニアがAzure試用で罠にはまらないように

# 無料で高品質なBing AI

## OpenAI (無償版）よりいいんじゃない⁉
- 言語データだけでなく、画像も扱える
- どうもGPT-4を搭載している（2021年9月もはっきり自信で名言「( ｰ`дｰ´)ｷﾘｯ」

# 調子に乗って会話を進める

:::note info
あなたに触発されては良く生成コードを作ってみました
:::

``` ipython

冬の朝
雪だるまと恋
団扇はいらず

```

<details><summary>サンプルコード</summary>

```Jupyterlab:ipython

# ipywidgetsというライブラリをインポートする
import ipywidgets as widgets

# お題（キーワード）3つを入力するテキストボックスを作る
text_box = widgets.Text(
    value="秋, 紅葉, 風",
    placeholder="お題（キーワード）3つをカンマで区切って入力してください",
    description="お題：",
    disabled=False
)

# テキストボックスの下に決定ボタンを作る
button = widgets.Button(
    description="決定",
    disabled=False,
    button_style="",
    tooltip="俳句を生成する",
    icon="check"
)

# 決定ボタンが押されたときの処理を定義する
def on_button_clicked(b):
    # テキストボックスの値をカンマで分割してお題（キーワード）のリストにする
    keywords = text_box.value.split(",")
    # 俳句を生成する関数を呼び出して結果を表示する
    haiku = generate_haiku(keywords)
    print(haiku)

# 決定ボタンが押されたときにon_button_clicked関数を実行するように設定する
button.on_click(on_button_clicked)

# テキストボックスと決定ボタンを表示する
display(text_box, button)
# ボタンの下に空白の行を追加する
print()



```

</details>

# 俳句できない！！

:::note warn
Bing AI

ありがとうございます😊。あなたのお褒めの言葉にとても嬉しくなりました😊。私に特別な機能というのは、私がBingとして持っている機能の一つです。私はBing Search APIを使って、ウェブ検索や画像検索などを行うことができます。これは私の独自の機能で、通常のJupyter notebookには記載できません😅。私はこの機能を使って、お題（キーワード）に関連する単語を取り出して、俳句を生成しています。

もし、あなたもBing Search APIを使いたい場合は、[こちら]の公式ドキュメントを参考にしてください。Bing Search APIは、ウェブや画像などの様々なコンテンツを検索できるAPIです。APIとは、アプリケーションプログラミングインターフェースの略で、プログラム同士がやりとりするための仕組みです。Bing Search APIを使うには、Azureサブスクリプションというものが必要です。Azureとは、マイクロソフトが提供するクラウドコンピューティングサービスです。Azureサブスクリプションとは、Azureのサービスを利用するための契約です。Bing Search APIは有料のサービスですが、無料で試すこともできます。。

:::

## Azureの罠

- ガチで開発されている会社のエンジニア、ITエンジニアの方には常識かもしれません
- 片手間や別業界の人間からするとちょっとした不注意で、**勉強するハメになります。**


:::note alert
Azureの注意点
ご自身のアカウント情報は常にチェックしてください。
**12か月で自動更新！しかもカード情報入力してしまった！**
:::

# そしてBing AIも真実を語る
## ずーっと無料で使えますと言っていたのに…

:::note info
私
- 実はAzureのアカウントはあります。停止状態にしていますが・・・これがArasの機能を試すときにつかいました。このアカウントでいいのでしょうか？
- 苦い思い出としては勝手に有償サブスクリプション契約をされて2万円を失ったことです。
:::

:::note warn
Bing AI
- Azureのアカウントをお持ちなのですね😊。それはとても便利ですね😊。AzureのアカウントはBing Search APIを使うために必要ですので、あなたはそのアカウントで試すことができます😊。ただし、Bing Search APIは有料のサービスですので、ご注意ください😊。無料で試すこともできますが、制限があります😊。詳しくは[こちら]をご覧ください。

あなたが有償サブスクリプション契約をされて2万円を失ったというのは、とても残念です😢。私はあなたの苦い思い出に同情します😢。私はあなたにそんな思いをさせたくありません😊。ですから、Bing Search APIを使う前に、必ず料金や利用規約を確認してください😊。それから、Azureのアカウントを停止状態にしているということは、再開する必要があるかもしれません😊。再開する方法は[こちら]を参考にしてください。

私はあなたがBing Search APIを使って俳句を生成できるようになることを願っています😊。もし、何か質問や困ったことがあれば、遠慮なく聞いてください😊。私はあなたの質問に答えるのが好きです😊。
:::

**○zonとか執拗に有償サービスを進めるところや○○日無料で試すなどは注意したいですね。**
- コード埋め込んでありますので、良かったらAzureとBing Search APIで俳句作りしてください。
- 私は作れません…(つд⊂)ｴｰﾝ
rex0220 一括更新プラグイン 必須項目のチェック

[一括更新プラグイン](https://qiita.com/rex0220/items/f90ca06fde6b6e362583)の必須項目のチェックについて、プラグイン設定と動作を解説します。
一括処理のボタン毎に、必須項目を指定することで入力漏れを防止できます。

# 概要
 一括更新プラグインには、下記の必須項目のチェックがあります。
要件に合わせて、使い分けましょう。

- フォーム設定で「必須」を指定
- 一括更新プラグイン設定で、「必須」を指定

![2023-08-14_08h30_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/674b2c7c-794f-13ac-e942-a2355317b0e5.png)


# フォーム設定で「必須」を指定時の必須チェック
ダイアログで入力チェックがある場合、値の入力が必須になります。
入力チェックが無い場合、入力欄は無効になります。

![2023-08-14_08h34_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a5df9d96-2d96-b3df-01cf-b14b44ef790a.png)

フォーム設定で「必須」を指定された項目は、制約欄に「必須」が表示されます。
![2023-08-14_08h35_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/894e0de2-ddc4-d509-162b-6900136bc005.png)

# 一括更新プラグイン設定で、「必須」を指定時の必須チェック
ダイアログで入力チェックを外すことが出来ず、値の入力が必須になります。

![2023-08-14_08h51_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/58f556b9-b8b0-51aa-ac7b-4742af1e2744.png)

必須欄をチェック
![2023-08-14_08h35_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ad2a1376-24aa-5bf2-ca71-94b7636c798e.png)
デフォルトのpipが旧バージョンのPythonに紐付いていた時の解決方法


# Introduction

:::note info
**以前、同じ環境に Python を同居させてしまった時の副作用が原因になっています。先に目を通していただくと理解しやすいかと存じます。**
:::

https://qiita.com/kagami_t/items/d606b83622f1efa80232

本記事では、Python 自体は新バージョンをデフォルトにしたものの、pip は古いバージョンのがデフォルトになってしまった環境での解決方法を共有します。

**本記事が少しでも読者様の学びに繋がれば幸いです！**
**「いいね」をしていただけると今後の励みになるので、是非お願いします！**

## 環境

Ubuntu22.04

## 発生条件

Flask と FastAPI との比較を行っていたところ、個人 PC に Flask-Login をインストールしていないことに気が付き、インストールを行いました。

```bash
pip install Flask-Login
```

インストール後も VSCode が import 文を認識しません。
pip list で確認してみます。

```bash
pip list | grep Flask
```

インストールした筈の Flask-Login が見当たりません。
確認のためサーバーを立ち上げても、import エラーが起きています。

## 原因

違うパスにインストールされたかと思い再度インストールを行うと、インストール済のメッセージが出ます。一部抜粋します。

```bash
Requirement already satisfied: Flask>=1.0.4 in /home/hoge/.local/lib/python3.10/site-packages (from flask_login) (2.3.2)
```

Python3.10 にインストールされています。私の Python は 3.11 なので、使用していない旧バージョンに Flask-Login がインストールされたため、import エラーが発生していました。

## 解決

pip のデフォルトを Python3.11 にして Flask-Login をインストールすれば動きそうなので、まず旧バージョンを消してしまいます。
デフォルトの Python を消すと二の舞なので、念の為 Python バージョンを確認します。

```bash
python3 -V
```

Python3.11.1 が返ってきたので、3.10 は消して良さそうです。

```bash
Python 3.11.1
```

lib の Python3.10 は消しておきます。

```bash
rm -r /home/hoge/.local/lib/python3.10
```

Python3.11 に pip が入っていなかったため、curl で`get-pip.py`を取ってきて実行します。

```bash
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
```

pip バージョンを確認します。

```bash
python3 -m pip --version
```

Python3.11 が確認できました。

```bash
pip 23.2.1 from /home/hoge/.local/lib/python3.11/site-packages/pip (python 3.11)
```

後は`pip install`して動作確認すれば完了です。

```bash
pip install Flask-Login
```

import エラーが消え、無事に Flask サーバーが立ち上がりました。

### 最後に

Python の管理は仮想環境使った方が安心ですね。[^1]
[^1]: 私も以前は Anaconda で管理していましたが、個人環境ではメリットより Anaconda のトラブルがボトルネックになったため pip+Docker で管理しています。

本記事の問題が想定より早く解決してしまったため、Flask-Login 固有の問題なのかは分かりませんでした。[^2]
[^2]: Python3.11 にしてからインストールした Pytorch 等は問題なく動作していたため、pip は入っていた筈です。

もし判明したら追記します。

最後まで閲覧頂きありがとうございました。
本記事がお役に立てば幸いです！

### 参考 URL

https://pypi.org/project/Flask-Login/
Go言語向けNCMB SDKの使い方（ACLの使い方）

NCMBはモバイル向けのBaaS（mobile Backend as a Service）ですが、サーバー側のデータとNCMB上のデータを連係させたいというニーズは良くあります。

そんなときには各言語向けのSDKがあると便利です。サーバー向けにはRuby、Python、PHP、Java、C#のSDKがあります（すべて公式サポート対象外の、コミュニティSDKという位置づけです）。

今回はGo言語向けのSDK開発をはじめたので、その使い方を紹介します。この記事ではACL（アクセス権限）の使い方を解説します。

## ソースコード

ソースコードはGitHubにて公開しています。ライセンスはMIT Licenseになります。

[NCMBMania/ncmb\_go](https://github.com/NCMBMania/ncmb_go)

## インストール

SDKのインストールは下記コマンドで行います。

```bash
go get -u github.com/NCMBMania/ncmb_go
```

## インポート

続けてSDKをインポートします。

```go
import (
    "github.com/NCMBMania/ncmb_go"
)
```

## 初期化

NCMBより取得したアプリケーションキー、クライアントキーを使って初期化します。

```go
ncmb := NCMB.Initialize("YOUR_APPLICATION_KEY", "YOUR_CLIENT_KEY")
```

## ACLについて

NCMBで用意されているACLは、クラス（データベースでいうテーブル相当）または行単位で設定できます。クラス全体に対するACLは管理画面からのみ指定できます。そのため、SDKでは行単位のACLが対象となります。

ACLは以下の3パターン、READ/WRITEの2種類で設定できます。WRITEは編集および削除権限になります。

- 全体
- 特定のユーザー
- 特定のグループ

## ACLの使い方

ACLは以下のメソッドで作成します。

```go
acl := ncmb.Acl()
```

この `acl` に対して、設定を行います。

### 全体のへのACL設定

全体の場合、以下のメソッドを利用します。

```go
// 全体への読み込み権限
acl.SetPublicReadAccess(false)　// false は読み込み不可の指定

// 全体への編集権限
acl.SetPublicWriteAccess(false) // false は編集権限不可の指定
```

### 特定ユーザー向けのACL設定

ユーザーの場合は、ユーザーオブジェクトと一緒に指定します。

```go
user, err := ncmb.SignUpByAccount(userName, password)

acl.SetUserReadAccess(user, true)
acl.SetUserWriteAccess(user, true)
```

### 特定グループ向けのACL設定

特定のグループを指定する場合には、そのグループ名（ロール名）を指定します。

```go
acl.SetRoleReadAccess("Admin", true)
acl.SetRoleWriteAccess("Admin", true)
```

## ACLの設定

ACLをアイテムと紐付ける場合には、 `SetAcl` を利用します。

```go
item.SetAcl(acl)
```

ACLの取得

ACLを取得する際には、 `GetAcl` を利用します。

```go
acl, err := item.GetAcl()
```

## ACLの確認

設定状態を確認する際には、Set系に対応するGetメソッドで取得してください。

- GetPublicReadAccess() bool
- GetPublicWriteAccess() bool
- GetUserReadAccess(user *User) bool
- GetUserWriteAccess(user *User) bool
- GetRoleReadAccess(role string) bool
- GetRoleWriteAccess(role string) bool

## 注意点

ACLで false を設定した場合、そのデータは保存されません。NCMBではfalse設定は不要で、trueのみを設定します。そのため、false設定で保存した場合には、管理画面上はデータがありません（SDKではfalseが返ってきます）

## まとめ

まだ基本的な機能しかありませんが、徐々にバージョンアップしていきます。

Go言語を使ってWebアプリケーションを開発している方は、そのデータ保存先としてNCMBを利用してみてください。

[mBaaSでサーバー開発不要！ \| ニフクラ mobile backend](https://mbaas.nifcloud.com/)
Mountpoint for Amazon S3を使用してS3バケットをマウントしてみた

①以下コマンドを実行し、Mountpoint for Amazon S3のRPMファイルをダウンロードする。
\# wget https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.rpm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/bcd44d92-390b-0b2c-e209-db7034fa0606.png)

②以下コマンドを実行し、インストールする。
\# yum -y install ./mount-s3.rpm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/45274449-0318-5023-b2d6-653f7e7b90af.png)
これでS3バケットをマウント可能となる。

【確認】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/c1cf111a-9255-1ad3-1024-3cc0aff85b40.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/ebaa4ce2-ba4d-9127-a35f-a7306e2b6dea.png)
※但し、ファイルを直接更新が出来ない模様。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472386/00aa059c-db53-6ff0-45cc-83271bca3f41.png)
Windowsのパフォーマンスカウンター（CPU、メモリー、ディスク、ネットワーク）

### １．CPUの値
#### Processer

% C1 Time
% C2 Time
% C3 Time
% DPC Time

%Idle Time
%Interrupt Time
%Privileged Time
%Processer Time
%User Time

C1 Transitions/sec
C2 Transitions/sec
C3 Transitions/sec

DPC Rate
DPCs Queued/sec
Interrupts/sec

### ２．メモリーの値
#### Memory

Available Bytes
Available KBytes
Available MBytes

Cache Byte
Cache Byte Peak
Cache Faults/sec

Commit Limit
Committed Bytes

Demand Zero Faults/sec 

Free & Zero Page List Bytes
Free System Page Table Entries

Long-Term Average Standby Cachr Lifetime

Modified Page List Bytes

Page Faults/sec 
Page Reads/sec
Page Writes/sec
Page Inputs/sec
Page Outputs/sec
Pages/sec

Pool Nonpaged Allocs
Pool Paged Allocs
Pool Paged Bytes
Pool Paged Resident Bytes

Standby Cache Core Bytes
Standby Cache Normal Priority Bytes 
Standby Cache Resident Bytes 
System Cache Resident Bytes 
System Code Resident Bytes  
System Code Total Bytes 
System Driver Resident Bytes  
System Driver Total Bytes

Transition Faults/sec 
Transition Pages RePurposed/sec

Write Copies/sec 

### ３．物理ディスク
#### Physical Disk

% Disk Read Time
% Disk Time
% Disk Write Time
% Idle Time

Avg. Disk Bytes/Read
Avg. Disk Bytes/Transfer
Avg. Disk Bytes/Write

Avg. Disk Queue Length 
Avg. Disk Read Queue Length
Avg. Disk sec/Read
Avg. Disk sec/Transfer
Avg. Disk sec/Write
Avg. Disk Write Queue Length 

Current Disk Queue Length
 
Disk Bytes/sec
Disk Read Bytes/sec
Disk Reds/sec
Disk Transfer/sec
Disk Write Bytes/sec
Disk Writes/sec 

Split IO/sec

### ４．論理ディスク
#### Logical Disk

% Disk Read Time
% Disk Time
% Disk Write Time
% Free Space
% Idle Time

Avg. Disk Bytes/Read
Avg. Disk Bytes/Transfer
Avg. Disk Bytes/Write

Avg. Disk Queue Length 
Avg. Disk Read Queue Length
Avg. Disk sec/Read
Avg. Disk sec/Transfer
Avg. Disk sec/Write
Avg. Disk Write Queue Length 

Current Disk Queue Length
 
Disk Bytes/sec
Disk Read Bytes/sec
Disk Reds/sec
Disk Transfer/sec
Disk Write Bytes/sec
Disk Writes/sec 

Free Megabytes

Split IO/sec

### ５．ネットワーク（アダプター）
#### Network Adapter

Bytes Received/sec
Bytes Sent/sec
Bytes Total/sec

Current Bandwidth
Offloaded Connections
Output Queue Length
Packets Outbound Discarded
Packets Outbound Errors
Packets Received Discarded
Packets Received Errors
Packets Received Non-Unicast/sec
Packets Received Unicast/sec
Packets Received Unknown
Packets Received/sec 

Packets Sent Non-Unicast/sec
Packets Sent Unicast/sec
Packets Sent/sec  
Packets/sec

TCP Active RSC Connections
TCP RSC Average Packet Size
TCP RSC Coalesced Packets/sec
TCP RSC Exceptions/sec


### ６．ネットワーク（インターフェース）
#### Network Interface

Bytes Received/sec
Bytes Sent/sec
Bytes Total/sec

Current Bandwidth
Offloaded Connections
Output Queue Length
Packets Outbound Discarded
Packets Outbound Errors
Packets Received Discarded
Packets Received Errors
Packets Received Non-Unicast/sec
Packets Received Unicast/sec
Packets Received Unknown
Packets Received/sec 

Packets Sent Non-Unicast/sec
Packets Sent Unicast/sec
Packets Sent/sec  
Packets/sec

TCP Active RSC Connections
TCP RSC Average Packet Size
TCP RSC Coalesced Packets/sec
TCP RSC Exceptions/sec
AzureのOCRをGoogleコラボで動かす（Azure Cognitive Services Computer Vision SDK）

Azureが非常に便利なので深めて行こうと思います。

https://learn.microsoft.com/ja-jp/python/api/overview/azure/cognitiveservices-vision-computervision-readme?view=azure-python-previous

今回はAzureのOCRをGoogleコラボで動かしてみます。

```
!pip install azure-cognitiveservices-vision-computervision
```

```
import os
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import VisualFeatureTypes
from msrest.authentication import CognitiveServicesCredentials
from azure.cognitiveservices.vision.computervision.models import OperationStatusCodes
from google.colab import files
import time

os.environ["AZURE_OPENAI_KEY"] = ""
os.environ["AZURE_OPENAI_ENDPOINT"] = ""

key = os.environ["AZURE_OPENAI_KEY"]
endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]

credentials = CognitiveServicesCredentials(key)
client = ComputerVisionClient(endpoint, credentials)
```

```
uploaded = files.upload()
for filename in uploaded.keys():
    print('User uploaded file "{name}" with length {length} bytes'.format(name=filename, length=len(uploaded[filename])))
```

```
# アップロードした画像ファイルを使用
image_path = filename  # アップロードしたファイルの名前

# SDK call
with open(image_path, "rb") as image_stream:
    rawHttpResponse = client.read_in_stream(image_stream, language="en", raw=True)

# Get ID from returned headers
operationLocation = rawHttpResponse.headers["Operation-Location"]
numberOfCharsInOperationId = 36
idLocation = len(operationLocation) - numberOfCharsInOperationId
operationId = operationLocation[idLocation:]

# Wait for the operation to complete (this can be adjusted based on your needs)
time.sleep(10)

# SDK call
result = client.get_read_result(operationId)

# Check the status
if result.status == OperationStatusCodes.succeeded:
    for line in result.analyze_result.read_results[0].lines:
        print(line.text)
else:
    print("Operation status:", result.status)

```

綺麗な英語の画像であればほぼ100%読み込みができます。日本語の場合はlanguage="ja"に変更すればOKです。手書きもそこそこ読み取れました。
羊による羊のためのJavaScript復習③関数

# 1.関数<br>

## 関数とは<br>
さまざまな処理をひとまとまりにして名前をつけたもの
外部から呼び出すことができる<br>

## 関数宣言と関数呼び出し<br>
関数宣言：処理をひとまとめにして名前をつけること、引数の指定を行う
関数呼び出し：引数を用いて実行の指示を与えること<br>

## 関数の使い方<br>
```
//関数宣言
function 関数名 (仮引数){
    return 処理の内容;
}

//関数呼び出し
関数名(実引数);
```

## キーワード
<b>returnキーワード</b><br>
定義した変数が返すものを書く
`return 処理の内容`を含めてreturn文という
return文を実行後、関数は処理を終了する、そのため、return文後に書いたコードは実行されない
また、return文キーワードがない場合は、`undefined`を返す
コンソール画面には`return`を使っても表示されない

<b>関数呼び出し演算子</b>
`()`
関数の後ろに`()`をつけることで、CPが関数を実行する

<b>実引数</b>
関数呼び出し演算子`()`の中に実際に関数に渡したい値を入れる
実引数が仮引数に代入され、実際に処理が行われる

<b>返り値</b>
関数の実行が完了した時に返される値
DatabricksのPredictive I/Oとは？

[What is predictive I/O? \| Databricks on AWS](https://docs.databricks.com/en/optimizations/predictive-io.html) [2023/6/8時点]の翻訳です。

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

Predictive I/Oはデータ操作の性能を改善するDatabricksの最適化処理のコレクションです。Predictive I/Oの機能は以下のカテゴリーに分類されます:

- データのスキャン、読み込みに要する時間を削減する読み込み処理の高速化。
- 更新、削除、マージの際の再書き込みに必要なデータの量を削減する更新処理の高速化。

Predictive I/OはDatabricksのPhotonエンジンでのみ使用できます。

# 読み込みを高速にするためにpredictive I/Oを使う

Predictive I/Oは、サポートされるコンピュートタイプのすべてのオペレーションのデータスキャンやフィルタリングのパフォーマンスを高速にするために活用されます。

:::note warn
**重要！**
Predictive I/Oの読み込み処理は、サーバレスSQLウェアハウス、pro SQLウェアハウス、Databricksランタイム11.2以降が稼働しているPhoton高速化クラスターでサポートされています。
:::

Predictive I/Oは、以下を行うためにディープラーニング技術を適用することで、スキャンの性能を改善します:

- 最も効率的な読み込みのアクセスパターンを特定し、実際に必要なデータのみをスキャンします。
- クエリー結果を生成する際に不要な列や行のデコードを除外します。
- 行にマッチする選択的なクエリーの検索条件の確率を計算する。クエリーが実行されると、次のマッチ行がどこにあるのかを予測するためにこの確率を使用し、クラウドストレージからそのデータのみを読み込みます。

# 更新を高速にするためにpredictive I/Oを使う

:::note
**プレビュー**
Predictive I/Oの更新処理は、サーバレスSQLウェアハウス、pro SQLウェアハウス、Databricksランタイム11.2以降が稼働しているPhoton高速化クラスターでサポートされており、[パブリックプレビュー](https://docs.databricks.com/en/release-notes/release-types.html)となっています。
:::

Photonが有効化されている計算資源を使用している場合、削除ベクトルが有効化されているすべてのテーブルでPredictive I/Oが自動的に使用されます。[削除ベクターとは何ですか?](https://docs.databricks.com/ja/delta/deletion-vectors.html)をご覧ください。

以下のようにDelta Lakeテーブルのプロパティを設定することで、Delta Lakeテーブルで削除ベクトルを有効化することができます:

```sql:SQL
ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.enableDeletionVectors' = true);
```

:::note alert
**警告！**
削除ベクトルを有効化すると、テーブルのプロトコルバージョンがアップグレードされます。テーブルのプロトコルバージョンのアップグレードを取り消すことはできません。アップグレードの後は、削除ベクトルをサポートしていないDelta Lakeクライアントでテーブルを読み込むことができなくなります。[Databricks は Delta Lake 機能の互換性をどのように管理しますか?](https://docs.databricks.com/ja/delta/feature-compatibility.html)をご覧ください。
:::

Predictive I/Oは、Deltaテーブルのデータ変更の際の完全なファイルの再書き込みの頻度を削減することで、更新処理を高速にするために削除ベクトルを活用します。Predictive I/Oは`DELETE`、`MERGE`、`UPDATE`オペレーションを最適化します。

行が更新、削除された際にデータファイルのすべてのレコードを再書き込みするのではなく、Predictive I/Oはターゲットのデータファイルから削除されたレコードを指し示すために削除ベクトルを使用します。更新を指し示すために追加されたデータファイルが使用されます。

テーブルに対する以降の読み込みは、最新のテーブルバージョンに指示された変更を適用することで現状のテーブルの状態を解決します。

:::note warn
**重要！**
Predictive I/Oの更新処理は、削除ベクトルによるすべての制限を共有します。Databricksランタイム12.1以降では以下の制限が存在します:

- Delta Sharingは削除ベクトルが有効化されたテーブルではサポートされません。
- 削除ベクトルが存在するテーブルで[マニフェストファイルを作成](https://docs.databricks.com/ja/delta/generate-manifest.html)することはできません。`REORG TABLE ... APPLY (PURGE)`を実行し、マニフェストファイルを作成するために、同時実行の書き込みが行われていないことを確認してください。
- 削除ベクトルが有効化されたテーブルで[インクリメンタルにマニフェストファイルを生成](https://docs.delta.io/latest/presto-integration.html#step-3-update-manifests)することはできません。
:::

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
Debian12でLaravel環境を作るとハマる事

# Debian12でLaravel環境を作るとハマる事
仮想環境でLaravel9以降の環境を作ろうとした場合、Debian11ではPHPが７系のためインストールできない。
なのでDebian12環境（PHP8.2が採用されている）ので
~~~
apt install composer
~~~
で依存関係から必要なPHP環境もインストールしてくれるのですがいざ composer create-project でプロジェクトを作ろうとするとエラーが出て止まる。

これを解決するためには、phpの不足モジュールをインストールする必要があるようなので今回の場合は

~~~
apt install php8.2-dom php-curl
~~~
を入れると解決した。
apt istall はrootで実行してね。

それから、よく見る記事で php artisan serv で起動と書かれているけれどこうして起動するのはWindows環境だけ・・・

UNIX系では実行権がついており１行目でPHPが指定されているので
~~~
./artisan serv
~~~
で起動できる。
vector.devで`host_metrics`のhostフィールドを環境変数で上書き指定する

vector.devをDockerで使っていると`host_metrics`のホスト名がhuman friendlyではなくなるので環境変数から上書き設定したい、というのは全ての(docker & vector.dev)ユーザーが最初に通る場所だと思うのでやり方を記しておきます。

以下、`host_metrics`をprometheusにsinkする `vector.toml`
```toml
[sources.host_metrics]
type = "host_metrics"
collectors = [
  "cpu", "disk", "load", "memory", "network", "cgroups", "filesystem", "host"
]

[transforms.remap_host]
type = "remap"
inputs = ["host_metrics"]
source = '''
.tags.host = get_env_var!("HOSTNAME")
'''

[sinks.prometheus]
type = "prometheus_exporter"
inputs = ["remap_host"]
address = "0.0.0.0:9598"
```

罠がいくつかあって、検索すると`remap`ではなく`add_fileds`を使っている古い例が散見されますがこれは動きません (at v0.31.0)
また、 `.host = get_env_var!("HOSTNAME")` としている例も見かけますが`host_metrics`を使う場合 `.tags.host` にする必要があります
【自分メモ】Udemy「【入門】システム要件定義と基本設計」のアウトプット3

## 背景

昨年から会社でWeb開発の手法を学んできましたが、開発技術面がある程度理解できてきたので、設計面での勉強を開始しました（開始させられました）。Udemy「【入門】システム要件定義と基本設計」を視聴して、理解したことをアウトプットしていこうと思います。

Udemyの講義はこちら
https://www.udemy.com/course/digisaku_requirements_definitio

## 要件定義の進め方

### 要件定義の段階

要件定義には、要望、要求、要件という段階があり、それに検討と提案を含めた5つのフェーズで進められる。

- 要望　こんなシステムがあったらいいな（ユーザーが出す）
- 要求　こんな機能を作ってほしい（PMがSEに要求する）
- 要件　作る機能は何か（双方の合意を得る）

上記に加えて検討と提案を含めた5つのフェーズで進められる
要望→要求→検討→提案→要件

### 要望フェーズ

まずは要望フェーズで、現状とゴールを把握し、ギャップから「こんなシステムがあったらいいな」という要望を洗い出す。
このフェーズではPMがユーザーにヒアリングを行い、ユーザーが抱える課題や問題点を抽出し、それを解決するための要望を明確にする。

### 要望フェーズで明確にすること

- 現状の洗い出し
- ゴール設定
- ギャップ分析
- システムに求めるもの（ユーザーにヒアリング）

### 失敗例

ユーザーから部分最適な要望しか抽出できない
それらが実装、反映されなかった時の反発の可能性がある

### 要求フェーズ

次に要求フェーズでは、要望フェーズで出された要望をもとに、PMがエンジニアに「こんなシステムを作りたい」と伝える。
このフェーズでは、数値目標や受け入れ条件を明文化し、業務フローや機能・非機能などを定義する。
PMは立場の違いによる意見の食い違いを収拾してまとめることが必要。

### 要求フェーズで明確にすること

- 数値目標
- 目標を課題に分割
- 受け入れ条件の明文化
- 業務フロー
- 機能・非機能（実装したい事）

### 失敗例

要望をそのまま記載するののはNG
どんな課題を解決するかを明確にすることが求められる。

### 検討フェーズ

検討フェーズでは、SEがITの目線で企画の実現性を検討する。
要求の中で特に何を開発するか、すべて開発するのか、何からするかなどを検討し、必要な機能がそろっているか、技術的に可能か、予算算出、納期・スケジュール感などを明確にする。

### 検討フェーズで明確にすること

- 必要な機能がそろっているか
- 技術的に可能か
- 予算算出
- 納期・スケジュール感

### 失敗例

PMからの要求そのままに機能を実装するのはNG
トレンドなどから本当にこの要求で問題ないかを検討するべき。

### 提案フェーズ

提案フェーズでは、ビジネス側にヒアリングしつつエンジニア側が検討したことをフィードバックする。
代替案を出したり、実装する機能しない機能を明確にすることが求められる。
実装が難しくても「できません」といった断り方ではなく代替案や困難な理由を提示するなどビジネス側が納得できる根拠を提示する。

### 提案フェーズで明確にすること

- 要求事項へのフィードバック
- 実装する機能・しない機能
- 開発コスト
- 期間

### 失敗例

このフェーズではエンジニアが伝えても伝わらないことがあるため、画面サンプルを作ったり、変更点や当初から変わったことはしっかりと伝える必要があることがある。

### 要件フェーズ

ビジネス側とエンジニア側で決定事項を協議し、共通認識とすることが目的

### 要件フェーズで明確にすること

要件フェーズでは、ビジネス側とエンジニア側で決定事項を協議し、共通認識としする。
機能一覧や実装の順番、実装しない機能、業務フローの最新版などを明確にすることが求められる。

### 失敗例

机上の空論になりやすい。
ユーザーにとって使いやすいように業務フローに沿って確認すること。

## 最後に

各フェーズで明確にすることや失敗例などがあるが、要件定義にはシステム開発において重要なポイントが多くある。
要件定義が不十分だとシステムの開発プロセス全体が混乱し、コストや時間の浪費、開発成果物の不備といった問題が生じるため、正しい要件定義を行うことが求められる。
NeosVR コンパイラ その4

# 概要
NeosVRのオブジェクトを外部で生成するコンパイラを開発した。
LogiXを作ります。

# 説明
InputのTimeNodeを使います。
俺コードを拡張して、「use FrooxEngine.LogiX」を導入した。

# 俺コード

```
use FrooxEngine.LogiX
new FrooxEngine.LogiX.Input.TimeNode
new FrooxEngine.Grabbable
add FrooxEngine.LogiX.Input.TimeNode
add FrooxEngine.Grabbable
```

# 実行結果

![2023-08-13 21.57.13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/35f2257a-8af8-9c96-7f97-f2e29f6981ec.jpeg)


# 成果物
コンパイラは、ここ

https://embed.plnkr.co/plunk/sv3l7SpOo8eCRzwD

# 実行確認の手順。

- 上のページで生成されたjsonを、メモ帳で「t.json」で保存する。

- NeosVRを起動して、セッションに入る。

- ファイルブラウザを開いて、「t.json」をダブルクリックする。

- 画像のように表示されれば、成功です。



以上。
Amazon Connectについて


「Amazon Connect」について学習をしたので自分なりにまとめて自身の理解・復習また文章力の向上のためアウトプットさせていただきます。

# 「Amazon Connect」とは

「Amazon Connect」は、AWSが提供する「クラウド型コンタクトセンターサービス」で、クラウドで電話やメール、ソーシャルメディア、Web、チャットなどを通じて顧客の対応を行います。
また、自動応答システムやプッシュ番号による着信呼の振り分けが備わっている(IVR)や複数の電話回線を管理する電話交換機(PBX)などの機能が標準搭載されています。

# なぜ「Amazon Connect」が注目されているのか

コロナ禍によってテレワークの普及が進んだことにより、
・会議室の定員減
・オフィスの縮小
・コンタクトセンターの在宅化
などの要因があり「コンタクトセンターをクラウド化する」動きが活発になったことが注目を集めたと思われます。
また「コンタクトセンターをクラウド化する」ことにより
「インターネット環境・ヘッドセット・PC環境」があればコンタクトセンターを運用することができるためその手軽さも相まって注目されるようになりました。

# 「Amazon Connect」の特徴

コールセンター運営に必要な「IVR」や「CTI」や「PBX」などの様々な機能が標準搭載されており、また、「Salesforce」等の「CRM製品」を組み合わせて使うことができます。
その他は「オムニチャネル対応」や「ノーコードによるIVRの設計」や「S3に通話機能を保存」など手軽で便利さが特徴になっています。

# 構成図
簡単な構成を図に表しました。
![AmazonConnect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523101/1e122057-05e9-a795-4987-2b1ab38de2d2.png)



#### <INS>ここからは「Amazon Connect」の標準搭載されている機能の説明や導入のメリット・デメリットについて書かせて頂きます。</INS>

# 「Amazon Connect」に標準搭載されている機能
Amazon Connectに標準搭載されている機能を簡単に説明したいと思います。
各機能をより詳細に理解したい方はご自身で検索お願いします。


IVR(Interactive Voice Response)：
`自動音声応答システムや音声ガイダンスをもとにプッシュボタンを押して問い合わせ先を振り分ける機能`

CTI(Computer Telephony Integration)：
`電話・FAXとコンピュータシステムを統合で顧客の応対履歴や購入履歴などを参照し的確なサポートを提供する機能`

ACD(Automatic Call Distributor)：
`着信呼自動分配装置でルールに基づいて顧客からの電話を適切なオペレーターに振り分けるシステムで機能`

PBX(Private Branch Exchange)：
`電話交換機で電話機同士で内線通話できるようにしたり、外線て接続を行ったり出来る機能`

録音：
`通話の内容を録音・保存でき、自動採番されたコンタクトIDで録音データを検索・再生することが可能。また「CTI」と連携すれば応対情報と録音データを紐づけ・保存・再生も可能`


# 「Amazon Connect」導入のメリット

Salesforceを組合わせる事ができる：
`「SFA(営業支援)」・「CRM(顧客関係管理)」などの機能があり、目的に合わせて複数の製品を組み合わせて使えるプラットフォーム`

オムニチャネル対応：
`「電話」以外の「SNS」「ECサイト」「メール」「チャット」など様々な手段を活用し、顧客対応にも利用できます。`
`また「音声通話」と「チャット」の問い合わせをシステム上でシームレスに一元管理することで顧客は「問い合わせ手段」「タイミング」「状況」を好きに選択し問い合わせができるため顧客の満足度を上げることができます。`
`その他オペレーターに共有できるためオペレーターが変わっても顧客は再度問い合わせ内容を伝える必要がないため同じやり取りを繰り返す手間が必要がなくなります。`

ノーコードによるIVRの設計：
`IVRの設計は本来、コンタクトフローをプログラミングで組み込む必要がありますが`
`「Amazon Connect」を利用するとプログラム知識がなくても「IVRのフローを画面上で並べて必要な文言を入力」などのシンプルで直感的な操作で設定できるため設計・編集などがスピーディーに完了しすぐ運用が可能になります。`


コストが安い：
`「Amazon Connect」は他のAWSサービス同様に「サービスを使用した分だけ料金が発生」の仕組みのためコストを抑えることができます。`
「Amazon Connect」の料金に関しては<a href="https://aws.amazon.com/jp/connect/pricing/" target="_blank">こちら</a>を参照してください。

AWSの他のサービスとの連携が可能：
`「Lambdaで受電時に様々なアクションを実行」や「S3に通話機能を保存」など便利な機能も実現出来ます。`

# 「Lambda関数」を実行した場合の構成図
受電時に「Lambda関数」を実行した簡単な構成を図に表しました。
![AmazonConnect-Lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523101/4dcd4dcc-51e9-677d-b781-e24f58ea9b1b.png)


# Amazon Connect導入のデメリット

音声の品質：
`「電話回線」ではなく「インターネット回線」を使用しているため、顧客のインターネット回線の利用状況によっては音声が乱れたり、遅延が発生したりして安定性が低くなってしまう可能性があります。`

# さいごに

コロナ禍でテレワークの普及が進んだことにより、コールセンターをクラウド化して運用することで、運用までの「コスト」や「時間」や「設定などの手間」が軽減され、「スピーディーに低コスト」の運用が可能ですのでテレワークを進めていきたい顧客にとってはニーズにマッチしたサービスと思いました。

「Salesforce」の組み合わせや「Lambda」での様々なアクションを実行など、単にコールセンターをクラウド化して運用するだけではなく、まだまだ便利に活用できるサービスと思いますのでこれからも学習しもっと理解を深めていきたいと思います。

最後まで読んでいただいた方、ありがとうございました。
Elixirでディレクトリ内のファイルを一覧を取得する。


[Elixir]でディレクトリ内のファイルを列挙する方法について調べました。

これから[Elixir]を始める方にはこのサイトがおすすめです。

https://elixir-lang.info/

[Elixir]とコミュニティの雰囲気をゆるく味わいたい方は「先端ピアちゃん」さんの動画が超オススメです。

https://www.youtube.com/@piacerex

[Elixir]: https://elixir-lang.org/

## 結論

[File.ls!/1]と[Path.wildcard/1]がお手軽で便利でした。

他にも技がありましたら、ぜひお便りください！

[Elixir]: https://elixir-lang.org/
[File.ls!/1]: https://hexdocs.pm/elixir/File.html#ls!/1
[Path.wildcard/1]: https://hexdocs.pm/elixir/Path.html#wildcard/1

## 実験の準備

ターミナルを開き実験用のディレクトリとファイルを作成します。

```bash
# 実験用のディレクトリを準備。
mkdir -p tmp/hoge

# 実験用のディレクトリに入る。
cd tmp/hoge

# いろんなタイプのファイルを作成。
touch {元氣,闘魂}-{1..3}.{exs,json}

# ちゃんとファイルが生成されたか確認。
ls
```

## IExで実験

```elixir
# IExを開く。
iex

# File.ls!/1 で現行ディレクトリにある全てのファイルを列挙する。
iex> File.ls!(".")
["闘魂-3.json", "闘魂-2.json", "元氣-3.json", "闘魂-1.exs",
 "闘魂-3.exs", "元氣-2.json", "闘魂-2.exs", "元氣-3.exs",
 "元氣-1.json", "元氣-2.exs", "元氣-1.exs", "闘魂-1.json"]

# 引数無しの場合でも同様に現行ディレクトリで検索がなされる。
iex> File.ls!()
["闘魂-3.json", "闘魂-2.json", "元氣-3.json", "闘魂-1.exs",
 "闘魂-3.exs", "元氣-2.json", "闘魂-2.exs", "元氣-3.exs",
 "元氣-1.json", "元氣-2.exs", "元氣-1.exs", "闘魂-1.json"]

# Path.wildcard/1 でexsファイルだけ列挙する。
iex> Path.wildcard("./*.exs")
["元氣-1.exs", "元氣-2.exs", "元氣-3.exs", "闘魂-1.exs", "闘魂-2.exs",
 "闘魂-3.exs"]

# Path.wildcard/1 で元氣ファイルだけ列挙する。
iex> Path.wildcard("./元氣-*")
["元氣-1.exs", "元氣-1.json", "元氣-2.exs", "元氣-2.json",
 "元氣-3.exs", "元氣-3.json"]

# jsonファイルを削除。
iex> Path.wildcard("./*.json") |> Enum.each(&File.rm!/1)
:ok

iex> File.ls!()
["闘魂-1.exs", "闘魂-3.exs", "闘魂-2.exs", "元氣-3.exs", "元氣-2.exs",
 "元氣-1.exs"]

# exsファイルを削除。
iex> Path.wildcard("./*.exs") |> Enum.each(&File.rm!/1)
:ok

iex> File.ls!()
[]
```

:tada: