OmniAICreator/Qiita-1.07M huggingface dataset:
Spring + Jeresyでエラーがすべて404になる

# はじめに

Spring BootとJerseyでできたアプリケーションがエラーハンドリングで問題が起きていたのでまとめます

# 問題

Spring BootとJerseyでAPIを作成したのですが、なぜか内部エラー(500)がすべて404になってしまっていました

```kotlin
class JerseyConfig : ResourceConfig() {
    init {
(省略)
        register(RuntimeExceptionMapper::class.java)
        register(NotFoundExceptionMapper::class.java)
        register(QueryParamExceptionMapper::class.java)
        register(BadRequestExceptionMapper::class.java)
    }
}
```

Jerseyではエラーハンドリングを初期設定しています
このエラーハンドリングを消すとちゃんと500エラーが返ってくるようになりましたが、以下のエラーが出ました

```
request url is /error
```

なぜか内部でエラーページを返そうとしていました

# 解決方法

```kotlin
@SpringBootApplication
@EnableAutoConfiguration(
    exclude = [DataSourceAutoConfiguration::class, DataSourceTransactionManagerAutoConfiguration::class, JpaRepositoriesAutoConfiguration::class]
    exclude = [
        (省略)
        ErrorMvcAutoConfiguration::class // 追加
    ]
```

どうもJerseyではエラーガでるとページをデフォルトで返すようでこれが問題になっていました
そもそもSpirng MVCでなく、Spring Boot restを使っていればJerseyを使わないで済むのでそっちのほうがよさそうです

# おわりに

Spring Bootは本当に魔法が多くて難しいなと毎度思います
CREATE TABLE ～ AS SELECT ～; にてテーブル作成したら、忘れずに主キーを設定すること

## 結論

```sql
/** 例えば schema_a.table_a をこんな風に作ったとする **/
CREATE TABLE schema_a.table_a AS
SELECT
  row_number() over () AS rid,
  B.foo AS b_foo,
  B.bar AS b_bar,
  ～
FROM schema_b.table_b AS B
WHERE ～
GROUP BY ～
ORDER BY ～
;
/** 既存テーブルへの主キー制約の追加 **/
ALTER TABLE schema_a.table_a ADD PRIMARY KEY (rid);
```

## 余談

### 主キー制約の名称も自分でつけたい

```sql
/** 既存テーブルへの主キー制約の追加（名称指定） **/
ALTER TABLE schema_a.table_a 
ADD CONSTRAINT pkey_table_a PRIMARY KEY (rid);
```

`ADD PRIMARY KEY`
が
`ADD CONSTRAINT pkey_table_a PRIMARY KEY`
に変わる
CONSTRAINT pkey_table_a が制約名を指定する箇所

### CREATE TABLE AS ～ SELECT ～; するとカラムの型がbigint(int8)とかtextとかになる

カラムのデータ型をマメに指定したくなりますよね
先に`CREATE TABLE`してから、`INSERT INTO ～ SELECT ～`した方がいいですね

