OmniAICreator/Qiita-1.07M huggingface dataset:
2024/04/04windows11に以降すべきかどうかの判断

## 2024/04/04windows11に以降すべきかどうかの判断

とりあえずChatGPT先生とCopilot先生とGemini先輩に聞いてみたのだけれども・・・なんとなく回答が違う・・・。


補足：出力結果の中で、 `インターネットが不要` という出力結果があります、これは、間違った出力になります。そりゃないでしょっていうありえない話ですが、でも、CopilotがWindowsPC内で完結しそうという希望的観測をもってしまいそうなので、補足させていただきました。現状Copilot先生は、windows内のアプリケーションとして用意されても、多分AzureにあるCopilot先生本体にリクエスト送って、レスポンス受け取った内容をWindowsPCで出力していると思います。そうしないと、WindowsPC内に45TB(テラバイト)ぐらいの容量が必要ですので、非現実的ですね。でも、1TBぐらいまで圧縮されてWindowsPC内で動けば良いなっていうのは、世界中が思ってるでしょうね。いくら出すかは別にして。


主にwindows11にするメリットはCopilotを使えることだと個人的には感じているのですが、要求スペックが高くなることで動作が重くなるなら本末転倒というのが懸念点です。

### プロンプト

```
Windows 11 にインストールされている Copilot とブラウザで利用できる Copilot の違いを明確に教えて下さい。
markdown形式でマトリックス表にしてください。
```

### ChatGPT3.5先生

| 機能                   | Windows 11 にインストールされている Copilot | ブラウザで利用できる Copilot |
|------------------------|--------------------------------------------|-----------------------------|
| プラットフォーム       | Windows 11                                   | 任意のブラウザ               |
| インターフェース     | デスクトップアプリ                           | Web ベース                 |
| インタラクション       | ネイティブのアプリケーション               | ウェブインターフェース     |
| インストール         | Windows ストア経由でインストール            | ウェブブラウザ経由でアクセス |
| オフライン利用       | 可能                                         | 不可能                      |
| 機能の同期           | Microsoft アカウント経由で同期              | ログイン情報を介して同期    |
| プロジェクト管理     | ローカルファイルや Microsoft アカウント経由で管理 | ブラウザ上のアカウント経由で管理 |
| アップデート         | Windows アップデートを介して                  | 自動的にブラウザ経由でアップデート |

### Copilot先生

`注意点としてCopilot先生にmarkdownの表出力を頼み、出力されたデータをコピー&ペーストしてもQiita上では表変換されなかった。これは、行ごとの改行が不足していたためで、ChatGPT先生の方が3.5であっても使いやすい`

| 機能/特性 | Windows 11 にインストールされている Copilot | ブラウザで利用できる Copilot |
|--------------|--------------------------------------------|----------------------------------|
| 利用可能性 | Windows 11 にプレビューとして利用可能 | Web ブラウザーで利用可能 |
| アクセス方法 | タスクバーの Copilot アイコンをクリックまたは + C キーを押す | Microsoft Edge の Copilot with Bing Chat からアクセス | 
| 機能範囲 | Windows タスクの実行、設定変更、アプリ起動など | 質問への回答、インスピレーションの提供、Web ページの要約 | 
| ユーザー接続 | Microsoft アカウントまたは Microsoft Entra アカウントを使用 | Microsoft アカウントまたは Microsoft Entra アカウントを使用 |
| チャットトーン | Precise、Balanced、Creative の 3 つのトーン | - | 
| データプライバシー | Windows の Copilot: データとプライバシー を参照 | - |

### Gemini先輩

|項目|Windows 11 の Copilot|ブラウザの Copilot|
|:----|:----|:----|
|インターネット接続|必要|不要|
|利用可能な機能|多い|少ない|
|動作速度|速い|遅い|
|操作性|直感的|慣れが必要|
|対応ブラウザ|Edge|Chrome, Firefox, Edge|
|利用料金|無料|無料|

## 2024/04/04現在のCopilot先輩を判断基準にしない

とりあえず、ChatGPT先生が一番きちんと出力してくれて、同じモデルを利用しているはずのCopilot先生はちょっといまいちなのかな・・・と思いました。

でも、Copilot先生は、時々ChatGPT4を利用できるトグルボタンが出てくることがあり、無料でChatGPT4モデルを利用できるのがCopilot先生のメリットです。

Gemini先輩は、ホント出力スピードが早い。
早いのは上手いってことですが、出力内容自体は意図しているものではなかったというのが今回の結果です。

本当は、2025年9月ぐらいにwindows11へアップグレードしようと考えていました。

理由としては、どうせwindows12出るんでしょ？っていう気持ちでいっぱいだったからです。

ただ・・結構な問題が発生していて。

## 問題点

Youtube見るだけでCPU使用率が50%とか、wifi使用率が90%とかになる症状が発生しています。

これ、数日前からなのですが、windowsupdateがうまく行っていないことも関係するのかなとかんがえて・・、とりあえずBIOSをアップグレードしました。

しかし、特に変わらず。

ウィルスなのかなーーーーーという気持ちもないこともなけど、クリーンインストールではなく、アップグレードという形でwindows11にしてみようと思います。

今まさに操作中ですが、挙動がおかしかったら10日以内ならwindows10に戻せるらしいので、そのときは戻したら良いかなと。
Flutter、VSCodeで環境構築　備忘録メモ

Flutterインストールの際に調べたサイト

やるぜ！Flutter！　VSCodeで環境構築編
https://qiita.com/apricotcomic/items/7ff53950e10fcff212d2

※タイプミスがあった。はまった
×　flutter --andloid-licenses
◯　flutter doctor --android-licenses

エミュレーターが動かなくてハマった。エラー文章から一部を抜粋して検索して、下記の動画を見て解消できた
https://www.youtube.com/watch?v=mjJ4c8cwpSI

【Flutter】Windows11でFlutterの環境構築を行う手順
https://kirickp.com/entry/2023/06/16/002744


Flutter初心者のための学習ロードマップ
https://zenn.dev/flutteruniv_dev/articles/16181eaa6783d6

Flutter学習　AVD Manager Unable to locate adb エラーへの対処法
https://halzoblog.com/adb-error/

PATHの設定及び環境変数JAVA_HOMEの設定
https://www.javadrive.jp/start/install/index4.html

FlutterアプリをAndroidエミュレーターおよび実機で実行してみた
https://dev.classmethod.jp/articles/android-flutter-apk/
[Flutter]audioplayersやjust_audioでマナーモードにしても音楽がなってしまう

AudioSessionのAVAudioSessionCategory(.playback)が原因なので、上書きする
```dart
import 'package:audio_session/audio_session.dart'; // importする
final player = AudioPlayer(); // audioplayersやjust_audioのPlayer

// ↓ここから追加
final session = await AudioSession.instance;
await session.configure(const AudioSessionConfiguration(
    avAudioSessionCategory: AVAudioSessionCategory.ambient, // .playbackを.ambientで上書き
));
// ↑ここまでを追加

player.play();
```

これで、下記になります
```
マナーモード： 音楽ならない
通常モード： 音楽なる
```
【備忘録】yarnとnpmの追加、削除コマンド

yarnの削除コマンドよく調べてるなと思ったので自分のための備忘録です。

## yarn

パッケージを追加
```
yarn add <package>
```

パッケージを削除
```
yarn remove <package>
```

## npm

パッケージを追加
```
npm install <package>
```

パッケージを削除
```
npm uninstall <package>
```
cscの作法 その473

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

# 練習問題
zundokoを、エクセルで出力せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/083891f1-51d6-aaf4-d5ce-b9146005cfcb.png)


# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "zun.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i = 1;
			int j = 1;
			Random r = new Random();
			int b = 0;
			do
			{
				if (r.Next(2) == 0)
				{
					ws.Cell(i, j).Value = "ズン";
					j++;
					b++;
				}
				else
				{
					ws.Cell(i, j).Value = "ドコ";
					j++;
					b = 0;
				}
			} while (b < 4);
			ws.Cell(i, j).Value = "ドコ　キ・ヨ・シ！";
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}


```

以上。
cscの作法 その472

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

# 練習問題
FizzBuzzを、エクセルで出力せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/dfaf3590-e221-0d8b-1fd5-c1e65252e975.png)


# 

```
using System;
using System.Text;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "fizz.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j;
			int k = 0;
			for (i = 1; i < 11; i++)
			{
				for(j = 1; j < 11; j++)
				{
					k++;
					if (k % 15 == 0)
					{
						ws.Cell(i, j).Value = "fizzbuzz";
					}
					else if (k % 5 == 0)
					{
						ws.Cell(i, j).Value = "buzz";
					}
					else if (k % 3 == 0)
					{
						ws.Cell(i, j).Value = "fizz";
					}
					else
					{
						ws.Cell(i, j).Value = k;
					}
				}
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}





