OmniAICreator/Qiita-1.07M huggingface dataset:
Orange Pi 5 を買って ArchLinuxをインストールしてみました　その３

前回、ubuntuをインストールしたので、今回はArclLinuxをインストールしてみました

必要なもの
　　　ArchLinuxがインストールされているamd64のパソコン
　　　インターネット環境
　　　2.5inch SSDが接続できる orange-pi-5
　　　ArchLinuxをインストールする2.5inch SSD
　　　USB3.0TO SATA 変換ケーブル

---
パソコンにArchLinuxのインストールファイルをダウンロードします
https://github.com/7Ji/orangepi5-archlinuxarm
から、右側の Releases をクリックします

20230324 の Assets をクリックして 
ArchLinuxARM-aarch64-OrangePi5-20230324_170919-root.tar.xz 
をダウンロードします

---
パソコンにSSDを接続します
ターミナルからコマンドを入力します
sdX はパソコンの環境に合わせてください
```
sudo -i
gdisk /dev/sdX
GPT fdisk (gdisk) version 1.0.9.1

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/sdh: 234441648 sectors, 111.8 GiB
Model: Tech            
Sector size (logical/physical): 512/4096 bytes
Disk identifier (GUID): 1394C5E9-89CB-406D-9983-F78D79B18A3D
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 234441614
Partitions will be aligned on 2048-sector boundaries
Total free space is 234441581 sectors (111.8 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name

Command (? for help): 
```
もしパーティションが表示されたら d で削除し w で書き込んでください

パーティションを作成していきます

```
Command (? for help): n

Partition number (1-128, default 1):1

First sector (34-234441614, default = 2048) or {+-}size{KMGTP}:
default でいいので Enter を入力します

Last sector (2048-234441614, default = 234440703) or {+-}size{KMGTP}:+512M
512M のサイズを指定します（適当です）

Hex code or GUID (L to show codes, Enter = 8300):0700
0700 を入力します

Command (? for help):n
2番目のパーティションを作成します

Partition number (2-128, default 2):2
default の２でOKです

First sector (34-234441614, default = 1050624) or {+-}size{KMGTP}:
default でいいので Enter を入力します

Last sector (1050624-234441614, default = 234440703) or {+-}size{KMGTP}: 
default でいいので Enter を入力します

Hex code or GUID (L to show codes, Enter = 8300):
8300 でいいので　Enter を入力します

Command (? for help): w
ディスクに書き込みます

Do you want to proceed? (Y/N):Y
Y を入力します
```
パーティションの作成ができましたので
フォーマットします
```
mkfs.vfat /dev/sdX1
mkfs.ext4 /dev/sdX2
```
ArchLinux をディスクに書き込みます
```
systemctl daemon-reload
mkdir root boot
mount /dev/sdX1 boot
mount /dev/sdX2 root
bsdtar -C root --acls --xattrs -xvpJf /home/ユーザ名/ダウンロード/ArchLinuxARM-aarch64-OrangePi5-20230324_170919-root.tar.xz
mv root/boot/* boot
```
環境設定をします
SSDのパーティションのUUIDを調べます
ls -l /dev/disk/by-uuid/ | grep sdX[12]
で調べられると思います
```
お好みのエディターで root/etc/fstab のUUIDを変更します
UUID=a4bb4f78-5a7b-4a55-b24b-b458b40d6ce8       /       ext4  の行は　sdX2　のUUID
UUID=AAC8-4E6F  /boot   vfat　の行は　sdX1 のUUID
に書き換えて保存します

お好みのエディターで boot/extlinux/extlinux.conf のUUIDを変更します
APPEND  root=UUID=a4bb4f78-5a7b-4a55-b24b-b458b40d6ce8 rw の行は　sdX2 のUUID

SSDからのブートなので最後に1行追加します
FDTOVERLAYS     /dtbs/linux-aarch64-orangepi5/rockchip/overlay/rk3588-ssd-sata.dtbo
保存します
SSDをアンマウントします
umount [rb]oot
```

SSDをorangepi5に接続してブートが成功すればOKです

ブート後の設定は次回にさせていただきます
この続きは
https://qiita.com/jibri/items/a53ad56b0dbde176bc60
【プラクティス紹介】1分でさらっと分かる「エンドゲーム」

## プラクティス名（別名）
エンドゲーム　（最終リリーススプリント）

## プラクティスの目的・狙い
* 最終本番リリースやプロジェクト完了作業に専念できるようにする
* 負の遺産を次に引き継がない

## どんな時に使うか
* 最終スプリントはいつも慌ただしく、後できちんと整えようと思ったいた部分にも手が回らず、中途半端な状態でプロジェクトが終了してしまう（＝結果として負の遺産が大量発生する）

## 実施手順
* 最初のプロジェクト計画の時点でスプリント実施期間とは別に「エンドゲーム」の期間を確保しておく
* エンドゲームの期間はスプリントのタイムボックスと同じでなくても構わない（個別に設定する）
* エンドゲームの中でもプログラム改修は行ってよいが、機能追加は原則行わない
* スクラムイベントの実施もマストではない（が、デイリースクラムぐらいは続けた方がよい）
* スプリント中に後でやろうと思っていて結局できなかった事やプロジェクト完了に必要な手続きを行う

:::note info
エンドゲームの作業例：
* リファクタリングや不要コンポーネントの整理（ゴミ掃除）
* 品質やセキュリティを高めるための追加テスト（※本来はスプリント中に行うべき）
* 最終本番リリース作業
* ドキュメントの整備
* 保守運用チームへの引継ぎ
* プロジェクト全体のふりかえり
* 残課題の取り扱いに関するユーザ合意
* プロジェクト完了報告
* 契約完了手続き
など
:::

## アレンジ例
* 連続して次のプロジェクトが始まる（＝スプリントも継続する）場合でも、改善点を洗い出すためにエンドゲームを挟む

## アンチパターン
* エンドゲームでやろう、と何でも後回しにする
* エンドゲームをバッファと同一視し、スプリントの続きを行ってしまう

## 参考情報
「エンドゲーム」の出典は以下の書籍です。MARVELのアレじゃないです。

https://www.juse-p.co.jp/products/view/799

## こぼれ話（私的コメント）
要はUndoneタスクや技術的負債を吐かせて次のプロジェクトに悪さを引き継がないための布石です。契約の切れ目ではPBLに載らないタスクも諸々発生するので、最終スプリントだけ妙にベロシティが低い、とならないように切り分けるという意味もあります。最終スプリントのバタバタの中で本番リリースするとミスが増えるので、落ち着いてDEVが作業に専念できる期間を設けてあげようという心理的な要素もあるかもしれません。
理想としては全ての作業をスプリントの中で消化するべきなんでしょうけど、現実的には難しいので必要悪（？）として受け入れています。

「エンドゲーム」と聞くと、マネージャーが指をパチンと鳴らしたら、次のプロジェクトではDEVが半数になっていた・・・なんて良からぬ想像をしてしまうのは僕だけでしょうか？

