OmniAICreator/Qiita-1.07M huggingface dataset:
Testlink DB (MySQL) のレプリケーション。ただし、普通にやると失敗する

# システムダウンに備えて Testlinkのデータベースをレプリケーション

## Master での作業

* レプリケーション用のユーザーを作成しておきます
* my.ini [mysqld] に追記します。

```my.ini
server-id=783
log_bin=mysql-bin
log_error=mysql-bin.err
expire_logs_days=7
binlog_do_db=testlink
```

DB の Flush

```sql
MariaDB [(none)]> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show master status;
+------------------+----------+------------------------+------------------+
| File             | Position | Binlog_Do_DB           | Binlog_Ignore_DB |
+------------------+----------+------------------------+------------------+
| mysql-bin.000005 |      758 | testlink               |                  |
+------------------+----------+------------------------+------------------+
```
DB Backup

```mysqldump
C:\xampp\mysql\bin>mysqldump --single-transaction -u root -p testlink > d:\backup\testlink.db
Enter password: ****
```
テーブルのアンロック
```sql
MariaDB [(none)]> unlock tables;
```
# Slave での作業

スレーブ側 phpMyAdmin config.inc.php で下記の設定を行う。
$cfg['AllowArbitraryServer'] = true

my.ini [mysqld] に追加
```my.ini
server-id=908
log_bin=mysql-bin
read_only
```
DB Restore

```sql
# mysql -u root -p testlink < D:\Backup\testlink.db
Enter password: ****
```
レプリケーション設定コマンド（SQL)
```sql
CHANGE MASTER TO 
MASTER_HOST='172.100.100.100',
MASTER_USER='replica',
MASTER_PASSWORD='xxxxxx',
MASTER_LOG_FILE='mysql-bin.000005', 
MASTER_LOG_POS=758; 
```
レプリケーション開始

```SQL
START SLAVE;
```

# 結果

SQL> show slave status\G

でエラーなし、レプリケーション開始できたように見える。
その後、マスター側 Testlink にログインし、更新をかけたところスレーブには反映されておらず、レプリケーションがストップしている。

SQL> show slave status\G　で確認するとエラーになっている。

```Error
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '308215' for key 'PRIMARY'' on query. Default database: 'testlink'. Query: '/* Class:tlEvent - Method: writeToDB */ INSERT INTO events (transaction_id,log_level,description,source,fired_at,object_id,object_type,activity) VALUES (0,2,'E_WARNING\nfopen(D:\\xampp\\htdocs\\testlink\\logsuserlog0.log): failed to open stream: No such file or directory - in C:\\xampp\\htdocs\\testlink\\lib\\functions\\logger.class.php - Line 1132','GUI',1678773894,0,NULL,'PHP')'
                 Skip_Counter: 0
```

:::note warn
Event Table の Duplicate Key エラー
PRIMARY KEY が重複している様子…
:::

## 原因

Event Table にはログイン情報等のイベントが記録される。データ更新の確認のため、Slave 側の Testlink にログインしていたため、イベントログが書き込まれ、イベントIDがマスター側から送られてきたものと重複したためエラーになったと思われます。

:::note warn
ログインするだけで Event Table に書き込みが発生します。
:::

:::note info
ログイン情報は、Event Table と Transaction table に書き込まれます。
どちらも ID Field が PRIMARY Key に設定されています。
:::


# 対処１

* Slave 側の Testlink には一切触れない（ログインしない）
   ただし、これでは Slave側で参照もなにも出来ないので使い勝手が悪い
  

# 対処２

* Testlink DB の Table： event & transaction の PRIMARY Key を通常の重複を許す Index に変えてしまう
* transaction table もログイン・イベント関連情報の記録に使われていて、トランザクションが入っているのではない
* Slave の Testlink にログインすると重複レコードが出来てしまうが...
* Testlink のイベント管理で、「イベントの消去」を行うと、event & Transaction Table が消去されるので、Testlinkとしての機能には影響はなさそう
Pythonでプロジェクト

Pythonで、簡単にプロジェクト作成が出来るので

## poetryのインストール

プロジェクトを作成するためにpoetryをインストールする。
poetryを下記コマンドで、インストールする。

```
curl -sSL https://install.python-poetry.org | python3 -
```

## プロジェクトを作成

下記コマンドで、プロジェクトを作成します。

```
poetry new Example
```

```
├── README.md
├── example
│   └── __init__.py
├── pyproject.toml
└── tests
    └── __init__.py
```

src配下で、ファイルを管理する場合、下記のコマンドを実行します。

```
poetry new Example --src
```

```
├── README.md
├── pyproject.toml
├── src
│   └── example
│       └── __init__.py
└── tests
    └── __init__.py
```

## 通信を実装

Pythonで通信する実装する。
Pythonで通信するためにrequestsを追加する。

```
poetry add requests
```

郵便番号を検索する。

```python:src/example/main.py
import requests

def main():
    url = 'https://zipcloud.ibsnet.co.jp/api/search'
    params = {'zipcode': '1030000'}
 
    response = requests.get(url, params=params)
    print(response.text)


if __name__ == "__main__":
    main()
```

## 実行

```
poetry run python src/example/main.py
```

## プロジェクトの共有

Exampleプロジェクトを共有した場合、下記コマンドでインストールすれば他の環境でも実行出来ます。

```
poetry install
```

初めてPythonを実装してみましたが、結構簡単にプロジェクト作成/実行出来るので、是非試してみてください。
paiza.ioでelixir その216

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
udp で、ブロードキャストで送信せよ。

# サンプルコード

```

{:ok, socket} = :gen_udp.open(20000, [:binary, active: false, broadcast: true])
|> IO.inspect
:ok = :gen_udp.send(socket, '255.255.255.255', 20000, "hello")
:gen_udp.recv(socket, 0)
|> IO.inspect


```

# 実行結果

```
{:ok, #Port<0.5>}
{:ok, {{172, 17, 0, 2}, 20000, "hello"}}

```

# 成果物

https://paiza.io/projects/9uuoW9pQXdeW4qXglITo5Q


以上。
XcodeプロジェクトからCocoaPods を削除するのに役立つ小さなチュートリアル

:::note info
Mac から CocoaPods がアンインストールされるわけではありませんが、CocoaPods からプロジェクトをクリアして Pod を削除するのに役立ちます
:::

## 次の手順に従って、Xcode プロジェクトから CocoaPods を削除します

1. ターミナルから ```cd``` コマンドでXcodeプロジェクトディレクトリに移動する

2. ターミナルから以下のコマンドを入力: 
```sudo gem install cocoapods-deintegrate cocoapods-clean```

3. ターミナルから以下のコマンドを入力: 
```pod deintegrate```

4. ターミナルから以下のコマンドを入力: 
``` pod clean ```

5. ターミナルから以下のコマンドを入力: 
```rm Podfile```

参考：
https://appmakers.dev/how-to-remove-cocoapods-from-xcode-project/
Gitでリモートリポジトリとの紐付けを解除する

# エラーメッセージ

```php:
git error: remote origin already exists.
```
新プロジェクトを作成し、リモートリポジトリと紐付ける段階で上記のエラーが出てしまう。


# 対応
現在紐づいているリモートリポジトリを確認するため、下記のコマンドを実行する。
```php:
git remote -v
```
***

出力されたリモートリポジトリの一覧から登録されている名前を確認し、紐付けを解除するための下記のコマンドを実行する。(初期値はorigin)
```php:
git remote remove origin
```

***

以上の手順を実行することで、新たに作成したリモートリポジトリとの紐付けが可能な状態にすることができる。
NetBSD/arm進捗-20230324

FreeBSD/armがくそなので、NetBSD/arm 10.99に引越し中です。

|SOC|arch|状況|
|:--|:--|:--|
|STR9102|ARMv4(FA526)|USB,ifが使えるようになっています。USB HD(sd0)にINSTALLして起動できました。flashから起動してifが使えるように機種依存コード入ってます|
|IXP422|AEMv5|OpenRD boot仕様調べ中。情報無いのでU-Boot焼き直しも考えたほうが良いかも|
|MV88F5181(Orion)|ARMv5|USB外してINSTALL起動できます|
|MV88F6281(Kirkwood)|ARMv5|普通に使えます。クロックが1G以上なのでかなり早いです。mrubyでfib(32)が10秒|
|5VT1310(RT1310)|ARMv5|ifにワークアラウンド入れてINATALLどうにか動きます。なぜかこのSOCはauxctlレジスタの読み込みができません|
|M83261(Comcerto)|ARMv6|USB,if使えるようになりました。USB HD(sd0)にINSTALLして起動できました。起動時のAESのチェックに引っかかることがあります。v6ですがクロックが600MHzくらいなのでそれほど早くありません。mrubyでfib(32)が23秒|
|A10|ARMv7|普通に使えます|

随時dmesgはNYC*BUG dmesgdにアップしてます。

https://dmesgd.nycbug.org/index.cgi?do=index

ソースはここにあります。

https://github.com/yamori813/netbsd-src

世界に一つだけのBSDは楽しいです。

FreeBSD/armがくそなのは以下の理由です。