```

以上。
cscの作法 その471

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

# 練習問題
九九を、エクセルで出力せよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f1a622e7-f676-a792-25e5-e529a7d84bfc.png)


# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;
using ClosedXML.Excel;

namespace App
{
	class Program {
		static void Main(string[] args) {
			var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "kuku.xlsx");
			var wb = new XLWorkbook();
			var ws = wb.Worksheets.Add("Sheet1");
			int i;
			int j;
			int k;
			for (i = 1; i < 10; i++)
			{
				for(j = 1; j < 10; j++)
				{
					k = i * j;
					ws.Cell(i, j).Value = k;
				}
			}
			wb.SaveAs(filePath);
			Console.WriteLine("ok");
		}
	}
}

```

以上。
docker-compose.ymlを使ってみたいのです

# どうやらdocker-composeを使ったほうが便利にbuildできるらしい
基本的な構造は下記とのこと(GPTさん曰く)
```yml
version: '3.8' # Docker Composeのバージョン
services: # ここにコンテナ（サービス）を定義する
  web: # サービス名
    image: nginx:latest # 使用するイメージ
    ports:
      - "80:80" # ポートマッピング（ホスト:コンテナ）
    volumes:
      - ./html:/usr/share/nginx/html # ボリュームマウント（ホスト:コンテナ）
  app: # 別のサービス
    build: ./app # Dockerfileのあるディレクトリパス
    environment:
      - APP_ENV=production # 環境変数
networks: # ネットワークの定義（必要に応じて）
  app-network:
    driver: bridge
volumes: # ボリュームの定義（必要に応じて）
  db-data:
    driver: local
```
とりあえずそれっぽいファイルを作成した
今回の目的はpythonが3.7のときに作成したコードの動作確認。
seleniumが4.0.0でないと動かなく、pyenvとかvenvを使うのもの面倒、、、
またaws lambdaにはコンテナでpushしているため実働に近い環境で動作確認ができるのも良いと思い、dockerで対応することにした。


```yml
version: '3.8'
services:
  app:
    image: sample
    build:
      context: .
      dockerfile: ./container/python/Dockerfile
    working_dir: /var/task
    volumes:
      - ./express/src:/var/task
    command: ls
    tty: true
```
これでdocker composeのversion が3.8のapp(仮称)というサービスが./container/python/DockerfileディレクトリにあるDockerfileを参照してbuildしてくれるはず
ということで下記コマンドを実行
```bash
docker-compose up --d
```

動作を確認するために下記コマンドを実行

```bash
docker-compose ps
```
これで動いているコンテナを確認できる

このコンテナに接続して中身を確認する
```bash
docker compose exec app bash
```

こんな感じで接続できた
・lsコマンドでディレクトリ内に必要なフォルダがあるか
・pwdコマンドでどこのディレクトリにいるか
上記2点を確認した

これで正常にdocker composeを用いて作成したコンテナに接続し、処理をすることができた.

docker buildして、runして、exec -it みたいな複数のターミナルをまたぐ作業よりもコマンド2つでできることが便利と思いました。
Lambda Python 任意のS3が存在するかチェックするコード

```
import boto3
from botocore.exceptions import ClientError

def check_s3_bucket_exists(bucket_name):
    """
    指定したS3バケットが存在するかどうかをチェックします。

    :param bucket_name: チェックするバケットの名前
    :return: バケットが存在する場合はTrue、そうでない場合はFalse
    """
    s3 = boto3.client('s3')
    
    try:
        s3.head_bucket(Bucket=bucket_name)
        return True
    except ClientError as e:
        # バケットが存在しない場合、エラーコードは404 NotFoundになります
        if e.response['Error']['Code'] == '404':
            return False
        # 他のエラーの場合は例外を再スロー
        raise

# バケット名を指定して関数をテスト
bucket_name = "your-bucket-name"
if check_s3_bucket_exists(bucket_name):
    print(f"バケット {bucket_name} は存在します。")
else:
    print(f"バケット {bucket_name} は存在しません。")
【Laravel】自動テストとかのまとめ

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Laravelの自動テストとかをいろいろやったのでまとめです。

今までLaravelの記事を書いてきたので、それをまとめました。

これから紹介するものが全て入っているリポジトリは以下です。

https://github.com/NiheiKeita/docker-laravel-app


# Docker環境を作成

Dockerを使用してLaravelの環境を作成しました。

https://qiita.com/keitaMax/items/7bc51212a32a6418aa1c

# PHPstanを使った自動テスト

PHPstanを使って静的解析をしました。

https://qiita.com/keitaMax/items/a63e3a93f1d2f2d10473

また、以下記事ではPHPstanをGitHubにPushしたときにテストできるようにGitHubActionsを使用しました。

https://qiita.com/keitaMax/items/46102fd5a07e7c86168c

下の記事は、Git上でDockerを立ち上げてその中でテストできるようにしました。

https://qiita.com/keitaMax/items/63d64590e53def393f4c

# PHPUnitを使ったテスト

PHPUnitを使用してテストコードを作成しました。

https://qiita.com/keitaMax/items/1d995293f383f66b29af

また、以下記事ではPHPUnitをGitHubにPushしたときにテストできるようにGitHubActionsを使用しました。

https://qiita.com/keitaMax/items/bbfecbdb73322b53bb4c

# PHP CodeSniffer を使ってテスト

PHP CodeSniffer を使ってコーディングチェクをしました。

https://qiita.com/keitaMax/items/4196188be54f46cbd232

また、以下記事ではPHP CodeSnifferをGitHubにPushしたときにテストできるようにGitHubActionsを使用しました。

https://qiita.com/keitaMax/items/650aa738ce87c259fb41

# Swagger-PHPを使って仕様書を作成する

Swagger-PHPを使ってSwagger（OpenAPI）仕様を作成しました。

https://qiita.com/keitaMax/items/03acb4ae30345fb50891

また以下ではSwagger UIを使用してドキュメントをブラウザで確認できるようにしました。

https://qiita.com/keitaMax/items/abf16ad40ab4d4cdce97

以下の記事は、Swagger UIのドキュメントをLaravelのソースの外に出して見れるようにしました。




# さいごに

 やり方が違ったり、もっといいやり方があるというご指摘がある方はコメントしていただけると幸いです。

最後まで読んでいただきありがとうございました。
自宅サーバを3年間運用した体験談

## 1. はじめに

自宅サーバを運用していますか？私は3年前に自宅サーバを構築しました。
ファイルサーバとLinux操作の練習が当初の目的でしたが、後に開発アプリの運用などにも使っています。自宅サーバの構築と運用に関する私の体験談を書いてみたいと思います。

## 2. 対象読者

- 自宅サーバに興味のある方
- ミニPCに興味のある方

## 3. 目次
- [1. はじめに](#1-はじめに)
- [2. 対象読者](#2-対象読者)
- [3. 目次](#3-目次)
- [4. 検討事項](#4-検討事項)
  - [4-1. 消費電力](#4-1-消費電力)
  - [4-2. 耐久性](#4-2-耐久性)
  - [4-3. 大きさ](#4-3-大きさ)
- [5. 購入したPC](#5-購入したpc)
  - [6. 感想](#6-感想)
- [7. さいごに](#7-さいごに)

## 4. 検討事項

PCを選択する際の基準として下記を検討しました。

- 価格 
  - 初めてということもあり高価なものは避けたい
  - 予算は最大3,4万円
- 消費電力
  - 24時間稼働するので消費電力が少ないものが良い
- 耐久性
  - 長く使いたいので耐久性があるものが良い
- 大きさ
  - 自宅の限られたスペースに置くため小さいほど良い
- 性能
  - ある程度の開発はできる最低限の性能は欲しい
  - 外付けのHDDやSSDを取り付けたい

上から順に優先度を決めてハードを選びました。


### 4-1. 消費電力

消費電力については、CPUの選択が重要です。
低消費電力のIntel CeleronやProcessorシリーズが適していると判断しました。

https://xtech.nikkei.com/atcl/nxt/column/18/02500/062800001/


### 4-2. 耐久性

耐久性を確保するためには、冷却ファンの有無が重要な指標となります。
冷却に関してのメリットは次のIntel社の記事が参考になりました。

https://www.intel.co.jp/content/www/jp/ja/gaming/resources/pc-cooling-the-importance-of-keeping-your-pc-cool.html


### 4-3. 大きさ

Amazonで調べると、「ミニPC」というジャンルで検索結果にたくさんヒットします。
ごくわずかに日本や米国のメーカの商品がありますが、ほとんどが中国メーカの商品です。
ミニPCの大きさは手のひらサイズほどの物がほとんどです。しかし、一般的なノートPCと比べても性能に違いはありません。技術の進歩がすごいです...

## 5. 購入したPC

上記の検討事項を考慮して、最終的には「BMAX B2 Plus」という商品を購入しました。

https://www.bmaxit.com/MaxMini-B2-Plus-pd701447098.html

- メモリ: 8GB
- SSD: 128GB
- CPU: Intel celeron j4125
- TDP: 10W
- 価格：2万円台(2021年購入当時)

購入後、消費電力をこちらの商品を使って測定しました。

https://www.ratocsystems.com/products/sensor/watt/rsbtwattch2/

- アイドル時: 4~5W
- 使用時: 10~20W

おおよそ1日4~5円ぐらいで運用できるので、
24時間つけっぱなしでも月200円いかないぐらいで運用できます。


### 6. 感想

[用途]
- サーバとして運用するためCentOS7.9をインストール
- 一番の用途はファイルサーバとしての利用
- LINE Bot のアプリ開発して運用
- タスクツールのRedmineやWikiをインストールして利用(現在はほとんど使っていない)
- その他、個人開発の諸々のお試し運用

[メリット]
- 安い
  - 購入金額は本体2万5千円 + SSD1TBが1万円ぐらい
  - 3年間使った場合は電気料金合わせて、月1000円ぐらいで運用できる
- Linux(オンプレミス)の知識がつく
  - 自分で実際にLinuxをインストールして、様々な用途で利用するために、たくさん勉強する必要あり
  - WindowsやMacでは簡単にできることが、Linux環境では簡単にできないことが多い

[デメリット]
- 急に落ちる
  - 何もしていないのに、いつの間にか電源が落ちていることがしばしばありました
- 学習コストが高い
  - ちゃんと運用するためには知識が必要です。今どきお金を掛ければGUI操作で簡単に自分好みのサーバを立てることができます 


## 7. さいごに

実は言うと、最近新しいミニPC「Minisforum UN100L」を買いました。これから移行しようと考えています。今度は急に電源が落ちないといいなと思います。

https://store.minisforum.jp/products/minisforum-un100l?variant=44722480152742
GitHub Actions PR 作成時にラベルを自動付与する

## 概要

https://qiita.com/ucan-lab/items/c3fac4b7198640c11cb3

前回ラベルをファイルで管理するようにしたのでそれを上手く利用したい。
ブランチ名、差分ファイルに応じてラベルを自動付与したい。

## Gitシリーズ記事まとめ

https://qiita.com/ucan-lab/items/33c63a402f533aa92f3e

## 利用ツール

https://github.com/actions/labeler

ファイルパスやブランチ名に応じてラベルを設定するツールがあります。

## 実装

下記、3つのファイルを用意します。

- `.github/labeler-branch.yaml`
- `.github/labeler-files.yaml`
- `.github/workflows/assign-label.yaml`

### .github/labeler-branch.yaml

```yaml:.github/labeler-branch.yaml
feature:
  - head-branch: ['^feat']
