OmniAICreator/Qiita-1.07M huggingface dataset:
【論文紹介】Survey of State-of-the-Art Mixed Data Clustering Algorithms

# はじめに
- 質量混在データ（ラベルと数値の混在するテーブルデータなど）のクラスタリング方法
についてのサーベイ論文を紹介します
- データの分類アプローチ毎に進捗状況及び課題が整理された論文となります
- この記事では論文全体の俯瞰的な紹介のみを行っています
- 詳細な内容については、以下もご参照願います
　https://elsur.jpn.org/mt/2019/12/002807.html
- 本記事に各アプローチの概要および個別課題を加筆修正し、近日中にアップデート予定です

# 論文の課題意識
混合データは数値変数とカテゴリカル変数（＝ラベリング名）の両方で構成され、
混合データセットは保険、金融、マーケティングなどの多くの分野で頻繁に発生します。
クラスタリングは、多くの場合、混合データセットに適用されます。
（データ分析者は）クラスタリングを用いてデータセットに潜在する構造を見つけ、
類似する構造同士をグループ化してさらに分析します。

ただし、混合データセットの特徴値に合計や平均などの数学的演算を
直接適用する事が難しい（※）ため、混合データのクラスタリングは困難となります。
※注釈：　データ内変数の種別ごとに統計的性質が異なるため、データセットに共通する
数学的演算を用意する事ができないためと思われます。
このため、特にカテゴリカル変数を分類する際にドメイン知識を要するアプローチが多い様です。


# 論文の記載内容
- この論文では、5 つの主要な研究テーマを特定することにより、
混合データをクラスタリングするためのアルゴリズムの分類法を提示します
- 続いて、各研究テーマの研究の現状を紹介しています
- これらの方法の長所と短所を分析し、将来の研究の方向性への指針を示します
- 最後に、この分野における全体的な課題の詳細な分析を提示し、
未解決の研究課題を強調し、この分野で進歩するためのガイドラインについて説明しています。

# 各章の要約
本論文でサーベイされている5つの主要研究テーマは以下からなっています。
- PARTITIONAL CLUSTERING(分割クラスタリング)
- HIERARCHICAL CLUSTERING（階層クラスタリング）
- MODEL-BASED CLUSTERING（モデル・ベースのクラスタリング）
- NEURAL NETWORK-BASED CLUSTERING（ニューラル・ネットワーク・ベースのクラスタリング）
- その他

データセットへのラベリング分類の基準が複数あり、階層化の難しい状況で使いやすいのは
3番目のモデルベースのクラスタリングとなるのでしょうか。
1番目、2番目、4番目の方法はドメイン知識に基づく分類基準も併用する必要があり、
運用に工夫が必要そうです。
3番目の研究テーマ（＝分類アプローチ）は比較的素直なアプローチと理解しました。

論文に書かれている研究テーマ毎の特徴と（私にとっての）今後の調査課題は以下となります。
- PARTITIONAL CLUSTERING(分割クラスタリング)
　特徴：　数値変数とカテゴリカル変数を共通の距離空間上に反映して距離計算を行い、
　　得られた結果を用いてクラスタリングを行うアプローチをとっている。
　　数値変数とカテゴリカル変数の確率分布を区別せず力技でデータ分類を行っている。
　課題：　K-meansベースのやり方となるので、変数毎の確率分布が異なる場合の対処を確認したい。

- HIERARCHICAL CLUSTERING（階層クラスタリング）
　特徴：　データ構造に階層がある（＝データを漏れ重なりなく分類するための基準が存在する）
　　事を仮定した上で、トップダウン的にクラスタリングを行うアプローチをとっている。
　課題：　データ分析者がドメイン知識を持っていないと、
　　　『データ階層構造の有無の判断』や、
　　　『階層構造の上位でカテゴリカル変数を分類するための分類基準』
　　を見分ける事ができず、本アプローチで分類する事ができない。
　　必要なドメイン知識の種類を確認したい。
- MODEL-BASED CLUSTERING（モデル・ベースのクラスタリング）
　特徴：　カテゴリカル変数や数値変数が何らかの確率（統計）モデルに一致する事を仮定し、
　　EM-algoritmベースの分類アプローチで質量混在データの分類を行うアプローチ
　　となる。
　課題：　データ分析者がある程度統計モデルへの知見を持つことが前提となる。

- NEURAL NETWORK-BASED CLUSTERING（ニューラル・ネットワーク・ベースのクラスタリング）
　特徴：　数値データの分類手法であるself organizing maps (SOM)や
　　adaptive resonance theory (ART)を拡張し、質量混在データの分類を行うアプローチ
　　となる。
　課題：　階層クラスタリングと同様、カテゴリカル変数の分類基準を仮説ベースで用意する
　　必要があり、データに対するドメイン知識が必要となりそうである。

- その他
　特徴：　距離空間を複数仮定して、空間間で射影を行い分類を行っている。
　　時系列情報のクラスタリング方法なども取り上げられている。
　課題：　（私が）詳細を理解できていないため、追加調査を行う予定である。


# 今後の予定
- 質量混在データ分類についての最新論文も取り上げていく予定です
https://hal.archives-ouvertes.fr/hal-01253393/file/slides.pdf

# 最後に
弊社では、自動車・機械産業のお客様に向けたソリューション開発エンジニアを絶賛採用中（2022/12時点）です :muscle: :muscle:
https://www.wantedly.com/projects/1181162


# 参照情報
- [Ahmad, A., Khan, S. (2019) Survey of state-of-the-art mixed data clustering algorithms. IEEE Access, 7.](https://ieeexplore.ieee.org/document/8662561)
- 読書日記（個人ブログ、小野 滋）
https://elsur.jpn.org/mt/2019/12/002807.html
【Ruby】initializeメソッドとattr_accessorメソッド

# initializeメソッドとは

classがnewメソッドによりインスタンスを作ったときに、インスタンス変数の情報を持たせることができます。特に、classを使用して違う値のインスタンス変数を設定するために、値を初期化したい場合にinitializeメソッドが必要となります。

```ruby
class Car
    def initialize(name)
        @name = name
    end
end

my_car1 = Car.new("jeep") # => <Car:0x00005630c9be96a0 @name="jeep">
my_car2 = Car.new("benz") # => <Car:0x00005630c9be93d0 @name="benz">
```

# ゲッターメソッドとは
`my_car1`には`jeep`というインスタンス変数が定義されています。これを取り出してみたいと思います。

```ruby

class Car
    def initialize(name)
        @name = name
    end
end

my_car1 = Car.new("jeep")

p my_car1.name => NoMethodError
```
errorが発生します。
インスタンス変数は外部には取り出せません。これはインスタンス変数がClass定義の外では使えないためです。

そこで、インスタンス変数をclass定義より外で使えるように、専用のメソッドを定義します。

```ruby
class Car
    def initialize(name)
        @name = name
    end
    
    def name
        @name # =>jeepを外で使えるメソッドように定義する。
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name　# => "jeep"
```
nameメソッドに@nameを定義することで、インスタンス変数を保持できるようになります。
このメソッドをゲッターメソッドと呼びます。

#　セッターメソッド
次に、`my_car1`の持っているインスタンス変数の情報を書き換えたいとします。
このメソッドをセッターメソッドと呼びます。
方法としては、インスタンス変数の名前に@を外した状態で`=`をつけてメソッドを定義します。

```ruby
class Car
    def initialize(name)
        @name = name
    end
    
    def name
        @name
    end
    
    def name=(name)
        @name
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name ="benz"
# => my_car1.name=("benz")　これでも動く

```
パッと見ると分かりにくいですが、`name=`メソッドを定義していることがまず分かります。
また、引数に`name`があることから、`name=`というメソッドを定義して引数に新しいインスタンス変数を入れたいことがわかります。
ですので、新しい引数の情報を持たせる方法として`()`をつけても通常のように動きます。
`=`を使うことで代入している形になるので分かりにくいですが、読み解いていくと理解できると思います。


# attr_accesorメソッド

セッターメソッドとゲッターメソッドは、コードを書いていく中で使用されることが多いメソッドです。
これをいちいち書くのは面倒ですので、attr_accesorメソッドというものが用意されています。

```ruby
class Car
    attr_accessor :name
    def initialize(name)
        @name = name
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name=("benz")
```

これでセッターメソッドとゲッターメソッドをそれぞれ定義しなくても使用することができます。
また、セッターメソッドとゲッターメソッドは`attr_writer`と`attr_reader`にそれぞれ分けて使用することもできます。

```ruby
class Car
    attr_writer :name   #=> セッターメソッドの定義
    attr_reader :name   #=>　ゲッターメソッドの定義
    def initialize(name)
        @name = name
    end
    
end

my_car1 = Car.new("jeep")

my_car1.name=("benz")

```

これは使用用途に合わせて使う場合がありますので覚えておきましょう！
【失敗例】MRTKの音声認識はOculusで動作するのか

MRTKの音声認識は、Oculusu（Andoroid）では動かない
と記載がされているように思われます。

HoloLens2で実装が可能なのは、OSがWindowsライクだからかなと
思っているところではありますが
じゃあ、実際に動かないところを見たのか？と問われると
見たことがないことに気が付きました。

そこで、今回は以下の記事を参考にしながら
「動かないのかどうか」の実験をしていきたいと思います。

https://bluebirdofoz.hatenablog.com/entry/2022/06/21/225944

https://bluebirdofoz.hatenablog.com/entry/2022/06/27/225052

※環境構築については割愛します

## 動作チェックのための設定
まずは不具合回避のため、ボタンの音声認識を解除します。

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/0a77ae17-62a8-38de-87bb-7c1250004bdd.png)

