OmniAICreator/Qiita-1.07M huggingface dataset:
【翻訳】Do’s and Don’t for UI Design【Part 1】

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/755079f6-cdc6-aa28-355e-1fea1814f280.png)

ユーザーインターフェースとは、
ユーザーが製品、アプリケーション、プラットフォームと対話する際に
目にするものです。

魅力的なユーザー体験は、
確かなインターフェースデザインの土台の上に築かれています。

初心者である私たちは、さまざまなウェブサイトのデザインに魅了され、
どうすればあのようなデザインを自分の手で作れるのだろうと考えます。

幅広いユーザーに対して、クリーンで効率的なインターフェースを
構築するための基本的なデザインコンセプトとして、
考慮すべきことがいくつかあります。

では、どのようにすれば素晴らしく、クリーンでプロフェッショナルな
インターフェイスを作ることができるのかを理解することから始めましょう！

### 1.人間らしい言葉
共感できる言葉を使うことで、ユーザーを惹きつけ、
デザインを通じて良いユーザー体験を与えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/11773707-a877-5d81-d4ad-821c0c77f884.png)

### 2.水平方向のアライメント：
アライメントをマークに合わせることで、
コンテンツの可読性を高めることができます。

画面上で良好なアライメントが保たれることで、
目によるスキャンが容易になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/794b4f8c-9b6e-2dbe-ba07-7b54abd5e216.png)

### 3.アイコンとラベルの表現：
アイコンやアニメーションをラベルと一緒に使うことで、
コンテンツとの結びつきをより簡単にすることができます。
合理的でリッチなインターフェイスを実現し、瞬時に目を引くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/a2ebd178-330d-8bbb-d95f-3c494c446554.png)

### 4.コンテンツを分断する：
長い文章や段落の使用は、読みにくさを招きます。

良いUXとUIを実現するためには、
箇条書きを使って重要なポイントだけを強調したり、
コンテンツをより小さな塊に分割したりすることに注力すべきです。

特に、「利用規約」や宣言文を記載する場合は、
箇条書きにすることで、内容を簡単に読み取ることができます。
情報が消費されずに残ってしまう可能性が低くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/1a8e172b-358a-9f2a-4a01-f23792a75241.png)

### 5.プロセスバー：
プロセスバーは、フローを追跡するのに役立ち、
また、前後に移動することを容易にします。

オンラインショッピング、フォーム入力、KYC申請などのシーンで、
この形式を使用すると、プロセスの追跡が容易になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/c5cd375e-db38-031f-b467-ad9645931257.png)

### 6.エラーを導く：
アクションを開始するために、
無効な状態やエラー状態を明確に記載する必要があります。

画面上で何が間違っているのかがわからないと、
ユーザーは失望し、フローを諦めてしまうかもしれません。

インターフェイスの設計では、
曖昧さを避けるために、正しいことを正しい場所に示すことが非常に重要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/7241776b-ac29-599a-2865-70c52a723c31.png)

### 7.CTAへの到達しやすさ：
フィットの法則によると、
ターゲットエリアの距離と見た目は、取られるアクションに比例します。

そのため、アクションに集中させるために、
CTAは正確に配置する必要があります。

また、ボタンをクリックしやすいサイズにすることで、
ターゲットに到達するまでの間に不便を感じさせないようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/359201/3e24288a-fba3-51ff-de5d-c8d19ecea860.png)

以上、デジタル製品のエクスペリエンスデザインを行う際に守るべき
7つの基本的な「やるべきこと」と「やってはいけないこと」を紹介しました。

UIデザインの基本を理解するのに役立つことを願っています！

### 《参考記事》 Do’s and Don’t for UI Design
https://bootcamp.uxdesign.cc/dos-and-don-t-for-ui-design-7e5c86c71cac
資格にかける勉強時間は他人のものを参考にするな！