bug:
  - head-branch: ['^fix']
chore:
  - head-branch: ['^chore']
refactor:
  - head-branch: ['^refactor']
document:
  - head-branch: ['^doc']
```

例えば `feat` から始まるブランチ名だと `feature` ラベルが付与されます。

### .github/labeler-files.yaml

```yaml:.github/labeler-files.yaml
npm:
  - changed-files:
    - any-glob-to-any-file: ['package.json', 'package-lock.json']
composer:
  - changed-files:
    - any-glob-to-any-file: ['composer.json', 'composer.lock']
```

例えば `package.json` や `package-lock.json` に変更がある場合は `npm` ラベルが付与されます。

### .github/workflows/assign-label.yaml

```yaml:.github/workflows/assign-label.yaml
name: Assign Label
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  assign-label:
    permissions:
      contents: read
      pull-requests: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
	  - uses: actions/labeler@v5
        if: ${{ github.event.action == 'opened' }}
        with:
          configuration-path: .github/labeler-branch.yaml
      - uses: actions/labeler@v5
        with:
          configuration-path: .github/labeler-files.yaml
```

## 補足

プルリクエスト作成時のみブランチ名に応じてラベルを付与します。
差分ファイルは追加されたコミットで増える可能性があるので、opened, synchronize両方で実行しています。

## 業務改善度: ★★★☆☆

ブランチの命名ルールを正しく運用できていればラベルが自動付与されます。
ラベルの張り忘れ防止に期待できます。

また、特定のファイルが変更された時は注意が必要などの決まりごとがある場合などルールを追加しやすいので結構便利に使えそうなワークフローです。
「Мамо не тримай в собі」をウクライナ語Universal Dependenciesで解析する

[一昨日の記事](https://qiita.com/KoichiYasuoka/items/851bbe0299f43c7eb4e9)の例文に対応する「Мамо не тримай в собі」を、[Stanza](https://stanfordnlp.github.io/stanza/)の助けを借りて、ウクライナ語Universal Dependenciesで解析してみた。Google Colaboratoryだとこんな感じ。

```
!pip install stanza deplacy
import stanza
nlp=stanza.Pipeline("uk")
doc=nlp("Мамо не тримай в собі")
import deplacy
deplacy.serve(doc,port=None)
```

私(安岡孝一)の手元では、以下の結果が出力された。

```
# text = Мамо не тримай в собі
# sent_id = 0
1	Мамо	мама	NOUN	Ncfsvy	Animacy=Anim|Case=Voc|Gender=Fem|Number=Sing	3	vocative	_	start_char=0|end_char=4|ner=O
2	не	не	PART	Q	Polarity=Neg	3	advmod	_	start_char=5|end_char=7|ner=O
3	тримай	тримати	VERB	Vmpm-2s	Aspect=Imp|Mood=Imp|Number=Sing|Person=2|VerbForm=Fin	0	root	_	start_char=8|end_char=14|ner=O
4	в	в	ADP	Spsl	Case=Loc	5	case	_	start_char=15|end_char=16|ner=O
5	собі	себе	PRON	Px-----ln	Case=Loc|PronType=Prs|Reflex=Yes	3	obl	_	start_char=17|end_char=21|ner=O|SpaceAfter=No
```

![uk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/5527d571-9080-9ba8-7357-228e9ca9a137.png)

ウクライナ語は呼格が比較的ハッキリした言語なので、vocativeを解析しやすい。この文でも「мамo」が「мама」の呼格なので、迷うことなくvocativeが繋がれている。こういうのを、タイ語あるいは他の言語でもうまく出来ればいいのだけど、なかなか難しいなあ。
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5' for key 'tablespaces.PRIMARY' (SQL: truncate table `push_xxx`)

# Truncate を実行すると、謎のエラーが。
```terminal:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '5' for key 'tablespaces.PRIMARY' (SQL: truncate table `push_tokens`)
```

## 原因：
AWSの Aurora MySQL.　3.05.2 のバージョン依存のバグのようです。→ [stack overflow](https://stackoverflow.com/questions/78108895/mysql-8-duplicate-entry-1-for-key-tablespaces-primary-upon-triggering-a-tr)

## 対策：
Aurora MySQL 3.06.0　にアップグレードしましょう。
私は、これで解消しました。
レコード(Company, Incidentなど)を消してしまった時のリカバリ

要注意は以下です

:::note alert
復旧は、レコードの削除から 7 日以内に行う必要があります。
:::

Version: Utah

# 試したこと

適当なインシデントを

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/6c4bce07-fd6d-975e-8bb0-b12da9da706e.png)

うっかり消してしまって

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/d4c58b77-e395-04b9-322b-3e1e94ca9503.png)

Rollback ＆Recovery > Delete Recoveryを確認して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/2c590f38-8ea5-7e0b-5cb6-f6911c13b52f.png)

削除した時間のレコードを選択して関連レコードの情報もちゃんと表示されていていい感じだなあと眺めつつ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/bdba7c7c-7be6-4816-7424-4740d1d4032c.png)

Related LinksのRollback...のリンクをクリックしてyesを入力して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/2beea3a2-b9dd-c443-b9c2-17d560b0299c.png)

Okをクリックして

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/137f3d5c-7a52-36a6-478f-4112998e5835.png)

CloseしたらStateがRolled backになって

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/8f92ea71-e68d-2e22-009e-25b4c85cde74.png)

レコードが復元したことを確認しました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193272/955e30a4-12e3-45fc-a34a-e16ce63fee6b.png)

データの完全性までは確認できてませんが…多分大丈夫でしょう 手順の説明用にIncidentで試しましたがCompany(Account)の削除＆復元も大丈夫そうでした

# 参考

ここに書いてあるままです

https://docs.servicenow.com/ja-JP/bundle/utah-platform-administration/page/administer/table-administration/task/delete-recovery.html

リンク先を毎回見るのも面倒なので…全部引用します

> 削除されたレコードと関連するすべての変更を復元できます。復旧は、レコードの削除から 7 日以内に行う必要があります。
> 
> 始める前に
> 必要なロール：admin
> 
> このタスクについて
> 
> 手順
> 
>    [すべて] > [ロールバックおよび復旧] > [削除を復旧 (Delete Recovery)]に移動します。
>    [削除を復旧] リストで、復旧するアイテムをクリックします。
>    [削除を復旧] フォームが表示されます。
>    [関連リンク] で、[ロールバック...] をクリックします。
>    [操作全体をロールバック (Rollback entire operation)] フォームに yes と入力し、[OK] をクリックします。
>    [進行状況] ページには、復元プロセスの進行状況と、復元された参照の数が表示されます。
>
> タスクの結果
> 処理が完了すると、[復元の概要 (Restore Summary)] に変更が列記され、復元されたレコードを表示した> り、[削除の復旧 (Delete Recoveries)] リストに戻ったりするためのリンクが表示されます。
フロントエンドでjavascriptを用いる際のテンプレート部品

# webページの部品のまとめ

# フォームが空欄の時にエラーを出す
```html
        <div class="frame__inner">
            <p>メールアドレス:<input type="email" name="email" id="">
            <span style="color: #f33"></span>
            </p>
            <script>
                const email = document.querySelector('input[name="email"]')
                email.addEventListener('blur', () => {
                    if (email.value === '') {
                        email.style.backgroundColor = '#fcc';
                        email.nextElementSibling.innerHTML = '※ メールアドレスをご記入ください';
                    } else {
                        email.style.backgroundColor = '#fff';
                        email.nextElementSibling.innerHTML = '';
                    }
                });
            </script>
        </div>