　[アジャイルプラクティス一覧へ戻る](https://qiita.com/kakashi_h5/items/20584998c5ca4594b9ea)
[JSTQB AL TA]　5.レビュー　を視覚的にまとめてみた

# はじめに

こんにちは、Ma5am1nです。
[シラバス](https://jstqb.jp/dl/jstqb.jpdlJSTQB-SyllabusALTA_V311.J03.pdf)[^1]は文字が多くて頭に入りにくいので、図など視覚的に入ってきやすそうな形式でまとめてみます。

[^1]: Advanced Level シラバス日本語版　テストアナリスト　Version 3.1.1.J03 

**※あくまで私個人の解釈で作成したものです。内容が100%シラバスの通りであることは保証できませんので、ご了承ください。**
**※スライドの青文字、青線になっている箇所は、シラバスに記載されていない、私独自の解釈で記載した内容です。**

このページでは、5.レビュー　について扱います。

# 5.レビュー
## 5.1イントロダクション
![JSTQB AL TA-101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/457f8af2-de5f-3f54-3ea9-c17d5fe6327f.png)

## 5.2レビューでのチェックリストの利用
![JSTQB AL TA-103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/e0d18ed0-79a0-9b78-984e-709797c95ff5.png)
![JSTQB AL TA-104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/6abd8166-7b9e-39cb-96ff-fd9064f4bbef.png)

### 5.2.1要件レビュー
![JSTQB AL TA-106.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/f5d77d4c-1027-b51f-a291-1cb793be9a10.png)

![JSTQB AL TA-107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/94c570b5-c297-eed7-b203-30a2b2f4ad54.png)

### 5.2.2ユーザーストーリーレビュー
![JSTQB AL TA-109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/c9e620ae-6067-4b3f-2361-b4e316b3c582.png)

### 5.2.3チェックリストの調整
![JSTQB AL TA-111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636570/009538d7-3685-4c74-cd48-c159d032e120.png)
ABC314回答メモ

0.はじめに
　久々に企業名を冠していないABCだなーと思いつつ参戦。
　人気企業アンケートの為かな・・・。
　A～Dはとりあえず解けましたが、そこで時間切れ。
　結果として、レートは+1とほぼ変わらずだったので
　他の方もそこそこ行けてたんだろうなと思いました。
　
　対象言語も増えたようですが、Pythonが3種類くらいあって
　しかも並んでないのでなんかよくわかりにくかったです。
　せめてアルファベット順に並ばないのかな・・・。

1.A - 3.14
　最初四捨五入するのかと思い悩みましたが、切り捨てだったので
　単純に与えられた円周率をいい感じでカットして出力してACでした。

　https://atcoder.jp/contests/abc314/submissions/44492973

2.B - Roulette
　なかなか複雑な条件で、出力も
　場合によって2種類必要と、手ごたえのある問題でした。

　実装は、入力しながら
　賭けた出目をキー、賭けた人達のリストを値に持つ辞書ACと
　賭けた人毎のかけた出目の種類数をもつ辞書CNを作成

　Xを入力したあと、XがACにない場合は0を出力して終了
　存在した場合は、値のリストをリストHLに格納

　HLのかけた人毎にACを検索し、各人の出目の種類数をリストHNに格納
　HNの最小値＝最小出目の種類数をMinHに格納。

　再度HLリストを頭から見ていき、出目の種類数がMinHと同じである
　賭けた人をリストansに格納

　最後にansの長さと、各値を出力して終了

　提出した際に、ansの長さを出力する必要があることを
　見逃して、WAを出してしまったのが悔やまれます。　

　https://atcoder.jp/contests/abc314/submissions/44503150

3.C - Rotate Colored Subsequence
　一目でTLEが心配される問題。

　キーは色名、値は前回発生したキー色の文字辞書dictを用意
　文字列SとリストCを頭からインデックスをiとして見ていき
　文字列S2に移行していく
　　C[i]がdictにない場合
　　　S2に"_"を追加
　　あった場合
　　　S2にdict[C[i]]の値を追加
　　dict[C[i]]にS[i]を追加
　ここまでで、色毎の先頭の文字は"_"、最後の文字は
　dictに入っている
　そこで、S2を頭からインデックスをiとして見ていき
　文字列ansに移行していく
　　S2[i]が"_"の時、ansにdict[C[i]]の値を追加
　　それ以外の場合、S2[i]を追加

　この実装で提出したところpypyだとTLEだったので
　Cpythonで提出したところACとなりました。

　D問題で、文字列をリストにする方法を知ったので
　Sをリスト化して改良したところpypyでも楽にACとなりました。

　https://atcoder.jp/contests/abc314/submissions/44514010

　改良版
　https://atcoder.jp/contests/abc314/submissions/44545235

4.D - LOWER
　いかにTLEを回避するか問題だなと思いつつ、さすがに
　文字列の儘は難しいので文字列をリスト化して保持しました。
　（意外と扱いやすいので今後も使っていきます）

　まずはクエリーをリストCに保存しつつ、t1=2と3が最後に出てくる
　箇所を保存します。

　次に、リストCを頭から読んでいき、t1が1の場合は、文字列リストx文字目を
　cに置き換える
　t1が２・３の場合は、それが、最後にで来る箇所と一致する場合のみ
　文字列リスト内のアルファベットの大文字小文字変換を行う

　最後に文字列リストを結合して出力して無事ACでした。
　

　https://atcoder.jp/contests/abc314/submissions/44529944


以上
LaravelでcomposerとPHPバージョン違いのエラー


環境
・MasOS
・Laravel8
・docker

localhostでアクセスした際に、
~~~
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.4.33. in /var/www/html/app/vendor/composer/platform_check.php on line 24
~~~

このエラーに遭遇しました。

エラー内容としては、
composerに必要なPHPバージョンは8.1.0だが、あなたのバージョンは7.4.33ですよ
と言われている。

解決方法
いいや私はPHP 7.4.33 を使うからそっちが折れろ！
という気持ちでcomposer側にバージョンを指定してあげれば良い。

~~~
composer config platform.php 7.4.33
~~~
このコマンドを実行するとバージョンを変更することができる。

バージョンを変更後はアップデートさせる必要があるので、

~~~
composer --no-plugins update --no-scripts
~~~
このコマンドでアップデートさせるとバージョン違いのエラーが消えるはず！
Rubyのincludeについて

# はじめに

#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>



# includeとは


includeはモジュールの性質を他のクラスに追加するために使用されるメソッドです。

簡単に言うとincludeはモジュールを呼ぶためのメソッドです。


# includeの使い方


書き方は基本的にクラスと同じに、モジュールを定義し、


その中にメソッドを記述します。

```
module モジュール名
def メソッド名()
メソッドの機能
end
end
```


そうしたらクラスの中でincludeでモジュールを指定し、モジュールに記載されたメソッドをクラスに取り込みます。



# まとめ


- includeはモジュールを呼ぶためのメソッド
- 書き方は
 ```
module モジュール名
def メソッド名()
メソッドの機能
end
end
```
僕たちは 「メソッド」を書いたことなんてない

# 概要

オブジェクト指向プログラミングを始めると、必ずと言っていいほど疑問となるのが、
「メソッドと関数はどう違うのか」というもの。

これに対する簡単な答えはこうだ。

**プログラマが書くのが関数。pythonが自動で作ってくれるのがメソッド。**

# 実験

まず、次のコードを実行してほしい。

```python: 対話モード
>>> class クラス:
...     def メソッド(self):
...         return self
...
>>> type(クラス.メソッド)
```
すると、次の結果を得る。
```
<class 'function'>
```
これが意味するのは、今までメソッドだと思ってきた `メソッド` だが、いざ型を調べてみたら、
**メソッドではなく関数である**ことが分かってしまったというものだ。

続けて、次のコードを実行してほしい。
```python: 対話モード(さっきの続き)
>>> インスタンス = クラス()
>>> type(インスタンス.メソッド)
```
すると、次の結果を得る。
```
<class 'method'>
```
今度は、さっきまで関数だったはずの `メソッド` が、メソッドとしての型を持つ結果となった。

# 説明
実は、 **クラスにメソッドなんてない** のである。あるのは関数だけだ。
クラスからインスタンスが作られたときに、**クラスの関数が インスタンスのメソッドになる** だけのことなのである。

次に、これを理解するため、2通りの説明を用意した。
ひとつはクラスとインスタンスの違いをOSとコンピュータの関係になぞらえて説明するものであり、
もう一つは、形式として表れる、関数とメソッドに違いを実際に確認するものである。

## インスタンスはコンピュータ。クラスはOS

まず、クラスにはチューリング完全な記述が可能である。
何故なら、クラス内の変数でメモリを、クラス内の関数でヘッダを表現できるからだ。
従って、そのクラスから作られるインスタンスはチューリングマシンとみなせる。…①

ここで、チューリングマシンは、コンピュータである。…②

①②より、インスタンスはコンピュータである。…③

また、インスタンスは、クラスにより挙動や仕様が定められている。…④

ここで、コンピュータの挙動や仕様を定めるものは、OSである。…⑤

④⑤より、インスタンスがコンピュータであれば、クラスはOSであるため、③より、クラスはOSである。…⑥



さて、OSが出来るのは、あくまでも「計算・処理方法の定義」(理論)であって、実際に計算を行い、処理を実現する(実践)ことで何らかの「機能」を提供するのはコンピュータの仕事である。…⑦

計算や処理方法の定義は、つまるところ式(と文)の集まりにより、入力を出力に変換する規則を明記したものに過ぎないため、これは理論に過ぎず、単なる「関数」である。…⑧

⑦⑧より、OSが提供するものは「関数」である。…⑨

⑦と⑨をまとめると、
OSは理論と「関数」を提供し、
コンピュータは「関数」に従って処理を実践し、「機能」を提供する。…⑩

⑥⑩より、クラスが持つのは(理論を述べた) **関数** `function` であり、
インスタンス が持つのは(実践をする) **機能** `method` である。


## 関数とメソッドは、引数も違う

関数とメソッドの形式上の最大の違いは、引数の個数である。
具体的には、 **メソッドは、関数から一番最初の引数だけ奪われたもの** となっている。

早速実験してみよう。
但し、ややこしいので、`クラス.関数 = クラス.メソッド` という処理をしておく。

まず、メソッドである、 `インスタンス.メソッド()` を実行する。

```python: 対話モード(さっきの続き)
>>> インスタンス.メソッド()
<__main__.クラス object at 0x0000016996CD7610>
```

この `メソッド` を定義した際、仮引数 `self` を1つ用意していたにもかかわらず、
呼び出し時には 実引数0個となっている。
そして、戻り値を見ると、 `インスタンス` が返却されている。
`メソッド` では、 `return self` という処理が定義されていたことから、
**一番最初の仮引数 `self` には `インスタンス` が実引数として勝手に代入される** ということが分かる。

次に、関数である `クラス.関数(インスタンス)` を実行する。


```python: 対話モード(さっきの続き)
>>> クラス.関数 = クラス.メソッド
>>> クラス.関数(インスタンス)
<__main__.クラス object at 0x0000016996CD7610>
```

これは、`インスタンス.メソッド()` と同等の結果である。
実際、

```python: 対話モード(さっきの続き)

>>> クラス.関数(インスタンス) is インスタンス.メソッド()
True
```

となる。

# 結論

```python: 
>>> クラス.関数 = クラス.メソッド
>>> インスタンス = クラス(*a1, **ka1)
```

のとき、
```python: 
>>> クラス.関数(インスタンス, *a2, **ka2) is インスタンス.メソッド(*a2, **ka2)
True
```

である。

**メソッドは、pythonのシステムが「勝手に」クラス内の関数から最初の引数を奪い取り、そこにインスタンス自身を代入したもの**である。

つまり、**メソッドは、pythonシステムが「勝手に」作った、関数の模造品**なのである。
繰り返すが、**メソッドは pythonシステムが作る**のであり、プログラマが作るものではない。
**プログラマは、あくまでも関数を作る**のみである。
NeosVR コンパイラ その3

# 概要
NeosVRのオブジェクトを外部で生成するコンパイラを開発した。
箱を作ります。
新規＞3Dオブジェクト＞ボックスと同じものです。

# 説明

立方体をテクスチャで描画します。
掴める様に、ぶつかる様にします。


# 俺コード

```
new FrooxEngine.Grabbable
new FrooxEngine.BoxCollider
new FrooxEngine.PBS_Metallic
new FrooxEngine.BoxMesh
new FrooxEngine.MeshRenderer
FrooxEngine.MeshRenderer.Data.Materials.Data[0].Data = FrooxEngine.PBS_Metallic.Data.ID
FrooxEngine.MeshRenderer.Data.Mesh.Data = FrooxEngine.BoxMesh.Data.ID
add FrooxEngine.Grabbable
add FrooxEngine.BoxCollider
add FrooxEngine.PBS_Metallic
add FrooxEngine.BoxMesh
add FrooxEngine.MeshRenderer

```

# 実行結果

![2023-08-13 01.09.25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5723af3-6c03-5d6a-1423-b2cb7141878c.jpeg)

# 成果物
コンパイラはこれ

https://embed.plnkr.co/plunk/7BXAyZZ3kBswPvjT

# 実行確認の手順。

- 上のページで生成されたjsonを、メモ帳で「box.json」で保存する。

- NeosVRを起動して、セッションに入る。

- ファイルブラウザを開いて、「box.json」をダブルクリックする。

- 画像のように表示されれば、成功です。


以上。
使えなくなったHDDを認識させてフォーマットする。

# はじめに
[前回](https://qiita.com/sakai00kou/items/22b6cdd6f89b9c3ab0d5)、NASで使っていたHDDが１本使えなくなってしまい、新たにNATとHDDを購入して旧NASのデータをQNAPのRTRRで移しましたが、使えなくなったHDDを捨てるにしてもフォーマットくらいはやっておきたいなぁと思い、色々とやってみた結果を残しておきます。

- 【前】[RTRRでQNAP NAS間同期を行う。](https://qiita.com/sakai00kou/items/22b6cdd6f89b9c3ab0d5)
- 【次】[使わなくなったNASとHDDを二次バックアップとして使用する。](https://qiita.com/sakai00kou/items/12c0be68119b9197514e)

# 使えなくなったHDDをチェックする。
ひとまず元々のNASから使えるHDDを取り外し、使えないHDDのみ取り付けて起動・・・してみるもののゴリゴリ音がするだけで起動せず。

NASの管理画面に入れれば確認くらいはできるかと思いましたが、結局確認できませんでした。

# 認識させるための作業開始
まぁ、ダメ元なので他のことをやりつつ片手間で色々と試してみます。

## Linuxでの確認
デスクトップマシンに使えなくなったHDDを繋げて、雑誌のおまけで付いてきたブータブルDVDで起動してみる。

デバイス操作はLinuxのほうが慣れているのと、デバイスが見えればコマンドからローレベルフォーマットがかけられるので、起動してみるもののLinux起動途中でフリーズしたりする。

なんとなく、使えなくなったHDDにアクセスしようとしてもアクセスできずにフリーズしているような感じがする。

何度か再起動を行い、無事起動してきたので、`fdisk`コマンドで早速デバイスを確認・・・したものの、使えなくなったHDDのデバイス名は表示されませんでした。残念。

## Windowsでの確認
LinuxのブータブルDVDを抜き、Windowsを起動し確認してみる。

まぁ、やっぱり見えないかな・・・と思ったところ、どういうわけか、Dドライブとして認識されている！

認識されているならフォーマットかけられるか？と思い、「**ディスクの管理**」からディスクを確認し、ひとまず見えているパーティションを削除しようとしたものの、存在しないデバイスが云々言われ失敗。

見えたりすることもあるようなので動作が不安定なことには変わりないようです。

やっぱりフォーマット無理かな〜と思いつつ、デバイスが見えたならどうにかなるのでは？と思い、Windows再起動後、再度パーティションを削除しようとしてみたところ、今度はパーティションが削除できました！

本当はまたLinux側を起動してローレベルフォーマットをかけたいところですが、再起動してまた見えなくなっても困るので、見えているうちにWindowsでフォーマットを実行。

## 再度Linuxで確認
一度フォーマットかけたので見えるようになるかなと思い、再度ブータブルDVDで起動してみると、今度はきちんと認識されました！

このまましばらく使えそうではありますが、使ったとしても動作音的に長くは持たないかと思うので予定通り以下コマンドでゼロフォーマットをかけます。

```bash
dd if=/dev/zero of=/dev/sdb bs=256M
```

ちなみにddの進捗は別ウィンドウで以下コマンドを実行することで進捗状況を確認できます。

```bash
pkill -USR1 dd
```

# おわりに
無事ゼロフォーマットもできたので安全に捨てることができました。

ただ、元々使っていたNASも色々といじっていたらNASの電源も故障してしまったようで、起動しようとしても起動できなくなってしまいました。。

常時起動して使っていたのでNASもHDDも寿命だったかな。
TypeScriptの入門① ~TypeScriptの特徴と静的型付け~  


TypeScriptは、JavaScriptを拡張して開発された新しいプログラミング言語です。

TypeScriptの特徴は、<b>TypeScriptで書いたコードをコンパイルするとJavaScriptのコードへと変換されること</b>と<b>あらかじめ変数の型を定義する静的型付けを採用していること</b>にあります。

TypeScript は npm Package Manager (npm) でインストールできます。

詳しくは、<a href="https://nodejs.org/ja">こちら</a>のサイトをご確認ください。

以下のコマンドを入力すれば使えるようになります。
```shell-session
$ npm install -g typescript
```

<h2>TypeScriptはJavaScriptにコンパイルされるとは</h2>

さて、TypeScriptの説明に戻りますが、下記の図のようにTypeScriptで記載したコードはJavaScriptに変換されます。


![スクリーンショット 2023-08-12 15.31.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782718/0c0a25f3-ec0a-8f52-281f-1d5984a8cc9b.png)

まず、任意のディレクトリ(ここではtypeScript-practice)を作成し、そのディレクトリ配下にindex.tsを作成します。

ここでは、TypeScriptで記載したコードはJavaScriptに変換するという流れを理解することが目的なので、コードの意味は深く考えなくても大丈夫です。
index.tsを以下のように記載しましょう。

```javascript:index.ts
let hello: string = 'Hello World!!';
console.log(hello);
```

TypeScriptでコードを書き、「.ts」という拡張子をつけてファイルを保存したら、「tsc」のコマンドを入力します。

そうすると、tsファイルをjsファイルにコンパイルされ、同じディレクトリ内に同名の.jsファイルが作られます。


```shell-session
$ ls
index.ts
$ tsc index.ts
$ ls
index.js        index.ts
```

上記のコマンドを入力すると、index.jsが作成され、TypeScriptで記載したコードがJavaScriptのコードに変換されました。

```javascript:index.js
var hello = 'hello';
console.log(hello);
```
そして、nodeコマンド(JSファイルを実行するコマンド)で、ファイルを実行すると、きちんと「Hello World!!」と表示されることを確認しましょう。

```shell-session
$ node index.js
Hello World!!
```

この一連の流れがTypeScriptからJavaSriptにコンパイルされることを表します。


<h2>静的型付け</h2>
JavaScriptにコンパイルされる静的型システムが付いたJavaScriptの上位集合と言われます。
静的型付けを使用することで、コードが実行される前に型のエラーを検出できるため、バグを早期に発見しやすくなるということが特徴です。

```javascript:typeScript
//a: number：aはnumber型であることを示しています。
//b: number：bもnumber型であることを示しています。
//sum( ... ): number：関数sumの戻り値がnumber型であることを示しています。
function sum(a: number, b: number): number {
  return a + b;
}
```


このように型を明示的に指定することで、間違った型の引数を渡すとコンパイルエラーになるため、ランタイムエラーのリスクを減少させることができます。

TypeScriptの静的型付けは、コードのバグを早期に発見し、コードの可読性と保守性を向上させるための強力なツールです。コンパイル時に型の安全性をチェックすることで、ランタイムエラーのリスクを大幅に減少させることができます。
配列の中身をSystem.out.printlnで出力するときは…

下記のように、配列を単にSystem.out.printlnに渡しても 意味不明な文字列が表示されるだけで配列の中身は表示されません。

```java
String arr1[] = {"AA", "BB", "CC", "DD", "EE"};
int arr2[] = {1,2,3,4,5};
 
System.out.println(arr1);
System.out.println(arr2);
```

```
コンソール結果…
[Ljava.lang.String;@15db9742
[I@6d06d69c
```

## 解決方法
配列(Array)の中身(要素)を表示するには、**「Arraysクラス」の「toStringメソッド」** やdeeptoStringメソッドを使用する。

:::note
ArraysクラスのtoStringメソッドは、配列を文字列に変換するメソッドである。

【toStringメソッドの書き方】
「import java.util.Arrays;」を頭に記述。
「Arrays.toString(配列);」
:::

```java
import java.util.Arrays;
 
String arr1[] = {"AA", "BB", "CC", "DD", "EE"};
int arr2[] = {1,2,3,4,5};
 
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
```

```
コンソール結果…
[AA, BB, CC, DD, EE]
[1, 2, 3, 4, 5]
```
#PowerApps コンボボックスのスキマをお埋めいたします

[前回](https://qiita.com/yamad365/items/1aa99dc8311007bd19c8) はドロップダウンのスキマについて調べました。
少し時間が経ってしましましたが、今回はコンボボックスのスキマについて試してみます。

コンボボックスコントロールさんのココロのスキマをお埋めいたします（違（違わない？

何の話？
という方は [前回](https://qiita.com/yamad365/items/1aa99dc8311007bd19c8) の記事を参照ください。

# コンボボックスコントロールのスキマ埋めます
結論ですが、ドロップダウンコントロールと同様にコンボボックスコントロールも［PaddingTop］、［PaddingBottom］プロパティで調整可能です。確かに調整可能なのですが・・・

## デフォルトの状態
キャンバスアプリの画面にコンボボックスを配置した直後のデフォルト（初期）状態は上下左右の Padding は 5 です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/2df42286-60ce-8674-972d-e9b595b36472.png)
［V］をクリックして展開すると、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/6243c07a-a2d6-f10b-1399-28849860cb4d.png)

## スキマの調整
上下の Padding（PaddingTop、PaddingBottom プロパティ）を 0 にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/a3215a4c-6245-4fcf-e546-0cdc751a5981.png)
ほんの少しだけ上下のスキマが縮小されています。伝わりますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/5f0da31d-5e48-9e99-7c2d-0fb50ee522c7.png)
とても控えめな感じですが、チョッとだけスキマが無くなってるんですよ汗

## 並べてみた
ホントにスキマが詰まったのか？並べて比較してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/95914f41-9934-e5db-a8bc-1bfd8b2ac329.png)
おわかりいただけただろうか・・・。
これでも、すこーしだけスキマが詰まっているんですよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/153eeaf5-028a-7d71-d91f-f0f53c90980a.png)

## 拡張も可能
もちろん、ドロップダウンコントロールと同様にスキマ（PaddingTop と Bottom）を広げることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/84619cfc-b4d0-b65e-118b-0ab54e9c292e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/c36c192d-80fc-dbe8-3323-c3a75e0c4650.png)