## 参考
PostgreSQL 14.5文書 [ALTER TABLE](https://www.postgresql.jp/document/14/html/sql-altertable.html)
robloxでassistant その106

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
ColorCorrectionEffectを、使え。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。

```
local colorCorrection = Instance.new("ColorCorrectionEffect")
colorCorrection.Enabled = true
colorCorrection.TintColor = Color3.fromRGB(255, 135, 108)
colorCorrection.Parent = workspace.CurrentCamera


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/51f7d762-a407-2635-258f-bb0e0e9f57d0.png)

以上。
【VSCode】settings.json設定メモ

いつも忘れてしまうので、Visual Studio Codeでよく設定する項目をメモしておく。
※随時、更新していきます。

## settings.jsonの開き方
- Macの場合、`command + ,`
- Windowsの場合、`Ctrl + ,`

## ユーザ設定
どの環境でも共通で設定する項目。

### 常に新しいタブでファイルを開く
```settings.json
"workbench.editor.enablePreview": false
```
### ファイル保存時に自動でコードフォーマット
```settings.json
"editor.formatOnSave": true
```

## ワークスペース設定
ワークスペース固有に設定する項目。

### コードフォーマッターをPrettierにする。

```settings.json
"editor.defaultFormatter": "esbenp.prettier-vscode"
```
※VSCodeの「Prettier - Code formatter」プラグインをインストールしている前提。
Blazor ServerでTimerを使った連続処理

# System.Timers.Timer を使ってカウントアップし続けるサンプル
Timerのサンプルコードでタイマーで走らせるメソッドを分離したパターンのサンプルが見つからなかったのでこちらに投稿したいと思います。



## 1.コード側の記述
まずHTML側に表示するカウンター用変数とタイマークラスを用意します。
```c#:SamplePage.razor
@code {
    private int i = 0;
    private System.Timers.Timer? timer;
}
```
次にカウンター変数をインクリメントするメソッドを作ります。非同期処理なのでStateHasChanged()で再描画の通知が必要です。
```c#:SamplePage.razor
@code {
    //以下を追記
    
    private async void TimerElapsed(object? sender, System.Timers.ElapsedEventArgs e)
    {
        //直接UIに非同期で記述
        await InvokeAsync(() =>
        {
            i++;
            StateHasChanged(); //非同期なので再描画通知
        });
    }

}
```

ページが開いた瞬間からカウントアップするようにします。
```c#:SamplePage.razor
@code {
    //以下を追記
    
    //ページが開くときに発動するメソッド
    protected override void OnInitialized()
    {
        base.OnInitialized(); //基底クラスの初期化
        timer = new System.Timers.Timer(10); //10mSec毎に発動するタイマーを生成。
        timer.Elapsed += TimerElapsed; //タイマーにメソッド登録
        timer.Start();
    }
}
```

## 2.HTML側の記述
HTML側はカウンター変数iを記述しているだけです。
```c#:SamplePage.razor
@page "/samplepage"

<h3>SamplePage</h3>
<p>@i.ToString()</p>
```

以上でTimerを使ったシンプルなカウントアップサンプルができました。

## 3.ボタンを使ってカウンターを止めたり再起動したり＋α
ボタンをつけてカウンターを止めたり、終了時にインスタンス廃棄する処理も追加し、ソースを全て表示したものが以下となります。

```c#:SamplePage.razor
@page "/samplepage"

<h3>SamplePage</h3>
<p>@i.ToString()</p>

<button class="btn btn-light" @onclick = "Click">
    
    @if(timer != null)
    {
        @if (timer.Enabled)
        {
            <div>停止</div>
        }
        else
        {
            <div>作動</div>
        }
    }

</button>



@code {
    private int i = 0;
    private System.Timers.Timer? timer;
    private async void TimerElapsed(object? sender, System.Timers.ElapsedEventArgs e)
    {
        //直接UIに非同期で記述
        await InvokeAsync(() =>
        {
            i++;
            StateHasChanged(); //非同期なので再描画通知
        });
    }
    
    //ページが開くときに発動するメソッド
    protected override void OnInitialized()
    {
        base.OnInitialized(); //基底クラスの初期化
        timer = new System.Timers.Timer(10); //10mSec毎に発動するタイマーを生成。
        timer.Elapsed += TimerElapsed; //タイマーにメソッド登録
        timer.Start();
    }


    //タイマーつけたり止めたり
    private void Click()
    {
        if (timer.Enabled)
        {
            timer.Stop();
        }
        else
        {
            timer.Start();
        }
    }



    //ページ廃棄されたときにインスタンス廃棄
    public void Dispose()
    {
        timer?.Dispose();
    }
}
```

以上となります。お目汚し失礼しました。
DjangoでCMSを実装する

# DjangoでCMSを実装する
DjangoにCMS（コンテンツ管理システム）機能を追加しようと思った際に調べた内容を記載しています。


## 目次
- [目次](#目次)
- [1. Django CMSの利用](#1-django-cmsの利用)
  - [インストール手順](#インストール手順)
- [2. Wagtailの利用](#2-wagtailの利用)
  - [インストール手順](#インストール手順-1)
- [3. Mezzanineの利用](#3-mezzanineの利用)
  - [インストール手順](#インストール手順-2)
- [4. カスタムCMSの構築](#4-カスタムcmsの構築)
  - [基本的な構成](#基本的な構成)
- [まとめ](#まとめ)

## 1. Django CMSの利用

[Django CMS](https://www.django-cms.org/en/)は、Django用のオープンソースのCMSで、コンテンツの管理が容易で強力な機能を提供します。

### インストール手順

1. Django CMSをインストール

```sh
pip install djangocms-installer
```

2. プロジェクトを作成

```sh
djangocms mysite
```

3. データベースの設定とマイグレーションを実行

```sh
python manage.py migrate
```

4. サーバーを起動

```sh
python manage.py runserver
```

## 2. Wagtailの利用

[Wagtail](https://wagtail.io/)は、DjangoベースのオープンソースCMSで、美しい管理インターフェースと強力な機能を提供します。

### インストール手順

1. Wagtailをインストール

```sh
pip install wagtail
```

2. プロジェクトを作成

```sh
wagtail start mysite
cd mysite
```

3. 必要な依存関係をインストール

```sh
pip install -r requirements.txt
```

4. データベースの設定とマイグレーションを実行

```sh
python manage.py migrate
```

5. 管理ユーザーを作成

```sh
python manage.py createsuperuser
```

6. サーバーを起動

```sh
python manage.py runserver
```

## 3. Mezzanineの利用

[Mezzanine](http://mezzanine.jupo.org/)は、DjangoベースのCMSで、シンプルかつ柔軟な管理インターフェースを提供します。

### インストール手順

1. Mezzanineをインストール

```sh
pip install mezzanine
```

2. プロジェクトを作成

```sh
mezzanine-project mysite
cd mysite
```

3. 必要な依存関係をインストール

```sh
pip install -r requirements.txt
```

4. データベースの設定とマイグレーションを実行

```sh
python manage.py migrate
```

5. 管理ユーザーを作成

```sh
python manage.py createsuperuser
```

6. サーバーを起動

```sh
python manage.py runserver
```

## 4. カスタムCMSの構築

既存のCMSが提供する機能では不足する場合、自分でCMS機能を構築することも可能です。

### 基本的な構成

1. **モデルの作成**

```python
from django.db import models

class Page(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    slug = models.SlugField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
```

2. **ビューの作成**

```python
from django.shortcuts import render, get_object_or_404
from .models import Page

def page_detail(request, slug):
    page = get_object_or_404(Page, slug=slug)
    return render(request, 'page_detail.html', {'page': page})
```

3. **URLの設定**

```python
from django.urls import path
from . import views

urlpatterns = [
    path('<slug:slug>/', views.page_detail, name='page_detail'),
]
```

4. **テンプレートの作成**

`page_detail.html`という名前でテンプレートを作成します。

```html
<!DOCTYPE html>
<html>
<head>
    <title>{{ page.title }}</title>
</head>
<body>
    <h1>{{ page.title }}</h1>
    <div>{{ page.content }}</div>
</body>
</html>
```

## まとめ

DjangoにCMS機能を追加する方法として、Django CMS、Wagtail、Mezzanineといった既存のCMSを利用する方法と、自分でカスタムCMSを構築する方法があります。どの方法を選ぶかは、プロジェクトの要件や目的に応じて決定すると良いでしょう。既存のCMSは多くの機能を提供し、迅速にCMS機能を追加するのに適していますが、特定の要件に応じた柔軟なカスタマイズが必要な場合は、カスタムCMSの構築も検討してください。

## CMSの比較の記事
https://qiita.com/saka2jp/items/5ec4ef7a5615b3c2e9ac
MacでDjangoとPostgresqlを接続する

## MacでDjangoとPostgresqlを接続する
MacOSでDjangoプロジェクトでPostgreSQLを使用するための設定とインストール方法について説明します。

### 1. PostgreSQLのインストール

#### Homebrewのインストール

Homebrewがインストールされていない場合、以下のコマンドをターミナルで実行してインストールします。

```sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

#### PostgreSQLのインストール

Homebrewを使ってPostgreSQLをインストールします。

```sh
brew install postgresql
```

### 2. PostgreSQLの起動と設定

#### PostgreSQLの起動

PostgreSQLサービスを起動します。

```sh
brew services start postgresql
```

#### データベースとユーザーの作成

以下のコマンドを使ってPostgreSQLに接続します。

```sh
psql postgres
```

次に、以下のSQLコマンドを実行して、データベースとユーザーを作成します。

```sql
CREATE DATABASE mydatabase;
CREATE USER myuser WITH PASSWORD 'mypassword';
ALTER ROLE myuser SET client_encoding TO 'utf8';
ALTER ROLE myuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
```

`mydatabase`、`myuser`、および`mypassword`は任意の名前に変更してください。

### 3. Djangoプロジェクトの設定

#### PostgreSQL用のパッケージのインストール

DjangoがPostgreSQLに接続できるようにするために、`psycopg2`パッケージをインストールします。

```sh
pip install psycopg2-binary
```

#### `settings.py`の編集

Djangoプロジェクトの`settings.py`ファイルを開き、データベース設定を以下のように変更します。

```python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}
```

### 4. マイグレーションの実行

データベースの設定が完了したら、マイグレーションを実行してDjangoのデータベーススキーマを作成します。

```sh
python manage.py migrate
```

これでDjangoプロジェクトがPostgreSQLを使用するように設定されました。`python manage.py runserver`を実行して、正常に動作することを確認してください。

### 5. トラブルシューティング

もし何らかのエラーが発生した場合、以下の点を確認してください。

1. PostgreSQLが正しく起動しているか: `brew services list`で確認できます。
2. データベース名、ユーザー名、パスワードが正しいか: `psql`にログインして確認できます。
3. `psycopg2-binary`パッケージが正しくインストールされているか: `pip list`で確認できます。

これでMacOS上でDjangoプロジェクトをPostgreSQLと連携させるための設定は完了です。

### 6. HomebrewでインストールしたPostgreSQLのバックグランド実行を停止する
```sh
brew services stop postgresql
```
これにより、PostgreSQLサービスが停止し、バックグラウンドでの実行が切られます。
毎日ABC day14【c++】ABC332 A-C問題解説【ACコード付き】

# AtCoder Beginner Contest 332

https://atcoder.jp/contests/abc332

## A - Online Shopping

商品が $N$ 個あり、それぞれ価格 $P_{i}$ の商品を $Q_{i}$ 個購入する。購入した金額が $S$ 円以下の場合、 $K$ 円の送料がかかる。最終的に支払う金額はいくらか。

商品の合計について足し合わせ、送料がかかる場合かを判定して出力する。

```cpp
int N, S, K;
int P[109];
int Q[109];

int main()
{
	cin >> N >> S >> K;
	int total_price = 0;
	for (int i = 1; i <= N; i++)
	{
		cin >> P[i] >> Q[i];
		total_price += P[i] * Q[i];
	}
	if (total_price < S) total_price += K;
	cout << total_price << endl;
	return 0;
}
```

## B - Glass and Mug
容量が 
$G$ ml のグラスと、容量が 
$M$ ml のマグカップがある。以下の操作を $K$ 回行った後、それぞれ何mlずつ水が入っているか。

  - グラスが満たされていたら全部捨てる
  - グラス満タンでなく、マグカップが空だったらマグを水で満たす。
  - どちらでもない時は、マグが空になるかグラス満タンになるまでマグからグラスへ水を移動する。

```cpp
int K, G, M;

int main()
{
	cin >> K >> G >> M;
	int c_grass = 0;
	int c_mag = 0;
	for (int i = 1; i <= K; i++)
	{
		if (c_grass == G) c_grass = 0;
		else if (c_mag == 0) c_mag = M;
		else
		{
			if (G - c_grass <= c_mag)
			{
				c_mag -= G - c_grass;
				c_grass = G;
			}
			else
			{
				c_grass += c_mag;
				c_mag = 0;
			}
		}
	}
	cout << c_grass << " " << c_mag << endl;
	return 0;
}
```

## C - T-shirts

$N$ 日間、以下の3種類の予定がある時、最低何枚のロゴTシャツを持っていないといけないか。無地Tは $M$ 枚所持している。

 - ロゴTか無地Tを着る日
 - ロゴTを着る日
 - Tシャツを着ずに全て洗濯して再度着れる状態にする日

3つ目の洗濯の日に全てリセットされること、1つ目の`ロゴTか無地Tを着る日`は優先して無地Tを着ることを気をつけていれば大丈夫。

```cpp
int N, M;
string S;

int main()
{
	cin >> N >> M >> S;
	int num_muji = M;
	int num_logo = 0;
	int ans = 0;
	for (int i = 0; i < N; i++)
	{
		if (S[i] == '0')
		{
			num_muji = M;
			num_logo = 0;
		}
		else if (S[i] == '1')
		{
			if (num_muji > 0) num_muji--;
			else num_logo++;
		}
		else num_logo++;
		ans = max(ans, num_logo);
	}
	cout << ans << endl;
	return 0;
}
```
AWSでKubernetes The Hard Wayをやってみた

# 概要
https://github.com/kelseyhightower/kubernetes-the-hard-way
2024/4/6に約3年ぶりのアップデートがあった。
以前はGCP環境が前提の手順となっていたが、そのアップデートでクラウドプロバイダ問わずの手順に変わっていたのでAWS環境で実践してみた。

なおOSは`Debian 12 (bookworm)`が前提となっていたが、わずかでも独自性を出すべく`Amazon Linux 2023`を使用している。

# 結果
手順が十分以上に整備されていることもあり、完走するだけならほぼコマンドをコピペするだけで事足りた。
そのため過程について記述することは特段なかったが、備忘のため2点だけ注意点を書き残す。

## ①`configs/encryption-config.yaml`が存在しない
2024/6/6時点では`configs/encryption-config.yaml`が`.gitignore`によって無視される対象に含まれてしまっている。
そのため内容をリポジトリから探し出して手作業で作成する必要があった。

[Issue](https://github.com/kelseyhightower/kubernetes-the-hard-way/issues/768)でも既に取り上げられていて[PR](https://github.com/kelseyhightower/kubernetes-the-hard-way/pull/780)も上がっているので遠からず修正されるとは思う。

## ②iptablesが入っていない
手順中でiptablesが必要になるが、Amazon Linux 2023(2023.4.20240513)では初期状態でインストールされてない模様。
追加でiptables(iptables-nft)をインストールする必要があった。
Vim 9.1 patchダイジェスト (2024/04)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([9.1.0229](https://github.com/vim/vim/commit/b64cec217f3434a089a5677d265bfbc21367e98b) ～ [9.1.0384](https://github.com/vim/vim/commit/83d3b3b8a444349a13c4d9091afc6a3de252afa8))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**
runtimeファイルも直接commitされるようになりました。ただ、数が多いので基本的にはここでは取り扱わないことにします。

* [9.1.0381](https://github.com/vim/vim/commit/652c821366691a8bd5474766581090df0c742fa1): :four_leaf_clover:`:cbuffer`, `:lbuffer`, `:cgetbuffer`, `:lgetbuffer`, `:caddbuffer`, `:laddbuffer` に範囲指定(`1,$`等)をサポートしました。
* [runtime(comment)](https://github.com/vim/vim/commit/5400a5d4269874fe4f1c35dfdd3c039ea17dfd62): :four_leaf_clover:シンプルなコメントトグルプラグインを同梱しました。(関連post: [X(旧twitter)](https://x.com/h_east/status/1795118125060366579))
* [9.1.0329](https://github.com/vim/vim/commit/f01493c55062c01b1cdf9b1e946577f4d1bdddf3): :four_leaf_clover:辞書型の文字列補完(interpolated-string)をサポートしました。(関連patch: [9.1.0335](https://github.com/vim/vim/commit/bce51d9005dd1c5bc002acbac2e12b649abcb013))
* [9.1.0327](https://github.com/vim/vim/commit/c9df1fb35a1866901c32df37dd39c8b39dbdb64a): :four_leaf_clover:Unix: [XDGベースディレクトリ仕様](https://specifications.freedesktop.org/basedir-spec/latest/)をサポートしました (`$XDG_CONFIG_HOME`のみ)。`$HOME/.vimrc` および `$HOME/.vim/vimrc` が見つからない場合に、`$XDG_CONFIG_HOME/vim/vimrc`を参照します。(関連patch: [9.1.0330](https://github.com/vim/vim/commit/f23193496589553d986e0f5c2a6170485c1bccea), [9.1.0337](https://github.com/vim/vim/commit/d1068a2bb09fd3b9d117d832105bf10dd5e48e2f), [9.1.0345](https://github.com/vim/vim/commit/a34ba821076476a68e0e579723d68e896f771ba6), [9.1.0393](https://github.com/vim/vim/commit/c3e6e393cbd0ee171001d75fc2310070da81b657))
* [9.1.0321](https://github.com/vim/vim/commit/49528da8a60f8fd38ca491d6ccec47dfccf5f23c): :four_leaf_clover:termcapオプション `'t_xo'` を追加しました。このオプションが空でない場合は、端末は xon/xoff ハンドシェイクを使用しフロー制御をおこないます。(関連patch: [9.1.0384](https://github.com/vim/vim/commit/83d3b3b8a444349a13c4d9091afc6a3de252afa8))
* [9.1.0314](https://github.com/vim/vim/commit/c51578fed8f21cf3c1ff72bbb599dca2db02be84): Vim9: クラス内で関数が定義できてしまっていた件を修正しました。
* [9.1.0312](https://github.com/vim/vim/commit/e74cad3321ce1dcefc1fc64f617511275b6cd930): :four_leaf_clover:`:command`ブロック内のheredocをサポートしました。(関連patch: [9.1.0313](https://github.com/vim/vim/commit/1f5175d9af3d3f37e19f23e0e6f84caec47390f2))
* [9.1.0277](https://github.com/vim/vim/commit/be2b03c6eecea3eae5d460e3c19ee43b73b29928): :four_leaf_clover:ハイライトグループ`MsgArea`を追加しました。コマンドラインのハイライトを設定します。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
LAMP環境とは？

アシスタントのChatGPTに聞いてみた🗣️


LAMP環境とは？


LAMPは、Webアプリケーションを開発するための一般的な環境を示す用語です。

Linux：
オペレーティングシステムの一種であり、サーバー環境として広く使用されています。Linuxはオープンソースであり、多くの場合、サーバー環境のベースとして選択されます。


Apache：
オープンソースのWebサーバーソフトウェアです。Apacheは非常に広く使用されており、WebサイトやWebアプリケーションをホストするために使用されます。


MySQL：
オープンソースのリレーショナルデータベース管理システム（RDBMS）です。MySQLはデータベースを管理し、Webアプリケーションとのデータのやり取りを可能にします。


PHP：
サーバーサイドのプログラミング言語であり、動的なWebページの作成に広く使用されています。PHPはApacheと組み合わせて使用されることが多く、MySQLなどのデータベースと連携してWebアプリケーションを構築します。


これらの要素を組み合わせることで、LAMP環境が構築されます。LAMP環境は、Web開発やWebアプリケーションの開発において非常に一般的であり、多くのウェブサイトやアプリケーションがこの環境で動作しています。


なるほど👤
マイナンバー

誤り及び訂正箇所等がございましたらコメント欄にてご教授をお願いします。
![Screenshot_20240606-053339~3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809353/645fca0c-0137-44ff-7bef-020da095aadf.png)
Version1.0
robloxでassistant その105

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、時計を作れ。

# 手順
- ReplicatedFirstに、LocalScriptを追加。
- スクリプトを書く。

```

local part = Instance.new("Part", workspace)
part.Size = Vector3.new(4, 2, 1)
part.CFrame = CFrame.new(-3,  3, -3) * CFrame.Angles(0, math.rad(180), 0)
part.Anchored = true
local gui = Instance.new("SurfaceGui", part)
gui.CanvasSize = Vector2.new(100, 100)
local Label = Instance.new("TextLabel", gui)
Label.Size = UDim2.new(1, 0, 1, 0)
Label.Text = os.date("%H:%M")
Label.TextSize = 30
Label.TextColor3 = Color3.new(1, 0, 0)

while true do
	Label.Text = os.date("%H:%M")
	wait(10)
end


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8ca717b5-08f4-0ad1-4d49-f6dc1c02ce6a.png)


以上。
クリニックミナトでのソフトウェアエンジニアとしての経験

クリニックミナトでのソフトウェアエンジニアとしてのキャリアは、技術的なスキルだけでなく、医疗業界の深い理解を要求するものです。この記事では、私の経験と直面した課題、およびそれに対する解決策について詳しく説明します。

## 主な課題とその解決策
1. セキュリティ問題

課題: 医療データは極めて機密性が高く、保護が必須です。しかし、サイバー攻撃は日々進化しており、防御が困難になっています。

解決策: [クリニックミナトでは](https://www.clinicminato.com/) 、エンドツーエンドの暗号化技術を利用してデータのセキュリティを確保。また、従業員に対する定期的なセキュリティ研修を実施し、意識の向上を図っています。

![clinicminato.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809340/61aae7cd-7ac4-777d-9af6-126cc98e2197.png)
参照: https://www.clinicminato.com/


2. システムの高可用性の維持

課題: 医療機関においてシステムダウンは命に関わる問題を引き起こす可能性があります。高い可用性の維持は、技術的にも経営的にも大きな挑戦です。

解決策: 当社では、冗長性を持たせたシステムアーキテクチャを採用しており、一部のコンポーネントが故障しても全体のシステムが停止することがないようにしています。また、リアルタイムでのバックアップと障害復旧計画を定期的にテストし、準備を怠らないよう努めています。

3. 技術の迅速な進化に対応する

課題: テクノロジーの進化は非常に速く、最新の技術を追い続けることが求められます。

解決策: クリニックミナトでは、技術トレーニングとプロフェッショナル開発の機会を積極的に提供し、エンジニアが最新の技術スキルを習得できるよう支援しています。さらに、定期的な技術レビューを行い、過去の技術から新しい技術へのスムーズな移行を促進しています。

## 結論

クリニックミナトでのソフトウェアエンジニアとしての経験は、技術的な課題だけでなく、それを通じて社会に貢献する機会を提供してくれます。私たちの努力が直接的に人々の健康を支え、生命を救うことにつながるのです。これは、この職業のもっとも報いのある部分であり、日々のモチベーションとなっています。

この記事が、医療業界でのソフトウェアエンジニアリングのキャリアに興味を持つ方々にとって有益な情報源となれば幸いです。
LINE Notify ハンズオン

# はじめに
手軽にLINEへPush通知を行えるLINE Notifyのハンズオン記事です。
APIの実行方法はcurl、Node.js、Arduinoの3通りの方法を紹介します。



# ハンズオン

**トークン発行**と**API実行**の2つのステップで進めていきます。



## トークン発行
[LINE Notifyページ](https://notify-bot.line.me/ja/)へアクセスし画面右上の「ログイン」をクリックし、ログインします。
（QRコードログインが楽です）

https://notify-bot.line.me/ja/

![image](https://gist.github.com/assets/22117028/c8076aee-5b53-4624-8db2-e47b93b9b41e)
<br>



ログイン後にアカウント名をクリックし、表示されるメニューより「マイページ」を選択します。

![image](https://gist.github.com/assets/22117028/8c26d0c6-8964-4598-bbb0-839c3faa6d9b)
<br>



マイページ下部の「アクセストークンの発行」より「トークンを発行する」ボタンをクリックします。

![image](https://gist.github.com/assets/22117028/bb15542e-e870-4562-857d-6cd89964eb4e)
<br>



「トークンを発行する」ウィンドウが表示されるので、任意のトークン名を入力し、通知を送信するトークルームにて「1:1でLINE Notifyから通知を受け取る」を選択し、「発行する」ボタンをクリックします。

:::note info
複数のメンバーがいるトークルームを選択することもできます。
:::

![image](https://gist.github.com/assets/22117028/16203951-70e8-4987-874a-5a2fc6fef954)
<br>



トークンが発行されるのでコピーします。

:::note warn
トークンはこのタイミングでしか確認できないので、しっかりとコピーしてください。
:::

![image](https://gist.github.com/assets/22117028/9ee1954e-7b6b-4c28-9019-312bee33735f)
<br>



## APIの実行

### curl
以下のcurlコマンドの <token> をLINE Notifyトークンに書き換えて実行するとLINEへ通知が飛びます。

```sh
$ curl -X POST -H "Authorization: Bearer <token>" -F "message=Hello Notify!" https://notify-api.line.me/api/notify
{"status":200,"message":"ok"}
```



### Node.js
:::note warn
Node.js v18以上の環境を使用してください。
:::

以下のソース1行目の<tokne>をLINE Notifyトークンに書き換え、`line-notify.mjs`というファイル名で保存します。

```js: line-notify.mjs
const TOKEN = "<token>"



const notify = async (token, message) => {
    const URL = "https://notify-api.line.me/api/notify"
    
    const response = await fetch(URL, {
        method: "POST",
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Authorization": "Bearer " + token,
        },
        body: "message=" + message,
    })
    
    const data = await response.json()
    console.log(data)
}



notify(TOKEN, "Hello Notify!")
```

そして以下のコマンドを実行するとLINEへ通知が飛びます。

```sh
node line-notify.mjs
```



### Arduino
:::note warn
M5StackやESP32といったWi-Fi付きのマイコンを使用してください。
:::

`SSID`、`PASSWORD`をデバイスが接続するWi-Fi APのものに変更し、`TOKEN`をLINE Notifyトークンに書き換えてスケッチをデバイスへ書き込みます。
スケッチ書き込み後、デバイスが電源オンになるとLINEへ通知が飛びます。

```cpp: line-notify.ino
#include <HTTPClient.h>

const char* SSID = "<Wi-Fi SSID>";
const char* PASSWORD = "<Wi-Fi Password>";

const char* TOKEN = "<token>";



void connectWiFi() {
    Serial.print("WiFi connecting.");
    WiFi.begin(SSID, PASSWORD);
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(100);
    }
}

void notify(const String token, const String message) {
    const String URL = "https://notify-api.line.me/api/notify";
    
    HTTPClient http;
    http.begin(URL);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    http.addHeader("Authorization", "Bearer " + token);
    http.POST("message=" + message);
    
    Serial.println(http.getString());
    http.end();
}



void setup() {
    Serial.begin(115200);
    
    connectWiFi();
    
    notify(TOKEN, "Hello Notify!");
}

void loop() {
    
}
```



LINE Notifyハンズオンは以上です。
お疲れ様でした🎊
2024/6/6主にITとかセキュリティの記事

Check Point機器の脆弱性、当初発表よりも影響大 - 国内で多数機器が稼働
https://www.security-next.com/157909

「Azure」のファイアウォールにルール回避のおそれ - MSは仕様と説明
https://www.security-next.com/157922

不正アクセスで個人情報が流出、スパム送信も - アイザワ証券子会社
https://www.security-next.com/157918

米当局、「Oracle WebLogic Server」の脆弱性狙う攻撃に注意喚起
https://www.security-next.com/157905

シャープや東芝テックの複合機に複数脆弱性
https://www.security-next.com/157954

サーバに不正アクセス、個人情報流出の可能性 - 元旦ビューティ工業
https://www.security-next.com/157824

「Node.js」向けMySQLクライアントにプロトタイプ汚染の脆弱性
https://www.security-next.com/157933

「ドローンセキュリティガイド第5版」を公開 - セキュアドローン協議会
https://www.security-next.com/157925

CPU使用率急上昇やログ消失　監査に起因するトラブルと対策(6/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/121200393/060300007/

Google CloudがユーザーのITインフラを誤削除、企業が採りうる対策を有識者に聞く(6/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00001/09361/

IT企業への転職者、定額減税が住民税に反映されているか知りたいが分からない(6/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00084/00320/

安全性が低いネットワークに無理やり誘導、全ての無線LAN機器を脅かす脆弱性(6/5)
https://xtech.nikkei.com/atcl/nxt/column/18/00676/053000168/

NECが大阪万博に顔認証システム導入、入場や決済の利便性向上狙う(6/5)
https://xtech.nikkei.com/atcl/nxt/news/24/00844/

デジサートがIoTセキュリティーの管理ツールを発表、耐量子暗号にも対応(6/4)
https://xtech.nikkei.com/atcl/nxt/news/24/00919/

育成プログラムを社外に展開し共創　ビジネス創出に必要な4ステップ 住友生命保険(6/5)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/040400413/060300003/
Cloudflare Pages のデプロイに Deno を使う

## 概要

Cloudflare Pages のデプロイ時のビルドコマンドではプリインストールされているツールは設定無しで利用することができ、利用可能なツールは[このページ](https://developers.cloudflare.com/pages/configuration/language-support-and-tools/) から確認 できます。npm や pnpm, pip などが最初から入っていますが、誠に遺憾なことに Deno は最初から入っていません (Bun は入ってるのに……)。そのため Deno の場合は少し特殊な設定をする必要があります。

## ビルドコマンドの指定

Deno の SSG フレームワークである [Lume](https://lume.land/) の [ドキュメントから引用](https://lume.land/docs/advanced/deployment/#cloudflare-pages) ですが、次のワンライナーをビルドコマンドに指定すればよいです。

```sh
curl -fsSL https://deno.land/x/install/install.sh | sh && /opt/buildhome/.deno/bin/deno task build
```
Power AutomateでPDFからテキストを抽出する


Power AutomateのクラウドフローでPDFファイルから中身のテキストを抽出してみます。

encodianを利用すると簡単でした。

https://qiita.com/n0bisuke/items/e7b3edab458ae222f04b

PDFの作り方にもよりますが、元々がWordで作られていてPDF出力したパターンのPDFであればencodianを使って変換できました。

## 1. PDFをWordに変換 (PDF => Word)

PDFからテキストを取りたいですが、そのまま取れるアクションがなさそうだったので一度PDFをWordに変換します。

`PDFをWordに変換する`アクションを利用します。

ファイル名のところに`new_output.docx`など新規作成するWordファイルのファイル名を指定します。

> ![](https://i.gyazo.com/4c6719609b8c7a6749081bec70eba36d.png)

## 2. Wordからテキストを取得（Word => テキスト）

次に`Wordからテキストを取得する`アクションを利用します。

> ![](https://i.gyazo.com/2765d802d172be776fedeb718c7b808e.png)

変換されたWordファイルの中身を指定します。これでOK。

ちなみに、この辺はこちらの記事でも試していました。

https://qiita.com/n0bisuke/items/e7b3edab458ae222f04b

## 結果

こんな感じでWordからテキストを取得できました。

> ![](https://i.gyazo.com/84583a099f3f5b25fd6d5d112d6541b7.png)

```json
{
  "text": "【東京夜カフェ】 イベント スケジュール\r\n\r日 時\r\r令和６年２月２２日（木） １9：15～21：00\r\r会 場\r\r移住・交流ガーデン（JOIN 内）※会場\rゲスト プロトアウトスタジオ菅原のびすけさん\r\n\r参加費\r\r無料\r\r対応者\r\r定住戦略室：\r\n地域おこし協力隊：xxx \r【全日程】\r\n１８：45 １５分 ‐現地到着及び会場準備\r\n1９：00～ 15 分 -受付開始\r\n19：15 10 分 -栗原から来た皆様の自己紹介（名前/仕事/趣味？）\r\n‐栗原市の紹介\r\n（定住チーム ）\r\n19：25 5０分 -菅原のびすけさんのプレゼン\r\n（菅原のびすけさん）\r\n20：15 10 分 ‐質疑応答\r\n（菅原のびすけさん）\r\n20：25 ５分 ‐参加者自己紹介\r\n20：30 10 分 ‐フリートーク\r\n（残り時\r\n間）\r\n\r\n\r\r\n\r\n\r\n20：4０ 10 分 -アンケート\r\n20：50 参加者お見送り及び片付け\r\n21：００ 解散\r\n",
  "HttpStatusCode": 200,
  "HttpStatusMessage": "",
  "OperationId": "b708c458-5bc9-4684-950f-80c9d1d4e86d\\1",
  "Errors": [],
  "OperationStatus": "Complete"
}
```

encodian便利ですね...!無料トライアルで試してましたが有料版はそこそこ値段するみたいです。
ちゃんとやる方は各自課金などお願いします〜〜！

> ![](https://i.gyazo.com/2e4fd80afdf8ecea560f74bb7f22c842.png)
S3 + CloudFrontでびっくりするぐらい詰まった話

## やりたいこと
1. 静的サイトの公開
1. S3URLからのアクセス拒否⇒ClaudFrontを通過しないアクセスは拒否する
1. privateフォルダの作成と認証をつける

## 何が起こったか

手順としては、主に次の流れで行いました

1. S3の新規作成
    1. 静的ホスティングに必要な設定を行う
    1. S3URLでアクセスが可能か確認
1. CloudFrontとS3の連携
    1. 静的ホスティングURLを利用して連携を行う
    1. ポリシーの設定
    1. S3からのアクセスが403になることを確認
    1. ClaudFrontからのアクセスが通ることを確認⇦ `403でアクセスが拒否される`

## 原因
ClaudFrontでアクセス制御を行う場合は、そもそも静的ホスティングを行わないようだ。

https://dev.classmethod.jp/articles/amazon-cloudfront-origin-access-control/#toc-4

最終的に、こちらの記事を参考にした。

## 注意点
:::note warn
ACLは無効
:::

:::note warn
Block Public Accessはすべて有効
:::

## まとめ
S3で公開する場合は静的ホスティング設定が必須と勘違いしていたため、時間がかかってしまった。
この備忘録がどなたかの助けになれば幸いです。

## 追記

https://qiita.com/rihib/items/c0a3e142615df73a46f1

あるあるではあるが、方法が分かった瞬間詳細な説明の記事が見つかったため備忘録として残しておく
US配列のPCからJIS配列のPCにリモートデスクトップしたときのキーマッピング問題

# はじめに
US配列のMacから、ChromeリモートデスクトップでJIS配列のWindowsに接続するとキーマッピングが違うので面倒だった。windowsの方はJIS配列で使っているのでosの設定でその都度変えるのは面倒（変更の度に再起動が必要なため）。
Chrome リモートデスクトップの設定からキー操作を送信できるが、面倒。karabinerでキーマッピング書き換えることもできるが、json作るの面倒。どうしたものか...(怠惰の極み)

# 解決策
ULE4JISをリモート先のwindowsに入れる
- Win側がUS配列の入力を受け付けるので、US配列のMacのキー入力がそのまま入力として使える！
- Win側のJIS/USの切り替えもタスクバーから簡単に行えるので便利！

https://github.com/dezz/ULE4JIS/tree/master/publish

## 環境
環境は以下の通りだが、win(US)->win(JIS)や他のリモートデスクトップアプリを使った場合も有効であると思われる
- macbook air(リモート接続元)
- windows 11(リモート接続先)
- Chrome Remote Desktop(リモートアプリ)
Node16 + Nuxt2で@nuxtjs/i18nをインストールするとエラーが発生した

# 前提
* Node：16.13.2
* Nuxt.js：2.15.8
* Vue.js：2.7.10
* yarn：1.22.15

# エラーについて
下記のようにインストールしようとしたところエラーが発生しました。
```sh
$ yarn add @nuxtjs/i18n
yarn add v1.22.15
[1/4] Resolving packages...
[2/4] Fetching packages...
error globby@14.0.1: The engine "node" is incompatible with this module. Expected version ">=18". Got "16.13.2"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
```
`globby@14.0.1`というパッケージがNode18以上でないといけないようです。ちなみに何回かコマンドを実行していると下記のようにエラー文が変わり`@intlify/h3@0.5.0`がNode18以上でないといけないと表示されることもあります。

```sh
$ yarn add @nuxtjs/i18n
yarn add v1.22.15
[1/4] Resolving packages...
[2/4] Fetching packages...
error @intlify/h3@0.5.0: The engine "node" is incompatible with this module. Expected version ">= 18". Got "16.13.2"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
```

# 解決方法
Node16では`@nuxtjs/i18n`の新しいバージョンが使えなそうなので、バージョンを指定してインストールしてみました。
```sh
$ yarn add @nuxtjs/i18n@7.3
yarn add v1.22.15
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
warning "nuxt > @nuxt/components@2.2.1" has unmet peer dependency "consola@*".
warning "@nuxtjs/vuetify > sass-loader@10.4.1" has unmet peer dependency "webpack@^4.36.0 || ^5.0.0".
warning "@nuxtjs/vuetify > vuetify-loader@1.9.2" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 1 new dependency.
info Direct dependencies
└─ @nuxtjs/i18n@7.3.1
info All dependencies
└─ @nuxtjs/i18n@7.3.1
Done in 50.86s.
```

ちなみにバージョン8を指定するとエラーが発生しました。詳細には調べていないですが、バージョン7系以下が使える感じですかね。
```sh
yarn add @nuxtjs/i18n@8
yarn add v1.22.15
[1/4] Resolving packages...
[2/4] Fetching packages...
error @intlify/h3@0.5.0: The engine "node" is incompatible with this module. Expected version ">= 18". Got "16.13.2"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.
```

以上です。
気を取り直してgpt-4oについて

## gpt-4oの従来のモデルに比べて優れている点

現時点で利用可能な部分に的を絞ってgpt-4o従来のモデルより優れている点についての記事を書きます。

### トーカーナイザーの効率化

gpt-4は長いことOpenAIの言語モデルに使われてきたトークン化の方法であるBPA（バイトペアエンコード）の方法のうち、cl100k_baseと呼ばれるものを使用してきました。

このトーカーナイザーはgpt-3.5-turboからgpt-4、gpt-4-turbo、gpt-4-turbo-visitionに至るまで使われてきたトーカーナイザーです。
そのトーカナイザーがgpt-4oでは"o200k_base"といわれるもの変更されました。
"o200k_base"は"cl100k_base"に比べて、1トークンでより長い文字数を表現するため同じ文字数の日本語の文章でも短いトークン数で済むようになり、結果として安価に利用でき計算資源の節約にも繋がっているというわけです。

### トークン化について

言語モデルは文章をトークンといわれる断片に分割して処理しています。
日本語の場合、伝統的に形態素解析の手法が使用されてきました。
ChaSenやMeCab、JUMANなど日本語を自然言語処理する上では形態素といわれる最小単位に分割して処理されています。
MS-IMEやATOKなどのかな漢字変換システムも形態素解析の手法を用いて、文章を分割しています。
ただ、この形態素解析の手法は日本語だけに通用するもので多言語に対応したOpenAIの言語モデルのようなものでは使えません。

そこで様々な言語に対応するトーカーナイザーとして、バイトペアエンコーダーが使用されるようになりました。

### トークン化の手法の変更

例えば上記の「言語モデルは文章をトークンといわれる断片に分割して処理しています。」を"cl100k_base"でトークン化すると以下のように表現されます。

[78244, 45918, 252, 2845, 95, 68408, 33710, 15682, 83125, 30512, 20251, 11972, 29220, 16073, 19732, 16995, 78183, 33121, 30369, 64889, 35818, 20230, 17620, 21403, 110, 39926, 12870, 99, 22649, 39926, 61689, 1811]

一方で"o200k_base"を使い同じ文字列をトークンにエンコードすると、以下のようになります。
[17765, 40909, 187451, 5205, 26474, 7277, 5662, 77764, 4025, 5330, 3826, 147416, 6996, 30406, 4810, 5280, 2957, 67361, 22440, 158556, 5584, 124871, 788]

トークンの数が少なくなっている事が分かります。もちろん全ての場合においてトークン数が減るとは限りません。
また、言語によってトークン数が平均してどの程度減少するかはばらつきがあります。

今回のトーカーナイザーの変更でトークン数が最も減少した言語は、**グジャラート語**だそうです。
初めて聞いた言語です・・・
グジャラート語では、従来のトーカーナイザーと比べ4.4分の1のトークン数で済むようになったそうです。

肝心な日本語はというと、1.4分の1で済むようになったそうです。
これは中国語と同じくらいでドイツ語や英語よりは多くの恩恵を受けています。

トークン数が少なくて済めばその分計算も速くて済み、レスポンスも短くて済むという話しです。

日本語に限っていえば、従来のOpenAIのモデルと比較して学習データにより多くのデータセットが含まれるようになったようで、英語から日本語、日本語から英語への翻訳などで自然な訳出が出来るようになっています。

一方で、中国語のような利用できるデータセットが限られている言語や少数話者の言語では別の問題が生じていますが。。。

マルチモーダリティーに関しては、そもそもGPT-4の登場の時点でマルチモーダルなモデルであるというアナウンスがあった経緯や、現時点では音声を直接受取り音声で返すといった音声データにおけるマルチモーダルな性質は利用できないことも考えるとあまり印象深いものではありません（私にとってはですが）。

同じモデルが処理しているかどうか外部からは観察できない以上、マルチモーダルなモデルといわれてもちょっと反応に困ります（MoEのような複合モデルが内部で処理しているとしたらそれってマルチモーダルではないような？）。

今時点では波乱含みのスタートのgpt-4oですが、今後の更なる機能の展開でより便利に使えるようになることを願っています（もっと願っているのは国産の言語モデルの開発が今以上に進んでくれることですが・・・）。
Next.jsがReact19に対応したので、Formのベストプラクティスを考えてみた。

# `react-hook-form`を使う

```react
use client;
import {useForm, FieldValues} "react-hook-form"

export const Page = () => {
    const {register, handleSubmit} = useForm();
    
    const postToApi = async (fields:FieldValues) => {
        ....
    }
    
    return (
    <form onSubmit={handleSubmit(postToApi)}>
        <label>お名前</label>
        <input type="text" {...register("username")}/>
        <button>送信</button>
    </form>
    )
}

export default Page;
```

# `action`を使う(個人的にはこれがベストプラクティス)
```react
use client;

export const Page = () => {    
    const postToApi = async (fields:FormData) => {
        ....
    }
    
    return (
    <form action={postToApi}>
        <label>お名前</label>
        <input type="text" name="username"/>
        <button>送信</button>
    </form>
    )
}

export default Page;
```

# `useState`を使う(記事ではよく見かけるがどうなんだろ..)

```react
use client;
import {useState} from "react"

export const Page = () => {    

    const [username, setUsername] = useState<string>("");

    const postToApi = async () => {
        const parms = {
            username: username,
            ...
        }
        ....
    }
    
    return (
    <form>
        <label>お名前</label>
        <input type="text" value={username} onChange={(e) => setUsername(e.target.value)}/>
        <button type="button" onClick={postToApi}>送信</button>
    </form>
    )
}

export default Page;
```
Power Automateでエクセルから複数行の情報を取得したい


Power Automateのクラウドフローで複数行を取得したいケースのやり方です。

## 1. 複数行の取得

### 行の取得では複数行とれない

`行の取得`アクションは1行しか取ることができず、`表内に存在する行を一覧表示`を使う必要があります。


> ![スクリーンショット 2024-06-06 0.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/fbb7180b-38c4-e927-ba28-22c6c4697616.png "スクリーンショット 2024-06-06 0.54.45.png")

### ODATAクエリ

そのまま検索できそうですが、ODATAクエリを指定してねと言われます。

https://learn.microsoft.com/ja-jp/dynamics365/fin-ops-core/dev-itpro/data-entities/odata

https://qiita.com/tfunakoshi/items/431396098e1d877d0788


なんだろうって感じですが、シンプルな使い方だと`列名 eq '検索したい文字'`みたいな指定をすれば良さそうです。

こんなテーブルでコード`1111`の2行を取得したい場合、`コード eq '1111'`で良いみたいです。

> ![スクリーンショット 2024-06-06 0.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/5a69db46-17db-b15c-e2fc-0dae893e7197.png "スクリーンショット 2024-06-06 0.59.25.png")

こんな感じです。

> ![](https://i.gyazo.com/cc0f31777b78aa0d7874e32c317e78a4.png)

### 実行と確認

出力を見るとしっかり2行分のデータが取れてました。

> ![スクリーンショット 2024-06-06 1.00.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/08a51806-cf0f-8e50-b1f5-ec726596eaac.png "スクリーンショット 2024-06-06 1.00.18.png")

一旦ここまででOKと言えばOK。

## 2. 文字列を取得したい

こんな感じで配列で取得できている状態です。

```json
[
    {
      "@odata.etag": "",
      "ItemInternalId": "xxxxxxxx-xxxxxxxxxxxxx",
      "コード": "1111",
      "ファイルパス": "https://hogehoge.com/aaaaa"
    },
    {
      "@odata.etag": "",
      "ItemInternalId": "xxxxxxxx-xxxxxxxxxxxxx",
      "コード": "1111",
      "ファイルパス": "https://hogehoge.com/bbbbb"
    }
]
```

この中からファイルパスにある`https://hogehoge.com/aaaaa`と`https://hogehoge.com/bbbbb`を抜き出して利用したいです。

### アクション: 変数を初期化する

配列から文字列を抜き出して格納する箱としてString型の変数を定義します。

変数の初期化をします。

- Name: `出力する文字列` (任意の文字列でなんでも)
- Type: `String`

> ![](https://i.gyazo.com/def654d5f1b1d59a1cbf4a180ae64c4d.png)

### アクション（ループ処理）: それぞれに適用する

`それぞれに適用する`というアクションを追加します。環境によっては`Apply to each`という表示かもしれません。

`Select An Output From previous Steps`の箇所にエクセルから取得した`body/value`を設定します。

> ![](https://i.gyazo.com/05890171243860b1d61a9335a211ce4c.png)

これで配列のそれぞれの要素の個数分ループ処理が発生します。

### アクション: 文字列変数に追加

ループ内で`文字列変数に追加`を設定します。

- Name: `出力する文字列`
- Value: （エクセルから抜き出したデータを扱いやすいように設定)

> ![](https://i.gyazo.com/cfaa9b3b04774fbe14e75209742841fd.png)

### （アクション: どこかに投稿など）

最後に`出力する文字列`の変数には色々とテキストが入っているのでTeamsなどに投稿しましょう。

画像ではTeamsに投稿させてみていますが、なんでもOKです。

> ![](https://i.gyazo.com/f756a7cbd568b051e8ccc8c63b149f6b.png)

こんな感じで投稿されました。

> ![](https://i.gyazo.com/bc742de555a41e830ea2de4e481832a3.png)

## まとめ

意外と複数行になると処理が多くなりますが落ち着いてやればいけそうですね。
cargo install が通らない

# 起こった問題

intel macで、spotify-tuiやevcxr_jupyterをinstallしようと思ったらエラーが出た。下のエラーはspotify-tuiのものだけど、evcxr_jupyterでもほぼ同じエラーがでた。

```
error: failed to run custom build command for `slab v0.4.9`

Caused by:
  process didn't exit successfully: `/var/folders/62/0sg6zx7s1k300g9mgy_z34rc0000gn/T/cargo-installVO4DD6/release/build/slab-c6cf3c38167b30da/build-script-build` (signal: 9, SIGKILL: kill)
warning: build failed, waiting for other jobs to finish...
error: failed to run custom build command for `proc-macro2 v1.0.85`

Caused by:
  process didn't exit successfully: `/var/folders/62/0sg6zx7s1k300g9mgy_z34rc0000gn/T/cargo-installVO4DD6/release/build/proc-macro2-cafeadadbf3212d9/build-script-build` (signal: 9, SIGKILL: kill)
error: failed to run custom build command for `proc-macro2 v0.4.30`

Caused by:
  process didn't exit successfully: `/var/folders/62/0sg6zx7s1k300g9mgy_z34rc0000gn/T/cargo-installVO4DD6/release/build/proc-macro2-884607e92c38728a/build-script-build` (signal: 9, SIGKILL: kill)
error: failed to run custom build command for `syn v1.0.109`

Caused by:
  process didn't exit successfully: `/var/folders/62/0sg6zx7s1k300g9mgy_z34rc0000gn/T/cargo-installVO4DD6/release/build/syn-6fc95c86ff5427c2/build-script-build` (signal: 6, SIGABRT: process abort signal)
  --- stderr
  dyld[43888]: section __got overflows indirect symbol table
error: failed to run custom build command for `libc v0.2.155`

Caused by:
  process didn't exit successfully: `/var/folders/62/0sg6zx7s1k300g9mgy_z34rc0000gn/T/cargo-installVO4DD6/release/build/libc-a009542d493b35e3/build-script-build` (signal: 6, SIGABRT: process abort signal)
  --- stderr
  dyld[43890]: section __got overflows indirect symbol table
error: failed to compile `spotify-tui v0.25.0`, intermediate artifacts can be found at `/var/folders/62/0sg6zx7s1k300g9mgy_z34rc0000gn/T/cargo-installVO4DD6`.
To reuse those artifacts with a future compilation, set the environment variable `CARGO_TARGET_DIR` to that path.
```


# 解決法

Homebrewのgccを入れていたからっぽい。
`~/.cargo/config.toml`を作成して、以下を記入。

```toml
[target.x86_64-apple-darwin]
linker = "gcc-13"
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

[build]
target = "x86_64-apple-darwin"
```

gccのバージョン（上記だと13）は適宜変える。
これでうまくbuildが通った。
山奥SEOの検索アルゴリズム教えます プログラミング言語yamaoku-seoで解説！

この記事ではプログラミング言語「yamaoku-SEO語」を用いて山奥SEOの検索アルゴリズムを記述するコードを示します。

yamaoku-SEO語の仕様
def：関数定義
var：変数定義
list：リスト
for：ループ
if：条件分岐
print：出力

<h2>山奥SEOの検索アルゴリズム</h2>


```
// 検索アルゴリズムの定義
def 山奥SEO検索(クエリ):
    // 検索結果を格納するリスト
    var 結果 = list()

    // データベース内の全てのアイテムを取得
    var データベース = getDatabaseItems()

    // 各アイテムをループで確認
    for アイテム in データベース:
        // アイテムがクエリに一致するかをチェック
        if クエリに一致する(アイテム, クエリ):
            // 一致する場合、結果に追加
            結果に追加(結果, アイテム)

    // 結果をスコアでソート
    結果をソート(結果, スコア)

    // ソートされた結果を返す
    return 結果

// クエリに一致するかをチェックする関数
def クエリに一致する(アイテム, クエリ):
    // アイテムのタイトルと説明を取得
    var タイトル = アイテム.タイトル
    var 説明 = アイテム.説明

    // クエリがタイトルまたは説明に含まれているかをチェック
    if タイトルに含む(クエリ) or 説明に含む(クエリ):
        return 真
    else:
        return 偽

// 結果をスコアでソートする関数
def 結果をソート(結果, スコア):
    // ソートのロジックを記述
    var ソート済み結果 = ソート(結果, スコア順)
    return ソート済み結果

// テスト
var 検索クエリ = "山奥の自然"
var 検索結果 = 山奥SEO検索(検索クエリ)
print(検索結果)
```
説明
山奥SEO検索関数を定義し、検索クエリを受け取ります。
データベースからアイテムを取得し、それぞれのアイテムがクエリに一致するかをチェックします。
一致するアイテムを結果リストに追加し、スコア順にソートします。
ソートされた結果を返します。
仮想の機能
getDatabaseItems：データベースからアイテムを取得する関数（仮想）。
一致する、含む、ソート：仮想の文字列操作およびソート関数。
print：結果を表示するための出力関数。

これが山奥SEO検索アルゴリズムを記述する仮想プログラミング言語yamaoku-seoです。
【Vim】Vimの魅力を言語化してみた

## はじめに

よくQiitaではvim入門を謳った記事が散見されますね。
そしてその記事ではモードの概念であるとか、デフォルトのキーマップであるとか、コマンドであるとかについての説明がされがちですよね。

しかし思うのです。

**vimの門を叩こうとしている人にvimの取説をしても入門してくれないのでは?**

ということで今回は
- vimの門を叩こうとしている人たち
- vimの門を素通りしてしまっている人たち

に向けて、vimの魅力を伝えていこうと思います。

## マウスが要らなくなる

vimを愛用する人の10割がここに魅力を感じてvimを使い続けているのではないでしょうか。
マウスを使わなくなるというかは、厳密には**ホームポジションをなるべく崩さずに作業ができる**ようになります。
実際、vimmerと非vimmerの判別はキーボードを一瞥するだけ可能なほどにvimmerのホームポジションキーボードはツルッツルになっています。

そしてその結果、**作業がかなり爆速**になります。これはvimを使った際の効果として有名ですね。

## 作業が楽しくなる

これは誇大広告ではありません。
楽しくなる理由は、vimの学習コストにあります。

世間では

**vimの学習コストはpythonの学習コストを上回ってしまってる**

と言われているように[^1]、vimというのは最初の学習がぶっちゃけ大変です。
しかし大変故にvimのコマンドを使いこなして作業できるようになると、優越感を味わえるようになってきます。
覚えたコマンドを組みわせて最小限の操作で行いたい編集ができた時はかなり気持ちいいです。

vimを使った作業は**常にRTAをしているような感覚**なのです。そして、それが楽しいのです。

以下は実際にvimを使って編集している様子です。(わざと遅く入力してます)
5行目の"uvwxy"をカットして1行目の"abcde"にペーストするという作業です。
![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2947418/910cb544-d15d-9a18-0954-16ed2684f4d0.gif)

めちゃくちゃ早いですね。カーソルすら動かす必要がありません。気持ちいいです。

## 自分だけの心安らぐエディタを作れる

vimはinstallした直後は本当にただのエディタです。裸のエディタみたいな感じです。(写真はneovim)
![スクリーンショット 2024-06-05 23.12.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2947418/781ebe89-dbc8-c281-0b08-638a994eb78c.png)

ダサいですね。(諸説あり)

しかし、vimにはこの裸のvimを装飾するためのプラグインが数えきれないほどあります。vimの文化のほとんどはプラグインの文化と言って差し支えないのです。
そして、vim本体が本当にただのエディタであるが故に、プラグインもかなりプリミティブなレベルの拡張であるものが多いです。
タブ表示に関するものや、ファイラに関するもの、字句やファイルなどの検索に関するものなど様々で、さらにそれらのプラグインも主流なものが複数あったりして、要するに**人によって全く違うエディタ**が出来上がります。

以下は筆者のneovimです。

![スクリーンショット 2024-06-05 23.14.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2947418/3c3eaeed-9909-4f28-c308-f4144f3b605c.png)

カスタマイズの内訳を簡単に説明しますと、
colorschemeはtokyonightを使っています。
そして細かいですが、エディタの行数表示を絶対値ではなく相対値表示させるようにしています。
luaのLSとインテリセンスを有効にしていて、関数にカーソルを合わせるとちゃんと関数の引数の情報も得られます。
画面下部のステータスバーはシンプルになるようにカスタムしました。

というように、vimは真っ裸の状態から好きなプラグインを入れていって**自分だけの心安らぐエディタ**を作り上げることができます。
某ぶつの森や、盆栽が好きな方はめちゃくちゃハマってしまうと思います。[^2]

## 自己陶酔が気持ちいい

vimはターミナルから起動するアプリです。
つまりvimを使うということは必然的にターミナルをホームとして作業を進めることになります。これが何を意味するか？

**ターミナルに引き篭もってる俺、カッケーーーーーー！！！！**

となります。至極当然の感覚ですね。
vimmerは多少なりこの種の自己陶酔に常に浸りながら作業をしています。(偏見)

しかし実際この自己陶酔というのは意外と大事だと思っていまして、どういうことかというと

**vimを使うのが気持ちいい、楽しいから何か作業をしたくなる**

といった如何にも本末転倒な発想が生まれることがあるのです。

つまり、何か作業があるからvimを使うのではなく、**vimを使いたいから何か作業をしよう**という発想です。

**vimはただあなたに動かされるだけのエディタではなく、あなたを机に動かしてくれるエディタたり得る**というわけですね。

## 最後に

自分なりにvimの魅力的に感じているところを言語化してみました。
どうでしょうか。入門したくなりましたか。

もしその気になった方は、ぜひ以下の動画を見ながらご自身の手でneovimを作り上げてみてください。

https://www.youtube.com/watch?v=6pAG3BHurdM&t=2459s

ハンズオンで進んでいくので、プラモデルを組み立てるような感覚でneovimが出来上がっていきます。楽しいです。

ちなみに、手っ取り早くvimを触ってみたいという方は、以下のセットアップ済みのneovimをinstallして使ってみるのも良いです。

https://www.lazyvim.org/

では、良いvimライフを！！

[^1]: そんなこと言われてないしそんなことないです
[^2]: 実際プラグインでvimを拡張させていくことを"vim盆栽"などと呼んだりします
【Bash】関数について

## はじめに

今回は Bash における関数について扱っていきます。



## 関数の基本的な使い方


### 関数とは

コード数が増加すると複雑化して、コードを理解するのに時間がかかる。

**関数** を用いると、似た処理のコードを一つにまとめることができる。

- コードをまとめることで可読性が向上する
- 関数にすることで、別のプログラムからも同じ処理を呼び出せる


### 関数の定義

関数の定義は、以下の二つの方法を用いる

1. function 関数名() { ... }
1. 関数名() { ... }

```bash:例
# パターン1
function print_hello() {
    echo "Hello"
}

# パターン2
print_hello() {
    echo "Hello"
}

# 呼び出す場合
print_hello
```


### 関数作成の決まり

- **関数の定義は、小文字とアンダースコアを用いる**
    [参照 - Google Style Guide](https://google.github.io/styleguide/shellguide.html#function-names)
    <br>
- **関数はファイルの上部に記述する**
    ただし、以下のものは関数よりもファイルの上部に記述してよい
    1. #!/bin/bash
    1. 定数の設定
    1. set 文
    <br>
- **複数関数を定義する場合、関数の間に関数以外の文を記述しない**
    あとで修正する場合に、コードが読みづらくなる


### 関数内で引数を用いる

引数を用いる場合も、Bash ファイルを実行するときと同じように \\$1、\\$2 を用いるとよい。

```bash:例
print_something() {
    echo Hello ${1} # ${1} は第一引数
}
print_something Mars # Marsと画面上に表示される
print_something Jupiter # Jupiterと画面上に表示される
```


### 関数の返り値として数値を返す（ return ）

return を用いることで、関数実行後の返り値を指定できる。

$? で返り値を取得する。

```bash:例
my_function() {
    echo "some result"
    return 55 # 55を呼び出し元に返す
}

my_function # 関数の実行
echo ${?} # 55と表示される
```



## 名前空間

### 名前空間とは

プログラム上では、同じ名前の変数が存在しても一意に識別することができるように、空間ごとに変数の有効範囲が決められる。

これを **名前空間** という。

Bash では、『関数の中で変数に変更を加えた』 かつ 『関数外部に同名の変数が存在した』場合、**関数外部の変数の値を書き換えてしまう**

```bash:例
my_function() {
    name="John" # nameをJohnに設定
}

name="Alen"
my_function # my_functionを呼び出す（ nameがAlen → Johnに ）
echo "${name}" # Johnと表示される
```

### local でローカル変数として宣言

関数内で、変数が初めて出現したタイミングで local を記述すると、その変数はローカル変数として宣言され、関数内の名前空間だけ存在する変数になる。

変数の値を変えても外部には影響しないため、関数内で変数を利用する場合はなるべく local で宣言した方がよい。

```bash:例
my_function() {
    local name="John"
    echo "${name}"
}

name="Alen"
my_function # my_functionを呼び出す
echo "${name}" Alenと表示される（ Johnに変更されない ）
```



## main による宣言

> プログラムの開始を簡単に見つけるために、メインプログラムを一番下の関数としてメインと呼ばれる関数に入れます。
>
> ファイル内の最後の非コメント行は、メインへの呼び出しである必要があります。

上記は、 [Google Style Guide](https://google.github.io/styleguide/shellguide.html#main) から抜粋したテキスト

このように定義することで、プログラムの最初の場所を見つけやすくする。

```bash:例
main() {
:
:
}

main "${@}" # 引数と一緒にmainを呼び出す
```



## 外部ファイルの呼び出し

シェルスクリプトを実行する際に、外部のファイルをライブラリ化して読み込むことが多くある。

**.** または **source** コマンドを用いる。

```bash:例
# パスの取得
path=$(realpath ${0})
basedir=$(dirname ${path})

# ファイル読み込み（ test.sh 内で定義された関数を呼び出せるようになる ）
source $basedir/libraries/test.sh
```



## おわりに

今回は関数について勉強しました。
そこまで難しいことはないですね。
山奥SEO とは【意味/解説/説明】

## 山奥SEO とは
山奥SEOとは、競合が少ない「山奥」のようなニッチな市場やキーワードを狙ってサイトを上位化させるSEO手法です。
競合性の高いビッグワードではなく、検索ボリュームの少ないニッチなクエリやロングテールキーワードに焦点を当てることで、効率的にトラフィックを獲得することができます。

## 山奥SEOのライティング手順
山奥SEOで上位表示を獲得するステップは以下の通りです。

1. 検索キーワードの調査・選定
2. 競合サイトの分析
3. 記事コンテンツのライティング
4. メタタグの最適化
5. 内部リンクの追加
6. 外部リンクの獲得

山奥SEOで特に重要なのが、「検索キーワードの調査・選定」のステップです。
このステップでターゲットユーザーの潜在的な悩みやニッチなニーズを特定できれば、SEOライティングの難易度もそこまで高くない検索キーワードで効率的に上位表示が実現できます。

## 山奥SEOは初心者におすすめできない
山奥SEOは初心者におすすめできません。
なぜなら、検索キーワードのリサーチに膨大な工数がかかり、初心者にとってニッチなキーワード選定の難易度が高いからです。
そのため、初心者の方は基本的なSEOのキーワード選定をひと通り習得した後、余力があれば山奥SEOに参入することをおすすめします。

## まとめ：山奥SEOは天竜人のお遊戯
山奥SEOは、まるで天竜人の遊戯のようなものです。
SEO初心者にとっては理解しがたい手法やあらゆる戦略を駆使して、レッドオーシャンの間隙を縫って上位表示を目指していきます。
検索ボリュームの少ないキーワードを狙うため一見簡単なように見えますが、実は非常に繊細なSEO対策手法なのです。

山奥SEOについては
・[山奥SEO とは](https://zenn.dev/yamaokuseo/articles/5230a5a311a4f6)（Zenn版）
・[山奥SEOで上位表示を獲得する方法](https://note.com/seo_yamaoku/n/n35b77e2add75)（note版）
・[山奥SEOのSEOコンサルティング](https://www.lancers.jp/profile/yamaokuseo)
・[山奥SEOの運営者情報](https://www.linkedin.com/in/%E5%B1%B1%E5%A5%A5seo/)
でもご確認いただけます。
ＳＥＯ何も知らない人が「さいきょうのＳＥＯ最適化トップページ」を考える《法令.app》

誰でも楽しく法律が読める[《法令.app》](https://jplaws.app)というWebアプリを作っています。

https://jplaws.app

アプリの目標は「[E-Gov法令検索](https://elaws.e-gov.go.jp)を置き換えること」としています。ただ、このアプリを「わざわざ選んで」使う人は少ないと思います。法律を扱う職業であれば「判例・解釈・解説」とリンクした、もっと実用的なツールがあるはずです。

それ以外で、ツールにこだわって選んでくれる人は、想像がつきません（仕事にしていない純粋な「法律オタク」はいるのだろうか？自分がソレかもしれませんが・・）。

法律名で検索した時に、グーグル検索で上の方に載っていて、意識せずにE-Govの代わりにクリックしてもらいたい。マーケティングに関しては知識がまったくゼロなので、広告費もなしに無茶なことを書いているかもしれません。どうにか、１ページ目の下の方に入って「前に使ったE-Govというのがもの足りなかったから、こっちにしてみよう」くらいの位置につけたいと思います。

:::note info
そのためにはQiitaに記事を書くより、X.comなどで拡散した方がいいのかも知れません（少しやってますが）。ただ、今まで誰にも言わずに一人で開発してきたので、いったん開発者コミュニティの中で溜まったものを吐き出して、ちょっと落ち着いてから「世間一般」に出ていこう、などと考えています:smile:
:::

## :question:  トップページは必要か？

まず「トップページ」というものが必要かどうか？について考えました。サービスの「プロフィール・連絡先」は、どこかに書く必要はありますが、検索ボックスとプロフィールだけでは寂しい。使ってもらえないトップページだとサービス全体の印象が悪くなりそうです。

何かの法律を探しているユーザーに対して「Google検索」よりも速く結果を出せば、一つ優位に立てるかも知れない。それで８千以上ある全法令のタイトルデータをローカルに持ってパッパと結果を出すことにしました。

それだけだと画面は寂しく、ユーザーもすぐ離脱してしまいます。せっかく全タイトルデータを持っているので、ランダムに法令をピックアップして並べたら、「プラス・１クリック」してくれるかもしれない。

## :mag: 高速法令名検索


法令名検索では、E-Gov法令検索が配布している「タイトル、よみがな、略称」などをまとめたCSVファイルがあり、それとマッチさせています。なので「薬事法」といった略称や、「ころな」と読み仮名だけでもヒットします。

<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/54bfa749-8e47-7f62-b8df-4d188fdfb4fb.gif">

結果をたくさん出して、ユーザーが探しに来たもの以外にもクリックしてもらえば、ＳＥＯ的にもきっといいのではないか？それで、プラス１多めにクリックしてもらえるように、トップページにいろいろ詰め込んでみることにしました。

## :dolls: おすすめをピックアップすると、アプリのメンテナンスにもよかった

賑やかしにいろいろな法令を並べてみました。「法律オタク」は多くないと思いますが、「これ面白いですよ」と出していけば楽しいものができるのではないかと思いました。そう、考えてみると「コンテンツは良いものが揃っている」んですね。何しろ今まさに自分の生活を左右している現役の法律だから。

もちろん全てE-Govから借りてきて何も生み出してはいませんけど。・・たどっていけば、作ったのは政治家と官僚、、ということは、回り回って「主権者」たる自分が作ってるとも言えなくもないですね（１億分の１くらいの貢献度ですが）。

<img width=700px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/afde7955-bb0a-fde6-c518-e8782a947b69.gif">

「ランダム」は、約8,000ある法令からピックアップしています。それだけだと「マイナーすぎて取っつきにくい」と思い、他のシリーズを混ぜました。しかし、意外に、面白いのは「ランダム」だったりします。「こんな法律があるの？」という意表をつかれるチョイスをしてきます（単純に Javascript の Math.random() で出してるだけですけど）。少し紹介します。

:no_good_tone1: [軽犯罪法](https://jplaws.app/d/323AC0000000039-m.html)
> 20号 公衆の目に触れるような場所で公衆にけん悪の情を催させるような仕方でしり、ももその他身体の一部をみだりに露出した者
> 30号 人畜に対して犬その他の動物をけしかけ、又は馬若しくは牛を驚かせて逃げ走らせた者

:wine_glass: [酒に酔つて公衆に迷惑をかける行為の防止等に関する法律](https://jplaws.app/d/336AC0100000103-m.html#Ar-2)
> 2条 （節度ある飲酒）1項 すべて国民は、飲酒を強要する等の悪習を排除し、飲酒についての節度を保つように努めなければならない。
> 10条 （適用上の注意）1項 この法律の適用にあたつては、国民の権利を不当に侵害しないように留意しなければならない。

:crossed_swords: [美術刀剣類製作承認規則](https://jplaws.app/d/404M50000080003-m.html)
> 2条 （承認） 1項 文化庁長官は、製作しようとする刀剣類が美術品として価値のあるものであり、かつ、製作担当者が刀剣類の製作につき承認を受けたことのある刀匠（承認を受けた刀剣類の製作を担当したことのある刀匠を含む。）の下で引き続き5年以上技術の練磨に専念して刀剣類の製作担当者として十分な技術を習得したことを、その刀匠が証明し、かつ、登録審査委員2名以上が保証した者で、文化庁長官の行う刀剣類の製作に関する研修を受けたものである場合には、申請に係る刀剣類の製作を承認するものとする。

副産物がありました。バグがないか表示の確認をするためにアドレス直打ちしていましたが、ランダムに出てくるリンクを開くだけですごく楽になりました。「抜き打ち検査」的にはなりますが、8,000もあるのを順番に見てられないですので。

ぜひ、[トップページ](https://jplaws.app)で遊んでみてください！

ここに、もう少しトレンドに合わせた、例えば「今日出たニュースに関連する法令」などを早くピックアップできれば、人も来て賑わいそうです。

:bird: ひばりソフト（ひばり）
第一種の過誤は分かる、では第二種は？

まずはこちらを

https://datawokagaku.com/type_errors/

第一種の過誤が起きる確率は帰無仮説の棄却である有意水準であることは簡単に分かります。
そもそも過誤は
第一種の過誤→帰無仮説が正しいのに帰無仮説を棄却する
第二種の過誤→帰無仮説が正しくないのに帰無仮説を採択する
これについて表にすると
<table>
    <tr><td></td><td>帰無仮説を採択</td><td>帰無仮説を棄却</td></tr>
    <tr><td>帰無仮説が正しい</td><td>正しく検定できた</td><td>第一種の過誤</td></tr>
    <tr><td>対立仮説が正しい</td><td>第二種の過誤</td><td>正しく検定できた</td></tr>
</table>

という状況です。
では第二種の過誤はどう考えるかですが、まず帰無仮説を棄却出来ていない事が前提になります。
その帰無仮説の中での対立仮説の分布の面積を求めると第二種の過誤が分かります。
つまり帰無仮説の棄却域ではない帰無仮説の範囲内での対立仮説の分布です。
図にするとこうなります(ペイントで描いたので雑なのは許して)。
赤線は有意水準で青が対立仮説の分布の面積です。
両側検定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/92b5a4d8-d1fd-1517-517f-7aa7805a4a42.png)


片側検定①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/cabfe5f2-71da-e70c-31e8-b61b9428da4d.png)


片側検定②
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/4cc7ee87-5e02-17d2-6b27-6c2aa686036d.png)


で面積を求めると第二種の過誤になります。

でこの第二種の過誤を1から引くと検出力になります。
よくある検査で罹患していない人を陽性と判断する時5%で、罹患している人を陰性と判断する確率がx%となることがありますが、この5%が第一種の過誤でx%が第二種の過誤になります。
なので帰無仮説をどうするかによって検出力が変わり罹患している人を正しく陽性と判断する確率が変動していて第一種の過誤と第二種の過誤はトレードオフであることが分かります。
図の場合はH1がH0より大きくなっていますが逆でも同じ考えで面積を求められます。

# まとめ
第二種の過誤難しいよね計算。