OmniAICreator/Qiita-1.07M huggingface dataset:
[ Open WebUI ] [ ローカルLLM ] Docker を使わない環境の Open WebUI を Update しました（起動スクリプトもメンテナンス）

# Docker を使わない環境の Open WebUI をアップデートしました(0.4.8)。

https://github.com/open-webui/open-webui/releases

### pip を使って Update していきます。

~~~
cd .venv
scripts/activate
python -m pip install --upgrade pip
pip list | findstr open-webui
python -m pip install --upgrade open-webui
pip list | findstr open-webui
    open-webui                               0.4.8
~~~

0.4.8 にアップデートできました！（終わり）

# UI など変更点の確認

モデルの管理画面に変更があるようですね。

### ワークスペースで表示するモデルの登録

以前のバージョンでは利用可能モデルすべて表示されていましたが、デフォルトは「未登録」になったため使用したいモデルのプロファイルをいくつか登録しておきます。
ワークスペースの画面でプラスのアイコンをクリックするとモデルのプロファイル作成画面が表示されます。「Model Name」と「ベースモデル」だけ入力すれば作成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920228/45959cee-45e6-f66f-c532-571d1532e25d.png)

このプロファイルはアカウントごとに作成され、文字通り自分用のワークスペースになります。

リクエストパラメータのモデルごとの設定もここでできるようになってますね。（下記はご参考まで）

"temperature": 0.2,
"top_p": 0.8,
"repetition_penalty": 1.1,
"max_tokens": 512

### 複数モデルの1画面表示

3つのモデルを同時に表示させてみました。応答の違いが分かりやすいですね。
（画面の設定上では制限が無さそうでしたが4つ以上登録すると最初のモデルから消えてしまうようです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920228/c1dc8194-8d0c-1692-e22d-b7da628a723b.png)

### 使いたいモデルを優先して表示する設定

Open WebUI は設定済みの利用可能なモデルを使えますが数十個のモデルがあると管理が大変ですよね。管理者画面のモデル設定でデフォルトモデルとモデルの並び方を設定できます（デフォルトはアルファベット降順にソートされています。）。使わないモデルは明示的にOFFにできます。

環境設定については左下のアカウントのアイコンから
「管理者パネル」> 「設定」 > 「モデル」　
に移動して設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920228/40cf7591-0f44-2c70-eb28-9693e61b449f.png)

# 起動スクリプトもメンテナンスしました

ollama for windows + WSL + pipelines + local LLM + 外部サービスのAPI を同時に使用できる環境ができましたが起動管理が大変ですね。とりあえず起動用バッチだけ作成しましたので記録のために残しておきます（デフォルトで ollama は Windows のスタートアップに入るのでスクリプトでは操作していません）。

Start_Open-WebUI.bat
~~~
start "" cmd /c wsl -d Ubuntu bash -c "cd /home/user && /home/user/startqwen2vl2binstruct.sh"
C:
cd C:\.venv
call scripts\activate.bat
cd C:\.venv\pipelines
start "" cmd /c start.bat
cd C:\.venv
open-webui serve
~~~

それではみなさんも快適な ローカルLLM ライフをお楽しみください！
ベータ分布と台形積分による数値解析

# はじめに
ベータ分布は、確率分布の一種である。一般に二項分布はコンビネーションを用いて表すが、それだと連続性を議論できない。そこで、連続性を議論することが出来るように、拡張したものがベータ関数である。また、ベータ関数は、定積分によって定義される。そこで今回は、まず台形積分によってベータ関数の値を数値解析する。次に、数値解析した値を基に、ベータ分布を再現することを目的とする。

![ベータ分布p=0.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/64fe6bbe-6dab-fadb-1146-778b72ea2661.png)


# 導入

## ベータ分布について
一般的に、二項分布による確率は以下のように定義される。
```math
P(m)=_nC_m p^m(1-p)^{n-m}
```

ここで、

```math
_nC_m=\frac{n!}{m!(n-m)!} 
```
これをベータ関数で表したい。
一方で、ベータ関数の定義は以下のように与えられる。

```math
beta(k,l)=\int_0^1x^{k-1}(1-x)^{l-1}dx
```

これにより、$k,l$が自然数の場合は、以下のことが成立する。

```math
beta(k,l)=\frac{(k-1)!(l-1)!}{(k+l-1)!}=(_{k+l-2}C_{k-1})^{-1}\times\frac{1}{k+l-1}
```

したがって、

```math
_nC_m=\frac{1}{beta(n-m+1,m+1)(n+1)}
```

となる。

# プログラム

そこで、以下のようなプログラムを書いた。
ただし、$p=n,q=m$とした。

```python beta_distribution.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math

S_ary=[]
#区分求積法による数値積分
##積分範囲
a=0
b=1
##分割数
n=10000
# 短冊の幅Δx
dx = (b-a)/n
# 積分する関数の定義
def f(x,p,q):
    return x**(p-1)*(1-x)**(q-1)
def beta_s(p,q):

  s = 0

  for i in range(1,n-1):
    x1 = a + dx*i
    x2 = a + dx*(i+1)
    f1 = f(x1,p,q)    # 上底
    f2 = f(x2,p,q)    # 下底
    # 面積
    s += dx * (f1+f2)/2
  return s
num=100
p1=0.01
sum_p_q=100
p_ary=np.linspace(0,sum_p_q,num)
for i in range(num):
  p=p_ary[i]
  q=sum_p_q-p
  P=(1/(beta_s(p,q)*(sum_p_q+1)))*p1**(p-1)*(1-p1)**(q-1)
  S_ary.append(P)
plt.plot(p_ary,S_ary)
title="ベータ分布p="+str(p1)
plt.title(title)
plt.xlabel("m回事象が起こる確率")
plt.ylabel("確率")
plt.savefig(title+".png")
plt.show()
```
# 結果
このプログラムを実行すると以下のようなグラフが出力される。

![ベータ分布p=0.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/3a831634-a66c-ea5d-866e-e065c3a58226.png)

![ベータ分布p=0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/9fa860e8-2096-c21d-f6d7-041780c8117f.png)

![ベータ分布p=0.5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/64fe6bbe-6dab-fadb-1146-778b72ea2661.png)

このことから、二項分布や正規分布、ポアソン分布と分布が似ていることが分かる。

# まとめ
今回は、確率分布の一種であるベータ分布を二項分布の連続型への拡張とみて再現した。その際に、ベータ関数の値を求めるために台形積分を用いた。結果、二項分布や正規分布、成功する試行がまれな場合はポアソン分布に酷似するということが分かった。このように、確率統計の分野は線形代数や微分積分の計算と繋がっているので、それらを合わせて考えると面白い。

# 参考文献

ベータ分布について

https://manabitimes.jp/math/1267

https://data-science.gr.jp/theory/tpd_beta_distribution.html

台形積分の数値解析について

https://qiita.com/nuo_t/items/d3f61f55ef5ba689dab4#%E5%8F%B0%E5%BD%A2%E5%85%AC%E5%BC%8F
ABC384回答メモ

# 0.はじめに
　今年もそろそろ終わりの今日この頃。
　今回は調子が良くA~Dまで一気に解け
　調子に乗ってEも行けるかと思いましたが
　やはり手ごわくそこまではいけませんでした。
　レートは久々の大幅あっぷで+38の667でした。

　そして、AIに関する制約が更新されているのに気づき
　読み直したところ、大分変っており、先週のAI利用も
　間に合わなかったですが、NGだったことに気づきました。
　今後は、コンテスト中はAIを封印する必要がありますね。

# 1. 	A - aaaadaa
　回答用変数ansを空で用意しSを先頭から読み込み
　Aと同じならそのままansに転記、違えばBをansに転記とし
　最後にansを出力して終了。

　https://atcoder.jp/contests/abc384/submissions/60723396


# 2.B - ARC Division
　ARCにまつわる問題、D1とD2の条件を表に用意し
　現在のレート変数Rを用意。
　D、Aのインプットごとに現在のレートが判定条件に合うかをチェックし
　会えば現在のレートRにAを加算。
　最後にRを出力し終了

　https://atcoder.jp/contests/abc384/submissions/60730779


# 3.C - Perfect Standings
　回答は例題の回答を並べ替えた物と理解。
　スマートにロジックでメンバーすべてを列挙したいところでしたが
　時間もないので、回答をこぴってリストに手動で入れてプログラムを作りました。

　そこさえできてしまえば、それぞれの人の点数を計算し
　降順にソートされるよう3000から点数を引いた値と名前をタプルににしてソート。
　最後にその順番で名前を出力して終了。

　https://atcoder.jp/contests/abc384/submissions/60737813


# 4.D - Repeated Sequence
　無限とか出てきてうわっとなりましたが、
　要は、SをリストAの合計で割った余りと一致する値を
　A（を2回ループさせた数列）内の部分列で作成できるか
　という問題に帰結することに気づきました。

　そこまで行けば、あとはよくある問題なので、
　Aを2個つなげた数列を尺取法で見ていき、S％sum(A)と
　一致する部分がないかを調べ、あればYes、無ければNoを
　出力して終了としました。

　https://atcoder.jp/contests/abc384/submissions/60748472

以上
Playwright の環境変数の設定方法について

# Playwright の環境変数設定方法