~~次に、ボタンで音声認識をONにする設定をいれようとしたところ~~
~~「Test」と書かれたcsファイルを発見しました。~~

![bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/53126b2f-c801-79f3-e68a-b8a823fd540c.png)

~~Test....ここらへんを触ってみたら動くかもしれません。~~
~~ということで、まずはcsファイルの情報があるかを調べてみます。~~

→別のテストで入れていたcsファイルを見つけてしまったようです・・・

（仕事のため、いったんここまで）

## 頓挫
そのあとの操作はいらないはずなんですが、動作チェックを分かりやすくするため
（おそらく実機のみで動作を確認しないと、わからないと思われるため）
可視化を試します。

![cc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/b33aa9e7-0a42-a15d-9b04-eea3bb43865d.png)

とりあえず、全く情報がないのですが
「Speech Recognizer Controller」を使って、音声認識を試します

## 結果
動きませんでした。
「テスト」「set」ともに動作せず。
やはり、Androidに落とし込むには一つ処理をかます必要がありそうです。

非常に簡易ではありますが、リファにも「Andoroidで動く」という記載がないため
素直に諦めようと思います。
【小ネタ】MRTKでUIを追従させる

既出ですが、意外と使われていない（勿体ない）ので
MRTKのシステムでUIを追従させる方法をご紹介します。

これはMRTK2からある仕様で、MRTK3も継承しています。

#### 実装方法
MRTKを入れたのち、以下の２つのCSファイルを
UI（キャンバス）へ設置するのみです。

Unity標準のCanvasでも、Worldスペースへ切り替えることで
追従してくれるようになります（便利でよく使ってます）

![aa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3009807/e46b29ed-a7a5-bf04-e8a2-088de007c32d.png)

位置だけは、実機で確認しながら動作チェックをしないと
見づらくなってしまうため、注意してください。

以上、小ネタすぎて記事にしていいか判らないくらいの小ネタでした。
MIGUN LIFEのパーソナルヘルスケアの新製品を発表、CES 2023の盛大な初披露を予告

![합성 이미지_대지 1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/4cd9359e-9fd3-5625-e70d-0e6e654452c1.jpeg)

家庭用医療機器の創始者であるMIGUN LIFE（CEO：ジェイコブ・フン・チョル・チャン氏）は、1月に米国ラスベガスコンベンションセンターで開催される世界最大の家電展示会CES 2023に参加し、2023年の新製品を発表します。

ベネチアンエキスポホールにのコンベンションセンターに展示ブースを設け、世界中のバイヤーにMIGUN LIFEの製品とブランドを紹介します。今回発表する2023年新製品は、Re:ach RH01とRe:ach RH02です。
## 製品情報

Re:ach RH01は、リラクゼーションと背骨のトリートメントを楽しむことができるマット状の製品です。Re:ach RH02は、通常のベッドのように睡眠と脊椎治療の両方を楽しむことができるマットレス状の製品です。これらの製品の主な特徴は、隠れたヒスイマッサージャーが出てきて、首から腰にかけて脊椎マッサージを始めることです。10本以上のツボ押し棒が背骨のすぐそばの血流を刺激します。動作が停止すると、ヒスイとツボ押し棒はマットレスの中に戻り、快適なリラックスと睡眠を得ることができます。各製品には下半身専用のレッグカフがあり、足のマッサージと足裏のツボ押しの機能を備えています。また、温熱機能、ボディスキャン機能、体型に合わせたマッサージ機能、強弱マッサージ機能、リラクゼーション音楽など、マッサージやリラクゼーションに必要な便利な機能をまんべんなく搭載しています。

また、ミグンライフの独自技術でバージョンアップしたパーソナル温熱治療器Re:borne、パーソナル超音波刺激装置Re:vive、高周波足裏刺激装置DAY:RE、この3製品も展示します。

## 展示ブース

ブース内は、ゆったりとしたスペースに製品を配置し、来場者が快適に製品を体験できるよう配慮するとともに、商談のためのレセプションスペースを別途用意しました。また、MIGUNの高い技術力を示す主要部品であるサーモジェード5個入り2セット（サーモジェード10個）を展示し、MIGUN LIFEを体感し理解していただくことに重点を置いています。サーモジェイド5個入り2セット（サーモジェイド10個入り）は、温熱機能を持つ10個の天然翡翠を加工したもので、背骨のラインに沿って移動し、圧迫と温熱を与えるものです。

## 参加目的

MIGUN LIFEは、CES 2023に参加することで達成したい目的があります。まず、2023年以降、世界50カ国、約30年にわたり展開してきたグローバルビジネスを本格的に展開するために、ブランドと製品を世界に広めることです。また、2000年に米国法人を設立して以来、米国全土で売上を伸ばしていくことです。MIGUN LIFEは、米国で500万ドル以上の輸出実績があり、FDA（米国食品医薬品局）の認可取得を進めるとともに、米国カリフォルニア大学アーバイン校で臨床試験も行っています。アメリカの顧客の需要に応えれば、グローバルスタンダードを超えた差別化商品として認知されると説明しています。 

MIGUN LIFEの関係者は、「K-ヘルスケアのオリジナルブランドであるMIGUN LIFEは、2023年の新製品を紹介するためにCES 2023に参加し、韓国市場のみならず世界市場でもM IGUN LIFEの活躍に関心を持ってもらう」と述べました。

**ホームページ：https://migunlife.co.kr**
**お問い合わせ：+82-2-6951-2886 / Sales Rep: Andrew Yoon (migunlife_gsales@migunlife.co.kr)**

![migunlife_ces2023_newproducts.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784576/79612d7c-7b91-9426-733b-97cff1e50188.jpeg)
DynamoDB テーブルに保存されている項目にLambda 関数で、アクセスしたい時

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/5cde6041-14ee-708d-00d9-ea2b22ea82f5.png)

___
__DynamoDB テーブルに保存されている項目にアクセスするLambda 関数を作成したい時に、使う項目を確認してみた。__
___

AWSのサービスからAWSの別のサービスを利用する時にする事の基本は、

IAM ポリシーを作成し、IAM ロールにアタッチする。事だと、改めて、基本的な事を確認した。

DynamoDB テーブルへのアクセスを許可する IAM ポリシーを作成し、
このポリシーを Lambda 関数の IAM ロールにアタッチする。

AWSのブログが、わかりやすかったので、ご紹介致します。

IAM ポリシーとロールを使用してアクセスを制御することで、認証情報をコードに埋め込む必要がなく、Lambda 関数がアクセスできるサービスを厳密に制御できます。このポリシーには、Lambda 関数が Amazon CloudWatch ログ にログファイルを書き込むことを許可するアクセス許可も含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/bc19ff70-a844-f844-0322-786617128f2a.png)

https://aws.amazon.com/jp/blogs/security/how-to-create-an-aws-iam-policy-to-grant-aws-lambda-access-to-an-amazon-dynamodb-table/

■気づき■
因みに、DynamoDB ストリーム を使用すると、Lambda 関数をトリガーして、DynamoDB テーブルを継続的に、更新する事が出来る。

☞仕組みとしては、Lambda 関数のイベントソースマッピングを設定する
https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html
PBI DesktopとPBI Serviceでの日時の取扱いの違いと対応方法

# 1. 課題：PBI DesktopとPBI Serviceでの日時の取扱いの違い
PBIレポートに更新日時を表示したいことはよくあります。
PowerQury M言語のDateTime.LocalNow()で日時を取得して表示することができます。
しかし、DateTime.LocalNow()ではtime zoneに依存してしまうため、PBI DesktopとPBI Serviceで以下の違いが発生してしまいます。

* PBI Desktop：ローカルPCのtime zoneに依存して、日時を取得する。
* PBI Service：UTCで日時を取得する。

そのため、ローカルPCのtime zoneがUTCではない場合、PBI Desktopから発行したPBI Serviceでは日時にtime zoneのズレが生じてしまう。

**PBI Desktopで表示したDateTime.LocalNow()**
ローカルPCのtime zone(JST)で表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081347/9dbfb074-52d3-e893-600c-a0b88fca69fd.png)

**PBI Serviceで表示したDateTime.LocalNow()**
UTCで表示される。JSTとは9.00h差異が出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3081347/a3064ecc-61db-fd2a-c16d-0847bb12aa65.png)

# 2. 対応方法①：PBI Desktop・ServiceともにUTC+9.00hでJSTを導出する
『DateTime.LocalNow()』ではなく、『DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)』で日時を取得します。
UTCで日時を取得後に9.00hの差分を補正しています。

:::note warn
タイムゾーン型の項目を使えばうまくいくが、datetime型の項目に変換してしまうと、「4.注意点」の問題が発生するので注意！
:::

# 3. 対応方法②：日付を文字列型に変換する
『DateTime.LocalNow()』もしくは『DateTimeZone.SwitchZone(DateTimeZone.UtcNow(),9)』など、日時を取得した後に型をテキスト型に変換します。
これにより、テキストで保持されるため、PBI DesktopとServiceでのtime zoneの影響を排除できます。

# 4. 注意点：datetime型に変換するとPBI ServiceはUTCになる
項目の型をdatetime型にした場合、PBI DesktopではローカルPCのtime zoneに自動変換され、PBI ServiceではUTCに自動変換されてしまうため、結局、PBI DesktopとServiceでtime zoneの差異が生じてしまいます。
高性能ドット絵エディタ EDGE2 で遊ぶ



