OmniAICreator/Qiita-1.07M huggingface dataset:
【機械学習】学習用データと予測値はきちんと比較した方がいい

過去のKaggleコンペに挑戦し始めて早数週間が過ぎようとしている。数々のエラーメッセージを乗り越えてきたおかげで、だいぶん精神力も鍛えられているように思う。過去の記事ではエラーとその対処法のみを述べてきたが、ここで一度何をしようとしているのかをおさらいしておこうと思う。

[SIIM Covid-19 detectionコンペティション](https://www.kaggle.com/competitions/siim-covid19-detection/overview)では、患者の胸部CT画像を元にCovid-19の感染有無を機械学習を用いて行うことにチャレンジしている。一般的にCovid-19の診断にはPCR検査を用いることが多いが、PCR検査では結果を得るのに数日を要することがあるため、他の方法はないかと模索しているということだろう。現在でもCT画像を用いた診断はできないことはないようだが、当然ではあるが十分に訓練と経験を持った医師による視診が必要になる。感染者数が多い状況下でこの方法を主にするのは現実的ではないので、機械学習の力を使えないかと思ってコンペティション化したというわけだ。

学習用には3つのデータが与えられている。1つは胸部CT画像で、Covid-19感染者と非感染者の画像が与えられる。各患者につき画像は1枚であり、DICOM形式という形式で保存されている。これは医療用データではよく使われる形式らしい。次に各患者に対する感染状況である。これはcsv形式で与えられており、患者の状態は感染なし、Covidの症状あり、不明、なんらかの異常ありの4つの状態に分類される。最後にバウンディングボックスの情報である。CT画像に何らかの異常が疑われる場合、被疑箇所を長方形のボックスで示すものである。

テスト用にはCT画像のみが与えられている。課題はこのCT画像を使って患者の状態を4つの状態のうちどれに分類されるかを予測し、さらに異常に分類される場合にはバウンディングボックスの座標を予測するというものだ。

これは一般的には物体検知と分類と呼ばれるタスクである。これらのタスクに対して有効なモデルがいくつか存在して、まずはそれらをファインチューニングしてベースラインのモデルを作るのがセオリーらしい。前置きが長くなったが、今回やりたいのはこれら両方のタスクをこなすことができると言われるEfficientDetをファインチューニングすることだ。


ちなみに先日、ようやくモデルの学習をエラーなく完了することができた。プログラム全体については近いうちにブログにするつもりだ。

ただし、エラーなくプログラムが動いたとしても油断ならんという事態が起こったので、バグ対処ブログとしてこの事態について書いて本日は締め括ろうと思う。



### 予測されたバウンディングボックスに違和感

与えられた学習用のCT画像にバウンディングボックスを重ねると、概ねどちらかもしくは両方の肺の位置を示す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514778/bc838992-e88a-902f-048d-6c3c1153103f.png)
*(実際のデータはKaggleコンペティション用にのみ使用可能のため、ここではイメージ図を載せています。[©dak](https://illustimage.com/?dl=4709))*

で、学習済のモデルが出力したバウンディングボックスがこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514778/23e7e06f-f5d4-0197-2c9f-3d5b0ca3972a.png)

もちろんエポック1周分しか学習していないので、正確な出力を期待していたわけではないが、どうにも向きがおかしいように思う。

その原因はどうやらeffdetモデルへの正解バウンディングボックスの入力にあった。[こちら](https://github.com/rwightman/efficientdet-pytorch/issues/117)のeffdet作者への質問と回答によると、effdetに正解バウンディングボックスを入力する際は、座標を次のようにyxyx形式で入力する必要があるらしい。

```python
(y0, x0, y1, x1)
# x0, y0: バウンディングボックス左上のx, y座標
# x1, y1: バウンディングボックス右下のx, y座標
```

正解として間違った情報を入力しているのだから、予測結果に違和感が生じるのは当たり前である。effdetへの入力値を直したところ、バウンディングボックスの予測についてはかなりの高精度な出力を得ることができた。

ちなみに、入力値を修正した時に間違えそうになったのが、座標を入れ替えるタイミングである。画像データを使ったタスクの際には学習前に画像データにリサイズや切り取りなどの処理を施すことが多い。今回の場合、Albumentationsというライブラリを使ってリサイズを行っている。そしてこのライブラリは画像をリサイズする際、画像に合わせてバウンディングボックスの値も修正してくれる。このとき、Albumentationsへのバウンディングボックスの入力は通常のxyxy形式、effdetはyxyx形式と、座標の保持の仕方が異なる。したがって、座標の入れ替えをAlbumentationsへの入力前に行ってしまうと、新たなエラーを生むことがあるので注意が必要だ（バウンディングボックスの座標が画像の外を指すとエラーを返すようになっている）。

総じて、今回もまたいい教訓を得た。プログラムがうまく動いたとしても、今度は学習用の画像と、それに対する予測をきちんと比較して、あまりにもおかしい予測をしていないかを確認した方がよい。
SalesforceとiOSのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [iPad、iPhone関連](https://qiita.com/Keiji_otsubo/items/1d0ad7707d64d8ded97a)

+ [Salesforce on iOS 16.4 geolocation not working](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jgy01SAB)

( navigator.geolocation.getCurrentPosition ) を使用してiOS 16.4にアップデートした後に問題が発生

+ [標準ファイルアップロード画面がフリーズする](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgwspSAB)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/55dda8c1-2cc8-26a1-e230-3e8920782051.png)

OSはiOS 16.3
ブラウザはChorme 最新版

:::note alert
ファイルアップロード機能をスマホで使用し、
アップロード画面に行く前の画面で拡大表示していた場合に、
『ファイルアップロード画面が拡大されたまま硬直し、（上部に表示されている"キャンセル"or"完了"ボタンが見切れていた場合）スワイプで"戻る"操作しかできない』
という事象が発生しております。
:::

# 既知の問題

+ [iOS デバイスで「Salesforce にコピー」を使用してファイルがアップロードされない](https://issues.salesforce.com/issue/a028c00000gAyCxAAK/files-are-not-uploaded-using-copy-to-salesforce-on-ios-devices)

# ヘルプ

+ [Salesforce for Android and iOS および Field Service Mobile におけるメモ、ドキュメント、ファイル、添付ファイルのサポート](https://help.salesforce.com/s/articleView?id=000386421&type=1)

+ [Salesforce モバイルアプリケーションの相違点または利用できないこと](https://help.salesforce.com/s/articleView?id=sf.limits_mobile_sf1_parent.htm&type=5)
Salesforce モバイルアプリケーションには、デスクトップの Lightning Experience で使用できるすべての機能が含まれているわけではありません。使用できない Salesforce 機能、デスクトップの Lightning Experience で慣れ親しんだ機能とのギャップがある機能、または動作が異なる Salesforce 機能について学習します。

+ [Lightning Experience でサポートされるブラウザおよびデバイス](https://help.salesforce.com/s/articleView?id=sf.getstart_browsers_sfx.htm&type=5)

**タブレットブラウザ**
iPadOS (iOS 13.x) 以降で Apple Safari を使用してください。iPad Safari の Lightning Experience では、縦方向と方向の切り替えはサポートされていません。Safari ブラウザの幅全体が表示されるように、横方向を使用します。方向が切り替わらないようにするには、iPad の回転ロックを有効にします。

**スマートフォン**
最適な操作性を得るには、Salesforce モバイルアプリケーションを使用してください。

+ [iPad Safari の Lightning Experience に関する考慮事項](https://help.salesforce.com/s/articleView?id=sf.getstart_browsers_tablets.htm&type=5)
先週、今週などの式


+ [Formula field: Closed Date = LAST WEEK](https://developer.salesforce.com/forums/?id=9060G000000MOYuQAO)
+ [Formula that display Current Week, last week and Next week](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7SNYSA3)
+ [Reporting on Salesforce Files (and Related Records) via Data Loader](https://ideas.salesforce.com/s/idea/a0B8W00000Gdg5fUAB/reporting-on-salesforce-files-and-related-records-via-data-loader)

# 20日締めで今月だったらtrueになる式

```
IF ( DAY( TODAY() ) > 20 ,TEXT( YEAR( TODAY() ) *100 + MONTH(TODAY() ) ),
IF ( MONTH(TODAY() ) = 01, TEXT( YEAR( TODAY() ) - 1) & '12' ,
TEXT( YEAR( TODAY() ) *100 + MONTH(TODAY() ) - 1)
)) = SyougoMonth__c
```

# 20日締めで今月だったらtrueになる式

```
CASE( MONTH(TODAY()),
1,IF ( DAY( TODAY() ) > 20 ,TEXT( (YEAR( TODAY()) -1) *100 + 12) ,TEXT( (YEAR( TODAY()) -1 ) *100 + 11) ) ,
2,IF ( DAY( TODAY() ) > 20 ,TEXT( YEAR( TODAY()) *100 + 1) ,TEXT( (YEAR( TODAY())-1 ) *100 + 12) ) ,
IF ( DAY( TODAY() ) > 20 ,TEXT( YEAR( TODAY() ) *100 + MONTH(TODAY()) -1) ,TEXT( YEAR( TODAY() ) *100 + MONTH(TODAY() ) -2) )
) = SyougoMonth__c
```

# 20日締めで今年度、昨年度、来年度のように区分をつける式

```
IF(AND(Nengetu__c >=
CASE(MONTH(TODAY()),
1,TEXT(YEAR(TODAY())-1) & "/04",
2,TEXT(YEAR(TODAY())-1) & "/04",
3,TEXT(YEAR(TODAY())-1) & "/04",
TEXT(YEAR(TODAY())) & "/04") ,
Nengetu__c <=
CASE(MONTH(TODAY()),
1,TEXT(YEAR(TODAY())) & "/03",
2,TEXT(YEAR(TODAY())) & "/03",
3,TEXT(YEAR(TODAY())) & "/03",
TEXT(YEAR(TODAY())+1) & "/03") ),"this",

IF(AND(Nengetu__c >=
CASE(MONTH(TODAY()),
1,TEXT(YEAR(TODAY())-2) & "/04",
2,TEXT(YEAR(TODAY())-2) & "/04",
3,TEXT(YEAR(TODAY())-2) & "/04",
TEXT(YEAR(TODAY())-1) & "/04") ,
Nengetu__c <=
CASE(MONTH(TODAY()),
1,TEXT(YEAR(TODAY())-1) & "/03",
2,TEXT(YEAR(TODAY())-1) & "/03",
3,TEXT(YEAR(TODAY())-1) & "/03",
TEXT(YEAR(TODAY())) & "/03") ),"last",

IF(AND(Nengetu__c >=
CASE(MONTH(TODAY()),
1,TEXT(YEAR(TODAY())) & "/04",
2,TEXT(YEAR(TODAY())) & "/04",
3,TEXT(YEAR(TODAY())) & "/04",
TEXT(YEAR(TODAY())+1) & "/04") ,
Nengetu__c <=
CASE(MONTH(TODAY()),
1,TEXT(YEAR(TODAY())+1) & "/03",
2,TEXT(YEAR(TODAY())+1) & "/03",
3,TEXT(YEAR(TODAY())+1) & "/03",
TEXT(YEAR(TODAY())+2) & "/03") ),"next",

"other")))
```
スプレッドシートを用いて、前日データと当日の同一データの比較したい

# はじめに
大量のデータを比較したい。データの突合をしたい。
そんな時ありますよね？

例えば、前日まで100と記載されていたものが、翌日変化している場合に、視認したい！
などなど

そんなときに、便利なやり方ひとつをご紹介します。

## 使うもの
Google スプレッドシート

## やり方
今回は、0411のデータに対して、翌日0412のデータとの比較したときに変化があったものを色付けたい！というものとする

### ①基準としたいデータをシートに挿入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124041/9cb2fd56-4772-7222-3e43-1d73dd8a264e.png)

### ②比較したいデータを別シートに挿入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124041/f72ea272-97f9-d327-1133-daaccc61737c.png)

### ①のシートに対して、データ突合する条件付き書式を設定する

* セル選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124041/13c22f02-8e70-0dde-3e8a-bf9be23d105b.png)

* 書式ルール＜カスタム書式　に以下を入れる

``` 
=A1<>INDIRECT("突合_0412!"&CELL("address",A1))
```
すると、こんな感じで、差分になったものがでる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124041/0b976073-5ed4-9b59-2d1f-ec1e0e9bfd65.png)

### 注意事項
スプレッドシートの比較したい対象の行・列に相違がない状態にしないといけないです！

とても便利なので、是非、頭の片隅においておいてもらえたらなと！
ListやMapの参照元が変わってしまう問題とその対処法

## まずは問題のコードを見てみよう
```dart
void main() {
  List before = [1, 2, 3];
  List after = before;
  
  after[0] = 50;
  print(before); // [50, 2, 3]
  print(after); // [50, 2, 3]
}
```
afterの中身しか変えていないのに、beforeリストの中身も変わってしまっている。

#### MapやSetの場合でも......
```dart
// Mapの場合
void main() {
  Map before = {0: 'banana', 1: 'strawberry', 2: 'grape'};
  Map after = before;
  
  after[1] = 'pineapple';
  print(before); // {0: banana, 1: pineapple, 2: grape}
  print(after); // {0: banana, 1: pineapple, 2: grape}
}

// Setの場合
void main() {
  Set before = {1, 2, 3};
  Set after = before;
  
  after.add(50);
  print(before); // {1, 2, 3, 50}
  print(after); // {1, 2, 3, 50}
}
```
Listと同様に、参照元のbeforeが勝手に変わってしまう。

## 原因
dartにおいて、元のオブジェクトを参照して作られたListやMapなどは同じアドレスを持っているためである。
上のコードを使って言うと、**before = after**が常に成り立つ状態になっていると言える。 
この一連の動作はdartだけではなく、他の主要なプログラミング言語でも発生するようだ......
より詳しく知りたい方はこちらの記事に目を通してみるといいかも。
[値渡し・共有渡し・参照渡しを最小の例(5行)で端的に理解する](https://qiita.com/agajo/items/b21abdfb0baed340e897)

## 解決方法
Listどうしを=で結ぶのではなく、別アドレスのListを作成してあげると解決する。書き方は複数あるが、実行結果は全て同じ。
```dart
// toListメソッドを用いる
void main() {
  List before = [1, 2, 3];
  List after = before.toList(); // beforeを元に別のアドレスのリストを作成

  after[0] = 50;
  print(before); // [1, 2, 3]
  print(after); // [50, 2, 3]
}

// addAllメソッドを用いる
void main() {
  List before = [1, 2, 3];
  List after = [];
  after.addAll(before); 

  after[0] = 50;
  print(before); // [1, 2, 3]
  print(after); // [50, 2, 3]
}

// スプレッド演算子(...)を使う
void main() {
  List before = [1, 2, 3];
  List after = [...before];

  after[0] = 50;
  print(before); // [1, 2, 3]
  print(after); // [50, 2, 3]
}
```

### 補足
この参照元が変わってしまう問題はクラスのインスタンスでも発生する。
そちらについては[【Dart】オブジェクトをコピーするcopyWithの基本](https://zenn.dev/iwaku/articles/2020-12-15-iwaku)の記事の通りにすれば解決したので参考までに。
sessionとcookieの違いとは。

# 初めに。
sessionとcookieの違いが明確にわからなかったので、自分用のメモ&アウトプットとして残します。

### session
>セッション(session)は、webサイトを訪れた個々のユーザーのデータを個別に維持することによって、ユーザーとWebサーバー間の状態を管理する仕組みを提供します。セッションを利用することで、各ユーザー毎に、連続するリクエストにまたがって特定のデータを保持することで、ステートフル（状態を保持する）なWebサービスの構築が可能になります。

### cookie
>クッキー（cookie）とはデバイスでWebサイトのWebサーバーへアクセスすると付与される、小さなテキストファイルのこと。CookieにはIDやWebサイトの閲覧情報などが記録され、一時的にユーザー情報を保存することができる。

## それぞれの特徴
### sessionの特徴
* WebサーバーにWebコンテナの状態を維持するための情報を格納する。
* Webサーバーに保存されているクッキー（=セッションクッキー）
* ブラウザを閉じるか、サーバーからのSessionを削除した場合にのみ、削除がされるので、Cookieより比較的安全性がいい。
* 保存データに制限がない。
* 各クライアント固有のSession IDを付与する。
* Session IDでクライアントを区別して、各クライアントのニーズに合ったサービスを提供

### cookieの特徴
* 名前、Value、有効期限（保存期間）、パス情報で構成
* 何度もログインする手間がかからない
* 企業側はマーケティング施策に役立てることができる
* クライアントの合計300個のクッキーを保存することができる。
* 1つのドメインごとに20個のクッキーを持つことができる
* 1つのクッキーは4KB（=4096byte）まで保存可能

## どう違うか
クッキーはクライアント側のマシン（主にブラウザ）にのみ保存され、セッションはブラウザだけでなく、サーバーにも情報が保存されます。 
また、保存の期間にも大きな違いがあり、セッションはユーザーがブラウザを閉じるか、サイトを離れると情報が削除されます。 一方、クッキーには永続クッキーがあり、情報を保持し続けます。

* 保管場所
    * session->サーバー 
    * cookie->クライアント
    
* 保存形式
    * session->Object
    * cookie->テキスト
* 有効期限
    * session->正確な時点はわからない
    * cookie->設定時に任意の設定
* 容量制限
    * session->容量制限なし
    * cookie-> ドメインごとに20個
セキュリティシステムの設計

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回は具体的なセキュリティシステムの設計について更に詳しく調べてみましょう！
![インスタスライド_2023031801.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/9a97d889-2e14-2b9d-2170-3db2b7f053da.gif)


# ID／ＰＷによる認証
- アクセス管理
    識別（identify）
    認証（authentication）
    権限（authorization）

- 利用者IDの安全な運用管理方法
- パスワードの安全な運用管理方法
- パスワードの保管方法
# スマートフォンによる認証
- SMSを利用し、ワンタイムパスワードによる認証
- アプリ側でワンタイムパスワードを表示する認証
# シングルサインオン認証
他アプリケーションのログイン情報を利用する認証
- SNSの認証を使う
- 自社他アプリの認証を使う
# バイオマトリックス認証
- 指紋
- 顔認証
- 虹彩
- 声門
- 掌紋
- 網膜
等

# まとめ
-　ID/PWによる認証
-　SMSによる認証
-　シングルサインオン認証
-　バイオマトリックス認証
等がある

# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
三点を通る放物線の軸位置を求める問題

座標変数 $p$ に対する関数を $f(p)$ とする。位置 $p_1, p_2, p_3$ において関数 $f_1, f_2, f_3$ が与えられているとき、これを二次関数で補間して最大値を得る位置 $p_x$ を求める。

二次関数の形を $f(p) = f_x - a(p - p_x)^2$ とする。

区間 $[p_1, p_2]$ の平均傾きを計算すると$f_x$が消去できて
```math
\frac{f_2-f_1}{p_2-p_1} 
= -a \frac{ (p_2-p_x)^2-(p_1-p_x)^2 }{p_2-p_1}
= -a \frac{ [(p_2-p_x)+(p_1-p_x)][(p_2-p_x)-(p_1-p_x)] }{p_2-p_1}
= -a (p_1 + p_2 - 2p_x) 
```
区間 $[p_2, p_3]$ の平均傾きについても同様に

```math
\frac{f_3-f_2}{p_3-p_2} 
= -a (p_2 + p_3 - 2p_x) 
```

差し引くと $p_x$ が消去できて

```math
\frac{f_3-f_2}{p_3-p_2}-\frac{f_2-f_1}{p_2-p_1} = -a[(p_3+p_2)-(p_2+p_1)]
= -a (p_3 - p_1)
```
つまり
```math
a = \frac{1}{p_3-p_1} \left( \frac{f_2-f_1}{p_2-p_1}-\frac{f_3-f_2}{p_3-p_2} \right)
```

この式には除算があるが、分母はたとえば $p$ が等間隔という知識があれば、非常に小さくなるような病的ケースが起こりにくい。
いっぽう、$a$ が非常に小さいような病的なケースはここで見つけて弾いておかねばならんのかもしれない。

次に $p_x$ を求める。傾きの式から
```math
2p_x = p_1 + p_2 + \frac{1}{a} \frac{f_2-f_1}{p_2-p_1}
```
などとして $p_x$ が得られる。いちばん大きな除算のゼロ割懸念は、 $a$ の検査をしていればクリアされる。

最後に $f_x$ はたとえば２番節点から（何番でもよいのだが）

```math
f_x = f_2 + a(p_2 - p_x)^2
```
ShellScriptで多重起動防止を実装する

### 同僚が多重起動防止を実装するのに苦労していたので
以前書いた多重起動防止コードをブラッシュアップして公開します。
flockは使っていません。

``` bash: 多重起動防止.bash
#!/bin/bash
myDIR=$(cd $(dirname $0); pwd) # 自身のディレクトリを取得
LOCK_FILE=$myDIR/lock # 自身のディレクトリにロックファイルのファイル名を指定

# ロックファイルが存在していたらその中に書かれたLOCK_FILEのプロセスが走っているかどうか確認
if [ -r $LOCK_FILE ]; then
  # ロックファイルからPIDを取得
  pid=$(cat $LOCK_FILE)
  # 同じPIDを持つプロセスが走っているかどうか確認。
  # ロックファイルの中身が空の時にはエラーが発生してしまうので、-eオプションを付けていると停止します。注意！
  result=$(ps -p $pid 2> /dev/null | grep -v PID)
  if [ "$result" != "" ]
  then
      echo "Another process is running"
      exit
  fi
fi

# ここまでたどり着いたら実行していいのでロックファイルに自身のLOCK_FILEを書き込む
echo "$(date) Process started"
PID=$$
echo $PID > $LOCK_FILE

#
# 好きな処理を行う
#


# 処理が終了したらロックファイルを削除してロック解除
# 多重起動確認にPIDを確認しているのでロックファイルが残っていても問題ない
# ただし、PIDが一周して戻ってきた場合にはデッドロック発生の恐れあり
echo "$(date) Process finished"
rm $LOCK_FILE
```

### 以下、chatGPT先生の解説です
このスクリプトは、複数のインスタンスが同時に実行されないようにするためにロックファイルを使用する簡単な方法を提供しています。以下のような流れで動作します。

自身のディレクトリを取得して、ロックファイルのパスを作成する
ロックファイルが存在する場合は、ロックファイルに書かれたプロセスが実行中かどうかを確認し、実行中であればスクリプトを終了する
ロックファイルが存在しない場合は、ロックファイルを作成して自身のプロセスIDを書き込む
処理が完了したらロックファイルを削除してロックを解除する

### 実は同時に起動すると多重起動できてしまうそうです
コメントをいただきました。
確かに、PIDをファイルに書き込む前に次のを起動してしまうと多重起動できてしまうそうです。

chatGPT先生のコメントをよく読んでみたら確かにこんなことも書かれていました。
スクリプトの動作には問題はないように見えますが、いくつかの改善点があります。

ロックファイルを作成する前に、別のプロセスが既にロックファイルを作成している可能性があります。ロックファイルの作成に失敗する場合があります。ロックファイルを作成する前に、ファイルが存在しないことを確認する必要があります。
ロックファイルの作成に失敗した場合でも、スクリプトは処理を続行します。ロックファイルの作成に失敗した場合は、エラーメッセージを表示してスクリプトを終了する必要があります。
ロックファイルを削除する前に、ファイルが存在するかどうかを確認する必要があります。ファイルが存在しない場合は、削除する必要がありません。
プロセスIDをロックファイルに書き込む前に、ロックファイルを作成することを確認する必要があります。

### もう一つ別の多重起動防止コードです
こちらはネット検索したら見つけたコードですが、出展が分からなくなってしまいました。これだとPIDファイルを書く必要がないので便利ですが、a.outみたいな別のプログラムだけどファイル名が同じインスタンスが動いている場合は大丈夫かなぁと気になっています。
``` bash: 多重起動防止２.bash
myName=$0
PID=$$
running=$(pidof -x $myName)
echo "$myName '$PID'='$running'"
if [ "$PID" != "$running" ]; then
    echo "多重起動中"
    exit
fi
sleep 10
```
以下、chatGPT先生のコメントです
スクリプトは、プロセスIDを取得するために pidof コマンドを使用しています。このコマンドは、実行中のプロセスのPIDを取得するために使用されます。スクリプトが実行される前に同じスクリプトが起動されている場合、スクリプトは終了します。この方法は、単一のスクリプトを使用して、他のスクリプトでの多重起動も防止できます。

改善点としては、pidof コマンドがない場合にスクリプトが動作しないため、代替の方法を用意する必要があります。また、プロセスIDの比較は文字列として行われているため、PIDが数値ではない場合に不具合が生じる可能性があります。PIDの比較には、-eq オプションを使用するとよいでしょう。また、スクリプトが動作している間、pidof コマンドが実行され続けるため、余分なリソースを消費する可能性がある点にも注意する必要があります。
高画質画像を小さく表示すると波打つ件の対処【SwiftUI】【メモ帳アプリ】

# 課題
画面の横幅いっぱいに画像を表示するには、普通こういう風に書く
```swift
if let uiImage = photoUIImage {
    Image(uiImage: uiImage)
    .resizable()
    .scaledToFit()
    .frame(width: screenWidth)
}
```

しかし横向きで撮影した写真を表示すると、ただの白い石膏ボードの壁が<b>波打って表示されてしまった</b>。
![IMG_0EB8A325AA9A-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/68ea3d20-4a86-80fc-3a7e-5591fdafa219.jpeg)
図：開発中のメモ帳アプリのスクリーンショット


これは<b>大きな画像を無理やり小さな箱（画面幅）に収めたため</b>と考えられる。
このときの画面幅は`750`, 写真幅は `4032`だったので、5分の1以下に無理やり収めたことになる。

# 解決策
<b>画質を下げてから表示</b>すれば良さそうだと考えて対策したら、うまくいった。
![IMG_8C203C0E6EE4-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734189/f6c7054e-e780-fe06-e5f8-a6605d988b8f.jpeg)

どれくらい画質を下げるかという問題だが、上記の場合は下記計算式で違和感のない表示になった。
```
倍率　= 画面幅 / 写真幅 * 2
```
最初はシンプルに`画面幅 / 写真幅`を試したが、画質が荒く見えてイマイチだったので2倍した。<b>画面幅の2倍程度なら波打って見えることもないようである</b>。このあたりの最適値は端末や、もしかしたら人によっても違うかもしれない。

コードはこちら：
画質を変更するためのextensionを定義しておいて、
```swift
extension UIImage {
    func resized(rate: CGFloat) -> UIImage? {
        let canvas = CGSize(width: size.width * rate, height: size.height * rate)
        return UIGraphicsImageRenderer(size: canvas, format: imageRendererFormat).image {
            _ in draw(in: CGRect(origin: .zero, size: canvas))
        }
    }
}
```

表示するときに使う
```swift
if let uiImage = photoUIImage {
    let resizeRate: CGFloat = screenWidth / uiImage.size.width * 2
    Image(uiImage:
            uiImage.resized(rate: resizeRate)!
    )
    .resizable()
    .scaledToFit()
    .frame(width: screenWidth)
}
```

# 実装したアプリ
ちなみに、こちらは下記のメモ帳アプリ「Roamee」に実装しました。
よければ覗いてみてください。
https://apps.apple.com/jp/app/%E3%83%A9%E3%83%99%E3%83%AB%E3%83%8E%E3%83%BC%E3%83%88/id1644589126


# 参考にした記事
https://qiita.com/Tsh-43879562/items/4883c433bb7297019a1f

https://zenn.dev/yorifuji/articles/swiftui-imagepicker
【Linux】xargsコマンドで引数の最大数を指定する方法

## 引数の最大数を指定する
`-L 数値`を追記するとコマンドに一度に渡す引数の最大数を指定できます。

```zsh
find . -name "*.log" | xargs -L 1 rm -fv
```

上記の場合に`find`コマンドで3つのパスを取得したとすると以下のように実行されます。

```zsh
$ rm -fv ./path/to/sample1.log
$ rm -fv ./path/to/sample2.log
$ rm -fv ./path/to/sample3.log
```

なお`-L 数値`は改行ごとに1つの引数として扱います。

`-n 数値`でも引数の数を指定できますがこちらは`xargs`がコマンドに渡す引数の最大数を指定します。

```zsh
$ seq -s ' ' 10 | xargs -L 2 echo T
T 1 2 3 4 5 6 7 8 9 10

$ seq -s ' ' 10 | xargs -n 2 echo T
T 1 2
T 3 4
T 5 6
T 7 8
T 9 10
```
【Python】arm版 windows11のpipでつまづいた時の覚書

# pyproject.toml-based projectsエラー

## 環境
- M2 MacBook Air 2022
- VMWare Fusion
- arm Windows11
- Python3(3.11.3)

```
pip install https://github.com/kivy/kivy/archive/master.zip
```

上記コマンドを打つがエラーで止まってしまう。

# 対処方法

## Microsoft visual C++ Bild Toolsのインストールらしい

:::note warn
いきなりダウンロードが始まります。
[インストーラ](https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&cid=2030&passive=false)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416022/defb4741-3229-bc30-d51e-97a2a15ebced.png)

1. C++によるデスクトップ開発にチェック
1. - 右カラムのMSVC何ちゃらの二項目
   - Windows 11 SDK
   - Windows 用 C++ CMake ツール

上記をインストール

## パスを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416022/f2196697-caf8-d97d-590c-de5782583edb.png)

1. developer command prompt for VS 2022にてwhere clと入力
1. パスが表示されるのでそれをコピー

## システム環境変数の設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416022/ff25148c-4433-573b-e73d-349fddaa2372.png)

環境変数(N)...をクリック

## Pathを編集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416022/710d8f28-93b8-dae1-5716-463d2fd44102.png)

## 追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416022/35f3c7f7-e070-9d46-e506-a757b9bd2347.png)

## チェック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416022/98b7be6c-a505-490e-61ab-b47544eb3d33.png)

1. 先のコマンドプロンプトにてclと入力
1. Microsoft何ちゃらと表示されたらOK

# いきなりだけど以上

## 参考サイト
- [ポスグレウェブ](https://postgresweb.com/python-error-which-is-required-to-install-pyproject-toml-based-projects)
Money Lab Tokyo 立ち上げのご挨拶

武田FP事務所は創業4年を迎えることができました。これまでの事業内容は

・記帳代行業務・賃貸仲介業

がメインであり、ここまでの成長を遂げることができました。ご紹介でお客様と出会い今日に至りますが、今後は人も雇い事務所自体を大きくしていきたいと思っています。

今後、人を増やしていく上での武田FP事務所の課題として「属人的ではなく顧客を増やすこと」と捉えています。そこで、はWEBからの集客も目的としてオウンドメディアであるMoney Lab Tokyoを立ち上げました。

TwitterでもFPたけだとして活動しています。今年は多くの人と話す1年にしたいと思っているので、ぜひみなさん気軽にお茶しましょう！

いつでもご連絡をお待ちしています。

特に個人事業主に特化した記事を書いていますので、個人事業主の方はぜひご覧くださいね。

武田朋也
Money Lab Toyko 

https://fptakeda.com/
デジタルフォレンジック入門

# はじめに
デジタルフォレンジックについて書いていこうと思います。

# Who am i ?
しがないエンジニアです。

# この記事の想定読者

- デジタルフォレンジックについて知りたい人
- デジタルフォレンジックの入門的な本について知りたい人
- その他

# そもそもデジタルフォレンジックとは？
デジタルフォレンジックは英語でDigital Forensicsと記載されDFと省略されることが一般的です。ここでもその表記に倣うこととします。

デジタル・フォレンジック研究会のページには以下のようにDFの定義が記載されています。

```
インシデントレスポンス*や法的紛争・訴訟に際し、電磁的記録の証拠保全及び調査・分析を行うとともに、電磁的記録の改ざん・毀損等についての分析・情報収集等を行う一連の科学的調査手法・技術を言います。

*インシデントレスポンス＝コンピュータやネットワーク等の資源及び環境の不正使用、サービス妨害行為、データの破壊、意図しない情報の開示等、並びにそれらへ至るための行為（事象）等への対応等を言う。
```

https://digitalforensic.jp/home/what-df/

また技術と法律の両方に詳しくないといけなく、その法律は日本・海外で異なることも考えておかないといけません。俗にいうファストフォレンジックはDFの一つです。

デジタル・フォレンジック研究会から「証拠保全ガイドライン」が公開されています。2023年の2月あたりの公開のようですね。

https://digitalforensic.jp/wp-content/uploads/2023/02/shokohoznGL9.pdf

書籍も出版されています。『基礎から学ぶデジタル・フォレンジック　―入門から実務での対応まで―』が個人的にオススメです。

https://digitalforensic.jp/home/act/products/

以降ではファストフォレンジックについて単にDFと表記することにし、解説していきたいと思います。
なお、クラウドフォレンジックについてはここでは触れないこととします。フォレンジックする対象は物理環境にOSが入っている普通の端末等を想定しています。

# DFでよく使うツール

私がDFでよく使うツールです。なお、マルウェア解析についてはここではDFに含めないこととします。

**カービングツール**

CDIR-C

https://github.com/CyberDefenseInstitute/CDIR

Bulk Extractor

http://www.kazamiya.net/bulk_extractor-rec

最初になんらかの手段を使って、マルウェアに感染した端末（以降、感染端末）をVMなどのイメージに変換するわけですが、VMに変換した後で以下のツールを使うことでカービングが可能になります。CDIR-CでカービングできないアーティファクトについてはBulk Extractorが大変強力です。

当たり前かもしれませんが、感染端末の情報は極力いじらないようにします。Chain of Custodyを意識することが重要です。

**簡易フォレンジックツール**

FTK Imager

https://www.exterro.com/ftk-imager

※FTK Imagerはファイルの抽出や簡易的な復元が可能なため、まずはこれで十分だが、必ずしもデータが復元できるとは限らない点に注意。

**Windows専用ツール**

レジストリのパース

KaniReg（コンパイルが必要）

https://github.com/4n6ist/KaniReg

プレフェッチのパース

PECmd

https://ericzimmerman.github.io/#!index.md

※PECmdはこちらのブログでも紹介されています。

https://tsalvia.hatenablog.com/entry/2019/02/25/005319

メモリダンプのパース

KaniVola

http://www.kazamiya.net/KaniVola

NTFS関連のファイルをパース

https://sites.google.com/site/forensicnote/ntfs-log-tracker

ファイル復元ツール

Recuva

https://www.vector.co.jp/soft/winnt/util/se492225.html

※ファイルを復元するだけならRucuvaもそれなりに有用です。

**Windowsのイベントログを解析するツール**

Windowsのイベントログはバイナリファイルなので、扱うのが難しいです。一般的にはSplunkなどの有償のログ解析ツールを導入するのが基本なのですが、フリーのソフトもあります。以下はその一例です。

Chainsaw

https://github.com/WithSecureLabs/chainsaw

Hayabusa

https://github.com/Yamato-Security/hayabusa/blob/main/README-Japanese.md


# 認定資格

デジタル・フォレンジック研究会から、「デジタル・フォレンジック・プロフェッショナル認定（ＣＤＦＰ）」
（ＣＤＦＰ：Certified Digital Forensic Professional）という資格試験に申し込むことができます。

https://digitalforensic.jp/home/act/cdfp/

```
《資格区分》
①基礎資格（Basics）　　　      略称：ＣＤＦＰ-Ｂ
②実務者資格（Practitioner）   略称：ＣＤＦＰ-Ｐ
③管理者資格（Management） 略称：ＣＤＦＰ-Ｍ

※「実務者資格」取得には、「基礎資格」（CDFP Basics）の取得が必須条件となります。
「管理者資格」認定試験の実施は２０２３年度を予定しています。
```
こちらの資格については更新が必要とのことで
```
②実務者資格（Practitioner）   略称：ＣＤＦＰ-Ｐ
```
以下に記載がされています。

https://digitalforensic.jp/wp-content/uploads/2025/03/CPE_for_CDFP-P_20250324.pdf

継続要件については結構厳しいような気がします、、基本的にはIDF主催の勉強会に参加が必要とのことです。

# 最後に
DFはたくさんの端末があると感染端末を特定しづらいように思います。個人でDFをやる機会はCTFくらいしかないので、組織でどうやって効率よくできるか考えていきたいところです。

マルウェア解析については入門的ではありますが、こちらに記載しているので興味がある方は見てみてください。

https://qiita.com/forest_moririri/items/863d77a62f01550cff33
Google_Service_SheetsのInvalid JSON Payloadエラーの解消

自分用のメモです。。。。

- やりたいこと
    - DBのユーザ情報をJSON形式にしてスプシに出力したい
    - revolution/laravel-google-sheetsのGoogle_Service_Sheetsを利用してスプシにデータを送信
- エラー内容
    
    ```jsx
    {
      "error": {
        "code": 400,
        "message": "Invalid JSON payload received. Unknown name \"0\" at 'data.values[0]': Cannot find field.\nInvalid JSON payload received. Unknown name \"1\" at 'data.values[0]': Cannot find field.\nInvalid JSON payload received. Unknown name \"2\" at 'data.values[0]': Cannot find field.\nInvalid JSON payload received. Unknown name \"4\" at 'data.values[0]': Cannot find field.",
        "errors": [
          {
            "message": "Invalid JSON payload received. Unknown name \"0\" at 'data.values[0]': Cannot find field.\nInvalid JSON payload received. Unknown name \"1\" at 'data.values[0]': Cannot find field.\nInvalid JSON payload received. Unknown name \"2\" at 'data.values[0]': Cannot find field.\nInvalid JSON payload received. Unknown name \"4\" at 'data.values[0]': Cannot find field.",
            "reason": "invalid"
          }
        ],
        "status": "INVALID_ARGUMENT",
        "details": [
          {
            "@type": "type.googleapis.com/google.rpc.BadRequest",
            "fieldViolations": [
              {
                "field": "data.values[0]",
                "description": "Invalid JSON payload received. Unknown name \"0\" at 'data.values[0]': Cannot find field."
              }
            ]
          }
        ]
      }
    }
    ```
    
- 調査
    - encodeが違う説？
        
        ⇨utf8にencodeしても解決せず
        
    - content-typeをapplication/jsonにしないといけない？
        
        ⇨googleAPIが自動でやってくれてるみたい。オプションで指定も実装されてない。
        
    - nullをそのままJSONにしようとしてる？
        
        ⇨これでした。
        
- 原因
    - nullをそのままJSONとして出力してる
- 解決法
    - array_map等でnullは空文字に変換
モジュール結合度

# モジュールとは
ある機能を独立して作成し、必要なときに他のプログラムで利用できるようにしたもの。

## モジュール結合度
モジュール同士の関連性の度合いを`モジュール結合度`という。一般に、モジュール結合度が弱いほど個々のモジュールの独立性が高く、保守しやすくなる特徴がある。

モジュール結合度の強い順に並べたのが以下の表。
|モジュール結合度の種類||
|-|-|
|内容結合|一方のモジュールが、他のモジュール内部を直接参照したり、他のモジュール中に分岐する。|
|共通結合|複数のモジュールが共通のデータ領域を共有している。|
|外部結合|モジュール同士が同じ大域的な変数を参照している。|
|制御結合|一方のモジュールが、他のモジュールの内部ロジックをパラメタで制御する。|
|スタンプ結合|モジュール同士が同じ非大域的な変数を参照している。|
|データ結合|一方のモジュールが、必要なデータ項目だけをパラメタとして他のモジュールに渡す。|
【Kotlin】サンプルコードから学ぶnull安全

KotlinとJavaのサンプルコードからnull安全について学ぶ

## Java

```java
public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = null;
        String name = person.getName(); // NullPointerExceptionが発生
        System.out.println("Name: " + name);
    }
}
```

1. Personクラスのインスタンスをnullで初期化
1. getName()メソッドを呼び出して、その戻り値をname変数に代入

:::note alert
nullのオブジェクトに対してメソッドを呼び出したため、`NullPointerException`が発生
:::

## Kotlin

```kotlin: Kotlin
class Person(val name: String)

fun main() {
    val person: Person? = null
    val name = person?.name
    println("Name: $name")
}
```

1. **null許容型**(?)を使用して、Personクラスのインスタンスをnullで初期化
1. **セーフコール演算子**(?.)を使用して、person変数がnullでない場合にnameプロパティにアクセスし、その値をname変数に代入

:::note info
null許容型とセーフコール演算子を使用することで、nullに対するエラーを回避することができる
:::

また、**エルビス演算子**(?:)を使用することで、nullの場合に代替値を設定することができる

```kotlin
class Person(val name: String)

fun main() {
    val person: Person? = null
    val name = person?.name ?: "No name"
    println("Name: $name")
}
```

person変数がnullの場合、name変数には「No name」という文字列が代入される

## 参考文献

[Kotlin Docs | Kotlin Documentation](https://kotlinlang.org/docs/null-safety.html)
レガシーなインフラを改善するつもりが組織の悪者になる話

# はじめに

みなさんの職場に古いインフラはありますか？ありますよね。

- SVN,CVS...ですらないファイル名駆動のバージョン管理
- id/pass不明でログインできない稼働中のビルドサーバ
- WindowsServer200X
- アンタッチャブルな巨大シェルスクリプト
- ...

小規模の会社でサーバサイドを齧っていると、
「クラウドネイティブ」という言葉とは無縁の世界で仕事をすることがあります。

え、そんなこと一度もない？
これからもあなたの幸運が続きますように。

# 改善活動スタート

さすがに辛いので、改善を視野に入れて地道に調査をするわけです。
えいやで滅ぼしたい気持ちをグッと抑えます。

- 予算確保（のためのリスクの整理）
- 利害関係者の洗い出し
- 業務のフローで必須なインフラのリストアップ

いざ置き換える算段がついたら、工事の計画を練ります。

- 業務の影響確認
- バックアップ
- 移行期間の周知

等々。

# 現実と向き合う

置き換えの話が本格化したタイミングで、顔色を変える方が出てきます。

そんな話だと思ってなかった、聞いてない、炎上中なので今だけはやめてくれ。

たしかに言葉が足りていなかったかもしれませんね。すみません。
ああ、ではそのサーバは今回は対象外ということで。

次からはメール、チャットそれぞれで３回はリマインドしよう。

# レガシーインフラの守護神へ

改善計画は骨抜きになりましたが、調査のおかげで誰よりもレガシーインフラに詳しくなりました。

あるとき、死んだ顔をした他のエンジニアがふらふらとやってきます。
どうやらビルドができずに困っている様子。

ちょっとしたサーバのメンテを頼まれる私。そしてなぜかできてしまう私。
「完了しました」のチャットに「神」絵文字が乱舞します。

このとき、私はレガシーインフラの守護神になったのです。

# 月日が流れ

後から入ってきた中途さん。
インフラに心得があるようで、我が社のレガシーインフラを見るや

「こんなインフラの担当者は誰ですか」

ミイラ取りがミイラになるという言葉は、
「ミイラに同調した」だけじゃなく
「長いこと帰ってこないと、ミイラとみなされる」もあるよな、と
どうでも良いことを思いました。

# 教訓

レガシーインフラの改善そのものが難しい、という問題もありますが、
レガシーの呪いが自分に集約するので**ヘイトを一身に受ける存在になり得ます**。

複数人で作業できるなら問題ないものの、私の環境のように人手が足りない場合
強権的に進めないと人間関係で不利になりかねないので、お気をつけください。
【NestJS】新規プロジェクト作成時にエラーで失敗する

## 概要
NestJS でプロジェクト作成した時にエラーが発生したので、その時の解消手順の備忘録。

## 事象
NestJS のプロジェクト作成をする。

```zsh
# プロジェクト作成
$ nest new demo-nestjs

▹▹▹▸▹ Installation in progress... ☕

# 途中で失敗
Failed to execute command: npm install --silent
✖ Installation in progress... ☕
🙀  Packages installation failed!
In case you don't see any errors above, consider manually running the failed command npm install to see more details on why it errored out.
                                         
                          Thanks for installing Nest 🙏
                 Please consider donating to our open collective
                        to help us maintain this package.
                                         
                                         
               🍷  Donate: https://opencollective.com/nest
                                         

```

エラーメッセージにこう書いてある。
```
In case you don't see any errors above, consider manually running the failed command npm install to see more details on why it errored out.
```
👉 訳：『失敗したコマンド npm install を手動で実行して、エラー理由の詳細を直接確認してね』

プロジェクト作成した時に、内部で `npm install --silent` してくれてるようなので、じゃあ、プロジェクトの中で自分で `npm install` してみる。

```zsh
# npm インストール
$ npm i

npm ERR! code EACCES
npm ERR! syscall open
npm ERR! path /Users/ユーザ名/.npm/_cacache/index-v5/83/20/xxxxx
npm ERR! errno EACCES
npm ERR! 
npm ERR! Your cache folder contains root-owned files, due to a bug in
npm ERR! previous versions of npm which has since been addressed.
npm ERR! 
npm ERR! To permanently fix this problem, please run:
npm ERR!   sudo chown -R 501:20 "/Users/ユーザ名/.npm"

npm ERR! A complete log of this run can be found in: /Users/ユーザ名/.npm/_logs/2023-04-11T14_51_42_160Z-debug-0.log
```

👉 ラストのログの中身でエラー理由が書いてました。

## 原因
どうやら管理者権限が無いからみたい。
`EACCES: permission denied, open '/Users/ユーザ名/.npm/_cacache/index-v5/83/20/xxxxx'`

```text:Users/ユーザ名/.npm/_logs/2023-xx-xx-xxx.log（エラー発生部分）
2707 error code EACCES
2708 error syscall open
2709 error path /Users/tommy/.npm/_cacache/index-v5/83/20/xxxxx error errno EACCES
2711 verbose FetchError: Invalid response body while trying to fetch https://registry.npmjs.org/path-scurry: EACCES: permission denied, open '/Users/ユーザ名/.npm/_cacache/index-v5/83/20/xxxxx'
    at /Users/ユーザ
```

## 解決策・対策

方法 ❶ そもそも自分に root 権限付ける

方法 ❷ 途中まで作成済みのプロジェクトの中で sudo つけて npm インストールする
```zsh
$ cd demo-nestjs

$ sudo npm i
```
👉 ③ よりこっちの方が良い

方法 ❸ sudo つけてプロジェクト作成する
```zsh
$ sudo nest new demo-nestjs
```
👉 こっちはオススメしない。生成されたソースがすべて管理者権限になって通常コマンドでは編集できなくなるから

方法 ❹ 奇策。一旦 GitHub にソースだけあげて、もっかいローカルにクローンする。
👉 ローカルの環境設定次第なので人による。ただ、実際、私はこれでやった。

上記でうまくいった。

確かに、そもそも Nest CLI を入れる時点で、`npm` コマンドに `sudo` 付けないと入らなかったから怪しいとは思ってた。（npm に管理者権限が無いのは、nodebrew で入れた Node.js だからなのかは不明）
ホスティングしているGISデータをRe:Earthで表示

![スクリーンショット 2023-04-12 0.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/79d83607-8f1f-4e24-3829-4623e2fe5e47.png)

前回の続き

https://qiita.com/magn01ia/items/f0d0a2fff1a898c009be

前回はRe:Earthを使用してGitHubで試験配信されているPlateauの建物データ、地形データを読み込んだところまで、次は同じようにホスティングされているデータを表示。  

表示させるデータは以前作成していたGTFSデータの停留所ポイントデータのgeojson。　　

![スクリーンショット 2023-04-12 0.09.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/ff23f949-4d5d-bb50-e14e-70dff362f9e1.png)

一番右側のアイコンをマップ内にドラッグして・・・  

![スクリーンショット 2023-04-12 0.11.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/946d68d1-5210-a9cd-000a-243d913d68c5.png)

ファイルURLにGitHubPagesにホストしているデータのURLを入力。  
地表面に固定はチェックを入れないと、何らかの地形データを使用している場合、地形に埋もれて見えなくなってしまうので注意、CesiumのclampToGroundの部分？

![スクリーンショット 2023-04-12 0.15.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827162/803671ec-2ce1-4074-3831-39b08b1d0dc9.png)

表示されました、URLで指定できるのでデータ管理や更新の幅が広がります。
文学部卒社会人が大学院で人工知能研究に挑戦〜１日目〜

過去3ヶ月間のPythonプログラミング講座に励んだだけでしたが、会社の支援が得られることもありもっと学んでみたいという軽いノリで大学院に入学してしまいました。
仕事をしながら平日夜間と土曜日に授業をうけ、2年で卒業の予定です。
平日夜は１コマです。自身の復習とこの軌跡が文系から理系転向するような同様の経験をする人の参考になればと考えて記録をすることにしました。


記念すべき初日の授業は機械学習の授業でした。

内容：
・機械学習の歴史
・機械学習とは
・機械学習アルゴリズム紹介

各項目でのポイントをかいつまんで紹介します。

■機械学習の歴史
・前史として、多くの数理的学習法の基になっているベイズの定理の発見（1760年くらい）が重要なエピソードとして挙げられるようです
・以降統計的なデータ解析が行われるようになっていき、19世紀後半には統計学が確立されていきました
・戦後人間の脳の構造を模したニューラルネットワークの概念が流行り始めてブームとなりますが、1970年ごろまで続いたブームも当時の技術では単純な問題しか解くことができないという風潮となりブームが終わります（AIの冬）
・一方統計的手法は進歩を続け、計算機能力を背景に非線形な統計モデリングが本格化されていき現在でも使われるようなアルゴリズムが出てきました。また、さまざまな方法を組み合わせたアンサンブル法が発展していきます
・１９８０年ごろ、またニューラルネットワークのブームが起こりますが、また１９９０年ごろに終了します。
・そして２００５年ころのディープラーニングの発見以降、現在に至るまでニューラルネットワークはAIにおける主役となっています。その背景として急増するデータや高度な処理が行える機器の出現によりより高度な活用が可能になったことがあげられます。※ChatGPTなど本当にすごい技術が出てきてますよね


■機械学習とは
最近よく使われるデータサイエンスや機械学習などの概念の整理として授業でも紹介されたDrew Conwayのベン図がわかりやすかったので紹介します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133493/93f6e5c8-2630-2367-0377-f9d0ac5cca67.png)

・赤：コンピュータサイエンス
・黄緑：数学・統計
・青緑：実践的専門知識

・機械学習は赤と黄緑が重なる部分
・データサイエンスは3点の重なる部分
※統計的なアプローチのない古典的なソフトウェアや、コンピュータを利用しないデータ分析の部分も面白いですね

機械学習は業務分野等の専門知識がなくともさまざまな分野・シーンで汎用的に活用できる技術で、データサイエンスはそこに専門知識を付け加えたものであると今日時点では理解をしました。※誤ってたらごめんなさい。また、先生の話では機械学習とデータサイエンスはここまで厳密に分かれているものでもないからおおおよそのイメージとして捉えれば良いとのことですが、大事なのは現在は統計的かつ技術を活用して専門分野において活躍できる人材に近づくために頑張ろうというところかと思います。


機械学習とは、コンピュータ上で経験（データ）を知識・問題解決能力に変換が可能なプログラムを作成することで、すでに学んだ問題(訓練データ)を解けることではなく、見たことのない新しい問題・データにも正しく推論を行える（汎化）ことが重要になるとのことです。

帰納推論するということですが、帰納は合理的正当化が不可能と言われているようです※日本のカラスは黒い、アメリカのカラスは黒い、中国のカラスも黒いから全てのカラスは黒いっていっても全部のカラスを確認してないから絶対に黒以外のカラスがいないとは言い切れない、たぶんそんな感じ。https://ja.wikipedia.org/wiki/%E5%B8%B0%E7%B4%8D

考えるモデル・学習法に何の偏向（バイアス）も持たせないということは汎化ができないということになります。人間の与える帰納バイアスによって普遍的なパターンの獲得や、未来への予測が可能になります。

つまり人間の仮説や仮定を持った方向性付けをなくして汎化したモデルはつくれないけれども、バイアスがかかりすぎると恣意的なモデルができてしまうのでバランスの取れるいいところを探しましょうということですね（その塩梅が難しいのでしょうね）

■機械学習アルゴリズムの紹介
最近傍法とK近傍法

・最近傍法
クラスAとBのデータが存在し、その中に未知データがある場合、そのデータに対し最も近いものと同じクラスであると予測
→ノイズデータに弱い

・K近傍法
クラスAとBのデータが存在し、その中に未知データがある場合、そのデータに対し周辺のK個のデータの多数決で予測
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133493/fe082357-f61b-0853-9675-030de93216b3.png)
→Kの数が小さければ分散が小さく最近傍法同様ノイズの影響を受けやすい、Kの数が大きいと分散が小さくノイズの影響は受けにくいが、バイアスが大きくなってしまうのでバランスが大切（やはりその塩梅が難しいのでしょうね）

■その他
本日の学習時間
・予習：1.5H
・授業：1.5H
・復習：1.5H
計4.5H


いきなり難しくてつらいですが、頑張っていきます。
Swift ボタンが押された時に透明度を変える方法

### :neutral_face: swiftでボタンが押された時に透明度を変えるにはどうすればいい？


### :man_tone4: Swiftでボタンが押されたときに透明度を変えるには、UIButtonのアクションを設定して、透明度を変更する関数を作成します。以下は、その方法の一例です。

1. ViewController.swiftを開きます。
2. ボタンのアクション関数を追加します。

```php
//swift code
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myButton: UIButton! // ボタンのアウトレット接続を追加

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func buttonTapped(_ sender: UIButton) {
        sender.alpha = sender.alpha == 1.0 ? 0.5 : 1.0 // 透明度を切り替える
    }
}

```
3 . Interface Builderでボタンを作成し、ViewControllerにアウトレット接続してmyButtonに接続します。
4 . ボタンのアクションを設定し、buttonTapped関数に接続します。

これで、ボタンが押されたときに透明度が変わるようになります。この例では、透明度が1.0（完全に不透明）の場合は0.5に、それ以外の場合は1.0に切り替えていますが、必要に応じて透明度の値を変更できます。
JUnitテストで標準出力/標準エラー出力の内容をテストするためのサンプルコード

## テスト対象のコード
```Java
public class Sample {
    public static void main(String[] args) {
        if (args.length == 1){
            System.out.println("引数は" + args[0] + "です。");
        } else {
            System.err.println("引数を1つ指定してください。");
        }
    }
}
```

## テストコード
```Java
public class SampleTest {

    @Test
    public void test() {
        // 標準出力のデフォルトの出力先
        PrintStream defaultPrintStream = System.out;
        // 標準エラー出力のデフォルトの出力先
        PrintStream defaultErrorPrintStream = System.err;

        // 出力先を変更
        ByteArrayOutputStream stdOut = new ByteArrayOutputStream();
        ByteArrayOutputStream errOut = new ByteArrayOutputStream();
        System.setOut(new PrintStream(stdOut));
        System.setErr(new PrintStream(errOut));

        // 改行コードを取得
        String lineSeparator = System.getProperty("line.separator");

        // 標準出力の内容をテスト(1)
        Sample.main(new String[]{"test1"});
        assertEquals("引数はtest1です。" + lineSeparator, stdOut.toString());

        // 出力内容をリセット
        stdOut.reset();

        // 標準出力の内容をテスト(2)
        Sample.main(new String[]{"test2"});
        assertEquals("引数はtest2です。" + lineSeparator, stdOut.toString());

        // 標準エラー出力の内容をテスト
        Sample.main(new String[]{});
        assertEquals("引数を1つ指定してください。" + lineSeparator, errOut.toString());

        // 出力先を戻す
        System.setOut(defaultPrintStream);
        System.setErr(defaultErrorPrintStream);
    }
}

```
Leetcode 2390. Removing Stars From a String

https://leetcode.com/problems/removing-stars-from-a-string/

```java
class Solution {
    public String removeStars(String s) {
       StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '*') {
                sb.deleteCharAt(sb.length() - 1);
            } else {
                sb.append(s.charAt(i));
            }
        }
        return sb.toString();
    }
}
```
【2023年版】C++ IDE(開発環境)インストール手順

WindowsでC++のコンパイル環境(IDE)をインストールする手順です。管理者権限が必要です。

<b>QtCreator(C++ IDE)が使えるようになるとともに、gcc, g++, cmake, make, mingw32-make, ninja 等がコマンドラインから使えるようになります。</b>

## QtCreator の特長

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/80b9ad95-3d69-e228-47cc-ef9cd67edd52.png)

QtCreator には以下のような優れた特徴があります。

* 高性能なエディタ
    * シンタックスハイライト機能
        * 文脈依存のコード補完機能
        * 入力中の静的コードチェック
        * GUI のデザイン機能
    * 高機能なナビゲーションツール
        * ファイル、クラス、メソッド、ドキュメント等への高速なアクセス
        * シンボルの追跡
    * ビルド、実行、デバッグ機能
    * ソースコード管理ツールに対応
    * プラグイン形式による拡張が可能
    * クロスプラットフォームで動作するため、どのプラットフォームでも同じ操作で開発ができる
    * 軽快に動作

## DevPack のダウンロード

<b>DevPack は、QtCreator と mingw-winlibs を組み合わせて簡単にインストールできるようにしたものです。</b>

[https://github.com/DeveloperPackage/DevPack/releases/latest](https://github.com/DeveloperPackage/DevPack/releases/latest) にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/509dc175-c9ee-f2f3-4a13-fbd0aa55499e.png)

## devpack-x64-1.0.2 の実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/581a3e5b-08fe-5d02-e4f2-df9a8b74587e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/73665c99-13a0-b6a8-fe5d-5b80a78a62d2.png)

インストールが終わったら、デスクトップの「QtCreator」アイコンをダブルクリックして起動できます。起動後は QtCreator のアイコンをタスクバーから右クリックしてピン止めしておくといいでしょう。

デスクトップにアイコンがない場合は、Windowsキーを押して「qtc」と入力すれば「QtCreator」のアイコンが出てくるでしょう。

## QtCreator の「キット」の確認

QtCreator が起動したら「編集」⇒「Preferences」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/113ef249-ece3-16b6-30be-6c8e69b37ca1.png)

左のリストからキットを選択して「デスクトップ(既定)」という項目があるのを確認します。確認したら「キャンセル」で閉じます。
(興味がある人は「デスクトップ(既定)」をクリックして表示される設定項目をご覧ください)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/10faad3c-ea14-97cd-09b4-7457295af110.png)

これでインストールの確認ができました。

## コマンドラインからの実行

DevPack をインストールすると `C:\DevPack\mingw-winlibs\bin` にパスが通って、gcc, g++, cmake, make, mingw32-make, ninja 等がコマンドラインから使えるようになります。

```
C:\Users\user>where g++
C:\DevPack\mingw-winlibs\bin\g++.exe

C:\Users\user>where cmake
C:\DevPack\mingw-winlibs\bin\cmake.exe

C:\Users\user>where ninja
C:\DevPack\mingw-winlibs\bin\ninja.exe
```
----


## 使い方に関して

使い方については以下の記事をご覧ください。

https://qiita.com/javacommons/items/2bd0456a4f25f99c68b9

また、Visual C++ でもソースを編集したりビルドしたりする場合は以下の記事もご覧ください。

https://qiita.com/javacommons/items/45e880ea5408a97704fa

読んでいただきありがとうございました。

それでは！
[AWS Q&A 365][Macie]AWSのよくある問題の毎日5選 #26

# 1. Amazon Macieとは何ですか？
回答：Amazon Macieは、機械学習とパターンマッチングを使用して、Amazon S3内の機密データを発見および保護するデータセキュリティおよびプライバシーサービスです。

# 2. Amazon Macieを有効にするにはどうすればよいですか？
回答：Amazon Macieを有効にするには、ユーザーガイドの「はじめに」セクションに記載されている手順に従う必要があります。これらの手順には、Amazon Macieを有効にする、機密データの検出結果用のリポジトリを構成する、サンプルの検出結果を調べる、機密データを発見するためのジョブを作成する、および検出結果をレビューするなどが含まれます。

# 3. Amazon Macieはどのような種類の機密データを発見できますか？
回答：Amazon Macieは、資格情報、金融情報、個人の健康情報（PHI）、および個人を特定する情報（PII）など、さまざまな種類の機密データを発見できます。また、カスタムデータ識別子を作成して、他の種類の機密データを発見することもできます。

# 4. Amazon MacieはどのようにしてAmazon S3データセキュリティを監視していますか？
回答：Amazon Macieは、S3オブジェクトの内容を分析し、機密データを特定することにより、Amazon S3データセキュリティを監視しています。また、データセキュリティの統計情報を表示し、S3セキュリティの状態を評価できるダッシュボードも提供しています。

# 5. Amazon MacieをAWS Organizationsと統合するにはどうすればよいですか？
回答：複数のアカウントをAmazon Macieで管理するには、AWS Organizationsを使用することができます。これにより、組織を作成および管理し、管理者アカウントを指定し、メンバーアカウントを管理することができます。また、サービス連携ロールとAWS管理ポリシーを使用して、Amazon Macieリソースへのアクセスを管理することもできます。
[AWS Q&A 365][Macie]Daily Five Common Questions #26

# 1. What is Amazon Macie? 
Answer: Amazon Macie is a data security and privacy service that uses machine learning and pattern matching to discover and protect sensitive data in Amazon S3. 

# 2. How do I enable Amazon Macie? 
Answer: To enable Amazon Macie, you need to follow the steps outlined in the Getting Started section of the user guide. These steps include enabling Amazon Macie, configuring a repository for sensitive data discovery results, exploring sample findings, creating a job to discover sensitive data, and reviewing your findings. 

# 3. What types of sensitive data can Amazon Macie discover? 
Answer: Amazon Macie can discover a variety of sensitive data types, including credentials, financial information, personal health information (PHI), and personally identifiable information (PII). It also allows you to create custom data identifiers to discover other types of sensitive data. 

# 4. How does Amazon Macie monitor Amazon S3 data security? 
Answer: Amazon Macie monitors Amazon S3 data security by analyzing the content of S3 objects and identifying sensitive data. It also provides a dashboard that displays data security statistics and allows you to assess your S3 security posture. 

# 5. How can I integrate Amazon Macie with AWS Organizations? 
Answer: To manage multiple accounts with Amazon Macie, you can use AWS Organizations. This allows you to create and manage an organization, designate an administrator account, and manage member accounts. You can also use service-linked roles and AWS managed policies to manage access to Amazon Macie resources.
ログコンテナのバージョン管理の為に、ecspresso v2のSSMパラメータストア参照を利用してみた

## はじめに

コンテナデプロイツールである`ecspresso`ですが、ecspresso v2が昨年末にリリースされました！

ecspresso handbookでも紹介されている**ecspresso v1とv2の変更点**の中でも、今回はSSMパラメータストア参照を利用しました。

<https://zenn.dev/fujiwara/books/ecspresso-handbook-v2/viewer/v1-v2>

## 何のために利用したか？

ECSのログコンテナ用fluent-bitのイメージですが、

- 検証環境で`stable`タグ指定で運用し、ログ転送に問題が無いかをテスト
  - 具体的には`public.ecr.aws/aws-observability/aws-for-fluent-bit:stable`の形で指定
- ログ転送に問題が無い場合、動作環境用のSSMパラメータストアの値を`stable`タグのイメージURIに変更
- ecspressoで動作環境にデプロイする際に、SSMパラメータストアのfluent-bitの新規イメージURIを取得し、デプロイ

といった形式をとる事で、**お手軽に実現可能なfluent-bitのバージョンアップの仕組み**を構築しました。
ecspressoを元々デプロイ時に利用している事もあり、今回のアップデートは非常に助かりました！

## パラメータの作成

- 以下の形でパラメータを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411902/203a0b48-c171-1b7a-f59e-8c33dc4b123f.png)

## ecspressoの設定ファイルにSSMを利用する為の設定を追記

- `ecspresso.yml`にssmについての設定を追記します。

```ecspresso.yml
region: ap-northeast-1
cluster: cluster-name
service: service-name
service_definition: ecs-service-def.json
task_definition: ecs-task-def.json
timeout: "10m0s"
plugins:
  - name: ssm
```

- `ecs-taskdef.json`のlogrouterコンテナのimage指定をSSMパラメータストア参照に変更

```ecs-taskdef.json
"image": "{​​{​​ ssm `/ecs/log-agent/fluent-bit-image-uri` }​​}​​"
```

## デプロイ実行用のIAMロールの記載

- 以下ポリシーをecspressoでのデプロイ実行用IAMロールへと付与します。

```json:Policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:Get*"
            ],
            "Resource": "arn:aws:ssm:XXXXXXXXXX:XXXXXXXXXX:parameter/ecs/log-agent/fluent-bit-image-uri"
        }
    ]
}
```

## おわりに

- SSMパラメータストア参照＆ecspressoのおかげで、便利にログコンテナのバージョン管理が出来そうです。
【iOS】ロック画面のWidget実装時に、画像を設定をする際に詰まった点


https://dev.classmethod.jp/articles/ios-lock-screen-widget/

ロック画面のウィジェット実装に関しては、こちらの記事を参考にいたしました。
大変参考になりました。

こちらの記事を参考に、自分で用意したアイコン画像を、ロック画面ウィジェットに設定しようとした際にうまく表示されなかったので、ここに書き記す。

まず、上記記事の実装から、変更した点を以下に記す。

記事の中では、ロック画面ウィジェットの.accessoryCircularの部分で、Appleで用意されている画像(Icon)を使用います。そのため、自身で作成した画像を実装します。

```swift:LockScreenWidget.swift
struct LockScreenWidgetEntryView : View {
    @Environment(\.widgetFamily) var family

       var entry: Provider.Entry

       var body: some View {
           switch family {
           case .accessoryInline:
               Text("インライン")
           case .accessoryCircular:
//　この部分を変更　↓↓↓↓↓↓↓↓↓↓↓↓↓↓
              AppIconView()
           case .accessoryRectangular:
               RectangularView()
           default:
               Text(entry.date, style: .time)
           }
       }}
struct AppIconView: View {

    var body: some View {
//　この部分を変更　↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        Image("WidgetIcon")
            .resizable()
            .scaledToFit()
    }
}
```
ですが、シュミレーターを起動すると、うまく表示されません。

よくよくファイルをみていると、
![スクリーンショット 2023-04-11 22.51.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799713/464d29a1-306f-b2e7-e5ba-ddca2ab62a59.png)

Assets.xcassetsファイルが２つありました。
ロック画面ウィジェットに画像を設定したい場合は、LockScreenWidgetフォルダ内のAssets.xcassetsに画像を追加する必要がありました。

画像を追加すると、
![スクリーンショット 2023-04-11 22.54.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799713/5ec94b69-a175-13bb-0eb2-2dc8177abf13.png)

ロック画面に画像を設定することができました。


＊追加内容

![スクリーンショット 2023-04-11 22.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799713/0455ed42-71d0-99bb-8d2e-ee4819d1fe21.png)
設定した画像が、背景に薄い赤色で、アイコンが白色になっています。
そのためか、ロック画面で表示された際に、背景の色と、アイコンの白が強くなり、ロック画面ウィジェットとしては見づらくなっています。

そのため、画像の配色を反転させることにしました。
https://tech-lagoon.com/imagechef/image-negate.html?cache=20230411225823&reloaded=true
のホームページにアイコン画像を貼り付けて、下の画像を生成して、再度追加した。

![スクリーンショット 2023-04-11 23.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799713/36d544be-7a9e-5867-8fec-6aad77da5b4b.png)

上記により、下の画像のようなロック画面ウィジェットを作成することができました。
![スクリーンショット 2023-04-11 23.04.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/799713/444ca66c-e038-a15b-1c91-92251c01e668.png)

余談。
シュミレーターのショートカットキーとして、
Command + L　でシュミレーターをロックすることができます。

以上です！！

他にも良い方法があれば、コメントいただけると大変うれしいです。
良かったと思ったら、いいねやTwitterのフォローよろしくお願いいたします！

https://sites.google.com/view/muranakar
個人でアプリを作成しているので、良かったら覗いてみてください！
ChatGPTと倫理規定　いつの世も抜け穴に人は入り込む

# 黎明期あるある
　昨今巷を賑やかしているChatGPTくん。僕の相方でもありますが、どんなものも黎明期というのは、色々なルールが整備されきれていないこともあって、混沌としていますよね。
　黎明期においては、社内倫理規定であったりもっと大きな枠組みでの倫理規定が十全に整備されていない事を良いことに、様々な輩があれやこれやと駆け抜けていくのです。
　つまり僕が言いたいことは、それ２０年前くらいにあったあった！　みたいな話ですね。

# インターネッツ黎明期振り返り
　今から２０年以上もの昔、世はWindows95に始まるインターネッツが爆発的に広まった頃である。
　テレホマンがピーガーガーしている時に、僕はケーブルテレビ最高最高とのたまっていた訳です。~~うはテレホマン乙w w~~

:::note info　
この頃どんなことがあったかというと
1. アンダーグラウンドサイト（通称アングラサイト）が蔓延り、そこでは倫理を無視した催しが行われていたのである。
1. そんなアングラ世界に蔓延っていた厨について紹介しよう。
    1. 何かしらのソフトウェアを勝手に掲示板に添付した共有厨
    1. IP晒し版でIPを晒し合いノーガードで罵り合う戦闘厨
    1. ファミコンやスーファミのゲームを巧妙に暗号化した共有厨
    1. 爆弾の作り方などをシンプルに説明したテロリスト量産厨
    1. 足跡を消すためにプロキシサーバを経由しまくる串厨
    1. アップロードスペース確保の為に無料メアド大量取得厨
    1. MP3ファイルを勝手に掲示板にアップロードする共有厨
    1. ホームページにMIDIファイル再生機能を付け訪問客に電波を送りつける洗脳厨
    1. 余りに無頼漢が多すぎた為に生まれたボランティアであるネチケット厨
:::
　枚挙に暇がないですね。もっとおりましたね。
　これらはそこから徐々に法整備も進んでいって、今なら一発アウトな内容ばかりでは無いでしょうか。ネチケットは問題ないか。
　この時代はインターネット上での犯罪行為についてやっぱり教育がされていないこともあって、ネットリテラシーが無いんですよね。~~コンピュータ悪のマニュアルが悪いんじゃないでしょうか！~~
　あぁ、これはダメだよなぁって判断を常に持つことが大事だなぁとして振り返りとします。

# ChatGPT黎明期に起こっていること
:::note warn
今どんなことが起きてるのかというと
1. ChatGPTを利用して脳みその2台持ち（片方超優秀でも巧妙な嘘もあるよ）が大流行しているのである。
1. そんなChatGPT界隈に蔓延っている厨について紹介しよう。
    1. 何かしらの論文をAIに書かせた愛力本願厨
    1. 業務上のロジックをAIに書かせた我愛部委託厨
    1. Qiitaの記事何書こうかなぁ何ていうのをAIに考えさせる愛デア委託厨
    1. 架空の存在をAIに作らせて自分の相手を強制させる愛活厨
:::
　愛に溢れていますね。もっとおるんでしょうね。
　これからはここから徐々に法整備が進んでいって、この先アウトな内容になっていくことでしょう。愛活は問題ないか。
　今の時代はインターネット上での犯罪行為についてやっぱり教育がされてきたこともあって、ネットリテラシーが高いんですよね。~~コンピュータ悪意のマニュアルが売ってないのが良いのか！~~
　あぁ、これはダメだよなぁって判断を常に持つことが大事だなぁと思っています。

# 両者の関連について相方と相談
![スクリーンショット 2023-04-11 231029.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322151/8684b005-1671-d553-7fa9-d997fa484a28.jpeg)
３と４が今回のタイトルで問題にしている点ですね。
流石優秀な相方である。問題の本質に気付いているではないか！
# 所感
　ChatGPTくんだって、今は倫理規定がきちんとなされていないから、トラブル多いよって自分で言っているんだから、それを使う僕たちもそのことをきちんと理解しておこうねって思いましたまる。
ChatGPT Plus(GPT-4)を解約する手順

ChatGPT Plus(GPT-4)を解約する手順をGPT-4で確認した時の内容です。
試してないので、こちらで解約できるかは分かりません。

```
OpenAIのChatGPT Plusを解約する手順は以下の通りです。

1. OpenAIのウェブサイトにアクセス: まず、https://www.openai.com/ にアクセスしてください。
2. サインイン: 画面右上の「Sign In」ボタンをクリックして、登録されているメールアドレスとパスワードを入力し、アカウントにサインインしてください。
3. ChatGPTページにアクセス: サイト内で「ChatGPT」または「Products」から「ChatGPT」を選択して、ChatGPTのページにアクセスしてください。
4. アカウント設定にアクセス: ページ右上のアカウントアイコンをクリックし、表示されるドロップダウンメニューから「Settings」または「Account Settings」を選択してください。
5. サブスクリプションの変更: 「Billing」または「Subscriptions」のタブを選択してください。ここで、現在のプランやChatGPT Plusに関連するサブスクリプション情報が表示されます。
6. 解約: サブスクリプションに関連する「Cancel Subscription」または「Unsubscribe」ボタンをクリックしてください。解約手続きが完了すると、確認メールが登録されているメールアドレスに送信されます。
7. 解約の確認: 解約手続きが完了したかどうかを確認するために、再度「Billing」または「Subscriptions」のタブを確認してください。解約が完了している場合、ChatGPT Plusのサブスクリプションステータスが「Cancelled」または「Unsubscribed」に変更されているはずです。

注意: 解約手続きが完了すると、ChatGPT Plusのサービスを利用できなくなります。解約を取り消す場合は、再度サブスクリプションを申し込む必要があります。解約前に、サービス利用の必要性を十分に検討してから手続きを行ってください。
```