# コンボボックスのスキマを埋める限界についての考察
ドロップダウンコントロールはデフォルトの上下 Padding が 10 なので、そこを減らせば劇的にスキマが詰まった印象になりました。コンボボックスコントロールに関しては、上下の Padding を減らしても”気持ち詰まったかな？”ぐらいの印象しかありませんよね。

なぜなのか？

Edge ブラウザーの [開発者ツール（DevTool）](https://learn.microsoft.com/ja-jp/microsoft-edge/devtools-guide-chromium/overview?WT.mc_id=DX-MVP-5004053) で HTML の要素を調べてみました。

細かい技術的な話題は割愛しますが Power Apps Studio 上で PaddingTop、PaddingButton をいくら操作しようとも、コンボボックスコントロールの場合は表示している各要素（アイテム）の上下に固定で Padding = 10 が存在しているみたいなんです。以下に開発者ツールで”Item1”を選択した際の一部を貼っておきます。左側の黒背景に四角が重なっているのが HTML 的な構成を視覚化した情報になります。

・Power Apps Studio 上で PaddingTop、PaddingButton を 0 にした場合の解析結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/19ddf609-e034-5bfd-6e55-334d5ded143b.png)
・Power Apps Studio 上で PaddingTop、PaddingButton を 50 にした場合の解析結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/dba41663-0cee-913a-5045-3f461495aaa8.png)
どちらの図も、右側の Power Apps 側で
　水色の部分 ＝ コントロールのプロパティで変更できるスタイル
　緑色の部分 ＝ 外部から変更不可能なスキマ（Padding = 10）のスタイル
になっている状況が確認できますね。