```

# チェックボックスにチェックがついたら、ボタンを押す
```html
        <div class="frame__inner">
            <div><label><input type="checkbox" name="agree" id="agree"> 同意する</label></div>
            <div><button id="submit" disabled>送信する</button></div>
            <!-- ここに、JavaScriptを記述します -->
            <script>
                const agree = document.getElementById('agree');
                agree.addEventListener('change', () => {
                    //※以下は同じ動作をするもの
                    // if (agree.checked) {
                    //     document.getElementById('submit').disabled = false;
                    // } else {
                    //     document.getElementById('submit').disabled = true;
                    // }
                    document.getElementById('submit').disabled = !agree.checked;
                });
            </script>
        </div>
```

# 正規表現を使ったバリデーションチェック

```html
        <div class="frame__inner">
            <!-- ここに、JavaScriptを記述します -->
            <script>
                const zip_pattern = /^\d{3}-?\d{4}$/g;
                let zip = '111-2222';

                if (zip_pattern.test(zip)) {
                    document.write('正しく入力されました');
                } else {
                    document.write('郵便番号は xxx-xxxxの書式で入力してください');
                }
            </script>
        </div>
```

* `正規表現.test(変数)`で変数が正規表現のパターン通りに入力されているか調べることが出来る
* 正規表現の補足
    * `/正規表現を入力/g:`が入力のパターン
    * `\d`で数字
    * `^`で文頭指定
    * `$`で文末指定
    * `?`で直前の文字が0回もしくは1回だけ登場

# クリックしたときに別のURLに誘導する
 ```html
        <script>
            location.href = 'https://google.co.jp';
        </script>
```

# リアルタイム表示する
```html
        <div class="frame__inner">
            <div id="timer"></div>
            <script>
            
                let timer = () => {
                    let now = new Date();
                    document.getElementById('timer').innerHTML =
                        `${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`;
                }

                let timerID = setInterval(timer, 50);
            </script>
        </div>
    </div>
```

#
Rails - DBの stringe のカラムを integer に変換する

# 例

ネットで調べると `using` を使う例が出てくるが、自分のRails環境では以下だけで良かった

```rb
class ExampleMigration < ActiveRecord::Migration[7.1]
  def up
    change_column :table_name, :column_name, :integer
  end

  # ロールバック用 
  def down
    change_column :table_name, :column_name, :string
  end
end
```

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Javaのprivateメソッドをテストする方法

Claude３と会話しながら記事の原案を作ってもらいました。

## 問題:

Javaのprivateメソッドは外部から直接実行できないため、ユニットテストが困難である。


## 解決策:

1. クラスに備わっているpublic/デフォルトアクセス修飾子のメソッドを使ってテストする
2. 対象のprivateメソッドの可視性をデフォルトアクセス(通称パッケージプライベート)に変更する
3. Reflectionを使ってprivateメソッドを実行する

## 上記の解決策の妥当性:

1. が最も望ましい方法である。privateメソッドは通常、そのクラスのコンテキスト(インスタンス変数の状態)に依存するため、単独で呼び出して正しくテストできない場合が多い。そのため、publicメソッドから間接的に実行させることが適切である。

2.と3. はprivateメソッドを直接テストするため、コンテキストを無視してしまう可能性がある。
2.はカプセル化を損なう懸念があり、3.はパフォーマンス上の懸念がある。そのため、1.が難しい場合に限り、2.か3.を検討する。

## 備考
privateメソッドを直接テストしたい場合は、そのメソッドがUtilityクラスのような、状態を持たないヘルパーメソッドである可能性が高い。その場合は、そのようなメソッドをUtilityクラスに集約し、publicメソッドとしてテストすることが適切である。

privateメソッドのテストは、そのメソッドの役割と依存関係を考慮して、適切な手段を選ぶ必要がある。単純にprivateメソッドを露出させるのではなく、オブジェクト指向の設計原則に従いながらテストできるよう工夫することが重要である。
適当に付けたGitHubのユーザー名を変えたくなった話

学習を始めた当初、Gitでデータを管理するのが一般的という言葉を頼りに、GitHubのこともよく分からないまま登録していました。
実際に使い始めてみると、どうやらリポジトリURLにはユーザー名が表示されるよう…
あまり深く考えずに突き進んでいたら、チームで開発やポートフォリオを作成した際にもこの名前が表示されるのか…！ということに気づき、変更方法を調べてみることにしました。


## 心配だったポイント
確かURLで紐づけをしていて、自分の作業環境内のフォルダ構成を変えたときもエラーが出たはず…
リモートリポジトリのURLが変わってしまってもデータは大丈夫なのだろうかという心配があったのできちんと調べてみることにしました。

# ユーザー名を変える方法

__結論から言うと、私の場合は問題ありませんでした。__
詳しい内容について、手順と一緒に記述していきます。

### GitHubにログインして設定画面を開く
まずはGitHubにログイン。
自分のアイコンをクリックして開いたタブから「⚙Setting」をクリックします。
そうすると左ナビに「⚙Account」があるので、ここをクリック。

そこで表示された画面に「Change username」という項目があるので、さらにそこの「Change username」というボタンをクリックします。
そうするとこんな感じのポップアップが開きました。
![gitのユーザーネーム変更01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/eb61c895-0275-87fc-c048-943568f5ccfd.png)

:::note warn
本当にユーザー名を変更しますか?
これを読まないと思わぬ悪いことが起こります！
・古いプロフィール ページにはリダイレクトは設定されません。
・Pages サイトにはリダイレクトを設定しません。
・リポジトリ (Web および Git アクセス) のリダイレクトを作成します。
・名前の変更が完了するまでに数分かかる場合があります。
:::

私は英語が苦手なのでGoogle翻訳さんに翻訳してもらいました。
強めのメッセージにどきどきしてしまいます…。

おそらく大丈夫そうだけど、一応記事を確認してみることにします。

https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-user-account-settings/changing-your-github-username


>古いユーザ名の下にあるリポジトリへの参照のほとんどが、自動で新しいユーザ名に変わります。

どうやらユーザー名を変更しても自動でリポジトリのURLもリダイレクトしてくれるようです。

>ユーザ名を変更した後、GitHub は自動的にあなたのリポジトリへの参照をリダイレクトします。
・既存のリポジトリへの Web リンクは引き続き機能します。 変更を加えてから完了するまでに数分かかることがあります。
・ローカルリポジトリのクローンから古いリモートトラッキング URL へのコマンドラインプッシュは引き続き機能します。

ローカルリポジトリからのプッシュもそのままできるみたいです。
ちょっと一安心。

>古いユーザ名の新しい所有者が、あなたのリポジトリと同じ名前のリポジトリを作成すると、リダイレクトエントリが上書きされ、リダイレクトは機能しなくなります。 こうしたことが起こることを防ぐため、ユーザ名を変更したら、既存のすべてのリモートリポジトリ URL を更新することをお勧めします。 

ここで少し気になる記述を発見。
__以前のユーザー名を、再度、別のアカウントで使用して同じリポジトリ名で作成するとURLが上書きされてリダイレクトが効かなくなるようです。__
表示やプッシュはそのままできるとはいえ、念のため更新しておいた方が良さそう。

これで注意点も確認できたので、先ほどのポップアップに戻って、赤文字ボタンの「I understand. let’s change my username」ボタンをクリック。

その後、変更したいアカウント名を入力する画面が表示されます。

![gitのユーザーネーム変更02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/240ab1f0-36d2-15a3-009f-6a80e98d5d43.png)
こちらに新しいユーザー名を入力して「Change my username」をクリックすればユーザー名の変更完了です。

# URLの確認

ユーザー名が変わると、GitHubのURLが変更されました。
どのように変わったのか確認してみましょう。
GitHubのリポジトリもそれぞれ、
```
新しいユーザー名/リポジトリ名
```
に変更されていました。
試しに…
```
https://github.com/以前のユーザー名/リポジトリ名
```
のURLでリポジトリを開いてみると、
```
https://github.com/新しいユーザー名/リポジトリ名
```
として新しいユーザー名に紐づいてリダイレクトされたのが分かります。
もし、別のアカウントで「以前のユーザー名/リポジトリ名」でリポジトリが作られてしまうと、このリダイレクト表示が出来なくなってしまうということなのですね…。

# ローカルでの状態を確認
リモートリポジトリを紐づけたフォルダに移動して、ターミナルで「$ git remote -v」コマンドを使ってURLを確認。
```
$ git remote -v
origin git@github.com:以前のユーザー名/リポジトリ名.git (fetch)
origin git@github.com:以前のユーザー名/リポジトリ名.git (push)
```
さすがにここは以前のユーザー名のままになっています。
このままでもプッシュできるということなのでしょうか？
確認してみましょう。
データを更新してインデックスに追加、コミット、プッシュしてみると…できました！

ローカルでの表示が以前のユーザー名のままでも問題ないようですね。
ただ、やっぱり気になるのと今後不具合が出てくるのかもと心配なので
```
$ git remote set-url origin git@github.com:新しいユーザー名/リポジトリ名.git
```
でローカル上の表示も新しいユーザー名に変更しました。

こんなものでしょうか？
まだまだGitについても分からないことだらけですが、少しずつ仕組みが分かってきたような気がします。

# まとめ
まだGitに触れて1ヶ月程度の初心者のため、ぼんやりとしか認識できていない状態ですが、使い始めた当初と比べると少しずつ仕組みも分かってきたように思います。

記事を作成しながら、あれってどういう意味だっけ？と立ち返ることも多く、確認しながらの作業になってとても勉強になりました。
M5stack StampS3を秋月でADCして遊ぶ。(ESP32-S3)(アナログデジタルコンバータ)


目的
ADCのテスト
なぜか0から4096

結果(MCP9701を繋いだ時)

![o_coq017.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a83306f4-5d3b-c005-f02d-514ebcbdbb76.jpeg)


プログラム

```c++