Playwright において環境変数を設定するには以下の方法があります。

## 1. playwright.config.ts の use で baseURL を設定

playwright.config.ts の use の中で baseURL を設定することで、テスト実行時に baseURL が自動設定されます。
つまり、`await page.goto("/");`で`http://localhost:4200/`にアクセスすることができます。

```typescript
use: {
  baseURL: 'http://localhost:4200',
},
```

なお、playwright.config.ts の projects ごとに設定することもできます。

```typescript
projects: [
  {
    name: 'dev',
    use: {
      ...devices['Desktop Chrome'],
      baseURL: 'http://localhost:4200',
    },
  },
  {
    name: 'staging',
    use: {
      ...devices['Desktop Chrome'],
      baseURL: 'http://localhost:4300',
    },
  },
  {
    name: 'production',
    use: {
      ...devices['Desktop Chrome'],
      baseURL: 'http://localhost:4400',
    },
  },
],
```

## 2. テストオプションの拡張

baseURL とは別に、globalsQaURL など、他の URL を環境変数として設定したい場合、以下の手順で行うことができます。

### 手順

1. test-options.ts を作成する

```typescript
import { test as base } from '@playwright/test';

export type TestOptions = {
  globalsQaURL: string;
};

export const test = base.extend<TestOptions>({
  globalsQaURL: [
    '',
    {
      option: true,
    },
  ],
});
```

2\. playwright.config.ts の設定

```typescript
export default defineConfig<TestOptions>({
  use: {
    baseURL: 'http://localhost:4200',
    globalsQaURL: 'https://www.globalsqa.com/demo-site/draganddrop/',
  },
});
```

3\. テストファイルでの使用

```typescript
import { expect } from '@playwright/test';
import { test } from '../test-options';

test('drag and drop with iFrame case1', async ({ page, globalsQaURL }) => {
  await page.goto(globalsQaURL);
  // テストコードを記述
});
```

## 3. process.env を用いた環境変数の設定

.env ファイルを用いて、process.env で環境変数を設定することができます。

### 手順

1\. .env ファイルの作成

```plaintext
URL=https://www.globalsqa.com/demo-site/draganddrop/
```

2\. dotenv のインストール

```bash
npm install dotenv --save-dev
```

3\. playwright.config.ts の設定

```typescript
import * as dotenv from 'dotenv';
import * as path from 'path';
dotenv.config({ path: path.resolve(__dirname, '.env') });
```

4\. テストファイルでの使用

```typescript
test.beforeEach(async ({ page }) => {
  await page.goto(process.env.URL);
});
```

なお、コマンドラインで process.env に環境変数を設定することもできます：

```bash
URL=https://www.globalsqa.com/demo-site/draganddrop/ npx playwright test autoWaiting.spec.ts --project=chromium
```
Gather Town Desktop 🍇 でも瞬間移動したい！

## この記事は…