![o_coq162.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/68f84a40-78f1-62b2-c393-5b322da0feec.jpeg)


過去ログをみよ

![o_coq163.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/029de2e4-1714-2d97-0271-6be591caa154.jpeg)




目的
Arduino SSD1331用のパターンデータを作る
今日、初めて触ったのでなにもしらん(2022/12/25)
「謎キャラ」カモノハシか、アヒルタイプ


↓クリック↓

https://takabosoft.com/edge2

↑クリック↑


1.ダウンロード
2.展開
3.起動
4.新規作成
5.エディット
6.bmpでセーブ

別の作業が必要です。

1.オンライン変換ソフトで変換
2.プログラムに組み込む

https://qiita.com/caa45040/items/9be0f54507e03ccc8a0f


データ変換

https://javl.github.io/image2cpp/


![o_cop284.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2deae0e2-e47b-a41f-4320-d5f1ea4935d6.jpeg)


![o_cop285.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c920f116-ca6f-e0a9-2900-d5f1a2522111.jpeg)


![o_cop283.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a57d067c-9fbf-f17d-9c0a-ebb1e029d08e.jpeg)




![A_B_C_32x32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0e165129-67f9-6c49-0d7c-4f600cf1e0dd.jpeg)


![f_A_B_C_32x48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/eeb274bf-aecb-3def-11e4-4797d77932ba.jpeg)



![f_A_B_C_32x48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/fab35cd4-066a-4577-f83c-d088fb4e189f.jpeg)

![o_A_Z_24x32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c4fadafd-3cef-c9c6-8434-59d2ffd322e8.jpeg)
右心不全と左心不全の違い

ひょんなことから、**#よう先生の呼吸・循環生理学Qiita**なるものを始めることになりました。しかしながら、成書と同じことをしても仕方がないので、ある程度のベースの知識があることを前提とした記載になりますことをご了承ください。では、始めていきます。

その前に、全体を通して使うシェーマを提示します。ごく簡略化したものです。

![JunkanBaseMojiAri.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/ca4084cd-65f0-b60a-5f5f-a3fb8fe23d9f.png)

# 右心不全と左心不全の違い

そもそも心不全とは、

> 心不全*heart failure*は、 身体が代謝に必要なだけの十分な血液を駆出できない状態、あるいは駆出はできるがそれを行うのに異常に高い充満圧を要する状態、あるいはその両者と定義される。

と`ハーバード大学テキスト`書かれています。めちゃくちゃわかりやすい説明ですね。

まず、右と左を区別することが大事です。

なにより、**フランク・スターリングの法則**の理解が必須です。つまり、**「心筋は弛緩期に伸展していればいるほど強い収縮力を発生する**ということです。病的な状態になると、この収縮力が相対的にせよ絶対的にせよ低下します。

![FrankStarling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/9470d320-822f-9f92-4b25-e6a7c8b0482e.png)
~~グラフがしょぼいのは許してください~~


## 左心不全
収縮不全*systolic dysfunction*は解りやすいんですが拡張不全*diastolic dysfunction*ってわかりにくいですよね。最近は、**EFの低下している心不全**と**EFの保たれている心不全**という分類もありますね。下記に分類を示します。

- EFの低下している心不全
    - 収縮能の低下
    - 後負荷増大
- EFの保たれている心不全
    - 拡張期充満の障害

![SashinFuzen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/0073b2bd-3fbb-28da-721a-53c8dcb9277a.png)
左室拡張末期圧*LVEDP*が上昇し、これが僧帽弁を介して左房圧を上昇させ、肺静脈圧、肺毛細血管静水圧を上昇させ、肺うっ血を呈します。圧の伝搬を矢印で示しています。

## 右心不全

右心不全を来たす疾患はぶっちゃけて言うと(強度の三尖弁逆流と先天性心疾患とかは除いて)、特に現場では**肺(あるいは肺動脈)が悪い状態**がほとんどです。原因となる病態を提示します。ここで着目してほしいのは、**左心不全から波及して右心不全になるのだ**ということです(後述します)。

- 右心不全
    - 心原性
        - **左心不全**
        - 肺動脈弁狭窄症
        - 右室梗塞
    - 肺実質疾患
    - 肺血管疾患
    - 
![UshinFuzen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/8e27a411-981e-a4bf-fac4-7f3225d848d4.png)
右室拡張末期圧*RVEDP*の上昇が、三尖弁を介して右房圧を上昇させ体静脈に伝わって右心不全となります。また、右室からの心拍出量が低下することにより前負荷が低下し、左室からの一回拍出量が低下する病態もあります。

## 左心不全から右心不全に至る場合
実地では左心不全と右心不全の病態の鑑別は困難なケースが多いです。しかし、*区別しようとする目*を持たないといけないと思います。

![RyoshinFuzen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2356942/6d17f7c2-73bb-0fa4-cf2b-deb835917f9d.png)
このイラストを見ると、右心系だけを見ていたら、つまり下大静脈径(あるいは中心静脈圧*CVP*)だけをチェックしていたら、右心不全 OR 左心不全の病態の鑑別がつかないことがわかりますね。また、後日とりあげますが*PEEP*や*1陽圧換気*の影響だけでも下大静脈やCVPは上昇します(三尖弁逆流波形も増えます)。従って下大静脈系だけで循環動態を把握することは出来ないしむしろ病態を見誤る危険があるということです。

## どこで鑑別するか？
当然ですが、駆出率*EF*で区別することはできますし、ここでは詳述しませんが*E/A*など僧帽弁血流波形による拡張能の評価の方法もあります。
ただし大事なのは、**肺動脈楔入圧*PAWP*の上昇の有無**にあります。

ただし、
> 正常な楔入圧であっても、静水圧性肺水腫を除外診断することはできない。

と`ICUブック`に書かれていますので、ごく割り切った議論であることをここでは覚えておいてください。

## まとめ
ごく簡単に**右心不全**と**左心不全**の血行動態を可視化し、まとめてみました。肺水腫とARDSの鑑別、人工呼吸管理、AaDO2などについて議論を進めていく予定です。

