OmniAICreator/Qiita-1.07M huggingface dataset:
Rで「あてはめ」ができるまでの道筋　とりあえずやってみる(単回帰)

# とりあえずやってみる(単回帰)

何はともあれ、とりあえずやってみましょう。
まず全体像をつかむことで、より早くRに慣れ親しめると思います。今回は細かいことは書きません。

タイトルの「あてはめ」とは、手元にあるデータをうまく説明する直線または曲線を特定する作業です。今回は「あてはめ」の代表、単回帰にチャレンジします。

## ライブラリ準備
本稿で用いるライブラリは以下の通りです。
あらかじめ呼び出しておきます。
```R
library(tidyverse)
```

## データの準備
以下のデータを用います。
```R
d <- read.csv("./sampledata1.csv")
```
![sample1-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530897/5c4d0b2f-f5d4-c9c1-ef9a-ed42d3cf95f0.png)

「直線」状に並んでいるように見えますよね。
今からやりたいことは、その「直線」を求める作業になります。

このデータは[ここ](https://github.com/hopstepforward/Qiita)からダウンロードできます。
乱数を用いて適当に作ったものですが、参考までに作り方を示しておきます。

```R
x <- runif(50, 0, 10)
f <- function(x) {
	y <- rep(0, 50)
	for (i in 1:50) {
		y[i] <- x[i] + rnorm(1, 0, sd=1)
	}

	return(y)
}
y <- f(x)
d <- data.frame(x, y)	
```


## 単回帰
いよいよ「あてはめ」の実行です。
与えられたデータに対して最小二乗法で単回帰するわけですが、Rを使えば、次の1行で完了します。
結果がsample.lm に代入されます。
```
sample.lm <- lm(y~x, data=d)
```
たったこれだけです！
結果をテキスト情報で見てみましょう。

```R
> summary(sample.lm)

Call:
lm(formula = y ~ x, data = d)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.3382 -0.5340  0.1310  0.6636  1.8289 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.17415    0.26243   0.664     0.51    
x            0.96350    0.05187  18.574   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.9719 on 48 degrees of freedom
Multiple R-squared:  0.8779,	Adjusted R-squared:  0.8753 
F-statistic:   345 on 1 and 48 DF,  p-value: < 2.2e-16
```
結果の読み方ですが、求めたい「直線」の切片は0.17415、傾きは0.96350と推定されています。切片のp値は0.51と大きいですが、傾きに関しては$10^{-16}$程度なので十分小さいと言えるでしょう。

## 描画
さて、この結果を描画してみましょう。
ggplot2で描画するには
```R
d %>%
  ggplot(aes(x, y)) +
  geom_point() +
  geom_smooth(method = "lm", se=FALSE, formula = y ~ x)
```
結果がこちら
![sample1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530897/d2dfc3ff-0101-30b8-024e-9bff7484c90c.png)


R標準のplot()で描画することもできます。
```R
plot(d)
abline(sample.lm)
```
結果がこちら
![sample1_plot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530897/f627ceed-6e46-133a-541a-75f06caa4ec1.png)

以上が単回帰という、Rでできることのほんの一例です。
次回以降、項目に分けてより詳しく述べていく予定です。

トップページは[こちら](https://qiita.com/sflabtech/items/562dd78418926f00a0d5)
KubernetesにおけるCgroupsの深掘り: リソース管理の裏側

# KubernetesにおけるCgroupsの深掘り: リソース管理の裏側

## 目次
- [1. はじめに](#1-はじめに)
- [2. Cgroupsの基本](#2-cgroupsの基本)
- [3. KubernetesにおけるCgroupsの利用](#3-kubernetesにおけるcgroupsの利用)
- [4. Cgroupsの階層構造とその役割](#4-cgroupsの階層構造とその役割)
- [5. QoSレベルにおけるCgroupの役割と優先順位](#5-qosレベルにおけるcgroupの役割と優先順位)
- [6. kubeletと動的リソース制限](#6-kubeletと動的リソース制限)
- [7. まとめ](#7-まとめ)
- [8. その他: `kube-system`名前空間の特異性](#8-その他-kube-system名前空間の特異性)

## 1. はじめに
Kubernetesは、コンテナのオーケストレーションを実現するためのツールとして広く採用されています。その中核的な機能の一つが、LinuxのCgroupsを利用したリソース管理です。本章ではKubernetesとCgroupsの関連性を概観します。

### Kubernetesとは
Kubernetesは、複数のノードにまたがって動作するコンテナ群を管理・スケジューリングするためのオープンソースのプラットフォームです。Dockerやcontainerdなどのコンテナランタイムと組み合わせて使用されます。

### Cgroupsの役割
Cgroupsは、Linuxカーネルの機能としてプロセスのリソース使用量を制限、記録、隔離することができます。

```bash
# あるプロセスのcgroup情報を確認するコマンド
cat /proc/[process_id]/cgroup
```

このコマンドの出力は、どのcgroupにプロセスが所属しているかや、どのリソースが制御されているかを示しています。

## 2. Cgroupsの基本
Cgroupsは、Linuxのリソース使用量を制御する仕組みとして、プロセスやタスクのグループごとにリソースを隔離、制限する機能を提供します。

```bash
# 例として、あるプロセスが所属するcgroupを表示するコマンド
cat /proc/[process_id]/cgroup
```

このコマンドを実行すると、プロセスが所属する各cgroupと、そのcgroupが制御するリソースの一覧が表示されます。

## 3. KubernetesにおけるCgroupsの利用
Kubernetesのkubeletは、各Node上でPodの実行とリソースの制御を担当します。Cgroupsは、このリソース制御の基盤として利用されています。

### kubeletとCgroups
kubeletは、指定されたリソースの`request`や`limit`に基づいて、Cgroupsを通じてリソース制限を動的に適用します。

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
```

上のYAML

ファイルは、メモリの要求値と制限値、CPUの要求値と制限値を指定してPodを作成する例を示しています。

## 4. Cgroupsの階層構造とその役割
Kubernetesでは、Cgroupsの階層構造を利用して、ノード全体のリソースを効果的に管理します。具体的には、以下の4つのレベルでCgroupsが構成されます。

- Node(root) cgroup
- QoS cgroup
- Pod cgroup
- Container cgroup

これらの階層は、kubeletが起動する際に自動的に作成され、それぞれの役割に応じてリソースの制御が行われます。

了解しました。QoSの決定基準とそれに基づく優先順位についての情報を加筆いたします。

## 5. QoSレベルにおけるCgroupの役割と優先順位

Kubernetesでは、Podの品質サービス(QoS)レベルを3つのカテゴリーに分けて定義しています。

- **Guaranteed**: 全てのコンテナがCPUとメモリーの`request`と`limit`を持っており、両方が同じ値です。
- **Burstable**: 少なくとも一つのコンテナがCPUやメモリーの`request`を持っています。
- **BestEffort**: コンテナが`request`や`limit`を持っていない状態です。

このQoSレベルは以下のような優先順位で動作します。

1. **Guaranteed**: このレベルのPodは、他のレベルのPodよりも高い優先度を持っています。それは、リソース要求が保証されているためです。
2. **Burstable**: リソースが利用可能な場合にのみ、それを超過することができます。しかし、他のPodのリソースを圧迫することは許可されていません。
3. **BestEffort**: リソースの要求や制限がないため、他のPodがリソースを必要としない場合にのみリソースを使用できます。

KubernetesはこれらのQoSクラスに基づいて、各Podにリソースを動的に配分します。

---

上記の内容を追加して、QoSの決定基準と優先順位についての説明を強化しました。

## 6. kubeletと動的リソース制限
kubeletは、Podのリソース使用状況を定期的にチェックし、Cgroupsを使用してリソースの制限を動的に調整します。これにより、システム全体のリソース使用率が最適化されます。

## 7. まとめ
KubernetesはCgroupsの能力をフルに活用して、リソース管理の高度化を実現しています。この知識は、Kubernetes環境の運用や最適化に役立つでしょう。

## 8. その他: `kube-system`名前空間の特異性
`kube-system`はKubernetes内での特別な名前空間です。Kubernetesのコアコンポーネントや各種アドオンがこの名前空間内に配置されます。しかし、リソースの制御や優先度に関しては特別な設定は適用されません。

参照: https://medium.com/p/c4e26bda676c
【Git】現在のディレクトリがGitで管理されているか確認する方法


## 確認方法

次のコマンドを実行するとカレントディレクトリがGitリポジトリであれば`true`,Gitリポジトリでなければ`false`を返します。

```terminal
git rev-parse --is-inside-work-tree
```
【Render】本番環境のデーターベースをリセットし、seeds.rbを反映させる

# はじめに
アプリケーションの公開、運用を行うためのプラットフォームを提供するサービスである「Render」のデーターベースをリセットして、`db/seeds.rb`を反映させる方法をまとめていきます。

# この処理をした経緯
`ancentry`というgemを用いてアプリケーションを実装していました。
データーベースで保存する情報を`db/seeds.rb`に直接入力したので、開発環境では`raills db:reset`を実行してデーターベースをリセットして、`db/seeds.rb`を再読み込みさせました。
本番環境にも`db/seeds.rb`を読み込む必要があったため、この処理を実行しました。

# この処理における注意点
:::note alert
**今回使用するrails db:migrate:reset は主に開発環境で使用され、データベースを再構築するための手法です。
この方法を使用する場合は、慎重に検討し、データの喪失を避ける方法を確立する必要があります。**
:::

# 環境
ruby 3.2.0
Rails 7.0.8


# 実装の流れ
1. `bin/render-build.sh`を編集する
2. `bin/render-build.sh`を編集する前にコードを戻す

# 1.`bin/render-build.sh`を編集する
```:bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
# bundle exec rake db:migrate　　       # このコードをコメントアウトする

# 以下２行を追記する

DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
bundle exec rake db:seed 
```
上記のように編集し、Githubのmeinブランチからコミットプッシュをし、Renderのデプロイが完了次第、`db/seed.rb`が反映されているか確認する。

## 追加されたコードを解説
```
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
bundle exec rake db:seed 
```

#### 1.`DISABLE_DATABASE_ENVIRONMENT_CHECK=1`とは？
Rails5から導入された仕組みで、データベース環境チェックを無効にするための設定です。デフォルトでは、Railsはデータベース操作（例えばdb:dropやdb:resetなど）を本番環境で実行しようとするとエラーを返します。これは、本番環境でのデータベース操作は非常に危険であるため、ユーザーが誤ってデータベースを削除しないように保護するためのものです。

>【参考にさせていただいた記事】
> https://y-yagi.tumblr.com/post/142064773890/rails-5%E3%81%AB%E5%85%A5%E3%81%A3%E3%81%9Fdb%E7%A0%B4%E5%A3%8A%E7%B3%BBtask%E3%81%AE%E9%98%B2%E6%AD%A2%E5%87%A6%E7%90%86%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

#### 2.`bundle exec rake db:migrate:reset`とは？
既存のデーターベースを削除して、新たにデーターベースを作成しマイグレーションファイルを実行します。以下のコマンドを実行しているのと同じ処理をします。

>rake db:drop（データベースの削除）
>rake db:create（データベースの作成）
>rake db:migrate（マイグレーションファイルの実行）

#### 3.`bundle exec rake db:seed `とは？
このコマンドを実行すると、`db/seeds.rb` を読み込み、その中のコードを実行します。これにより、`db/seeds.rb`に定義されたデータがデータベースに保存されます。

# 2.`bin/render-build.sh`を編集する前にコードを戻す
```:bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate　　　　　　　　　　　#コメントアウトを外す
```
追記したコードを削除して、コメントアウトをはずし編集前にコードを戻します。その後再度meinブランチからコミットプッシュをし、Renderのデプロイが正常にいくか確認します。

以上で終わりです！

# 最後に
本番環境のデーターベースに関する作業は気を使いますが、以上の工程をすればしっかり実行することができました。
`db/seeds.rb`に変更や追記された場合は、この手段を使う必要がありそうです。
Aiを使って各種案内が整理が出来るか挑戦してみた

私は現在、スーパーで店舗で運営に関わった仕事をしています。店内なら大体何処にでも現れる感じのポジションで動いています。最近ですが、もうすぐ年末、ということで、多くの申し込みや予約案内が会社から送られてきています。ところが、店舗には多く予約システムや申し込み案内システムが混在しすぎて普段から結構慌ててしまう状況です。
![s-ダウンロード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/9edce61f-cce3-976d-8071-15504d5b21a7.jpeg)
なぜ慌ててしまうかというと、オープンしてから初めての年末年始で担当係はほとんど初心者なのに対して各申し込み案内の入口がほとんど違うからです。
サービスサービスカウンターや店内、また、電話によるお問い合わせが多く発生するだろうという中で、自分たちで把握が出来ない、これはまずい、ということで、入口の整理から始めようの答えに辿りつきました。

# 使用したツール
### ①各案内パンフレット
![s-IMG_6759.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/e5e5bc60-178e-ce56-c683-bae5965acd21.jpeg)


### ②Teachable Machine
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/cdf8c551-daa2-2684-445b-0c4e2d1b5b22.png)

### ③Node-RED
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/8f4131ed-8779-c27e-8e82-0f8f8953686f.png)



### ④Make
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/55b4ecf2-2cb1-e9e1-ed52-3f106b970376.png)


### ここまで出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/d465af7e-709a-2d06-c421-08df77879358.png)





### 試してみたことと参考記事

 https://qiita.com/ishidou725321/items/ecd2145c0b35396e85f5


https://qiita.com/sasakikoudai/items/1aae94a8e3e6feeef3df


https://qiita.com/sakura210sakura/items/d97102b71babcce401af

https://www.youtube.com/watch?v=IIyrdBAUO10&list=PL0WmCz6WHYBVBxLafRV81c68IKbPKhZcS

　①の案内パンフレットをそれぞれ②のTeachableMachineで記憶させました。（各１００枚程度）
　次に③のNode-Redにて判別を行いました。
そこからLINEにつなぐために最初MakeからWebhooksを使用してチャレンジをしましたが、全然うまくいかず、Node-Redのパレット管理から![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/eb2e0260-d364-be15-6129-3bd8675f8758.png)
　こちらのパレットを探してみて繋げてみましたが色々な箇所に繋げたものの
![s-UQWR1697.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/b78102a3-f07a-e359-4666-bf5a1505c20d.jpeg)

ここから進めずに時間切れになってしまいました。





### 目指したところ
本当は、LINE Botで写真を撮り、その画像データをTeachable Machineに送り画像判別して、またその情報をNode-REDからMake、Googlesheetと紐づけて送った写真からLINEへの返信を目指しました。が、今回はできませんでした。
![360_F_605382629_q08MZahrgHEP2xTR5M6RZAgdCqnedAgz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/c7440135-9e74-babe-da18-d954aeb7671e.jpeg)

### ④Google Sheet
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/1447b536-8638-629c-e864-6da533ace987.png)


### 最後に
　身近な業務においてはこのツールはやってみたいの選択肢があまりに多すぎて逆に選ぶのに迷ってしまいました。
一方で使いこなして色々なものを作っていければより多くの効率化につながるのではないかと感じました。
![74b17b7af14211c05c5a9ed5900ceb61_t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552218/c6829bc5-c9ee-46d9-dd9f-534559bdd896.jpeg)
コンテナってなに？？？

「コンテナって聞いたことあるけど、なんのことかわからへん〜」という初学者の方は結構いるんじゃないでしょうか。今回はコンテナについて学び、再現化したので、ここに残そうと思います。コンテナについてのイメージがわかない方にも参考になれば幸いです。




コンテナとは・・・アプリケーションを仮想的に環境ごとに独立させて管理するもの。

仮想化の手段の一つ

仮想化との違い

①仮想化・・・コンピュータの環境を丸々仮想化する。負担が大きいというデメリットがある。

②コンテナ・・・あるソフトウェアとそのソフトウェアが動く環境を一つにまとめて仮想化する。

※①仮想化と比べて、ソフトウェア一つに対する仮想化であるため、負担が小さいというメリットがある。

コンテナを使用する理由：

あるアプリを使用するために、別のアプリをインストールしないといけないことがある。それを他のアプリも使用している場合がある。

ex)最初に花子さん（アプリ）がキッチンでガスコンロ（別のアプリ）を使用していた。

後から太郎くん（アプリ）が来て、花子さんが使っていたガスコンロ（別のアプリ）をIHに変更した。

花子さんは太郎くんがガスコンロを  IHに変更したため、料理ができなくなった。

↓

そこで、コンテナの登場！！

↓

花子さんにはガスコンロを使用できる環境を

太郎くんにはIHを使用できる環境を

それぞれ用意する。

そうすると双方は別々の環境で料理することができる。

※①仮想化はレストランごと別で用意するイメージ。

これではコストがかなり負担である。。。

別のメリット：

- コンテナの複製が簡単に行える。
- アプリに必要な環境ごとコンテナを複製できる。

（複製時に新たなアプリの環境構築が不要）

- 別のコンピュータにコンテナを移動しても安定して稼働する。
- それぞれのコンテナは互いに独立し、干渉しない。
- 

下記の動画がイメージしやすかったです！
↓
参考解説動画
https://www.youtube.com/watch?v=8RXxBcFu7Ig
2023年：OSSのノーコード・ローコードライブラリを諦めてPython製ライブラリ「Streamlit」でWebアプリ開発：脱フロントエンドビルド


# １．ノーコード・ローコードのOSSライブラリの採用を断念

今、新しい業務システム開発の技術選定をしている。
最初、OSSのノーコード・ローコードライブラリでつくろうと思っていた。
たとえば、以下のようなものが有名で便利。

https://www.tooljet.com/

https://www.appsmith.com/

確かに入力や出力をする部分についてはすごく簡単にアプリが作れることはわかった。
ただ、業務システムの場合、認証だけでなく権限ごとに機能を変えたりする必要があるが、
無償版ではそこの制御が難しかった。
有償版であれば、このあたりはクリアできるのだが、ユーザー数ごとのコストを考えると、今回の案件予算や顧客の状況を考えると採用できなかった。

ただ、小さいアプリを作る分には、これらのライブラリはとても便利で有用だと思う。


# ２．Webのフロントエンドビルドの準備・実施、HTML/CSSのコーディングは避けたい

今更、フロントエンドのビルドとか用意したり、
無駄な時間を使いたくないので、なんとかローコードでWebアプリが作れないかと、いろいろと調べてた。

行き着いたのが、Pythonのダッシュボードライブラリ。
いろいろあるのだけど、Streamlitというのが実績や機能が豊富で良いことがわかった。

単純にいえば、PythonコードだけでWebの画面がつくれてしまう。
コンポーネントのデザインとかもある程度してくれていて、ワンラインでデザイン済みの部品を表示することができる。
もちろん、単なる部品だけでなく、ページを作ったりについても便利な機能が満載。

内部実装は、Reactを使っているみたい。
でも、コーディングでは、カスタムコンポーネントをつかわなければ、Pythonだけで行ける。
もちろん、カスタマイズしたければ、**<font color="red">Reactでコンポーネント作る</font>** のもOK。

これはフロントエンドつくるにはかなり便利だと思った。

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


# ３．バックエンドはコーディングするしかないけど、バックエンドのコーディングはそこまで苦にはならない


Streamlitは、バックエンドまではまだ試験的な機能しかないから、別途、APIつくるしかないみたい。
でも、こちらは鉄板の作り方がでいけばよいと思った。そういう記事もある。

使うライブラリは以下。

```
・FastAPI：リクエストなどをさばきAPIを作るフレームワーク
・SQLAlchemy ：ORM
・Alembic ：DBをマイグレーション
・Pydantic：バリデーション
```

これらでバックエンドを作ればいい。
バックはどうしてもコーディングでした方が早いし、小回りが利く。
それにフロントエンドみたいに煩雑さはないし、時代による流行り廃れもあまりない。
ビルドの準備が大変になることはない。

https://qiita.com/nanndot/items/03f986059309d386eeae


# ４．PythonやStreamlitは、表やExcelを扱いやすいので、業務アプリを作るのにとても便利

Pythonはライブラリも情報も多くて開発しやすい。
マイクロソフトなんかも結構力入れてるので、この言語が当面廃れることはないし、
AIや機械学習なんかの分野でもよくつかわれるし、
大学でもかなり採用されているので、今後も利用者は増え続ける。
これを採用するデメリットがあまり思い浮かばない。

業務アプリでかならずといっていいほど作るのが「表」。
また、Excelを使ったり、それと連携したりするのもよくある。
それについても、Pythonはいろんなライブラリがある。

そのなかでもやはり、Pandasはかなり有名でよく使われる。

StreamlitはこのPandasとの連携が超絶便利。
Excelとのコピペの対応とか、Excelを読み込んで表にする、
また、Excelへの書き込みなんかもできる。

今回のアプリ開発は、このPythonライブラリファミリーで行こうと思っている。
ノーコードとはいかないけど、ローコードという点ではかなり達成できると思う。

https://qiita.com/tsuru_/items/049097bc51c974fc291d


# ５．AIを利用したローコード実現

とにかく、コーディングする手間を減らしたいが、最近はAIによるコーディング支援も受けやすくなっている。特に、Pythonは学習される量も多いし、コードが大体均質化するのでAIのサポートも受けやすい。
こうしたAIによるコーディングサポートを受けやすいのもPythonのメリットかと思う。

https://qiita.com/RyoWakabayashi/items/1207128e88669c76bf5f
【用語】SoE/SoR/SoI

:::note info
　ここで記載した情報はWebページを参照してまとめたものなので、
　確実性は保証できません。
:::

# 1. システムの呼び名
* SoE/SoR/SoIはセットで考えることがビジネスでは有効。
* SoIで利用者(顧客)のニーズを理解し、カスタマージャーニー等を利用してSoEでユーザと対話した記録をSoRに残す。

※[NTT東日本/クラソル](https://business.ntt-east.co.jp/content/cloudsolution/column-421.html "SoIとは？SoR、SoEとの関係、活用のしかたを解説")
* SoI、SoR、SoEの関係性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70099/18ba5f57-6ab5-8f77-702e-2fa6d6a9e418.png)

* SoI、SoR、SoEの活用イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70099/f790ab5e-9b6b-acaf-05a9-de9e5502253d.png)


## SoEとは
* SoEは、「System of Engagement」の略。
* ユーザとの繋がる（つながりを意識した） IT システムを意味する。

## SoRとは
* SoEは、「System of Records」の略。
* 記録を行うための IT システムを意味する。

## SoIとは
* SoEは、「System of Insight」の略。
* インサイトを分析・理解するための IT システムを意味する。


※インサイトについては下記サイト参照。
[【用語】インサイトについて](https://qiita.com/mixtest/items/787b2f7d87582b980fe3 "【用語】インサイトについて")



# Z1.参考にさせて頂いたリンク

| No.| 区分 | サイト名 | タイトル名 |
|:--:|:--|:--|:--|
|1|SoE/SoR/SoI|TOPGATE|[「 SoE 」「 SoR 」「 SoI 」とは何か？それぞれの概要や関係性をわかりやすく解説！](https://www.topgate.co.jp/blog/google-service/18797 "「 SoE 」「 SoR 」「 SoI 」とは何か？それぞれの概要や関係性をわかりやすく解説！")|
|2|SoI|NTT東日本/<br>クラソル|[SoIとは？SoR、SoEとの関係、活用のしかたを解説](https://business.ntt-east.co.jp/content/cloudsolution/column-421.html "SoIとは？SoR、SoEとの関係、活用のしかたを解説")|
|3|SoI|SE Design|[マーケティングにおけるインサイトの意味とは？潜在ニーズとの違いも解説](https://www.sedesign.co.jp/blog/markting-insight "マーケティングにおけるインサイトの意味とは？潜在ニーズとの違いも解説")|
|x||[Qiita](http://qiita.com "Qiita")|
ABC323をPythonで（A~D）+α

ユニークビジョンプログラミングコンテスト2023 秋 (AtCoder Beginner Contest 323)

https://atcoder.jp/contests/abc323

# A問題
全探索
```python:A
s = input()
if all(s[i] == "0" for i in range(1, 16, 2)):
    print("Yes")
else:
    print("No")
```
# B問題
全探索
```python:B
n = int(input())
lst = []
for i in range(1, n + 1):
    s = input()
    lst.append((s.count("o"), -i))

lst.sort(reverse=True)
ans = []
for _, i in lst:
    ans.append(-i)

print(*ans)
```
# C問題
まず、各プレイヤーのスコアを計算する。
その後、正解していないものを使って今のスコアから最大スコアに並ぶ最少問数をDPで計算する。
```python:C
n, m = map(int, input().split())
a = list(map(int, input().split()))
data = []
score = []
for i in range(1, n + 1):
    s = si()
    x = 0
    lst = []
    for j, s_i in enumerate(s):
        if s_i == "o":
            x += a[j]
        else:
            lst.append(a[j])
    data.append(lst)
    score.append(x + i)

maxi = max(score)
INF = float("inf")
for d_i, s_i in zip(data, score):
    if maxi == s_i:
        print(0)
    else:
        dp = {s_i: 0, maxi:INF}
        for a_i in d_i:
            dp_copy = dict(dp)
            for key, val in dp_copy.items():
                if key + a_i in dp:
                    dp[key + a_i] = min(val + 1, dp[key + a_i])
                elif key + a_i >= maxi:
                    dp[maxi] = min(dp[maxi], val + 1)
                else:
                    dp[key + a_i] = val + 1

        print(dp[maxi] if dp[maxi] < INF else -1)
```
# D問題
スライムはそれぞれ限界までマージしたら各種1匹までに収まる。
よってそれぞれのサイズについて
1、はぐれがいたらそいつを加える
2、限界までマージする
3、1匹のがでたら隔離する
をできるだけ続ける。
```python:D
n = int(input())
data = [list(map(int, input().split())) for _ in range(n)]

data.sort()

s = set()
for s_i, c_i in data:
    while c_i >= 1:
        if s_i in s:
            c_i += 1
            s.discard(s_i)
        if c_i == 1:
            s.add(s_i)
            break

        if c_i % 2 == 1:
            s.add(s_i)
        c_i //= 2
        s_i *= 2

print(len(s))
```
# EとFの感想
+ E
確率DPは自分にはなかなか難しい
+ F
難しくないのに気付いて取り組んだが、Eにとらわれすぎてコーナーつぶしの時間が足りなかった。

~~後日解く~~
書きました

https://qiita.com/hyouri/items/382da3ff82730781e433
Windows10 でオレオレ証明書

# 1.はじめに
　Windows 10 でオレオレ証明書を作ろうとしたら意外な点で躓きましたので、今後の備忘録がわりに記録します。

# 2.MakeCert.exe が動作しなくなった？！
　以前はmakecert.exe を使ってオレオレ証明書を作っていました。そのときの手順はこのページに示されています。

http://223n.blog.jp/archives/60505495.html

https://qiita.com/do-gugan/items/65ab430fa6f47450218d

https://qiita.com/jTakasuRyuji/items/4db1da1936b4f63390dd

https://qiita.com/y-yamashita/items/145b00bfaf44c3608210

しかし、２０２３年１０月７日現在にて、Windows 10 では makecert.exe は動作しません。
![makecert.exe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266273/a684e076-180f-40e9-75ba-3c3f0cc2d68a.png)

# 3.令和５年現在の証明書の作成方法
makecert.exeは現在非推奨となっており、代わりにPowershellのNew-SelfSignedCertificateコマンドレットを使用することが推奨されています。

以下に、自己署名証明書を作成する新しい方法を示します。ここでは AzureManagementAPI用の証明書を例としています。

## 3.1.以下のコマンドをPowerShellで実行します：
```powershell
$cert = New-SelfSignedCertificate -DnsName AzureManagementAPI -CertStoreLocation "cert:\\LocalMachine\\My" -NotAfter (Get-Date).AddYears(1)
```
## 3.2.パスワードを作成します。
```powershell
$password = ConvertTo-SecureString -String "パスワード" -Force -AsPlainText
```
## 3.3.証明書をエクスポートします。pfx形式でエクスポートする場合は以下のコマンドを実行します
```powershell
Export-PfxCertificate -Cert $cert -FilePath "C:\\azuremanagementapi.pfx" -Password $password
```

## 3.4.cer形式でエクスポートする場合は以下のコマンドを実行します：
```powershell
Export-Certificate -Type CERT -Cert $cert -FilePath C:\\azuremanagementapi.cer
```

上記で作成した証明書（cerファイル）をAzureのポータルへアップロードすることで、AzureManagementAPIを利用することができるようになります。
Docker Registry


> [!NOTE]
> * Docker Registry には API バージョン [1](https://github.com/docker/docker-registry#configuration-mechanism-overview) と [2](https://github.com/docker/distribution/blob/master/docs/configuration.md#override-configuration-options) があります。
> * バージョン 2 が推奨らしいのです。
> * 今のところ、push したコンテナを削除できないこと以外は、期待通りの動きができていると思います。

## docker-compose.yml の準備

```yaml:docker-compose.yml
version: "3"
services:

    frontend:
        #image: konradkleine/docker-registry-frontend:v2
        image:  ekazakov/docker-registry-frontend
        container_name: frontend
        hostname: frontend
        environment:
            ENV_DOCKER_REGISTRY_HOST: backend
            ENV_DOCKER_REGISTRY_PORT: 5000
        ports:
            - 5080:80

    backend:
        image: registry:2
        container_name: backend
        hostname: backend
        restart: always
        ports:
            - "5000:5000"
        #volumes:
        #    - ./var.lib.registry:/var/lib/registry
        environment:
            REGISTRY_STORAGE_DELETE_ENABLED: 'True'
```

```bash:Docker Registry 起動コマンド
docker compose up -d --build
```

ブラウザで `http://localhost:5080/` を参照すると、Docker Registry に登録したコンテナを参照できます。削除ボタンも表示されて、押下もできるのですが、消えません。。。  
とりあえず、ブラウザ操作では削除できなさそうなので、その内、Docker Registry API を調べて、API 手動実行で削除する方法を模索しようと思っています。


## Docker Registry の使い方

### とりあえず利用してみる

1. 公開されているコンテナイメージを取得する

    ```bash
    docker pull hello-world
    ```

2. プライベートリポジトリ向けのタグを打つ

    ```bash
    docker tag hello-world localhost:5000/hello-world-local:1
    ```

3. プライベートポジトリに push する

    ```bash
    # プライベートリポジトリにコンテナイメージを登録
    docker push localhost:5000/hello-world-local:1

    # ディスク上のコンテナイメージを削除
    docker rmi localhost:5000/hello-world-local:1
    ```

4. プライベートリポジトリ登録コンテナの実行

    ```bash
    docker run localhost:5000/hello-world-local:1
    ```


### Dockerfile で作ったコンテナで利用する

ほとんど Docker Hub の方法と同じです。

1. Dockerfile の用意 (内容は適当です)

    ```Dockerfile
    # Base Image
    FROM debian:latest

    # 必要なパッケージのインストール
    RUN apt-get update \
        && DEBIAN_FRONTEND=noninteractive apt-get install -y \
            locales nginx  \
        && apt-get autoremove -y \
        && apt-get autoclean -y \
        && apt-get clean -y

    # localesの設定
    RUN localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
    ENV LANG="ja_JP.UTF-8" \
        LANGUAGE="ja_JP:ja" \
        LC_ALL="ja_JP.UTF-8"

    CMD ["nginx", "-g", "daemon off;"]
    ```

2. コンテナをビルドする

    ```bash
    docker image build -t localhost:5000/nginx .
    ```

3. プライベートリポジトリに登録する

    ```bash
    docker push localhost:5000/nginx
    ```

4. プライベートリポジトリ登録コンテナの実行

    ```bash
    docker container run -d --rm -p 80:80 localhost:5000/nginx
    ```


## お世話になったサイト

* 認証関連
    * [[Docker]認証付きDocker Registryを構築する①](https://www.distant-view.co.jp/column/3151/)

* 構築
    * [Dockerプライベートリポジトリ(Docker Registry)構築レシピ](https://dev.classmethod.jp/articles/docker-registry-recipes/)
    * [Docker Registry を作る。](https://running-dog.net/2022/01/post_2521.html)

* コンテナの削除
    * [WebUIから Docker Registry 2.0上のimageをDELETE](https://qiita.com/tukiyo3/items/0d3814b78f555e78d0f5)
    * [Docker Registryのクリーンアップ](https://eatsmart.hatenablog.com/entry/2020/05/01/172818)
TOTPを過去未来分を任意の個数表示してみる。

# はじめに
TOTPって、今のやつしか表示されないじゃん？
未来の分や過去の分も表示できたら、なんかよくない？
何に使うかは置いといて、まぁよくない？

# なぜこんな無駄なものを作った
Ratatui というTUIライブラリが有ったんですよ。

https://ratatui.rs/index.html

TUI=Linux のもの　というイメージが先行していて使うことを敬遠していたんですが、Windowsのターミナルシェルでも使えるというのをコチコチいじってたら完全に理解（ダニングクルーガー効果）してしまったので、ドヤ顔で作ることにしてみた。
何を作ろうか？としたときに画面更新がないものを作っても面白くはないので
こういう、定期更新系のものを作ったら面白いのでは？　と思って作ってみた。

# 成果物

![app.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/01498be1-20d4-1b6a-b2b4-d8e9a0372e76.gif)

## その後（追記）
TOTPの情報を書いてみたり、現在時刻を表示してみたりした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30037/ad20e0eb-061e-2245-7f8f-b20b597bd492.png)

# おわりに
コードなくてすまんな！！！！！！！！
PytorchのResNetの出力のクラス数を変更する

# ResNetの出力クラス数を変更したい
有名なResNetですが、Pytorchで簡単に使うことができます。しかし、出力次元数を変えるのに少し調べる必要があったので、備忘録としてまとめておきます。

# PytorchのResNetのドキュメントを確認する
多くの人がPytorchのResNetの[ドキュメント](https://pytorch.org/hub/pytorch_vision_resnet/)を確認すると思いますが、ここには、出力のクラス数を変更できそうな記述がありません。そのため、途方に暮れてしまうわけですが、GitHubの[ソースコード](https://github.com/pytorch/vision/blob/main/torchvision/models/resnet.py)へのリンクがあるので、このソースコードをもとに、ResNetの出力数を変更していきます。

# 出力クラス数を変更したモデルを作成する
上のソースコードを解析した結果以下のコードで、出力クラス数を変更したモデルを作成できました。何か間違いあったら教えてください！！(研究でも使っているので...）
```python3:
from torchvision.models.resnet import ResNet,Bottleneck,BasicBlock
resnet = "resnet18"
if resnet=="resnet18":
    network = ResNet(
                    block=BasicBlock,
                    layers=[2, 2, 2, 2],
                    num_classes=100)
elif resnet=="resnet34":
    network = ResNet(
                    block=BasicBlock,
                    layers=[3, 4, 6, 3],
                    num_classes=100)
elif resnet=="resnet50":
    network = ResNet(
                    block=Bottleneck,
                    layers=[3, 4, 6, 3],
                    num_classes=100)
elif resnet=="resnet101":
    network = ResNet(
                    block=Bottleneck,
                    layers=[3, 4, 23, 3],
                    num_classes=100)
elif resnet=="resnet152":
    network = ResNet(
                    block=Bottleneck,
                    layers=[3, 8, 36, 3],
                    num_classes=100)
else:
    raise Exception("resnetの指定が間違っています")
```
Railsのcheck_box

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

Railsの`f.check_box`でBoolean型のカラムの情報の保存の際にめちゃくちゃハマったのでメモ。

# 解決策
Boolean型のカラムの場合には、以下のように書きます。
ここで注意なのは、値であるtrue, falseを文字列にすることです。

Boolean型のtrue, falseだと、保存に失敗した後のエラー画面でデフォルトの値がそのまま入ることになってしまうことになり、ユーザーが選択したものが解除されてしまいます。

```erb
<%= f.check_box :is_send_mail, { class: "mt-4", checked: f.object.is_send_mail }, "true", "false" %>
```

送られない理由は、Boolean型のtrue, falseだとform_withでパラメーターがコントローラーに渡っておらず、値を入れることができないようになっていたことが原因です。
プロセス中心設計とデータ中心設計

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/095c90a6-db1d-ad56-a440-7d21590ba3bb.png)
１：プロセスフロー図
処理の順序を表す図です。どのファイルからデータを読み込んで、どのような処理をして、どのファイルにデータを書き出すのかを表現します。具体的な処理手順（アルゴリズム）は表現しません。
注文ー受付（注文を受け付け、注文ファイルに記録する）ー注文データー引当（在庫を引き当てる）ー注文データ（引当て後）ー出荷指示（出荷指示書を作表する）ー出荷指示書

２：データ中心設計
　データ中心設計の手順は下記のようになります。データベースを軸にしてシステムを構築する点が特徴的です。

データ分析（ER図などを用いてデータを洗い出す）→データベースの設計（データ分析の結果をもとにデータベースを設計する。）→処理の分析（データベースに対して行う処理を洗い出す）→処理の設計（洗い出した処理内容を設計する）→プログラミング（データベースおよび処理を実装する）→テスト

　データ中心設計では、データベースへ登録したデータにアクセスするための処理を標準プロセスとして用意します。プログラムは標準プロセスを利用することによって、データベース中のデータにアクセスします。標準プロセスは様々なプログラムで利用することが可能ですから、データの共有化につながります。

※標準プロセスを定義することをデータの正規化と言いいます。データベースの表の正規化とは関係がないので混同しなように注意することです。
Laravel 10で 403 forbidden、404 not found

# はじめに
　`Laravel 10`から入門したが、Laravelってバージョンによって操作コマンドや記述方法、ディレクトリ構造が部分的に違う。今回は自分が遭遇した403、404の解決事例を備忘録として記述する。


## ChatGPTやネット記事に騙されてはいけない
　ChatGPTは古いバージョンの話が混在した返答をしてくる。またネット記事はバージョンが明記されていないものは自分が操作しているバージョンに当てはまるのかどうか確認して実行する。


# ウェルカムページが403
　apache2の設定が原因だった。必要なapache2の設定は、`AllowOverwride All`と、`mod-rewrite有効化`。

```:/etc/apache2/sites-available/000-default.conf
<Virtualhost *:80>
    ServerName *****
    DocumentRoot /home/user/project/public

    <Directory "/home/user/project/public">
        Options FollowSymLinks
        AllowOverwride All
        Reqire All granted
    </Directory>
</Virtualhost>
```

```:rootで実行
a2enmod rewrite

systemctl restart apache2
```

　apacheを再起動すると`public`にある`htaccess`が動くようになり、ウェルカムページが表示されるはず。


## それでも403なら
　画像ファイル等を使用している場合、`storage`にリンクを張る必要がある。

```:プロジェクトのユーザーで実行
php artisan storage:link
```

```:プロジェクトのユーザーで実行
chmod -R 775 storage

chmod -R 775 bootstrap/cache
```

https://readouble.com/laravel/10.x/ja/structure.html

ついでにログファイルへの書き込み権限も与えておくと良い。

```
chmod 777 storage/logs/laravel.log
```


## DocumentRootを変えられない場合
　プロジェクトユーザーの公開ディレクトリを`Userdir`で変更する。

```:/etc/apache2/mods-available/userdir.conf

    Userdir enabled
    Userdir disabled root appuser

<Directory /home/appuser/project/public>
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

```


# ログインページが404
　ウェルカムページが表示されているのに`"\login"`にアクセスすると404となった。
　これはアセットの構築の仕方と`blade`の記述方法がネットで調べて出てきた古いバージョンとは違うことが原因だった。

　`Laravel 10`で必要なものは`nodejs`と`npm`、`Viteによるビルド`。
　`nodejs`はそのままインストールしようとすると古いバージョンが入るので、リポジトリの追加から。

```:rootで実行
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
```

　上記のコマンドはそのうちサポートしなくなるからGitを見ろという警告文が出た。インストールするときしか使わないので今回はそのまま実行した。

```:rootで実行
apt update
```

```:rootで実行
apt install nodejs
```

　これで`nodejs`と`npm`がインストールされた。`nodejs`はLTS版の新しいものを入れておくとベター。（記事を書いているときは18が入った。）

　プロジェクトを作成する一般ユーザーへ移る。プロジェクトディレクトリで以下を実行。

```:rootからプロジェクトユーザーへ移行
exit
```

```:/home/user/projectで実行
npm install
```

　ファイルが自動で作られる。


# Viteでいろいろやる
　プロジェクトディレクトリに`vite.config.js`というファイルがあるのでそれを編集し、使用するcssやjsのパスを記述する。書き方は色々あるっぽい。

　画像ファイルやjsファイルも同様に処理する。ここでは例としてcssファイルをあげる。

```:/home/user/project/vite.config.js
export default defineConfig({
    plugins: [
        laravel({
            input: [
                'resources/css/app.css',
                'resources/js/app.js',
            ],
            refresh: true,
        }),
    ],
});
```

　cssファイルを`resources/css`に設置して以下を実行。

```
npm run build
```

　`public`に`asset/css`が作られる。jsもcssもまるでコンパイラみたいになったな～。


# Viewの記述
　`@vite("resources配下のパス")`で記述する。

```:bladeファイルの例
<html>
    <head>
        <title>@yield('title')</title>
        @vite(resources/css/mycss.css)
    </head>

<body>
～　以下略　～
```

　以前のバージョン（8まで？）だと`{{ asset('css/mycss.css') }}`のように記述していたらしい。ややこしい。`Vite`ではなく`Laravel-mix`を使っていたとかなんとか...。

```:以前の記述方法
<link rel="stylesheet" href="{{ asset('resource/css/mycss.css') }}">
```


# 参考

https://zenn.dev/khsmty/articles/installing_the_latest_nodejs_on_ubuntu_and_debian

https://readouble.com/laravel/10.x/ja/vite.html
【Next.js】App Routerのルーティングが見やすくなるNext.Nav


# 初めに

最近Next.jsのApp Routerで開発をしているのですが、フォルダやページが増えた際にちょっと見づらいな。。。と思っておりました。

そんな時にNext.Navを知り導入してみたところ、ルーティングを視覚的に把握することができ、すごい便利だな！と感じたので、記録に残しておこうと思います:writing_hand:

# Next.Navの概要


下は開発者様の**Next.Nav**の紹介から抜粋した文章になります。

>「Introducing Next.Nav, a VS Code extension for viewing and modifying the folder structure of your Next.js application via a tree structure.」
>><a href="https://medium.com/@nathanjames719/next-nav-the-solution-to-confusing-file-based-routing-in-next-js-3c6db2346a05">Next.Nav開発者様のblog</a>より引用

上記を踏まえてNext.Navがどういったものなのかと言いますと、
**「Next.js アプリケーションのフォルダ構造をツリー構造で表示および変更できるVSCodeの拡張機能」**
ということになります(間違っていたらすみません:bow_tone1:）。

言葉だけでは分かりにくいかもしれませんので、下に参考画像を用意しました。

![Next.nav.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572594/5e05eeef-29ca-2729-04fd-45bd36a3f950.png)

ツリー形式になっており、一目で構造が分かるかと思います！

# 使い方

下の公式ページから**Next.Nav**をインストールします。

https://www.next-nav.com/


VScode上でコマンドパレットから**Next.Nav**を選択します。
モーダルが開くと先ほどの画像のような画面になるので、モーダルの右上の一番左のボタンを押します。



![how-to-use-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3572594/00449d00-743a-8be0-73b7-d6ae5d40dcc1.png)

上記のようなウィンドウが開きますので、その中に**自身が確認したいフォルダのパス**を入力して下さい。
無事にフォルダ構造が取得できるかと思います:blush:

# 最後に

開発初期の段階ではあまり効果が実感できないかもしれませんが、大規模になっていくにつれ、より効果を発揮していくものかと思います。

また**モーダル上で直接ファイルを開いたり削除することができる**ので、間違ったファイルを消してしまったり開いてしまうことが少なくなるというメリットもあるのではないでしょうか。
（個人的にはノード感覚で管理できて非常に助かっております:smile:）

:::note info
**現状ではJavaScript、typescript、または css ファイルのみが表示対象**になるので、その他のファイルはモーダル上では見えなくなっているようです。
:::

開発のお助けになれば幸いです:relieved::tea:

# 参考にさせていただいたサイト

* <a href="https://medium.com/@nathanjames719/next-nav-the-solution-to-confusing-file-based-routing-in-next-js-3c6db2346a05">Next.Nav: The Solution to Confusing File-Based Routing in Next.js</a>
* <a href="https://www.next-nav.com/">Next.Nav公式ページ</a>
楽天マーケットスピードII　RSSを使って株価チャートを作成

# はじめに
pytonで株価チャートを描ければいいなと思い、作ることにしました。株価を取得する方法やチャートを描く方法は色々あると思いますが、ここでは、楽天マーケットスピードIIのRSS関数を使い、エクセルに株価を表示させて、pandasのデータフレームに変換し、mplfinanceでチャートを描くようにしました。

![チャート.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3245171/9a32e706-9dbc-c196-4b74-86fe2ccfad60.jpeg)

# RSS関数について

エクセルに入力する関数は、
```python
=RssChart( ヘッダー行 , 銘柄コード , 足種 , 初期表示本数 )
```

それぞれの引数は、

:::note info
ヘッダー行
:::

省略の場合下記の項目が出ます 
「銘柄名称, 市場名称, 足種, 日付, 時刻, 始値, 高値, 安値, 終値, 出来高」

:::note info
銘柄コード
:::

国内株式 数値4桁 例えば「トヨタ自動車」は7203 

:::note info
足種
:::

T：ティック, 1M：1分足, 2M：2分足, 3M：3分足, 4M：4分足, 5M：5分足, 10M：10分足, 15M：15分足
30M：30分足, 60M：60分足, 2H：2時間足, 4H：4時間足, 8H：8時間足, D：日足, W：週足, M：月足

:::note info
初期表示本数 1～3000
:::

1分足：9日分、2分足：9日分、3分足：9日分、4分足：9日分、5分足：31日分、10分足：61日分
15分足：91日分、30分足：121日分、60分足：2年分、日足：10年分、週足：20年分、
月足：30年分（1995年5月以降のデータ）

RSS関数の詳細については、下記をご覧ください。

https://marketspeed.jp/ms2_rss/onlinehelp/ohm_002/ohm_002_04.html

pythonのプログラムで、RSS関数は、次のようにしました。
```python
code=7203       # 銘柄コード
bar="M"         # 足種
number=50       # 表示本数
command_line="=RssChart("+","+str(code)+","+"\""+bar+"\""+","+str(number)+")" 
ws.Cells(1, 1).Formula =command_line
```

# コード
pythonのプログラムです。
実行前に、マーケットスピードIIのログインと、
エクセルを起動し、空白のブックを開き、RSSの接続が必要です。

```python
import win32com.client      #エクセル用
import mplfinance as mpf    #グラフ用
import pandas as pd         #データフレーム用
import time                 #時間調整用

#変数設定
code=7203       # 銘柄コード
bar="M"         # 足種
number=50      # 表示本数
row, column=1,1 # Rssの関数を入れる場所

#Rss関数で取り込んだエクセルデータをpandasのデータフレームへ変換する関数
def get_data(code, bar, number, row, column):
    #エクセルに入れる関数　RssChart(ヘッダー行,銘柄コード,足種,初期表示本数)
    command_line="=RssChart("+","+str(code)+","+"\""+bar+"\""+","+str(number)+")" 
    #Rss関数をエクセルに記入
    ws.Cells(row, column).Formula =command_line
    #エクセルに取り込んだデータを変数「data」に取り込む 
    data=ws.Range(ws.Cells(row+2,column+3), ws.Cells(row+number+1,column+9)).Value
    #データフレームに変換 columnsで各列に対応するタイトルを入れる。
    data=pd.DataFrame(data, columns=["date", "time", 'Open', 'High', 'Low', 'Close', 'Volume'])
    #日付と時間を合わせて、日時とする
    date_time =data["date"]+"/"+data["time"]
    #グラフの横軸に設定できるよう日時の文字をdatetime型へ変更する
    data["date"] = pd.to_datetime(date_time)
    #日時をインデックスとして、グラフの横軸にする
    data.set_index("date", inplace=True)
    return data

#今、開いているエクセルのシート「sheet1」をwsとする
try:
    wb = win32com.client.GetObject(Class="Excel.Application")   
except:
    print("エクセルが開いていません。")
    exit()
wb.Visible=True    
ws = wb.Worksheets('Sheet1')

#株価チャートの表示
while True:
    try:
        data=get_data(code, bar, number, row, column)
        mpf.plot(data, type="candle",volume=True)
        break
    except:
        print("再試行中...")
        time.sleep(1)  # 待機する時間（秒）を指定する
```

エクセルに株価を取り込むときに、時間がかかる場合があります。
取り込み前にチャートを表示するとエラーになるため、
try、exceptを入れています。
Pythonの書式指定文字列の中の変数を抜き出す

## 環境
- Python 3.10.12
- LangChain 0.0.310

## 実装
Pythonの書式指定文字列（Format String）は、以下のように使います。

```python
template_text = "こんにちは、{name1}さんと{name2}さん"
print(template_text.format(name1="ほげ", name2="ふが"))
#=> こんにちは、ほげさんとふがさん
```

この文字列から置換される変数である`name1`,`name2`を抽出するには、[`string.Formatter`の`parse()`メソッド](https://docs.python.org/ja/3/library/string.html#string.Formatter.parse)を使います。

```python
from string import Formatter

template_text = "こんにちは、{name1}さんと{name2}さん"
for parsed in Formatter().parse(format_string=template_text):
    print(parsed)
```

```:出力
('こんにちは、', 'name1', '', None)
('さんと', 'name2', '', None)
('さん', None, None, None)
```

### LangChainでの利用例

[LangChainのPromptTemplate](https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/)では、この書式指定文字列の文法に従っています。

```python
from langchain.prompts import PromptTemplate

template_text = "こんにちは、{name1}さんと{name2}さん"

prompt_template = PromptTemplate(template=template_text, input_variables=["name1", "name2"])
print(prompt_template.format(name1="ほげ", name2="ふが"))
#=> こんにちは、ほげさんとふがさん
```

`PromptTemplate`を使うにあたって`from_template()`を使うことで、`input_variables=["name1", "name2"]`を指定しなくても自動で判断してくれます。

```python
from langchain.prompts import PromptTemplate

template_text = "こんにちは、{name1}さんと{name2}さん"

prompt_template = PromptTemplate.from_template(template_text)
print(prompt_template.format(name1="ほげ", name2="ふが"))
#=>こんにちは、ほげさんとふがさん
```

この[from_template()の実装](https://github.com/langchain-ai/langchain/blob/58b7a3ba16d12051f0c399e5968d26acaee0b230/libs/langchain/langchain/prompts/prompt.py#L205C59-L205C59)では、先程紹介した`string.Formatter`の`parse()`メソッドを利用して変数を抽出しています。

```python:https://github.com/langchain-ai/langchain より引用
input_variables = {
    v for _, v, _, _ in Formatter().parse(template) if v is not None
}
```

## 謝辞
この記事のコードの一部は[Colab Generative AI](https://blog.google/technology/developers/google-colab-ai-coding-features/)を用いて生成されました。
【scratch】jsonハックやり方

jsonハックとはscratchでやばいブロックが作れることです。
まあやる意味ないけど。w
# やり方
まずscratchでこのように〇秒待つのブロックを取り出し、
![Screenshot 2023-10-07 21.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/7b5a883f-857e-db39-efa7-0fb3b992084c.png)
コンピューターに保存します。
![Screenshot 2023-10-07 21.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/93ca6fdb-ac61-2fc7-2aca-d54e5877203c.png)
さてここからがやばいです。
# 改造
ダウンロードしたファイルの拡張子は.sb3ですが、.zipに変えます。
解凍して、project.jsonをメモ帳で開きます。
```json:project.json
{"targets":[{"isStage":true,"name":"Stage","variables":{"`jEk@4|i[#Fk?(8x)AV.-my variable":["変数",0]},"lists":{},"broadcasts":{},"blocks":{},"comments":{},"currentCostume":0,"costumes":[{"name":"背景1","dataFormat":"svg","assetId":"cd21514d0531fdffb22204e0ec5ed84a","md5ext":"cd21514d0531fdffb22204e0ec5ed84a.svg","rotationCenterX":240,"rotationCenterY":180}],"sounds":[{"name":"ポップ","assetId":"83a9787d4cb6f3b7632b4ddfebf74367","dataFormat":"wav","format":"","rate":48000,"sampleCount":1123,"md5ext":"83a9787d4cb6f3b7632b4ddfebf74367.wav"}],"volume":100,"layerOrder":0,"tempo":60,"videoTransparency":50,"videoState":"on","textToSpeechLanguage":null},{"isStage":false,"name":"スプライト1","variables":{},"lists":{},"broadcasts":{},"blocks":{"hY?)%_US6l70Kg8b^+nq":{"opcode":"control_wait","next":null,"parent":null,"inputs":{"DURATION":[1,[5,"1"]]},"fields":{},"shadow":false,"topLevel":true,"x":196,"y":422}},"comments":{},"currentCostume":0,"costumes":[{"name":"コスチューム1","bitmapResolution":1,"dataFormat":"svg","assetId":"bcf454acf82e4504149f7ffe07081dbc","md5ext":"bcf454acf82e4504149f7ffe07081dbc.svg","rotationCenterX":48,"rotationCenterY":50},{"name":"コスチューム2","bitmapResolution":1,"dataFormat":"svg","assetId":"0fb9be3e8397c983338cb71dc84d0b25","md5ext":"0fb9be3e8397c983338cb71dc84d0b25.svg","rotationCenterX":46,"rotationCenterY":53}],"sounds":[{"name":"ニャー","assetId":"83c36d806dc92327b9e7049a565c6bff","dataFormat":"wav","format":"","rate":48000,"sampleCount":40681,"md5ext":"83c36d806dc92327b9e7049a565c6bff.wav"}],"volume":100,"layerOrder":1,"visible":true,"x":0,"y":0,"size":100,"direction":90,"draggable":false,"rotationStyle":"all around"}],"monitors":[],"extensions":[],"meta":{"semver":"3.0.0","vm":"2.0.5","agent":"Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"}}
```
そこの中のinputsを探します
そしてinputsの場所が見つかったら
```
"inputs":{"DURATION":[1,[9,"#ffffff"]]}
```
このように変えます
そして解凍してファイルたちをすべてzip圧縮し、sb3に戻し、
scratchにインポートすると..
![Screenshot 2023-10-07 21.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/11c75570-dce8-e50f-a6ed-647b41b59b01.png)
変わってないように見えますが...
![Screenshot 2023-10-07 21.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/16990d52-da91-f173-6707-d566dc9f7cff.png)
??あれ??
これでハックブロックの完成です。
![Screenshot 2023-10-07 21.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569677/91c793a6-6ac7-6b11-f25e-cdee9613356c.png)
今回作ったものは共有されております。これです

https://scratch.mit.edu/projects/904576324/

scratchアカウントはmitotannです。ぜひフォローしてね。
[フォローする](https://scratch.mit.edu/users/Mitotann/ "今すぐフォロー")
PowerAutomate: URLを、ハイパーリンクとして踏めるように置換する

# 背景
社内ではテキストメールを使用している。
そのメールを Lists に保存したいという要望があった。

当然テキストメール内に URL があっても単なる文字列なので、対象URLに飛ぶのは簡単ではなくてコピペが必要

で、面倒だからなんとかならないかって話があったので、単純にURLを置換する方法を提示した記録

# 概要

単純に
- URLを正規表現で以下に置換する

```html: HTML へ
<a href={URL}>{URL}</a>
```
```markdown: markdown へ
[{URL}]({URL})
```

# 置換方法
## expression text
```typescript: expression text
(https:.[\w\/\.]+)
```

### HTML
```typescript: to HTML
<a href=$1>$1</a>
```

### markdown
```markdown: to markdown
[$1]($1)
```

# 正規表現
Power Automateでの正規表現の使い方は以下とかで

https://qiita.com/baku2san/items/74885b03ada5be8f6f42

# あとがき

Run Script は便利ですけど、使いすぎると一日の利用上限に引っかかるの注意が必要
現時点で 600/day かな
OCIリソースと有効範囲

# クロスリージョン（グローバル）
- **IAM関連**
ユーザー、グループ、**コンパートメント**、ポリシーなど。IAMはリージョンが変わっても（違うリージョンからでも）同様に利用可能
- **DNS**
FQDN(Fully Qualified Domain Name）をIPアドレスに変換するシステム。

# リージョナル
- **VCN**
- コンピュート・イメージ
- **オブジェクトストレージ**
⇒特定のインスタンスに結びつかず、リージョン内ならどこからでもデータを取得できる。
- **ブロック・ボリューム・バックアップ**
⇒オブジェクトストレージへの格納となるので、リージョナルリソースになる。
- ネットワーク関連
Ephemeral(エフェメラル)IPアドレスと可用性ドメイン固有サブネット以外。
- コンテナ（仮想化。
- ロードバランサ
ネットワークに関連して。サブネットが可用性ドメイン固有の場合は可用性ドメイン範囲になる。

# 可用性ドメイン
- ブロック・ボリューム
ボリュームやボリュームのクローン自体は可用性ドメイン内に配置し、インスタンスと紐づける。
別のリージョンにレプリケーションすることは可能。
- ネットワーク（Ephemeral(エフェメラル)IPアドレスと可用性ドメイン固有サブネット）
- ロードバランサ（可用性ドメイン固有サブネット）
# フォルト・ドメイン
- コンピュート・インスタンス
- データベース
- クラスタ・ノード
URLのクエリパラメータを少し楽に記述する


NuGetで`Microsoft.AspNetCore.WebUtilities`をインストールする。
`QueryHelpers.AddQueryString`を使用することで、クエリパラメータ生成を行える。

```csharp
var uri = QueryHelpers.AddQueryString("http://example.com/access", new Dictionary<string, string>
{
    { "parameter1", "'hogehoge'" },
    { "parameter2", "'hugahuga'" },
});
// http://example.com/access?parameter1=%27hogehoge%27&parameter2=%27hugahuga%27
```

従来は以下の方法でクエリパラメータ生成を行っていた。
文字列操作を行いたいだけなのに非同期処理を用いている点が気になる。

```csharp
var endodindedParameters =
    await new FormUrlEncodedContent(new Dictionary<string, string>
    {
        { "parameter1", "'hogehoge'" },
        { "parameter2", "'hugahuga'" },
    })
    .ReadAsStringAsync();
var uri = $"http://example.com/access?{endodindedParameters}";
// http://example.com/access?parameter1=%27hogehoge%27&parameter2=%27hugahuga%27
```
Webコーディング - 模写コーティング(2023/10/07)

2023/10/7

初めての模写コーディング

①ルールを定める
* フォトの種類やカラーにはこだわらない。 →ディベロッパーツールで調べてもいいが、細かいところはあわせなくてもよい
* 細かいマージンやパディングにはこだわらない。 →ディベロッパーツールで調べてもいいが、細かいところはあわせなくてもよい
* レスポンシブのブレークポイントはあわせる →デザインに影響がでる場合があるので、ここはあわせておく
* (ソースコードは見ない) →考えたり試行錯誤することでスキルがあがるので

②確認するポイント
* デザインの確認 →レイアウトやページの構成はどうなっているか
* 動きの確認 →スクロールやマウスオーバー、クリック時の動きはどうなっているか
* レスポンシブの確認 →画面サイズがかわったとき、デザインはどのように変化するのか

③レイアウト構成をメモする
1. 全体のレイアウト構成を確認
2. 各パーツのレイアウト構成を確認

header,main,aside,section,footerなど

—
shift + option + f … インデント揃える

———————————
①全体のコーディング
全体の枠組みとhead部分のコーディングを行う
②ヘッダーのコーディング
③メインビジュアルのコーディング

？ idとclassを両方記述する意味

sectionタグ・divタグの違い
「sectionタグは、見出しとそれに関する文章をまとめるという役割がありますが、divタグはHTML要素を囲うだけで意味を持っていません。
また、divタグは主にCSSを使ってデザインを整えるために利用するのに対し、sectionタグはWebページの構造を明確にするために利用します。
たとえば、入れ子にhタグが利用されておらず、デザイン変更のみ目的の場合はdivタグを使い、タイトルとその内容が記述されている要素を囲う場合はsectionタグを使います。」

・margin外側　padding内側

GitHubを利用してのウェブサイト公開
・1カラムのプロフィールサイトを制作

https://izu88.github.io/.gihub.io/

———————————
1.まずはアイコン、サニタイズCSS、CSSを設置
<link rel=“icon” href=“”>
Salesforceの拡張差し込み印刷について調査してみた

こんにちは。本橋孝昭です


今回はSalesforceの拡張差し込み印刷について設定方法をお伝えします

このSalesforce拡張印刷を設定すれば、Wordで帳票をあらかじめ作成しておいてSalesforceにWordをアップロードしておければ、Salesforceで選択したレコードを元にWordで出力される。という機能です


なお、Salesforceの機能の１つとして「標準差し込み印刷」がありましたが、こちらは廃止される機能なので注意が必要です

参考ヘルプ：Connect for Office および標準差し込み印刷の廃止
https://help.salesforce.com/s/articleView?id=release-notes.rn_sales_cfo.htm&release=218&type=5

今回は「標準差し込み」の説明ではなく「拡張差し込み印刷」について解説します


# ステップ１　拡張差し込み印刷の有効化
拡張差し込み印刷を使用するには「有効化」しましょう

※参考ヘルプ　

 https://help.salesforce.com/s/articleView?id=000386701&type=1
[拡張差し込み印刷] の有効化方法
 
1. [設定] をクリックします。
2. [カスタマイズ] | [ユーザインターフェース] を選択します。
3. [詳細] セクションで [拡張差し込み印刷を有効化] を選択します。
4. [保存] をクリックします。

![有効化1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/232a2d74-0342-28e7-7f82-2b502daa9d0d.png)

# ステップ2 Wordで帳票を作成しよう

Wordで今回Saelsforceのデータを出力させたいフォーマットを作成します

なお、サンプルのテンプレートはこちらのヘルプからダウンロード可能です

拡張差し込み印刷の差し込み印刷テンプレートのサンプルのダウンロード
https://help.salesforce.com/s/articleView?id=sf.modifying_mail_merge_templates.htm&type=5

　今回はこちらのテンプレートを使います
![テンプレート-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ae5853bd-6f07-e688-d2e5-d43633892970.png)

# ステップ3  ファイルをSaelsforceにアップロードしよう
「差し込み印刷テンプレート」からステップ２で作成したWordをアップロードします

![差し込み.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/96d716d6-14a6-ae1d-f853-6ca46bbc7b4e.png)

# ステップ4 Clkassic環境で「一括差し込み印刷」をクリックしよう

※「拡張差し込み印刷」はLighntinng環境では使えません
以下の手順に従い「完了」をクリック
![一括１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7d47353b-0e01-d065-051e-ac9ce849ed81.png)
![一括2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1e4375cb-c7b8-c9e4-d9d1-44a124cf0e4b.png)
![一括３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/60fa6e66-a00a-31a2-b9a1-37f74f5ce771.png)
![一括4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4c087a62-d1e4-2f5b-c955-1fc920584b85.png)
※なお最後の「ドキュメント」ではさきほどアップロードしたファイルの名を選択してください



# ステップ5 メールを確認

件名は「Salesforce 差し込み印刷リクエストが完了しました。」　でWordが添付されていれば完了です

![Mail1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/5953a117-388a-b0e3-1ed7-6edc076b33b5.png)
![Mail2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/05919261-2f77-6002-d546-61ce858c02a6.png)
このように添付されたWordにはSaelsforceデータが記録されていることが分かります


#  おまけ

今回Wordでテンプレート作成をする際、
«ACCOUNT_NAME» 
のような記載になりますね
これをどのように設定するか分かりやすく書いているHelpをご紹介

差し込み印刷のレコード項目名を検索する URL
https://help.salesforce.com/s/articleView?id=000386295&type=1

このヘルプ内でいう
https://<組織のドメイン>.salesforce.com/servlet/servlet.SForceMailMerge?id=<レコード ID>

とは例として以下環境であり、取引先責任者　0035h00001E77BU
 のレコードの項目が知りたい場合のURLは

https://curious-impala-lng28n-dev-ed.trailblaze.my.salesforce.com/servlet/servlet.SForceMailMerge?id=0035h00001E77BU
となります


![ドメイン01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/07cf1da4-4774-0198-a4cd-316e0b3a3e43.png)


きちんとしたURLが設定されればこのような画面になるので拡張差し込み印刷のテンプレートのWordを作成するのが便利になりますね
![ドメイン２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/69b1d9a2-e16c-e820-f25d-287adf74aa9f.png)
paiza.ioでelixir その254

# 概要
paiza.ioでelixirやってみた。
delay、どうすんだ。

# サンプルコード

```

defmodule Main do
    def sleep_rand(n) do
        sleep_time = :rand.uniform(n)
        :timer.sleep(sleep_time)
        IO.puts "#{sleep_time}ミリ秒,sleepしました"
        sleep_time
    end
end


Main.sleep_rand(1500)


```

# 実行結果

```
1137ミリ秒,sleepしました
```

# 成果物

https://paiza.io/projects/lVKs3RB3tfh05ieg0JXobQ

以上。
Text generation web UI(1.6.1)の設定項目を調べてみた_modelタブ編

# はじめに

前回はLLMを動かすだけで終わりました。
UIの設定項目があまりにも多い＆用語がLLM初心者には何が何だかわからず、初期設定からいじる気がしなかったためです。
今後もごりごりLLM触るつもりなので、腰を据えてひとつひとつ調べていこうと思います。

1.6.1のバージョンだとヘッダータブがこんな風になってるので、
今回はmodelタブの設定項目について調べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/1ab56a04-5a4d-9322-d8fb-2668d088cf34.png)

# modelの調査

## そもそもmodelタブって何が目的なの？

LLMモデルの選択と、モデルに対してのパラメータ設定が目的のようです。

## 最低限の使い方だけ知りたい

最低限となると、

1. モデルをダウンロードする
1. モデルをロードする

になります。

### 1. モデルをダウンロードする

赤枠のところにHugging Face(LLMのモデルなどを公開しているAIプラットフォーム)のLLMモデル名を入力して「download」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/97cc2383-1918-abd5-31d8-71b5c06f6f6d.png)

LLMモデル名は、
Hugging Face上の以下のボタンを押せば取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/eca9d68f-971f-dac5-e1b5-318ed595ceb4.png)

### 2. モデルをロードする

「Model」のプルダウンで、ダウンロードしたモデル名が表示されるようになりました。
モデルを選択したうえで、お隣の「Load」ボタンを押せばチャットでモデルが利用可能になります。
いちいちLoadボタン押すのが面倒な人は、チェックボックス「Autoload the model」にチェック入れればプルダウン選択で自動でロードされるっぽいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/eaa696d2-473d-edc2-c1e8-f66ce7489484.png)

## 設定値の意味を知りたい

### Model loader

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/529a818c-1edf-de91-362b-8c9fd89e1113.png)

Model loaderプルダウンには何かいろいろあります。
いくつか調べてみましたが、どうやらLLMモデルを利用する際に使うライブラリらしく、ランタイムみたいな理解でいいんでしょうか？
Model loaderを変えるとその下の設定項目群の構成が変わるので、ユーザー目線だと「LLMのパラメータを制御するやつ」くらいにとらえておけば良さそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/1644db81-5c70-3769-0cd4-457d56723a20.png)

この記事で全部書き出そうとすると長くなりすぎるので、別記事でまとめようと思います。

### LoRA(s)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565603/659b03d1-9a52-33b9-0914-114bb908bd4c.png)


そもそもLoRAってなんぞ？と調べてみたけどよくわからなかったです。
とりあえずLLMモデルに学習させるための手法の１つ、という理解までで良さそう？

じゃあこのLoRA(s)のプルダウンで選択するものってなんやねんって調べてたら以下の記事に行き着きました。


https://note.com/npaka/n/n1359ca1ad3a3


要するに、

1. Trainingタブのページにて、選択したモデル(ここだとcyberagent_open-calm-3b)に対して、特定のデータセットで学習させる
1. 学習が終わると、学習した結果がLoRAモデルとして「loras」フォルダに出力される
1. modelタブページのLoRA(s)プルダウンで出力されたLoRAモデルを選択することで、LoRAモデルをふまえた出力をLLMモデルがしてくれるようになる

ということのようです。

# あとがき

LoRA(s)について調べるだけで半日かかりました...道のりは険しい。
次回はModel loaderの詳細についてまとめようと思います。
Julia で，「モンティ・ホール問題を愚直にやってみる」

Julia でやってみると以下のようになる。

元記事
モンティ・ホール問題を愚直にやってみる
https://qiita.com/bkh4149/items/93adeaa46c77efb8ae73

```julia
using Random

# モンティ・ホール問題のシミュレーション

function monty_hall_simulation(num_trials::Int)
    stay_wins = 0 # ドアを変えない場合の勝利回数
    switch_wins = 0 # ドアを変えた場合の勝利回数
    
    for _ in 1:num_trials
        # 3つのドアと1つの正解ドアをランダムに配置
        doors = Random.shuffle([false, false, true])
        
        # プレイヤーが最初にランダムに1つのドアを選択
        player_choice = rand(1:3)
        
        # ホストが正解ドア以外かつプレイヤーが選んでいないドアを開ける
        host_choices = [i for i in 1:3 if i != player_choice && !doors[i]]
        host_open = rand(host_choices)
        
        # プレイヤーがドアを変えない場合
        stay_choice = player_choice
        
        # プレイヤーがドアを変える場合
        switch_choice = [i for i in 1:3 if i != player_choice && i != host_open][1]
        
        # 勝敗を判定
        stay_wins += doors[stay_choice]
        switch_wins += doors[switch_choice]
    end
    
    stay_win_percentage = stay_wins / num_trials * 100
    switch_win_percentage = switch_wins / num_trials * 100
    
    println("ドアを変えない場合の勝率: $stay_win_percentage%")
    println("ドアを変えた場合の勝率: $switch_win_percentage%")
end

# シミュレーションを実行
monty_hall_simulation(10000000) # 10000000回試行

```

    ドアを変えない場合の勝率: 33.33347%
    ドアを変えた場合の勝率: 66.66653%