# まとめ
ドロップダウンコントロール同様にコンボボックスコントロールも上下のスキマを調整可能です。ただし、コンボボックスコントロールは必ず上下左右に Padding = 10 が存在しており、その値は現時点の仕様では変更ができない、という結論になります。

結論、コンボボックスコントロールは Power Apps 側で Padding プロパティを操作しても必ず 10 はスキマができてしまう、というコトでした。

コンボボックスのスキマを埋めようとしても、少しだけスキマ残っちゃう。仕様だもの。

それでは、皆さま、素晴らしい Power Platform Life を！
Javaで「ファイルやディレクトリをコピーする(Files.copy)」の動作を確認してみた

# 概要
Javaで「ファイルやディレクトリをコピーする(Files.copy)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/file/index11.html

# 実装
以下のファイルを作成しました。
```JSample11_1.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;

class JSample11_1{
  public static void main(String[] args){
    Path p1 = Paths.get("/code/java/file/doc/memo.txt");
    Path p2 = Paths.get("/code/java/file/doc/memo.back");
    Path p3 = Paths.get("/code/java/file/doc/src");
    Path p4 = Paths.get("/code/java/file/doc/dest");

    try{
      Files.copy(p1, p2);
      Files.copy(p3, p4);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample11_1.java 
$ java JSample11_1 
$ cd /code/java/file/doc/
$ ls
dest  manual  memo.back  memo.txt  src
```
以下のファイルを作成しました。
```JSample11_2.java
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.IOException;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;

class JSample11_2{
  public static void main(String[] args){
    Path p1 = Paths.get("/code/java/file/doc/memo.txt");
    Path p2 = Paths.get("/code/java/file/doc/memo.back");

    try{
      Files.copy(p1, p2, REPLACE_EXISTING);
    }catch(IOException e){
      System.out.println(e);
    }
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample11_2.java 
$ java JSample11_2 
$ ll /code/java/file/doc/
合計 28
drwxrwxr-x 5 ******** ******** 4096  8月 13 08:20 ./
drwxr-xr-x 3 ******** ******** 4096  8月 11 07:52 ../
drwxrwxr-x 2 ******** ******** 4096  8月 13 08:17 dest/
drwxrwxr-x 2 ******** ******** 4096  8月 11 07:55 manual/
-rw-rw-r-- 1 ******** ********   21  8月 13 08:20 memo.back
-rw-rw-r-- 1 ******** ********   21  8月 13 08:16 memo.txt
drwxrwxr-x 2 ******** ******** 4096  8月 13 08:16 src/
```

# まとめ
何かの役に立てばと。
暗号に特化したECESという資格について

# はじめに

暗号に特化した資格は、これまで見たことありませんでしたが、EC-Council社主催の資格の中で見つけたので、こちらで記載することにしました。

# Who am i ?

しがないエンジニアです。EC-Council社認定の資格もいくつか持っています。

# この記事の想定読者

 - 暗号に特化した資格試験に興味がある人
 - ECESについて受講を検討している人
 - その他

# 本題（ECESについて）

EC-Council社が主催するEC-Council Certified Encryption Specialist（ECES）という資格があります。この資格は暗号に特化しているカリキュラムになっている所が他のセキュリティ資格とは少々毛色が異なっています。おそらく暗号通貨やブロックチェーンなどで暗号技術が再度注目されていることが背景で、これに伴って暗号の資格を作ろうという試みがEC-Council社内であったのではないでしょうか。ここではあまり触れませんが、暗号通貨やブロックチェーンを扱う人向けの資格（BDC、BFC、BBLCと呼ばれる資格）も用意されているので、その導入としてECESを用意したという意図があったのかもしれません。
また、ECESは2023年8月13日現在、日本のGSX社等では開講されていません。そのため、個人でEC-Council社へ問い合わせを行い、受験をする必要があります。また、日本におけるマスターディストリビュータであるGSX社で開講されていないということは、恐らく試験も英語でのみ受験が可能になっていると思われることから、英語の準備もしておく必要があります。

EC-Council社のサイト等で得られる情報は以下くらいかと思われます。

https://www.eccouncil.org/train-certify/ec-council-certified-encryption-specialist-eces/

試験の概要や合格ラインなどはこちらに記載あります。

https://cert.eccouncil.org/ec-council-certified-encryption-specialist.html

試験の合格ラインと時間はこちらです。

```
ECES試験
試験時間：　2時間
質問：　50
合格点：　70%
```

試験範囲のBlueprintはこちらに記載あります。

https://cert.eccouncil.org/images/doc/ECES-Exam-Blueprint-v1.pdf

```
Introduction and History of Cryptography: 8%
Symmetric Cryptography and Hashes: 44%
Number Theory and Asymmetric Cryptography: 14%
Applications of Cryptography: 24%
Cryptanalysis: 10%  
```

ECESの概要自体は以下の動画でわかりやすく説明されています。

https://www.youtube.com/watch?v=5LeUq5yxYvA