- [Gather Town Desktop](https://ja.gather.town/download) (ブラウザ版ではない) を使っている
- [Alfred](https://www.alfredapp.com/) (フリー版 or 有料版) を使っている
- [TypeScript](https://www.typescriptlang.org/) を使っている

方向けの内容です！

※また [身の回りの困りごとを楽しく解決！ by Works Human Intelligence Advent Calendar 2024](https://qiita.com/advent-calendar/2024/works-hi-1) の 14 日目の方の記事が投稿されてなかったので代わりに投稿しました 🙏

---

## はじめに

Gather Town や [MetaLife](https://metalife.co.jp/) などの**仮想オフィス**では、会議や相談のためにコールボタンを押すのではなくその場所へアバターを移動させる必要があります🏃🏃💨

_※もちろん退出する場合も移動が必要_

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Gather上でたまたま会議室エリアにいたこと忘れて作業に熱中してたら、突然「あれ端羽さんがいる」「今からこのミーティングに使うんで」って追い出されて、ほんとリアルのコミュニケーションと一緒だなと思った。。</p>&mdash; 端羽英子@ビザスク (@eikohashiba) <a href="https://twitter.com/eikohashiba/status/1530168148283883521?ref_src=twsrc%5Etfw">May 27, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

それが醍醐味なのか不便なのかはともかく、[瞬間移動するためのソリューション](https://zenn.dev/ellreka/articles/cf6638e72d9285)がこれまでいくつか開発されてきました。
今回はデスクトップ版の Gather Town でも瞬間移動ツールを作れないか試してみました 🙌

---

## できたもの

手元に Alfred と Node.js の実行環境があったのでそれらで動くツールを作ってみました ⚒️

https://github.com/nightlamp-llc/gather-town-alfred-teleporter

### 主な機能は以下のとおり

1. **Gather Town のプレイヤーや場所の名前が用いられた移動用シェルスクリプトファイル** を自動で任意のパスの下に作成する機能
2. 自身のアバターの現在地に名前をつけて保存(上記のファイルを作成)する機能
2. 指定された **マップID** と **マップ座標(X,Y)** の場所へ移動する機能
3. 指定された **プレイヤーID** のプレイヤーの **マップ座標(X,Y)** を取得しその場所へ移動する機能

これらの機能と Alfred が組み合わさることでサクッと移動できます ✨️

---

## デモ動画 _(gif)_

Alfred から `Gather Town のプレイヤーや場所の名前が用いられた移動用シェルスクリプトファイル` を実行しその場所へ移動する様子↓ 🥷💨🥷

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133081/049c07d7-c3ae-397b-4f75-1def16558def.gif)

より詳しい使い方は [README](https://github.com/nightlamp-llc/gather-town-alfred-teleporter#readme) をご確認ください :bow:

---

## 使った技術・はまったことなど ①

### @gathertown/gather-game-client

https://www.npmjs.com/package/@gathertown/gather-game-client

今回は Gather Town のソケット API のハンドラーとしてこちらのクライアントライブラリを使ってみました。
API との接続が確率してから自身を含むプレイヤーの情報が利用できるようになるまで少し時間が掛かるので待機する処理が必要でした。

```typescript
const getPlayers = async () => {
  while (!Object.keys(gather.players).length) {
    await wait(100);
  }
  return gather.players;
};
```

---

## 使った技術・はまったことなど ②

### sanitize-filename

https://www.npmjs.com/package/sanitize-filename

渡された文字列に対して、ファイル名やディレクトリ名・パスとして無効な文字を削除/置換するなどし安全に使えるようサニタイズしたものを返してくれるライブラリです。
実際によろしくないプレイヤー名の方が社内にいたわけではないのですが念の為使ってみました 🙌

```typescript
const shFileForAlfred = path.join(shFilesDirForAlfred, `gt-${sanitizeFilename(placeName, { replacement: '_' })}.sh`);
fs.writeFileSync(
  shFileForAlfred,
  `#!/bin/bash\n${process.argv[0]} ${process.argv[1]} teleport ${player.map},${player.x},${player.y}`,
);
```

---

## さいごに

今回はデバック中に神出鬼没な存在となってしまったりと楽しく開発できて嬉しかったです！ 🥳🥳🥳
殆ど Alfred や便利なライブラリのおかげですがサクッと作れたところも良かったです 💪
今後は Electron で Alfred やシェルスクリプトを挟まずもっと速く動くように改善できたらなと思います 💪💪
ここまで、ご高覧ありがとうございました！
備忘録

# 備忘録まとめ
　MATLABの並列処理関数について調べた，他の人に発表する機会があったのでその内容の備忘録まとめです。
# parfeval()
## 内容
1. ワーカーへのタスク振り分け及び使用
	- 任意のワーカーにタスクを振り分けることが可
	- ワーカーの負荷を均等にできる
2. 関数への制約
	- 関数は独立していること
	- 他のタスクに依存していないこと
3. 計算の透明性
	- 関数が独立しているため計算の透明性は高い
	- 結果の取得のためには関数{fetchOutputs}を使用する必要がある
4. リソース状況の可視化
	- グローバル並列プール(gcp)で可視化が行える
5. エラーチェック
	- fetchOutputs関数でエラー状況を詳細に確認できる
## 解釈
　振り分けられたタスクとして非同期実行する関数
　これ単体でタスクを振り分けるのではなく, 別で振り分けてそこから非同期関数として機能する

# parfevalOnAll()
## 内容
1. ワーカーへのタスク振り分け及び使用
	- すべてのワーカー全で関数を非同期実行できる
	- 全体の計算時間を減らせる
2. 関数への制約
	- 関数は独立していること
	- 全ワーカーで行われるので開発の設計による
3. 計算の透明性
	- 計算結果の取得を一括で行える
4. リソース状況の可視化
	- グローバル並列プール(gcp)で可視化が行える
5. エラーチェック
	- fetchOutputs関数でエラー状況を詳細に確認できる


- 並列計算ツールで使用される関数
- 各ワーカーが非同期実行で処理される
- すべてのワーカーの処理が終われば出力を得られる

```
f  = parfevalOnAll(poolの数{※任意},実行したい関数, ひとつの関数が返す値の個数, 渡したい引き数...)

```

f -　出力関数はparallel.FevalOnAllFutureオブジェクトとして返される

```MATLAB
fetchOutparts(f)
```

# parallel.Futureオブジェクト
## モチベーション
　必要なデータだけを一元管理したいな～
　
## 内容
prfevalやparfevalOnAllなどの関数を使用したときの出力引数


#### 調査
Why(なぜ使うか?)：MATLABで並列処理関数を使用したときに自動的に立ち上がる
What(何?):並列処理の計算・結果を一括で管理するための箱
Where(どこで使えるか?):parfevall
 やparfevalOnAllの出力引数として自動作成される
When(いつ使えるか？):並列処理の結果・計算途中での介入, エラーや例外処理の対処時などの時に使える
Who(誰にとって得が大きいか？):プログラム管理者および開発者の可読性の向上に寄与する
How(どんな使い方が出来るか？):afterEachやafterAllなどのコールバック関数を併用することでデバック性能の向上
? ```state``` プロパティの変更をトリガーとすることで非同期タスクの状態変更を詳細に調べることが出来る.


## わからなかった単語や指摘されたこと
| 不明単語・題名 | 内容                                                                                                                      |
| ------- | ----------------------------------------------------------------------------------------------------------------------- |
| 並列処理    | 複数の主体が複数のタスクを切り替えながら処理すること<br>並行処理とは一つの主体という点で異なる                                                                       |
| ワーカー    | 並列処理でどれだけの人(処理を行う計算機)が作業するかを表すもの                                                                                        |
| 待ち行列理論  | タスク振り分けの考え方. <br>重いタスクで時間をとるより，タスクを小さくして流動的になライフサイクルにするのがよいと指摘された.                                                      |
| 仮定不足    | 最小のタスクを考えてそこから飛躍させるのはいいが，それで満足しない.<br>今回でいえば, ワーカーが行っているタスクが外から来た場合の処理はどうする? 並列処理をした後に, また並列処理をしたらどうするなどのパターンを考えていなかった. |


# 学んだこと
無知傲慢であった. 自分で勉強していたスタイルを人に説明できるように調べていたが，本番になってかなり緊張した. また，説明の際の例えが分かりにくかったと気づいた. 自分ではわかっているつもりでも，人によってはわかりづらいことがあって，それをほかにどういう言い回しで簡潔にいうかが出来る人の特徴であると，他の人を見て気づいた.
またわからないとき，どの段階で人に聞けばいいかわからない. もっと人と話して，コミュニケーションをとって自分の意見を言えるように練習する必要があると感じた. コミュ障はプログラマーにとって致命的だと，他の人の会話を聞いていると気づかされた.
Mock サービスを 10 分で構築！json-server 完全ガイド

## json-server を使った Mock サービスの作成方法

### はじめに

Web アプリケーション開発では、バックエンド API がまだ完成していない場合に、Mock サービスを使うことで開発をスムーズに進めることができます。`json-server` は、JSON ファイルを使って簡単に Mock API を構築できる便利なツールです。このブログでは、`json-server` を使った Mock サービスの作成手順を説明します。

---

### 必要な準備

以下のツールがインストールされていることを確認してください：

- Node.js
- npm (Node.js に含まれています)

---

### json-server のインストール

まず、`json-server` をグローバルにインストールします。

```bash
npm install -g json-server
```

---

### データベースファイル (db.json) の準備

`json-server` は、JSON ファイルをデータベースとして使用します。以下のようなファイルを用意してください。

`db.json` の例：

```json
{
  "users": [
    {
      "id": 1,
      "name": "山田太郎",
      "email": "taro@example.com"
    },
    {
      "id": 2,
      "name": "鈴木花子",
      "email": "hanako@example.com"
    }
  ],
  "posts": [
    {
      "id": 1,
      "title": "はじめてのブログ",
      "content": "これはサンプルのブログ記事です。"
    }
  ]
}
```

このファイルはアプリケーションのルートディレクトリに配置してください。

---

### Mock サーバーの起動

以下のコマンドで `json-server` を起動します：

```bash
json-server --watch db.json
```

成功すると、以下のようなメッセージが表示されます：

```bash
  \{^_^}/ hi!

  Loading db.json
  Done

  Resources
  http://localhost:3000/users
  http://localhost:3000/posts

  Home
  http://localhost:3000
```

---

### API の使用例

1. **ユーザーリストの取得**

   GET リクエストを送信：

   ```bash
   curl http://localhost:3000/users
   ```

2. **新しいユーザーの追加**

   POST リクエストを送信：

   ```bash
   curl -X POST -H "Content-Type: application/json" -d '{"name": "佐藤一郎", "email": "ichiro@example.com"}' http://localhost:3000/users
   ```

3. **ユーザー情報の更新**

   PUT リクエストを送信：

   ```bash
   curl -X PUT -H "Content-Type: application/json" -d '{"name": "佐藤次郎", "email": "jiro@example.com"}' http://localhost:3000/users/1
   ```

4. **ユーザーの削除**

   DELETE リクエストを送信：

   ```bash
   curl -X DELETE http://localhost:3000/users/1
   ```

---

### まとめ

`json-server` を使えば、簡単に Mock サービスを構築し、フロントエンド開発を効率化できます。設定もシンプルで、JSON ファイルを編集するだけで API を変更できるため、とても柔軟です。

ぜひ、開発プロジェクトで活用してみてください！
UIColor のシステムカラーはいいぞ

## はじめに
https://developer.apple.com/design/human-interface-guidelines/color

上記を読むと下記のように書いています。これがどういうことなのかについて書きます。

> The system defines colors that look good on various backgrounds and appearance modes, and can automatically adapt to vibrancy and accessibility settings. 

## システムカラーの挙動
実際にシステムカラーの挙動を見てみます。
下記のような実装をします。

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        HStack(spacing: 0) {
            // Color.blueでも同じ
            Color(uiColor: .systemBlue)

            Color(uiColor: .init(red: 2/255, green: 122/255, blue: 1, alpha: 1))
        }
    }
}
```

表示はこうなります。

<img width="500" alt="1" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225999/d4523ea8-b650-076e-8593-0edffc5c538f.png">

これをダークモードなどに変更するとこうなります。

<img width="500" alt="2" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225999/bb209649-7847-f4bd-cfc3-3a6c1d8285da.gif">

systemBlue の色（左側）はスポイトで取るとこんな感じでした。

| コントラスト | Light | Dark |
| --- | --- | --- |
| 通常 | r: 2, g: 122, b: 255 (`#027AFF`) | r: 11, g: 131, b: 255(`#0B83FF`) |
| 高い | r: 0, g: 64, b: 220(`#0040DC`) | r: 64, g: 155, b: 255(`#409BFF`) |

システムカラーを使うと上記のようにダークモードやハイコントラスト時に自動で色を変更してくれます:raised_hands:
自前で色を用意する場合は下記のように Asset Catalog で Appearances の High Contrast にチェックを付けて 4 つの色を指定する必要があります。

<img width="500" alt="3" src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225999/b77c4fe5-564c-1a45-bad6-3847fd0f87ae.png">

## おわりに
システムカラーを使うとダークモードやハイコントラストにも対応してくれるのでできるだけシステムカラーを使いましょう！
自前で用意する場合はちゃんとダークモードやハイコントラストの色も設定しましょう:nerd:
正規表現とキャプチャグループ

## はじめに
正規表現を使用していると、パターン内の条件をまとめて扱いたい場面がでてくることがあります。
そのようなときにはキャプチャグループを利用すると簡潔に記述できるようになります。
また、キャプチャグループにマッチした文字列をパターンの後方で参照することもできます。

この記事ではキャプチャグループを利用した条件の書き方などについて見ていきたいと思います。

## キャプチャグループ
グループ化は`(`と`)`で囲むことで行えます。
グループ化をすると、そのグループに対して`{n,m}`や`.`、`*`などの量指定子を使用することもできます。
```js
const regex = /(abc){3}/

"abc".match(regex)          // null
"abcabc".match(regex)       // null
"abcabcabc".match(regex)    // ["abcabcabc", "abc"] 
"abcabcabcabc".match(regex) // ["abcabcabc", "abc"] 
```
上の例では`"abc"`を3回繰り返している文字列にマッチするようになっています。
`match`がマッチ箇所の他に`"abc"`を返していますが、これはマッチした箇所に関するキャプチャグループです。
キャプチャグループを返り値に含めたくない場合には、`(?:`と`)`で囲んでグループ化を行います。
```js
const regex = /(?:abc){3}/

"abcabcabc".match(regex) // ["abcabcabc"]
```

### キャプチャグループの参照
`()`によってグループ化すると、グループ内のパターン（サブパターン）に**マッチする文字列**を後方で参照できるようになります。

例えば、`'`または`"`で囲まれた文字のパターンを記述したいときには、`['"][^'"]*['"]`のように書いてしまうと`'abc"`や`"def'`のようにクオテーションの種類が異なる文字列にもマッチしてしまいます。
２つ目の`['"]`には、１つ目の`['"]`で合致した符号と同じものが入ってほしいわけですが、そこでグループ化とその参照を利用できます。

キャプチャグループの参照は`\1`や`\2`のように、パターン内で何番目のグループを参照したいかを指定できます[^1]。

```js
const regex = /(['"])[^'"]*\1/

"\'abc\"".match(regex) // null
"\"abc\"".match(regex) // [""abc"", """] 
"'abc'".match(regex)   // ["'abc'", "'"] 
```
`(['"])`はパターンの中で1番目にあるグループなので、`\1`で参照できます。
`"'abc'"`は`'`から始まっているため、1番目のグループでは`'`が条件に合致します。
`\1`によって、パターン`'`を参照できるようになります。
マッチしたサブパターンを定数のように扱えるわけですね。

### 名前付きキャプチャグループ
キャプチャグループには名前をつけることができ、その名前を使用して`\1`や`\2`の代わりに参照を行うこともできます。

名前をつけてグループ化するには、`(?<group_name>`と`)`で囲みます。
参照する際には、`\1`などの代わりに`\k<quote>`のように`\k<group_name>`の形で指定できます。
```js
const regex = /(?<quote>'|")[^'"]*\k<quote>/

"'abc\"".match(regex)  // null
"\"abc\"".match(regex) // [""abc"", """] 
"'abc'".match(regex)   // ["'abc'", "'"] 
```
### `|`: 選択
`|`を使用すると、左の条件、「または」、右の条件にマッチすることを表現できます。
先のクオテーションの例では文字クラスを使用していましたが、`|`を使って書き換えることもできます。
```js
const regex = /('|")[^'"]*\1/

"\'abc\"".match(regex) // null
"\"abc\"".match(regex) // [""abc"", """] 
"'abc'".match(regex)   // ["'abc'", "'"] 
```


`|`は左から順に比較が行われていくため、複数の条件に合致するケースがある場合には、優先して合致させたいものを左に置いておく必要があります。
```js
const regex = /foo|foooo/
"foooo".match(regex) // ["foo"]

const regex2 = /foooo|foo/
"foooo".match(regex2) // ["foooo"]
```


[^1]: `(?:)`によるグループはカウントしません。
正規表現とマッチ位置

## マッチ位置の指定
正規表現では`/\d/`や`/abc/`といった文字の指定だけではなく、文字列の先頭や単語の境界といった、位置の指定ができます。

#### `^`: 文字列の先頭
`^`は文字列の先頭にマッチします。
`/^bcd/`というパターンは、`"bcdef"`という文字列では条件が合致しますが、`"abcdef"`という文字列では合致しないこととなります。
```js
const regex = /^bcd/

"bcdef".match(regex)  // ["bcd"]
"abcdef".match(regex) // null
```

`/[^0-9]/`のように、文字クラスで使用される`^`とは異なる意味を持つので注意が必要です。

#### `$`: 文字列の末尾
`$`は文字列の末尾を表します。
`^`とともに使用することで、完全一致するパターンを指定することもできます。
```js
const regex = /^bcd$/

"bcd".match(regex)    // ["bcd"]
"bcdef".match(regex)  // null
"abcdef".match(regex) // null
```

#### `\b`; 単語の境界
`\b`は単語境界にマッチします。
`\w`で単語文字[^1]、`\W`で単語文字以外が表されますが、`\w`と`\W`の間の位置、文字列の先頭と`\w`の間の位置、文字列の末尾と`\w`の間の位置のことを単語境界と呼びます。
```js
const regex = /\bbcd/

"a bcd e".match(regex) // ["bcd"]
"abcde".match(regex)   // null
"bcde".match(regex)    // ["bcd"]
```
`/\bbcd/`のパターンは、`"bcd"`の前に単語境界があるときにマッチします。
そのため、`"a bcd e"`は`"bcd"`の前に単語文字以外の文字`" "`（半角スペース）があり、`"bcde"`は`"bcd"`の箇所が文字列の先頭であるためマッチします。

また、`\B`は単語境界以外にマッチします。
#### `(?=pattern)`: 先読み言明
先読み言明は、`pattern`部分が後ろに存在する場合にパターンに合致するよう指定できます。
パターンの条件には含まれますが、マッチ箇所の文字列にはそのパターンが含まれないようになります。

例えば、`/abc(?=d)/`とすると、`"abc"`はパターンに合致しませんが、`"abcd"`はパターンに合致します。
ただし、マッチ箇所の文字列は`"abc"`となり、先読み言明に含まれている`"d"`はマッチ箇所の文字列には含まれません。
```js
const regex = /abc(?=d)/

"abc".match(regex)    // null
"abcd".match(regex)   // ["abc"]
```


後方に`pattern`があるかどうか、先を読んでいるので「先読み」というわけですね。

#### `(?!pattern)`: 否定先読み言明
`(?=)`ではなく`(?!)`とすることで、先読み言明の否定を指定できます。

#### `(?<=pattern)`: 後読み言明
先読み言明では後方の文字が条件にあうかを確認していましたが、後読み言明では前方の文字が条件にあうかを確認します。
```js
const regex = /(?<=a)bcd/

"abc".match(regex)    // null
"abcd".match(regex)   // ["bcd"]
```

後読み言明はECMAScript 2018 (ES9) から使用可能です。


#### `(?<!pattern)`: 否定後読み言明
`(?<=)`ではなく`(?<!)`とすることで、後読み言明の否定を表します。

[^1]: 単語文字は`[A-Za-z0-9_]`でもあらわせます。
正規表現と繰り返しパターン

## はじめに
正規表現をつかうことで文字列を様々なパターンで検索したり置換することができます。
同じパターンが連続するようなケースでは、繰り返しパターンを使用するとより明瞭に書くことができます。

本記事では正規表現で使用できる繰り返しパターンの指定方法についてまとめます。

正規表現の文字クラスやフラグについては以下で扱っています。

https://qiita.com/axoloto210/items/7814c2ccd60ce3dbfe69

## 繰り返しパターン
`/\d\d\d-\d\d\d\d/`のように同じパターン`\d`が何度も出てくる際には、繰り返しパターンを使用して記述を簡略化できます。
`/\d\d\d-\d\d\d\d/`は、繰り返しパターンを使うと`/\d{3}-\d{4}/`のようにできます。

繰り返しパターンには以下のようなものがあります。
#### `{n, m}`
`{n, m}`は`n`回以上、m回以下の繰り返しを表します。

例えば、`/a{3,6}/`について例をみてみます。
```js
const regex = /a{3,6}/

"aaaa".match(regex) //["aaaa"] 
"aaaaaaa".match(regex) //["aaaaaa"] 

regex.test("aaa") //true
regex.test("aaaaaaa") //true
```

`/a{3,6}/`は、`a`が3回以上6回以下のなかで最長回数となる箇所にマッチするため、`"aaaa"`に対しては`"aaaa"`がそのままマッチし、`"aaaaaaa"`と`a`が7回続くケースでは6回分の繰り返しである`"aaaaaa"`にマッチすることになります。

7回以上続く場合にマッチしないわけではない点に注意が必要ですね。

#### `{n,}`
`{n,}`は`n`回以上の繰り返しを表します。

#### `{n}`
`{n}`は`n`回だけの繰り返しを表します。
`{n,n}`と同じものですね。

#### `*`
`*`は0回以上の繰り返しを表します。
`{0,}`と同じもので、より簡潔に記述できます。

#### `.`
`.`は1回以上の繰り返しを表します。
`{1,}`と同じものです。

#### `?`
`?`は0回以上1回以下の繰り返しを表します。
`{0,1}`と同じもので


### 貪欲な繰り返しパターン
正規表現では、マッチ箇所をみつけたあとにもパターンの規則を満たす限り、マッチ箇所の先の探索を続けます（greedyマッチング）。
パターンの規則に合致した箇所が複数ある場合には最も長い箇所にマッチします（最長一致）。

`/a{3,6}/`という正規表現では、`"aaaab"`を先頭の文字から確認していきます。
最初の3つの`"a"`だけでも`/a{3,6}/`のパターン規則を満たしますが、それに続く４つ目の`"a"`を含めた`"aaaa"`もパターン規則を満たします。
また、`"aaaab"`自体はパターン規則を満たさないため、パターンに合致した中で最長となる`"aaaa"`の部分がマッチすることになります。

### 非貪欲な繰り返しパターン
繰り返しパターンのあとに`?`をつけると最小一致によるマッチがなされます。
```js
const regex = /a{3,6}?/

"aaaa".match(regex) //["aaa"] 
"aaaaaaa".match(regex) //["aaa"] 

regex.test("aaa") //true
regex.test("aaaaaaa") //true
```

`?`については繰り返しパターンで使用していた記法`*`, `.`, `?`につけることも可能で、それぞれ`*?`, `.?`, `??`で最小一致によるマッチングが行えます。
RaycastのAIをRaycast以外から利用する

この記事はRaycast [Advent Calendar 2024](https://qiita.com/advent-calendar/2024/raycast)の15日目の記事です。  
14日目の記事は[tyki](https://zenn.dev/tyki)さんの「[Dynamic Placeholders で Raycast の力を引き出す 🏋🏻 🔥](https://zenn.dev/raycast_jp/articles/88d17f46c8c232)」でした。

Dynamic Placeholdersは使ったことがなかったので、使ってみます。

https://qiita.com/advent-calendar/2024/raycast

あらためて、こんにちは。せーじです。普段はWebやバックエンド、時々アプリの開発をしています。  
私は業務や私生活で日常的にRaycastを使っています。

最近、Raycast Proに課金しました。課金した↓経緯はこちらの記事から。

https://qiita.com/se_eiji/items/ca51a200a675b8c45574

$16/monthという、自分にしてはかなり高価なサブスクにチャレンジしましたが、後悔はなく、とても満足しています。

ただ、「せっかくお金払ってるならもっと使い倒したい」という欲が出てきました。人間とは欲深いものです。

そこで思ったのが、「RaycastのAIの機能をRaycastの外から使えると、 ~~もとが取れる~~ 色々便利になるのでは？」（もはやRaycast関係ないというツッコミはおいておいて...）

思ってしまったし、できるかとりあえず探っていたところ「[Raycast Port](https://www.raycast.com/litomore/raycast-port)」というextensionを見つけたので、この記事では、「Raycast Portでなにができるか？」を深掘っていきます。

:::note warn
Raycast Portの公開日は2024年12月8日と、公開されたばかりで、仕様の変更等が今後あるかもしれません。  
最新の情報はRaycastのStoreを通して確認してください。  
https://www.raycast.com/litomore/raycast-port
:::

---

# Raycast Port

「Raycast Port」は「Raycastの外からRaycastの機能を呼び出す」ことを目的に作成されています。
> This allows you to use Raycast features out of Raycast.  
> これにより、Raycast の外部で Raycast 機能を使用できるようになります。(日本語訳 via Raycast)

現状できることとしては、

1. スキーマを利用してraycastの機能を呼び出す
1. callBackに指定したurlをブラウザで開く
    1. このとき、raycastのAIに問い合わせた内容を `RAYCAST_PORT_AI_ANSWER` で参照できるみたい
```terminal
# terminalで実行できる、サンプル
deeplink="raycast://extensions/litomore/raycast-port/ai-ask?launchType=background&context=$(jq -rR @uri <<< '{"askPrompt": "hello", "callbackOpen": ["https://example.com/?answer=RAYCAST_PORT_AI_ANSWER"]}')"
open $deeplink
```

Raycast Portのソースコード↓

https://github.com/raycast/extensions/blob/06087ff404fb172966ab5f1012e068df4be3c38f/extensions/raycast-port/src/ai-ask.tsx

通信の構成図としてはこんな感じ

```mermaid
graph TD;
    RaycastPort-->RaycastAPI;
    RaycastAPI-->何かしらのAI;
    何かしらのAI-->RaycastAPI;
    RaycastAPI-->RaycastPort
    RaycastPort-->CallBack処理
```

ここで、CallBack処理はRaycastの「[callbackLaunchCommand](https://github.com/LitoMore/raycast-cross-extension-conventions#callbacklaunchcommandoptions-payload)」を利用していました。  
なので、CallBackにはurlを開く以外もRaycast別のextensionを立ち上げるなど、色々できるようです。

# 余談
私はまだ、RaycastのExtensionsを開発したことがなかったんですが、RaycastにはさまざまなAPIが用意されており、その一つにAIを利用できるAPIもありました。

とても使いやすそう。

https://developers.raycast.com/api-reference/ai

# おわりに
興味本位で深掘っていきましたが、RaycastのAPIの使いやすさとExtensionの作り方をはからず学べました。  
今のところ、自分で「こんな機能ないから、RaycastのExtensions作ろ！」という衝動は発生していませんが、「なんだか楽しそうだしちょっとやってみよ」という衝動には駆られました。

近々、Extensionsまわりの記事を執筆しようと思います。

最後までお読みいただき、ありがとうございました。
Spring Bootでデータベース(MySQLを使用したい)

今日はデータベースにあるデータをControllerで扱えるようにしました。
その備忘録です。

## step1 MySQLのインストール
公式のインストーラを用いてMySQLをインストールする。
rootパスワードを設定するタイミングがあり、データベースを扱う際に必要となるので覚えておく。

## step2 MySQLでデータベース作成
インストールが済んだらコマンドプロンプトから
~~~
    mysql -u root -p
~~~
のコマンドを打つことでroot(管理者)としてログインできる。

今回のappで使用するデータベースを作成します。
データベースは複数の表を格納するシステムのこと。
テーブルとごっちゃになってしまっていた。。。
作成するコマンドは下記の通り。
~~~
    CREATE DATABASE [データベース名];
~~~

rootのままデータベースをいじってもいいが、安全上の都合から新しいuserを作成して、そのuserからデータベース作業を行うことが望ましいよう。
そのため、新しいuserを作成し、先ほど作成したデータベースの作業を行うための権限を付与する。
~~~
    CREATE USER '[user名]'@'localhost' IDENTIFIED BY '[パスワード]'; //user作成
    GRANT ALL PRIVILEGES ON [データベース名].* TO '[user名]'@'localhost'; //全ての権限付与
~~~

## step3 MySQLで表を作成
先ほど作成したデータベースを使用するコマンドを入力した後、実際に表を作成していく。
ここからは実際に使用したコマンドをいくつかまとめる。
~~~
    USE [データベース名]; //databaseを使用する
~~~

表の作成
~~~
    CREATE TABLE [テーブル名] ([列名] [データ型] [制約]);
~~~

表の削除
~~~
    DROP TABLE [テーブル名];
~~~

表の確認
~~~
    SHOW TABLES;  //作成したtable一覧を表示
    DESCRIBE [テーブル名];  //表の詳細説明。列名など。
~~~

表の修正
~~~
    ALTER TABLE [テーブル名] ADD COLUMN [列名] [データ型] [制約]; //列の追加
    ALTER TABLE [テーブル名] MODIFY COLUMN [列名] [データ型] [制約] AFTER [既存列名]; //既存列名の後に列を追加
    //列を移動させる場合もこの書き方で、[データ型]なども再度入力
    
    ALTER TABLE [テーブル名] MODIFY COLUMN [列名] [データ型] [制約] FIRST; //1列目に追加

    ALTER TABLE [テーブル名] DROP COLUMN [列名];  //列の削除
~~~

行の追加、確認
~~~
    INSERT INTO [テーブル名]([列名]) VALUES ([実際の値]); //行の追加
    SELECT * FROM [テーブル名];  //追加したデータの確認
~~~

## step4 Javaプログラム側の設定
書くのが疲れたのでまた今度。
ブログ書いているエンジニアさんたちの凄さが分かる。。
執筆記事・発表


2025/1/16 Tabelog Tech Blog

https://tech-blog.tabelog.com/entry/wandb-meetup-report

2025/1/15 W&Bミートアップ#18で発表しました

https://wandb.connpass.com/event/340650/

2024/12/25 Tabelog Tech Blog

https://tech-blog.tabelog.com/entry/advent-calendar-20241224

2024/11/19 Tabelog Tech Blog

https://tech-blog.tabelog.com/entry/ai-menu-ocr

---

2023/6/26 Penmark Magazine

https://note.com/penmarkjp/n/n43c4fdb3ce74

2023/6/20 Penmark Magazine

https://note.com/penmarkjp/n/nd3423477332a

2022/9/9 Penmark Magazine

https://note.com/penmarkjp/n/n4d69756b5b2d
wslで入れたubuntuからnvidiaのgpuを使用する方法

# info

wslでいれたubuntuからnvidiaのgpuを使用する方法をまとめます
参考にしたサイトも載せます

ubuntu上にインストールするのか、windows上にインストールするのかが結構大事なので注意してください

# 設定方法

## 1. wslの設定

下記を(windowsの)PowerShellで実行するとubuntuがインストールされます
```
wsl --install
```

#### 参考
- https://learn.microsoft.com/ja-jp/windows/wsl/install


## 2. windowsにdockerのインストール

dockerをwindows側にインストールします

注意
- wsl上ではなくwindows上にインストール
- wslのチェックを入れておくこと
    - デフォルトで入っているので外さなければOK

### dockerのメモリの増設が必要な場合
windowsに`C:\ユーザー\ユーザー名\.wslconfig`を作成し中身は下記のようにすること

```
[wsl2]
memory=8GB
swap=0
```

ファイル作成後はwslを再起動する(pcの再起動でもOK)

#### 参考

- https://qiita.com/pyon141/items/35629ba27ad8a537e029

## 3. ubuntuからnvidiaを使用する設定

ubuntu上にnvidiaのtoolkitをインストールします

```
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda-repo-wsl-ubuntu-12-6-local_12.6.3-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-6-local_12.6.3-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-6
```

#### 参考
- https://learn.microsoft.com/ja-jp/windows/ai/directml/gpu-cuda-in-wsl
- https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local
- https://qiita.com/nabion/items/4c4d4d4119c8586cbd9e
- imageのversion
    - https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/index.html

## 4. 確認

実際にdockerからnvidiaのgpuを利用できるか確認する
ubunt上で

```
docker run --rm -it --gpus all nvcr.io/nvidia/pytorch:22.12-py3
```

実行するとdocker立ち上げ&シェルに入れます。その後下記を実行します
`true`が表示されればOKです

```
python
import torch
print(torch.cuda.is_available())
```


### docker composeで立ち上げる場合のサンプル

`nvcr.io/nvidia/pytorch:22.12-py3`のイメージを使用します。nvidiaのgpuを使用する設定がもろもろ入っているイメージです。
いろいろ汎用性を持たせたいので`nvcr.io/nvidia/pytorch:22.12-py3`のイメージを使用しないで立ち上げる方法を検討中です

docker-compose.yml
```
  python:
    restart: "no"
    tty: true
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=compute,utility
    build:
      context: ${CONTEXT_SRC}
      dockerfile: docker/local/python/Dockerfile
    runtime: nvidia # この記述がとても大事
    volumes:
      - ${CONTEXT_SRC}:/project
    networks:
      - shared-network
      - default
```

Dockerfile
```
# NVIDIAのPyTorchベースイメージを使用
FROM nvcr.io/nvidia/pytorch:22.12-py3

# 作業ディレクトリを指定
WORKDIR /project

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential \
    curl \
    git \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*
```
スコープとは

>スコープ
組み込み変数は文法解析上はグローバル変数として扱われます。しかし、実際のスコープは必ずしもグローバルとは限りません。

>組み込み変数には次の種類のスコープがありえます。

>グローバルスコープ
通常のグローバル変数と同じ大域的なスコープを持ちます。

>ローカルスコープ
通常のローカル変数と同じスコープを持ちます。つまり、 class 式本体やメソッド本体で行われた代入はその外側には影響しません。プログラム内のすべての場所において代入を行わずともアクセスできることを除いて、通常のローカル変数と同じです。

>スレッドローカルスコープ
スレッドごとの値を持ちます。他のスレッドで異なる値が割り当てられても影響しません。

>また、一部の変数は読み取り専用です。ユーザープログラムから変更することができません。代入しようとすると実行時に例外を生じます。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#class_var_scope:~:text=%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97,%E4%BB%A3%E5%85%A5%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%99%E3%82%8B%E3%81%A8%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E4%BE%8B%E5%A4%96%E3%82%92%E7%94%9F%E3%81%98%E3%81%BE%E3%81%99%E3%80%82,-%E6%93%AC%E4%BC%BC%E5%A4%89%E6%95%B0

>ローカル変数のスコープは、宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまでです。寿命もそのブロックの終りまで(トップレベルのローカル変数はプログラムの終了まで)ですが、例外としてブロックが手続きオブジェクト化された場合は、そのオブジェクトが消滅するまで存在します。同じスコープを参照する手続きオブジェクト間ではローカル変数は共有されます。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html#class_var_scope:~:text=%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0%E3%81%AE%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%AF%E3%80%81%E5%AE%A3%E8%A8%80%E3%81%97%E3%81%9F%E4%BD%8D%E7%BD%AE%E3%81%8B%E3%82%89%E3%81%9D%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%8C%E5%AE%A3%E8%A8%80%E3%81%95%E3%82%8C%E3%81%9F%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%80%81%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%AE%9A%E7%BE%A9%E3%80%81%E3%81%BE%E3%81%9F%E3%81%AF%E3%82%AF%E3%83%A9%E3%82%B9/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%AE%9A%E7%BE%A9%E3%81%AE%E7%B5%82%E3%82%8A%E3%81%BE%E3%81%A7%E3%81%A7%E3%81%99%E3%80%82%E5%AF%BF%E5%91%BD%E3%82%82%E3%81%9D%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E7%B5%82%E3%82%8A%E3%81%BE%E3%81%A7(%E3%83%88%E3%83%83%E3%83%97%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0%E3%81%AF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E7%B5%82%E4%BA%86%E3%81%BE%E3%81%A7)%E3%81%A7%E3%81%99%E3%81%8C%E3%80%81%E4%BE%8B%E5%A4%96%E3%81%A8%E3%81%97%E3%81%A6%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E6%89%8B%E7%B6%9A%E3%81%8D%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8C%E6%B6%88%E6%BB%85%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A7%E5%AD%98%E5%9C%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%90%8C%E3%81%98%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E6%89%8B%E7%B6%9A%E3%81%8D%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%93%E3%81%A7%E3%81%AF%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%A4%89%E6%95%B0%E3%81%AF%E5%85%B1%E6%9C%89%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82
ps aux & grep の使い方

# 目的
`ps aux` と `grep` を使って、あるプロセスが起動しているかどうかをチェックする。

# 方法
## 改善前
下記のように `grep` すると、`grep`コマンド自体のプロセスも検索されてしまう。
`grep -E "air"` というプロセス名が、`grep -E "air"` による検索に引っかかってしまうのである。厳密には、`grep --color=auto -E air`というプロセス名になっており、それが、`grep -E "air"` による検索に引っかかっている。
```
~/prashell$ ps aux | grep -E "air"
root      214089  0.0  0.0 1898556 14316 ?       Ssl  02:32   0:00 air -c .air.toml
yournam+  770002  0.0  0.0   4032  2092 pts/16   S+   14:06   0:00 grep --color=auto -E air
```
## 改善後
下記のように `grep` することで、`grep`コマンド自体のプロセスを検索に引っ掛けないことができる。
なぜなら、`grep -E "[a]ir"` というプロセス名は、`grep -E "[a]ir"`の検索には引っかからないからである。
```
~/prashell$ ps aux | grep -E "[a]ir"
root      214089  0.0  0.0 1898556 14316 ?       Ssl  02:32   0:00 air -c .air.toml
```
windowsのデスクトップPCでapple studio displayを使用する方法

# info

windowsのデスクトップPCでapple studio displayを使用する方法を共有します
参考になれば幸いです
調べると明るさの設定ができないと情報が出てきますが普通にできます

studio displayで
- カメラの使用
- マイクの使用
- スピーカーの使用
- 明るさの設定

を行うことができました


# 接続方法

## 必要なケーブル
下記のケーブルのみでokです
ちなみに2mの方だとうまく映らないです。画面がちかちかします。
3mの方だときれいに映ります

ケーブル
[windowsのデスクトップPCでapple studio displayを使用する方法](https://www.amazon.co.jp/dp/B0DJRBJFHR?ref=ppx_yo2ov_dt_b_fed_asin_title)

## 接続方法

下記の設定だけで
- カメラの使用
- マイクの使用
- スピーカーの使用

ができます


### pc側
pc側のdisplayportとusbAに差す
(usbAは5GB,10GBの両方試しましたが両方いけました)

###  studio display側
studio display側はサンダーボルトに差す


# 明るさ設定

microsoft storeのアプリをインストールするだけです

[Twinkle Tray: Brightness Slider](https://apps.microsoft.com/detail/9PLJWWSV01LK?hl=neutral&gl=JP&ocid=pdpshare)

# 補足

- おそらくpc側のdisplay portは1.4が必要そうな気がします。
- gpuのスペックによっても変わるかも？
- スリープから戻ると明るさ設定のアプリの反映まで数分かかります

# 参考文献
- https://www.youtube.com/watch?v=xBTsaJb5yi4

# 自分のpcの環境

- windows11 pro
- [詳細なスペック](https://jp.ext.hp.com/content/dam/jp-ext-hp-com/jp/ja/ec/lib/products/desktops/personal/spec_pdf/omen_35l_intel.pdf)
    ![スクリーンショット 2024-12-15 144918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115880/a5ccfa0f-7614-86fc-b70e-ff98394e11f0.png)
K8sにおけるIP/CIDR

# KubernetesにおけるIPアドレスとCIDRの概要

Kubernetes環境でのIPアドレスとCIDRの取り扱いについて、基礎的な概念と設計時のポイントを以下にまとめます。

---

## **IPアドレス**
### **概要**
- Kubernetesクラスター内では、各リソース（Pod、Service、Nodeなど）に**IPアドレス**が割り当てられます。
- IPアドレスは以下のように動的または静的に割り当てられます：
  - **Pod**: 動的に割り当てられる（クラスター内で一意のアドレス）。
  - **Service**: `ClusterIP`（内部用）や`LoadBalancer`（外部用）で固定的なアドレスが割り当てられる。
  - **Node**: クラスター外からアクセスするための外部IPまたは内部IP。

### **種類**
- **ClusterIP**: クラスター内部での通信に使用される仮想IP。
- **ExternalIP**: クラスター外部からの通信を受け付けるために利用。
- **Pod IP**: 各Podに動的に割り当てられるユニークなアドレス。

---

## **CIDR**
### **概要**
- CIDR（Classless Inter-Domain Routing）は、IPアドレスの範囲を表すための標準的な方式。
- フォーマット: `IPアドレス/プレフィックス長`（例: `192.168.0.0/24`）。
  - **IPアドレス部分**: 範囲の開始アドレス。
  - **プレフィックス長**: ネットワーク部分のビット数（残りがホスト部分）。

---

## **KubernetesにおけるCIDR設計**
### **仮想ネットワークのCIDR**
- Kubernetesのネットワーク（VNetやPodネットワーク）を定義する際、CIDRを使用してIPアドレス範囲を指定します。
- 例: `10.0.0.0/16`（65,536個のIPアドレスを利用可能）。
  - ネットワーク部分: `10.0`
  - ホスト部分: `0.0` - `255.255`

### **Pod CIDR**
- 各NodeがPodに割り当てるためのCIDR範囲。
  - 例: `/24`（256アドレス）など。
- Podごとに一意のIPが動的に割り当てられ、ネットワーク通信に使用されます。

### **Service CIDR**
- Service（ClusterIP）のIPアドレス範囲を指定。
- 例: `10.96.0.0/12`（デフォルト設定の場合）。

---

## **CIDRのサイズとIPアドレス数の計算**
- CIDRのプレフィックス長が短いほど範囲が広がり、利用可能なIPアドレス数が増加。
- IPアドレス数 = \( 2^{(32 - プレフィックス長)} \)。
  - `/16` → \( 2^{16} = 65,536 \) アドレス
  - `/24` → \( 2^{8} = 256 \) アドレス
  - `/28` → \( 2^{4} = 16 \) アドレス（予約IPを除くと14アドレス）

---

## **設計時のポイント**
1. **Pod CIDRとService CIDRを分離**
   - Pod CIDRとService CIDRが重複しないように設定。
   - 例:
     - Pod CIDR: `10.0.0.0/16`
     - Service CIDR: `10.96.0.0/12`

2. **IPアドレス枯渇の防止**
   - サブネット設計時に十分なIP範囲を確保。
   - 特にNode数やPod数が増加する場合を考慮。

3. **外部ネットワークとの統合を考慮**
   - VNetやオンプレミスのネットワークとの統合時、CIDR範囲が重複しないように設計。

4. **予約IPの考慮**
   - 各サブネットでは、以下のIPが予約され利用不可：
     - **ネットワークアドレス**: 範囲の最初のアドレス（例: `192.168.0.0`）。
     - **ブロードキャストアドレス**: 範囲の最後のアドレス（例: `192.168.0.255`）。
     - **クラウドプロバイダ予約IP**: 追加で3〜5個のアドレスが予約される（例: Azure）。

---

## **まとめ表: CIDRとIPアドレス数**

| **CIDR** | **ネットワーク部分** | **ホスト部分** | **利用可能IPアドレス数** |
|----------|---------------------|----------------|-------------------------|
| `/16`    | 16ビット            | 16ビット       | 65,534                 |
| `/24`    | 24ビット            | 8ビット        | 254                    |
| `/28`    | 28ビット            | 4ビット        | 14                     |
| `/30`    | 30ビット            | 2ビット        | 2                      |

---

KubernetesにおけるIPアドレスやCIDRは、ネットワーク設計の基盤を形成します。正確な計算とCIDRの割り当てにより、効率的でスケーラブルなネットワークを構築することが可能です。
matplotlibのエラー「normedは使えない」を解決する方法

Pythonでデータの可視化をする際、以下のようなエラーに遭遇しました。

```
AttributeError: Rectangle.set() got an unexpected keyword argument 'normed'
```

この記事では、このエラーの原因と解決方法をまとめました。

## エラーの原因

`matplotlib`では、バージョン2.1以降、ヒストグラムを作成する際の引数`normed`が廃止されました。その代わりに、`density`という新しい引数が導入されています。

そのため、古いコードで`normed=True`を指定している場合、このエラーが発生します。

## 修正方法

`normed`を`density`に置き換えるだけで解決しました。

### 修正前のコード

```python
import matplotlib.pyplot as plt

data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
plt.hist(data, bins=5, normed=True)  # 古いコード
plt.show()
```

### 修正後のコード

```python
import matplotlib.pyplot as plt

data = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
plt.hist(data, bins=5, density=True)  # 修正版
plt.show()
```

## バージョン確認方法

自分の`matplotlib`のバージョンを確認したい場合は、以下のコードを実行してください。

```python
import matplotlib
print(matplotlib.__version__)
```

もし古いバージョンを使っている場合は、以下のコマンドでアップデートすることをおすすめします。

```bash
pip install --upgrade matplotlib
```

## まとめ

このエラーは、`matplotlib`の仕様変更によるものです。コードを少し修正するだけで解決できるので、ぜひ試してみてください。

同じようなエラーに困っている方の参考になれば幸いです！
３層クライアントサーバシステムとWEB３層構造の違いについてまとめる

# ３層クライアントサーバシステムとは
プレゼンテーション層・ファンクション層(アプリケーション層)・データ層の３つに分けて構成するシステムのこと。

![IMG20241215141229_01~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/9c81a0f9-83ac-e9c0-ddc0-4d72fcab8879.jpeg)



# WEB3層構造
３層クライアントサーバシステムにWebサーバーが加わったもの。

![IMG20241215141223_01~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528926/9a24a3c5-5eb8-985c-ebcc-48a5176dd984.jpeg)


Webアプリケーションはユーザインターフェースとなるプレゼンテーション層（Webサーバーが担う）、業務処置を行うアプリケーション層（APサーバーが担う）、データ処理や保管を行うデータ層（DBサーバーが担う）の3層構造となっている


# プレゼンテーション層
プレゼンテーション層は、クライアントに静的なコンテンツを表示させるためのやり取りを行う層で、クライアントとWebサーバーから成ります。
クライアントとは、ユーザーが実際に操作するインターフェースで、Webブラウザやモバイルアプリなどを指します。
WebサーバーはWebブラウザからの閲覧要求（リクエスト）を処理して、要求されたコンテンツの情報を含んだレスポンスメッセージをクライアントに返します。静的なコンテンツ（htmlや画像ファイルなど）の場合はWebサーバーだけで完結します。一方で動的なコンテンツ（閲覧するユーザーによって処理や表示する画面が異なるもの）を含む場合は、アプリケーションサーバーに処理を要求し、処理の結果を受け取ってブラウザに表示する役割も担っています。

# アプリケーション層 
 アプリケーション層は、システムの中核となる動的処理を行います。アプリケーションサーバーは、Webサーバーからのリクエストを基にRuby、Go、PHPなどのプログラミング言語による処理を行い、動的コンテンツを生成します。必要であれば、データベースサーバーへの問い合わせや書き込みといったデータ処理を要求します。

# データベース層
データベース層は、アプリケーション層によって処理されたデータの保管・管理を行う層です。データベースサーバーは、SQLなどを用いてデータベースに照会し、データの抽出や登録、検索、更新、削除などの処理を実行します。そして、その結果をアプリケーションサーバーに返します。
 
# Webサーバーとアプリケーションサーバーを分離する理由
Webサーバーに対して、不特定多数から多く接続されることがある。その際にAPサーバーでリクエストを裁くと不十分な場合が多い。←まだ理解できていない

https://qiita.com/yCroma/items/e46476e2ac7c372bb2a3

# 参考

https://note.com/naru_pm_518/n/n9c657c4840f4
LLM系企業、研究者のTwitterリスト

LLMの開発競争が激しく、公式リリース以外にも公式Twitterアカウントや研究者の呟きに重要な発言が見られるため、リストにまとめ始めました（意外となく、ChatGPTにお願いしてもしっくりした表ができないので）。
トップの研究者よりも発言がアクティブな研究者がいるので、随時更新していきます！

|企業[^1]|役職|Twitterアカウント|備考|
|---|---|---|---|
|[OpenAI](https://openai.com/ja-JP/)|公式|[@OpenAI](https://x.com/OpenAI)|GPT, Sara
||CEO|[@sama](https://x.com/sama) Sam Altman||
||創設メンバー|[@woj_zaremba](https://x.com/woj_zaremba) Wojciech Zaremba||
|[Microsoft](https://www.microsoft.com/ja-JP/microsoft-365/copilot)|公式|Copilot専用のアカウントはない？|Copilot|
||CEO|[@satyanadella](https://x.com/satyanadella) Satya Nadella||
||Microsoft Research|[@MSFTResearch](https://x.com/MSFTResearch)||
|[Google/DeepMind](https://deepmind.google/)|公式|[@GoogleDeepMind](https://x.com/GoogleDeepMind)|Gemini|
||DeepMind CEO|[@demishassabis](https://x.com/demishassabis) Demis Hassabis||
||Research Scientist|[@seb_ruder](https://x.com/seb_ruder)||
||Gemini App Team|[@GeminiApp](https://x.com/GeminiApp)||
||GoogleのAIチーム|[@GoogleAI](https://x.com/GoogleAI)||
|[Perplexity](https://www.perplexity.ai/ja/hub)|公式|[@perplexity_ai](https://x.com/perplexity_ai)||
||CEO|[@AravSrinivas](https://x.com/AravSrinivas) Aravind Srinivas||
|[Anthropic](https://www.anthropic.com/)|公式|[@AnthropicAI](https://x.com/AnthropicAI)|Claude|
||CEO|[@DarioAmodei](https://x.com/DarioAmodei) Dario Amodei||
||Reverse engineering neural networks|[@ch402](https://x.com/ch402) Chris Olah||
|[MistralAI](https://mistral.ai/)|公式|[@MistralAI](https://x.com/MistralAI)|
||Head of Developer Relations|[@sophiamyang](https://x.com/sophiamyang) Sophia Yang, Ph.D.||
|[Meta](https://ai.meta.com/)|公式|[@AIatMeta](https://x.com/AIatMeta)||
||Chief AI Scientis|[@ylecun](https://x.com/ylecun) Yann LeCun||
|[SakanaAI](https://sakana.ai/blog/)|公式|[@SakanaAILabs](https://x.com/SakanaAILabs)||
||CEO|[@hardmaru](https://x.com/hardmaru) David Ha||
||CTO|[@YesThisIsLion](https://x.com/YesThisIsLion) Llion Jones|Twitter公式マークがないが@SakanaAILabsが引用RTしている|
|[X](https://x.ai/)|公式|[@grok](https://x.com/grok)|Grok|
|[Nexusflow](https://nexusflow.ai/)|公式|[@NexusflowX](https://x.com/NexusflowX)|Athene|
||CEO|[@JiantaoJ](https://x.com/JiantaoJ) Jiantao Jiao|Twitter公式マークがないが@NexusflowXが引用RTしている|
|[Alibaba](https://x.com/Alibaba_Qwen)|公式|[@Alibaba_Qwen](https://x.com/Alibaba_Qwen)|Qwen|
|[Baidu](https://intl.cloud.baidu.com/)|公式|[@Baidu_Inc](https://x.com/Baidu_Inc)|Ernie|
||Former head of Baidu AI Group|[@andrewyng](https://x.com/andrewyng) Andrew Ng|Coursera共同創設者他|
|[Preferred Networks](https://www.preferred.jp/ja/)|公式|[@PreferredNetJP](https://x.com/PreferredNetJP)|PLaMo|
||共同創設者|[@hillbig](https://x.com/hillbig) 岡野原 大輔||
|[HuggingFace](https://huggingface.co/)|公式|[@huggingface](https://x.com/huggingface)|LLMプラットフォーム|
||CTO|[@Thom_Wolf](https://x.com/Thom_Wolf) Thomas Wolf||
|その他|元OpenAI創設メンバー。AlexNet共同研究者|[@ilyasut](https://x.com/ilyasut)|[^2]|
||元OpenAI創設メンバー|[@karpathy](https://x.com/karpathy) Andrej Karpathy||
---
- [ChatBot Arena](https://lmarena.ai/)
    - LLMの性能比較

[^1]: 組織の公式サイトは必ずしも企業公式ではなく、LLMに関するニュースリリースや技術ブログサイトとしている
[^2]: ilya氏が同僚に、最新のAIを知りたいならこの論文を読んどけと言ったとされる論文リスト
    - https://x.com/chrisbotica/status/1784194077681930444
DiscordBOTの特権インテントを取りたいとゆー話

# 特権インテントを取りたいーーーーーー！！！！
こいつね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/5c0e57f7-4ad5-289c-7d91-f13b893102ac.png)

BOTが75サーバー以上になるまでは自由に使えるんですが、超えたら申請して取らないといけません。
(このインテントがなくても大丈夫なBOTであれば必要ないですが)申請しないと100サーバー以上への導入ができなくなります。
なんでこれをさっさともらいたいなと。

# 各インテント
それぞれ簡単にゆーとこんな感じ。

- **PRESENCE INTENT**
ユーザーのステータス、アクティビティとかを取得するのに必要
- **SERVER MEMBERS INTENT**
サーバー内のメンバーの情報の取得に必要
- **MESSAGE CONTENT INTENT**
送信されたメッセージを受け取るのに必要

今回取りたいのは下2個。なのでこれに絞って説明します。
1番上もあったらいいけど別にいらないので。

# 取り方
まずここに移動
```
https://discord.com/developers/applications/BOTのID/bot
```
そしたらこんなのがでてくるので**Apply**を押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/8a1ed485-7c25-fc97-362f-f02f8207b952.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/d8301f78-a1c1-0d58-4611-40075c082879.png)

## 各項目説明
- Application Details
その名の通りこのBOTの説明書くところ。
コマンドの実行動画やスクリーンショットがないと通らないので注意
- Privileged Gateway Intents
ここでは必要な特権インテントを選択する。
いらないのはつけないようにしましょう

あとは特権インテントが欲しい理由を書くところ。

## 特権インテントの取得には何がいるか
1・このインテントが必要である理由(なるたけ詳しく)
2・そのインテントが必要なものを実際に実行しているスクリーンショット、動画
3・各項目の質問の回答

## 何かけば通りやすいのか
実は送るときに書いた機能は一時的に実装して貰えたら消しても問題ないです((
なのでいい感じのをポジティブな部分だけを盛りに盛って書けばいいんです。
あと英語じゃなくていいです。日本語で書いても普通に対応してもらえます。
実際に申請したときに使った機能を紹介しますー

・**MESSAGE CONTENT INTENT**
これはAIチャット機能でもらいました
一時的でいいのでGeminiとかの無料Tokenを使ってAIチャット機能を実装しました。
自動翻訳機能とかでも通るんじゃないかな。
申請理由のところはこんなかんじで書いてた気がする
```
AIチャットを使うことで新しい技術に簡単に触れることができます。
またメンバーの少ない場所でも話し相手になってくれます。
このAI機能を使用するためにはこのインテントが必要です
```

・**SERVER MEMBERS INTENT**
これは入室/退出の通知機能で取りました。
`guildMemberAdd`と`guildMemberRemove`ですね
画像とかじゃなくて普通にEmbedでとれました。
申請理由のところはこんな感じで書いてた気がする
```
入室/退出の通知機能にこのインテントが必要です。
これを実装することで入室したメンバーのアバターや名前などを簡単に知れるので仲良くなりやすいです。
```
書き終わったらsubmitを押して終わりです。
# メールの確認
自分のアカウントに登録しているメールアドレスでお知らせされます。
これが来てたらとりあえずちゃんと送れてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/f66cbc10-ecfe-207b-2e16-f833b3bc9108.png)

申請結果の連絡はこれで送られてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/0e38f235-7d7e-edf7-4da6-412292e45da2.png)
申請が成功するとこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/f20d642a-454a-d99b-2a60-d7b3e8af782f.png)

失敗するとこうなります。こうなってたら再申請してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/a4b55460-5c7a-19b2-23a4-e058d5af1f05.png)

:::note warn
**注意**
これの返信が届くまでにはそこそこ時間がかかります。
なかなか返ってこないからといって何回も送りつけてると最後に回されて更に遅くなります。
丸一日経っても返ってこなければUntitled ticketに返信して申請お願いしますって言いましょう
:::

# まとめ
今回は特権インテントを取ろうぜという話でした。
あると機能の幅も広がるのでぜひいいBOTにしてください(？)
私の作っているくまのみBOTの導入よかったら..
https://discord.com/oauth2/authorize?client_id=1298829009907355730
私流・ペンギンくんを描く

## はじめに
　いまやblogbooksのマスコットキャラクター――ではないものの、レンジ商会とかいう一宗教の教祖として祭り上げられている冷凍ご飯ことレンジペンギンくん。そこで、今日、ペンギンくんの誠に勝手なイメージの描き方を~~商会~~紹介したいとおもいます。
※本人の許可は得ています。
 ## 手順
 まず、楕円形を描きます。逆卵みたいにすると良いかも知れない。
 ![Screenshot_2024-12-15-13-32-09-748_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/cf2cebaa-98c1-d1ed-ebad-529a9c38a223.jpeg)

次に、耳となるものを描きます。適当でかまいません。
![Screenshot_2024-12-15-13-32-15-335_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/a271bcf0-e57f-e1a9-5d8d-2172935a4d08.jpeg)

描いた両耳の上同士をつなぐように、曲線を描きます。
![Screenshot_2024-12-15-13-32-19-872_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/6eaa692b-4c23-11c6-aa39-d7841497cfd8.jpeg)

ペンギンぽくしていきます。模様（？）を入れます。
![Screenshot_2024-12-15-13-32-42-440_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/97f5184e-6774-601d-b767-cc248c2564c8.jpeg)

くちばしを描きます。三角形かひし型が望ましいです。別にどうでもいいです。
![Screenshot_2024-12-15-13-32-53-691_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/d8de5c9f-35f4-8cf3-e10b-69e09ad24939.jpeg)

目を描き込みます。適当でかまいません。ですが、このとき、目を真っ黒に塗りつぶすと不気味になるのでハイライトとして白い部分を残しましょう。
![Screenshot_2024-12-15-13-33-10-850_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/7c1ccf48-514e-8d41-fbb2-28f298015ce6.jpeg)

本体の顔を描き込みます。まじで適当でいいです。なんでもいいです。
![Screenshot_2024-12-15-13-33-43-255_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/0f87a08a-9374-2631-d6ab-8a48b803a732.jpeg)

首と襟を描きます。ワイシャツをイメージします。
![Screenshot_2024-12-15-13-34-41-488_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/1f1ee697-c83c-3458-58df-01ea2a30203f.jpeg)

ネクタイを締めさせます。っぽく見えればおｋ
![Screenshot_2024-12-15-13-34-48-444_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/ce0b7f5e-f336-bbb5-78dc-c429d2eb431f.jpeg)

適当に体を描きます。
![Screenshot_2024-12-15-13-35-10-005_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/f2d881b7-63c4-8b9b-c27a-6970514771a6.jpeg)

ペンギン帽子の模様部分を黒く塗って、適当に髪の毛を生やします。
![Screenshot_2024-12-15-13-36-34-157_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/3e39e8a1-a929-4c0b-9cf9-f93e549174a1.jpeg)

くちばしを黄色く、ネクタイを青く塗ります。
![Screenshot_2024-12-15-13-36-48-246_jp.ne.ibis.ibispaintx.app.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/dacde13e-ceca-ad39-af4b-ca4813d05f71.jpeg)
## 完成
![無題79 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/3104cf52-f251-6114-eab8-c01c10e4bca6.png)

ぜひみなさんも描いてみてください。
今回私はibispaintを使用しましたが紙で描いてくださってかまいません。くちばしとネクタイは色を塗らなくてもかまいません。ありがとうございました。


![無題79.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3946508/69f6a270-1ba1-272d-9457-3df93c36e6d2.png)