//ADC_SERIAL_TEST1_M5S3


#define ADC 5

void setup() {

  Serial.begin(9600);

  pinMode(ADC,INPUT);

}

void loop() {

  int sensorValue = analogRead(ADC);

  Serial.printf("(ADC) = %d\r\n",sensorValue);

  delay(1000);

}


```
【Excel】数値と文字列のデータをランダムに投入したい

# はじめに
以前、以下の記事を公開しました。

https://qiita.com/mmm_qiita/items/68e91d05cb82baddfeb4

https://qiita.com/mmm_qiita/items/bf6c4a5615c58014f9bb

今回は、データを作成するにあたってランダムに数値を、その数値に併せて文字列のデータを生成する方法をご紹介します。

SQLでデータベースに投入する（いつもながら膨大な）検証データを作成中に、

「**条件によって"数値"と"文字列"のデータを該当カラムに割り当てたいなあ、量が多いから直打ちの値のコピペじゃまかなえないや**:crying_cat_face:」

と思い、私なりに試行錯誤しながら実現させました。

# 使用するExcel関数
まず背景ですが、私は該当の複数カラムにてデータを紐づける必要があったので、今回ご紹介する構文になりました。

* 業務形態によって部署コード、部署名が異なる
* 同じ業務形態の中でも複数部署が存在するため、適当に割り当てる必要がある

| gyomu_cd | gyomu_name | busyo_cd |busyo_name|
|:--------:|:----------:|:--------:|:--------:|
| 1        | 本社       | 1        | 営業部    |
| 1        | 本社       | 2        | 管理部    |
| 1        | 本社       | 3        | 採用部    |
| 2        | 現場       | 4        | 開発部    |
| 3        | 海外       | 5        | 海外事業部|

"業務形態 = 1"の中に複数の部署があるので、「"業務形態 = 1"ならこの部署！」にできないんですよね。
こちらを実現させるのに、私は以下のExcel関数を使用しデータを作成しました。

* <font color="Red">**IF関数**</font>
* <font color="Red">**IFS関数**</font>
* <font color="Red">**RAND関数**</font>

▼ データの完成形はこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/c90554f7-3665-1c82-2c29-4ce79a927640.png)

### ■ 適切かつランダムに"数値"を割り当てる
D列に以下を入力
```
=IF(B3=1,IFS(RAND()*3<1,"1",RAND()*3<2,"2",RAND()*3<3,"3"),IF(B3=2,4,5))
```

"業務形態 = 1"のときは、RAND関数を使用して"1", "2", "3"を生成し、"業務形態 = 2"のときは1つ目のIF文のfalse、"業務形態 = 3"のときは2つ目のIF文のfalseのところに入れました。

### ■ 数値に対応した"文字列"を割り当てる
E列に以下を入力
```
=IFS(D3=1,"営業部", D3=2,"管理部", D3=3,"採用部", D3=4,"開発部", D3=5,"海外事業部")
```
または、
```
=IF(D3=1,"営業部",(IF(D3=2,"管理部",(IF(D3=3,"採用部",(IF(D3=4,"開発部",IF(D3=5,"海外事業部"))))))))
```

今回、部署が5つでIF文にすると可読性が低くなってしまうので、IFS関数を使用しました。

部署コードが関数のままだと、RAND関数を使用している影響で部署コードが"1", "2", "3"のとき<font color="Red">"**#N/Aエラー**"となり部署名が正しく反映されない</font>ので、値貼り付け後部署コードの:warning:マークをクリックし、"**数値に変換する**"で部署名を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/7cfcd236-d849-e303-4c47-dae16869baef.png)

※RAND関数については、『[【SQL】膨大なINSERT文をとにかく楽して生成したい](https://qiita.com/mmm_qiita/items/68e91d05cb82baddfeb4)』にて説明したので、割愛させていただきます。

#### ▼ **IFS関数**
```
=IFS(論理式1, true1, 論理式2, true2, 論理式3, true3)
```
"論理式1"が真なら"true1"の値、論理式1が偽で"論理式2"が真なら"true2"の値を返します。
IF関数を入れ子にするのと同等ですが、IFS関数は複数条件を順に指定することができます。

#### ▼ **IF関数**
```
=IF(論理式, true, false)
```
こちらはみなさん使用することが多いかと思います。
条件が1つや2つの場合は、IF関数でもシンプルにまとまります。

# 最後に
今回は、ランダムに数値と文字列のデータを作成する方法をご紹介いたしました。
もっと良い方法があるかもしれないですが、効率化をつきつめて自分で実現できたときってすごく気持ちいいですよね。

最後までお読みいただき、ありがとうございました:dancer_tone1:
Lancersの仕様あれこれ: 作業画面のリンク，作業内容の修正，リンクの有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/0609003d-5813-392f-7d95-09742b4b850c.png)

ランサーズの仕様についてお問い合わせさせて頂き，回答を頂けたので共有いたします。
ランサーズの皆様はお忙しいと思うので，できればここで解決した事案が出ると嬉しいです。
※この回答は2024/03/25時点でのものです。

# 質問1: 作業画面のリンクは取得できるのか？
## 質問文
作業画面(「この作業をはじめる」を押した後の画面)のリンクを取得することはできますか？作業を始めた人に一度外部リンクに飛んでもらい，外部リンクでの作業を終えたとき，作業画面へリンクで飛んでもらいたいのですが，どうやらhttps://www.lancers.jp/result/create/****の****に入る数字はプレビュー等と違うようです。

## 回答
>作業画面を押した後のリンクは事前に取得することはできず、申し訳ございません。
>ご認識のとおり「/result/create/****」の「****」部分につきましては、プレビュー画面等のURLとは異なり、毎回変わります。
>このため、お手数ではございますが、依頼詳細画面から 「作業を始める」ボタンを押して作業開始してもらう形でご依頼いただけますようお願いいたします。

# 質問2: 作業内容の修正について(誤字脱字など)
## 質問文
依頼内容の編集はできますか？
例えば依頼内容に表記ミスが見つかった場合，修正はできないのですか？

## 回答
> タスク方式では、依頼作成後に記載内容の修正をすることはできない仕組みです。
> 依頼後は「追記」をすることは可能となっておりますので、修正が必要な場合には、追記でご対応いただけますようお願い申し上げます。

# 質問3: 外部リンクの有効化
## 質問文
外部リンクに飛んでもらうためのリンクの有効化についてご教授お願いします。
プレビュー画面でリンクを入力しても，それが有効化されてるようには見えません。
文字にリンクを埋め込むこともできませんでした。
これらを実現する方法はありますか？

## 回答
> 作業フォーム上でリンクとして有効化する方法はご用意がなく、申し訳ございません。
> コピペなどをしてアクセスしていただく必要がございます。
> ご不便をおかけし恐れ入りますが、何卒よろしくお願いいたします。

大変丁寧にご回答いただきました。
Logicool: capsとctrlを入れ替えたい for Mac

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/8f78e088-f266-bd24-8528-a3f5e01b0357.png)


まず，システム設定の左側で「キーボード」を開いて，「キーボードショートカット…」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/f657fdbc-079b-116f-5ad1-03e443b9e0fa.png)

開いた画面の左側で，「修飾キー」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/e8d1a676-8b66-f2eb-fc57-c2a611a4e72f.png)

右上にある「キーボードを選択」で，変更したいキーボードを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/ec339267-19c3-5a3c-2623-626d4e0370c6.png)

表示された画面で，
「Caps Lock (⇧) キー」の右側を「^ Control」に，
「Control (^) キー」の右側を「⇧ Caps Lock」に，
それぞれ変更したら完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/729abfda-9025-9633-cf28-e9aa614135ea.png)

この説明は， [LogicoolのThe Master Series MX MECHANICAL](https://www.logicool.co.jp/ja-jp/products/keyboards/mx-mechanical.html) を利用した場面に基づく説明です。
jsPsych: 複数行の文字列を楽に入力したい

基本はjsPsychの公式サイトにほとんど載っているのですが，ここに日本語の学習記録として残します。

https://www.jspsych.org/7.3/tutorials/rt-task/

# 結論
` : バックティックで囲むだけ
例えばこんな感じです。

