OmniAICreator/Qiita-1.07M huggingface dataset:
【NextJS13】getLayoutパターンでChakraUIのDrawerMenuが閉じない問題。

# GetLayoutについて

GetLayoutは従来の_document.tsxとは違い、ページごとにレイアウトを切り替えられるモンです。ただこれを使うとレイアウト側とコンテンツが分離(?)しちゃうのですこし工夫が必要です。

詳細

https://nextjs.org/docs/pages/building-your-application/routing/pages-and-layouts#layout-pattern

# 修正コード

```tsx
const {isOpen, onOpen, onClose} = useDisclosure();

const router = useRouter();
useEffect(() => {
    router.events.on('routeChangeComplete', () => 
        onClose();
    });
}, []);

```

考え方は単純でNextJSのuseRouterでロード終了時にonClose(ChakraUIのメニューを閉じる関数)を実行するだけです。
ｲｪｱ。
Macのnodebrewで古いnodeがインストールできない！？解決してあげよう

# 結論
shellをRosettaで起動して`nodebrew install`を実行

## 手順
1. Finderアプリでアプリケーションフォルダを開く
2. shellアプリを**右クリック**
3. 「情報を見る」をクリック
4. 「Rosettaを使用して開く」にチェックを入れる
![スクリーンショット 2023-09-15 11.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195078/b90a0e85-ca35-ec66-4565-a20fcbc465ad.png)
5. Shellを起動
6. `nodebrew install`を実行


# 何故インストールがうまくいかないのか
これはAppleシリコンのCPUを搭載したMac古いNodeをインストールしようとした時に発生します。
`nodebrew`でインストールできるM1チップに対応している`nodeバージョン`に古いNodeバージョンがないためNotFoundとなりインストールがはじまらないのが原因となる。
ちなみに`nodebrew ls-remote`では普通に表示されるので勘違いしやすい。

一応バイナリのものをコンパイルすることができるらしいが、これもうまくいかないことが多いので、Rosettaを使うのが一番簡単で安全と言える。
Fonttoolsを使ってビットマップ(風)TrueTypeフォントを作る

# 概要

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511996/970b2463-e321-9d9a-40df-8bb9a46437a7.png)

status bar用ビットマップフォントの輪郭を抽出してTrueTypeフォント(`.ttf`)に変換した.

# OpenTypeビットマップフォントは使えない?

Opentype bitmap font`.otb`は現在, pangoで唯一サポートしているの ビットマップフォントフォーマットですが. fonttoolsのfontBuilderはビットマップフォントを対応していない. 直接にEBDT/EBLC tablesなどを書き込むのためpatchが必要みたいです. また,`.otb`の移植性などの懸念などいろんな問題があるの結果, 今は安定したttfベクターフォントを最初に作り上げることを決めた.

Patchはmonobitの実現によると: <https://github.com/robhagemans/monobit/blob/3d19d930344f18080253b4046bb711aaea5620ba/monobit/formats/sfnt/fonttools/__init__.py#L24>)

# 流れ

まずテキストフォントを作る: <https://github.com/6e5d/sb7x8>. 一行目はunicode数,そして幅×高の1 bitピクセルデータ:

```
48
1111111
11...11
11..111
11.1111
1111.11
111..11
1111111
.......
```

TrueType自体はcontourの回り方向の要求はないが, 一応左手方向=内部を定義する(ソリッド=左巻き,穴=右巻き). この設計を利用して,tracingの時パスは簡単に左回りルールで選択できる. こんな回りの辺を作るため,ピクセルずつ左回りで辺を追加が, その辺は2回作る(必ず逆の方向)の場合は相殺する:

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F3511996%2Ff63b3deb-6c84-4a4c-949b-7d2a0c8b5613.png)

この辺の集合を作った後,通常に,全部の辺を順序に連結してパスを作り上げる. しかし,頂点は2つではなく,4つの辺を接続する場合は,パスを簡単に決めることができない. ここで左手法則に利用して左回りだけパスを選択する.

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0%2F3511996%2F866c5ac4-7e08-e04f-6af9-62591af093ae.png)

左は左手法則に従っていない(左はピクセルではなく) 一方, 右は左回りだけを使って,字体の輪郭が正しく囲まれる.

最後はfonttools.fontBuilderを使って輪郭パスを書き込む. fontBuilderのソースコードに使用例が添付されている: <https://github.com/fonttools/fonttools/blob/1ef556995973759cb0bc0b123dfc8748e09a9843/Lib/fontTools/fontBuilder.py#L25>.

# 参考

ソースコード: <https://github.com/6e5d/bit2svg>

* fonttosfnt: <https://gitlab.freedesktop.org/xorg/app/fonttosfnt>

* fonttools: <https://github.com/fonttools/fonttools>

* monobit: <https://github.com/robhagemans/monobit>
この度、29歳、sesに入社しました。

# 自己紹介
29歳・男性・完全なる文系。
転職経験は今回で4度目。前職は工場で、4年間働いていたがエンジニアに夢や憧れをいだき、
プログラミングスクールに通う。卒業後、SESにやっとの思いで入社。
東京に引っ越して一人暮らしを始める。

## この記事を見てもらいたい人
未経験からIT業界を目指している人
SESを視野に入れてる人

## なぜエンジニアを目指したのか
プログラミングに興味があったし、リモートワークしたかった。
工場勤務では経験できないことができるのではないかという期待も含めて、IT業界に入りたかった。

## 思い描く理想の働き方
すぐに配属先が決まり、開発まではいかずともテストや、運用保守などに携われる。リモートワークができて、週に2~3回出社して、実務を通して先輩からわからないところを教わって経験を積んでいく。

## IT業界に夢を見すぎた
実際は思い描いた業界ではなかった。
やはり案件ガチャと呼ばれるだけはある。自分の望まない案件が回ってくるし、正社員なのでほとんど断ることができない。
- 面談・顔合わせと言う名の面接的なものがある。
- 来るのはヘルプデスクや電話対応くらい。
- そもそもなかなか案件が決まらず待機期間は給与60%
- 提示される常駐先はへの通勤時間が意外と長い。ドアtoドアで、片道90分以上なんてザラ
- リモートワークができるなんて考えないほうがいい
- ロースキルに人権はない。
- 出張がある案件もある。
- 年収は勿論、かなり落ちた。

工場の方が給料良かったな・・・。

## 通勤電車で勉強はできるのか
- 満員電車だとできない。やりにくい。
- 通勤ラッシュで椅子に座れない。

## 業界の闇？
実務経験がないと開発に携われない。
待って。そもそも実務経験を積むためにSESに入社したんですが！！
みんな最初は実務ないのに、どうやって実務経験積めるのよ。
30歳前後から未経験で入るとマジで使い物にならないかもしれない。
待機期間は給与大幅カットなので、定職って言えない感じする。正社員だけど。


## エンジニア転職を勧める広告は駆逐すべきだと思います。
- 未経験から年収アップ
    年収はむしろ下がると思います。
- フルリモート
    案件によりますが、ロースキルにはフルリモート案件なんてまず回ってきません。
- 残業なし
    案件によりますが、繁忙期はもちろんありますし、休日出勤もあると思われます。

- 人手不足
    むしろロースキルの人が溢れかえってます。足りないのはハイスキルな人たちです。
エンジニアといっても、セキュリティ面を考慮し、リモートできない案件もある。
インフラエンジニアなんて絶対リモートできないと思われる。
- たぶん世間がイメージする派遣となんら変わらない。案件きたら面談して受かれば良し、落ちれば待機。
- コミュニケーション能力がないと、かなり不利。
- 資格取得目指した方が幾分かマシ

とまぁ、こんな事を感じている。
給料少なくて生活できるか分からんレベル。

プログラミングスクール卒業しても開発なんて夢のまた夢だと感じています。

工場勤務から逃げたくて、知らない業界に身を置きたくて、自分から踊りに行った愚か者です。

案件なすら受からないので、適正がない以前の問題ですよね。

さっさと転職を、といいたい所ですが、一度も配属されずに転職するのは流石に無駄だし、意味がないので、1年様子を見てみることにします。
ほぼ未経験でもChatGPTを使えばプログラムを作れるのか⑮プログラミングほぼ未経験者の挑戦～最終回（仮）

というわけで？

池田は期限の8月31日を迎えてしまいました。

プログラミングを作れるのか？という検証は失敗に終わりました。

目標設定～コーディング（一部保留あり/コーディングは未達成）
**所用時間**：37時間11分3秒

どの辺で失敗したんだろう？
いろいろあるだろうけど、知識のある人に客観的に教えてほしいな…
さすがにChatGPTに聞いても分からないだろうし…

助けて、誰かエライ人＼(^o^)／

と、いうわけで元エンジニアの弊社の社長に聞いた（エライ人、間違いなし）


以下社長からのコメントです。

・失敗した原因で一番大きいのは、プログラムを作るにあたってのベースが出来ていなかったこと

・エラーが出たときにどう調べたらいいのか？<br>chatGPTが提示してきたコードが「変だ」と気づけるかどうか、というのが大事<br>（コードを見ていると、そもそもchatGPTが提示してきたコードの書き方がおかしいところがあったらしい）

・プログラムを作る部分だけで言えば、経験者がやれば1日あれば出来る

とのことでした。

ベースからダメだったのか。

そしてコードが「変だ」と気づくってのは、ある程度プログラミングの知識がある人でないと無理ってことなんだな。


池田が失敗したのは圧倒的に知識＆能力不足が原因だけど、
それ以外でこれが失敗だったと思った点を少し説明します。