学部生や修士の学生など、一部学生を対象としているような気がしますが、このレベルであれば社会人も受験するのでしょうね。

# 補足

一応、Version2が出ているようですが、セクション見た限りではVersion1と大差ないように見えます。どこが変わったのでしょうね。。


# 終わりに

暗号に特化した資格ということで今後の動向に少し期待をしていますが、将来日本でも受講できるようになるかは不明です。EC-Council社の資格全体のマッピングはこちらに載せておきます。

https://www.eccouncil.org/vapt-career-path/
2023/8/13主にITとかセキュリティの記事

セイコーグループが不正アクセス被害、外部調査で情報流出の懸念判明(8/10)
https://cybersecurity-jp.com/news/86642

ハッカー攻撃でのマイクロソフトの役割、米諮問委の調査対象－関係者(8/11)
https://www.bloomberg.co.jp/news/articles/2023-08-11/RZ7F2YT0G1KW01?srnd=cojp-v2

意外と見過ごしがち！ 家庭用ルーターのセキュリティ(8/11)
https://ascii.jp/elem/000/004/148/4148647/?rss

米国が日本など対象にサイバー諜報活動、中国外交部がコメント(8/11)
https://news.livedoor.com/article/detail/24782561/

DeFiは決して、終わっていない(8/11)
https://news.yahoo.co.jp/articles/50bebd7aefb85665fcf75fe10498d33186b1df22

中国、周辺国への米サイバー軍事力配備に反対　「オオカミ引き入れる」(8/11)
https://nordot.app/1062434837054783791

米、生成ＡＩを安全保障に活用 国防総省に特別チーム新設(8/11)
https://www.the-miyanichi.co.jp/news/World/2023081101000238.php

当社グループ子会社を騙る不審なメールにご注意ください 株式会社パイオラックス(8/11)
https://www.piolax.co.jp/jp/202308111548-5754/

第 93 期第 1 四半期報告書の提出期限延長に関する承認申請書提出のお知らせ 日本コンクリート工業株式会社(8/10)
https://www.release.tdnet.info/inbs/140120230809538909.pdf

北朝鮮、23年も核兵器開発継続　制裁回避も＝国連報告書(8/11)
https://nordot.app/1062613401396708314

北朝鮮のハッカー集団がロシアのミサイル会社に侵入、友好国も標的に―海外メディア(8/11)
https://nordot.app/1062696604635054401

＜Q&A＞どうする？私の健康保険証　マイナ保険証と資格確認書、何が違うの？解除や再登録はできる？(8/11)
https://www.tokyo-np.co.jp/article/269438

「米国が虚偽拡散」と批判＝防衛省ハッキング報道で談話―中国(8/10)
https://sp.m.jiji.com/article/show/3018348

バイナンス、Curve DAO Tokenに7億円投資(8/11)
https://coinpost.jp/?p=476881
PHPで時々使う正規表現

## 正規表現とは

正規表現が何なのかについては、[Wikipediaの項目](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)を見てください。

## PHPにおける正規表現

PHPには正規表現を扱う`preg_*` 系の関数があります。

https://www.php.net/manual/ja/book.pcre.php