```
`
    上に書いてある記号はバックティックと言います。<br>
    複数行を画面に表示する方法はいくつかありますが，<br>
    この方法が一番楽だと思います。<br>
    ちなみに，各行に書いているbrを<>で挟んだ記号は改行です。<br>
　　　　　　　　あと，インデントは好みなので，別に必要ありません。<br>
    一番最後も，バックティックを書いたら完了です。
`
```

これまでは以下のような感じで，"~"を+で繋いで書いていました。

```
"自分が学習を進めたサイトでは,<br>" +
"この方法が紹介されていたので，<br>" +
"特に何も考えずこれを使ってました。<br>" +
"jsPsychの公式を見たらもっと楽な方法が書いてあって,<br>" +
"衝撃を受けました(笑)。<br>" 
```

それより前は以下のような感じで横になが〜く書いてたので，上記は上記で革命だったんですけんどね(笑)

```
"一つの方法でなんとかなってると，新しい方法を知るのが遅くなりがちです。ちゃんと勉強しないとですね。"
```

特にこれ以上書くこともないので，これで今日は終わりにします。
jsPsych: 文字が横に広がってしまうのをなんとかしたい

「前置きはいいからやり方を早く！」という方は"やり方"からご覧ください。

# 困りごと

jsPsychで実験画面に文字を表示すると，以下のように真ん中で横広になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/ab27d27d-fa8d-2c7e-c8c7-b9f249f79526.png)

左寄せだけなら，下のようにstyle="text-align:left"を加えるとできるのですが，

```
var buttonRespnse = {
    type: jsPsychHtmlButtonResponse,
    stimulus: `<p style="text-align:left">  // 該当箇所
            【調査参加への同意】<br>
            回答頂いたデータは統計的に処理され，個人が特定されることはございません。<br>
            実験の結果やデータについては，学会発表や論文，研究の透明性を向上させるために公開されることもありますが，これらについても個人が特定されない形で行われます。<br>
            また，ご協力いただいた皆様が不利益を被ることも一切ございません。<br>
            回答を途中で中断することも可能であり，それによる不利益も一切ございません。<br>
            上記に同意して頂ける方は、「同意する」のボタンを押して、次のページに進んでください。<br>
        </p>`,　　// 該当箇所
　　　　　　　　choices: ["同意する"],
};
```

それでもやはり，下のように横広のままです。これだと横長ディスプレイを使ってる人には地獄です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/110ccb64-dbaa-cc2e-178b-0071e8ce4f4f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/092f6a7f-9d66-47a4-5f14-5287cf2bf36e.png)


もちろん，自分でbrを使って改行箇所を指定してもいいのですが，それだとより狭い画面では，表示がでこぼこに…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/c9d77468-6233-ce0b-667a-a0b619bf448a.png)


スマホでの回答者も想定するようなオンライン実験だと，これでは困るわけです。

つまり， **「左寄せ」と「改行は画面サイズor最大幅に合わせて」を両立したい**のですが，探してもすぐには方法が見つかりませんでした。

このnoteには，何とかそれを達成した勉強記録を残しておきます。

# やり方

下記コードのように， headのstyleでmax-widthを指定し，scriptでdiv class="instruction"を呼び出してあげるだけです。
**該当箇所は下記コードにコメントアウト**で明示しているので，確認してみてください。

```
<!DOCTYPE html>
<html>

<head>
　　　　　　　　〜ここではプラグインのインストールなどを〜

    <!-- 該当箇所1はここから -->
    <style>
        .instruction {
            max-width: 30rem;  // 幅を指定
            text-align: justify;　　// 左寄せ&両端揃え
        }
    </style>
    <!-- 該当箇所1はここまで -->
</head>

<body></body>
<script>
    var jsPsych = initJsPsych({
        on_finish: () => {
            jsPsych.data.displayData();
        }
    });

    var timeline = [];

    var buttonRespnse = {
        type: jsPsychHtmlButtonResponse,
        /* 該当箇所2は<div class="instruction">>と</div>　*/
        stimulus: `<div class="instruction">
                    【調査参加への同意】<br>
                    回答頂いたデータは統計的に処理され，個人が特定されることはございません。<br>
                    実験の結果やデータについては，学会発表や論文，研究の透明性を向上させるために公開されることもありますが，これらについても個人が特定されない形で行われます。<br>
                    また，ご協力いただいた皆様が不利益を被ることも一切ございません。<br>
                    回答を途中で中断することも可能であり，それによる不利益も一切ございません。<br>
                    上記に同意して頂ける方は、「同意する」のボタンを押して、次のページに進んでください。<br>
            <div>`,
        choices: ["同意する"],
    };
    timeline.push(buttonRespnse)

    // 実行
    jsPsych.run(timeline);

</script>

</html>
```

これで，下のように広い画面で表示しても，横幅を狭くすることができます。

ちなみに，**text-alignの部分**も，地味に書き換えてます。大量の文章を左寄せ＆両端揃えで，画面中央に表示するなら，今回instructionで指定してる形がおすすめです。
CpawCTF Q11.[Network]pcap

# 解法
WIRE SHARKを用いてパケット通信の内容を確認する（下図）．

![スクリーンショット 2024-03-26 8.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908503/d11d4dbd-6514-c116-bb08-010c0b064081.png)

確認するとcpaw{gochi_usa_kami}フラッグを入手できる．

# WIRE SHARK
WIRE SHARkとは，ネットワークで繋がれた端末間へのデータを送受信する仕組みを確認することができるツール．具体的にはLAN上に流れているパケットを「見える化」する．
これにより，LAN上に流れているパケットの種類や値というパケットの中身を把握することができる．