なお、前回記事の[よう先生の呼吸・循環生理学Qiita](https://qiita.com/Yoh_Yasushi/items/d4ff8ee87bae4aad7a95)の目次通りに行かない可能性が濃厚ですが、コンテンツとしては提供するつもりです。

## 参考文献
[ハーバード大学テキスト 心臓病の病態生理 第4版](https://amzn.asia/d/4cZijM2)

[ICUブック 第4版](https://amzn.asia/d/e7Xs1fX)

[ビジュアル基本手技 7―カラー写真とシェーマでみえる走査・描出・評価のポイ 必ず撮れる!心エコー](https://amzn.asia/d/fR5U8uR)

 ,etc.
TypeScript: タグ別の自己記事目次 [automated]

# 概要
タグ別での自己記事の目次です。
Power Automate にて定期更新をしています。

# [CSS モジュールのせい（おかげ）で、名前が変わって Style 適用に困ったときは global css で対処した](https://qiita.com/baku2san/items/b9498b4b918dfdbe207f)
投稿日: 2024/3/4 
CSS, 初心者, TypeScript, React, react-split

# [TypeScript 仕事納め](https://qiita.com/baku2san/items/ad1e1c77bbe03a2ced50)
投稿日: 2023/2/1 
初心者, TypeScript

# [AWS: ChatGPT で DynamoDB の UpdateCommand を再学習してみる](https://qiita.com/baku2san/items/1f72db057887abbfd358)
投稿日: 2023/1/31 
AWS, TypeScript, DynamoDB, ChatGPT, UpdateCommand

# [AWS JavaScript SDK v3 で jest を使う。aws-sdk-client-mock(-jest) の利用記録](https://qiita.com/baku2san/items/0d80f80c4d3a8c892df5)
投稿日: 2023/1/29 
TypeScript, Jest, ts-jest, AWS-JavaScript-SDK-v3, aws-sdk-client-mock

# [TypeScript: API-Extractor(tsdoc) で markdown を生成し、それを Word に変換して簡易仕様書へ](https://qiita.com/baku2san/items/dce27138b089acde5888)
投稿日: 2023/1/20 
Markdown, Pandoc, TypeScript, API-Extractor, TSDoc

# [TypeScript: TypeDoc で Class コメントが出てこないと思ったら、無関係な tag を設定していたからだった](https://qiita.com/baku2san/items/f8841922a8bd3fc77dfb)
投稿日: 2023/1/18 
TypeScript, Typedoc

# [DynamoDB: 渡された属性だけを更新する為に、動的に更新式を生成させる](https://qiita.com/baku2san/items/4a472afe8f479279cb1c)
投稿日: 2023/1/12 (更新日: 2023/2/20)
AWS, TypeScript, DynamoDB, AWS-SDK-V3, UpdateCommand

# [TypeScript: オブジェクトから動的に別オブジェクトを生成する](https://qiita.com/baku2san/items/cb9efcd81f64a008c0dd)
投稿日: 2023/1/10 
JavaScript, TypeScript, lodash

# [TypeScript: Date を "YYYY年MM月DD日" にしたい](https://qiita.com/baku2san/items/28da9984ac567ac32653)
投稿日: 2023/1/7 
date, TypeScript, Format

# [TypeScript オブジェクトを結合したいなら、shallow copy か lodash.merge で？](https://qiita.com/baku2san/items/916036cc6ce82055c706)
投稿日: 2022/12/27 
TypeScript, merge, lodash, shallowcopy

# [S3: ListBucket/ListObject(s)/DeleteObjects/PutObject コマンド](https://qiita.com/baku2san/items/c7ebe3edf857365f2f1a)
投稿日: 2022/12/26 (更新日: 2022/12/29)
JavaScript, AWS, S3, TypeScript, AWS-SDK-V3

# [TypeScript 学びの一里塚](https://qiita.com/baku2san/items/9a534d43aab6b5ebc0e3)
投稿日: 2022/12/24 (更新日: 2022/12/27)
JavaScript, TypeScript, VSCode, 新人プログラマ応援, Udemy

# [TypeScript/JavaScript: performance.mark を使うときは初回 mark は捨てる？](https://qiita.com/baku2san/items/3c53190e4d7ac21d8c13)
投稿日: 2022/12/16 
JavaScript, TypeScript, performance, 速度比較

# [TypeScript: 数字を、全角・漢数字の文字列に変換する](https://qiita.com/baku2san/items/5844de1a73a44e0d0b47)
投稿日: 2022/12/15 
JavaScript, TypeScript, number

# [TypeScript(JavaScript) : 日付加減算は set***() で／ゼロ埋めは "2-digit" で](https://qiita.com/baku2san/items/03054210a43a09137ffa)
投稿日: 2022/12/11 (更新日: 2023/1/6)
JavaScript, date, TypeScript

# [DynamoDB で複合キーに # が入ってる場合の読み込み方。TypeScript 経験者には当たり前のお話](https://qiita.com/baku2san/items/e01662975d09aee2243e)
投稿日: 2022/12/8 
AWS, 初心者, TypeScript, DynamoDB, CompositeSortKey

# [SAM init 時の template を調べてたら、AWS Lambda Powertools for TypeScript が見つかった](https://qiita.com/baku2san/items/8ead9bfecef99368b37e)
投稿日: 2022/12/1 
AWS, template, TypeScript, sam

# [Visual Stuido Code: TypeScript のコードをクラス図にしてくれる拡張機能 ](https://qiita.com/baku2san/items/72c3511cd0a0d35b6b9c)
投稿日: 2022/11/7 
TypeScript, uml, VSCode, diagrams
ClojureのerlangバインディングであるClojerlを動かす

# Clojerlとは
ClojerlはClojureのerlangのバインディングです。
https://www.clojerl.org/
Erlangは安全で信頼性の高い、スケーラブルなシステムを構築するの言に適している言語です。そしてClojureと同様にイミュータブルで永続的なデータ構造を提供し、並行処理の機能を持ちます。
一方、Clojureが提供するものはLispそのものです。repl、これはプログラマーに対して魅力的な世界を提供します。そしてErlangと同様にイミュータブルで並行処理の機能を提供します。

# インストール
私の環境はM1 Macですので、brewでerlangを含むelixirをインストールします。

```bash
brew update
brew install elixir
```
でもこれだけでは足りません。ビルドツールであるrebar3が必要です。

```bash
git clone https://github.com/erlang/rebar3.git
cd rebar3/
./bootstrap 
```
同じディレクトリに`rebar3`ができるので、これをパスが通るディレクトリに置きます。
次にclojerlをインストールします。

```bash
git clone https://github.com/jfacorro/clojerl
cd clojerl
make
```

# clojerlの動かし方

動かし方は簡単です。

```clojure
% make repl
===> Verifying dependencies...
===> Analyzing applications...
===> Compiling clojerl
===> Clojerl Compiling clojerl
===> Clojerl Compiling spec_alpha
===> Clojerl Compiling test_check
===> Clojerl Compiling core_specs_alpha
Clojure 0.9.0-2174.5b412b8
```
早速動かしてみる。

```clojure
clje.user=>             (+ 1 1)
2
clje.user=>             (defn add [x y](+ x y))
#'clje.user/add
clje.user=>             (add 1 2)
3
clje.user=> (let [x 3 y 2]
  (println "x = " x ", y = " y)
  (* x y)
  )
x =  3 , y =  2
6
```

```clojure
(let [n 1000000 iter 100
      l (into () (repeat n "a"))
      v (into [] (repeat n "a"))
      ]
  (time (dotimes [_ iter](nth l (dec n) )))
  (time (dotimes [_ iter](nth v (dec n) )))
  )
"Elapsed time: 1680.684589 msecs"
"Elapsed time: 0.120343 msecs"
```

pureなClojureでは。。。
```clojure
(let [n 1000000 iter 100
      l (into () (repeat n "a"))
      v (into [] (repeat n "a"))
      ]
  (time (dotimes [_ iter](nth l (dec n) )))
  (time (dotimes [_ iter](nth v (dec n) )))
  )
"Elapsed time: 351.272542 msecs"
"Elapsed time: 0.128791 msecs"
```
ちょっと遅いかも知れません。

# おわりに
それなりに使えるようですが、まだまだ未実装のものも多いようで今後に期待します。

https://www.clojerl.org/available-features/
UE4, 5 プロジェクトにモジュール開始，終了ファンクションを追加する

# 手順
#### 追加したモジュールには自動的にクラスとメソッドが追加されるが、プロジェクトのプライマリモジュールには追加されないので手動で追加する
### 1. <プロジェクト名>.hに`FDefaultGameModuleImpl`継承クラスを宣言し、`void StartupModule()`と`void ShutdownModule()`をオーバーライドする。
```c++:MyProject.h
#include "CoreMinimal.h"
#include "Modules/ModuleManager.h"

class FMyProjectModule: public FDefaultGameModuleImpl
{
public:
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
};
```
:::note info
#include "Modules/ModuleManager.h"
:::

### 2. <プロジェクト名>.cppに実装し`IMPLEMENT_PRIMARY_GAME_MODULE`の最初の引数を1で作ったクラス名に書き換える。
```c++:MyProject.cpp
#include "MyProject.h"

void MyProject::StartupModule()
{
	UE_LOG(LogTemp, Warning, TEXT("Module Started"));
}

void MyProject::ShutdownModule()
{
	UE_LOG(LogTemp, Warning, TEXT("Module Shutdown"));
}

IMPLEMENT_PRIMARY_GAME_MODULE(FMyProjectModule, MyProject, "MyProject");
```
:::note info
IMPLEMENT_PRIMARY_GAME_MODULE(FMyProjectModule **モジュールクラス名に変更**, MyProject **（変更なし）**, "MyProject"**（変更なし）**)
:::
円弧が気持ちいい

## はじめに
この記事ではクリエイティブコーディングで扱うランダムの面白さについて書きます。[このアドベントカレンダー](https://qiita.com/advent-calendar/2022/random_creative_coding)と紐づいた内容です。

## 対象.01
```javascript:sketch.js
//classの部分のみ

class Particle {
  constructor(cn) {
    this.angle = random(2 * PI);
    this.radius = width;
    this.velocity = random(1, 3);

    this.radiusBorder = random([90, 190, 290]);
    this.isPoint = true;

    this.angleAdd = 0;
    this.angleSpeed = this.velocity / 1000;

    this.weight = random(1, 50);

    if (cn == 0) {
      this.c = color(50, random(100, 255), random(100, 255));
    } else if (cn == 1) {
      this.c = color(random(100, 255), 50, random(100, 255));
    } else {
      this.c = color(random(100, 255), random(100, 255), 50);
    }
  }

  move() {
    this.isPoint = this.radius >= this.radiusBorder;
    if (this.isPoint) {
      this.radius -= this.velocity;
    } else {
      this.angleAdd += this.angleSpeed;
    }
  }

  draw() {
    pg.noFill();
    pg.strokeCap(PROJECT);
    pg.strokeWeight(this.weight);
    pg.stroke(this.c);
    if (this.isPoint) {
      pg.point(
        width / 2 + this.radius * cos(this.angle),
        height / 2 + this.radius * sin(this.angle)
      );
    } else {
      //引数が半径ではない
      pg.arc(
        width / 2,
        height / 2,
        this.radius * 2,
        this.radius * 2,
        this.angle - this.angleAdd,
        this.angle + this.angleAdd
      );
    }
  }
}
```

#### 実行結果
<img width="500" alt="スクリーンショット 2022-12-24 23.28.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236620/46475b83-6632-7fdb-76c9-07d4ba73c6cb.png">

## 対象.01
```javascript:sketch.js
//関数の部分のみ、関数名をaにしてたのは驚愕

function a(_x, _y, _r, _sc, _bgc) {
  let n = floor(random(3, 10));
  for (let i = 0; i < n; i++) {
    let c = random(100) < 70 ? _sc : _bgc;
    noFill();
    stroke(c);

    strokeWeight(random(_r / 3));
    strokeCap(SQUARE);
    let sa = random(2 * PI);
    let ea = random(2 * PI);
    arc(_x, _y, _r, _r, sa, ea);
  }
}
```

#### 実行結果
<img width="500" alt="スクリーンショット 2022-12-24 23.20.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2236620/db17f3e8-23f2-68a1-17fb-3279d87a3e26.png">

## 円弧がなぜ好きか
なぜか好きです。
なんでかわかんなくてわかんないんです。
でも好きです。

だから、円形に繋がってしまっているものよりも繋がっていないものの方が好きです。

## おわりに
好きっていう感情が論理的に説明の付くものじゃない気がしました。
だからこそ、言語を介さずに好きな作品をパッと見せることで、伝わるものもあるかなとか。
Hyper-VのUbuntu 22.04仮想マシンのキーボード配列をjp106にした

# 環境
Windows10
Hyper-V上で起動しているUbuntu 22.04

# 前提
すでに環境は構築済みで、マシンを作成した直後の話だと仮定します。

# やり方
## ターミナルを開く
どこでもいいので適当にターミナルを開きます。初期状態だとデスクトップ上にアイコンはないと思うので、てきとーに右クリックして`Open in Terminal`を選択すれば開けます。

## `localectl`と打つ
`localectl`と打つと、現在の使用しているキーボード配列が表示されます。日本語で導入された方は一番上が
`System Locale: LANG=ja_JP.UTF-8`
となっていると思います。そのいくつか下に`X11 Layout: us`みたいになってると思うのでこれをjpに直すために
```set-x11-keymap jp```
を入力します。そのあとlocalectlを打てばjpになってると思います。
まだキーボード配列はjpになってないようなのでマシンを再起動すればjpの配列のキーボードになります。

# あとがき
実はこの前にネットで調べていろいろコマンドを試していたのですが一向にjpの配列にならなかったので、自分でどうにかしよう思ってこういう方法になりました。
コマンドを試している間に一回も再起動をしていなかったので、どこかでちゃんと設定できていた可能性が無きにしも非ずです。
再現や検証をちゃんとしていないので間違っているところがあるかもしれません。
アウトプット について知らなかったこと

さて 2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

[アウトプット について思ってたこと - Qiita](https://qiita.com/e99h2121/items/f93aa639902a154ea169) にて書いたように

> 退職してくるとき、社内の Slack に「退職まであと n 日」って 60 日前からがんばって毎日投稿した

ざっくり要約したものがここに置いてあります。

https://e99h2121.github.io/blog-hugo/post/newpost202210010134/

> 10月入社なのだがたまたまこの 10/1, 2 は最初の週末になってしまったので実入社日を控えつつなんとなくポエミーな心境を後日談的に記録しておく

>「60日後に退職する芸人」
>という社内日記を社内Slackの自分のチャンネルで毎日投稿していた 前半はその日その日のほぼ日記のペースで誰々と話したとかこういう話したとか、辞めるのはこういう理由だとか書いてたんだが、営業日外も含めて60日というカウントで始めてしまったため土日祝もわざわざネタを考えて投稿する羽目に笑

>でも苦痛でやっているというよりは意地半分とお楽しみ半分、むしろ20年の思い出があるので話に困ることはないだろうという目論見でやってた

当事者にしかわからないであろう感傷的な部分はどうでもいいので端折ります。笑

> And they sit at the bar and put bread in my jar And say “Man what are you doing here?”

> 酔っ払いに囲まれて、いかばかりかのチップを貰ってピアノ弾いてるビリーの気持ちはどんなもんだったんでしょう？まさに私にとっての会社はこのビリーのピアノのバーでした。

> さて、二度と戻りたくない最悪の職場でした、と書きなぐってSlackを退出してきた　ホントに戻りたくない　くそう本当にありがとう 当然あとのことは知らん笑　この土日はまたチビと過ごしながら思い切り月曜日を楽しみにしようと思うのであります

結果、知らなかったことしかない新天地に踏み出せました。2022 年良い年だったじゃないか。
そしてそれだけじゃあなかったんですね。

https://increments.connpass.com/event/267714/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/ce56ce1a-c129-b8b0-996a-79cec0ac678f.png)

大丈夫なのですかね私

以上、自分のためにアウトプットしていたらいつの間にか Qiita さんの LT しゃべらせてもらえるようになるなんて知らなかった！って話、2023 年につづく、でした。個人ブログのようなことを書いてしまっているがこれで 25 日目、サンタさんに免じてご勘弁いただけたらさいわいです。皆様素敵なクリスマスをお過ごしください :christmas_tree:
【Ruby】Prawn で生成した PDF に旧字体が含まれていると文字化けしてしまう場合の対処法

## 背景

タイトル通り、[Prawn](https://github.com/prawnpdf/prawn) で生成した PDF に旧字体が含まれていると文字化けしてしまう現象が発生。

ex. 「高瀬 真守」という名前のユーザー情報を PDF 出力（※「瀬」は旧字体）

![スクリーンショット 2022-12-25 5.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/9746f1cf-e65b-0d61-9e72-fa5e99eacc6f.png)

ご覧のように上手く出力ができていません...。

## 原因

フォントの設定に問題がありました。

```ruby
class PdfeGenerator < Prawn::Document
  def initialize
    super(page_size: "A4", margin: 20)

    font Rails.root.join("app/assets/fonts/mplus-2p-regular.ttf")
  end
end
```

どうやらこの `mplus-2p-regular.ttf` というフォントが旧字体に対応していない模様。

これを日本語に特化したフォントである [IPA フォント](https://moji.or.jp/ipafont/ipaex00401/) に変更してみたところ、文字化けせずに無事出力されるようになりました。

```diff
- font Rails.root.join("app/assets/fonts/mplus-2p-regular.ttf")
+ font Rails.root.join("app/assets/fonts/ipaexg.ttf")
``` 

![スクリーンショット 2022-12-25 5.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/e04d5c7c-9770-16eb-d05f-a3d601faf042.png)

## まとめ

特に理由もなく適当に設定したフォントのせいで文字化けを起こしてしまっていたという話です。

技術者である以上、何事も良く調べて吟味するのは大事だなと痛感しました。
BootCampのパーティションのサイズを変える

今回はbootcampパーティションの縮小を行った

# 責任負えないです両OSバックアップ取ってから臨むべきです
私は取らないでやってMacOSが死にかけた
普通にやってれば必要になる場面は無いはず


# 使うソフト
## パーティション管理ソフト @ Windows
- 既存のパーティションの分割、結合、移動が可能なら良い
- Windows標準のディスクマネージャだとデフラグしても分割できる容量が異常に小さくてダメだった
- 基本的になんでも良い？
    - おすすめはMiniTool Partition Wizard
        - https://www.partitionwizard.jp/free-partition-manager.html
        - 軽く使った感じこのソフトは優秀な気がする
    - ダメなのはEaseUS
        - これ使うとAPFSの識別子が勝手に書き換えられてMacOSが認識されなくなる
        - 実際やって死にかけた
        - 一応diskpartを使って修復可能だが心臓に悪いのでやめておくべき
            - https://apple.stackexchange.com/questions/360158/lost-my-apfs-partition-after-using-easeus-partition-manager-on-bootcamp
### インストール
- 無料版とプロ試用版みたいなのがある
    - 無料版を選ぶ
    - プロ試用版だと無料版の機能すら使えない
- デフォルトでは一緒にファイル回復ソフトもインストールされる
    - 事ある毎にバックアップ取ろうねってうるさい
    - 勝手にバックで起動しないでほしい
    - インストール時にチェックボックス外すとインストールされない

### このソフトでできること
- パーティションの
    - 分割
    - 並べ替え
    - 結合
    - フォーマット
        - NTFS
        - exFAT

## ディスクユーティリティ @ MacOS
- MacOS標準のディスクユーティリティ

### このソフトでできること
- パーティションの
    - 分割
    - 結合
    - フォーマット
        - APFS
        - exFAT

# 目的別手順
## BootCampを縮小してMacOSに充てる
1. Windowsを起動
1. 念のためデフラグする
    1. エクスプローラ→PC→C:右クリック→プロパティ→最適化みたいなところ→最適化ボタンぽち
1. パーティション管理ソフトでパーティションの移動からBootCampパーティションを分割して未割り当て領域を作成
    1. 前方後方どちら側にも未割り当て領域を作れる
        1. BootCampの直前にMacOSが居るなら(不明、使用済みって出る)前方を空ける
        1. BootCampの直後にMacOSが居るなら(不明、使用済みって出る)後方を空ける
        1. どちらでもなければ何かしらの並び替えが必要
            1. MacOSのパーティションと未割り当て領域を隣り合わせにすることが重要
    1. いずれにせよ再起動を要求される
        1. OptionキーでWindowsに切り替えるのを忘れずに
        1. 黒い画面でWindowsが起動するがそこで下手にキーを押してはいけない
1. 未割り当て領域をexFATでフォーマットする
    1. ぶっちゃけフォーマットはなんでもいい気がする
    1. MacOSで認識できる必要がある
    1. ここでフォーマットしないとMacOS側の作業で表示されなくて困惑する
    1. MacOS、Windowsどちらでも読み書きできて大容量もOKという理由でexFATを選定
1. MacOSを起動してディスクユーティリティを起動
1. 表示>すべてを表示 を念のため選択
1. 適当に選択した状態でパーティションを作成を押す
1. 円グラフでさっきWindowsでフォーマットしたパーティションを選択して-ボタンを押す
    1. ここで隣り合っていないと-ボタンが押せない
1. これで適用すればMacOS側に結合される

## MacOSを縮小してWindowsに充てる(予想)
おおよそさっきの逆で行けるはず
パーティションの大きな移動がない限りWindowsの再起動要求がないと思われるのでその分楽かも
1. MacOS側でBootCampに追加したい容量分のexFatパーティションを作成
1. Windowsのパーティション管理ソフトを用いてC:の隣に移動して結合

## exFATをMacとWindowsのファイル共有用のパーティションとして使う(おまけ)
高速かつ外付けストレージ無しでファイルをやり取りできる
1. どちらのOSでも良いのでexFATでパーティションを切り出す
    1. 私は16GBにしている
1. そのまま使う
    1. Windowsでマウントされない場合はディスクマネージャからドライブ文字を割り当てると良い

# MacOSが起動できなくなったときの画像
https://twitter.com/mcbeeringi/status/1606625573098631169?s=61&t=c1V_dO0ldXrb7HEMugA6gQ

https://twitter.com/mcbeeringi/status/1606633973584887810?s=61&t=c1V_dO0ldXrb7HEMugA6gQ


データが破壊されていなければこれで復旧できるはず


https://apple.stackexchange.com/questions/360158/lost-my-apfs-partition-after-using-easeus-partition-manager-on-bootcamp
[WordPress]サイトネットワークをアップグレードで「cURL error 28: Resolving timed out」が出た場合の対処法

自分用の覚書

# 前置き
すでに存在する長い間アップデートしていない古い環境のWordPressからデータをバックアップして、ローカル環境でPHP、WordPress、テーマ、プラグインを更新して動作確認をしたい

# 環境

ローカル環境は以下のようにした

- Docker
- WordPress6.1.1
- PHP8.0
- mysql8

※WordPressはマルチサイトで動作させている

# 概要
新環境にデータを移し、サイトネットワークをアップグレードすると「cURL error 28: Resolving timed out」と表示され失敗する

# 対処法
最初はPHPの実行時間を伸ばして見たが、cURLの実行時間は別に設定されていて、その時間以内に処理が完了しないのでエラーが発生していた。

よって、cURLの実行時間を伸ばす(自分の環境では元々が10秒に設定されていて30秒とかに伸ばしたが、処理が終わらなかったので300秒とかにしたら処理が完了した。)

具体的なコードはこちら
https://gist.github.com/sudar/4945588
このコードをテーマの `function.php` に入れてcURLの実行時間を伸ばした
watchAppにHealth Kitを追加する

# はじめに
watchAppでHealth Kitを使いたい時に追加する手順です。よくわからないエラーが頻発するのでまとめました。

# Capabilityの追加
TARGETSからwatchAppを選択し、左上にある**＋Capability**を押します。
![スクリーンショット 2022-12-25 3.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/7dee576c-7f79-5fdd-d30b-36ed6cb0505b.png)
HealthKitを選択し、追加します。
![スクリーンショット 2022-12-25 3.30.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/c45f02d7-8ef1-eea8-7510-52542c7ee2f6.png)
![スクリーンショット 2022-12-25 3.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/86351c3d-b257-7b93-7dfe-1732cf02eee6.png)
このようになればOK。

# Info.plistの設定
watchAppのInfo.plistに、
- **Privacy - Health Share Usage Description**
- **Privacy - Health Update Usage Description**
- **Privacy - Health Records Usage Description**

の3つを追加します。
![スクリーンショット 2022-12-25 3.37.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/ff63f683-48e3-6768-b4e1-3e21207a959b.png)
ここで、**Value（説明文）をちゃんとした英文にしないと無効な値としてエラー判定になります**。気をつけましょう。

# まとめ
このあたりの記事少ないよね…開発頑張っていきましょう。
5つのスクラム開発で大事にしていること/取り入れたいこと

no plan株式会社では、自社プロジェクトは全てスクラム開発を行っています。
そこで大事にしていることや、他のチームを見た時に取り入れたいと思ったことも書こうと思い筆を取りました。
今回はスクラム開発用語がわからない人でも読めるようにあえて用語を使わないようにしてみたいと思います。

# スクラム開発とは
> スクラムは「問題に対する解決策を列挙」「高優先度の策を一定期間でチームで実行」「結果の検査に基づく調整」「その繰り返し」を実現できる環境を生み出すシンプルなアプローチである。スクラムのカギとなる基本原則は、プロジェクト開発の途中で、顧客は、要求や必要事項を変えられるという認識である。予想できない変更について、計画に基づく方法で対処することは、容易ではない。したがって、スクラムは経験に基づくアプローチを採用する。
([引用: Wikipediaより](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA)#:~:text=%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0%E3%81%AF%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%AE,%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82))

## スクラム開発についてもっとざっくり
- スクラム開発は小さなチームで大きな成果を出せます
- やりたいことに優先度をつけて工数含めてやるかどうかをチームで判断します
- スプリント(1~2週間の期間)という短い期間に切って開発と改善を繰り返します
    - スプリントを振り返りを行い、開発精度を上げる試作をチームで検討し改善を行なっていきます
    - また、スプリント中に差し込みタスクがあった場合はチケットを入れかえて無理のない開発を行います

# 開発手法に銀の弾丸はない
- よく比較されるウォーターフォールとスクラムですがそれぞれ一長一短があるのは確かですが
    - 他の手法よりは合理的な開発手法で、マシであると考えています
- チームの特性や、プロダクト、座組によってはウォーターフォール開発が向いている場合もあるとは思います


# スクラム開発で大事にしていること/取り入れたいこと
### 1: 発言しやすい雰囲気づくりをすること
- 少人数ワンチームとして取り組むため、開発で問題が起きた場合、修正したい箇所ができた場合などなんでも発言相談できやすいオープンな雰囲気は大事だと思っています
- これはブレストの文化と似ていて、アイデアや意見を持っていても発言できないと意味がありません
    - まずは筋違いでもいいので、何か問題が起こったら共有！早く共有できたことに賞賛とそれができる雰囲気を作りましょう！

### 2:なるべく自動化し開発に集中できるようにすること
- デプロイやテストなどなるべく自動化することで本来の開発に集中できるようにしています
- 自動化することによるメリットはたくさんあります
    - 手作業によるミスが減る
    - 無駄な手順書も減る
    - デグレも減る

### 3: とりあえずチームから出た試作は実行してみる
- まずは施策をやってみて数値なりで検証を行い次に活かしていくという姿勢はとてもいいと思います

### 4: 使ってくれているUserの声や、営業、数値をみんなで祝うこと
- Userの生の声や導入が決まったり何かしらのFBがあるとテンションは上がるものです
- またなぜこれをやるのか、今何をするべきか明確になります

### 5: なぜやるのか、大切にしたいことなどの言語化をしておくこと
- 掛け声を決める
    - (例)IT業界のトヨタになる!
- 大切にすること決める
    - (例)使いやすさを重視する!
- リーンキャンバスの作成
    - 誰に対するどんなソリューションで何を解決するのかが明確になります


# まとめ
- スクラム開発はコミュニケーションがとても大事です
- しっかりと回していけば少数精鋭の開発チームを作ることができます
- 言語化もしっかりしていきましょう


# no plan株式会社について
- no plan株式会社は、ブロックチェーン技術、Webサイト開発、ネイティブアプリ開発、チーム育成、メタバースなどWebサービス全般の開発から運用や教育、支援などを行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫！ご一緒にプランを立てていきましょう！
- [no plan株式会社について](https://noplan-inc.com)
- [no plan株式会社 | ブロックチェーン実績](https://noplan-inc.com/blockchain)
- [no plan株式会社 | ブログ一覧](https://noplan-inc.com/blog)
- [お問い合わせはこちら](https://noplan-inc.com/contact)
既存のiOSアプリにwatchOS Appを追加する

# はじめに
これまではStoryboardを用いたwatchOSのアプリ開発ができていたようですが、最近はそれがなくなり、SwiftUIしか使えなくなったようです。
なので、Storyboardを用いた既存のiOSアプリにwatchOSアプリを追加する方法がだいぶ変わっていたため、まとめておきます。

# Targetの追加
まずはTargetを追加します。
![スクリーンショット 2022-12-25 2.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/1c6b2e31-ca04-2fa1-beab-0c2a03c26b40.png)
こちらの+ボタンから、
![スクリーンショット 2022-12-25 2.49.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/dacd96a3-d96d-9733-7b51-40fdd893e87a.png)
watchOSの項目の中のAppを選択します。
![スクリーンショット 2022-12-25 2.57.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/f238dbe0-790e-ab39-d6b0-26de4f2c81e3.png)
名前は「Watch + 既存アプリの名前」などにしておくといいでしょう（改善の余地あり…）。また、**Watch App for Existing iOS App**を選択してください。
![スクリーンショット 2022-12-25 2.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/344ca5f4-8cef-6b8f-f519-84c4518bac36.png)
**Activate**します。

次に、**TARGETS**からiOSアプリの方を選択し、**General > Frameworks, Libraries, and Embedded Content**の欄をみます。
もしそこに先ほど追加したwatchOSのアプリが記載されていなければ、+からwatchOSアプリを追加します。

![スクリーンショット 2022-12-25 3.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/76377d78-f5e7-808a-4b6e-cd110ac78df3.png)
![スクリーンショット 2022-12-25 3.05.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/63ac6234-876c-b110-a420-92fc8387a5f9.png)
以下のようになればOK。
![スクリーンショット 2022-12-25 3.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/e7397ebe-7eae-2a1c-4c88-93609728d6c0.png)

# Bundle Identifierの設定
次に、2つのTargetのBundle Identifierを設定していきます。

追加したての状態だと、watchOS側のBundleがこのように不完全になっているかと思います。
![スクリーンショット 2022-12-25 3.08.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/aa9d130e-7f76-5771-b0d1-9f2367dd92d5.png)

iOSアプリ側のBundleをコピーし、watchOS側にペーストします。
![スクリーンショット 2022-12-25 3.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/cd57f741-0a49-9b99-6ab5-3c0a2d74c592.png)
![スクリーンショット 2022-12-25 3.10.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/adbc6e2d-aded-26f5-1682-e002810e2e0b.png)
このようになればOK。

また、**watchOSのInfo.plist**の**WKCompanionAppBundleIdentifier**に、今コピペした**iOSのBundle Identifier**を入力します。
![スクリーンショット 2022-12-25 3.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/253184bd-e5a2-dd52-e6b9-0d8d856cc425.png)
![スクリーンショット 2022-12-25 3.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/2649e026-368c-647c-1b02-662daeec83f8.png)

ここまで設定することで、**iOSアプリにwatchOSアプリを追加することができました🎉🎉**

# 実行する時
AppleWatchで実行する時・iPhoneで実行する時で、それぞれ実行しなければいけません。
![スクリーンショット 2022-12-25 3.17.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/c5ab5660-210b-c39a-674e-453ef06e7884.png)
AppleWatch側を実行するとなぜかiPhone側のアプリが閉じてしまうので、両方とも同時に実行しておきたい時にはAppleWatch→iPhone の順番で実行するようにした方がいいでしょう。

# まとめ
現在あるほとんどの記事で「WatchApp Extension」が出てきますが、watchAppとwatchApp Extensionを一度に追加する機能がもうなくなってしまっているので、この記事のようにやるのが一つの方法だろうと思います。
また、watchOSの開発にSwiftを使うことはもうほとんどできないようになっているようですから、頑張ってSwiftUIに切り替えていきましょう。
複数のプロジェクトのdocker-composeを共通化する

複数のプロジェクトがあり、それぞれでdocker-composeを使用している場合、プロジェクトを切り替える場合、例えばどちらでもmysqlコンテナを使用していて、その度にdocker-composeを切り替えるのが面倒。
なので、複数プロジェクトでdocker-composeを共通化してみた。

## したい事イメージ
#### before
```
Aプロジェクト
└docker-compose.yml
　└mysqlA
Bプロジェクト
└docker-compose.yml
　└mysqlB
```
#### after
```
Aプロジェクト
└docker-compose.yml
　└mysqlA
　└mysqlB
Bプロジェクト　※Aプロジェクトのdocker-composeを起動すれば、こちらのmysqlコンテナも起動する。
```

ポイントとしては、以下を分ける。
- コンテナ名
- ホストのポート番号（「3306:3306」で言う左側の番号）
- volumeを使用する場合は、volumeのパスがそのプロジェクトのパスである事。
PostgreSQLのログイン時やユーザ変更時に"Peer authentication failed for user"と言われたら"pg_hba.conf"を変更する

[Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る
](https://book.impress.co.jp/books/1115101145)でPostgreSQLをいじっているときに認証関係ではまってしまったのでメモ。

### 環境
```bash
* WSL2
* Ubuntu 20.04.5 LTS
* PostgreSQL 12.12 (Ubuntu 12.12-0ubuntu0.20.04.1)
```
### エラー内容
psqlコマンドでユーザ指定してログインするときや、ログイン後にユーザを切り替えるときに"Peer authentication failed for user ..."（peer認証に失敗しています）と怒られる。
peer認証とは、systemのユーザネームと接続しようとしているデータベースのユーザネームがマッチしているかを検証するもの。
https://www.postgresql.org/docs/current/auth-peer.html

```bash:ターミナル
$ psql -U username # ログイン時
psql: error: FATAL:  Peer authentication failed for user "username"
```
```bash:PostgreSQL
\c tablename username # ユーザ切り替え時
psql: error: FATAL:  Peer authentication failed for user "username"
```

### 対処方法
postgresqlの認証関係は"pg_hba.conf"で設定されているので、これを修正することで解消できる。

```bash:ターミナル
sudo vi /etc/postgresql/12/main/pg_hba.conf # 場所はユーザごとに異なる
```
```pg_hba.conf
# DO NOT DISABLE!
# If you change this first entry you will need to make sure that the
# database superuser can access the database using some other method.
# Noninteractive access to all databases is required during automatic
# maintenance (custom daily cronjobs, replication, and similar tasks).
#
# Database administrative login by Unix domain socket
local   all             postgres                                md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
# local   all             all                                     peer # <- ここをコメントアウト
local   all             all                                     md5    # <- この行を追加 
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
```

pg_hba.confを更新後、postgresを再起動すればログインできるようになる。
```bash:ターミナル
$ sudo service postgresql restart # 再起動

$ psql -U username # ログイン
Password for user username:
psql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
Type "help" for help.

username=> # ログイン成功！
```
Blenderを使用するのに必要なマシンスペック2022版

質問チャット等を眺めていると定期的に
「お勧めマシンを教えてください」といった話題が投稿されます
**性能は値段に比例する**のは鉄則なので　「**予算内でできるだけ高いものを買う**」　という回答になってしまいますが
以下に 業務を使用した感覚を元にした解説を　覚え書程度に書き留めておきたいと思います

先に目安となる結論を書いておくと2022年現在では
**「メインメモリを１６GB以上ん積んだ　GPUにRTX 3060を積んだマシン」** となります。
メーカーがゲーミングPCのミッドレンジ（普及帯）としているもので、
細かいスペックの差はあっても　極端な組み合わせのものは見当たらないです


今から始める人の失敗のない組み合わせという観点で書いていますので
自作できる程度の知識のある人には突っ込みどころがあるでしょうし
既に業務に使用している人の追加購入の場合には求めるものが違ってくるでしょうが 何かの参考になればと思います

## Blenderの最低動作環境
まずBlenderの [Hardware Requirements](https://www.blender.org/download/requirements/) に書かれた最低限の動作環境を見ておきます
- SSE2 をサポートする 64 ビット クアッド コア CPU
- 8GBのRAM
- フルHDディスプレイ
- マウス、トラックパッド、またはペンとタブレット
- 2 GB RAM、OpenGL 4.3 を搭載したグラフィックス カード
(概ね10年以内のマシン)
といった感じです

::: note
基本的には 2022現在 新品で売られているメモリーが８GB以上のWindowsマシンなら
ほぼ全てで Blenderを使用できるし、10年前のマシンを使うより高性能です。

私も機能の検証に 現在新品購入できる中での最低スペックのマシンを利用しています
普通に利用できていますが、あくまでも最低限動かせるだけ と考えてください
:::
今は少なくなりましたが　何故か無料ソフトだから低スペックでも動くと考える人が居るようですが
全くそういうことはありません。　　あまりケチるのは「安物買いの銭失い」と考えてください

３ボタンマウスと　テンキー付きキーボードまたは外付けテンキーは必須になっていないですが
ほぼ必須だと思ってください。　ないと面倒な操作がでてきます。

## モデリングに使えるスペックの目安
次にネット上のチュートリアルをやったり
例えばVRアバター程度のモデルやシーンをモデリングしたり　見た目を確認するのにストレスないスペックです
（概ね6万ポリゴン以下のモデルを想定）
これはほぼ　画面を表示するための計算をする部分（GPUと呼んだりします）の性能です

PCの性能を比較するのに３Dゲーム等の処理速度を比較するベンチマークソフトというのが使われますが
「**3DMark**」の「**Fire Strike**」というテストのスコアが**3000**を超えるあたりから
ビューポートの操作に問題を感じなくなるようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/5f681a7a-7bfa-b282-c920-41cc225f4605.png)

::: note
スコアが3000というのは　10年前のゲーミングPCくらいで
現在では比較的軽量とされる範囲の３Dゲームは快適に動くという評価になる数値です。
CPUの内蔵のグラフィック機能は性能が低くて使えないのが旧来の常識でしたが
今ではCPUに内蔵したものでもこのスコアを超えるものが出てきています
::: 

このベンチマークが動くというのはBlenderが動く最低限のスペックはあるということですし
大抵の性能比較記事で利用している程メジャーなテストなので　購入候補のマシンを検索して比較してみるといいでしょう
今売っているノートPCを調べてみたところ　7万円台からこの性能を満たすものがあるようです

## 仕事等にも使えるPC
先の基準を満たすものなら色々出来ますが
Blender以外のゲームやVRをやったり、先々仕事にする可能性がある場合には
冒頭に挙げた「RTX 3060」を載せたもの　ということになります

Blenderでは画面表示の他にレンダリングにもGPUを利用するようになっています
特にCyclesレンダーでCPU利用の場合とGPU利用とは明確な差があります
GPUの種類は他にもありますし　CPUの種類も色々なのにこの基準を選んだかというと

- 下位モデルのRTX3050搭載との価格差が数万程度でその価格差以上の性能差がある
- 下位モデルまたは旧世代のものはグラフィックに使うメモリの容量が少ない
- RTX3060搭載のものはCPUも十分な性能の組み合わせになっているものがほとんど
- レンダリング以外のシミュレーションではCPUのコアを１つしか使わない計算も多いので現行のものではCPUの差が出にくい
- （Radeonに関してはGPU計算の対応に関する情報がまだ足りない　AIを使った計算等　新しい技術の対応が遅れがち）

ややこしいことに　GPUは同じモデル名でも　ノートに載っているものとデスクトップPCに載せるものとは性能差があって
またグラフィック用のメモリもRTX3060のノート用で6GB　デスクトップ用で12GBと違いがあるようですが
どちらの場合もミッドレンジとして　実際の販売面でも人気のようです

それ以上のRTX2070等を選択するか　メモリやCPUの良い物を選択するか は
それぞれの予算や目的で選ぶことになるかと思います

## Macについて
何故かMacにこだわる人がいますが　今現在Macを使っていて愛着があるという人以外はお勧めしません

私も以前はMacを利用していたこともありましたが
Macの環境では複数のBlenderのファイルを同時に開くことができなかったりしますし
僅かに動かないアドオンといったものもありますし
トラブルがあった時に対応できる人も少なしです
M1といったCPUもいいハードウエアかとは思いますが　宣伝されたほど圧倒的な性能ではないですし
今現在　CGを作る上での機能面でのあえて選ぶ利点はほぼありません

## ペンタブレット　液晶ペンタブレットについて
液晶ペンタブレットを使えば　何か特別な機能を使えるかのような質問を見かけることもあります

プロで作業されている人には好みで液晶ペンタブレットを使用されている人も居ますし
グリースペンシルでの線を描く時に直感的ということはありますが
操作に有利になるような機能は用意されていません。
3ボタンマウス相当でないとBlenderの操作に制限があるので むしろデメリットの方が大きいです
ルーティングテーブル　状態フラグの項目

●ルーティングテーブル

・Destination 宛先ネットワークアドレス（defaultはデフォルトルート）
・Gateway 宛先ネットワークへのゲートウェイ。デフォルトルートのゲートウェイをデフォルトゲートウェイという。
・Ganmask 宛先ネットワークのサブネットマスク（デフォルトは0.0.0.0）
・Flags　状態フラグ
・Iface 宛先ネットワークへの送信に使用するインターフェース

●状態フラグの項目
・U 経路が有効
・H 対象をホストとして設定
・G ゲートウェイを使用

ホストは送信するパケットの宛先IPアドレスを含むネットワークが、ルーティングテーブルの「Destination（宛先）」の項目に存在するかを調べる。宛先ネットワークが「Destination」に存在すれば、パケットをその行の「Gateway」へ送信します。
宛先ネットワークが「Destination」に存在しない場合は、デフォルトルートの存在を確認し、存在する場合はデフォルトルートの「Gateway」（デフォルトゲートウェイ）へ送信。デフォルトルートとは、ルーティングテーブルの「Destination」が「default」と表示されている情報。
ルーティングテーブルに宛先ネットワークもデフォルトルートも存在しない場合は、パケットを破棄し、送信元へICMP Destination Unreachableメッセージを返す。
リモートマシンのパケットキャプチャをする

# 発端
以前書いたとおり、僕の家のネットワークはミニPCをルーター化して運用しています

https://qiita.com/m-m-n/items/0fa1bc14ed6584295adc

ちなみに上記記事でMinisforum N40を買ったと言ってますが、色々あり結局Skynew IN-1も買ってます
最近記事を見た[ASUSのミニPC](https://www.gdm.or.jp/pressrelease/2022/1223/469882)も良さそうですね？

で、ルーターが普通にLinuxで動いているのでパケットキャプチャ出来るよね？
となりまして
ということはスマホ-wifi-ルーター-モデムという経路なのでルーター上でパケットキャプチャしたらスマホのパケットキャプチャも出来るよね？
となりました

# リモートのパケットを標準出力に出す
標準出力に出せればsshでコマンド流してリモートのパケットをローカルに持ってこれますね？
ルーター上にパケットダンプしたファイルを置いても良いのですが、無駄にストレージ消費するのもね
ルーターだし

```bash
man tcpdump
```
で調べると `-w` オプションでファイルに保存される模様で `-w -` なら標準出力に出るようでした

他、 `-w` オプションの説明に `-U` オプションでバッファリングしないですぐに書き込むという説明があったので `-U` オプションも追加します

NICの指定とMACアドレスでのフィルタリングが可能なので、その指定もします
LAN側のNICを出入りするパケットに対してターゲットにしたいスマホのMACアドレスを指定します
IPアドレスでのフィルタリングも出来るようでしたが、IPv4/IPv6混在してるなどがあり、MACアドレスでフィルタリングできるならそちらの方が楽そうなのでMACアドレスでのフィルタリングをします
NICの指定は `-i` オプションを利用し、MACアドレスでフィルタリングする際は `ether host MACアドレス` とします
ルーターのLAN側のNICが `enp3s0` と認識されており、ターゲットのスマホのMACアドレスが `01:23:45:ab:cd:ef` とするとルーター上で実行するtcpdumpのコマンドラインは以下のようになります

```bash
sudo tcpdump -U -w - -i enp3s0 ether host 01:23:45:ab:cd:ef
```

# wiresharkで標準入力を解析する
まずはヘルプを確認する
```bash
wireshark --help
```
どうやら `-r` オプションでファイルを指定できるとの事だけど `set the filename to read from (no pipes or stdin!)` とあり標準入力は入れられないらしい？
しかし `-i` オプションで `-` を指定すると標準入力を解析することができそうでした

標準入力にコマンドの結果を与える際に `<(コマンド)` という記法が使えます
これを使うと例えばローカルとリモートのdiffなんかも見れますので便利です

```bash
diff -u /path/to/file <(ssh remote "cat /path/to/file")
```
こんな感じでdiff見れるし、なんならリモートAとリモートBのdiffを見るとかも出来ちゃう

wiresharkは `-k` オプションを利用することで起動後すぐにパケットキャプチャの画面に移る模様

これより、ローカルマシンで実行するwiresharkのコマンドラインは以下のようになります

```bash
wireshark -k -i <(リモートのtcpdump)
```

# まとめ
```bash
wireshark -k -i <(ssh router "sudo tcpdump -U -w - -i enp3s0 ether host 01:23:45:ab:cd:ef")
```
(注) `.ssh/config` の設定で `ssh router` でルーターにログイン出来るようにしてあります

これでwiresharkが立ち上がり、スマホを操作すると色々パケットが飛んでいることが確認できるようになりました

若干標準エラーに出る出力で邪魔だったので、最終的には以下のように標準エラーを握り潰しました

```bash
wireshark -k -i <(ssh router "sudo tcpdump -U -w - -i enp3s0 ether host 01:23:45:ab:cd:ef 2>/dev/null") 2>/dev/null
```

---
それでは良いパケットキャプチャライフを
steamdeckで日本語むけ環境を導入する

みなさんSteamDeck買いましたか？
自分はやっと届いた・・（遅れ気味に）
ゲーム機としてもいいんですが、ベースがDebianからarchLinuxベースに変わった等で
いろいろしたいのでとりあえず導入したものをつらづらと書きます。
### 注意
とりあえずこの記事はSteamOS3.4.2での導入方法になるので、以前、以後のバージョンは補償はしませんのであとは調べてねっと。
ある程度のコマンドはteraterm側からでも実行できますが、注釈ない場合はteratermにて実施しています。
### これも大事
SteamDeckは充電ケーブルさしておくこと！刺さずにsshしてると電源おちちゃうからね！！（警告がでる）

# sshの有効化
#### steamdeck側
１．SteamDeckが起動したら、STEAMボタン＞電源＞デスクトップでモードをデスクトップに切り替えます。
２．左下のマークからSystemを開きKonsoleを開きます。
３．terminalが起動するので以下のコマンドを実施してパスワードの設定をしてください。（すでに設定している場合はこの項目を飛ばす）
```
passwd
```
４．STEAMボタンを押しつつXボタンを押してソフトウェアキーボードが起動したら以下を実施します。
sudoのパスワードは上で設定したものになります。
```
sudo systemctl start sshd
sudo systemctl enable sshd
```
５．windows等からterminalでssh接続をします。SteamDeck初期セットアップのとき特にいじってないとおもうので、以下でつながるはずです。
ホスト名：steamdeck or IPアドレス
ユーザー名：deck
パスワード：（手順３で設定したパスワード）

# USBキーボード用のキー配列の修正
差し込んだら英語配列だった・・ってなやつなのでここでこれも修正しましょう。
１．ターミナルで以下のコマンドを実施
```
loadkeys jp106
```

# 日本語ロケールの設定
SteamDeckウィザードに従ってもデフォルトはen_US.utf8・・
ここも直しましょう。
１．ターミナルで以下のコマンドを実施
途中のパッケージ追加管理はよしなに対応すること
```
sudo steamos-readonly disable
sudo pacman-key --init
sudo pacman-key --populate archlinux
sudo pacman -S glibc
sudo sed -i "s%#ja_JP.UTF-8 UTF-8%ja_JP.UTF-8 UTF-8%" /etc/locale.gen
sudo locale-gen
sudo steamos-readonly enable
sudo localectl set-locale LANG=ja_JP.utf8
source /etc/locale.conf
```
２．ターミナルで以下のコマンドで確認する。
```
localectl status
```
こんな形になってればOK
```
(deck@steamdeck ~)$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```
３．ターミナルでロケール回りの確認
```
locale
```
ここもこんな形になってるはず。
```
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
```

# manの日本語を導入
archLinuxには日本語ヘルプパッケージなんてなかった。
ビルドして入れましょう。

1.ターミナルで以下のコマンドを実施します。
make configでいろいろ聞かれますが
特にきにせず進めてOKです。
パッケージ導入もよしなに進めてください
```
sudo steamos-readonly disable
wget https://linuxjm.osdn.jp/man-pages-ja-20221215.tar.gz
tar zxvf man-pages-ja-20221215.tar.gz
cd man-pages-ja-20221215/
sudo pacman -S base-devel
make config
sudo make install
sudo pacman -S otf-ipafont
sudo steamos-readonly enable
```