# 目次
[1.前置き](#1-前置き)
[2.勉強時間が曖昧](#2-勉強時間が曖昧)
[3.前提知識が異なる](#3-前提知識が異なる)
[4.まとめ](#4-まとめ)

# 1. 前置き
今日、AZ-900の試験を受験し、無事一回で合格することが出来ました。
AZ-900の勉強をしているときに、どのくらい勉強時間が必要かネットで調べると記事によってバラバラでした。
2週間で取れた人もいれば1カ月で取ることが出来た人もいます。
ちなみに私の場合は、1週間で取得することが出来ました。
これを見て、資格取得にかかる勉強時間は全く参考にならないと感じたので、なぜその結論に至ったのかを記事にまとめたいと思います。
__※前提としてそのような記事を批判するわけではありません。
　この人はこれくらいの期間で取れたんだフーンくらいに思って頂きたいとという意図であることをご承知おきください。__
それでは本題に入っていきます。

# 2. 勉強時間が曖昧
例えば、AさんとBさんの二人がAZ-900の試験に合格したとします。二人は以下のように勉強したとします。
* Aさん：8時間/日×14日(2週間)=112時間
* Bさん：1時間/日×60日(2カ月)=60時間

二人の勉強時間を見るとどうでしょうか？Bさんの方が勉強期間は長いですが、勉強時間は短いです。

しかし、Aさんは2週間でとれました！Bさんは2か月でとれました！と日や週、月単位で書くとAさんの方が勉強時間が少なく見えると思います。

これが1つ目の罠です。
1日に使える勉強時間は人それぞれです。残業が少ない会社であれば平日でもある程度勉強時間があり、休日はがっつり時間が取れます。一方で、残業が多い会社であれば平日はほとんど時間が取れず、最悪、休日出勤などで更に時間が取れません。更に言えば、学生の方は時間の余裕が社会人に比べて圧倒的にあるため、もっと勉強に費やすことが出来るでしょう。

私がAZ-900を1週間で取得できたのは研修の一環として試験勉強ができたAさんのようなタイプだからです。普通の社会人であれば、業務中に資格勉強が出来ないため、Bさんのようなタイプになるはずです。

この通りに1日に勉強に割ける時間は全く異なるため、勉強期間というのは参考になりません。では、勉強時間(例：50時間でとれました！)の場合は参考になるのでしょうか？結論をいうと参考になるとは一概に言えません。これが2つ目の理由になります。

# 3. 前提知識が異なる
例えば、Azureを業務で触ったことがある人が資格を取る場合とAzureを全く触ったことない人が資格を取る場合では、理解の深まるスピードは異なります。
ましてやITのことを全く知らない人が資格を取る場合はITに関する基本的な用語から勉強する必要になり、さらに時間がかかります。
1個例を挙げてみると3人のプレイヤーがいるとします。スペックは下記のとおりです。
* Aさん：装備は最強。レベルはカンスト。
* Bさん：装備はまずまず。レベルもまずまず。
* Cさん：装備は最弱。レベルも１。

この中でボスを最初に倒すことが出来るのは誰でしょうか？
普通に考えればAさんが最初に倒せるはずです。
AさんからCさんを関連付けするとこうなります。(実際には違いますが、イメージとして記載します)

Aさん→Azureを業務で触ったことがある人
Bさん→IT業界に従事しているがクラウドは未経験
Cさん→IT業界未経験

つまり、CさんがAさんやBさんと同じ努力をしても合格することが出来ず、AさんやBさんより勉強する必要があります。
これが2つ目の罠となります。

勉強時間だけでなく、その記事を投稿した人の事前知識量が自分と同じくらいかということをチェックして初めて参考になります。
そのため、他人の資格取得に勉強をかけた時間は一概に参考にできるとは言えないというのが答えになります。
(厳密にいえば、暗記問題の得意苦手や計算問題の得意苦手などでも変化してくるので、ほぼ当てにならないと個人的には思っています。)

# 4. まとめ
今回は資格取得にかける時間は参考にならないという記事を書きました。理由は以下の2点となります。
__1.1日に勉強に使える時間が人によって異なるため、勉強期間(日、週、月単位の記載)は当てにならない。
2.試験勉強を始めた時点の知識量が人によって異なる。__
以上からネットで調べた資格取得にかける時間はこのくらいかかるのかではなく、この人はこのくらいかかったのかという考え方になっていただければと思います。
__※大事なことなので、再度記載しますが、2週間で取れました！のような記事を批判する意図ではないことご承知おきください。__
Windowsキーを使うショートカットとコントロールキーを使うショートカットの違いはなに

## Windowsキー
Microsoft Windowsオペレーティングシステムにおいて特定の操作を実行するためのキー

Windowsキーを押す→
スタートメニューの表示やタスクバーの操作
システムコマンドの実行など
Windowsの特定の機能へのアクセスが可能

EX)Windowsキー　＋「D」キー：デスクトップに切り替え


## コントロールキー（Ctrlキー）
一般的なキーボードのキーの一つ

コントロールキーは、さまざまなアプリケーションやテキストエディタなどのソフトウェア内で特定のコマンドや操作をトリガーするために使用される
EX)
Ctrl+C：コピー
Ctrl+V：貼り付け
Ctrl+Zは元に戻す

## Windowsキーとコントロールキーの違い

それぞれが異なる操作をトリガーする


- Windowsキー：Windowsオペレーティングシステムの特定の機能へのアクセスを提供
- コントロールキー：アプリケーションやソフトウェア内で特定の操作やコマンドを実行

☆特定のショートカットキーはWindowsキーとコントロールキーを併用することで動作する場合もある

EX)
Windows + E：エクスプローラーが開く
Ctrl + Windows + D：新しい仮想デスクトップを作成

:::note
Windowsキー：Windowsオペレーティングシステムの機能にアクセスするために使用される
コントロールキー：アプリケーションやソフトウェア内での操作やコマンドのトリガーに使用される
:::
SynologyのNASで.htaccessが効かなかったの原因を調べて対応した

SynologyのNASでWebサービスを使おうとして、.htpasswdと.htaccessを設置したが、IDとパスワード入力画面が表示されず、指定したファイルの内容が表示されてしまいました。この原因を調べて対処した記録です。

#### 【設定内容】
- パッケージセンターから「Web Station」をインストール
- 「Web Station」を[開く]で[Webポータルサービス]選ぶ
- [作成]で[仮想ホスト]を選び、ポータルタイプを「名前ベース」ホスト名にアクセスするときのドメイン名を入力
- [次へ]でドキュメントルートに共有フォルダとしているディレクトリを選択、HTTPバックエンドサーバにApache HTTP Server 2.4を選択
- ドキュメントルートに、Basic認証のための.htpasswdと.htaccessを置いた

#### 【現象】
ブラウザからアクセスしたが、IDとパスワードの入力画面が表示されない。

.htaccessが動作しているのか確認するために、.htaccessの記述を
```
Options Indexes
```
だけに変更して、デイレクトリにアクセスしてみると、「403　この要請を処理している間にエラーが発生しました」
![スクリーンショット 2023-05-24 10.34.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/c4b23c75-bbbf-402c-107a-cc9cd27a7f69.png)

#### 【調査と結果】
403は「閲覧禁止状態」なので、ディレクトリ一覧の表示は許可されていない、.htaccessでの指定が効いていない。
この原因は、自前のLinuxサーバならApacheのconfを考えるところだが、NASの場合confファイルは自分では設定指定ので、Web StationなどGUIで設定したどこかに漏れがあったと考える。

Web Stationの[Webサービスポータル] タブに移動すると画面の右側は「デフォルトポータル」と「ユーザ定義のポータル」があるが、デフォルトポータル」の方を選んで[編集]をクリックすると、[HTTPバックエンドサーバ]の項目がある。
![スクリーンショット 2023-05-24 10.46.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/ce3e6bd2-2080-0465-c23b-7a4450ad2282.png)
![スクリーンショット 2023-05-24 10.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45016/4b7ff9a5-4599-9dc0-0f7a-4657edb2e000.png)

ここが[Nginx]になっていたので[Apache2.4]に変更した。
この結果.htaccessが機能するようになった。
動作しているWebサーバがNginxなのに、.htaccessにはApacheの記述がだったことが原因だった。

そりゃそうですね、という原因で約2時間悩みました。


でも、HTTPバックエンドサーバにApache HTTP Server 2.4を選択しているので、デフォルト サーバの方の設定が影響しているとはなかなか気が付きませんでした。

#### 【権限】　　　　
<font color="Red">追記</font>
.htpasswdと.htaccessの所有者とアクセス権をどうするかですが、“結果論”ですが試行錯誤の末にこうしました。
```
-rw----r--  1 http     http  180 May 24 16:22 .htaccess
-rw-------  1 http     http   24 May 24 15:30 .htpasswd
```

所有者はgrepでそれっぽいアカウントを探しました  
```
$ grep  -e http -e pache /etc/passwd
http:x:1023:1023::/var/services/web:/bin/false
```

#### 【補足】
「Synology NAS .htaccess 403」で検索すると、（機械翻訳っぽい）SynologyナレッジセンターのQ&Aがヒットするが、参考になりませんでした。
初めまして

皆さま初めまして！acomoのエンジニアです。

先日、株式会社プログレスから発表された開発者のためのワークフロープラットフォーム「acomo」をいろいろ触っていきたいと思います。皆さまのご意見も是非お聞かせください！
ご参考までにacomoのページです。

▼acomoのWebサイト▼
https://about.acomo.app/
【正攻法】XSS対策しながら、<br>タグの反映方法

## 前回の記事
https://qiita.com/koinunopochi/items/b5a7779a96ea63101078

ここで、XSS対策を避けながら記述する方法記したが、自分で使わないことを考慮すると、XSS対策を守りながら行う必要があった。そこで、XSS対策を避けずに正攻法でタグを反映させる方法を考えた。
### 方法
<details>
  <summary>前回の最終コードindex.html</summary>

```html:index.html
<html>
<body>
  <form action="/">
    <input type="url" name="url">
    <button type="submit" formmethod="post">Submit</button>
  </form>
  <div>
    {{message| safe }} <!--こちらはエスケープされているが下はされていない-->
    {{ message }}
  </div>
</body>
</html>
```

</details>

<details>
  <summary>前回の最終コードapp.js</summary>

```js:app.js
from flask import Flask
from flask import render_template
from flask import request
from create_text import YoutubeText

app = Flask(__name__)

@app.route("/")
def main():
    return render_template("index.html")

@app.route("/", methods=["POST"])
def users():
    url = request.form["url"]
    print("POST:"+url)
    # Youtubeをテキスト化
    txt = YoutubeText(url)
    txt = txt.replace("\n","<br>")
    return render_template("index.html",message = txt)


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=3000, debug=True)
```

</details>

- これらを、変更していきます。index.htmlに関しては __| safe__ を外し、Flaskが本来もつXSS対策を利用します。
- この時、配列で受け取れるようにして、for inループで配列の中身をすべて表示できるようにします。
- この時に改行\<br>を入れることで、きちんと改行されたい部分で改行できるようにします。
```html:index.html
<html>
<body>
  <form action="/">
    <input type="url" name="url">
    <button type="submit" formmethod="post">Submit</button>
  </form>
  <div>
  {% for i in message %}
  {{ i }}<br>
  {% endfor %}
  </div>
</body>
</html>
```
app.js側では、配列をindex.html側に渡せるように、改行で配列に入れるように変更します。
```js:app.js
from flask import Flask
from flask import render_template
from flask import request
from create_text import YoutubeText

app = Flask(__name__)

@app.route("/")
def main():
    return render_template("index.html")

@app.route("/", methods=["POST"])
def users():
    url = request.form["url"]
    print("POST:"+url)
    # Youtubeをテキスト化
    txt = YoutubeText(url)
    txt_ary = txt.splitlines()
    return render_template("index.html",message = txt_ary)


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=3000, debug=True)
```

githubに公開してあるので、必要でしたらご確認ください。

https://github.com/koinunopochi/YoutubeText

## まとめ
XSS対策を行いながらタグを反映させることは、無理くりやればできると思うが、見逃しなども増え保守や点検などが大変になりそうなので、多少手間ではあるがhtml側で表示を調整する方がよいと感じた。
急にOhMyZshが使えなくなった場合MacOS

# 環境
+ MacOS
+ ZSHインストール済

# 状況説明
MacBookでインストールしたZSH,iTerm2,oh-my-zsh、急にoh-my-zshが使えなくなった。

# 対策----oh-my-zshをレインストーンする

### インストールしたoh-my-zshをアンインストールする
+ 下記のコマンドを実行する
~~~
$ uninstall_oh_my_zsh
~~~
+ 👆のコマンドがないの場合、下記のを実行する
~~~
$ rm -rf ~/.oh-my-zsh/
$ rm -rf ~/.zshrc
~~~
[参考](https://github.com/ohmyzsh/ohmyzsh)
※ zshの各設定ファイルに関して、こちらの👉 [記事](https://velog.io/@zivary/ZSH-.zprofile-.zshrc-.zlogin-What-goes-where) 👈を参考してください。

### oh-my-zshをインストールする
+ 下記のコマンドを実行する
~~~
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
~~~
[参考](https://ohmyz.sh/#install)


### テーマ(theme)を指定する
+ 「Powerlevel10k」を導入する
~~~
$ git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
~~~

+ ~/.zshrcファイルをバックアップ
~~~
$ cp ~/.zshrc ~/.zshrc_bk
~~~

+ ~/.zshrcファイルの~/.zshrc内の ZSH_THEME="robbyrussell" をコメントアウトし、ZSH_THEME="powerlevel10k/powerlevel10k" を追記する。
~~~
#ZSH_THEME="robbyrussell"
ZSH_THEME="powerlevel10k/powerlevel10k"
~~~

[参考](https://github.com/romkatv/powerlevel10k)

### 「Powerlevel10k」を設定する
+ ターミナルを再起動し、ターミナルの指示通りに設定するば良い
rex0220 プラグイン 営業日数計算

kintone で、営業日数計算を行います。
下記の rex0220 プラグインを利用します。
・休日プラグイン（無償）
・アプリ集計プラグイン
・計算式プラグイン

# 概要

開始日・終了日の期間内で、祝日と土日を除いた営業日数を算出します。

![2023-05-24_11h32_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7b01e0ec-32ab-77d9-21a8-cda6b1b4797a.png)

# 操作例

![2023-05-24_11h46_38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/38197bcc-de79-dc1e-9d45-bd83c0fc1b14.gif)

# 休日アプリ

[rex0220 休日プラグイン](https://qiita.com/rex0220/items/3556d6a3246abd6f4e7a)で祝日データを作成します。

- 休日テンプレートから休日アプリを作成
- 対象年の祝日データを休日アプリに作成
- 休日アプリに会社の公休日をマニュアル登録

![2023-05-23_22h34_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f1441ca6-c9f7-46a4-eac8-92d1ed6ed6c1.png)

- 作成データ
![2023-05-23_22h26_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d452bcd7-eb7d-67e9-cfdd-59c5811a8360.png)

# 営業日数計算アプリ

開始日、終了日、祝日数、営業日数を配置します。

![2023-05-24_11h49_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/3d6ed7a1-4929-7f20-26f1-939b73ff1a3d.png)

# アプリ集計プラグインの設定
開始日、終了日の値変更時に、土日を除いた祝日数を取得するように設定します。

![2023-05-24_11h51_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/ab52f806-03d4-a83a-d390-8c2281b66672.png)

- 対象アプリ条件
![2023-05-24_11h52_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/e896ecc0-f8d7-5992-1c7a-1e55778d438f.png)

- 自動・ボタン別設定
![2023-05-23_22h43_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/85bb9c58-5129-a0b3-7c75-e5d98c03af28.png)

- 集計項目
    - 土日を除いた祝日数をカウント

```.js
// 祝日数
ARRAY_COUNT(
TDSIF(AND(
NOT(IN(DATE_FORMAT(date,"e"),"0","6")),
date>=#開始日,
date<=#終了日),date)
)
```

![2023-05-24_11h53_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/13536eb7-9210-6c9d-9d85-66d3472bb0bc.png)

# 計算式プラグインの設定

開始日・終了日の期間で土日を除いた営業日数を算出し、祝日数を引く

```.js
// 営業日数
LET(a,IF(AND(開始日,終了日),DATE_DIFF(開始日,終了日,"day")+1,0),
  b,ARRAY_FOR(a,idx,DATE_ADD(開始日,idx,"day")),
  c,ARRAY_FIL(b,x,NOT(IN(DATE_FORMAT(x,"e"),"0","6"))),
  ARRAY_COUNT(c)-祝日数
)
```

![2023-05-24_11h55_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/762d2709-da7a-7f7c-1660-801e699bcd85.png)
【個人開発】GPT x LINE Messenger API で G7首脳会議を再現してみた

# 複数人格を同じチャットRoomで実現する

ChatGPTをLINE Messenger API経由で利用する例は既に数多く存在します。

参考にした記事は以下

https://qiita.com/alphajinsei/items/22cfbbefcbb00c0db30b



https://qiita.com/daigo_38/items/160dc9695b5166b82d7e



https://qiita.com/yshimizu22/items/150c1c38c36c48b283be


おしゃべりするなら、１対１よりみんなでワイワイした方が絶対楽しいよね！とふと思いたち、
LINE上で複数のAI人格と会話できる仕組みを作ってみました。

## LINEのアイコンおよび表示名を変更する

2020年の公式記事ではありますが、LINE messenger APIではSenderの属性を指定することで、アイコンと表示名が変更できます。



https://developers.line.biz/ja/docs/messaging-api/icon-nickname-switch/



これを利用して、複数のアイコンと表示名を設定します。
アイコンが変わるだけで、チャットしている相手への親しみがぐっと増すのが不思議なところです。

## 個別の人格の設定
今回、開発にはGASを利用してます。
Googleスプレッドシートと連携することで、GPTに設定するContentsを可変にします。


具体的には以下のようなスプレッドシートをユーザーごとに作成します。

![スクリーンショット 2023-05-24 10.45.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/b3307e9a-cee8-8fbb-45dd-3f578c4b5bb6.png)

## LINEからの登録
ただ、スプレッドシートを他のユーザーと共有で利用するのはセキュリティ上難しそうなので、
登場人物の名前、性格、そしてアイコンに設定する画像の情報をLINEから取得するようにします。
テキスト入力なので、ここで上手く入力するかが課題です。


### LINEで情報登録する流れ
（実名はマスキングしてます）

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/e4464fe8-8507-0f0b-1802-157431250183.png">
→
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/4b66f596-f7be-6e39-3462-4aa803e4f6e2.png">
→
<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/72c05c65-b7c1-9708-b06f-4db30520397d.png">

LINE Messenger にフォーム機能的なものがあるといいのですが。
（リサーチという機能はありますが使いづらそう）

結果、”登場人物” from xxx という表示とアイコンが設定され、同時にこのSenderは、設定した”性格”に基づき、GPTを経由して返信を行います。

# G7の再現
＊＊＊＊＊あくまで個人の検証・テスト用です＊＊＊＊＊＊＊

上記で実現した**複数人格のLINE上での実現**を活用して、先般行われたG7首脳会議を再現してみましょう！
登場人物はご存知の以下の方々。
(初めて知ったのですが、G7っていうけど七人じゃないんですね・・・）
それぞれの性格は英語版Wikipediaの略歴紹介を参考に!入力しました。
（登場人物）
* 岸田文雄
* メローニ
* トルドー
* マクロン
* バイデン
* スナク
* ショルツ
* ミシェル
* ライエン
* ＋ ゼレンスキー

それぞれの名前を入れてメッセージを送ると、呼ばれた人格が返答してくれます。

気分はまるで田原総一郎ですね。
なお、5回分まで過去の会話履歴も踏まえて回答します。

<img width="140" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/d22261d7-aa64-fc5b-0fdd-90a3ed30b7df.png">

<img width="140" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/5c65d6da-2a8a-1f48-7064-23d1acdb330b.png">

<img width="140" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/9e62816e-fc92-f0fe-ec54-9457eea3c92f.png">

<img width="140" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/b4b448e6-91af-2aa5-054a-66dde6ceceb2.png">

<img width="140" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356879/f3fccfd3-0851-ee3a-de98-fe3904482cb8.png">

# まとめと環境
LINE Messenger API と GPTを組み合わせると、複数人でのチャットが実現できるという紹介でした。
擬似家族チャットとか、当社の取締役会の再現とか、いろいろできるのはないでしょうか。

2023/5/24 絶賛公開中！

<a href="https://lin.ee/qvJyYwW"><img src="https://scdn.line-apps.com/n/line_add_friends/btn/ja.png" alt="友だち追加" height="36" border="0"></a>





利用環境
* GAS
* Google Drive API
* LINE Messsenger API
* GPT model : GPT3.5 Turbo
[速報] Microsoft Fabric の試用版を有効にする方法（2023/05/24 時点）

# Microsoft Build 2023 で Microsoft Fabric が発表されました
[Microsoft Build 2023](https://build.microsoft.com/) で新しく [Microsoft Fabric](https://www.microsoft.com/en-us/microsoft-fabric) が発表されました。とてもざっくり説明すると Power BI と Azure Synapse と Azure Data Factory が Power BI Service の画面から一緒に使えるようになった感じです。（← ざっくりしすぎな説明😇

私もまだ学習中なので、ご容赦ください。

とりあえず、Power BI の有償ライセンスを持っている方であれば、60日間試用版が使えるので、試用版を有効にする方法を書いておきます。なお、本日時点（2023.05.24）の情報なので、今後変わる可能性があります。

# 手順
1. [Microsoft Fabric](https://www.microsoft.com/en-us/microsoft-fabric) にアクセスする
1. [Try for free] をクリックして、Power BI Service に遷移する
1. Power BI Service で [管理ポータル] を開く
1. 管理ポータルでスイッチを ON にする
1. 最大15分程度待って、Pwoer BI Service をブラウザでリロードする
1. [作成] やワークスペースの [+新規] から Microsoft Fabric の各種アイテムが作成できることを確認する

手順としては以上です。

## [1 ～ 2] Microsoft Fabric のページでやること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/918c4c09-a55f-7e84-ced0-5d12007d4bab.png)
上記の画面で [Try for free] をクリックしてください。クリックすると、「あなたの Power BI アカウントのユーザーのメルアドを入力してください」的な画面が表示されるので、有償ライセンスを持っている Power BI ユーザーアカウントを入力します。ライセンスのチェックが通れば、Power BI Sevice に遷移します。

## [3 ～ 4] Power BI の管理ポータルでスイッチを ON にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/0d7a2a4c-eaf2-3354-b08c-f6a3ca348d9d.png)
管理ポータルを開くと、一番上に [Microsoft Fabric(プレビュー)] があるので、チェックボックスを外して、有効化してください。

詳細は [organizationに対して Microsoft Fabric を有効にする](https://learn.microsoft.com/ja-jp/fabric/admin/fabric-switch) を見てください。

## [5] 有効化されるまで最大15分
コーヒーでも入れて、待ちましょう。最大15分待ったら、Power BI Service の画面をブラウザでリロードしてください。

## [6] Microsoft Fabric の各種アイテムが作成できることを確認する
画面左側の縦に並んでいるメニューの [作成] からだとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152946/66d6baf5-661f-c4a7-bc6d-8891886cbbaf.png)
任意のワークスペースであれば、[+新規] をクリックする（ツイートの動画を参照

https://twitter.com/yugoes1021/status/1661192033552441344

# 以上です
速報なので、今回は以上です。
他にも有効化する方法があるかもしれませんが、私は上記で使えるようになりました。

さて、Microsoft Fabric が使えるようになったら、遊ばなきゃです。
遊ぶ前に Microsoft Build の Power BI 関連の動画を見ることも大事ですし、遊びながら見るのもアリでしょう。
Microsoft Build の Power BI 関連の動画は以下にセッションリストをまとめておきましたので、こちらも参考にしてください

[Microsoft Build の Power BI 関連の動画セッションリスト](https://bit.ly/PBISessionsMSBuild2023)

# 追記
Microsoft Learn に Microsoft Fabric の学習コンテンツが出てました。

📝Get started with Microsoft Fabric
https://learn.microsoft.com/en-us/training/paths/get-started-fabric/?source=learn

まずはここから学習してみるのがいいかもしれませんね！（私もまだやってないです😇
FreeBSD における IPv6 アドレスも用いた nfs の共有手順書

# お約束
[FreeBSD](https://www.freebsd.org/ja/) で [IPv6](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=ip6&dir=jpman-8.4.2%2Fman&sect=0) 好きな core 人向け。
***
その昔は [hosts_access](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=hosts_access&dir=jpman-8.4.2%2Fman&sect=0) とか [nfsd](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=nfsd&dir=jpman-8.4.2%2Fman&sect=0) とか [rpcbind](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=rpcbind&dir=jpman-8.4.2%2Fman&sect=0) とか、色々と起動する順番やら、謎の儀式が多めじゃったが、昨今は結構楽に nfsd が構築出来ちゃる。
***
とは言え、毎回 [man](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=man&dir=jpman-8.4.2%2Fman&sect=0) のお世話になると、IPv6 な手本が書いちょらんけん、忘備録として書いておく。
***
FreeBSD は 13.x-RELEASE 以降で確認しおるが、なんとなく 9.x-RELEASE 位からでも流用出来そうな予感w
とーぜんじゃが、i386 amd64 何そには影響されん✌
***
# 鯖側
```text:/etc/exports
/ -maproot=0 -alldirs -network 2001:db8:beef:cafe::/64
/ -maproot=0 -alldirs -network fe80::%em0/64
```
[/etc/exports の書式は man pege参照](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=exports&dir=jpman-13.0.2%2Fman&sect=0)
***
```cmd:公開開始
# service nfsd onestart
# /etc/rc.d/nfsd onestart 
```
↑どちらかを好きな方法で🤗
***
```cmd:/etc/exports が正しく解釈しているか確認
# showmount -e
```
***
```cmd:/etc/exports を書き換えたらその旨 daemon 君に命令
# service mountd reload
# /etc/rc.d/mountd reload
```
↑どちらかを好きな方法で🤗
***
最後に再起動しても自動で nfsd を起動させる御呪い🪄
```text:/etc/rc.conf
# nfsd_enable="YES"
```
***
```cmd:御呪いはこのコマンド実行でもおｋ
# sysrc nfsd_enable="YES"
```
***
# 蔵側
```text:/etc/fstab
LOCALNFS.EXAMPLE.JP:share /mnt nfs rw,noexec,nosuid,noauto 0 0
[2001:db8:beef:cafe:cad3:ffff:fee7:9788]:share /mnt nfs noexec,nosuid,noauto,ro 0 0
[fe80::cad3:ffff:fee7:9788%hn0]:/ /mnt nfs noexec,nosuid,noauto,ro 0 0
```
↑を書いてから↓のコマンドで佳き✌
***
```cmd:マウント
# mount /mnt
```
[/etc/fstab の書式は man pege参照](http://koganemaru.co.jp/cgi-bin/mroff.cgi?subdir=man&lc=1&cmd=&man=fstab&dir=jpman-14.0.2%2Fman&sect=0)
ここでエラーが出たら鯖側の設定から見直しじゃ😒
***
```cmd:/etc/fstab を汚しなくないよって人はコマンドプロンプトからどうぞw
# mount -oro -onoexec -onosuid LOCALNFS.EXAMPLE.JP:share /mnt
# mount -oro -onoexec -onosuid [2001:db8:beef:cafe:cad3:ffff:fee7:9788]:share /mnt
# mount -oro -onoexec -onosuid "fe80::cad3:ffff:fee7:9788%hn0":/ /mnt
```
***
# ちょっとした愚痴
/etc/exports /etc/fstab コマンドラインで IPv6 のアドレスを記述しおる時、普段使いのシェルに依って記述法が変わるんが、ややこい💦
***
<ぼそ>"ダブルクォーテーション"で括る場所とか、[角括弧]で括る場所とか... <<//ぼそ>
***
# 最後に
ちんまい設定記述は端折ったけぇ、セキュアじゃねぇ～って事は1024%承知の助😱
読んだ人の裁量に委ねるパティーンでおねしゃすm(__)m
[備忘録]GAS Webアプリにアクセスしたユーザ情報を記録する

# GASのWebアプリにアクセスしたユーザ情報を記録する

Webアプリにアクセスした際、doGetが実行されるので以下のコードでユーザ情報を取得します。

~~~
const user = Session.getActiveUser(); // ユーザ情報を取得する
const user_email = user.getEmail();    // ユーザのメールアドレスを取得する
~~~

<br>

次に、取得したユーザデータをスプレッドシートに記録します。
アクセスした時間とユーザ情報を一番下の行に追記していきます。


~~~
  const sheet_id = 'シートIDを記載してください';
  const sheet_name = 'シート名を記載してください';
  const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name);
  const addArray = [GetNowText(),user_email];
  sheet.appendRow(addArray); // 既存のデータを上書きせずに追加していく。
~~~




# スプレッドシートに記録される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/c5ba9b6e-1fb6-641b-f97a-ed58b9c4e8cc.png)

# 参考ページ

https://qiita.com/hirohiro77/items/a947416f803f45777338
【Kaedim3D】 モデリングの新時代 【AI 3Dモデリング】



Kaedim3Dは、画像をアップロードするだけで、高解像度の3Dモデルを生成できるソフトウェアです。一つの2Dイメージから3Dオブジェクトを生成するという画期的な機能を提供します。

3Dモデリングの経験がなくても問題ありません、Kaedim3Dがあなたの代わりにモデリングを行います。

https://www.kaedim3d.com/

https://www.youtube.com/watch?v=G48lc5SPZEM

## できること
- 2Dイメージから3Dモデルの生成
- モデルへの自動テクスチャリング
- 作成したモデルのエクスポートと、お気に入りのモデリングツールへのプラグイン

## 料金
Kaedim3Dの料金はサブスクリプション制で、月額$150からとなっています。

![スクリーンショット 2023-05-24 11.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/62e298fc-e5cf-8a01-3cb8-fb21779e2440.png)


## メリット
- 初心者でも簡単に3Dモデルを生成可能
- 複雑なモデリング作業から時間を節約
- 産業標準に準じた、使用可能なプロダクションレディな3Dアセットを生成

## 実際に利用した方の声

https://kan-kikuchi.hatenablog.com/entry/kaedim3d
QuickSightのダッシュボードをIaC化する手順

# 記事にした背景
AWS上で利用できるQuickSightのIaC(Infrastructure as Code)に関して、いくつかネット上の記事はあったものの、複数の記事を参照しないといけなく作成までに１週間程度かかってしまった。活用した記事をまとめておき、手順化させることで情報検索の手間を省けると思い、今回記事にすることとした。
※尚、今回は手動で作成したものをIaC化させるため、作成済みのダッシュボード(もしくは元となるQuicksightの分析)は予め準備が必要になる。
#  QuickSightのIaC化てそもそも何？
[Amazon QuickSight](https://aws.amazon.com/jp/quicksight/)(通称QuickSight)とはAWS上で使える可視化ツールである。ユースケース中に作成した分析やダッシュボードを運用で活用する場合もある。この場合、手動で作成したものだけに変更を加えると、微細な変更があった場合に元の状態が戻すことが困難になる。ダッシュボードをjsonやyamlでコード管理(IaC化)することで、復元することが可能になるのが運用上のメリットである。
![computer_mob_programming.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725527/f324be99-d2b9-c5d8-a057-71b687060fe0.png)

# 必要な情報
今回は手動で作成したものを対象とするので、以下２つの準備が必要
・作成済みの ダッシュボードの元になった[AWS QuickSightの分析]
・作成時に使用する[QuickSight上のデータセット]
# 手順
①~④の順番で実行する。

#### ① QuickSightの分析とダッシュボード作成に必要なIaC化用のtemplate作成（[資料①](http://awsj-assets-qs.s3.ap-northeast-1.amazonaws.com/workshop/public/jp/03-workshop/03-deploy-dashboard-from-template/02-create-template.html)）
→資料に記載されている"create-template.json"をもとにご自身のAWSIDと[AWS QuickSightの分析]・[QuickSight上のデータセット]を登録 AWSCLI上でテンプレートの作成とテンプレート詳細を確認

#### ② ①で作成したtemplateを活用してダッシュボードをIaC化（[資料②](https://dev.classmethod.jp/articles/cloudformation-quicksight-dashboard-analysis/)）
→②の資料内にあるテンプレート(yaml形式)の中でParametersのうち ”SourceTemplateArn”, ”UserPrincipal”, "DatasetARN"の3箇所を自身のAWS情報に変更 "AnalysisName"については作成したい名前に任意で変更

#### ③AWS Cloudformation上に②で作成したyamlファイルを登録
※IAMの設定を求められるが、特に指定がなければ設定しない方がエラーの原因になりにくい

#### ④自分が管理するQuickSight上で作成できているか？の確認

# まとめ
①〜④の手順通りに実行すれば、IaC化されたQuickSightの分析とダッシュボードが30分程度で作成できる。多くの方がこの手順書を活用して、私のようなハマり方にならないことを願うばかりである。
devise_token_auth使用時のundefined method `downcase' for nil:NilClassについてまとめる

プログラミング初心者の備忘録です。間違いなどがあれば気軽にコメント下さい。

## 概要
エラーの解決自体はググればすぐ出てきました。


```ruby:config/initializers/devise_token_auth.rb
# Makes it possible to change the headers names
  config.headers_names = {:'access-token' => 'access-token',
                         :'client' => 'client',
                         :'expiry' => 'expiry',
                         :'uid' => 'uid',
                         :'token-type' => 'token-type',
                         # 追加↓
                         :'authorization' => 'authorization'}

```

参考URL↓↓↓

https://qiita.com/Bjp8kHYYPFq8MrI/items/f2ad4f22b2b972227726

内容が気になったので、自分用にまとめてみました。

## 理由
GitHubのissueに答えがありました。
https://github.com/lynndylanhurley/devise_token_auth/pull/1534


>Added Authorization header with bearer token defined in RFC 6750
related issues: #1522 #902 #1487

訳
RFC 6750で定義されたBearerトークンを使用したAuthorizationヘッダを追加した
関連　issue #1522 #902 #1487

とのことで、devise_token_authのバージョン1.2.0から1.2.1になる際にRFC 6750に準拠するためにAuthorizationヘッダを追加したとのことです。

## RFCとは

https://atmarkit.itmedia.co.jp/aig/06network/rfc.html
>インターネットのさまざまな技術、約束事、コミュニティで共有すべき事柄を記録するための文書データベース。

インターネット技術ををある程度標準化しましょう、っていうことなんですね。

http://openid-foundation-japan.github.io/rfc6750.ja.html#authz-header

こちらがRFC 6750の日本語訳です。
2.1.  Authorizationリクエストヘッダフィールドの項を見てみると
>クライアントが署名無しトークンを伴う認証されたリクエストを送信する際には, Bearer HTTP認可スキームを用いたAuthorizationリクエストヘッダフィールドを使用すべきである (SHOULD). リソースサーバはこの方法をサポートしなければならない (MUST).

ここに準拠するためにauthorizationを追加したんですね。

## Authorizationヘッダとは
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Authorization
>HTTP の Authorization リクエストヘッダーは、ユーザーエージェントがサーバーから認証を受けるための証明書を保持し、ふつうは、必ずではありませんが、サーバーが 401 Unauthorized ステータスと WWW-Authenticate ヘッダーを返した後に使われます。

認証情報をサーバに送るためのものってことね。
## なぜエラーになるか？
```ruby:config/initializers/devise_token_auth.rb
# Makes it possible to change the headers names
  config.headers_names = {:'access-token' => 'access-token',
                         :'client' => 'client',
                         :'expiry' => 'expiry',
                         :'uid' => 'uid',
                         :'token-type' => 'token-type',
                         # 追加↓
                         :'authorization' => 'authorization'}

```
この設定はヘッダーの名前を変更するものですが、この設定で明示的に指定したヘッダー名以外のものは認証ヘッダーとして認識しなくなります。（そういう用途で使うために:'access-token' => 'access-token'と同じ名前なんですね）
なので、今回authorizationが追加されたので、この設定を使う場合は明示的にauthorizationを指定する必要があるわけです。

## まとめ
・devise_token_auth1.2.1のバージョンでRFC 6750に準拠するためにauthorizationというヘッダが追加された。
・authorizationひとつでaccess-token , token-type, client, expiry, uidの情報と同じ働きをする。
・1.2.1のバージョンではaccess-token , token-type, client, expiry, uidのデータとauthorizationが両方送られている。
・config.headers_namesを使う場合は明示的にauthorizationを指定する必要がある。

## 余談
https://github.com/lynndylanhurley/devise_token_auth/pull/1567

cookie_enabled: trueにした場合はauthorizationは送信されないそうです。
seleniumでElementNotInteractableExceptionという例外が発生

# 結論
指定した要素がDOM上には存在しているが、対話(操作)可能な状態になっていない。そんな要素を操作しようとしたことで発生する例外のようです。

# 実際に起きたこと
seleniumを使用した個人のpythonプログラムを作っていました。作成後しばらくは意図通りに実行できていました。ところがある時を境に`ElementNotInteractableException`という例外が発生し、正しく実行しなくなりました。

# 調査
以下の記事を参考にしました。

https://teratail.com/questions/115570

https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/ElementNotInteractableException.html

多くの場合、以下のような`find_element`関数を使って要素を検索し、見つけた要素に対してclickなどをすると思います。
```py
driver.find_element(...)
```
発生した例外は「要素を見つけることはできた。でもディスプレイに表示されていないなどの理由から操作できない。」というような要素を操作しようとしたことで投げられたようです。

# 今回の場合
以下を用いてブラウザのウィンドウサイズを大きくすることで解決できました。
```py
driver.set_window_size(width, height)
```

解決までの流れは以下です。
1. `ElementNotInteractableException`が発生。
1. 例外について調査したところ、操作できない要素を操作しようとしたことで投げられた例外であることが分かる。
1. GoogleColab上[^1]で実行していたため、一度ブラウザで対象のWebページにアクセスして画面の様子を目視確認する。
1. 確認したところ、指定のWeb要素が操作できないようには見えない。
1. pythonのコードで対象のWebページにアクセスした直後の画面の様子をスクリーンショットにしてGoogleドライブに保存。[^2]
1. スクリーンショットを確認したところ、画面がスマホ版のものになっていた。
1. 改めてコードを確認したところ、`driver.set_window_size`でウィンドウサイズを指定していた箇所があり、そのサイズが明らかに小さかった。
1. `driver.set_window_size`の引数を大きくして実行したところ、`ElementNotInteractableException`が発生することはなくなった。

[^1]:ヘッドレスモードでの実行が前提になります。
[^2]:`driver.save_screenshot`関数を使用することでスクリーンショットを撮れます。

# おわりに
操作できない原因はそれぞれの状況によって変わってくるため、それに応じて解決の対応が変わってくるかと思います。ですが1つの例として今回の記事が参考になれば幸いです。
プログラミング初学者の日記帳・悩みのネタ①

●はじめに

ただの現職営業マン（28歳）がiOSエンジニアを目指して勉強する日々を綴っていく記事（日記帳）になります。

日記帳のような内容になるとは思いますが、初学者の思考パターンや、現職エンジニアの方には信じられないようなミスも生まれると思いますので是非笑ってみてやってください。
今後2030年問題でエンジニアの数が足りないという統計も出ているそうなので、初学者採用や育成を考えていらっしゃる方の参考？トラブルパターン？の一助になればと思います。

乱文になりますが是非、勉強の方法、考え方ご意見等いただけますと幸いです。


●目次
・どうしてただの営業マンがiOSエンジニアを目指し始めたの？

・現在の習熟度

・問題解決の方法


●本文

・どうしてただの営業マンがiOSエンジニアを目指し始めたの？
A.元々ゲームが好きで中学1年生の頃からPCゲームに熱中しており、その影響でどうしてそう動くのか、もっとこうしたらいいのになといところからプログラミングに興味を持ちました。
社会人になってからは営業先にシステム開発会社もあったり、社長さんがエンジニアさんだったりと諸々影響を受けプログラミング熱が再燃。
その後「何の言語にするかなあ」と悩み、興味だけで決めた結果C#かswiftの2個まで絞ることとなりました。
最終的にswiftを選んだ要因としては好きなVtuberがiOSエンジニアだったからというとてつもなく不純な動機です。

結局モチベーションが大事かなぁというところで目に見えた目標が有る方が続くだろうという理由もありよりのありです。


・現在の習熟度
現在オンラインスクールに通って1ヶ月ほど経ちました。
基礎をやりつつ教材のダイエットアプリを作っています。
意味分からないエラーが出たり、スペルミスしまくったり、基礎が吹っ飛んで、見たはずの教材をもう一度見直しても初めて見た･･･的な感じです。
次回更新からミスしたところ、分からないところをコード付きで上げていき、勉強前の認識、勉強後の認識等を記述していこうと思います。

1個だけ例をあげてみると

    func reduceStock(type: DrinkType) {
        switch type {
        case .coffee:
            coffeeStock -= 1
        case .water:
            waterStock -= 1
        case .monster:
            monsterStock -= 1
        }
    }

上記は自販機のロジックコードの一部です。
このコードを見て、読み取れることは
勉強前
・func？関数？
・　{　←付ける場所どこ･･･　}　←閉じる場所もどこ･･･
・switch type {    ←なんでtype付けてるの？
・func reduceStock(type: DrinkType) 　←なんでtypeが付くの？　存在意義を言え。


ちょっと勉強後
・関数使ってるな
・switch分使ってるな　だからcase使ってるんだな　
・在庫減らしていく構文だな
・戻り値どこ･･･
位です。

全体コードではないので分かりづらいですが概ねこんな認識です。

あまり成長が見受けられませんね･･･

私の出来が悪いだけの可能性も多いに有りますがこの短い構文でも頭しっちゃかめっちゃかです。

これを０から組み立てろと言われたら発狂物です。
ただ完璧に理解して次、完璧に理解して次だと心壊れそうなので答えみながらなんとなくで進んでいます。
応用編に入ったら都度振りかえりながら進めていこうと思っています。


●問題解決の方法

現状分からない部分が出た際に行っている解決方法は下記となります。
・エラー文を翻訳してエラー内容を読み取る。（分からない単語は検索）
・エラー分をそのままコピペして検索
・chatGPTに丸投げ（ただよく嘘吐くのでBardにも聞いてます）
・上記でも分からなければメンターに相談

というような解決フローにしています。


第１回はこんな殴り書きの内容ですが以上とさせていただきます。
まだまだびっくりするミスのオンパレードで記載しきれないので次回に回します。

|:3ミ
【プログラム高速化】整数演算による浮動小数点演算の近似

　こんにちは。ディマージシェアの技術担当です。[以前の記事](https://qiita.com/ob_nullpo/items/535a32d35a3ff18feca7)で計算量削減によるプログラムの高速化を紹介しました。今回は使用する演算命令を変えることで更に高速化してみます。

# 整数演算による浮動小数点演算の近似
　計算結果の小数部分を切り捨ててよい計算は、浮動小数点の計算の代わりに、整数の掛け算にしても結果が概ね一致します。

```cpp
       c = cos(t);
       s = sin(t);
       for (i = 0; i < dot_ct; i++) {
           int32_t y = s * (dots[i].x - ox) + c * (dots[i].y - oy) + ooy;
           horizontal_sum[x][y] += 1;
       }
```

この部分を、
```cpp
       c = cos(t);
       s = sin(t);
       int32_t cc = c * 65536;
       int32_t ss = s * 65536;
       for (i = 0; i < dot_ct; i++) {
           int32_t y = ((ss * (dots[i].x - ox)) >> 16) + ((cc * (dots[i].y - oy)) >> 16) + ooy;
           horizontal_sum[x][y] += 1;
       }
```

と書き換えることで、浮動小数点数の掛け算を整数同士の掛け算に書き換えることができます。このソースでパフォーマンスを確認してみます。

# ベンチマーク
浮動小数点の掛け算の場合
```
time = 1.701961 sec
```

整数演算に書き換えた場合
```
time = 0.864623 sec
```

使う演算命令を浮動小数点演算から整数演算に書き換えたことにより、2.0倍のパフォーマンス向上が実現できました。初版のプログラムが375秒もの実行時間だったことを考えるとかなりの改善です。

# まとめ
　普段のプログラミングではほとんど意識しない命令レベルのパフォーマンス差ですが、
・アルゴリズム最適化
・メモリアクセス最適化
あたりの性能向上手段を試した後だと目に見えるパフォーマンス差として現れます。ここから更に、インラインアセンブラやSIMD化など、より高度な細工をすることで更にパフォーマンスを改善することができます。

　愚直に実装すると絶望的なパフォーマンスになるプログラムでも、ちょっとした工夫や制約を加えることで劇的にパフォーマンスを改善できることは珍しくありません。また、採りうる工夫も多岐に渡ります。試してみましょう。
【AZ-900】2023年最新版 1週間でマスター！ 試験対策

# 目次
この記事は3分ほどで読めます。
[1. この記事のターゲット層](#1-この記事のターゲット層)
[2. おすすめの勉強方法](#2-おすすめの勉強方法)
[3. 書籍を購入して試験対策を万全に行いたい方向け](#3-書籍を購入して試験対策を万全に行いたい方向け)
[4. お金をかけずに試験対策を効率よく行いたい方向け](#4-お金をかけずに試験対策を効率よく行いたい方向け)
[5. おわりに](#5-おわりに)

# 1. この記事のターゲット層
- これからAZ-900を学習していこうとしている方
- AZ-900の効率の良い勉強方法をお探しの方
- 試験を受けるまでの一連の流れを知りたい方

# 2. おすすめの勉強方法
2種類の勉強カリキュラムをご紹介します。

- [書籍を購入して試験対策を万全に行いたい方向け](#3-書籍を購入して試験対策を万全に行いたい方向け)
- [お金をかけずに試験対策を効率よく行いたい方向け](#4-お金をかけずに試験対策を効率よく行いたい方向け)

個人的には前者をおすすめします。
一例に過ぎませんが、筆者は前者の方法でAzureサービスの知識0の状態から1週間で、余裕を持った点数で試験に合格できました。

# 3. 書籍を購入して試験対策を万全に行いたい方向け

期間：7日目安
- 教本「Microsoft認定資格試験テキスト　AZ-900：Microsoft Azure Fundamentals」にて学習
- 試験受講

#### 教本「[Microsoft認定資格試験テキスト　AZ-900：Microsoft Azure Fundamentals](https://www.sbcr.jp/product/4815610869/)」にて学習 (5日目安)

- この一冊を学習するだけでAZ-900の試験対策が完結します。
- 「AZ-900の知識がまったくない」「そもそもクラウドの概念から学習したい」方も安心して学習できます。
- 図やイラスト、実際のAzureサービスの画像を用いて丁寧に解説されているため、各サービスなどのイメージがつかみやすいです。
- 試験出題形式に基づいた練習問題集付きのため、事前対策がしっかりとできます。
- 一言アドバイス：各章末問題は2周し、あやふやな箇所を再度復習することをおすすめします。正答率が上がることにより、自信を持つことができます（メンタル大事）

#### 試験受講

- 受験料は13,750円(税込)です
    - 補足情報：[お金をかけずに試験対策を効率よく行いたい方向け](#4-お金をかけずに試験対策を効率よく行いたい方向け)でご紹介する「Microsoft Azure Virtual Training Day: Azureの基礎」を受講すると、試験の無料クーポンが配布されていた時期もあります。（23/5月現在はクーポン配布を終了しております）公式サイトをチェックしてクーポンが配布されているか確認することをおすすめします。クーポンがある場合は合わせて受講しましょう。
- 試験はオンライン受験とオフライン受験の2種類あります。
- オンライン受験の場合は、第三者がいない部屋とWebカメラ、マイクを用意する必要があります。
- AZ-900試験の試験予約はこちらから → http://docs.microsoft.com/learn/certifications/exams/az-900#certification-exams
    - 予約方法はこちらのサイトが参考になります → https://nokonokonetwork.com/certificate/azure/how-to-apply-for-azure-exam.html
- 一言アドバイス：Azure認定試験を初めて受ける方は環境設定のトラブルが少ないオフライン受講をおすすめします。

# 4. お金をかけずに試験対策を効率よく行いたい方向け

期間：7日目安
- 「Microsoft Azure Virtual Training Day: Azureの基礎」を受講
- 「Microsoft LearnのAZ-900ラーニングパス」などの無料ツールを活用して学習。
- 試験受講

#### 「Microsoft Azure Virtual Training Day: Azureの基礎」を受講(2日間)

- Microsoftが提供する無料のオンライントレーニングです。
- 講義は各日2時間程度です。
- この段階ですべてのサービス内容を覚える必要はありません。どんなサービスがあるのかをざっくりと押さえておきましょう。
- 受講するためには[Microsoft Virtual Tranning Days](http://www.microsoft.com/ja-jp/events/top/training-days/)に受講登録を行い、参加してください。
- 一言アドバイス：講義開催は月に1～2回の頻度です。そのため早めに講義日程を確認しておくことをおすすめします。

#### 「Microsoft LearnのAZ-900ラーニングパス」などの無料ツールを活用して学習(3日目安)
- Microsoft LearnはMicrosoftが提供する無料のEラーニングサービスです。
- [AZ-900ラーニングパス](https://docs.microsoft.com/ja-jp/learn/certifications/exams/az-900#two-ways-to-prepare)で受講してください。
- こちらの講義は1日程度で完了します。
- 残りの期間はあやふやな部分を検索エンジンを使って理解を深めていきましょう。(「〇〇とは 解説 Qiita」などで検索してみましょう)
- また、無料模擬問題集を活用して試験対策をしましょう。（非公式のためあくまでも参考程度にすることをおすすめします）参考無料問題集リンク → https://yukishi.com/8783
- 一言アドバイス：まずはMicrosoft LearnのAZ-900ラーニングパスを2周して知識を定着させることをおすすめします。

### 試験受講

- 前者のカリキュラムご紹介の際と同文のため割愛。詳細は[こちら](#試験受講)
 
# 5. おわりに

いかがでしたでしょうか。
今回紹介していない学習方法（有料動画など）もありますが、高コストのためあまりおすすめしません ※個人の感想です
AZ-900は今回紹介したカリキュラムを行うことによって短期間で合格するための知識が十分身につきます。
特に【 [書籍を購入して試験対策を万全に行いたい方向け](#3-書籍を購入して試験対策を万全に行いたい方向け)】の方法をおすすめしますが、「ITリテラシーの基盤の知識がある程度ある方」「検索力が高い方」は【[お金をかけずに試験対策を効率よく行いたい方向け](#4-お金をかけずに試験対策を効率よく行いたい方向け)】の方法でも問題ないでしょう。

この投稿が皆様のAZ-900の試験合格のお支えになることを祈っております。
最後になりますが、この投稿がよければ「いいね & フォロー」いただけますと大変励みになります！
Java generate

- Java-Camel：Apache Camelフレームワークを使用したOpenAPIサーバージェネレーターです。応答を定義したAPIオペレーションを実装し、Javaアプリケーション向けのREST APIを構築します。

- Java-Helidon-Server（β）：Oracle JavaのサーバープラットフォームHelidonを使用したOpenAPIサーバージェネレーターです。REST APIを定義したAPIオペレーションを実装し、Helidonアプリケーション向けにREST APIサーバーを構築します。

- Java-Inflector：Java用のOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Javaアプリケーション向けのREST APIを構築します。

- Java-Micronaut-Server（β）：The Micronaut Frameworkを使用したOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Micronautアプリケーション向けのREST APIを構築します。

- Java-MSF4J：WSO2 MicroServices Framework for Java (MSF4J)を使用したOpenAPIサーバージェネレーターです。MSF4Jを使用すると、サービスオブジェクトを定義し、REST APIサーバーを構築できます。

- Java-PKMST：GoogleのKubernetesの拡張機能を通じてホストされるサービスを構築するために使用されるPayara Microサーバーを使用したOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Payara Microアプリケーション向けのREST APIを構築します。

- Java-Play-Framework：The Play Frameworkを使用したOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Play Frameworkアプリケーション向けのREST APIサーバーを構築します。

-Java-Undertow-Server：Undertowサーバーを使用したOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Undertowアプリケーション向けのREST APIサーバーを構築します。

-Java-Vertx（廃止）：Eclipse Vert.xを使用したOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Vert.xアプリケーション向けのREST APIサーバーを構築します。

-Java-Vertx-Web（β）：Eclipse Vert.x Webフレームワークを使用したOpenAPIサーバージェネレーターです。APIオペレーションを実装し、Vert.x Webアプリケーション向けのREST APIサーバーを構築します。
計算量削減によるプログラム高速化

　こんにちは。ディマージシェアの技術担当です。[以前の記事](https://qiita.com/ob_nullpo/items/0d6f8f5886fdec331f20)でスキャンした書類画像を水平にするプログラムを作りました。そして、[こちら](https://qiita.com/ob_nullpo/items/06e78685d59057642317)の記事で並列処理を用いてプログラムの高速化を行いました。今回は別のアプローチでプログラムの性能を向上させてみようと思います。

# 計算量の削減
　処理するのは書類のスキャン画像と仮定します。その場合、カラー画像やグレースケールの画像として処理する必要はほぼありません。モノクロの2値データとして処理しても結果は同じになるはずです。また、多くの印刷物は黒で塗りつぶされているわけではありません。紙面のうち印字されている面積は高々10%ほどです。なので、ビットマップとしてデータを保持するのではなく、黒の画素がある座標を配列で保持する方法に書き換えることで性能向上が期待できます。

```cpp
    for (i = 0; i < h; i++) {
       int32_t d_y_pad = w * i;
       cv::Vec3b* ptr = src->ptr<cv::Vec3b>(i);
       for (j = 0; j < w; j++) {
           cv::Vec3b bgr = ptr[j];
           uint8_t v = (uint8_t)(0.2126 * bgr[2] +
               0.7152 * bgr[1] +
               0.0722 * bgr[0]);
           data[d_y_pad + j] = 0;
           if ((255 - v) > 110) {
               data[d_y_pad + j] = 1;
               dot_ct++;
           }
       }
   }
   // 黒画素がある座標を配列にする
   dots = (dot*)malloc(sizeof(dot) * dot_ct);
   dot_ct = 0;
   for (i = 0; i < h; i++) {
       int32_t d_y_pad = w * i;
       for (j = 0; j < w; j++) {
           if (data[d_y_pad + j]) {
               dots[dot_ct].x = j;
               dots[dot_ct].y = i;
               dot_ct++;
           }
       }
   }
```

# メモリのアクセス効率の向上
　一般的にメモリは連続アクセスは高速であり、不連続なアクセスは時間がかかります。先述のようにデータの持ち方を変えることにより、不連続なメモリアクセスを回避することができます。2次元的なメモリ領域に対して、斜めにアクセスするのは非効率ですが、データの持ち方を変えたことにより、画素がある座標を頭から最後まで読むだけになります。

# ベンチマーク
　データの持ち方を変える前のプログラムで、1 core 1 threadでは
```
time = 375.211783 sec
```

でした。データの持ち方を変えたプログラムでは、
```
time = 11.472606 sec
```
となりました。32.7倍の性能向上が実現できました。更に、OpenMPで16 cores 32 threadsで実行したところ、

```
time = 1.701961 sec
```
となり、更に6.7倍の性能になりました。扱う画像が2値画像という制約が加わりましたが、GPGPUと肩を並べる性能向上が実現しました。

# まとめ
　計算量的に重い処理を実装するとき、正面突破を試みると難しい場合でも、少しの制約を加えたり、計算機のアーキテクチャに寄り添った実装を行うことで性能を十数倍に伸ばすことができます。
　マルチスレッドやGPGPUを用いた力業で解決する方法もありますが、処理そのものを軽量化、最適化するというアプローチも可能です。重い処理と向き合わなければならないときの選択肢として覚えておきましょう。

# 付録
　[ソースコードへのリンク](https://github.com/HirokiHayakawa/inclination_detection)
vbsの作法 その66

# 概要
vbsの作法、調べてみた。
練習問題、やってみた。

# 練習問題
湯婆婆を、実装せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7ac8fd57-b08d-f5e6-c23c-a4b360d54b75.png)


# サンプルコード

```
str = "契約書" & vbCrLf & "甲は油屋当主として、乙を油屋に雇用することを" & vbCrLf & "契約し、労働に伴う対価の支払いを右の通り、約定する。" & vbCrLf 
str = str & "なお、一日の労働の対価は金百円とする。" & vbCrLf & "甲　油屋当主　湯婆婆" & vbCrLf & "乙" & vbCrLf & "契約書だよ。そこに名前を書きな。"
Title = "湯婆婆" 
Dim name
name = InputBox(str , Title, "腹美恵子")
If name = "" Then
	WScript.Quit
End If
If Len(name) = 0 Then
    Wscript.Arguments(-1)
End If
str = "フン。" & name & "というのかい。贅沢な名だねぇ。" & vbCrLf
Dim newName
Randomize
newName = Mid(name, Int(Len(name) * Rnd + 1), 1)
str = str & "今からお前の名前は" & newName & "だ。いいかい、" & newName & "だよ。分かったら返事をするんだ、" & newName & "!!"
MsgBox (str)

```


以上。
Herokuにpushしても反映されない

# 課題
ブランチを作って変更内容をHerokuにpushしてもHerokuCLIでは反映されなかった．しかし，ローカル側ではpushに成功している．

# 解決策
masterブランチにマージして以下のコマンドを実行するとできた．
```
git merge ブランチ         // pushしたいブランチ名に変更

git add .
git commit -m "変更内容"
git push heroku master
```
DatabricksのAI Functionsを使ってみる

こちらの機能を試してみます。

https://qiita.com/taka_yayoi/items/1e04a67f1c0b8b6b9231

こちらのブログで詳細が説明されています。

https://www.databricks.com/jp/blog/actioning-customer-reviews-scale-databricks-sql-ai-functions

要は**SQLから大規模言語モデル(LLM)を呼び出せる機能**です。素敵ですね。

# 準備

ここでは、Open AI APIを使いますので、Open AIのAPIキーを取得します。

https://platform.openai.com/account/api-keys

このAPIキーを[Databricksシークレット](https://qiita.com/taka_yayoi/items/338ef0c5394fe4eb87c0)に登録します。

また、この機能はパブリックプレビューです。パブリックプレビューに参加するには、[AI Functions Public Preview enrollment form](https://docs.google.com/forms/d/1f5txJXRzGG4nhLTvdYaMr11G6lAJ1C-FrJgXaqmHeUU/viewform?edit_requested=true)を提出してください。

# AI Functionの作成

以下のSQLを実行して関数を作成します。以下の例では、シークレットスコープ`demo-token-takaaki.yayoi`、シークレットキー`openai_api_key`にOpen AI APIのキーが格納されているものとします。

```sql:SQL
CREATE OR REPLACE FUNCTION quickstart_catalog_taka.default.PROMPT_HANDLER(prompt STRING)
RETURNS STRING
RETURN AI_GENERATE_TEXT(prompt,
  "openai/gpt-3.5-turbo",
  "apiKey", SECRET("demo-token-takaaki.yayoi", "openai_api_key"),
  "temperature", CAST(0.0 AS DOUBLE)
);
```

# AI Functionの実行


```sql:SQL
SELECT quickstart_catalog_taka.default.PROMPT_HANDLER("What is Databricks?")
```

```
Databricks is a cloud-based data processing and analytics platform that provides a unified workspace for data engineers, data scientists, and business analysts to collaborate and work on big data projects. It is built on top of Apache Spark, an open-source big data processing engine, and provides a range of tools and services for data ingestion, processing, analysis, and visualization. Databricks also offers machine learning capabilities, including automated machine learning, deep learning, and natural language processing, to help organizations build and deploy AI models at scale.
```

動きました！

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

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


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【うっかり防止】なんかGoogle Cloudのコンソールのスタイルが崩れているときの解決策

## 起こった問題
なんかページのスタイルが崩れていた
![ 2023-05-21 22.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511585/d62cdda1-6cb9-ca2a-25bf-d4be89ce8d07.png)

## 解決策
Chorome拡張のAdBlockerが悪さしていた！
Google Cloud　コンソールなど、スタイル問題が発生したサイトのURLをホワイトリストに入れることで解決した笑
M1 MacでUbuntu入れて，OpenFOAM使えるようにする

# 概要
M1 MacにUbuntuをインストールして，OpenFOAMをビルドするまでの手順です。

以前，M1 Mac上でUbuntuいれるとかなしで，OpenFOAMビルドするのは以下でやりましたが，今回はUbuntu入れてから，OpenFOAMのビルドします。
https://qiita.com/ishigaki/items/52c5996f7d6e56376168

# OS
- Multipassをhomebrewでインストール。brew install --cask multipassをターミナルで実行。
- MultipassでUbuntu18.04をインストール。multipass launch   --cpus 2 --disk 20G --memory 4G --name ubuntu18 18.04 をターミナルで実行。イメージの名前がubuntu18, 最後がバージョン。
- コア数は4程度にする。
- XquartzをMacにインストールしておく。

Mac側の作業
```
$ brew install --cask multipass
$ multipass launch --cpus 4 --disk 20G --memory 4G --name ubuntu18 18.04 
```

# OpenFOAM (Ubuntu側の作業）
- aptでインストールできない。（Arm64のバイナリが配布されてない）
- OpenFOAM7以降なら，Arm64のビルドは可能。
- OpenFOAM 8をインストール。
- gcc-5, g++-5をインストール。gcc-5, g++-5のシンボリックリンクをgcc, g++としてホーム($MOHE/usr/local/bin）に作る。
- PATH設定で $HOME/usr/local/bin が先にくるようにする。 

シンボリックリンクの作成
```
$ sudo apt install gcc-5, g++-5
$ sudo ln -s /usr/bin/gcc-5 $HOME/usr/local/bin/gcc
$ sudo ln -s /usr/bin/g++-5 $HOME/usr/local/bin/g++
```

.bashrcに追記
```
export PATH=$HOME/usr/local/bin:$PATH
```

ThirdParty-8をOpenFOAMディレクトリにダウンロード
```
$ mkdir $HOME/OpenFOAM
$ cd $HOME/OpenFOAM
$ wget http://dl.openfoam.org/third-party/8
$ tar xvf 8
```

OpenFOAM-8をGithubからクローン
```
$ cd $HOME/OpenFOAM
$ git clone https://github.com/OpenFOAM/OpenFOAM-8.git
```

ビルドに必要なライブラリのインストール (OpenFOAMの公式通り　https://openfoam.org/download/source/software-for-compilation/）
```
$ sudo apt-get install build-essential cmake git ca-certificates
$ sudo apt-get install flex libfl-dev bison zlib1g-dev libboost-system-dev libboost-thread-dev libopenmpi-dev openmpi-bin gnuplot libreadline-dev libncurses-dev libxt-dev
$ sudo apt-get install libqt5x11extras5-dev libxt-dev qt5-default qttools5-dev curl
```

OpenFOAM-8のビルド
```
$ cd $HOME/OpenFOAM/OpenFOAM-8
$ ./Allwmake
```

Allwmakeのときに-jのオプションで並列ビルドできるけど，メモリが足りなくなる可能性がある。つけるなら，最初に確保したコア数を指定する。


# Paraview
- Paraview-5.0.1をダウンロードしてくる。デフォルトは5.6.3だけどビルドに失敗する。
- OpenFOAM-8/etc/config.sh/paraviewのなかのParaviewのバージョンを5.0.1にする。
- etc/tools/ParaViewFunctions, makeParaviewはThirdParty-4の内容に書き換える。https://github.com/OpenFOAM/ThirdParty-4.x を参考にする。（この作業はしなくてもビルドは通るが，Segmentation faultするので，必要な作業）
- Pythonを有効にする。 （必須）
- makeParaviewを実行。
- 最悪，aptでparaviewがインストールできる。


$HOME/OpenFOAM/OpenFOAM-8/etc/config.sh/paraviewの編集。以下のようにする。
```
#- ParaView version, automatically determine major version
#export ParaView_VERSION=4.0.1
#export ParaView_VERSION=4.1.0
#export ParaView_VERSION=4.3.1
#export ParaView_VERSION=4.4.0
#export ParaView_VERSION=5.0.0
export ParaView_VERSION=5.0.1
#export ParaView_VERSION=5.4.0
#export ParaView_VERSION=5.5.0
#export ParaView_VERSION=5.6.3
export ParaView_MAJOR=detect
```

makeParaviewのPython関係のところを以下のようにする。

```
withPYTHON=true
PYTHON_LIBRARY="/usr/lib/aarch64-linux-gnu/libpython2.7.so.1.0"
```

Paraviewのビルド
```
$ cd $HOME/OpenFOAM/ThirdParty-8/
$ ./makeParaview
```

# まとめ
OpenFOAMのビルドはデフォルトのGccでできますが，Paraviewのビルドで失敗するので，Gcc 5を使うようにしました。OpenFOAMのビルドは簡単でした。Paraviewのビルドがたいへん

MacにOepnFOAM入れるようなひとは，すでにOpenFOAMのビルドは散々やってきたひとだとおもうので，要点だけ書きました。質問等あったらコメントください。
距離の近い2点をScipyのKDTreeを使って求める

### 問題. 1辺が100の正方形の中の格子点にある10個の点の中から最も近い2点を見つけよ。

このような問題を解くのにScipyのKDTreeを使うと簡単にかつ高速に求めることが出来たので紹介します。

まず10個の点を乱数で発生させリストにします。

```python 
from scipy.spatial import KDTree
from random import randint

N, XYrange = 10, 10**2
points = [(randint(0,XYrange),randint(0,XYrange)) for i in range(N)] 
print(points)
# [(19, 27), (86, 35), (35, 10), (42, 40), (16, 52), (87, 3), (4, 37), (88, 34), (32, 51), (39, 59)]
```

次にこれをKDTreeに入力します。

```python
tree = KDTree(points)
```

このKDTreeクラスに対して、点 (19,27)から近い順に2点を探すqueryを行います。

```python 
d, idx = tree.query([19,27], k=2)
print(d, idx, sep='\n')
[ 0.         18.02775638]
[0 6]
```
帰ってくるdは1番近い点と2番目に近い点への距離。idxはその点のindexを表します。1番近い点は当然ながら自分自身になるので、**2番目に近い点が知りたい点**と言うことになります。

| |index|距離 |座標| 
|:---:|:---:|:---:|:---:|
|1番近い点| 0| 0| (19,27)
|2番目に近い点| 6 |  18.03| (4,37) |

したがって元の問題を求めるにはすべての点に対して自分以外の一番近い点までの距離を求めてその最小値が答えとなります。

幸いqueryメソッドは点をリストで与えると答えもリストで帰ってくるので。その答えから2番目に近い点の距離とindexを抜き出します。

```python 
# ---- Query the nearest point for all points
d, idx = list(map(lambda x: x[:,1], tree.query(points, k=2))) # extract column 1 (2nd closest)
print(d, idx, sep='\n')
# ---- Find the shortest distance pair from the list
midx = d.argmin()  # p1 index for the nearest pair
p1, p2 = points[midx], points[idx[midx]]
print(f"The nearest pair: p1:{p1}-p2:{p2}, distance: {(d[midx]):.03f}")
#[18.02775638  2.23606798 23.34523506 14.86606875 16.03121954 31.01612484 18.02775638  2.23606798 10.63014581 10.63014581]
#[6 7 0 8 8 7 0 1 9 8]
#The nearest pair: p1:(86, 35)-p2:(88, 34), distance: 2.236
```

無事一番近い2点は **(85,35)と(86,34)** で距離は **2.236**であることが求まりました。

（開発環境：Google Colab）

この考え方はProject Euler Problem 816: Shortest distance among pointsを解くのに役に立ちます。
「心理的安全性」と「居心地の良さ」のちがい

最近、IT業界における「心理的安全性」の重要さは広く知られるものとなってきました。

一方で、心理的安全性が誤解・誤用されるケースも見聞きすることもあります。

よくあるパターンは、**「心理的安全性」とは「居心地の良さ」である**、という認識でしょうか。なんとなく似た意味にも感じますが、実際はまったく別物です。

しかし上記の違いを説明するのはちょっと大変なため、『**心理的安全性　最強の教科書**』を頼りながら要点を押さえてみようと思います。

## 心理的安全性は「ゴール」ではない

まず心理的安全性とはなぜ必要なのでしょうか。本書は次のように説明しています。

> もうひとつ、ありがちな誤解があります。**それは職場の心理的安全性を高めることを「ゴール」だと考えてしまうことです**。もちろんマネジャーにとって、職場やチームの心理的安全性を高めることは大事ですが、心理的安全性はあくまで組織の生産性を高めるための手段のひとつであり、ゴールではないということです。[^1]
> （強調は筆者）

仮に心理的安全性が高くあっても、それだけで評価されることはありません。「良いプロダクトをつくりたい」というビジョンや目標を達成するために心理的安全性を高める、という順番です。

一方で居心地の良さはそれ自体がゴールになり得るもので、生産性に関連する要素ではありません。居心地が良いから成果が出せるという訳ではない、ということです。


## 心理的安全性は「意見の違い」を恐れない状態

もうひとつの重要な観点は、「**意見の対立**」というのがキーワードです。同じく本書を引用してみます。

> 心理的安全性は、ハーバード大学で組織行動学を研究するエイミー・エドモンドソン氏が最初に提唱した概念で、「対人関係においてリスクのある行動を取っても、『このチームなら馬鹿にされたり罰せられたりしない』と信じられる状態」を意味します。
> これに加えて僕なりの定義を紹介すると、心理的安全性とは「メンバーがネガティブなプレッシャーを受けずに自分らしくいられる状態」「お互いに高め合える関係を持って、建設的な意見の対立が奨励されること」です。[^2]

心理的安全性においては意見の対立は推奨されます。しかし居心地の良さにおいては推奨されない、というより「対立が起こらないような関係性のメンバーと一緒にいる」ことが重要です。

**意見の対立は、会社においてはかならず存在するもの、いや存在すべきものです。**[^3]

だからこそ意見の対立に対してネガティブな気持ちを持たずに済むことは非常に重要である、と私も同意します。

## まとめ

心理的安全性の定義をあらためて確認してみると、それは「居心地がよい」と表現するよりも「**必要以上に対立を回避しなくてよい**」と表現すべきだと感じました。

「心理的安全性」というワードの意味があいまいであったりモヤッとしたりしたときは、この違いをまず押さえてみると少し前に進むかもしれません。

## 参照

- ピョートル・フェリクス・グジバチ『心理的安全性　最強の教科書』 


[^1]: ピョートル・フェリクス・グジバチ『心理的安全性　最強の教科書』 、pp.4-5. Kindle版. 

[^2]: 同、pp.3. Kindle版. 

[^3]: この意見の背景として、[「つながり」でかんがえる多様性](https://qiita.com/kobori_akira/items/4b2f7efb025e6e281892)という記事も書いています。
PHPをHTMLファイルに記述する際のポイント＆フォーム機能におけるリダイレクトの基本

<h1>PHPの基本事項まとめ１</h1>
<h2>htmlファイル中にPHPのコードを書き込む際の基本ポイント</h2>
<p> 
⓵&lt;?php ・・・?&gt;と記述し、・・・部分にphpの処理を記述する
<br>⓶ファイルの上から順に実行される、phpブロックがファイル内に複数記述されている場合、各ブロックは上から順に別のスクリプトとして実行される
<br>⓷phpの各ブロック内で定義された変数や関数は処理ブロック内で宣言された場合、そのブロック内でのみ有効であり、他の処理ブロックには　影響を与えない</p>


<h2>リダイレクトとは</h2>
<p>ブラウザやクライアントがリクエストしたURLに代わって別のURLに転送すること。
<br><br>例えば、index.phpファイル内のPHPの処理において、header関数を用いて
  <br>header('Location: http://localhost:8080/result.php');と記述されている場合を考えよう。<br>
<br>クライアントがブラウザ上で
Location: http://localhost:8080/index.phpを保持（閲覧）していて、そのページに含まれる
フォームを記述し、ポスト処理をサーバに対して行ったとする。<br>
すると、そのフォームタグには通常、次にサーバにどのページを送ってもらうか、の情報を指定し、ここではその指定ページ（ファイル）はindex.phpとしよう。<br><br>
したがって、サーバはクライアントからのリクエストパラメータ（フォームに記述された情報）を処理したうえで、その付帯情報と共にフォームタグにあらかじめ指定されたhtmlファイル（index.php）をクライアントのブラウザに送信する。
<br><br>ここで、index.phpの最上部に&lt;?php ?&gt;
スクリプトブロックと、その内部処理に、<br>フォーム情報をデータベースに保存する処理＋その処理結果をresult.phpに表示するような処理を記述し、<br>同一ブロックの最後に
header('Location: http://localhost:8080/result.php');
と記述することで、<br>サーバはフォーム情報を反映させたresult.phpをクライアントのブラウザに送信<br>(クライアントのブラウザの表示ページをフォーム情報を反映させたresult.phpページにリダイレクト)することができる。
</p>

<br>
<h2></h2>
メモとして書いてるので、ちょっと内容が冗長になっちゃいました。
<br>リダイレクトのイメージとしては、<br>クライアントがブラウザを通して閲覧するページを別のものにするような処理をファイル内に記述することで、クライアントの見る方向（ページ）が変わるから、みたいな感じかな、と思います。<br>
今後直せる機会があれば改善しようと思います。ではまた。
<br>Have a nice life.