一番よく使うのは [`preg_match`](https://www.php.net/manual/ja/function.preg-match) だと思います。

* `preg_filter`
* `preg_grep`
* `preg_last_error_msg`
* `preg_last_error`
* `preg_match_all`
* [`preg_match`](https://www.php.net/manual/ja/function.preg-match) ← よく使う
* `preg_quote`
* `preg_replace_callback_array`
* `preg_replace_callback`
* `preg_replace`
* `preg_split`

### URLが `https://` 開始かどうか調べる

```php
if (preg_match('|https://.*|', $url)) {
    // https:// 開始だったときの処理
}
```

`https://` の右側の値を使いたい場合は以下のようにします。

```php
if (preg_match('|https://(.*)|', $url, $m)) {
    // https:// 開始だったときの処理
}
```

`https://` の右側が要らない場合は、PHP8であれば `preg_match` を使わず [`str_starts_with`](https://www.php.net/manual/ja/function.str-starts-with.php) を使えます。

```php
if (str_starts_with($url, 'https://')) {
    // https:// 開始だったときの処理
}
```

### メールアドレスのドメイン部分が `gmail.com` かどうか調べる。

```php
if (preg_match('/.*@gmail.com$/', $mailAddress)) {
    // Gmailの場合の処理
}
```

`@` の左側の値を使いたい場合は以下のようにします。

```php
if (preg_match('/(.*)@gmail.com$/', $mailAddress, $m)) {
	// Gmailの場合の処理
}
```

`@` の左側が要らない場合は、PHP8であれば `preg_match` を使わず [`str_ends_with`](https://www.php.net/manual/ja/function.str-ends-with) を使えます。

```php
if (str_ends_with($mailAddress, '@gmail.com')) {
    // Gmailの場合の処理
}
```


### ユーザーエージェントが `Android` を含むかどうか調べる

```php
if (preg_match('/Android/', $userAgent)) {
	// Androidの場合の処理
}
```

これはstrposを使ったほうがいいかもしれません。

```php
if (strpos($userAgent, 'Android') !== false) {
	// Androidの場合の処理
}
```

PHP8以降であれば [`str_contains`](https://www.php.net/manual/ja/function.str-contains) が使えます。

```php
if (str_contains($userAgent, 'Android')) {
	// Androidの場合の処理
}
```

### パスワードとしてふさわしくない文字列かどうか調べる

複数の値について完全一致でチェックしたい場合も正規表現で書くことがある。

```php
const BAD_PASSWORD_PATTERN = '/^(123456|123456789|Qwerty|Password|12345|12345678|111111|1234567|123123|Qwerty123|1q2w3e|1234567890|DEFAULT|0|Abc123|654321|123321|Qwertyuiop|Iloveyou|666666)$/';

if (preg_match(BAD_PASSWORD_PATTERN, $password)) {
	// パスワードとしてふさわしくない場合
}
```

チェックしたい項目が膨大な場合はin_arrayやarray_key_existsで書くこともあります。
PCREでは正規表現の長さに制限があるので、正規表現が長すぎると実行時例外になることがあります。

```php
const BAD_PASSWORDS = [
	'123456',
	'123456789',
	'Qwerty',
	'Password',
	'12345',
	'12345678',
	'111111',
	'1234567',
	'123123',
	'Qwerty123',
	'1q2w3e',
	'1234567890',
	'DEFAULT',
	'0',
	'Abc123',
	'654321',
	'123321',
	'Qwertyuiop',
	'Iloveyou',
	'666666'
];
	
if (in_array($password, BAD_PASSWORDS)) {
	// パスワードとしてふさわしくない場合
}
```

### 文字列をコードポイント毎に分割する

文字列をUnicodeのコードポイント毎に分割します。

```php
$splitted = preg_split('//u', $text, -1, PREG_SPLIT_NO_EMPTY);
```

`'あいうえお'` → `['あ', 'い', 'う', 'え', 'お']`
`'🇯🇵'` → `['🇯', '🇵']`

コードポイントが何なのかについては　[MDN](https://developer.mozilla.org/ja/docs/Glossary/Code_point) などを見てください。
Docker で入れた Stable Diffusion WebUI (AUTOMATIC1111)をバージョンアップする (from 1.3 to 1.5)

:::note warn
2024年6月現在、筆者は以下のエラーによりStableDiffusion WebUI Docker は起動ができなくなり、[Docker版ではないWebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui)を利用しています。

``No device found``
または
``Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 500: named symbol not found: str``
:::

# 前提
以前以下のサイトをもとに Stable Diffusion WebUI を Docker でローカル環境に導入していた。WebUI(AUTOMATIC1111)のバージョンは1.3だった。導入時に参考にしたのは以下のサイト。
https://zenn.dev/isi00141/articles/2fc745b11e8796

Stable Diffusion の新しいモデルSDXLを使ってみたい。Stable Diffusion WebUI でも使えるが、バージョン1.5に上げる必要があるとのこと。そこで、バージョンアップすることにした。
Stable Diffusion WebUI Docker のバージョンでいうと、5.0.3 -> 8.1.0 へのバージョンアップとなる。

今から新規にインストールすると最新版になるはずなので、以下の記事は不要です。

環境
・Windows11Pro
・GPU NVIDIA GeForce RTX 3060 12G
・CPU Intel(R)Core(TM) i7-13700 2.10GHz
・RAM 32GB

# HowTo
WebUIが起動中であれば、終了させておく。
### インストール済みの設定ファイル等を変更していない場合
stable-diffusion-webui-docker をgit pull で最新化し、dockerを再度読み込み
```
\stable-diffusion-webui-docker>git pull
\stable-diffusion-webui-docker>docker compose --profile auto up --build
```
これでOKらしい
### インストール済みの設定ファイル等を変更している場合
git pull で上書きできないので、ブランチに変更を逃がして後でマージするには例えば次のようにする。
（docker-compose.ymlを変更していて、myconfigブランチを作る例）
```
\stable-diffusion-webui-docker>git branch myconfig
\stable-diffusion-webui-docker>git checkout myconfig
\stable-diffusion-webui-docker>git add docker-compose.yml
\stable-diffusion-webui-docker>git commit -m"起動設定変更:ほかの端末から接続できるようにする"
\stable-diffusion-webui-docker>git checkout master
\stable-diffusion-webui-docker>git pull
\stable-diffusion-webui-docker>git merge myconfig
\stable-diffusion-webui-docker>docker compose --profile auto up --build
```
これでWeb UI に反映した。

# フォルダの配置
WebUI Docker はAUTOMATIC111だけではなく、ComfyUIやInvokeAIもパッケージに含んでいて、モデルを共有しているため、それぞれのUIの説明とはフォルダ構成が異なっている。以下にメモしておく。今回のバージョンアップでフォルダ構成が変更となっている。

* stable-diffusion-webui-docker インストールフォルダ以下の配置フォルダ

| 項目 | 1.3 | 1.5 |
|:-|:-|:-|
| CheckPoint  | \data\StableDiffusion  | \data\models\Stable-diffusion |
| Lora  |  \data\Lora | \data\models\Lora |
| VAE  | \data\VAE  | \data\models\VAE |
| Model for ControlNet  |  \data\ControlNet\models | \data\models\ControlNet |
Docker で入れた Stable Diffusion WebUI 1.3 にControlNet1.1をインストールする

:::note warn
2024年6月現在、筆者は以下のエラーによりStableDiffusion WebUI Docker は起動ができなくなり、[Docker版ではないWebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui)を利用しています。

``No device found``
または
``Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 500: named symbol not found: str``
:::

# 前提
ControlNet1.1をインストールすることで、Stable Diffusion WebUI に ReferenceOnly や OpenPose など便利な機能が追加できるらしい。このあたりの情報は別のサイトに任せるとして、Docker でインストールした WebUI AUTOMATIC1111 に ControlNet を追加できるのかを試してみました。

Stable Diffusion WebUI のDockerでのインストール方法は・・・
https://zenn.dev/isi00141/articles/2fc745b11e8796

環境
・Windows11Pro
・GPU NVIDIA GeForce RTX 3060 12G
・CPU Intel(R)Core(TM) i7-13700 2.10GHz
・RAM 32GB

# HowTo
ControlNet のインストール方法はこちら
https://murasan-net.com/index.php/2023/02/22/controlnet-install/

ReferenceOnlyはこれで使えるようになった。
OpenPoseはモデルを追加するのだが、モデルの追加先は、以下のフォルダ。

Stable Diffusion WebUI 1.3 の場合
\stable-diffusion-webui-docker\data\ControlNet\models\

Stable Diffusion WebUI 1.5 の場合
\stable-diffusion-webui-docker\data\models\ControlNet\

Stable Diffusion WebUI 1.5では多くのフォルダが変更になった模様。Stable Diffusion Web UI Docker は AUTOMATIC1111 だけでなく、InvokeAI、ComfyUI も使えるせいか、フォルダ構成が通常と異なっているので、インストール先に戸惑う。

なお、ControlNetのインストール先フォルダは以下らしい。
\stable-diffusion-webui-docker\data\config\auto\extensions\sd-webui-controlnet
mdformat + mkdocs(Admonitions)で意図した表示にならない現象と解決方法について

# はじめに
本記事は以下ブログ記事の転記です。

https://7rikazhexde-techlog.hatenablog.com/entry/2023/08/13/003330

# 要約

- mkdocs(Admonitions)で作成した内容にmdformatを実行するとインデントがずれる(修正される)
- mdformatのプラグインであるmdformat-admonを使用すれば修正されない
- mdformat-admonはpre-commitによる使用のみ有効

# mkdocs(Admonitions)とは

[admonitions](https://squidfunk.github.io/mkdocs-material/reference/admonitions/#admonitions)とは、文書内にメモ、ヒント、警告などが目立つようなスタイルで表示してくれる機能です。

## infoの例

```bash
!!! info
    - test1
    - test2
```

## 作成されたwebページ表示

![example-mkdocs-admonitions-ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/e4172d3e-6b52-e73b-6740-fdbc983a6a02.png)


# mdformatとは

Markdown用のフォーマッターです。コードはPythonで作成されています。

https://mdformat.readthedocs.io/en/stable/

# 発生した現象

以下の通り、mdformatによる変換で意図した表示にならない現象が発生しました。

## admonitionsに対するmdformatの実行結果

```bash
!!! info
\- test1
\- test2
```

## 作成されたwebページ表示

![example-mkdocs-admonitions-ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/29158b13-67a6-515d-5649-e4f081ae497a.png)

# 解決方法

MkDocsのadmonitionsのためのmdformatプラグインであるmdformat-admonで解決できます。

https://github.com/KyleKing/mdformat-admon

## 注意点

公式ドキュメントの[Contributing](https://mdformat.readthedocs.io/en/stable/contributors/contributing.html#)に記載されていますが、プラグインを使用するためにはpre-commitで実行する必要があります。

mdformat単体では実行できないため注意が必要です。
(もしかするとやり方があるかもしれませんが、未確認です。)

## プラグインの使用方法

pre-commitについては割愛します。詳細は[公式ドキュメント](https://pre-commit.com/)を参照ください。
.pre-commit-config.yamlは以下のように記載します。

```yaml
repos:
  - repo: https://github.com/executablebooks/mdformat
    rev: 0.7.16
    hooks:
      - id: mdformat
        additional_dependencies:
          - mdformat-admon # ここに追加する
```

実際に使用した結果のページは下記の通りです。
問題なく表示ができることを確認できました。

https://7rikazhexde.github.io/dev-insights-tips/




# まとめ
mdformat + mkdocs(Admonitions)で意図した表示にならない現象と解決方法について紹介しました。

mdformatは公式ドキュメントの通り、フォーマットの変更には慎重のようですが、pre-commitによるプラグインが複数存在するため、mkdocsに限らず、目的に応じてプラグインを使用することは有用だと思います。

> Welcome to the mdformat developer docs! We’re excited you’re here and want to contribute. ✨
> 
> Please discuss new features in an issue before submitting a PR to make sure that the feature is wanted and will be merged. Note that mdformat is an opinionated tool that attempts to keep formatting style changing configuration to its minimum. New configuration will only be added for a very good reason and use case.

以上です。
Install Cuda1.5 and Stable diffusion v1.2.1 in Pop!_OS22.04 nvidia

Recently, I used to use Ubuntu 22.04.02 and Cuda 11.7 and Stable diffusion 1.2.1.

One day, I updated all, and I found that Cuda wouldn't start.
The kernel was updated to 6.
At the same time my SSD was broken.
So I bought new one, and start to find more stable GUI.
Pricisely speaking, I asked Bing about that.
Bing told me that Pop!_OS exists.
It's for gaming and NVIDIA preinstalled.
The base is ubuntu.

This should work for stable diffusion.

I installed Pop!_OS.
it goes.

Download Pop!_OS from System76.
https://pop.system76.com/

Burn pop_os_22.04_amd64_nvidia_33.com in DVD. not USB.
At first place, I used my USB to install Pop_os.
But it didn't work. The installer was trying to refer cdrom/casper/filesystem.manifest-remove which did not exist.
And my usb's one Sector crrupted.

Then install pop!_os.
Ordinary way. Please refer System76 instruction site.

Install Cuda.
sudo apt install nvidia_cuda_toolkit

which nvcc
/usr/bun/nvcc

/usr/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Thu_Nov_18_09:45:30_PST_2021
Cuda compilation tools, release 11.5, V11.5.119
Build cuda_11.5.r11.5/compiler.30672275_0

install pip
sudo apt install python3-pip

install python-venv
sudo apt install python3.10-venv

Restart Pop!_OS.

install pytorch
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu115

git clone --depth=1 --branch v1.2.1 https://github.com/AUTOMATIC1111/stable-diffusion-webui

Edit webui-user.sh.

Add
export COMMANDLINE_ARGS="--autolaunch --xformers"

Add
export TORCH_COMMAND="pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu115"

chmod 755 webui-user.sh
bash ./webui-user.sh

execute webui.sh, it will take a few hours when first time.
bash ./webui.sh
TLS1.3

## TLS1.3が結構変わっている。。。

### しっかり勉強しなくては

https://zenn.dev/herumi/articles/tls1_3_crypto#ecdh%E9%8D%B5%E5%85%B1%E6%9C%89

https://pkiwithadcs.com/details_about_tls13/

https://milestone-of-se.nesuke.com/nw-basic/tls/tls-version-1-3/

TLSバージョン確認
chromeの場合

その他ツール
→デベロッパーツール
　→security（consoleやSourcesの横にある）
   → TLSの情報が記載されている。

### AEAD

https://4engineer.net/cipher/aes-gcm/#:~:text=AES%20(Advanced%20Encryption%20Standard)%E3%81%AF,%E3%81%AE%E4%B8%80%E3%81%A4%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82

認証付き暗号AEAD
AEADは暗号化による秘匿性と、データが改竄されていないことを保証する完全性を同時に満たす暗号方式です。
TLSでは主にAES-GCMやChaCha20-Poly1305という方式が広く使われます。
GCMの特徴
暗号化と認証（完全性確認）の両方の機能を同時に持つ
GCMモードの最大の特徴は、暗号化 / 復号の処理と同時に、そのデータが正しい人によって生成され、
改ざんされていないことを認証できることです。

### Client Helloの段階

extension Supported_Groups 
鍵交換方式の候補を複数提示する

### Server Helloの段階
提示された鍵交換方式の中で方式を決定する。

ただし決まらない場合は再度行う
### Hello Retry Request
Rangerの世界: macOSとキーボードで開かれる新しい道（おまけ編）

## はじめに

[前回までの記事（下記ご参照）](#一連の記事)で、Vimライクなキーボード操作がたのしいファイルマネジャー、Rangerについて掘り下げてきました。

- その１：Rangerの魅力的なリソースをウェブからピックアップ
- その２：「終われない問題」への対処法
- その３：標準機能の中から、特に便利な機能の紹介
- その４：カスタマイズして便利な機能の紹介

今回はおまけ編で、iTerm2と`ranger`のカラースキームのご紹介です。

わたしは「気に入った色合いにならないとツールを使いたくない病」なので、新しいツールを使うのに時間がかかってしまいます。`ranger`の場合は、iTerm2と`ranger`、さらにはvimのカラーをあわせる必要があります。

色の好みは人それぞれなので、「オススメ」ともつよく言いにくいのですが……オススメです。

## iTerm

![SS 2023-08-12 23.36.19_mos.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/bf220454-8ad4-34b3-9345-20f2e64479a9.jpeg)

- **Theme**: Dark (High Contrast)
- **Coloro Presets**: [Tomorrow Night](https://iterm2colorschemes.com)
- **Transparency**: 17
- **Blur**: 4
- **Font**: PlemolJP35 HS Regular 17pt

いろいろ試した結果、この設定で落ち着きました。

## ranger

**1ペインビューモード**

![SS 2023-08-13 0.02.14_mos.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/57ba4abc-5fed-d18e-6e35-c93660928bdf.jpeg)

```rc.conf
set colorscheme default_modified
```

マルチペイン用に微調整していますが、ほとんど`default`カラースキームです。

iTerm2で`Tomorrow Night`、rangerで`default`が、いい感じの組み合わせだと思っています。


**マルチペインビューモード**

![SS 2023-08-13 0.00.45_mos.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/380203eb-2201-2c07-eb4c-e85cfb63488d.jpeg)

マルチペインモードにしたとき、アクティブタブと非アクティブタブを間違えやすいので、下記に変更しています。

- アクティブタブの名称の背景を赤色に
- 非アクティブタブのファイル・フォルダ名を黒色に

手順は下記のとおりです。

まず、`~/.config/ranger`ディレクトリに、`colorschemes`フォルダを作成します。つづいて、

```bash
cp /opt/homebrew/Cellar/ranger/1.9.3_2/lib/python3.11/site-packages/ranger/colorschemes/default.py ~/.config/ranger/colorschemes/default_modified.py
```

とします。`default_modified.py`を下記のように変更します。

```~/.config/ranger/colorschemes/default_modified.py
...

if context.inactive_pane:
    # fg = cyan # default
    fg = black # ここの色を変更

...

elif context.tab:
    if context.good:
        # bg = green # default
        bg = red # ここの色を変更
```

`rc.conf`のカラースキームは、上記のファイルを指定します。

```rc.conf
set colorscheme default_modified
```


## Vim in ranger

![SS 2023-08-12 23.53.38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/f11dec44-bf2d-268d-adeb-0c5ec2b6c654.jpeg)


```.vimrc
colorscheme slate
```

iTerm2で`Tomorrow Night`、rangerで`default`、Vimで`slate`がいい感じの組み合わせと思います。

## おわりに

色の好みは人それぞれです。ひとつのオススメとして、iTerm2で`Tomorrow Night`、rangerで`default`、Vimで`slate`の組み合わせを紹介しました。

また、マルチペインモードでの操作ミスを防ぐため、アクティブタブ・非アクティブタブを判別しやすくする設定方法もご紹介しました。

それでは、ハッピー`ranger`ライフを！


## ご参考

### 一連の記事

- その１：Rangerの魅力的なリソースをウェブからピックアップ
- その２：「終われない問題」への対処法
- その３：標準機能の中から、特に便利な機能の紹介
- その4：カスタマイズして便利な機能の紹介
- おまけ：カラースキームのオススメの組み合わせ

https://qiita.com/hann-solo/items/4279eb7211fdba680535

https://qiita.com/hann-solo/items/691cb695be5bba80f6ea

https://qiita.com/hann-solo/items/7bb85d89afadb3b7e940

https://qiita.com/hann-solo/items/aebb2de23bfe33ec2153

https://qiita.com/hann-solo/items/7e0d18ba0a6fd6ed9f61


### 環境

- ranger 1.9.3
- Python 3.11.4
- iTerm Build 3.4.19
- macOS Ventura 13.5
- MacBook Pro (14-inch, 2021)
NLP sentiment analysis library using a pre-trained model - 組み込みAI セルフサービス型デジタル共創体験(DSCE)

# 組み込みAI セルフサービス型デジタル共創体験(DSCE)とは

[組み込みAI セルフサービス型デジタル共創体験](https://qiita.com/trtrbohz/items/356a5a4b66624b2c94a2)に記載しておりますが、現在STT(speech-to-text)、TTS(test-to-speech)、NLU(natural-language-understanding)等のAIがサーバーに接続しなくても組み込んで利用することが可能となりました。

その情報がこちらの[サイト](https://dsce.ibm.com/)、DSCE([Digital Self-Serve Co-Create Experience](https://dsce.ibm.com/);"組み込みAI セルフサービス型デジタル共創体験"？)にて紹介されております。

今回はそのDSCEの中から、「NLP sentiment analysis library using a pre-trained model」 の実施方法を説明します。
※個人的な利用は無償ですが、商用利用は有償となります。

# 今回は 「NLP sentiment analysis library using a pre-trained model」 
Plotly社製のOSSウェブフレームワークDashを使いNLP( Natural Language Processing (自然言語処理)) を利用したウェブアプリを構築します。

# 1. 前提
* ターミナル環境
mac : ターミナルを使います。[ココ](https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac) を見てターミナルを起動できるようにしてください。
windows : powershellを使います。[ココ](https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows?view=powershell-7.3) を見てpowershellを起動できるようにしてください。
* リソース取得
下のURLにアクセスしリソースを取得します。
https://github.com/IBM/dsce-sample-apps/tree/main
※コード改変＆プルリクをするのであれば「git clone」コマンドを使うのですが、今回はソースコードの入手が目的ですので以下の様に Zip 形式でリソースを入手します。
![スクリーンショット 2023-08-12 22.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/e97bd8bc-0767-b52e-9914-d11c0af69259.png)
リソース取得後、zipファイルを展開すると以下のようなフォルダ構成になっていると思います。今回はその中の[sentimet-analysis]配下にあるリソースを使用します。

# 2. 手順
# 2.1. [sentiment-analysis]フォルダに移動
* zipファイルを解凍した場所を起点として[sentiment-analysis]フォルダに以下のようにして移動します。

      cd dsce-sample-apps-main/sentimet-analysis

# 2.2. 必須ライブラリのインストール

      pip3 install -r requirements.txt

# 2.4. アプリ実行

     python3 sentiment_analysis_demo.py

# 2.5. Access the local application
ブラウザを開き、[localhost:8050](localhost:8050) にアクセス
以下の様な画面が表示されます。

1. [Build Text]欄に文章を入力
    起動時にはデフォルト文章が記載されていますが、この欄にご自身で文章を入力することも可能です。
2. [Get Sentiment]ボタンをクリック
3. 文章が解析され、一文ごとに感情分析結果が表示されます。分析結果はヒストグラムに「Positive」「Negative」「Neutral」と表示され、その下にラベルとスコアが詳細として表示されます。

![スクリーンショット 2023-08-12 18.11.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/37e153ff-07b1-7ebd-e852-181fd6d4d4f0.png)


参照：[NLP sentiment analysis library using a pre-trained model](https://github.com/IBM/dsce-sample-apps/tree/main/sentiment-analysis)
【Mac】Bundle Identifierを取得する方法


## `Bundle Identifier`の取得方法

次のコマンドを実行することでアプリの`Bundle Identifier`を取得できます。

```terminal
lsappinfo info -only bundleid "アプリ名"
```

```terminal
$ lsappinfo info -only bundleid "Google Chrome"
"CFBundleIdentifier"="com.google.Chrome"
```

また次のコマンドでも取得できます。

```terminal
osascript -e 'id of app "アプリ名"'
```

```terminal
$ osascript -e 'id of app "Safari"'
com.apple.Safari
```
Half-duplexを試す w/ Nucleo F303K8 STM32CubeIDE

# 基本設定

PA9をUSART1に，PA2をUSART2に設定します。
PA9とPA2をジャンパー線で接続しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/7a823e4d-b27f-9b79-6535-f7d919cf628a.png)

UART1/2 を Half-Dulex にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/753de3ab-9bdb-70e1-1a9e-3f7bd18c9525.png)

Pin設定が Open Drain の Pull-Up であることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/be0f39d8-8f95-a6f0-9ec4-638e4aa6ea24.png)

上の画像にもありますが，Half-Duplex にすると RX ピンの設定は不要になりました。

一文字 UART1 と UART2 の両方から送ってみます。

```main.c
  char msg[]="1";
  HAL_UART_Transmit(&huart1, (uint8_t *)msg, sizeof(msg), 1000);

  uint8_t r1 = USART1->RDR; // maybe "1"
  uint8_t r2 = USART2->RDR; // maybe "1"

  HAL_Delay(1000); // break here

  msg[0]='2';
  HAL_UART_Transmit(&huart2, (uint8_t *)msg, sizeof(msg), 1000);

  HAL_Delay(1000); // break here

  r1 = USART1->RDR; // maybe "2"
  r2 = USART2->RDR; // maybe "2"

  HAL_Delay(1000); // break here
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/40d16a4b-32da-995e-0990-2164950257ab.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/d2df19c4-4369-be0c-76e6-406f512bfa12.png)

# 複数バイト受け取る

定義部分

```main.c
/* USER CODE BEGIN 0 */

#define BUFFER_SIZE 32 // must be 2^n
uint8_t UART1_RX_Buffer[BUFFER_SIZE];
uint8_t UART1_RX_Count=0;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->Instance == USART1) {
    	UART1_RX_Count = (UART1_RX_Count + 1 ) & (BUFFER_SIZE - 1);
        HAL_UART_Receive_IT(&huart1, UART1_RX_Buffer+UART1_RX_Count, 1);
    }
}

/* USER CODE END 0 */
```

main関数にて

```main.c
  /* USER CODE BEGIN 2 */

  HAL_UART_Receive_IT(&huart1, UART1_RX_Buffer+UART1_RX_Count, 1);

  char msg1[]="1a";
  HAL_UART_Transmit(&huart1, (uint8_t *)msg1, 2, 1000);
  HAL_Delay(10);
  char msg2[]="2b";
  HAL_UART_Transmit(&huart2, (uint8_t *)msg2, 2, 1000);
  HAL_Delay(10);
  char msg3[]="3c";
  HAL_UART_Transmit(&huart1, (uint8_t *)msg3, 2, 1000);
  HAL_Delay(10);
  char msg4[]="4d";
  HAL_UART_Transmit(&huart2, (uint8_t *)msg4, 2, 1000);
  HAL_Delay(10);

  /* USER CODE END 2 */
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/c8daa29f-95c1-6508-e716-43ae480b7c56.png)

Half-Duplex では TX と RX が接続されているため，複数バイト送ったらその分も自分自身で受信処理しないとそのあとの受信ができなくなってしまいます。バッファを用意して，割り込みで直ちに受信するように仕掛けました。

送信が続くと受信に失敗するようで，上記では `HAL_Delay(10);` を入れています。8MHzで動作させていることも影響していると思われます。

いろいろ試してわかったのですが，とにかく受信割り込みで1データずつきちんと受信処理をするのがいいようです。

参考 感謝！
- https://ichitaswitch.com/stm32-uart/

DMAですと，用意したバッファが全部いっぱいになった時点で割り込みが発生します。

受信数は愚直に数えるようにしてみましたが，以下の方法を使えばレジスタから知ることができるようです。こちらも感謝です。
- https://qiita.com/toshidln/items/225b53c4052d8ad20257

# おしまい

Harf-Duplex は勤務先の製品内で使われていて，STM32だとどのようにうごくのか調べてみました。STM32では設定するだけで本当にピン1つだけで実現できるのがいいですね。

久しぶりに使いましたが，Nucleo と STM32CubeIDE であればデバッガで動きがよくわかって助かります。
せんせー、バイオディーゼル生産ってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、バイオディーゼル生産ってなに？

# バイオディーゼル生産とは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

バイオディーゼルとは、植物や動物の油を使って作るエネルギーのことです。
普通の車のガソリンやディーゼル燃料とは違って、自然にあるものから作れるから、地球にやさしいです。

例えば、食べ物を作るときに使う油や、古くなった油を集めて、特別な工程を経てバイオディーゼルを作ることができます。それを車に入れて使うと、環境を守ることができるんです。

簡単に言うと、植物や動物の油を特別な方法で変えて、
車が走るためのエネルギーにするのが「バイオディーゼル生産」なんです。

# まとめ

バイオディーゼルとは、植物や動物の油を使って作るエネルギーのこと
自分のエンジニアとしての長所を考えてみるものの



- 前に風邪でダウンしたのを機にしばらくはまっていた趣味をやめてしまった。こうなると時間が余ってしまって仕方がない。気がつくと家に帰ってからも開発をしている。眠れない夜に少しPCを開いて心を休めたりしている。退屈は罪だ。
- 休日に趣味でプログラミングしているとどうにも不健全さを感じる。いちばん退屈を埋めるのに良いのがプログラミングなわけだけれども。電気代やカフェ代以外にほとんどお金もかからないし。だが休日ぐらいプログラミングを忘れて思い切り羽根を伸ばしたらどうなんだろうか。以前の反省を活かして休日にもズブズブと仕事の続きをすることだけは控えるようにしたが。
- プログラマとして経験を積んでもまるで自分が賢くなっていないような気持ちになることもたまにはある。慣れないライブラリに立ち向かう時やそもそも調べても試しても分かりづらい問題に行き当たった時だ。人間はそもそも根本的に賢くなるということは出来ないのかもしれない。全ては単に適応の結果に過ぎない。知恵の汎用性の違いに広い狭いがあるだけだ。
- 社内に社内向けのチャットがある。僕にとっては社内向けのチャットもSNSのように感じる。Twitterなどと同じ感覚だ。言ってみたらプロジェクトで使っているチャットやタスク管理ツールからも同じ感覚を受ける。なんというか赤丸の通知を探してしまう。仕事のやりとりをしているだけで何となくSNSで慌ただしくコミュニケーションしているような。だから新しく対応すべき通知の赤丸がないと退屈する。
- 書籍から学ぶことの少なさよ。自分は完全に手を動かして実務で物事を覚えるボトムアップ型のようだ。だが個々人に最適な学習スタイルにボトムアップ型とトップダウン型の違いなんて本当にあるんだろうか。個人によってどちらが合っているかという違いなど。実務で学習するにせよプログラミングあれば手を動かす・ネットで調べる・手を動かすの交互の連続になる。ほとんどの場合は。
- 自分はどこが長所のエンジニアかと考えてみる。いくつか候補を浮かべてみる。だがどれもこれも環境が変われば長所でも何でもなくなる可能性もあると思うと固定の長所なんかまるでないような気がしてくる。自分がどんな人間かという属性は幻に近い。時と場所が違えばまったく違う働きをする。それが人間というものではないだろうか。
- 自分の長所というものは自分で考えるよりも人から言われたことのある言葉を思い出した方が良いかもしれない。僕の場合は「Pull RequestのDescriptionの書き方に感動した」「Slackに進捗状態や考えていることを書き記していく仕事のスタイルに感銘を受けた」と言われたことがある。素直に嬉しかった。そう考えるとやはり文章というものは自分の武器になっているのかもしれない。少なくとも人から見た時のちょっとした特徴ぐらいには。



# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
【Stable Diffusion WebUI】遭遇したRuntimeErrorの解決方法(Mac M1)

# 概要
Stable Diffusion WebUIをMac(M1チップ)にインストールしました。
実行にあたって遭遇したエラーの解決方法を記載します。

## 前提(Mac環境)
- 機種ID：MacBookPro18,3
- macOS：Monterey
- チップ：Apple M1 Pro
- メモリ：16GB

### ①RuntimeError: "upsample_nearest2d_channels_last" not implemented for 'Half'

まずは以下のエラーに遭遇しました。

```
    RuntimeError: "upsample_nearest2d_channels_last" not implemented for 'Half'
```

解決方法は、`webui-macos-env.sh`の`COMMANDLINE_ARGS`に`--no-half`を追加すると解決しました。

```
export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --no-half --use-cpu interrogate"
```

特定のプログラムまたはライブラリ（おそらくPyTorchや関連するライブラリ）で`Half`（16ビット浮動小数点数）データ型に対して`Nearest Neighbor`アップサンプリング操作を実行しようとした場合に発生しているらしい。

以下のissuecomment通りにしたら解決しました。
[[Bug]: Remove of --no-half cause errors under MacOS with any Torch version, but almost all samplers produce only noise with it and latest nightly builds](https://github.com/AUTOMATIC1111/stable-diffusion-webui/issues/8555#issuecomment-1537272479)



### ②RuntimeError: MPS backend out of memory
modelによっては実行後に以下のエラーになりました。

```
RuntimeError: MPS backend out of memory (MPS allocated: 17.21 GB, other allocations: 290.12 MB, max allowed: 18.13 GB). Tried to allocate 720.00 MB on private pool. Use PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 to disable upper limit for memory allocations (may cause system failure).
```

`--medvram`オプションを追加すると改善される場合があるとのことで、追加。
上述のものも含めて`COMMANDLINE_ARGS`は以下になりました。

```
export COMMANDLINE_ARGS="--skip-torch-cuda-test --upcast-sampling --no-half-vae --no-half --use-cpu interrogate --medvram"
```

これで実行中に上記エラーが出ることは無くなりました。
まだエラーがでている場合は、一度バッチを閉じてから、再度開くと直ることもあります。
(自分の場合はサイズを一定以上大きくしすぎるとこのエラーになったりしました)