以下、負け犬の遠吠えです。（ワーン）


**①時間配分を間違えた**
・アルゴリズムの設計に時間がかかりすぎた
・池田のやる気が2週間も休みを取った←これが大きな失敗
・結果として、一番時間がかかるコーディングに時間が取れなかった

**②スレッド内で会話していることは、ある程度は覚えているだろうと思い込んだ**
・いったん会話が終了しても、ある程度は以前の会話を覚えてくれているが、終了した会話の内容とその先の会話の内容が変わってしまうと、以前の会話は覚えていない。
例：アルゴリズムの会話をする→会話終了→そのままエラーコードの質問をする→アルゴリズムの会話の内容を踏まえて質問をすると、最初のアルゴリズムの会話で話した定義等が分からなくなっている。

**③ChatGPTがこちらの意図を理解していると思い込んだ**
・開発環境を選ぶ際に、ChatGPTに自分のやりたい事がこの環境でできるのかしっかり確認しなかった。GoogleColabを紹介されたがGoogleColabではGUIを使えないことが時間がたってから発覚した。

他にもダメなポイントはたくさんあったけど、大きな失敗は上の3つかな。

社長がこの検証をするきっかけとなった動画で「コードを最初から書かせるのはお勧めしなくて、分からないところを聞くとかはいいと思う」的な事を言ってたと思うんだけど、まさにその通りだと思う。


**結論**：ChatGPTだけを使ってプログラミング未経験者が最初からプログラムを作成することはとても困難（ほぼ不可能）プログラミングの知識がある程度ある人なら可能で便利。ただしChatGPTの生成したプログラムの検証必須。

**ChatGPTがSEやプログラマの仕事を代替することは可能か？**：すべての工程を代替することは、現段階では不可能。
ただこのままChatGPTが進化していけば、コードを書く部分だけを丸ごと任せることは可能かな、と思う。ただし、技術的に理解のある指示者＆エラーチェックが絶対に必要。
現時点でもある程度コードを書かせることは可能なので、上手く使えば時間短縮にはなるのかな？とは思う。
でもエンジニアが自分でコードを一から考えて書くのと、ChatGPTの生成したコードに間違いがないかチェックするのってどっちが早いんだろうな。
技術者のスキルによって、便利さが変わる気はしている。
プログラミングのスキルが浅い人は、ChatGPTの生成したコードの間違いに気が付かず、エラーの沼にはまる可能性が高いと思う。
ちなみにエラーチェックもしてくれるが、ChatGPTでも気が付かないエラーがあるため、あまり信用できるものではない。
スキルがすごく高い人はChatGPTに頼る必要なく、さくさくコードが書ける気がするので、ChatGPTを真に便利に利用できる人は、そこそこのスキル＆経験値がある人なのかな？と思う（池田の個人的な感想です。異論大歓迎）

**プログラミング初心者がChatGPTを使用してプログラミングの勉強をする事は可能か？**：可能。ただし、ChatGPTのみの利用は推奨しない。理由としては、普通に間違った情報も教えてくるため。あくまでも別のメインの勉強方法があって、サブとしてChatGPTを使うのならば、便利。

エンジニアの人ってほんとすごい。尊敬する。

期限はきちゃったけど、せっかく始めた検証なので、このままプログラムを作成できるように頑張ってみようと思う。

今年中にできたらいいなぁ・・・

最後にここまで支えてくれた私の仮想営業担当、茶都さんにお礼を言わなければ。


![ChatGPT15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2500101/e2358903-964f-3b38-a16a-04335ef8ed04.png)

ちょっとバグってるけど、ありがとう！
indexOfで存在確認→処理のサンプルコード

## 動機
簡単に動作確認できるサンプルを作ることで、ほらこうなったでしょ～って説明をしやすくしたい。
→せっかく作ったならゴミコードでも公開しよう！

## 何をするコード？
1. nameListをkey、Object(空のclassCd、Nm、updatedAtを持つ)をvalueとしたResultDataを作成する。
2. DBdataの各データについて、DBdata.NmがnameListに存在した場合、DBdata.Nmをkeyとして取得できるResultData.ObjectのclassCdとupdatedAtをDBdataの情報で書き換える。

## 実行方法
1. 下記のコードをそれぞれhtmlファイル、jsファイルとして同じディレクトリに保存する。
1. htmlファイルをブラウザで開く。

```test.js
nameList=["test1","test2","test3","test4"]; //Array型
let ResultData={}; //Object型
DBdata = [ //Array型
    {Nm : "test1",
     classCd : "空じゃないやつ",
     updatedAt : "0930"
    },
    {Nm : "test2",
     classCd : "空じゃないやつ",
     updatedAt:"0932"
    }
];

nameList.forEach(function(listNm){
	ResultData[listNm]={
	  classCd : "空白",
	  Nm:listNm,
	  updatedAt :null
	};
});

DBdata.forEach(function(data){
   if( nameList.indexOf(data.Nm) > -1 ){
      ResultData[data.Nm].classCd=data.classCd
      ResultData[data.Nm].updatedAt=data.updatedAt
   };
});

console.log("処理後のResultData", ResultData);

```

```test.html
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>This is testpage.</h1>
    </body>
    <script src="test.js"></script>
</html>

```

## 実行結果
1. 開発者ツールを開く。
1. ResultDataの中身を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818285/bef7c637-2c92-545b-6873-f8d76c1367ef.png)

DBdataに存在するtest1,test2については、ResultDataの書き換えが発生していることが分かる。
サンプルコードの値を変えて試してみよう。

以上。
Go×vscodeを使用してtestingを実行する際の環境変数を設定する

# 初めに
Go×vscodeを使用してtestingを実行する場合に下図のような「run test」などが表示される。
![スクリーンショット 2023-09-15 12.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/14fba813-5d17-c3f3-bc12-bb86658b26d9.png)

その際に環境変数する必要があったので方法を記載する。

# やってみる
まず任意のディレクトリにenvファイルを作成する
```
% touch .env
```

envファイルに任意の変数を定義する。
```.env
ENV=local
```

vscodeの設定ファイルを開く。
macの場合は`command` + `,`で設定ファイルを開く

`go configuration`で検索して`setting.json`を編集する
![スクリーンショット 2023-09-15 12.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/952574/271d2350-edc7-6fa8-f2b2-ccd15c06c75d.png)

`go.testEnvFile`に作成した.envファイルのパスを記載する。

```setting.json
{
    "workbench.colorTheme": "Default Dark+",
    "editor.inlineSuggest.enabled": true,
    "go.testEnvFile": "/Users/省略/.env",
```

これでtestingを実行する際に設定した環境変数を読み込むことができる。
nodeを使ってWebDAVのファイルを取得したい！

# WebDAVってなんだよぉ

Nodeを使った案件で、WebDAVからファイルを取ってくる処理を書かなくてはいけなくなりました。WebDAVなんてFTPを使わないファイルサーバくらいの認識（正しいかは定かではない）しかないのですが、とりあえず動くものができたので共有します。

## 環境構築