* clangでビルドにくそ時間がかかる
* armv4のサポートがいつのまにか動かなくなっていた
* armv4は動かなくなったので消された
* armv5のサポートは起動はできるものの5%くらいのパフォーマンスしか出ない
* armv6は1176Fをターゲットにしていて、1136では不安定で使い物にならない
* armv6のサポートはまず1136をサポートして拡張された部分は追加でサポートするのがOS開発のセオリーだがそうなっていない
点群の最大値，最小値を取得する

点群の最大値，最小値を取得するサンプルコードです

```cpp:get_min_max.cpp
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/common/common.h>

int 
main (int, char**)
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud;
  cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::io::loadPCDFile<pcl::PointXYZ> ("your_pcd_file.pcd", *cloud);
  pcl::PointXYZ minPt, maxPt;
  pcl::getMinMax3D (*cloud, minPt, maxPt);
  std::cout << "Max x: " << maxPt.x << std::endl;
  std::cout << "Max y: " << maxPt.y << std::endl;
  std::cout << "Max z: " << maxPt.z << std::endl;
  std::cout << "Min x: " << minPt.x << std::endl;
  std::cout << "Min y: " << minPt.y << std::endl;
  std::cout << "Min z: " << minPt.z << std::endl;
  return (0);
}
```

引用元

 https://github.com/PointCloudLibrary/pcl/blob/master/examples/common/example_get_max_min_coordinates.cpp#L4
Docker Composeを利用してONLYOFFICE Workspaceのインストール方法

## はじめに

ONLYOFFICE Workspaceを素早くインストールする必要がある場合は、Docker Composeを使ったインストールが適しています。

以下の手順で、ONLYOFFICE Workspaceの全コンポーネントを一度に起動させていきましょう。

## ステップ1. Docker Composeのインストール