Wiresharkの使い方やデータの見方についての概要を説明した[記事](https://hldc.co.jp/blog/2020/04/15/3988/)があるので，ぜひそれを見てほしい．私が参考にした記事より，できること・できないことについて以下に記したので，参考にしていただけると嬉しい．

### できること
- ネットワークインターフェースからパケットをキャプチャする
- データ領域ごとで内容の確認
- キャプチャしたデータの確認・保存
- パケットのフィルタリング
- CSVやC言語配列，JSON形式でのエクスポート
- 通信シーケンスの表示
- USBやBluetoothなどのプロトコルをキャプチャ・解析
### できないこと
- WIRE SHARK自体で通信する
- ネットワークの異常時のアラーム（侵入検知）


# 参考文献
https://knowledge.sakura.ad.jp/6286/

https://hldc.co.jp/blog/2020/04/15/3988/
jsPsych: テキスト入力で2行以上だとfont-sizeの変更が反映されない

# 困りごと

参加者が自由記述の形式で回答するときのフォントサイズは，jspsychのCCSファイル(jspsych.css)を書き換えることで変更可能です。

https://qiita.com/KodaiToda32/items/03aa08bc0c488735ec5d

具体的には，以下の部分のfont-sizeの部分を書き換えるとOK

```
/* Form elements like input fields and buttons */
.jspsych-display-element input[type=text] {
  font-family: "Open Sans", "Arial", sans-serif;
  font-size: 2rem;  /* ここを書き換える */
  line-height: 1.2;
}
```

例えば表示される文字の大きさは1remで，入力する文字の大きさは2remだと，こんな感じで入力文字だけでっかくなります↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/eab0d6e0-9e4f-6c17-9bd1-ef54f3414447.png)

ただ，この反映は，1行で入力する場合しか反映されないんですよね・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/6ed8a68c-c7a8-0963-9c3f-b6d4775d5fa0.png)

上の画像みたいな場合なら問題ないんですが，表示文字を3remにする必要があるとき，入力文字が1remのままだと困るわけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/22b82ec3-a0f9-6815-d043-d674dd1df6eb.png)

これ，実はjsPsychのplugin-survey-textで参照している文字の大きさに関するCSSが，1行のときと2行のときで違うからなんですよね。。。

そこで今回は，この問題を解決するための方法をメモ

やり方

めっちゃ簡単です。下記のように書き換えてみてください。

```
/* Form elements like input fields and buttons */
.jspsych-display-element input[type=text],
.jspsych-display-element textarea {
  font-family: "Open Sans", "Arial", sans-serif;
  font-size: 2rem;
  line-height: 1.2;
}
```

1~2行目までが変化してます。

具体的には， **.jspsych-display-element textarea が書き足されてます**(input[type=text] の後ろにある , をお忘れなく)。

jsPsychのplugin-survey-textでは，1行だけの入力欄を作る場合にはinput要素を用いるんですが，2行以上の場合はtextarea要素を用いています(なお，これは基本的なHTML・CSSによるWebページでも同様です)。

ただこの，textareaに関する記述が，ダウンロードできるCSSファイルにはなかったんですよね。。。

そこで，自分で書き足してあげよう！というのが，今回の記事でやってることでした。
jsPsych: リッカート尺度の文字サイズを変えたい

# 困りごと

jsPsychでは，CSSファイルを書き換えることで，表示される文字や入力する文字の大きさを一気に変えることができます。

https://qiita.com/KodaiToda32/items/03aa08bc0c488735ec5d

https://qiita.com/KodaiToda32/items/bd8567a9604b0582fa9a

**しかしながら，リッカート尺度の選択肢だけ，上記の操作では大きさが変わりません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/19386bb6-c85f-df07-a9c1-14ef70c7a1c1.png)

ここでは，リッカート尺度の選択肢として表示される文字の大きさを変える方法について解説していきます。

# やり方

plugin-survey-likert.jsを書き換えます。

書き換えるのは以下の部分↓

```
var html = "";
    // inject CSS for trial
    html += '<style id="jspsych-survey-likert-css">';
    html +=
        ".jspsych-survey-likert-statement { display:block; font-size: 16px; padding-top: 40px; margin-bottom:10px; }" +
        ".jspsych-survey-likert-opts { list-style:none; width:" +
        w +
        "; margin:auto; padding:0 0 35px; display:block; font-size: 14px; line-height:1.1em; }" +
        ".jspsych-survey-likert-opt-label { line-height: 1.1em; color: #444; }" +
        ".jspsych-survey-likert-opts:before { content: ''; position:relative; top:11px; /*left:9.5%;*/ display:block; background-color:#efefef; height:4px; width:100%; }" +
        ".jspsych-survey-likert-opts:last-of-type { border-bottom: 0; }" +
        ".jspsych-survey-likert-opts li { display:inline-block; /*width:19%;*/ text-align:center; vertical-align: top; }" +
        ".jspsych-survey-likert-opts li input[type=radio] { display:block; position:relative; top:0; left:50%; margin-left:-6px; }";
        html += "</style>";
```

上記について， **5行目の「font-size: 16px」や，8行目の「font-size: 14px」** の部分を書き換えてみましょう。

※書き換える前に，plugin-survey-likert.jsのコピーを作成し，そちらを書き換えるようにすると，ミスをしても簡単にやり直すことができるのでおすすめです。

例えば，以下のように書き換えると，

```
var html = "";
    // inject CSS for trial
    html += '<style id="jspsych-survey-likert-css">';
    html +=
        ".jspsych-survey-likert-statement { display:block; font-size: 2.5rem; padding-top: 40px; margin-bottom:10px; }" +
        ".jspsych-survey-likert-opts { list-style:none; width:" +
        w +
        "; margin:auto; padding:0 0 35px; display:block; font-size: 2.5rem; line-height:1.1em; }" +
        ".jspsych-survey-likert-opt-label { line-height: 1.1em; color: #444; }" +
        ".jspsych-survey-likert-opts:before { content: ''; position:relative; top:11px; /*left:9.5%;*/ display:block; background-color:#efefef; height:4px; width:100%; }" +
        ".jspsych-survey-likert-opts:last-of-type { border-bottom: 0; }" +
        ".jspsych-survey-likert-opts li { display:inline-block; /*width:19%;*/ text-align:center; vertical-align: top; }" +
        ".jspsych-survey-likert-opts li input[type=radio] { display:block; position:relative; top:0; left:50%; margin-left:-6px; }";
        html += "</style>";
```

以下のように選択肢の部分も変更することができます。※下の画像では教示文，選択肢ともに2.5remです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/a9edddc7-ed9a-5ed6-67c4-5633b69ccd69.png)

ここら辺はスマホ用の調査を実施する際に役立つので，是非試してみてください〜
floatで横並びにならない (超端的に)

以下HTMLについて，a, b, cを横並びにしたいとき

```
<div class="parent">
  <div class="child">a</div>
  <div class="child">b</div>
  <div class="child">c</div>
</div>
```

CSS（失敗例）

```
.parent {
  float: left;
}
```

CSS（成功例）

```
.child {
  float: left;
}
```

parentの中身を並べたいからといって，parentのCSSをいじってもダメ，と言うことですね

ただ実は，親要素(parent)のCSSをいじる方法もあるので，そちらについては以下をご参照ください

https://qiita.com/KodaiToda32/items/f9c0bde25ad8cca57c25

こちらに記事に書いてあるやり方だと，floatで背景ズレる問題 (詳細は以下の記事参照) も解決できるので，おすすめです。
floatを指定すると背景がズレる・消える(簡潔に解説)

# 困りごと

```
<div class="lessons">
  <div class="lesson">
    <div class="lesson-icon">a</div>
  </div>
  <div class="lesson">
    <div class="lesson-icon">b</div>
  </div>
  <div class="lesson">
    <div class="lesson-icon">c</div>
  </div>
  <div class="lesson">
    <div class="lesson-icon">d</div>
  </div>
  <!-- 下記については「解決策」で解説する -->
  <div class="clear"></div>
</div>
```

上記htmlについて，下記のようなCSSだと，親要素で指定した背景の高さは0になってしまいます。※floatを指定しない場合は，子要素を包み込む高さになります

```
.lessons {
  background-color: red;
}

.lesson {
  float: left;
}
```

![floatを指定した場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/d00a676d-ce74-3ed5-3cab-fc86543ea45c.png "floatを指定した場合")
floatを指定した場合

![floatを指定した場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/5216311a-b2be-0d02-1983-aa8a8dde0670.png "floatを指定した場合")

floatを指定しない場合

# 解決策

そこで，下記のように，clearクラスを設定する。htmlに関しては，下から2行目のdiv class="clear"が該当

```
.lessons {
  background-color: red;
}

/* 加筆した箇所 */
.clear {
  clear: left;
}

.lesson {
  float: left;
}
```

これにより，lessonで指定したfloatは解除され，子要素を包み込む高さに設定されます。