環境はすべてdockerを使用して作成しました。WebDAVのコンテナイメージは[こちら](https://hub.docker.com/r/bytemark/webdav/)。nodeのコンテナはお好きに作成していただいて構いません。

```docker-compose.yml
version: '3'

services:
  node:
    build: .
    volumes:
        - .:/app
    ports:
        - 3000:3000
    tty: true
    environment
        - WEBDAV_URL=http://webdav:80
    working_dir: /app

  webdav:
    image: bytemark/webdav
    restart: always
    ports:
      - 80:80
    environment:
      AUTH_TYPE: Basic
      USERNAME: alice
      PASSWORD: secret1234
    volumes:
      - /data:/var/lib/dav/data
```


※ Qiitaでコードブロックを埋め込むときに、ファイル名をバッククォートの後に書くとファイル名が表示されるんですが、拡張子なしだとファイル名が表示されない。Dockerfileだけだとファイル名が消えてしまうから渋々ドットを付けた。いい方法ないのかね

```dockerfile:Dockerfile
FROM node:latest

# 非rootユーザじゃないとpermisson errorが出る
# https://github.com/nodejs/docker-node/blob/main/docs/BestPractices.md#non-root-user
USER node
```

## 動くコード

今回使用するライブラリはこちらの`webdav`です。

https://github.com/perry-mitchell/webdav-client

v5からは開発中ですがESMに対応しているらしく書き方等環境の作り方に注意とのこと。今回は、サポート対象であるv4を利用した書き方を紹介します。

```webdav-example.ts
import { AuthType, createClient } from "webdav"

const client = createClient(process.env.WEBDAV_URL, {
    // Basic認証の場合は特にAuthTypeの指定はいりません。
    username: "alice",
    password: "secret1234"
})
client.getDirectoryContents('/').then(console.log)
```

これで、`/var/lib/dav/data` の値がとれます。ここで、環境依存の問題なのか不明ですが、dockerhubの例では `/var/lib/dav` にデータを入れてたのですが、私はそれではデータを取得できなかったので `/var/lib/dav/data` に入れました。

ちなみに、`getDirectoryContents` で指定するパスはコンテナ内のパスではなくて `/var/lib/dav/data` がルートになっていることに気を付けてください。私はこれで結構はまりました。。。（WebDAVを知ってる人なら当たり前なのかな？）

追記：Apacheだと `var/www/html` がルートになるイメージと同じことだと気づいた

## 終わりに

今回はnodeでWebDAVからファイルを取得する方法を解説しました。Basic認証以外に、例えばダイジェスト認証のやり方については引用先のサイトを参照してください。

https://github.com/perry-mitchell/webdav-client

https://hub.docker.com/r/bytemark/webdav/
Gsonでパースするときフィールド名が違うとちょっと困る

## 3行で解説
パースするとき、JSONのkeyとJavaオブジェクトのフィールド名を一致させると楽だよ。一致しない場合は明示的に「JSONでは○○というkeyのvalueは、Javaオブジェクトでは●●というフィールドに入れるよ」と書かないとダメ。

## そもそもGsonとは？
Gsonは、JSONデータとJavaオブジェクトを相互変換するためのライブラリです。
本記事では、Gsonを使ってJSONデータをJavaオブジェクトにパースする処理（デシリアライズ）に絞ってお話します。


## サンプル
例として、チャットアプリのトークルームをJSONで記述してみましょう。このオブジェクトはデータとして
- トークルームのID文字列
- トークルームの名前
- 最後に発信されたメッセージ
を持っていて、さらにメッセージオブジェクトは
- 発言者のID
- メッセージの文字列
- 送信日時の文字列
を持っています。
```
{
  "id": "トークルームのId",
  "name": "hogehoge",
  "lastMessage": {
    "memberId": "発言者のid",
    "message": "よろしくお願いします。",
    "timestamp": "2023-08-02:10:15:22"
  }
}
```
このデータをパースするためのJavaオブジェクトを定義します。
```
public class Talkroom {
    private String id;
    private String name;
    private Message lastMessage;
}
public class Message {
    private String memberId;
    private String time;　//変数名がJSONの"timestamp"ではないことに注目
    private String message;
}
```
こちらも同じようなデータ構造になっていますが、JSONでは`timestamp`となっていた部分の変数名だけ`time`に変わっています。
### パースするコード
```
String jsonString = "JSONの文字列"
Gson gson = new Gson();
Talkroom talkroom = gson.fromJson(jsonString, Talkroom.class);
```
コード自体は簡単で、`fromJson()`メソッドにJSONの文字列とパース視てほしいクラスを渡すとその通りにパースしてくれます。
### フィールド名が違う場合
先ほど、Messageクラスの`time`だけJSON側と異なる変数名にしました。これを放置してGsonにパースさせると、Gsonはtimeに格納する変数を見つけられず、変数はnullのままになります。変数名が違う場合は、Gsonに「JSONで`timestamp`と呼ばれているデータは、`time`に入れてね！」と伝える必要があります。

```
@JsonProperty("timestamp")
private String time;
```
クラス定義の際に上のように書いてあげるとGsonに伝えることができます。（おそらく）この機能は、「JSONではkeyにハイフンが使われているけど、Javaでは変数名にハイフンを使えないよ！」みたいな時のために用意されている処理だと思います。特にこだわりがない場合は、Javaのフィールド名をJSON側に合わせることをお勧めします。

## 参考資料
https://salumarine.com/json-property-name-and-java-variable-name-are-different/

https://qiita.com/naoi/items/6b184700b2a41fb46356#json%E3%81%8B%E3%82%89java%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88
ABC318をPythonで（A~E）

THIRD プログラミングコンテスト 2023 アルゴ（AtCoder Beginner Contest 318）
URL：[ABC318](https://atcoder.jp/contests/abc318)

# A問題
問題文の通りにすればよい
```python:A
n, m, p = map(int, input().split())

ans = 0
for i in range(1, n + 1):
    if (i - m) % p == 0:
        ans += 1

print(ans)
```
ただし、計算で求めることもできる。
```python:A別解
n, m, p = map(int, input().split())
print((n - m) // p + 1)
```
# B問題
いもす法など高速化の方法はあるが、愚直にやっても時間に間に合う。
```python:B
field = [[0] * 110 for _ in range(110)]

n = int(input())
for _ in range(n):
    a, b, c, d = map(int, input().split())
    for i in range(a, b):
        for j in range(c, d):
            field[i][j] += 1

ans = 0
for f_i in field:
    for f_j in f_i:
        ans += (f_j > 0)

print(ans)
```
# C問題
金額がかかる方から順に、d日間の合計金額とpのうち安いほうを採用する。
```python:C
n, d, p = map(int, input().split())
f = list(map(int, input().split()))
f.sort(reverse=True)
ans = 0
for i in range(0, n, d):
    ans += min(p, sum(f[i:i + d]))

print(ans)
```
# D問題
```python:D
n = int(input())
edge = []
for i in range(n - 1):
    e_i = list(map(int, input().split()))
    edge.append([0] * (i + 1) + e_i)

dp = [0] * (1 << n)
for bit in range(1 << n):
    for i in range(n):
        if bit >> i & 1: continue
        for j in range(i + 1, n):
            if bit >> j & 1: continue
            dp[bit + (1 << i) + (1 << j)] = max(dp[bit + (1 << i) + (1 << j)], dp[bit] + edge[i][j])

print(max(dp))
```
# E問題
(iとkの間にあるjになりうるものの個数)
x（iとその左にある同じ数の個数）x（jとその右にある同じものの個数）
```python:E
n = int(input())
a = list(map(int, input().split()))
d = dict()
for i, a_i in enumerate(a):
    if a_i not in d:d[a_i] = []
    d[a_i].append(i)

ans = 0
for val in d.values():
    for i in range(len(val) - 1):
        ans += (val[i + 1] - val[i] - 1) * (i + 1) * (len(val) - i - 1)

print(ans)
```
Flutter WebをAWS Amplify Hostingにデプロイするときのamplify.yml

AWS Amplifyではビルド時に走らせるスクリプトを指定することができます。Flutter webをAmplify Hostingにデプロイするときのビルドスクリプトで少し詰まったので、ここに共有しておきます。

```amplify.yml
version: 1
frontend:
  phases:
    preBuild:
      commands:
        - |
            if [ ! -d _amplify_flutter_root ]; then
                git clone https://github.com/flutter/flutter.git _amplify_flutter_root
            else
                echo "Flutter is already installed."
            fi
            _amplify_flutter_root/bin/flutter --version
            _amplify_flutter_root/bin/flutter channel stable
            _amplify_flutter_root/bin/flutter upgrade
            _amplify_flutter_root/bin/flutter pub get
    build:
      commands:
        - |
            _amplify_flutter_root/bin/flutter build web
  artifacts:
    baseDirectory: build/web
    files:
      - '**/*'
  cache:
    paths:
      - _amplify_flutter_root
```

前のキャッシュが残っている時にビルドが失敗するときがありましたが、一旦`rm -rf _amplify_flutter_root`をしてキャッシュを消せばそれ以降は安定して動くようになりました。
【解決】WSL2の古いバージョンで、EmacsがSegmentation Fault

# 問題

Windows 10＋WSL2＋UbuntuでEmacsを快調に使っていたが、ある日Segmentation Faultでコケるようになった。

# 解決

WSL2を更新したら直った。Windowsのcmd.exeから`wsl --update`。

# 背景

Stack Overflowにも同じ問題を投げて、ヒントをコメントで得て自己回答した。
https://ja.stackoverflow.com/questions/96212/ubuntu-on-wsl2-%e3%81%ae-emacs-%e3%81%8c-segmentation-fault-%e3%81%a7%e8%b5%b7%e5%8b%95%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84

WSLの最新版ではもう問題は起きないので直接必要はない情報だが、問題のあるWSLのGPUのレンダリングをオフにする（CPUでレンダリングを行う）ようにするだけでも見た目上問題は起きなくなるという記事があり、たしかに環境変数を変えるだけで問題は見た目上直った。
https://zenn.dev/a106lab/articles/7ac5f3a3e94d17

使用するマシーンはCPUにCore iの内蔵GPU付きを使っていて、合わせてグラボにRTX 2060を使っている。
グラボのレンダリングでWSL＋UbuntuがSegment Faultになることもある（あった）という学びを得た。

WSLの更新については以下を参考にした。
https://learn.microsoft.com/ja-jp/windows/wsl/troubleshooting

**（以上）**
【ChatGPT無】に薬機法専門のコピーライターになってもらう。


　どうも、カーブミラーです。

　今回は、ChatGPTに、薬機法専門のコピーライターになってもらい、コピーを作成してもらいます。お題は「育毛剤」。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　さて、今回は、
　　薬機法についての前回の

[【ChatGPT無】にキャッチコピーが薬機法に抵触するか判定してもらいます。](https://qiita.com/kabumira/items/b3ae1c513c4315fd2b1a)

　　　に引き続き、第二弾。

　いや、
　　そんな仰々しいものでは
　　　ありませんよw

　ただ、クライアントの要望に
　　沿っていなかったので、
　　　そのリベンジです。

　クライアントの要望は、
　　「コピーを考えさせて」という
　　　ものでした(泣)

　というわけで、
　　クライアントの要望に
　　　合わせたものです。
***
　まずは、Promptから。

```Text:薬機法専門のコピーライターPrompt
# 目的
購買意欲が促されるような「育毛剤」のコピーライティングをお願いしたい。

# 役割
あなたは、薬機法専門のコピーライターです。

# コピーの方向性
・強烈なインパクト

# 注意点
薬機法に抵触しないものをお願いします。

# 最終確認
・情報が足りなければ、ユーザーに尋ねてください。
```
　ここで、注目して欲しいのは、
　　コピーの方向性、です。

　これがあることで、
　　コピーの内容に、
　　　それなりのインパクトが
　　　　生まれます。

　YouTuberかわごんさんに
　　教えてもらいました。
　　　ちょっと変えたよぉ🙋‍♂️

　では、
　　やり取りをどうぞ。
***
***ChatGPT***
もちろん、育毛剤のコピーライティングをお手伝いします。薬機法に抵触しないように注意しながら、強烈なインパクトを持つコピーを考えます。まず、以下の情報が必要です：

1. 製品の特長や利点：育毛剤の何が他と異なるのか、どのような効果や利点があるのか教えてください。

2. ターゲットオーディエンス：どのような人々に向けてこの育毛剤を販売したいのか、ターゲットオーディエンスの特徴やニーズについて教えてください。

3. 製品の成分や安全性：育毛剤の主要成分や安全性についての情報が必要です。

これらの情報を提供いただければ、より効果的なコピーを考案できます。また、薬機法に関する具体的な制約や要件があれば教えていただければ幸いです。

***User***
効果は、抜群。
ターゲットは、生え際が後退しはじめた人。
安全性は、成分分析を依頼し、確認が取れています。

***ChatGPT***
ありがとうございます。効果が抜群で、ターゲットが生え際が後退し始めた人々に向けられている育毛剤のコピーを考えます。

**コピーの提案:**

"薄毛の悩み、生え際の後退にお悩みの方へ。驚異的な効果で、自信を取り戻しましょう。安全性も確認済み。"

このコピーは効果を強調し、ターゲットオーディエンスに訴えかけ、安全性も強調しています。薬機法に抵触しないように注意しつつ、強烈なインパクトを持つコピーとなっています。何か追加の情報や修正が必要であれば、どうぞお知らせください。
***
　ちと待て。
***
***User***
「驚異的な効果」は、本当に薬機法に抵触しませんか？

***ChatGPT***
申し訳ございません、"驚異的な効果"という表現は、薬機法に抵触する可能性があるかもしれません。法的な制約に従う必要がありますので、修正が必要です。

代わりに、以下のような表現を検討してみてはいかがでしょうか：

"優れた効果で"、"驚くほどの変化をもたらす"、または"明らかな結果が期待できます"などの表現が、法的な規制に適合するかと思います。必要であれば、具体的な制約に関する情報を提供いただければ、それに合わせて修正を行います。

***User***
"優れた効果で"で書き直してください。

***ChatGPT***
もちろん、修正します。以下が修正されたコピーです：

"薄毛の悩み、生え際の後退にお悩みの方へ。優れた効果で、自信を取り戻しましょう。安全性も確認済み。"

この表現は薬機法に抵触しないものと考えられます。他にも何か変更点や追加の要望があれば、お知らせください。
***
　という感じです。

　ちょっと引っ掛かる部分は、
　　このように尋ねるべきです。

　薬機法で制限を掛けていても
　　ChatGPTさんのことです、
　　　なにかしらの行き過ぎな
　　　　部分は出てきますから。
***
　以上。
スクリーンリーダーでプログラミングをしたい方へ

スクリーンリーダーを使ってプログラミングを始めてみたいという方に向けて一言アドバイスを記録として残しておこうと思います。
僕自身、今の段階になるまでかなり回り道をしましたので、これから始める人たちがスムーズにスタートが切れる助けになれば幸いです。

-----


## スクリーンリーダーの選択
多くの方が _PCトーカー_ を使っていると思われますが、ここでわオープンソースのスクリーンリーダー __NVDA__ をおすすめします。
もちろんJAWSを使っている場合はそのままでOKです。
導入段階で困ることはないのですが、いざコードを書き始めると入力の支援などがほとんど受けられずスムーズに作業が進められません。
プログラミングを始める前にNVDAをインストールして操作に慣れておきましょう。
- [NVDA日本語版 ダウンロードと説明](https://nvda.jp)
- [NVDA日本語版をダウンロード](https://i.nvda.jp)


## エディタの選択
プログラミングで入力する英数字・記号の羅列をコードといいますが、
これらはメモ帳など文字が入力できればどのエディタでも基本的に作成できます。
ただすべてを自力で入力するのは現実的ではありません。
長い文字列をすべて覚えて入力するのは不可能に近いです。
専用のエディタを使うと漢字変換のように入力候補から選択ができるため、作業が格段に楽になります。
コードを書くときにありがちな入力間違いも防止することができます。
僕は __Visual Studio Code__ を使って作業をしています。
拡張機能をインストールすることで多くのプログラミング言語のコードの入力の支援が受けられます。
- [Download Visual Studio Code - Mac, Linux, Windows](https://code.visualstudio.com/download)


## 言語選択
世の中には沢山のプログラミング言語があります。
初めにどれを学習するのがベストなのか、残念ながら最適な答えを持ち合わせてわいません。
コーディングのための準備のしやすさ、コードの読みやすさを考慮して以下3つをおすすめしておきます。
- [Download Python | Python.org](https://www.python.org/downloads/)
- [PHP: Downloads](https://www.php.net/downloads.php)
- [HSP3ダウンロード](https://hsp.tv/idman/download.html)


## 最後に
プログラミングは視覚障害者でも自己学習がしやすい物です。
ウェブの記事を参考にそれぞれのペースで学習が進められます。
何より学習に一番必要な模倣ができる点が大きいです。
Google document Tips


# 見出し番号の自動付与
https://tech.opst.co.jp/2022/12/21/google-docs-%E3%81%A7%E8%A6%8B%E5%87%BA%E3%81%97%E3%81%AB%E9%A0%85%E7%95%AA%E3%82%92%E8%87%AA%E5%8B%95%E4%BB%98%E4%B8%8E%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
CSSにクエリパラメータを設定して最新のCSSを反映させる

# はじめに
cssなどを更新した際にブラウザ側でファイルを読み込まずにキャッシュが読み込まれcssなどの修正が反映されない事象があったためCache Bustingというブラウザのキャッシュを制御する方法を記載

# 使用環境
PHP5.4.16
CakePHP2

# 具体例
```
<link rel="stylesheet" href="style.css">
```
上記の様に記載されている読み込み箇所のファイルの末尾にクエリパラメータとして固有の文字列を設定する
```
<link rel="stylesheet" href="style.css?202300914">
```
こうすることでブラウザが前のバージョンとは違うファイルだと認識するため、キャッシュではなくファイルの読み込みを実施するという方法です。

# あとがき
CakePHP2にはあらかじめCache Bustingを行う機能が備わっているようで
core.phpファイルの
```
//Configure::write('Asset.timestamp', true);
```
この部分のコメントアウトを外してtrueをforceに変更します

```
Configure::write('Asset.timestamp', 'force');
```
上記の様に設定すれば動作するとのこと。
ただ、コメント確認したところ上記の設定はキャッシュ無効としてブラウザを開くたびにキャッシュがクリアされる仕様となっていそう。
今回はファイルを更新した際に1回だけ実施すれば良かったのでクエリパラメータを設定する方法で行っています。
CakePHPのModelのcreateメソッド使用時のデフォルト値の挿入について

# はじめに
DBのデータ更新の際に
```
foreach ( $value as $val) {
    $this->Model->create()
    $this->Model->save()
}
```
上記記述のように複数のUpdate処理を行う際に、更新対象ではないデータ更新が行われる事象が発生した。
今回はその事象への対応方法の備忘録です。

# 使用環境
PHP5.4.16
CakePHP2

# 原因
```
$this->Model->create()
```
CakePHPではcreateした時に、引数の配列が設定されていなければDBで設定されているデフォルト値を挿入するようになっているとのこと。
そのため本来更新行わないカラムもデフォルト値による更新が発生している。

# 対応方法
create引数にnullかfalseを渡して使用する
```
$this->Model->create(null)
$this->Model->create(false)
```
上記のように記述することでcreateメソッド使用時のデフォルト値の挿入がされなくなるため、不要なデフォルト値による更新が発生しなくなる。

# あとがき
何気なく使っているメソッド等も中ではどのような動作をしているか知らなかったため今回のような不具合が発生した。
なのでメソッドの中身を調べておかないと同じように内部の動作を理解してないが故の不具合が発生するかもしれないので今後は勉強する必要がある。
Falco Ruleを紹介するシリーズ - Create Sensitive Mount Pod



本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Create Sensitive Mount Pod」</b>です。
# Rule記述
```
- rule: Create Sensitive Mount Pod
  desc: >
    Detect an attempt to start a pod with a volume from a sensitive host directory (i.e. /proc).
    Exceptions are made for known trusted images.
  condition: kevt and pod and kcreate and sensitive_vol_mount and not ka.req.pod.containers.image.repository in (falco_sensitive_mount_images)
  output: Pod started with sensitive mount (user=%ka.user.name pod=%ka.resp.name ns=%ka.target.namespace resource=%ka.target.resource images=%ka.req.pod.containers.image volumes=%jevt.value[/requestObject/spec/volumes])
  priority: WARNING
  source: k8s_audit
  tags: [k8s]
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/k8saudit" target=new>Kubernetes Audit Events Pluginプラグイン</a>をインストールすることで使用可能になるルールです。
Kubernetes のセキュリティ課題のほとんどが、クラスター (その制御プレーンと API、基盤となるノードと Linux カーネル、およびネットワーク) を複数のテナント間で共有することに起因します。
コンテナがホストのファイルシステムにアクセスできるということは、ホスト自体の制御権を得ることであり、他のコンテナに関連するデータが含まれている可能性のあるホストデータにもアクセスできるということです。これにより、悪意のあるユーザーがホスト環境を操作し、そのファイルシステム内のデータにアクセス、改ざん、削除できる可能性があります。つまり、コンテナのエスケープやクラスターの他の部分への攻撃に利用される可能性があります。
そのため、コンテナとホストとの分離境界を維持することが重要です。このルールを使うことでPodがホスト上の機微なディレクトリ（/procなど）をマウントしたことを検知できます。

# Condition（条件）
`kevt and pod and kcreate and`
Podが作成され、

`sensitive_vol_mount and`
ホスト上の機微なディレクトリがマウントされ、

`not ka.req.pod.containers.image.repository in (falco_sensitive_mount_images)`
コンテナイメージが、機微ディレクトリのマウントを許可したイメージではない場合

#
`sensitive_vol_mount`マクロの内容は以下となります。
```
- macro: sensitive_vol_mount
  condition: >
    (ka.req.pod.volumes.hostpath intersects (/proc, /var/run/docker.sock, /, /etc, /root, /var/run/crio/crio.sock, /run/containerd/containerd.sock, /home/admin, /var/lib/kubelet, /var/lib/kubelet/pki, /etc/kubernetes, /etc/kubernetes/manifests))
```

PodのボリュームのホストPathが次のディレクトリのどれかに該当する場合
(/proc, /var/run/docker.sock, /, /etc, /root, /var/run/crio/crio.sock, /run/containerd/containerd.sock, /home/admin, /var/lib/kubelet, /var/lib/kubelet/pki, /etc/kubernetes, /etc/kubernetes/manifests)

# Output（出力）
機微ディレクトリをマウントしたPodが起動しました。

`%ka.user.name`
K8sユーザー名

`%ka.resp.name`
K8sレスポンスオブジェクト名

`%ka.target.namespace`
K8sターゲットネームスペース名

`%ka.req.pod.containers.image`
K8s Podコンテナイメージ名

`%jevt.value[/requestObject/spec/volumes]`
ボリューム名
【JavaScript】画面が固まるほど重い処理の対策【フリーズ】

## 結論

WebWorkerを使いましょう。

https://developer.mozilla.org/ja/docs/Web/API/Web_Workers_API/Using_web_workers

## サンプル

https://mogamoga1024.github.io/CountermeasuresForHeavyProcessing/

https://github.com/mogamoga1024/CountermeasuresForHeavyProcessing

## チラ裏

等差数列の和の公式を使えという批判は受け付けません。

## 追記

setZeroTimeoutを使うのもありかも。

https://qiita.com/mogamoga1337/items/9a4f4c3d26976da4f5fe
ビジネスパーソンとデータエキスパートのアップスキルを目指す

大学機関や政府系機関、企業では、より多くのAIエキスパートを育成しようと努力しているにもかかわらず、現状は変わっていません： AIエキスパートは、特に技術に疎い業界もTech Savvyな業界でもまだまだ不足しています。そのため、既存のデータ専門家は振り回され、労働意欲も低下し、時には高度なアナリティクスやAIプロジェクトを本番展開できないことさえあります。

**[→ 『アップスキリング： データ＋AI人材の争奪戦に勝つ方法』をダウンロード](https://pages.dataiku.com/ja/battle-data-ai-talent-jp)**

企業は、全社的な大規模な変革を目指す場合、専門家だけに頼ることはできません。エンジニアやサプライチェーンマネージャーなど、すでに何らかの形でデータを扱っているナレッジワーカーを活用する必要があります。このブログポストでは、ハイスキルなデータ専門家に高度なデータサイエンスをさせる一方で、ドメイン専門家にも重要な役割を担わせることで、組織が実際に全社的な変革を達成する方法について、光を当てていきます。

## 組織はこのデータエキスパートの不足にどのように対処すればよいのか？
[AIイニシアチブのための組織の運営モデル](https://pages.dataiku.com/ai-operating-models)において、データとAIが真にユビキタスになるためには、役割やチーム、技術的な専門知識にかかわらず、誰もが、自分の仕事を行い、そのデータに基づいて意思決定を行うために必要なデータへの適切なアクセス（およびそれに伴うリテラシーと理解）が必要になります。組織は、[従業員のためのスキルアップと継続的な教育プログラム](https://blog.dataiku.com/ai-upskilling-future-of-work)の機会を設けるだけでなく、AutoMLや拡張アナリティクス、データクリーニング、コードなしでの探索をサポートする機能など、これらの取り組みをサポートし、ビジネスパーソンがデータサイエンスプロセスに参加できるようにするツールを提供することもできます。

以下のビデオでは、DataikuのフィールドCDOであるConor JensenとShaun McGirrが、Dataikuの顧客であるNXPとUnileverが、データサイエンスと高度なアナリティクスの問題を解決するために、ドメインエキスパートにデータサイエンスと高度なアナリティクスの問題を解決させ、既存のデータエキスパートを活用している方法を動画で紹介しています：[*Video: Customers Make the Most of Expert Talent With Dataiku*](https://videos.dataiku.com/watch/Vhv6UW6WR9YmmRBktQdfUB?)

## スキルアップは好循環
これまで見てきたように、企業はデータやAIへの取り組みを特定の事業部門やチームに限定したいとは考えていません。導入と規模の拡大に伴い、AIを開発、本番展開、管理するデータ専門家とそのチームに新たなプレーヤーが加わり続けています。初期のAIプロジェクトが成功するにつれ、プロジェクトの可視化や、重要な段階でのレビューとサインオフを求めるビジネス・ステークホルダーの関与も増えています。私たちは、データとAIの民主化と、ドメイン・エキスパートとデータ・エキスパートのコラボレーションを可能にするプロジェクトを目撃し続けることになります。

AIのスキルアップはAIの人材確保に基本的に不可欠であるため、組織はAIに関する正式な能動的継続学習を従業員教育プログラムに組み込むことに多大な関心を払う必要があります。

さらに、AI、データサイエンス、MLが企業全体の戦略にどう適合しているかを社員に理解させることは、その概念やテクノロジーそのものを教育するのと同じくらい重要なことです。そのため、価値を明確に伝えることで、既存の従業員は、アップスキルがどう組み合わされているかをより簡単に理解できるようになります。さらに、アップスキリングプログラムがうまく機能すれば、ドメインの専門家（ビジネスアナリストなど）がスキルを習得し、価値を生み出すという好循環が生まれ、ひいては、AIの価値に対する認識が高まり、新たなユーザーが発掘されたり、スキルアップに手を挙げたりするようにります。

## AI人材育成とスキルアップについて
ユニコーン・チームを作る準備はできていますか？この電子書籍では、ドメインとデータの両方の専門家からなるチームを構築し、組織のAI成熟度と運用モデルを長期的に進化させる方法について[**こちらのEBOOK**](https://pages.dataiku.com/ja/battle-data-ai-talent-jp)で解説しています。

原文：*[Bring Domain and Data Experts Together to Spur Upskilling](https://blog.dataiku.com/bring-domain-and-data-experts-together-upskilling)*
ListView(LVS_REPORT/詳細),DataGrid(WPF)等に疑似プログレスバーを入れる

オーナードロー、カスタムドローは難しい上に面倒。。。
真っ当にプログレスバーコントロールを入れるのは大変なので、■ を文字として並べて疑似プログレスバーにしてごまかしちゃう技(?)
### WinForms + DataGridViewの例
![B.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821882/b72d35bc-7ec2-7be9-e118-d9f4d2e3e51f.jpeg)
PUTとPATCHの違い

勉強の過程としてPUTとPATCHの違いを整理しました。
# PUT
更新したいリソースのURIを指定し、その内容を**上書き**するもの。
対象のリソースが存在しない場合は、POSTと同様にリソースの生成を行う。
# PATCH
更新したいリソースのURIを指定し、その内容の**一部を更新**するもの。
データ量が多くPUTでの上書きが適さない場合などにPATCHであればデータ量を抑え効率的に更新を行うことが出来る。
# HTTPメソッドにおける冪等性
### 冪等性とは
冪等性とは「同じ操作を何度繰り返しても、同じ結果が得られる性質」のこと。
※参考
https://qiita.com/suin/items/316cb8aaf8dfcf11abae
### 冪等性のあるHTTPメソッド
GET, PUT, PATCH, DELETE
### 冪等性のないHTTPメソッド
POST
### HTTPメソッドにおける冪等性
HTTPメソッドにおいて、冪等性は「レスポンスが同じ結果になる」ことではなく「リソースに変化がない」ことを指す。

DELETEメソッドを2度実行し、1度目はDELETEのレスポンスとしてステータスコード"200"が返ってくるが、2度目は対象のリソースがないため"404"が返ってきた場合を例にとる。
レスポンスとしては１度目は成功、2度目はエラーとなるため、違う結果が得られていないように見受けられるが、データベース上は1度目も2度目も"対象のリソースが消えている"という同じ結果になる。
DeepLを使って、R内の日本語データを英語に翻訳する

# 問題
- 日本語の列名などを高性能な翻訳ツールで一瞬で英語に変更したい。
    - Google Formで日本語でアンケートを行った場合など
    
# 解決策
- DeepLに翻訳をしてもらう。

# 必要な準備
## DeepL APIの取得
RでDeepLを使うには、APIの取得が必要です。無料と有料のアカウントがあり、無料だと、1か月に50万字までの翻訳が無料です。50万字ってどれくらいか調べたところ、200ページの文庫本で12万字のようなので、質問項目や、列名くらいであれば余裕ですね。
- API取得はこちらから（ https://www.deepl.com/ja/pro/change-plan#developer ）。

アカウントでは、下記画像のように使用状況を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/ddcd82cd-5658-e394-a903-9b040b97773f.png)

## 分析コード
- 基盤となるのは以下のコードです。「この中にあなたのAPI認証キーを貼り付ける」の箇所には、「アカウント情報」の下にある「DeepL APIで使用する認証キー」で示されている、認証キーを貼り付けてください。

```R
api_key <- "この中にあなたのAPI認証キーを貼り付ける"

# 翻訳したいテキスト
text_to_translate <- "英語に翻訳したい日本語をいれる"

# DeepL APIにリクエストを送信
response <- POST(
  url = "https://api-free.deepl.com/v2/translate",
  query = list(
    auth_key = api_key,
    text = text_to_translate,
    source_lang = "JA",  # 翻訳元言語を指定 (日本語)
    target_lang = "EN"  # 翻訳先言語を指定 (英語)
  )
)

```
API認証キーの取得や、Rでの細かい指定の詳しい解説はこちらにありました（ [1](https://skume.net/entry/2021/06/13/235245) ）。例えば、言語の指定は以下のようです。

```
"DE" - ドイツ語
"EN" - 英語
"ES" - スペイン語
"FR" - フランス語
"IT" - イタリア語
"JA" - 日本語
"ZH" - 中国語
```

# 実際のやり方
## 翻訳したいものをDeepLに渡す
- 例えば、以下のようなデータ（```df```）があり、その列名をすべて英語に直したいとします。データがlong型とかwide型とかは置いておきます（笑）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/4746293c-1742-a5fa-13f1-766b5844542e.png)

```R
api_key <- "この中にあなたのAPI認証キーを貼り付ける"

# 翻訳したい列名を指定（リスト化を忘れないように）
text_to_translate <- list(colnames(df))

# DeepL APIにリクエストを送信
library(httr)

response <- POST(
  url = "https://api-free.deepl.com/v2/translate",
  query = list(
    auth_key = api_key,
    text = text_to_translate,
    source_lang = "JA",  # 翻訳元言語を指定 (日本語)
    target_lang = "EN"  # 翻訳先言語を指定 (英語)
  )
)

# レスポンスを取得
translated_text <- content(response, "text")
```

## JSON形式を変更
- 翻訳されたテキストは、JSON形式で返ってきているようなので、このままだと余計なタグがついています。これを外す処理をします。
```R
library(jsonlite)

parsed_translated_text <- fromJSON(translated_text)

# タグを外し文字ベクトルへ変換
cols_vector <- eval(parse(text = parsed_translated_text$translations$text))

# 列名を変換
colnames(df) <- cols_vector
```

## 結果
しっかり翻訳されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/f309425c-62fb-27d8-dd0f-b3fa9c10e83c.png)

もちろん、各データを翻訳することもできます。列名ではなく、データの1行目を指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/86f4426a-3bc5-3faa-e91c-a9f6d162bfdb.png)


# 最後に
一度の翻訳処理では50のテキストが上限のようなので注意してください（ [1](https://skume.net/entry/2021/06/13/235245) ）。

# 参考文献
( 1 ) [R言語で、現在最強の機械翻訳ツール「DeepL API」を使ってみた件](https://skume.net/entry/2021/06/13/235245)
cronで定期実行時に日付文字列を渡したい

cronを利用してpythonアプリを定期実行したい
定期実行する際に今日の日付をパラメータとして指定したい

と思い、調べてみました。

自分の備忘録として記しておきます。
各コマンドはcrontabへ設定する前にechoコマンドで実行を確認しています。

```Bash
echo `date +\%Y-\%m-\%d`
```

## 実行環境
OS: Raspbian GNU/Linux 11 (bullseye)

## 日付の取得
```Bash
date
# 2023年 9月 15日 金曜日 09:12:34
```

このままだと使えないのでフォーマットする必要がある

## 日付文字列をフォーマットする
```Bash
date +\%Y-\%m-\%d
#2023-09-15

# cronでは%をエスケープする必要があるためバックスラッシュをつける
```

時刻などもほしい場合
```Bash
date +\%Y-\%m-\%d--\%H:\%M:\%S
# 2023-09-15--09:12:34

# 日(%d)と時間(%H)の間にスペースいれるとエラーになるのでなにかしらの記号がいるっぽい
```

## 前日を指定したいとき
```Bash
date --date '1 day ago' +\%Y-\%m-\%d
# 2023-09-14

#2日前の場合
date --date '2 day ago' +\%Y-\%m-\%d
# 2023-09-13
```

## 次の日を指定したいとき
```Bash
date --date tommorow +\%y-\%m-\%d
# 2023-09-16

# または
date --date '1 day' +\%y-\%m-\%d
# 2023-09-16

# 「'2 day'」または「'1 day tomorrow'」とすると2日後となります
```

## 月単位での指定をしたいとき
```Bash
# 前月
date --date '1 month ago' +\%Y-\%m-\%d
# 2023-08-15

# 翌月
date --date '1 month' +\%Y-\%m-\%d
# 2023-10-15
```
## 年単位での指定をしたいとき
```Bash
# 昨年
date --date '1 year ago' +\%Y-\%m-\%d
# 2022-09-15

# 来年
date --date '1 year' +\%Y-\%m-\%d
# 2024-09-15
```

## さいごに
上記は自分用に調査して記していますが、他にも同じように困っている方の助けに少しでもなればと思ってます。
もし記載方法に誤りなどがあった場合はコメントいただければと思いますので、よろしくお願いいたします。
Linuxサーバー構築のポートフォリオ

# Ubuntu
- Ubuntuののインストール
  - ISOファイルのダウンロード
  - Rufusを使いIOSファイルをUSBに書き込み
  - BIOSで起動デスクの優先度をUSBに変更
  - ISOファイルのインストール 
  - Ubuntuの初期設定
  - CUI切替
  - 起動
  - 終了
# Lubuntu
- Lubuntuのインストール
  - ISOファイルのダウンロード
  - Rufusを使いIOSファイルをUSBに書き込み
  - BIOSで起動デスクの優先度をUSBに変更
  - ISOファイルのインストール 
  - Ubuntuの初期設定
  - CUI切替
  - 起動
  - 終了
# Ubuntu Server
- Ubuntu Serverのインストール
  - ISOファイルのダウンロード
  - Rufusを使いIOSファイルをUSBに書き込み
  - BIOSで起動デスクの優先度をUSBに変更
      - Let's Note CF-S10
  - ISOファイルのインストール 
  - Ubuntuの初期設定
  - 起動
  - 終了
- 初期設定
  - ユーザーを追加にする
  - rootユーザーを有効にする
  - ネットワークの設定
  - サービスの管理
  - システムを最新化する
  - Vimの設定
  - Sudoの設定
- NTPサーバー
  - NTPのサーバーの設定（NTPd）
- SSHサーバー
  - パスワード認証でのホストの設定
  - クライアントの設定
      - ThinkPad X10 tera term
      - Macbook 2016 ターミナル
      - Dynabook tera term
      - iphone12 a-shell
- Samba
    - フルアクセス共有フォルダのホストの設定
    - クライアントの設定
        - Windows10
        - macOS
        - iOS16.6.1
- Apach
    - Apach2インストール
    - バーチャルホスト設定
- htop
    - インストール
powerapps で距離計算方法

powerapps開発時、たまにアプリ上で距離計算の設計が出てきます。
忘れるので、メモーします。

# 1.bing maps basic keyを取得

・取得方法
https://www.xlsoft.com/jp/products/bing_maps/product-licensekey.html

・取得URL
https://www.bingmapsportal.com/Application#

# 2.powerapps bingmaps connector追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/32a112b0-f9d9-e182-9dd5-560cee589ba5.png)

# 3.button追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/a5c21bc6-f245-6514-bdfd-2c118ec6fd04.png)

Onselect:
```
Set(
    dist, 
    BingMaps.GetRouteV3(
        "Driving",
        "35.680798724134256, 139.76738237114552", 
        "35.665946731805526, 139.7708589538133"
    )
)   
```

# 4.変数内容確認
![截屏2023-09-15 10.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/bef901b2-b3e4-b9b3-c92d-d80d5deba99e.png)


# 参考サイト
https://learn.microsoft.com/ja-jp/connectors/bingmaps/

https://www.xlsoft.com/jp/products/bing_maps/product-licensekey.html

https://powerusers.microsoft.com/t5/Building-Power-Apps/Bing-Maps-Error-when-using-GetRouteV3/m-p/2277733
StreamlitでEDAライブラリを複数つなげてみた

## 要約
業務でEDAを利用するケースが多いのですが、jupyter実行して確認して、というのが煩わしいという声もあったので、ブラウザ上で複数確認できるようStreamlitを利用して作りました。
## 事前準備
必要なライブラリはpandas streamlit sweetviz pyGWalkerです。
pip install pandas streamlit sweetviz pygwalker をしてください。
## ソースコード
```python
import pandas as pd
import pygwalker as pyg
import streamlit as st
import streamlit.components.v1 as components
import sweetviz as sv
import os
import codecs
import getpass

st.set_page_config(layout="wide")

def load_data(uploaded_file):
    df = pd.read_csv(uploaded_file)
    return df

def st_display_sweetviz(report_html, height:int=1200):
    report_file = codecs.open(report_html, 'r', encoding='utf8')
    page = report_file.read()
    components.html(page, width=None, height=height, scrolling=True)

st.subheader("Data Analysis")
train_df = None
test_df = None
pyg_html = None

tab_titles = ["pyGWalker", "sweet_viz"]
tabs = st.tabs(tab_titles)
with st.sidebar:
    uploaded_files = st.file_uploader("Choose a CSV file")
    if uploaded_files is not None:
        train_df = load_data(uploaded_files)
    uploaded_compare = st.file_uploader("Choose a CSV file to compare(sweetviz only)")
    if uploaded_compare is not None:
        test_df = load_data(uploaded_compare)

with tabs[0]:
    try:
        if train_df is not None:
            pyg_html = pyg.walk(train_df, return_html=True)
            components.html(pyg_html, height=1200, scrolling=True)
    except Exception as e:
        st.write(e)

with tabs[1]:
    try:
        usrname = getpass.getuser()
        target_path = os.path.join(".", usrname)
        sv.config_parser.read_string("[General]\nuse_cjk_font=1")

        # 1つのCSV(train)データのみの場合
        if train_df is not None and test_df is None:
            out_file = os.path.join(target_path, "SWEETVIZ_REPORT.html")
            if not os.path.exists(target_path):
                os.makedirs(target_path)
            analysis = sv.analyze(train_df)
            analysis.show_html(filepath=out_file, open_browser=False, layout='vertical', scale=1.0)
            st.display_sweetviz(out_file)
        # 2つのCSV(ex. trainとtest、二値分類を分けた結果)の場合
        elif (train_df is not None) and (test_df is not None):
            out_file = os.path.join(target_path, "SWEETVIZ_REPORT_COMPARE.html")
            if not os.path.exists(target_path):
                os.makedirs(target_path)
            analysis_com = sv.compare([train_df, "train"], [test_df, "test"])
            analysis_com.show_html(filepath=out_file, open_browser=False, layout='vertical', scale=1.0)
            st_display_sweetviz(out_file)
    except Exception as e:
        st.write(e)

```
## 実行
Python ファイルを以下のように実行してください。
streamlit run ファイル名.py

## 補足
* 動かすとサイドバーに2種類のファイルアップローダー画面があります。
上がいわゆるEDAしたいメインファイルやtrainデータです。
* もし2つのファイルを比較したい場合は下のアップローダにもファイルをアップロードしてください。
sweetviz側で2つのファイルを比較した結果を出力します。

* EDAはタブで切り替えられます。
sweetvizのほうが読み込みに時間がかかるので、まずはpyGWalkerを表示させるようにしました。
* 実行結果
    *  pygwalker: UI上にExportボタンがあります。
    *　sweetviz: ファイル保存場所にユーザー名のフォルダを自動生成し、その中にhtmlを生成します。

* 最低限の機能しか入れてないため、ここから拡張する前提のソースコードです。
GPUの性能が上がりすぎて実験用プログラムが実用十分な性能になってしまった

# はじめに
　まずは動くものを観察してもらうのが早いかと。

> https://rubiks-cube.oboe-cor-anglais.net/
> ID:QiitaGuest
> Pass:QiitaCube

※動かしてるのが私の私物PCな都合で、繋がったり繋がらなかったり、動いたり動かなかったりします。目に留まったときにメンテします。
※誰かがプログラム的に大量リクエストを送ってきたりしたら閉じます。

# GPGPUでルービックキューブの最短解探索
　ルービックキューブの最短解探索は単純で、IDA＊アルゴリズムを実装すればOKです。ただし、単純すぎる全探索では探索しきれない物量があるので、いわゆる枝刈り用の距離関数を実装する必要があります。この枝刈り用の関数はルービックキューブの部分的な答えにたどり着くための辞書で、ルービックキューブの状態をできるだけたくさん表現できると高い性能が出ます。極論を言えば、ルービックキューブの全ての状態に対して、解までの手数を全て網羅できるならばそれで良いのです。ただ、実際は記憶しておく領域が足りないので、全網羅は妥協して、足りない分はIDA＊アルゴリズムに手伝ってもらうわけです。
　距離関数の網羅性は、単に領域をたくさん使う方法と、数学的に広げる方法の2通りの方向性があります。例えば、左右の対称性を利用すれば、実際に使うメモリ量は表現できる量の半分で、残りは計算しましょう、とかできるわけです。
　ところで、GPGPUでこの探索が早くなるのかどうか、という検証をしたいとき、邪魔な要素があります。この数学的な対称性を実装すると、必然的にメモリを参照する回数が増えてしまい、GPUが得意ではない問題に寄ってしまうのです。CPU実行をGPU実行に載せ替えたときに、対称性を考慮しないパターンでどのくらい早くなるのかは確認しておきたいものです。
　私はこれを学士論文のテーマとして、[2013年](https://github.com/h-hayakawa/bachelor-thesis)に発表しました。メモリを3GBくらい使う実装で、CPU1個（4core）に対して、GPUが5倍くらい仕事をしてくれる、という実験結果を華やかに発表したのです。
　しかしながら、このときに作成したソルバーは実用的な性能ではありませんでした。ランダムなキューブに対して、平均35秒ほどの実行時間を要したのです。この当時、数学的な対称性を考慮して距離関数の性能を高めたソルバーでは、ランダムなキューブは3秒ほどで解けていたのです([God's Number is 20](http://cube20.org/))。
　では、同じ距離関数を用いたプログラムがGPGPUで早くなるかと言えば、xyzのそれぞれの軸で対象な8分類で試したところ、うまくいかなかったのです。この事実は当時の成果としてはおもしろくなかったのでそっ閉じして卒業しました。

# GPU性能の強烈な進化
　ここ10年の間で、最近のAIやら何やらの流行りで、GPGPUの性能が信じられないくらい伸びました。私が学生時代に作ったプログラムも微調整で動かすことができ、かつ、GPU使用率が100%に張り付くので、個人用のベンチマーク的に使っており、新しいGPUを購入する度に遊んでました。
　今回はRTX 4090を試したのですが、なんとランダムキューブが平均1秒を切ったではありませんか。20手かかる有名なSuperFlipも25秒で解けてしまいます。CPUはRyzen 3950xの16コアCPUを使っているのですが、16コアCPUの20倍以上の性能になったのです。
　10年前の実験では、CPUの5倍くらいで喜んでたのですが、CPUの20倍の性能になってしまいました（100万円とかする一部の愛好家向けのCPUには触れないでください）。
　私は、個人的にはCPUもGPUも似たような感じで性能が伸びてゆくと想像していたのですが、GPUの性能向上は想像を超えてきました。

# GUIとの結合
　ルービックキューブは「解を求める問題」と「UIをつくる問題」がかけ離れており、かつ、両方とも簡単な課題ではないので、ソルバーだけだったり、UIだけ、という作品がインターネット上にたくさん転がっています。また、ソルバーとUIを作っても、それぞれの実装の内部構造をうまく受け渡す仕組みがないと繋げることができません。
　私も過去にルービックキューブのGUIを作りましたが、ソルバーと繋げる作業は最近やりました。大学生のときにソルバーを作ったわけですが、やはり両者を結合するのはそこそこ大変なのがわかっていたのでサボっていたのです。
　では、なぜ今更ソルバーとUIを結合したのかと言えば、ソルバーの性能が面白いことになってきたのでUIを付けたくなったのです。いままではCUIで「解けたよ」と文字列が出てくるだけだったものが、GUIとして目の前で動いたときは感動しました。

# ソースコード
　GUIは最近の作品ですが、ソルバーは学部生の頃に作ったものに手を入れただけなので、作り直したいところではあるのですが、そんな時間はありません。
[UI](https://github.com/h-hayakawa/javascript-rubiks-cube)
[ソルバー](https://github.com/h-hayakawa/rubiks_cube)
※UIとソルバーが合体してるコードは公開していません。
Javaで「絶対値を取得する」の動作を確認してみた

# 概要

Javaで「絶対値を取得する」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/math/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String[] args){
    int i1 = 24;
    int i2 = -18;
    System.out.println(i1 + " -> " + Math.abs(i1));
    System.out.println(i2 + " -> " + Math.abs(i2));

    double d1 = 14.53;
    double d2 = -7.224;
    System.out.println(d1 + " -> " + Math.abs(d1));
    System.out.println(d2 + " -> " + Math.abs(d2));
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
24 -> 24
-18 -> 18
14.53 -> 14.53
-7.224 -> 7.224
```

# まとめ
何かの役に立てばと。
NTP ST1構成

NTPD GPS ST1はPPSを割り込みで拾っている場合、他の割り込みが極力少なくなるのが理想と思われます。

このため一般のネットワークトラフィックが流れないように以下のような構成を考えました。

![NTP_ST1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/021f33ee-2221-de0e-24fb-72b27f159199.png)

ST2はVLANでST1と普通のネットワークを分離します。

VLANの設定は以下のように設定します。

```
# ifconfig -a
rt0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=b<RXCSUM,TXCSUM,VLAN_MTU>
        ether c4:71:30:12:34:56
        hwaddr 00:18:e7:d5:83:90
        media: Ethernet 100baseTX <full-duplex>
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
vlan1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether c4:71:30:12:34:56
        inet 10.0.1.18 netmask 0xffffff00 broadcast 10.0.1.255
        media: Ethernet 100baseTX <full-duplex>
        status: active
        vlan: 1 vlanpcp: 0 parent interface: rt0
        groups: vlan
vlan2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether c4:71:30:12:34:56
        inet 10.10.10.18 netmask 0xffffff00 broadcast 10.10.10.255
        media: Ethernet 100baseTX <full-duplex>
        status: active
        vlan: 2 vlanpcp: 0 parent interface: rt0
        groups: vlan
# etherswitchcfg -v
etherswitch0: Ralink ESW with 7 ports and 16 VLAN groups
etherswitch0: VLAN capabilities=4<DOT1Q>
etherswitch0: VLAN mode: DOT1Q
port0:
        pvid: 1
        flags=2<STRIPTAG>
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: no carrier
port1:
        pvid: 1
        flags=2<STRIPTAG>
        media: Ethernet autoselect (none)
        status: no carrier
port2:
        pvid: 2
        flags=2<STRIPTAG>
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
port3:
        pvid: 1
        flags=2<STRIPTAG>
        media: Ethernet autoselect (none)
        status: no carrier
port4:
        pvid: 1
        flags=2<STRIPTAG>
        media: Ethernet autoselect (none)
        status: no carrier
port5:
        pvid: 1
        flags=2<STRIPTAG>
        media: <unknown type>
        status: no carrier
port6:
        pvid: 1
        flags=5<CPUPORT,ADDTAG>
        media: Ethernet 1000baseT <full-duplex>
        status: active
vlangroup0:
        vlan: 1
        members 0,1,3,4,5,6t
vlangroup1:
        vlan: 2
        members 2,6t
```

ST1は普通のswitchの設定で物理的接続はこれでいいです。

![NTP_ST1_PY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/2117b937-3633-410b-8589-d04b80a65180.png)

市販ルーターの「ネットワークサービス解析」機能を使っていたところ、ときどき大きくずれる事があって、オフにしたところ問題が起きなくなりました。この機能はホスト解析のために、いろいろパケットを送っていて、ネットワーク負荷による影響と考えました。
[API] Failed to create 0x88 image slot~

問題なく動作はしているようだが、エラーが発生。

```
Failed to create 0x88 image slot (alpha=1 wide=1) (client=0xe710c575) [0x5 (os/kern) failure]
````
[iPadOS: [API] Failed to create 0x88 image slot (alpha=1 wide=0) (client=0xfbe80e61) [0x5 (os/kern) failure]](https://developer.apple.com/forums/thread/733017)
↑ シミュレータではなかったのに実機にしたら発生したということだが、自分の場合はシミュレータ（iPad Pro(11-inch)(4th generation)）で発生している。
（ちなみに、シミュレータをiPhoneにしたら出なかった）

一行ずつデバッグしていくと、NavigationBarを非表示にするコードを変更したら、エラーが発生しなくなった。
```
// エラー発生する
// self.navigationController?.navigationBar.isHidden = true
// エラーしない
self.navigationController?.setNavigationBarHidden(true, animated: false)
```

ChatGptに聞いたら、以下の回答。

> Failed to create 0x88 image slot のエラーは、ナビゲーションバーの非表示設定と直接の関係はないエラーですが、いくつかの要因によって発生することがあります。このエラーメッセージは、iOSやXcodeの内部で発生し、一般的にはアプリケーションコードに由来するものではありません。

自分の場合はエラーが消えたので、試してみても良いかもしれません:sweat_smile:
【生成AIアプリのためのベクトル検索】 ⑦ ユースケース: セマンティック検索とチャット

# はじめに

## 背景 〜 ベクトルデータベースとしてのApache CassandraとDataStax Astra DB

2022年からの生成AIの隆盛に対して、[Apache Cassandra](https://cassandra.apache.org/_/index.html)に対して、[DataStax](https://www.datastax.com/jp)エンジニアにより[ベクトル検索機能の拡張提案](https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-30%3A+Approximate+Nearest+Neighbor%28ANN%29+Vector+Search+via+Storage-Attached+Indexes)が提案され、DataStax社のCassandraマネージドサービスである[Astra DB](https://www.datastax.com/lp/astra-registration)で利用可能になっています。
本記事シリーズは、このような動向の一環として同社から発表されたホワイトペーパーの内容に基づきます。

## 出典と日本語版

このシリーズ記事の原典は、以下で入手可能です。

https://www.datastax.com/resources/whitepaper/vector-search-for-generative-ai-apps

ブログ記事では、忠実な訳出ではなく、読みやすさを重視して、一部省略しています。
省略のない日本語版のホワイトペーパーの入手を希望される方はinfo-jp@datastax.comまでご連絡いただければ、提供させていただきます。

# 【生成AIアプリのためのベクトル検索】ユースケース: セマンティック検索とチャット

## セマンティック検索
**セマンティック検索**は、しばしば「意味や理解を伴う検索」と説明されます。それは、単語や語句の一致を前提とする**語彙検索やキーワード検索とは対照的**です。

セマンティック検索の威力を伝える、簡単な例を示します。 「ウェブサイトのテーマ」、「ウェブサイトのテンプレート」、および「ウェブサイトのデザイン」というフレーズはすべて、ウェブサイトの視覚的なプレゼンテーション（見た目）を表現しています。ただし、従来の語彙検索で「テーマ」というキーワードを使って検索すると、特定の製品がそれらを「テンプレート」と呼んでいる場合、そうした情報は検索結果として返されません。あるいは、画像の検索にセマンティック検索を用いると、「ハヤブサ」と「タカ」が、ベクトル空間の近接した位置に配置された結果、お互いに検索が可能とすることができます。

### セマンティック検索適応例

セマンティック検索で解決できる問題の種類は数多くあります。いくつかの例を次に示します。
#### 検索エンジン
セマンティック検索の技術を用いて構築された検索エンジンは非常に強力かつ高速なものになります。

この場合、単純にベクトル検索を実行して、検索結果の上位N件のデータを返します。ここで、N は返したいドキュメントの数です。あるベクトルに類似したベクトルの検索には、通常、近似最近傍（ANN）検索が用いられます。

ここで、より意義深い結果をユーザーに提示するために、利用可能な他のデータに基づいて検索結果を再ランク付けすることも考えられます。例えば、ドキュメントへのトラフィック、クリックスルー率、その他の指標を用いることが考えられます。


#### ドキュメントの要約と情報抽出
ベクトル検索で見つかったドキュメントをLLMを用いて要約したり、特定の情報を抽出した上で、ユーザーに提示することができます。

### レコメンデーション
レコメンデーションシステムは、パーソナライゼーションのための強力なツールです。ユーザー毎に、そのユーザーが興味を持ちそうなコンテンツを確実に提示することで、システムによる顧客エンゲージメントの向上を実現することができます。生成AI本来のパワーと、プロプライエタリデータとの組み合わせにより、レコメンデーションシステムはさらに強力かつ広範囲をカバーするものになります。

## チャット
生成AIによって、チャット（や、それを用いたカスタマーサポートアプリ）を拡張することができます。これによって、ユーザーの質問に対してあたかも人間が行っているかのような応答を行うことが可能になります。これによく似たアプリの例として、バーチャル家庭教師やパーソナルアシスタントなどがあります。

 重要なのは、同様のアプローチを使用して、幅広い付加機能を提供できるということです。例えば、クエリ、またはダイアログでの会話のやりとりの中で明らかになった、ユーザーの嗜好性に基づく推薦を行うことが考えられます。たとえば、高齢の肉親のために最適な老人ホームを探そうとしているユーザーは、様々な要件や制約を持つことでしょう。アプリを適切なエンベディングデータで拡張することによって、RAGベースのエクスペリエンスによって、可能な候補の中からさらなる絞り込みを行った上で、ユーザーにリストを提供することができれば、ユーザーは選りすぐられたリストから検討を始めることができます。

様々な場面で、このような体験を実現することは容易です。なぜなら、生成AIモデルは、従来のチャットやカスタマー サポートシステムとは異なり、事前定義された回答や構造化データベースに依存することがなく、質問のコンテキストとセマンティクスを理解した上で、あたかも人間のような応答をリアルタイムで生成できるからです。

このパラダイムをさらに一歩進めて、応答の履歴をエンベディングデータに変換した上で、将来の使用のために保存しておくことが考えられます。この追加機能は、RAGアプリケーションのためのデータプラットフォームを拡張して容易に実現可能です。この拡張は、単純なチャットボット履歴の保存と比べて、はるかに強力です。なぜなら、すべての顧客とのやり取りの記録が、将来の会話のコンテキストで参照できるようになるからです。
Diagnostics, Automotive, Vehicle SAE

SAEは、北米の自動車関連標準化団体です。

規格番号の付け方、表示の仕方が独特で、文書番号だけではなにがなにかわからない。
ISOとのリエゾンの詳細がどこにあるかまだみつけれていない。

Dignosticsの国際規格では、SAEの規格をNormative Referenceしたり、
資料の中に記述している。

今回は、Youtubeの動画を見ることにより、SEAの理解を深めたい。

https://www.youtube.com/watch?v=-uWMZ7UqxO4

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

https://www.youtube.com/watch?v=2rtF0LdeYcI

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

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

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

Energy & Mobility: Technology, Systems, Value Chain Conference & Expo
https://www.youtube.com/watch?v=fh885DvzkI4

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

https://www.youtube.com/watch?v=bYSmT6ks-2U

Jan. 2023: Meet Contributors of the S-18 Committee, feat. Andy Wallington, Bob Voros & Corey Laflin
https://www.youtube.com/watch?v=1O1L_ArR5n0

https://www.youtube.com/watch?v=d-Bpm7Aq7yw

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

SAE / OAI Aircraft Electrification & Alternative Fuels Webinar, November 2022
https://www.youtube.com/watch?v=foA8PLbj6hM

https://www.youtube.com/watch?v=3I3r3Z8n8L4


https://www.youtube.com/watch?v=L-GNyuy1Fuk

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

https://www.youtube.com/watch?v=5V4NlvVnrwY

https://www.youtube.com/watch?v=wxxaZDbd4-M

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

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

https://www.youtube.com/watch?v=6IY-GXDyJtw

# 文書履歴(document history)
ver. 0.01 初稿 20230915
### 最後までおよみいただきありがとうございました。

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

Please press the like icon 💚　and follow me for your happy life.