[Docker Compose](https://docs.docker.com/compose/install/#installing-compose)の公式ページにアクセスし、インストール手順に従います。

## ステップ2. GitHubのリポジトリをクローンする

Docker Composeのインストールが完了したら、[GitHubのリポジトリ](https://github.com/ONLYOFFICE/Docker-CommunityServer/)をクローンする必要があります：

```
git clone https://github.com/ONLYOFFICE/Docker-CommunityServer
```

## ステップ3. ONLYOFFICE Workspaceをインストールする

次に、リポジトリフォルダに切り替える必要があります：

```
cd Docker-CommunityServer
```

メールサーバーの正しい動作のために、使用する製品に応じていずれかのファイルを開いてください：

* [docker-compose.groups.yml](https://github.com/ONLYOFFICE/Docker-CommunityServer/blob/master/docker-compose.groups.yml)：Community Server用（ONLYOFFICE Groupsとして配布されている）
* [docker-compose.workspace.yml](https://github.com/ONLYOFFICE/Docker-CommunityServer/blob/master/docker-compose.workspace.yml)：ONLYOFFICE Workspace Community Edition用
* [docker-compose.workspace_enterprise.yml](https://github.com/ONLYOFFICE/Docker-CommunityServer/blob/master/docker-compose.workspace_enterprise.yml)：ONLYOFFICE Workspace Enterprise Edition用

次に、`${MAIL_SERVER_HOSTNAME}`変数をMail Serverの自分のホスト名で置き換えます。その後、docker-composeがインストールされていることを前提に、以下のコマンドを実行します：

```
cd link-to-your-modified-docker-compose
docker-compose up -d
```

Dockerを使ったONLYOFFICE Workspaceのインストールオプションについては、[こちら](https://helpcenter.onlyoffice.com/installation/workspace-install-docker.aspx)のページをご覧ください。
Qiita記事をブクマするとページオーナー情報が記録されているのでセルクマを強調できる

Qiitaにははてな連携がある。はてなIDを設定して連携すると、はてなブックマーク側からページオーナーとみなしてもらえる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32345/714cff54-d890-5e7e-9aeb-b459e591c77c.png)


ページオーナーとみなされると、自分でブクマしたら強調表示されたり、コメント一覧の公開設定ができたりする。
マルウェア

# マルウェア
有害な動作を行う目的で作成された```悪意のあるソフトウェアや悪質なコードの総称```。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4

### 具体的な種類
```コンピュータウイルス、マクロウイルス、ワーム、ボット、トロイの木馬、スパイウェア```

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
# 感想
マルウェアは悪いソフトウェアの総称だということがわかった。
ChatGPTを利用してメンタルヘルスをサポートするチャットボット

# ChatGPTを利用してメンタルヘルスをサポートするチャットボット

現代社会において、ストレスは避けられないものです。これは、仕事や家庭、学校など、さまざまな要因によって引き起こされます。しかし、ストレスが長期間続くと、メンタルヘルスに悪影響を与えることがあります。そのため、メンタルヘルスケアの重要性が増す中、AI技術を利用してサポートする方法が注目されています。

最近では、ChatGPT（GPT-3）が注目を集めています。ChatGPTは、自然な言語処理技術を利用して、特定のキーワードを抽出し、的確なアドバイスをすることができます。そのため、ChatGPTを利用してメンタルヘルスをサポートするチャットボットを作成することができます。

このチャットボットは、ユーザーの感情を理解し、的確なアドバイスをすることができます。例えば、ユーザーが「ストレスがたまっている」と入力した場合、ChatGPTはこのキーワードを認識し、ストレスの原因を尋ねたり、ストレス解消につながるアドバイスを提供することができます。このように、AI技術を利用することで、より精度の高いアドバイスを提供することができます。

このチャットボットが提供するアドバイスは、人間の専門家が提供するアドバイスに近いものです。そのため、ユーザーは、自分の状況に合ったアドバイスを得られることで、ストレス解消につなげることができます。

結論として、ChatGPTを利用してメンタルヘルスをサポートするチャットボットは、ストレス解消に役立つAI技術です。ユーザーの気持ちを理解し、的確なアドバイスを提供することで、よりよいメンタルヘルスをサポートすることができます。今後も、AI技術を利用したメンタルヘルスサポートの進化に期待が持たれます。



---
期間限定無料お試し中
https://line.me/R/ti/p/@328ekiay
いつでもあなたのつらい気持ちを受け止めます。お友達追加から。
SaaS

# SaaS 
* アプリケーションを提供
インターネット経由で、```複数の顧客が同じアプリケーションを共同利用```するマルチテナント方式でのサービス。個別利用のASPサービスに比べ、```費用の低減は可能```。ただし、その顧客固有の機能を追加するなどの```カスタマイズは不可```。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

### マルチテナント方式
マルチテナントとは、SaaSやASPサービスなどのように、```同一のシステムやサービスを、無関係な複数のユーザー（企業や個人）で共有するモデル```を指します。同一システム内で、データベースやソフトウェア、サーバーなどを共有します

### 出典
https://www.intra-mart.jp/im-press/useful/a65#:~:text=%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E4%BA%BA%E6%9D%90-,%E3%83%9E%E3%83%AB%E3%83%81%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81SaaS%E3%82%84ASP%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AA%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%80%81%E5%90%8C%E4%B8%80%E3%81%AE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%84%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E3%80%81%E7%84%A1%E9%96%A2%E4%BF%82%E3%81%AA%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%EF%BC%88%E4%BC%81%E6%A5%AD%E3%82%84%E5%80%8B%E4%BA%BA%EF%BC%89%E3%81%A7%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E6%8C%87%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%90%8C%E4%B8%80%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%86%85%E3%81%A7%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%84%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%80%81%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AA%E3%81%A9%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%BE%E3%81%99,-%E3%80%82%E8%8B%B1%E8%AA%9E%E8%A1%A8%E8%A8%98%E3%81%A7%E3%81%AF

* ```自社ではソフトウェアを所有せず```に、```外部の専門業所が提供```するソフトウェアの機能を```ネットワーク経由```で活用することです。

# 出典
https://gihyo.jp/book/2022/978-4-297-13178-4
OpenCV(Python)のJPEG圧縮品質（quality）は必ず整数にすること！

# しないとこうなります
cv2.imwrite関数の場合
~~~imwrite.py
#importとかは省略
cv2.imwrite("cannot_write.jpg",img,77.7) #圧縮率が小数だと…
~~~
~~~
cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'imwrite'
> Overload resolution failed:
>  - Can't parse 'params'. Input argument doesn't provide sequence protocol
>  - Can't parse 'params'. Input argument doesn't provide sequence protocol
~~~
cv2.imencode関数の場合
~~~imencode.py
ret,encoded=cv2.imencode(".jpg",img,(cv2.IMWRITE_JPEG_QUALITY,77.7))
decoded=cv2.imdecode(encoded,flags=cv2.IMREAD_COLOR)
~~~
~~~
cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'imencode'
> Overload resolution failed:
>  - Can't parse 'params'. Sequence item with index 1 has a wrong type
>  - Can't parse 'params'. Sequence item with index 1 has a wrong type
~~~
はい、以上。
気を付けましょう！

# もうちょっと補足
まあ言いたいことはこれだけなんでこのまますっぱり終ってもいいんですが…
さすがにちょっと雑すぎるのでもうちょっと補足しておきます

opencv-python-4.5.3.56までは確かに（浮動）小数も受け付けてくれたはずなのですが、opencv-python-4.5.4.58では唐突に整数じゃないとエラーを吐くようになりました（マイナーアップグレードでいきなりdeplicatedは普通ないはずなんでバグでしょうか？）。
今回は圧縮結果をファイルに書き出さずメモリに置くimencode関数で検証しましたが、cv2.imwriteでもだいたい同じ結果になります（ドキュメントを見る限り共通のパラメータ使ってるみたいなので）。
…まあ、この手のパラメータは大体の人が整数を入れるので問題ないとは思いますが、今まで動いてたものが突然動かなくなった！みたいなことが無きにしも非ずなので気を付けましょう。
あ、ちなみに最近のPython(具体的には3.10以降？)にはopencv4.5.3は入らないみたいなので、直すべきはバージョンではありません。横着せずに必ずコードの方を整数に直してくださいね！

以上、今度こそ終わり！

# for foreigners
**You must set OpenCV's JPEG-quality is Integer!!!**
OpenFOAMをDockerで簡単に導入する

## はじめに
　記事に主たる目的は研究の引き継ぎとサークル（[鳥人間](https://twitter.com/nu_aircraft?s=20)，[ラジコン](https://twitter.com/nu_navix?s=20)）におけるOpenFOAM利用促進です．そのため，外部視点では情報が不十分な場合もあると思います．その場合はコメントに書いていただくか，ChatGPTにでも聞いてください．
　Windows10とMacOSで，以下の手順に従って構築した環境でのバックステップ流れチュートリアルの動作を確認しています．それ以外の環境でもDockerが動作すれば問題ないはずです．

## Dockerとは
　誤りを恐れずに非常に簡単に言うと，Dockerとはパソコンの中にまた別のパソコンを用意するようなものです．これによって，実際に存在するパソコン（ホスト）の中に規定されている環境と異なる環境を作ることができます．
　もしDockerを使用しない場合，実体のあるパソコン上に複数の開発環境を形成することになって，それはさまざまなエラーを引き起こすリスクがあります．また，今回取り扱うOpenFOAMのように，そもそもDockerがなければ特定の環境で満足に動かないこともありえます．
　Dockerで開発環境ごとに仮想的なパソコンを用意することでそれらの問題を解決することができます．

## Dockerの使い方
　先ほどまでの話で出てきた「仮想的なパソコン」とはDockerの用語で言うと，「container」になります．このcontainerには環境の構成に関係するファイルが必ず入っていて，同時に定められた上限までのファイルを好きに保存することができます．
　このcontainer内部に構築する環境を定義しているものが，「image」です．imageはDocker Hubから入手することもできるし，自身のcontainerから作ることもできます．今回はOpenFOAMの環境が構築されたimageをそのまま使用して，最低限のOpenFOAMが使える環境を作ります．
　実際の手順としては，
```
1.Dockerをインストールする．
2.Docker HubからOpenFOAMの環境が定義されたimageを貰う．
3.そのimageに基づいてOpenFOAMの環境が構築されたcontainerを作る．
4.containerにVSCodeやDocker Desktopなどでアクセスして計算を行う．
```
という手順となります．

## 詳細な手順

### 1.Dockerをダウンロードしてインストールする
　[Docker公式](https://www.docker.com/)からダウンロードすれば基本問題ないです．
（もしNox playerなどゲーム用のAndroidエミュレータを利用されていると，Hyper-V関係の衝突が起こってdockerが動作しない場合があります．その場合はどちらかを諦めるか，それぞれのソフトウェアのガイドに従って調整しましょう．）

### 2.OpenFOAMの環境が構築されたimageを取得する
　いろいろなimageが候補に上がりますが，今回は使い慣れている[opencfd/openfoam-default](https://hub.docker.com/r/opencfd/openfoam-default)を使用します．コマンドラインで以下のコマンドを入力するとダウンロードが始まります．
```
# docker pull opencfd/openfoam-default
```
場合によってはsudoもしくは管理者権限コマンドプロンプトを使用してください．ダウンロードが成功したかはDocker Desctopまたはコマンド「docker images」で確認できます．

### 3.imageをcontainerにする．
　まず作業用ディレクトリを作ります．これは自分で管理できるところならどこでも良いです．
　imageは「docker run」コマンドでコンテナにすることができます．今回はエラー防止とホスト側のストレージを共有するために追加の引数をつけるので以下のようになります．
```
# docker run -it --mount type=bind,source=(作業用ディレクトリの絶対パス),target=/root opencfd/openfoam-default
```
これで与えたパスをcontainer上のルートディレクトリにしたcontainerが作られます．カッコ書きで示したパスは，例えばC:\Users\\(ユーザ名)\OpenFOAM_WORKDIRやD:\OpenFOAM_WORKDIRのように与えます．（windowsでなくmacやlinuxの場合はその様式に従う．）

### 4.containerに入る．
　Docker Desktopからターミナルを開いてもいいですし，「docker exec」コマンドで入っても良いですが，おすすめはVScodeを用いた方法です．
　VSocdeの拡張機能で「Remote Exproler」を追加してください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/10831312-facf-7076-869c-9d2e9883a43e.png)
これを追加するとサイドバーにこのアイコンが追加されると思います．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/318ee129-b019-31b1-52e3-42e006d910c3.png)
Docker Desktopを起動した状態でこれを開くと，以下のようにコンテナが表示されます．
このコンテナにカーソルを合わせると初回はattachと選択肢が出てくるので，そこから入ります．初回以降はもう一つ出てくるopenの方から入りましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/c10487b7-920a-2042-04b3-abae453f3011.png)
開いた状態がこのような形です．上のツールバーからターミナルを開くと，container内のターミナルが開かれます．
OpenFOAM本体を動かす場合はこのターミナルを介して命令を送りましょう．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335923/e9dd1864-a89d-3f6e-a1fe-cb9c64b9bcbd.png)
PowerVS API の一部 Deprecated(非推奨)の確認

#### はじめに


[PowerVS API](https://cloud.ibm.com/apidocs/power-cloud#introduction) のドキュメントを眺めていると 2023/3/31 で Deprecated となる API を見つけました。
使用される場面が少ないためか、特にリリース・ドキュメントでの案内は見当たりませんでした。

PowerVS APIを使用したスクリプト作成を行なっている場合などでは影響しますので気付いた範囲で記載します。
(当記事は記載者個人による確認です)


---

#### Deprecated API 

:::note info
Note: Support for this API will be available till 31st March 2023.
:::



(1) List all the images in the image-catalog
https://cloud.ibm.com/apidocs/power-cloud#pcloud-images-getall

```
/pcloud/v1/cloud-instances/{cloud_instance_id}/stock-images
```

(2) Detailed info of an image in the image-catalog
https://cloud.ibm.com/apidocs/power-cloud#pcloud-images-get

```
/pcloud/v1/cloud-instances/{cloud_instance_id}/stock-images/{image_id}
```

(3) Create a volume clone for specified volumes
https://cloud.ibm.com/apidocs/power-cloud#pcloud-volumes-clone-post

```
/pcloud/v1/cloud-instances/{cloud_instance_id}/volumes/clone
```

---

#### 代替となると思われるAPI

上記のDeprecation API の代替としては以下が同様の機能となると思われます。


(1) List all images for this cloud instance
https://cloud.ibm.com/apidocs/power-cloud#pcloud-cloudinstances-images-getall

```
/pcloud/v1/cloud-instances/{cloud_instance_id}/images
```


(2) Detailed info of an image
https://cloud.ibm.com/apidocs/power-cloud#pcloud-cloudinstances-images-get

```
/pcloud/v1/cloud-instances/{cloud_instance_id}/images/{image_id}
```


(3) Create a volume clone for specified volumes
https://cloud.ibm.com/apidocs/power-cloud#pcloud-v2-volumes-clone-post

```
/pcloud/v2/cloud-instances/{cloud_instance_id}/volumes/clone
```

-> v2 が使用されます。


----

#### その他の情報：PowerVS 2023年3月の新機能

PowerVS リリースノートより3月の機能追加でコンソールからイベント・ログが見えるようになっています。

・[PowerVS リリース・ノート March 2023](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-release-notes#mar-2023)

・[Managing events logs and notifications](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-manage-event-logs&locale=ja#set-event-logs)



![スクリーンショット 2023-03-24 11.50.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/2bfc4fde-3d0d-f9a1-5640-04b0c0b8a58c.png)


---

ご参考まで、以上です。
WSLでメモリを変更

.wslconfigに設定して再起動しましょう

```powershell:update.ps1
echo '[wsl2]' >> ~/.wslconfig
echo 'memory=2GB' >> ~/.wslconfig
wsl.exe --shutdown
```

# 確認

```bash
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            1906         330        1380           2         195        1433
Swap:           1024           0        1024
```
配列っぽい文字列を配列に戻したい


配列っぽい文字列を配列に戻したい時にどうしたか備忘録

'["any", "any1", "hoge"]'　→　["any", "any1", "hoge"] こうしたい

## 配列っぽい文字列

```
foo = '["any", "any1", "hoge"]'
p foo.class

string
```

## これを配列に戻す

```
require 'json'

foo = '["any", "any1", "hoge"]'
p JSON.parse(foo)

```

# 実はほんとに一番やりたかったこと

最終この形式でブラウザに描画したかった
```
require 'json'

foo = '["any", "any1", "hoge"]'
p JSON.parse(foo).join(', ')

any, any1, hoge
```

## まとめ

なんかもっとピッタリのメソッドありそうだとおもうんですけど
よければいろいろコメントで教えてください
ガラス器具取り扱いの横道

# ガラス器具の取り扱い
## TDとTC
体積を正確に測るガラス器具には二つの種類があります。
皆さんが想像しやすいピペットなどのToDeliverと
想像しにくいメスフラスコなどのToContainの二つです。
### TDについて
 除算演算子(割り算)の右側にTDの器具があるとおかしいです。
TDの器具はある一塊の液体から一部を量り取る器具だからです。
ですのでPythonのdunderメソッドのrtruedivを不活性化しておきます。
コードは以下の通りです
```DisableRTD.py
    def __rtruediv__(self, other) -> None:
        warnings.warn('''"To Deliver" Glassware library is to pick solution up.\n
                        This operator is disabled. Find another way.''')
```
###TCについて
 乗算演算子(掛け算)の右側にTCの器具があるとおかしいです。
TCの器具はある一塊の液体を測られた量に薄める器具だからです。
ですのでPythonのdunderメソッドのrmulを不活性化しておきます。
```DisableRMul.py
    def __rmul__(self, other) -> None:
        warnings.warn('''"To Contain" Glassware library is to diffuse solution.\n
                        This operator is disabled. Find another way.''')
```
これでインテリセンスに警告が出ればいいですが、またの機会に検証しましょう。
【ECデザイン勉強】牛乳商品のポスター作ってみた

## 完成効果
![牛奶海报1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348039/677e38c8-0ba1-2aa0-cb79-f23cd080c17b.jpeg)


## 今回のポイント
> 素材を挿入して、スマートオブジェクトに変換する

画像の拡大・縮小時の画質劣化がない

> レイヤーマスクの活用

> ペンで水滴の形を作る

参考：<https://www.jb51.net/photoshop/572346.html>
Power Automate でのDataverseのリッチテキスト列の操作

今回はPower Automateでのリッチテキスト列の操作について記述します。

リッチテキスト列はHTML形式で保存している為、Power Automateで値を入れる際はHTMLタグを使うと表示されます。

そしてこの操作は、Power Automateの項目では直接的に入力して操作することができます。
前半に使用例、実際に使ってるところは後半に載せています。

# 改行
１行目<br>２行目

```html
１行目<br>２行目
```
# タイトル

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/6e062fcf-6db2-757f-5510-7f07100861d6.png" width=70%>

```html
<h1>タイトル1</h1>
<h2>タイトル2</h2>
<h3>タイトル3</h3>
<h6>タイトル6</h6>
```

# 太字

<b>太字</b>
```html
<b>太字</b>
```

# 色付け
<font color="Red">赤</font>
<font color="Blue">青</font>
<font color="Yellow">黄色</font>
```html
<font color="Red">赤</font>
<font color="Blue">青</font>
<font color="Yellow">黄色</font>
```

# URLの挿入

<a href="https://support.microsoft.com/ja-jp">こちらご参照ください</a>

```html
<a href="https://support.microsoft.com/ja-jp">こちらご参照ください</a>
```

# 画像の挿入

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c210b932-2458-74ad-57c0-6fc6126ec294.png">

```html
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c210b932-2458-74ad-57c0-6fc6126ec294.png">
```

# 表の挿入
<table border="1">
        <td>お笑い芸人</td>
        <td>拠点</td>
        <td>メンバー</td>
      </tr>
      <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>

```html
<table border="1">
        <td>お笑い芸人</td>
        <td>拠点</td>
        <td>メンバー</td>
      </tr>
      <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>
```

# 使用例
Power Automateでこれらを使ってみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/882e1291-81ce-a01b-8ff7-7899125438d4.png)

リッチテキスト列に以下のように値を入れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/c1da0d81-1ee8-721f-3e4c-d0f59b4a73d3.png)

すると、モデル駆動型アプリでは以下のように表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/1c3f100d-e723-a4a8-52cb-22615cee0e42.png)


# まとめ
リッチテキスト列で、リッチなテキストを使って効果的にデータを操作していきましょう。
ナレッジベースのFAQをChatGPTで改善する

### はじめに

[過去の記事](https://qiita.com/fsdg-honda/items/98131eb3d24af49235fb)において、Azure Cognitive Services for Language のカスタム質問応答では、ナレッジベースのソースとして、Web ページの URL やファイルを利用できることをご紹介しました。  
Web ページをナレッジベースに取り込む場合、Web ページの構成を分析して質問と回答が生成されますが、期待通りに取り込まれない場合もあります。  
そこで、ChatGPT を利用することで、Web ページから取り込む内容を改善できないかを試してみます。

### Web ページ URL から直接取り込む場合

サンプルとして、[こちらの記事](https://qiita.com/fsdg-honda/items/30cc711d064d96850958)をナレッジベースに取り込んでみます。  
Azure の Language Studio でカスタム質問応答のプロジェクトを作成し、「ソースの管理」メニューから「ソースの追加」->「URL」->「URL の追加」を実行します。  

![スクリーンショット 2023-03-24 082515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/0fe7ecf1-56b1-20d6-ba89-081259c449b5.png)

URL 欄に前述の記事の URL を入力、任意の URL 名を入力して「すべて追加」を実行すると、ソースが追加されます。  
「ナレッジベースの編集」メニューを開くと、取り込まれた FAQ が表示されますが、追加された質問と回答のペアは 5 件となっています。

![スクリーンショット 2023-03-24 091911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/27e9feec-5262-e1f2-d3c0-3c25de207500.png)


記事の見出しとその内容がそのまま FAQ として取り込まれたようです。これでは質問として拾える内容は小さい一方、回答の内容は大きすぎるため、FAQ として適切なデータとは言えません。

### ChatGPT の利用

そこで、ChatGPT で Web ページの内容から FAQ を生成し、その内容をナレッジベースに取り込むことで改善できるかを試してみます。
ChatGPT も Azure Cognitive Services for Language の API がありますので、実際利用する場合は API で連携すればよいのですが、ここでは改善されるかを見るのが目的ですので、手っ取り早く ChatGPT の Web サイト（ GPT-3.5 ）で確認します。

前述の記事から最初のセクションを取り出し、下記のようなリクエストを出してみます。

<details><summary>プロンプト詳細</summary>
下記文章からFAQデータを作成してください。
Power Virtual Agents
Power Virtual Agents は、Microsoft が提供している、ノーコード、ローコードでインテリジェントなチャットボットを作成できるサービスです。
Microsoft Teams と連携し、自然言語で質問に回答できるチャットボットを作成でき、Power Automate により、他サービスとの連携も可能となります。
Microsoft Teams に限定されたプランと、Web アプリとしても利用可能なプランがあり、前者は Teams を利用していれば無償で利用可能です。Microsoft Teams にアプリとして追加し、Microsoft Teams 上でチャットボットの開発が行えます。
ただし、ボットが使用できるコネクタなどに制限があります。詳細はMS Learn のドキュメントなど、 Microsoft さんのドキュメントを確認ください。
後者のプランでは、有料のスタンドアロン Power Virtual Agents サブスクリプションが必要です。
</details>

下記のような内容が返ってきました。

```
Q: Power Virtual Agentsとは何ですか？
A: Power Virtual Agentsは、Microsoftが提供している、ノーコード/ローコードでインテリジェントなチャットボットを作成できるサービスです。

Q: Power Virtual Agentsはどのような連携が可能ですか？
A: Power Virtual Agentsは、Microsoft Teamsと連携して、自然言語で質問に回答できるチャットボットを作成できます。また、Power Automateを利用して他のサービスとの連携も可能です。

Q: Power Virtual Agentsのプランにはどのような種類がありますか？
A: Power Virtual Agentsには、Microsoft Teamsに限定されたプランと、Webアプリとしても利用可能なプランがあります。

Q: Microsoft Teamsに限定されたプランはどのような特徴がありますか？
A: Microsoft Teamsに限定されたプランは、Teamsを利用していれば無償で利用可能です。また、Microsoft Teams上でチャットボットの開発が行えますが、ボットが使用できるコネクタなどに制限があります。

Q: Webアプリとして利用可能なプランはどのような特徴がありますか？
A: Webアプリとして利用可能なプランでは、有料のスタンドアロンPower Virtual Agentsサブスクリプションが必要です。
```

元の文章は QA 形式ではありませんが、うまく分解されているように思います。  
これを Word 文書にしてファイルからソースの追加を実行すると、これらの QA がナレッジベースに追加されます。

![スクリーンショット 2023-03-24 091710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/99ba412e-212c-ad81-d2b2-4a8ea11d99b6.png)

### まとめ

一例ではありますが、Web ページからの FAQ データの取り込みにおいて、ChatGPT を利用することで、適度な粒度の FAQ データに加工できることを確認しました。取り込まれたデータが適切であるかを確認する必要はありますが、既存の Web ページから取り込む場合においては、レビュー、修正程度の手間で済むので効率的と思います。
ベルヌーイ方程式「今週の微分方程式 #7」をwolframalphaとsympyでやってみたい。    

1min.– わんみん様の計算との違いがわかりませんでした。申し訳ありません。
・wolframで,
ベルヌーイ方程式 Bernoulli's equation
常微分方程式の分類 一階非線形常微分方程式
ODE classification first-order nonlinear ordinary differential equation　 
・sympyのplotでグラフがでます。

オリジナル

https://youtu.be/ottAQbzArGg

# wolframで

https://www.wolframalpha.com/input?i=y%3Dxy%27%2By3e%5Ex%5E2&lang=ja

English

https://www.wolframalpha.com/input?i=y%3Dxy%27%2By3e%5Ex%5E2

### 点検?
勉強中

# sympyで
plotでグラフがでます。

```python
# y=xy'+y3e^x^2
from sympy import *
x = Symbol  ('x',real=True)
y = Function('y')(x)
var('C1')
ans=dsolve( Eq(y,x*diff(y)+y**3*exp(x**2) ) )
print("#",ans[0].rhs)
print("#",ans[1].rhs)
plot (ans[0].rhs.subs({C1:1}),ans[1].rhs.subs({C1:1})) 
# -x*sqrt(1/(C1 + exp(x**2)))
# x*sqrt(1/(C1 + exp(x**2)))
```
縦横比は異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/8cf05694-1e88-b6fa-418b-8a466d2dfb60.png)

# 参考

https://ja.wikipedia.org/wiki/%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E3%81%AE%E5%AE%9A%E7%90%86

https://en.wikipedia.org/wiki/Bernoulli%27s_principle

# #7まで
Kotlin Nullsafetyについて

## はじめに
こんにちは！新人エンジニアのふかこうです！
今回はKotlinのNullsafetyについての記事になります。
## この記事の対象者
・初級エンジニア
・エンジニアとして働きたい方
・IT企業に就職する学生
## 筆者のレベル
・新人エンジニア
・Android開発初級
## Nullsafety とは
KotlinにはNull safetyという言語仕様があります。
Java経験がある方なら一度は経験したことのある、システムに障害をもたらすnull参照による実行時エラー（NullPointerException）を未然に防げます。
NullPointerExceptionが生じると、アプリがクラッシュしてしまいます。
Null Safetyはこの事象を防ぐことを目的としています。

## Javaとの比較
Javaではnullが代入された後にString型のメソッドなどを使うとエラーになります。
```java:java
String check = "ハイボール";
check = null;
System.out.println(check.length());
//Exception in thread "main" java.lang.NullPointerException
```

Kotlinでは全ての型が基本的にnullを代入できないnull非許容型です。
nullという値が代入されること自体を禁止するので、どこかで不意にnullが代入されていた場合、コンパイルの時点でチェックし実行時のエラーを回避してくれます。
```kotlin:kotlin
var check: String = "ハイボール"
check = null
//エラー： Null can not be a value of a non-null type String
```

## まとめ
KotlinのNullsafetyは、システムに障害をもたらすnull参照による実行時エラー
（NullPointerException）を未然に防げます。
Kotlinでは全ての型が基本的にnullを代入できないnull非許容型で、コンパイルの時点でチェックし実行時の
エラーを回避してくれます。
【Mac】ショートカットやエイリアスを使ってターミナル操作を効率化する

エンジニア歴5ヶ月の新人エンジニアです。実務でターミナルを使うことが多く、より効率的にターミナルを使うために工夫しようとした中で、役立ったなと思ったことを紹介したいと思います。どのような業務内容でもよく使う、カーソル移動・コマンド省略・コマンド削除の3つに分けて紹介していきます。

## 1. カーソル移動
カーソルを目的の位置まで移動させる時に、1文字ずつ移動させていると結構時間がかかってしまうことはありませんか？そのような時に、サッと目的の位置まで移動できたら便利ですよね。

カーソル移動のための便利なショートカット一覧を以下の表にまとめました。


| ショートカットキー | コマンド |
| :--- | :--- |
| option + ←/→ | ブロック単位で移動 |
| control + a | 先頭に移動 |
| control + e | 末尾に移動 |


なんと言っても一押しのショートカットはブロック単位でカーソル移動する `option + ←/→` です。カーソルの移動先が１ブロック（スペースで区切られた区間）以上離れている場合や、ブロックの端に移動したい場合に使います。

行頭や末尾への移動は、`option + ←/→` を複数回使うことでも可能ですが、`control + a` や `control + e` も覚えておくと何かと便利だったりします。

※ コマンド中に日本語を含んでいる場合、`option + ←/→` は意図した挙動にならないことがあります。

## 2. コマンド省略
過去に使ったコマンドやよく使うコマンドの、入力する手間を軽減できる方法について紹介したいと思います。

### 2-1. ショートカットを使う
| ショートカットキー | コマンド |
| :--- | :--- |
| ↑/↓ | コマンド履歴から1つ前/後のコマンドを表示する |
| tab | 自動補完 |

過去に使ったコマンドを再び使いたい場合は、`↑/↓` でコマンド履歴を辿って行けば、期待するコマンドを表示できます。

自動補完も便利なショートカットです。ファイルやディレクトリのパスを入力する際に、途中まで入力して `tab` で自動補完すると、入力する手間をかなり省くことができます。

### 2-2. エイリアスを使う
設定ファイル（zshrcファイル、bashrcファイル）内にエイリアスを定義しておくと、実行したいコマンドの代わりにエイリアスを入力すれば良いので、入力が楽になります。

1. `vi ~/.zshrc`（zshrcファイルをviエディタで開く）を実行する。
2. `alias ショートカットコマンド='コマンド'` でエイリアスを設定する。
3. ファイルを保存した後、`source ~/.zshrc` で変更内容を読み込む。

例えば、`alias dc='docker-compose'` のようにエイリアスを設定した時、`dc ps` で `docker-compose ps` を実行することができます。

## 3. コマンド削除
コマンドの全削除や部分削除をしたい場合に、消したい箇所を一発で削除できたら楽ですよね。そのような便利なショートカットがあるので、以下の表にまとめました。

| ショートカットキー | コマンド |
| :--- | :--- |
| control + u | 行頭から行末までを削除する（全削除） |
| control + w | カーソルの1つ前から直近のブロックの先頭までを削除する |

全削除の場合は、カーソルの位置がどこにあっても問題ありません。
一方、部分削除の場合は、カーソルを適切な位置に移動させてからショートカットを実行する必要があります。例えば、1つのブロックを丸々削除したい場合、そのブロックの直後にあるブロックの先頭にカーソルを移動（カーソル移動のショートカットを使用）して、`control + w` を実行します。

※ コマンド中に日本語を含んでいる場合、`control + w` は意図した挙動にならないことがあります。

## 終わりに
以上、ショートカットとエイリアスの紹介でした。
ターミナルは使うことが多いからこそ、ショートカットやエイリアスなどを駆使して操作を効率化していきたいですね。
VS Codeで文字列をキャメルケース・スネークケースに変換するショートカットの登録方法

VS Codeで
文字列をキャメルケース・スネークケースに変換するショートカットの登録方法
-

- VSCodeで以下の拡張機能をインストール！

名前: change-case
開発: wmaurerさん
https://marketplace.visualstudio.com/items?itemName=wmaurer.change-case

- インストールが完了したら、画面左下にある設定（歯車のアイコン）を押下し、コマンドパレットを選択↓
![スクリーンショット 2023-03-24 10.51.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296673/d84acdda-38a8-2722-6992-de738b79df66.png)
- 出てきた入力欄にPreferences: Open Keyboard Shortcutsを入力して、（JSON)がついていないものを選択↓
![スクリーンショット 2023-03-24 10.58.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296673/c4f4f8e0-c67b-debe-e5d6-6a845e5012cf.png)
するとこんな画面が出ると思います！↓
![スクリーンショット 2023-03-24 11.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296673/52f9e39d-89fd-4f0f-ab09-77725bf7b7e4.png)
- キャメルケースへの変換用ショートカットを登録する場合は　**change case camel**　で検索し、出てきたショートカットの編集用アイコンを押下。（スネークケースの場合は　**change case snake**　で検索）
- 出てきた入力欄で、ショートカットを呼び出すコマンド(キーボードの組み合わせ)を登録できます！
![スクリーンショット 2023-03-24 11.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296673/b159ad47-3305-fd83-b52f-1cce1a137675.png)

以上でショートカットの登録は完了です！
変換したい文字列を選択してショートカットコマンドを押してみてください！



※既に使用しているコマンドを確認したい場合は、入力欄右にあるキーボードアイコンを押下してキーを選択すると、入力したコマンドで使用されているショートカットを表示してくれますよ！
![スクリーンショット 2023-03-24 11.16.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296673/4cc16c83-a298-b476-55a1-1a084a9c39ad.png)

自身の備忘録謙アウトプットとして投稿しました！
初投稿になりますので、文章や内容に不備がありましたら、コメントいただけますと幸いです。:slight_smile:
y'sinx+ycosx=sinxsin2x「今週の微分方程式 #6」をwolframalphaとsympyでやってみたい。    

1min.– わんみん様の計算との違いがわかりませんでした。申し訳ありません。
・wolframで,
常微分方程式の分類 一階線形常微分方程式　
ODE classification first-order linear ordinary differential equation　 
・sympyのplotでグラフがでます。

オリジナル

https://youtu.be/8QuVITlrmrs

# wolframで

https://www.wolframalpha.com/input?i=y%27sinx%2Bycosx%3Dsinxsin2x&lang=ja

English

https://www.wolframalpha.com/input?i=y%27sinx%2Bycosx%3Dsinxsin2x


### 点検?
勉強中

# sympyで
plotでグラフがでます。

```python
from sympy import *
x = Symbol  ('x',real=True)
y = Function('y')(x)
var('C1')
ans=dsolve( Eq(diff(y)*sin(x)+y*cos(x),sin(x)*sin(2*x) ) )
print("#",ans)
plot (ans.rhs.subs({C1:1})) 
# Eq(y(x), C1/sin(x) + 2*sin(x)**2/3)
```
縦横比は異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/1e6fdac0-5b24-67b1-f2eb-322d0e871a45.png)


# 参考

# つづく

https://qiita.com/mrrclb48z/items/0c72970c1cace6f69662
ChatGPT Pluginって何ができるの？

こんにちは！逆瀬川 ( [@gyakuse](https://twitter.com/gyakuse) ) です！
きょうは発表があったばかりのChatGPT Pluginについて紹介していきたいと思います。

## ChatGPT Pluginとは

かんたんに言ってしまうと、ChatGPTの能力を拡張するためのプラグインです。よくわかりませんね。
わかりやすくいうと、

「来週の土日に旅行いきたいんだけど2万円以下で適当にいいとこ見繕って予約しといて」
「ｱｲﾖｰ」

みたいなことができるやつです。
もちろんこれらはChatGPTのAPIを用いてもできましたが、これを容易に実現する手段として提供されました。

BingGPT (正式名称New Bing) のように検索して回答してくれたり、会社の文章群をもとに質問回答してくれたり、
商品を注文してくれるなどのアクションを行う機能が追加された、と理解しておくとよさそうです。
これはまだ[Waitlist](https://openai.com/waitlist/plugins)であり、今後公開されていく機能です。

## 初期に提供される公式のプラグイン

![ChatGPT_plugins.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958603/3ec2a002-b0df-7fbb-7cb5-78c4b2815b33.png)

- Expedia
    - 旅行計画をつくる - 交通手段、宿泊先、観光やアクティビティを見つける
- FiscalNote
    - 法律、政治、規制データ・情報の選択された先導的なリアルタイムデータセットへのアクセスを提供・可能にする
- Instacart
    - お気に入りの地元の食料品店から注文する
- KAYAK
    - フライト、宿泊、レンタカーを検索。予算内で行けるすべての場所のおすすめ情報を入手
- Klarna Shopping
    - 数千のオンラインショップから価格を検索・比較
- Milo Family AI
    - 謎
- OpenTable
    - レストランのおすすめ情報を提供し、直接予約するリンクを提供
- Shop
    - 世界最高のブランドから何百万もの商品を検索
- Speak
    - Speak を使って、AIチューターと任意の言語を学ぶ
- Wolfram
    - Wolfram|AlphaとWolfram Languageを通じて、計算、数学、キュレーションされた知識、リアルタイムデータにアクセス。
- Zapier
    - Googleシート、Trello、Gmail、HubSpot、Salesforceなど、5,000以上のアプリと連携する。

とくにインパクトが強いのがZapierでしょう。これだけで、ほぼ (ネット上なら) 何でもできる気がします。
公式のプラグイン群と、独自のプラグインを使用することができます。
独自のプラグインでは、社内文章をもとにしたAIとか作っておくと便利そうです。

## ChatGPTの課題

さて次に、ChatGPT Pluginが必要になった背景を考えてみましょう。
ChatGPTをはじめとする言語モデルは、なんでもできるように見えていくつかの課題を持っています。顕著なものを上げると以下があるでしょう

- モデルの学習時点の知識に縛られてしまう
- 複雑な計算ができない
- 複数の書類を参考にして人間のように回答してくれない

これはいわば、言語モデルが脳だけあって、手足がないことに基因します。
人間と同じように、わからないことはGoogleで検索したり、数学なら電卓を使ったり、何かをするときはWebサービスを使ったりできるようにしてあげれば良いのです。

さいきんのテキストに制御された画像生成はtext to imageと呼ばれていましたが、これらの技術群はtext to action(文章指示から任意の行動へ)と呼ばれるようになるでしょう。

## ChatGPT Pluginができること

では技術面を見ていきましょう。ChatGPT Pluginは主に、以下のことができるようになります。

- リアルタイム情報の取得: スポーツの試合結果、株価、ニュース等
- ナレッジベースの参照: 会社の文章、自分のメモ等
- アクションの実行: 旅行予約、商品注文等

ただし、重要なアクション (決済が必要な行為) はデモ動画を見る限り、まだ組み込まれていないように見えます。
InstaCartの例 ([Blogの一番下から2番目の動画](https://openai.com/blog/chatgpt-plugins) ) では、購入候補を一括して見られるURLを提示するまでにとどまっていました。

けっきょくアクションの自動化は承認の自動化と紐付いてしまうために、ユーザーにどの段階でどのように承認 (選択) させるかが重要になります。

## ChatGPT Pluginのつくりかた

まだアクセスできていないのでここでは軽く触れるだけに留めますが、独自のPluginはAPIのendpointを登録することで使うことができます。個人または組織の文章と組み合わせるためのプラグインが公開されており、これが参考になります。

https://github.com/openai/chatgpt-retrieval-plugin

このプラグインが達成しようとしていることは以下のようなものです。

https://qiita.com/sakasegawa/items/16714fa132e874cab069


## Pluginの危険性

さいごにプラグインの危険性にも触れておきましょう。以前触れたように、言語モデルはその出力をコントロールしようとするような命令をすることが可能です。これをプロンプトインジェクションといいます。[ブログ記事](https://openai.com/blog/chatgpt-plugins)でもその危険性に触れられています。

https://qiita.com/sakasegawa/items/09d9f6a485108f5a618a

たとえばドキュメントベースのプラグインを公開した際に、もとのドキュメントをそのまま表示させてしまうような命令が考えられます。Pythonの実行を行えるプラグインの場合、環境変数の表示、データベースの書き換え等が安易に実装された場合、できてしまいます。

実はすでにそのような機構が組み込まれている可能性はありますが、入力値や言語モデルの出力値の検証をして、安全に実行できるようにしなければなりません。

## References

- https://platform.openai.com/docs/plugins/introduction
AWS Athena DBエンジンのメジャーVerUp確認

# はじめに

『Athena エンジンの自動アップグレードは、2023 年 5 月 1 日の 70 日後に開始されます。』
という案内がきてたので、事前に業務で使ってるSQLが互換するか事前に確認したという話です。

# 確認方法
案内によると期限来ると自動でDBエンジンがV2→V3に切り替わるので、事前にSQLが動くか確認せよ！という事なので、手動でDBエンジンを切り替えて、クエリの実行確認後に、また自動切換えモードに戻しておく。という一連の作業をしたのでメモ書きします。

https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html

https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0003.html

それぞれの制約が書いてあります。関係ありそうな関数をSQL側で利用していないか机上確認を実施します。
（関係ありそうな関数を利用していなかったので、関数固有のお話は今回のメモ書きには登場しません。）

# 手動のDBエンジン切り替え

![04.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/e09af0bf-aa61-8e18-7a42-1d81abe7f65c.jpeg)

![03.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/b6b75c03-d89b-daac-3ffe-d95ef84e7bc4.jpeg)

上記の画面で、『自動　→　手動』と『クエリエンジンのバージョン：Athena engine version 3 』に変更する事で切り替えます。

# SQLの実行

![05.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/6d37afa9-1e41-d231-1619-b7734eb80346.jpeg)

利用しているSQL（実行可能な状態）をプログラム（かログから）抽出して、管理コンソールの『クエリエディタ』で実行して、動作確認を実施します。

影響ある関数を利用しているのであれば、項目の値もチェックする必要があると思いますが、SQLの成功・失敗のレベルで確認します。

# 自動アップデートへの戻し
V3バージョンアップが終わって、将来V4バージョンアップも来ることに備えて、自動アップデートに戻しておきます。

![06.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/59380f81-07bb-2e86-5b35-1ff2bffee952.jpeg)

![07.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281768/386ed0d6-9ad9-928f-7ebb-0146fac66192.jpeg)

変更を保存して作業終了です。

# 参考：案内原文（機械翻訳版）

こんにちは

Athena エンジンの自動アップグレードは、2023 年 5 月 1 日の 70 日後に開始されます。ワークグループをアップグレードする前に、一連の検証テストを実行して、そのクエリがエンジン バージョン 3 で正しく効率的に実行されることを確認します。すべてのお客様が独自の検証テストを実行し、次のプラクティスに従って、すべてのクエリが期待どおりに実行されることを確認することをお勧めします。


* Athena エンジン バージョン 3 の制限事項 [1] と重大な変更点 [2] を確認し、影響を受けるクエリを更新します。

* テスト ワークグループを作成するか、既存の本番前環境をアップグレードすることにより、Athena エンジン バージョン 3 に対するクエリを検証および認定するために、本番前でテストします。たとえば、エンジン バージョン 3 を実行する新しいテスト ワークグループを作成して、運用前またはステージング環境から統合テストを実行し、障害やパフォーマンスの低下を監視できます。 Athena によって公開された CloudWatch メトリクスとディメンションの詳細については、CloudWatch メトリクスを使用した Athena クエリのモニタリング [3] を参照してください。

* メトリクスに基づいて各クエリをアップグレードし、Athena エンジン バージョン 3 ワークグループに対してクエリをテストします。たとえば、エンジン バージョン 3 の新しいワークグループを、既存のエンジン バージョン 2 ワークグループと一緒に作成できます。ごく一部のクエリをエンジン バージョン 3 ワークグループに送信し、障害やパフォーマンスの低下を監視し、クエリが成功してパフォーマンスが向上した場合は、クエリの数を増やすことができます。すべてのクエリが Athena エンジン バージョン 3 に移行されるまで繰り返します。



エンジン バージョン 3 の改善点と変更点の詳細については、「Athena エンジン バージョン リファレンス」ドキュメント [4] を参照してください。 「自動アップグレード」に設定されていないワークグループをアップグレードする方法については、「Changing Athena engine versions」ドキュメント [5] を参照してください。

ご質問やご不明な点がございましたら、AWS サポート [6] までお問い合わせください。


[1] https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0003.html#engine-versions-reference-0003-known-limitations
[2] https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0003.html#engine-versions-reference-0003-breaking-changes
[3] https://docs.aws.amazon.com/athena/latest/ug/query-metrics-viewing.html
[4] https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html
[5] https://docs.aws.amazon.com/athena/latest/ug/engine-versions-changing.html
[6] https://aws.amazon.com/support


# AWSの相談・お困りごとありましたら、、、

AWSの活用方法や、お困りごとの相談、随時、お仕事の受付しております。

https://www.cs-cloud-aid.com/
Kotlinの特徴

## はじめに
こんにちは！新人エンジニアのふかこうです！
今回はKotlinについての記事になります。
## この記事の対象者
・初級エンジニア
・エンジニアとして働きたい方
・IT企業に就職する学生
## 筆者のレベル
・新人エンジニア
・Android開発初級
## Kotlinとは
Kotlinは2011年にJetBrains社が公開したプログラミング言語です。
Kotlinという名前はフィンランドにある「コトリン島」から命名されています。
Kotlinを使えるようになるとAndroidアプリを作ることができます。
Googleは2017年にKotlinをAndroid開発推奨言語に認定しました。
Android アプリだけでなく、iOSアプリ、Webアプリケーションの開発が可能です。

## Kotlinの特徴
Kotlinは、Androidアプリの開発ができるプログラミング言語です。
Androidアプリが開発できる言語はKotlinのほかに、Javaがあります。
KotlinはJavaよりもシンプルな記述でコードを書くことができるように、
Javaを作り替えるように作られたプログラミング言語です。
そのため、Javaよりも簡潔にそしてより質の高いAndroidアプリを開発しやすい利点があります。

## Javaとの違い
・簡潔で安全が高い
Javaと比較してコードがシンプルでわかりやすく、システム構築の際の負担も軽減されています。
また、実行時に例外を起こしにくいコードが書きやすいため、想定外のバグが発生してシステムダウンに繋がるような問題が起きにくい安全性の高さが特徴です。

KotlinにはNull safetyという言語仕様があります。
Java経験がある方なら一度は経験したことのある、システムに障害をもたらすnull参照による実行時エラー（NullPointerException）を未然に防げます。
NullPointerExceptionが生じると、アプリがクラッシュしてしまいます。
Null Safetyはこの事象を防ぐことを目的としています。

## まとめ
Kotlinは、Androidアプリの開発ができるプログラミング言語です。
KotlinはJavaと比較してコードがシンプルで書きやすく、システムに障害をもたらす
null参照による実行時エラーを未然に防げるので、安全性が高い特徴があります。
lsof -i:[ポート番号]の結果の読み方

例）ポート番号5432で動作中のプロセスを確認する場合。

```
lsof -i:5432                   
COMMAND   PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 687       namako  185u  IPv6 0x164c1ceddc642b25      0t0  TCP *:postgresql (LISTEN)
```

|項目名| 意味|
| ---- | ---- |
|COMMAND| ファイルを開いているプロセスのコマンド名|
|PID|プロセス ID|
|USER|ユーザー名|
|FD|ファイルディスクリプタ|
|TYPE|種類|
|DEVICE|デバイス|
|SIZE/OFF|ファイルのサイズまたはファイルオフセットのバイト数(値が利用可能な場合のみ表示)|
|NODE|iノード番号
|NAME|ファイル名|

>**ファイルディスクリプタ**
プログラムからファイルを操作する際、操作対象のファ>イルを識別・同定するために割り当てられる番号。OSにアクセスを依頼する際にファイルを指定するのに用いられる整数値。主にUNIX系OSで用いられる仕組みで、Windowsではファイルハンドル(file handle)がこれに相当する。


- cwd 作業中のディレクトリ
- rtd ルートディレクトリ
- txt program text (code and data)
- mem メモリマップトファイル(memory-mapped file)

FSの整数の後に続いているアルファベットの意味は次の通り。

- r for 読み取り権限(read access)
- w for 書き込み権限(write access)
- u for 読み取り・書き込み権限(read and write access)
Gitとは

## はじめに
こんにちは！新人エンジニアのふかこうです！
今回はGit（バージョン管理）についての記事になります。　
## この記事の対象者
・初級エンジニア
・エンジニアとして働きたい方
・IT企業に就職する学生
## 筆者のレベル
・新人エンジニア
・Android開発初級
## Gitとは？
Gitとはプログラムのソースコードなどの変更履歴を記録・追跡するための
分散型バージョン管理システムです。

「誰が」

「いつ」

「何を変更したか」

というような情報の記録をするシステムです。

ソフトウェア開発を同時に複数人で平行して行う場面で効果を発揮します。

バージョン管理がGitの最大の特徴でもあり、今や欠かせない存在になっている要因なのです。
## バージョン管理について
プログラミング現場では、複数の人物がたくさんの作業を行います。
ex)新規作成、保存、削除、編集 などなど

これらの作業内容について正常にバージョン管理ができていると、
エラーが起きた際や間違って上書き保存をしてしまった時にも落ち着いて対応が可能です。
※Gitでは該当のバージョンまで戻ることが可能です。

## まとめ
Gitとはバージョン管理をするためのツールです。
ソフトウェア開発を同時に複数人で平行して行う場面で効果を発揮します。
エラーが起きた際や間違って上書き保存をしてしまった場合も元の状態に戻すことが可能。
y'=-2y+z,z'=y-2z「今週の微分方程式 #5」をwolframalphaとsympyでやってみたい。  

1min.– わんみん様の計算との違いがわかりませんでした。申し訳ありません。
・wolframで,
常微分方程式の分類　一階線形微分方程式系
ODE classification　 second-order linear ordinary differential equation
・sympyのplotでグラフがでます。

オリジナル

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

# wolframで

https://www.wolframalpha.com/input?i=y%27%3D-2y%2Bz%2Cz%27%3Dy-2z&lang=ja

English

https://www.wolframalpha.com/input?i=y%27%3D-2y%2Bz%2Cz%27%3Dy-2z

### 点検?
勉強中

# sympyで
plotでグラフがでます。

```python
from sympy import *
x = Symbol  ('x',real=True)
y1 = Function('y1')(x)
y2 = Function('y2')(x)
var('C1 C2')
ans=dsolve( [Eq(diff(y1),-2*y1+y2),Eq(diff(y2),y1-2*y2)] )
print("#",ans[0])
print("#",ans[1])
mySubs={C1:1,C2:1}
plot (ans[0].rhs.subs(mySubs),ans[1].rhs.subs(mySubs)) 
# Eq(y1(x), -C1*exp(-3*x) + C2*exp(-x))
# Eq(y2(x), C1*exp(-3*x) + C2*exp(-x))
```
各1本だけです。
縦横比は異なります。

![0png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/083305f0-7677-903a-1749-0aa1163d6bfc.png)

# 参考

# つづく

https://qiita.com/mrrclb48z/items/b908e60bd4befac3ed56
バックエンド 勉強 #1 - Javaの開発環境を用意しよう(VSCode)

就職大変ですね~
こんにちは。日本は桜が咲いていますか？ここももうすぐ咲きそうですね。

結論から言うと、就職まだできてません～（22卒）🥺🥺
ウェブエンジニアとしての私にはこんな問題があります。


> チーム開発経験やハッカソンなどのイベント参加不在
> プログラミング言語的な知識の不備

システムエンジニアとして働くのはいいんじゃないか？

> 日本語能力検証ができない（独学で学んで）

そのため、同期たちと後輩たちが母国で就職する頃、私は日本での就職を考えていて、1年という時間が過ぎてしまいました。

大学で情報工学を専攻した時に扱った言語はC、JAVA、Pythonだったんですが、とにかく全部最初から習うという心構えで、はじめから勉強することにしました。

***

バックエンドは日本もJavaベースの場合が多いので、Javaから勉強しようと思いました。

Java系列のプログラミングでは、普通 [IntelliJ IDEA](https://www.jetbrains.com/ja-jp/idea/download/#section=windows) を使用しますが、私はずっと使っていたVSCodeでJavaの環境を作ろうと思いました。

https://code.visualstudio.com/

https://www.oracle.com/java/technologies/downloads/

VSCodeは単なる編集機なので、開発環境を整えるためには、上記の2つ以外にも必要なことがあります。

**Extension Pack インストール**
![j1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/6ea703de-cb92-4ded-f448-6362e21ae322.jpeg)

- Language Support for Java™ by Red Hat
- Debugger for JavaDebugging
- Test Runner for Java
- Maven for Java
- Project Manager for Java
- Visual Studio IntelliCode


コンパイル、デバッグ、プロジェクト管理など、必要な基本機能を備えたツールです。インストールしましょう。


**インストール後テスト**
![j2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/935c724c-6215-8410-b212-5527b6d682c2.png)

**View - Command Palette / F1 Key / Ctrl + Shift + P**



![2023-03-24 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/a4298794-b1ce-70a3-a954-bb8c7158b0c8.png)

Javaと入力して、**Create Java Project**を選択

![2023-03-24 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/bb4a4db7-91f5-ccb9-dab0-76829842453c.png)

ビルドツールを使用しません。
![2023-03-24 (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/039993ad-a147-63a6-f0d9-05b02dd8d450.png)
![2023-03-24 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/e2628640-87a2-d4fb-b74c-64fc260f120d.png)


Tutorialというディレクトリを作り、プロジェクト名もTutorialに作りました。


![2023-03-24 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822440/a88b1a49-9260-d89a-fc8c-2d98e262cea5.png)

App.javaという基本ファイルがあり、コンパイルが正常に動作するか確認できます。
[Array.prototype拡張] Next.jsで配列からランダムな要素を"シンプル"に取り出す方法

## はじめに
配列の中からランダムな要素を返すメソッドを、
配列からそのまま呼び出せたら便利そうだと思ったので実装してみました。

## イメージ
```typescript
const arr = ["a","b","c","d"]

// これができると嬉しい
const randomItem = arr.random() // ランダムな要素
```

## 拡張を行うファイルを作成
まず、任意のディレクトリ直下に、以下のようなファイルを作成します。
※ 今回は`utils`直下に作成しています。
```typescript
// @/utils/__arrayOverride__.ts
Array.prototype.random = function () {
  const length = this.length

  if (length <= 0) return ''

  return this[Math.floor(Math.random() * length)]
}

export {}
```

## 拡張ファイルを_app.tsxでimportする
次に、_app.tsxファイルで、先ほど作成したファイルをimportします。
```typescript
...
// Override
import '@/utils/__arrayOverride__'
...
```
これにより、アプリケーション全体で配列オブジェクトのprototypeが拡張されます。

## 型定義を追加
このままだと配列のメソッドに先ほど追加した`random`が表示されないので、型定義を拡張します。
```typescript
// index.d.ts
declare global {
  interface Array<T> {
    random(): T
  }
}
```
上記のように、Arrayインターフェースを拡張して、randomメソッドを追加しています。

## まとめ
prototypeを拡張する事で、
配列からそのままrandomな要素を返すメソッドにアクセスする事ができるようになるので、
実行箇所でヘルパー関数やMath.randomの呼び出しの必要が無くなり、シンプルなコードで済みます。

これで、"シンプル"に配列からrandomな要素を取り出すことができるようになりました。

## 参考文献
https://www.w3schools.com/jsref/jsref_prototype_array.asp

https://bobbyhadz.com/blog/typescript-array-extend
ぜんぜん知らんかった…CSS設計REMM（レム）について調べてみた

REMMってCSS設計知ってますか？
恥ずかしながら知りませんでした…

:::note info
本記事はREMMってどんなものなのか？をキャッチアップするために役立ててもらえると幸いです！
:::

## REMMってなに？

R...Roots
E...Element
M...Modify
M...Modifier

の頭文字をとってREMMです！

ICT株式会社によって考案されたCSS設計で2019年5月29日にガイドラインが公開されています！
公式サイトはこちらです。

https://remm.qwiproject.com/

> REMM（レム）は、フロントエンド開発における「要素命名」と「CSS管理」、「スタイリングアプローチ」の方法論です。
「Roots（ルーツ）」という考え方でHTML要素の命名を概念的にグルーピングすることによって、CSS設計の自由さと、CSSプロパティ汚染に対する適度な堅牢性が得られます。

と記述されていました。

公式サイトには概要を把握したい人のためのNotesとCSS設計のパターンガイドが用意されています。

https://remm.qwiproject.com/guide/#id_article-css_design_pattern_guide

:::note info
公式サイトの内容が充実している印象です！
REMMそれぞれの役割や制作の全体像から具体的な事例まで定義されているのでわかりやすいと感じました！
:::

## REMMのガイドラインを読んだ所感　

これまでのSACSSやFLACSSを知っていれば大枠を理解するのにそれほど時間はかからない印象です。
既存のCSS設計やフレームワークとの併用などすでに運用されているサービスにも取り入れられるようにと考えられているところも特徴だと感じました。

### REMMのなるほど！と思ったケバブケースへのこだわり
Notesに「ケバブケースへのこだわり」について書かれているところがあります。
この考え方はなかったな…と思ったのと同時に重要な考え方だと思ったので2点紹介します！

- 一般的なキーボードにおいて、補助キーなしで入力できる
- エディタ上でテキストをダブルクリックした時に「-」で選択が止まるため、構造単位で単語を選択できる

:::note
開発のちょっと手間を惜しんでいく考え方に感銘を受けました！

:::

詳細はこちらをご覧ください！

https://remm.qwiproject.com/notes/


### REMMの「予約語」という考え方
JavaScriptなどのプログラミング言語ではお馴染みですが、CSSではREMMを知るまで意識したこともありませんでした。

https://remm.qwiproject.com/guide/#id_article-generalization_of_words

予約語として定義したclassにはスタイリングしません。

```scss:text.scss
// textを予約後として定義する
.text {}
```

REMMでは予約語を拡張することや他のRootsの中で利用することも可能です。

#### 予約語として定義したtextを拡張する
```scss:text.scss
.text {}

.text-strong {}
```

#### 他のRootsで利用する
```scss:card.scss

.card {
  .text {}
}
```
.textは予約語としてスタイルの当たっていないclassのため他のRootsで使っても影響を受けません。

:::note
詳細度が上がるのは気になりますが、ネームスペースを確保して置けるのはメリットだと思います。
:::

サービスが大きくなればなるほど命名が苦しくなります。

状況によるトレードオフかもしれませんが、命名に使う時間を節約できることで実装したい機能のクオリティが上がるなら詳細度が多少あがるのは許容してもいいと考えます。

:::note info
基本的に詳細度が上がることは良くないと考えてます。
理想を言えば全て同じが良いところですはそうは言ってられないこともあるのでルールを決めて、stylelintで`max-nesting-depth`を制御する方法を用いるのが良いかと思いました！
:::

また、詳細度が高くなるのであれば下げるように書く方法もあります！

## CSSの詳細度を下げるための書き方
ネストしながらも詳細度を下げる方法があります。

```scss:card.scss

.card {
  .text {
    color: blueviolet;
  }
}

.text-accent {
  color: cadetblue;
}

// トランスパイル後
.card .text {} // 詳細度 0.2.0
.text-accent {} // 詳細度 0.1.0
```

この状態だと後から`text-accent`でtextカラーを上書きしようと思っても詳細度が`.card .text`の方が高く無理です。

下記のように記述することで詳細度を下げることができます。
```sass:card.scss
.card {
  [class=text] {
    color: blueviolet;
  }
}
```
HTML側は下記のようになります。
```html
<div class="card">
  <p class="text text-accent">text</p>
</div>
```

## まとめ
今時CSS設計なんて…って考えられる方も多いかもしれませんが、運営歴が長いサービスではすぐに新しいフレームワークや優れたデザインシステムを導入するのは現実的に厳しいことが多いと思います。

さまざまなCSS設計の考え方を取り入れながら今の課題感と照らし合わせて見直すなり、導入を検討するなりで安定的にサービスを運用できる方法を引き続き模索していきたいと思います！