例えば今回の例だと，下図のように横並びのまま親要素で指定した背景が子要素を包み込む形で反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/4d1fef72-5772-7878-7d22-bda11706d398.png)

ただ実は，これより簡単に解決する方法もあるんです。(今回はあくまでfloatにおける問題の解決策を書いてます)

詳細については，以下をご参照ください〜

https://qiita.com/KodaiToda32/items/f9c0bde25ad8cca57c25
float: leftよりも簡単に横並びを実現する方法

やり方だけサクッと知りたい方は「やり方」から， より理解を深めたい方は「この記事の位置付け」からどうぞ〜

# この記事の位置付け

下記の記事では，floatを使って横並びにならない人への解決策を簡潔に書きました。

https://qiita.com/KodaiToda32/items/82fb762df5d37bf750fb

具体的には，親要素ではなく，子要素にfloatを指定してあげようね，と言う内容でした。

ただ，子要素のclassを複数パターン使いたい場合もあるかと思います。

こちらの記事では，親要素のCSSを書き換える形で，横並びを実現する方法について書いていきます。

ちなみに，以下記事ではfloatを指定した際に背景がズレる・消える問題について書いているのですが，この記事は，そちらについてのより簡単な解決策にもなってます。

https://qiita.com/KodaiToda32/items/6ce1d75684a55430091f

# やり方

ズバリ，以下のようなhtmlについて，a, b, cを横並びにしたいときには，

```
<div class="parent">
  <div class="child">a</div>
  <div class="child">b</div>
  <div class="child">c</div>
</div>
```

以下のようなCSSを書くといけます。

```
.parent {
  display: flex;
}
```

ちなみに，背景については，そのまま以下のように指定するといけます。

```
.parent {
  display: flex;
  background-color: red;
}
```
Discord.js でBOTのステータスをスマホにする方法

# スマホステータスとは
Discordを使用している端末がスマホである場合、このようなステータスになります。

これをスマホステータス（正式名称は知りません）と言います。

![スクリーンショット 2024-04-04 4.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582278/06ebd00a-329d-7b38-7796-6f94da07d20d.png)

# どうやるの？
`clinet` 部分で `ws` をいじってやる。

```js
const { Client, GatewayIntentBits, SimpleShardingStrategy } = require('discord.js');

const client = new Client({
   intents: [
      GatewayIntentBits.Guilds
   ],
   ws: {
      buildStrategy: (manager) =>
         new (class MobileSimpleShardingStrategy extends SimpleShardingStrategy {
            constructor(manager) {
               manager.options.identifyProperties = {
                  os: 'ios',
                  device: 'device',
                  browser: 'Discord iOS'
               };
               super(manager);
            }
         })(manager)
   }
});

client.on('ready', () => {
    console.log(`起動: ${client.user.tag}`);
});

client.login('token');
```

# 起動してみる
```
node index.js
```
![スクリーンショット 2024-04-04 4.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582278/0570d0d3-5b03-a381-dd67-62bd3bfaa902.png)

スマホステータスになってますね！
![miro.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582278/c5d432f0-7e58-c119-6adc-7e3bf8621f10.png)

# 最後に
無料で神アプリあればコメント欄に投げてください。

有料かつ安くてあんまり人気はないけど実は結構優れているアプリがあればコメント欄に投げてください。
【JavaScript】スプレッド構文について

### スプレッド構文のできること、使い方
1. 配列の展開と結合
1. オブジェクトの展開と結合
1. 配列のコピー

### 一般的な配列の代入
``original = [ 1, 2 ] ``
のときに

``copy = original``
とした場合


bはaの参照を持っているため
``original[0] = 100``とすると

copy[0]の出力も100になる。



### 配列のコピー

```jsx
const original = [1, 2, 3];
const copy = [...original];

console.log(copy);

```
このときに
```jsx
original[0] = 100;

console.log(original);
console.log(copy);
//出力:original => [100, 2, 3]
//出力:copy => [1, 2, 3]
```
となる。


### 配列の結合

```jsx
const array1 = [1, 2];
const array2 = [3, 4];
const combined = [...array1, ...array2];

console.log(combined);
//出力: [1, 2, 3, 4]
```

``...array1``はarray1を展開したものになるので
...array1自体は配列ではない。
なのでarray1自体をそのままイミュータブルな方式でコピーしたいだけの場合
```jsx
const array1 = [1, 2];
const copy = [...array1];
```
にしなければいけない。
``copy = ...array1``
じゃないので注意。

逆にいうと全て展開されるため
複数の配列を同一の1次元配列にしたい場合も非常に便利。

### 配列に要素を追加したい場合

通常のやり方ではなくイミュータブルなコピーをしてからそこに追加するやり方

```jsx
const original = [1, 2];
const newElement = [...original, 3, 4];

console.log(newElement);
//出力: [1, 2, 3, 4]
```
多分
```jsx
const original = [1, 2];
const newElement = [...original];

newElement.push(3, 4);
```
としても同じだと思われる。


### オブジェクトのコピー

```jsx

const original = { a: 1, b: 2 };
const copy = {  ...original };

console.log(copy);

//出力: { a:1, b:2 }
```
こちらもオブジェクトが展開されるので{}で囲んであげないといけない。

（オブジェクトが展開されるってのがいまいちしっくりこない）



### オブジェクトの結合

```jsx
const obj1 = { a: 1, b: 2 };
const obj2 = { c: 3, d: 4 };
const merged = { ...obj1, ...obj2 }

console.log(merged);

//出力: { a: 1, b: 2, c: 3, d: 4 }
```

となる。


### まとめ

スプレッド構文は展開を行うため、
それを元の形と同じ（配列なら{}など）に入れることで
イミュータブルなコピーを作成することができる。
Giải đáp: Cho Chó Uống Vitamin B1 Của Người Được Không ?

Thú cưng của bạn cũng như người bình thường, cũng mắc bệnh hoặc thiếu canxi/vitamin. Do đó việc cho chúng ăn đủ bữa thôi là chưa đủ, đôi khi cúng ta cũng cần bổ sung Vitamin cho chúng. Vitamin B1 được xem là một trong những loại vitamin cần thiết và quan trọng nhất đối với vật nuôi. Vậy cho chó uống vitamin B1 của người được không ? và lợi ích của việc cho chó uống B1 là gì ? Đây cũng là câu hỏi được khá nhiều bạn trẻ đang nuôi cún cưng thắc mắc. Vậy hãy cùng Lu’s Home tìm hiểu kỹ hơn vấn đề này qua bài viết chi tiết dưới đây nhé ! https://luhome.net/cho-uong-vitamin-b1-cua-nguoi-duoc-khong/
[0e3eb32a8a1ad4815111792ba231572b.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762775/56b4db89-991d-85db-f0f3-715bd13e9f04.jpeg)
#11(工事中)【勉強メモ】エヴァンス本からざっくり理解するDDD

## 目標
・ふわっとした理解のDDDについて[エヴァンス本](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=17W0M5YAY0R9Z&dib=eyJ2IjoiMSJ9.qtIEGNumTF4Fq3OG4r7BcgPPpMccQaiAMFjoQiYsRfAUl2LJ3kucBAwXJG1pE1-9MMyozf_R6XnUk8kwhpkIPyRMzsu94DrC82a2cWHXn2TDjembTcFwG0z4uuYeu7EY_VF_p_KcGaJhu-sFQP2IfF8BXdAN9RWcUsZLGOA8hIhkuAKrptA3cagpPrF5ZoxXjjZ9ctVxNzHN-qanc6enklCzFiHeCY1UpXho238Cgd4eMsXlRTbQ5u_T9ZSbUOj5EOjKzf1jx0xSJbTwFJrRetDuJaorGcsbbNpAuJkvNAs.F3zE4YfUXPLj7DRzsSV4wM07EgTKoLqmpU491uMjIhw&dib_tag=se&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1710421495&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%2Caps%2C279&sr=8-1)を通して体系的に学習する
・各章の要約をアウトプットすることで知識を定着させる

## 前回の記事
第10章の内容は以下でまとめています。

https://qiita.com/kotemendo2819/items/d59acb2188bbb9570018

## 【第11章】アナリシスパターンを適用する
・アナリシスパターン
ビジネスモデリングにおける共通の構造を表す、概念グループ。
ただ1つのドメインしにか適さないものもあれば、多くのドメインに及ぶものもある。

アナリシスパターンは技術的な解決策ではなく、特定のドメインでモデルを考え出すのを支援する手法。

## アナリシスパターンは活用すべき知識である


## まとめ

次は「デザインパターンをモデルに関係づける」を学んでいく。

https://qiita.com/kotemendo2819/items/80b3417e34f52b47d9f4

参考になったらいいねやコメントおまちしています！！