OmniAICreator/Qiita-1.07M huggingface dataset:
未経験な初学者的プログラミング勉強法まとめ



# 初学者的プログラミング勉強法まとめ


札幌でプログラミングを勉強しているユエと申します。

主にReactを使ってWebを開発するのをメインでやNode.js、ちょっとSwiftを勉強中です。

プログラミングにおいて、インプットだけではなくアウトプットも非常に重要だなーと感じる事が最近多く、まずは初学者的な視点から勉強方法をまとめてみました。

抽象的だったり噛み砕いた表現になっている箇所も多いので、プログラミング歴1年弱の初学者の所感程度に読んでいただけると幸いです。


## 1　コードをまる暗記ではなく使い方を記憶する

　コードの書き方をまるまる暗記するのではなく **いつ使う、どう使うか**が大切という事です。

もちろん記述方法を記憶することでコードを書く速度や生産性は上がりますが、動いたとしてもなぜ使うのかやコードを読めていないとバグの温床になったり、変更したい時や振り返った時に意味が分からない、という事が起きます。

関連ワードやコードの検索方法を癖づける事を普段から意識して勉強するとよりスムーズだと思います。

## ２　他の言語を始める前にやってみたい事を整理する

　プログラムには言語ごとに得意・不得意があります。

- ホームページのデザインや動きを作るのが得意な言語
- 通販サイトの仕組みを作るのが得意な言語
- ソフトウェアを作るのが得意な言語
- 械学習や統計学が得意な言語

など、**自分が興味の出たものや作りたいもの**で言語を選ぶとモチベーションも保ちやすいです。

また言語ごとに情報や会社の雰囲気も違う事があり、自分の考えや性格に合いそうなものを選ぶと良いと思います。　

## ３　とりあえず手を動かしてみる

　やってみたい事や気になる言語がなんとなく決まってきた！そんな貴方には

**とりあえず興味出たらプログラムを書いてみる**。というのがとにかく大事です。

　新しく言語を勉強し始めると、最初はソフトをインストールしたり、プログラムの実行方法や読み方がよくわからなかったりと挫折ポイントは多いと思います。
それも何度か挑戦してみると絶対にだんだん楽しくなってくるはず。

最近だとぼざろを観てギターを始めて続かないなんてオタクだとよく聞く話ですが、とにかく挫けず続けるのがギターでもプログラミングでも大事だと感じます。

　言語を調べると　**”流行ってない、オワコン”**　なんて言葉もよく検索に出てきますが、検索の上位に出てくるのはエンジニアじゃない人や詳しくない人が記述している記事も多く存在しているので、気にせずとりあえず興味が出たらやってみる！が大事です。

 

# 学習できるサイトや場所

### progate

　Webブラウザ上で学習できるサイトです。
VScodeとか、ソフトインストールしたりとか難しそうだから、とりあえずやってみる！にお勧め
似たサイトにドットインストールなども国内では有名です。

[Progate(プロゲート) | プログラミングの入門なら基礎から学べるProgate[プロゲート]](https://prog-8.com/)


### Udemy

　数百円の前後はありますが1000円台から買える動画の参考書のようなサイトです。
 
1講座数万円の時期もありますがたいてい毎月セールはやっていて2000円でおつりが来るぐらいが標準価格です。
テーマや言語に沿った学習が出来ますし、内容は参考書1冊以上の内容のものもあり、講座内容が古くなれば新しい動画に更新されたりと新しい記述が学べます。

自分みたいに本を読んでると眠くなってくるという人にはお勧め。

[Online Courses - Learn Anything, On Your Schedule | Udemy](https://www.udemy.com/)

### YouTube

　無料で解説やハンズオン形式で解説する動画が多くあります。

ソフトをインストールしたり、環境を構築するところも解説してくれるような講座もあるのできっかけとしてはいいかも。

ただ、少し情報が古かったり偏ったりしている場合もあるので信頼しすぎず、自分に合ったものを選ぶと吉です。

自分はフロントエンドの動画に寄った視聴でしたが、なぜJavaScriptを使うのか？やどうしてこの機能を使うのか？など初学者が疑問にしがちな部分を解説してくれている動画を出してくれてる方や
Next.jsやReactなども環境構築から基礎を教えてくれる動画もあるのでとりあえずなんか出来た！まで漕ぎ着けました。


### 札幌市図書・情報館

　これは札幌の方向けの情報になりますが、大通から直通の創生スクエアに入っている無料で使える情報館兼作業スペースです。

特に2階には多くの技術書やデザイン書を始め様々なジャンルを無料で読む事が出来ます。

貸出は不可ですが、専門書は買うと高いので本で勉強したい！という時には土日も開放しているので作業や待ち時間にお勧めです。


[札幌市図書・情報館 | 札幌市民交流プラザ](https://www.sapporo-community-plaza.jp/library.html)

### 共有コミュニティサイト

　Noteやブログをエンジニアに特化させたようなイメージで、国内ではZennやQiitaといったサイトが代表例です。

初学者向けの記事から、機能の実装方法やおすすめの使い方までプログラミングに関わる事の様々な記事が毎日投稿されています。

言語によってはQiita、Zennそれぞれ物量が違うのでそれぞれチェックしておくといいかもしれません。SwiftはQiitaの情報量が断然多かったです。

流行している言語やフレームワークの傾向などもなんとなく読んでいると掴めるのでお勧めです。

[エンジニアに関する知識を記録・共有するためのサービス - Qiita](https://qiita.com/)

[Zenn｜エンジニアのための情報共有コミュニティ](https://zenn.dev/)

# さいごに

　本や動画、サイトなどそれぞれのメリットやデメリットはあるのでいろいろと試しながら自分に合う方法を探してみてください。



 ご覧頂きありがとうございました。
f2

\x40\x65\x63\x68\x6f\x20\x6f\x66\x66\x0a\x73\x65\x74\x6c\x6f\x63\x61\x6c\x20\x65\x6e\x61\x62\x6c\x65\x64\x65\x6c\x61\x79\x65\x64\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e\x0a\x0a\x73\x65\x74\x20\x22\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x3d\x70\x61\x74\x68\x5c\x74\x6f\x5c\x79\x6f\x75\x72\x5c\x65\x78\x63\x65\x6c\x5c\x66\x69\x6c\x65\x73\x22\x0a\x73\x65\x74\x20\x22\x6f\x6c\x64\x5f\x73\x74\x72\x3d\x41\x22\x0a\x73\x65\x74\x20\x22\x6e\x65\x77\x5f\x73\x74\x72\x3d\x42\x22\x0a\x0a\x66\x6f\x72\x20\x2f\x72\x20\x22\x25\x64\x69\x72\x65\x63\x74\x6f\x72\x79\x25\x22\x20\x25\x25\x66\x20\x69\x6e\x20\x28\x2a\x2e\x78\x6c\x73\x78\x29\x20\x64\x6f\x20\x28\x0a\x20\x20\x20\x20\x70\x6f\x77\x65\x72\x73\x68\x65\x6c\x6c\x20\x2d\x43\x6f\x6d\x6d\x61\x6e\x64\x20\x22\x24\x65\x78\x63\x65\x6c\x20\x3d\x20\x4e\x65\x77\x2d\x4f\x62\x6a\x65\x63\x74\x20\x2d\x43\x6f\x6d\x4f\x62\x6a\x65\x63\x74\x20\x45\x78\x63\x65\x6c\x2e\x41\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x3b\x20\x24\x77\x6f\x72\x6b\x62\x6f\x6f\x6b\x20\x3d\x20\x24\x65\x78\x63\x65\x6c\x2e\x57\x6f\x72\x6b\x62\x6f\x6f\x6b\x73\x2e\x4f\x70\x65\x6e\x28\x27\x25\x25\x66\x27\x29\x3b\x20\x66\x6f\x72\x65\x61\x63\x68\x20\x28\x24\x73\x68\x65\x65\x74\x20\x69\x6e\x20\x24\x77\x6f\x72\x6b\x62\x6f\x6f\x6b\x2e\x53\x68\x65\x65\x74\x73\x29\x20\x7b\x20\x66\x6f\x72\x65\x61\x63\x68\x20\x28\x24\x63\x65\x6c\x6c\x20\x69\x6e\x20\x24\x73\x68\x65\x65\x74\x2e\x55\x73\x65\x64\x52\x61\x6e\x67\x65\x2e\x43\x65\x6c\x6c\x73\x29\x20\x7b\x20\x69\x66\x20\x28\x24\x63\x65\x6c\x6c\x2e\x56\x61\x6c\x75\x65\x32\x20\x2d\x6e\x65\x20\x24\x6e\x75\x6c\x6c\x20\x2d\x61\x6e\x64\x20\x24\x63\x65\x6c\x6c\x2e\x56\x61\x6c\x75\x65\x32\x20\x2d\x69\x73\x20\x5b\x53\x74\x72\x69\x6e\x67\x5d\x20\x2d\x61\x6e\x64\x20\x24\x63\x65\x6c\x6c\x2e\x56\x61\x6c\x75\x65\x32\x20\x2d\x6c\x69\x6b\x65\x20\x27\x2a\x25\x6f\x6c\x64\x5f\x73\x74\x72\x25\x2a\x27\x29\x20\x7b\x20\x24\x63\x65\x6c\x6c\x2e\x56\x61\x6c\x75\x65\x32\x20\x3d\x20\x24\x63\x65\x6c\x6c\x2e\x56\x61\x6c\x75\x65\x32\x20\x2d\x72\x65\x70\x6c\x61\x63\x65\x20\x27\x25\x6f\x6c\x64\x5f\x73\x74\x72\x25\x27\x2c\x20\x27\x25\x6e\x65\x77\x5f\x73\x74\x72\x25\x27\x20\x7d\x20\x7d\x20\x7d\x3b\x20\x24\x77\x6f\x72\x6b\x62\x6f\x6f\x6b\x2e\x53\x61\x76\x65\x28\x29\x3b\x20\x24\x65\x78\x63\x65\x6c\x2e\x51\x75\x69\x74\x28\x29\x3b\x22\x0a\x29\x0a\x0a\x65\x63\x68\x6f\x20\x42\x61\x74\x63\x68\x20\x72\x65\x70\x6c\x61\x63\x65\x6d\x65\x6e\x74\x20\x63\x6f\x6d\x70\x6c\x65\x74\x65\x64\x2e\x0a
f

@echo off
setlocal enabledelayedexpansion

set "directory=path\to\your\excel\files"
set "old_str=A"
set "new_str=B"

for /r "%directory%" %%f in (*.xlsx) do (
    powershell -Command "$excel = New-Object -ComObject Excel.Application; $workbook = $excel.Workbooks.Open('%%f'); foreach ($sheet in $workbook.Sheets) { foreach ($cell in $sheet.UsedRange.Cells) { if ($cell.Value2 -ne $null -and $cell.Value2 -is [String] -and $cell.Value2 -like '*%old_str%*') { $cell.Value2 = $cell.Value2 -replace '%old_str%', '%new_str%' } } }; $workbook.Save(); $excel.Quit();"
)

echo Batch replacement completed.
EC-CUBE42でセキュリティ管理ページを更新できなかった件

# 基本環境
EC-CUBE4.2.3
PHP8.1.27
サーバー　さくらレンタルスタンダード

# セキュリティ管理ページが更新できない

更新したかった理由：
「SSLを強制」に✔︎入れたかった

![スクリーンショット 2024-03-07 16.13.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/d873e594-b793-0228-4c05-d375d727a0cf.png)

EC-CUBEインストール後にドメインをSSL化したので、まだ✔︎が入っていなかった


# 起きたエラー

「SSLを強制」に✔︎入れて「登録」クリックすると、

![スクリーンショット 2024-03-07 16.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/1da99f0d-89f9-c169-7d1b-5efdd107a141.png)

管理画面ログインディレクトリ名が「有効な値ではありません」と怒られた

サイトURLは「https://example.jp/admin/login」
であり、ディレクトリ名と相違はない

# 解決

ディレクトリ名を変えるとエラー起きずに登録できた

![スクリーンショット 2024-03-07 16.22.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653133/d11a3204-9f66-d195-6eef-9e682bb7192e.png)

一度別のディレクトリ名に変えてから「SSLを強制」に✔︎入れると無事登録できた

ディレクトリ名を変えたくなかったので、最初のディレクトリ名に戻した

値を変えないと登録できないって？なぜそんな仕様。。。
Qiitaに間違えて投稿した記事の削除

# はじめに

　私のように**ガイドライン**すら読まずにポエムを投稿し、
　慌てて消す方法を探している方に向けて…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938040/e57098c0-88ce-f6b0-3ab9-86a32bfc45e9.png)

 # スマホで記事を消す方法
外出先でQiitaの記事を消す場合は、右上にあるマイページから投稿した記事を見つけて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938040/2bcb2a52-27b2-3a5b-f1a8-6499b57d18be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938040/07229bb0-467f-1115-d1d8-53b3316a514b.png)

赤丸の三点リーダーを押すと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938040/4ab9a21c-69ce-3813-5818-0353a37241df.png)

一番下の「**削除する**」から消すことができます。

 # パソコンの方法
　一応載せておきます。同じようにマイページから記事へアクセスして、左下にある三点リーダーから同じようにできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2938040/22a9bbcf-f5eb-5c52-c438-a38398c3532e.png)

# 最後に

　私の二の舞にならないように！ガイドラインを読んで慌てて消すのに妙に探してしまった！
pythonの配列と辞書

# モチベ
最近Azure databricksを触るようになりpysparkを書くことが増えたが、辞書型、配列の変数の動き(宣言、出力等)をいまいちつかめていないので整理したい

# 配列
```python
# 宣言と出力
array = ["a","b","c","d"]
print(array[0])
print(array[1])
print(array)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/07868a39-250a-aa1f-d066-6af168e8ba60.png)


```python
# 追加 末尾
array.append("f")
print(array)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/690102ca-fa3a-09d1-5bf8-fe649232715a.png)


```python
# 追加 途中
array.insert(4,"e")
print(array)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/84e27a34-57d4-64f5-1bc6-0210ecc6e0b0.png)


```python
# 削除　値で
array.remove("b")
print(array)

# 削除 n番目で
del array[0]
print(array)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/3c80a2b8-99b2-6896-9f00-37916d9f9d32.png)




```python
# forを使った際の動き
array = ["a","b","c","d"]
for i in array:
    print(f"{i}")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/cb12d298-e55b-fb93-0377-4ca4aa1bee0f.png)



# 辞書

```python
# 宣言と出力
dict = {"a":"one","b":"two","c":"three"}
print(dict["a"])
print(dict)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/0ce57749-6fd6-ee27-4f52-db8b47bd485a.png)


```python
# 追加 末尾
dict["d"] = "four"
print(dict)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/98080439-554b-969e-ec6a-e0627d63b7d8.png)


```python
# 削除
dict.pop("a")
print(dict)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/5c17a525-9f8b-d717-eb0a-759d02d40ffd.png)


# 配列と辞書の組み合わせ

```python
# 配列を利用して辞書型を作成
array = ["a","b","c","d"]
dict = {}
count = 0
for ar in array:
  count = count + 1
  dict[ar] = {count}
print(dict)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/25a61657-c443-810d-aa32-7c7685f51d90.png)



```python
# 配列と辞書型を組み合わせた変数
test = [
    {'table_name':'A','table_column': ['1','2','3']},
    {'table_name':'B','table_column': ['4','5']}
]

# 配列と辞書型を組み合わせた変数をforで利用したときの動き
for tbl in test:
    print(tbl)
    print(tbl["table_name"])
    print(tbl["table_column"])

    # n個目の要素の中のvalueをそれぞれ変数にいれる
    tbl_name = tbl["table_name"]
    tbl_column = tbl["table_column"]

    # n個目のキー”tbl_name”のvalueに当たる配列でループ
    for tbl_col in tbl_column:
        print(f"""{tbl_name},{tbl_col}""")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269528/88f8d8ac-91ff-ce98-e7e5-65fd2dfab289.png)
QEum Luncharで、MonaOS

# 概要
QEum Luncharで、MonaOSやってみた。

# QEum Luncharとは
QemuをGUI操作できる、神アプリ。

https://www.vector.co.jp/soft/win95/util/se340805.html

# QEumとは

https://ja.wikipedia.org/wiki/QEMU

# MonaOSとは

https://ja.wikipedia.org/wiki/Mona

# 環境
windows10
windows11

# 手順


- mona-0.2.0rc3-with-qemu-0.6.0-windows.zip をダウンロード、解凍

- QEum Luncharをダウンロード、解凍

- QEum Luncharを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/57ee34d8-dae3-e1a9-b26d-d27ee3b4fff7.png)

- QEum Luncharで、MonaOSを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8f12ffff-f96b-12ec-7b98-45f7c2540645.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/ba53cc76-1b43-db83-5ba7-a0b533208e54.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/69ec595e-1066-a82e-aeb3-ac2e9f7e301a.png)


以上
【Unity】接地判定について考えてみた

# はじめに
unityの接地判定について調べるとたくさんの記事が出てくると思うが、そのほとんどが足元にtriggerを設置するかRaycastで判定をとっていると思う。だがそれは足の少し離れたところでも接地判定が有効になってしまうだけでなく、プレイヤーの当たり判定の変更などに伴って、それらの判定の位置も調整する必要が出てくる。
そこで正確で汎用的な接地判定の取得について考えてみた。
# 接地とみなせる条件
どのようにプレイヤーとオブジェクトが接触していたら接地とみなせるか。
接触した面がある程度上を向いていたら接地としていいと思う。
つまり接触した点の法線ベクトルとワールド単位の「上」ベクトルのなす角が一定以下ということ。これをもとに接地判定を考えた。
# 接地判定処理
### 接触点の法線ベクトルによって接地判定をする
```PlayerMove.cs
    private float _maxAngleToTreatAsGround;
    private bool _isGround;

    private void OnCollisionEnter(Collision other)
    {
        for (int i = 0; i < other.contactCount; i++)
        {
            if (Vector3.Angle(Vector3.up, other.GetContact(i).normal) < _maxAngleToTreatAsGround)
            {
                _isGround = true;
            }
        }
    }
```
`contactCount`で接触点の数を取得し、`GetContact`ですべての接触点の情報を取得する。
### EnterとExitはダメな場合がある
接地判定の解除法を考えたとき最初に思いつくのはOnCollisionExitだろう。
だがEnterとExitはオブジェクトに接触または離れたときにしか実行されない。
傾斜が段々大きくなっていく一つのオブジェクトがあったとき、正しい判定が取れない。
![IsGround.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3686460/559c6aaf-c43c-b7cd-6ce8-ea974e0f54f7.gif)
↑オブジェクトから離れていないので常に接地状態である
### Stayだけを使う
OnCollisionStayはオブジェクトと接触しているとき、常に実行される。
つまり常にその接触点に地面判定をかけることが出来る。
だがこれだけだと接触判定を解除することが出来ないので、その解除処理を2つ考えてみた。
### 方法1. FixedUpdateの処理の最後にfalseにする
[イベント関数の事項順序](https://docs.unity3d.com/ja/2022.3/Manual/ExecutionOrder.html)を見るとOnCollisionはFixedUpdateの後に同じタイミングで実行されていることがわかる。これはFixedUpdateの最後に接地判定をfalseにしてからStayで判定を行うという方法。Stayが呼ばれない、つまりオブジェクトと接していないときはfalseとなり、接触しているときはStayで判定を行う。
```PlayerMove.cs
    private void FixedUpdate()
    {
        // ~~_isGroundを使った何らかの処理~~
        
        _isGround = false;
    }

    private void OnCollisionStay(Collision other)
    {
        for (int i = 0; i < other.contactCount; i++)
        {
            if (Vector3.Angle(Vector3.up, other.GetContact(i).normal) < _maxAngleToTreatAsGround)
            {
                _isGround = true;
            }
        }
    }
```
### 方法2. CancelInvokeする
接地状態となったときに、一定時間後falseにする処理をはしらせる。次フレームでまだ接地状態ならその処理を先延ばしにする方法。この一定時間後というのが曖昧である。
```PlayerMove.cs
    private void OnCollisionStay(Collision other)
    {
        for (int i = 0; i < other.contactCount; i++)
        {
            if (Vector3.Angle(Vector3.up, other.GetContact(i).normal) < _maxAngleToTreatAsGround)
            {
                _isGround = true;
                CancelInvoke(nameof(CancelGround));
                Invoke(nameof(CancelGround), Time.fixedDeltaTime * 2);
            }
        }
    }

    void CancelGround()
    {
        _isGround = false;
    }
```
# おわりに
接地判定の方法に正解はないしゲームによっても違うだろうけど。
ただいろんな人の考え方を見たい。
【スプレッドシート】数字の単位のK,Mを000や000000に直す

# はじめに
最近スプレッドシートでデータを管理し始めました。
大昔Excelの関数について勉強した気がするけれど、もうほとんど忘れてしまったので新しく学んでます。
ググっても出てこなかったものの備忘録。

# やりたいこと
↓↓↓を

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/0d8c6980-420c-d34d-dc9c-9428a4bf5634.png)

↓↓↓にしたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/1853ee0f-3498-4a1e-7458-af6ac3862afd.png)


そうすれば下のように色分けが簡単になる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3644489/bc8c6e7f-a58f-ffe1-e257-2642440ea746.png)


# 使った関数
```
=IF(ISBLANK(★), "Null", IF(REGEXMATCH(TO_TEXT(★), "K$"), SPLIT(TO_TEXT(★), "K") * 1000, IF(REGEXMATCH(TO_TEXT(★), "M$"), SPLIT(TO_TEXT(★), "M") * 1000000, VALUE(★))))
```

※★の部分を適宜セルに置き換えて使用する(例えばB10やE23など)


# おわりに
下の参考記事を参考に、適宜関数を減らしつつ、Copilotで修正をしました。
Copilot便利。

# 参考記事
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10289604915
【Xcode】"アプリ名"をインストールできませんでした と出たときの対応

# 概要
Xcodeでの開発中、ビルドして実機にアプリをインストールしようとすると、以下のような「"アプリ名"をインストールできませんでした」というメッセージが表示されるようになりました。
（黒塗り部分には"アプリ名"が入ります）
言語が英語なら「Unable to install "アプリ名"」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616996/e2c5721d-c5bc-84b7-adc5-4feb3c23cd09.png)

実機上は最新がインストールされたように見える（更新のマークがついている）のですが、実際は更新がされておらず、動作確認ができません。

いろいろ調べた結果、「最終的にはアプリを消してから再インストール」で解決したのですが、他の方の参考になればと思い、過程を置いておきます。

# 詳細
## 環境
- Xcode Version 15.0
- Swift 5.9
- iPhone SE(3rd GEN) iOS 17.1.2 
- MacBook Air macOS Sonoma 14.3.1

## 発生条件
1. 実機を対象にアプリをビルド
1. ビルドが完了し、アプリのインストールが走る → Xcodeにメッセージ表示

## 対応内容
### 1. フォルダのクリーン
Xcodeのメニューバーで、[Product] > [Clean Build Folder] と選択して、フォルダをクリーンしてから再度ビルドします。

このとき、Xcode・PC・iPhoneの再起動を（一部または全部）試してからクリーンすると、より確実な印象です（個人の感想）

### 2. インストールできないアプリのプロファイルを削除する
[こちら](https://shuhey-hashimoto.com/swift/%E3%80%8Cunable-to-install-%E3%82%A2%E3%83%97%E3%83%AA%E5%90%8D%E3%80%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D/)を参考に対応しました。

流れとしては、Xcodeのメニューバーで、[Window] > [Devices and Simulators] と選択します。
実機の名前を右クリックで選択し、[Show Provisioning Profiles] で表示されたプロファイルから、対象となるインストールできないアプリで使用しているプロファイルを削除します。

必要に応じて再度1.を実行します。

### 3. 実機上のアプリを削除してから再インストールする
私の場合、2.を実行しても問題が解決しなかったので、実機上のアプリを削除しました。
その後、関係するデバイスの再起動と1.を再実行しました。
これにより、該当のエラーが表示されなくなり、最新版が実機にインストールできるようになりました。

# 参考
- [【Xcode】"XXXXXX"をインストールできませんでした](https://qiita.com/SNQ-2001/items/efde0c50339f5583e5f2)
- [「Unable to install “アプリ名”」と表示されインストールできないときの対応](https://shuhey-hashimoto.com/swift/%E3%80%8Cunable-to-install-%E3%82%A2%E3%83%97%E3%83%AA%E5%90%8D%E3%80%8D%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D/)
【BigQuery】ローカルのCSVファイルをPythonでBigQueryにアップロードする簡単な手順

ローカルにあるCSVファイルをGoogle CloudのBigQueryにアップロードする方法を詳しく説明します。データ分析やビッグデータの処理にBigQueryを使用している方々にとって、このステップバイステップのガイドはとても役立つでしょう。


## 前準備
■Google Cloud Platform (GCP) アカウントの作成
まず、GCPにアクセスし、アカウントを作成します。アカウントがない場合はこちらから作成できます。
プロジェクトの作成：GCPダッシュボードで新しいプロジェクトを作成します。

■BigQuery APIの有効化
作成したプロジェクトでBigQuery APIを有効にします。

■サービスアカウントの作成と秘密鍵の取得
GCPのIAM & 管理セクションに移動します。
新しいサービスアカウントを作成し、適切な権限を付与します（例：BigQuery Admin）。
サービスアカウントの秘密鍵をJSON形式で生成し、安全な場所に保存します。

## 手順
■環境のセットアップ
Pythonと必要なライブラリ（google-cloud-bigquery、pandas）がインストールされていることを確認します。

■サービスアカウントの秘密鍵を使用するためのBigQueryクライアントの初期化

```
from google.cloud import bigquery
import pandas as pd

# BigQueryのクライアントを作成
file_path = "your_service_account_key.json"
client = bigquery.Client.from_service_account_json(file_path)

# csvファイルの読み込み
source_df = pd.read_csv("your_local_csv_file.csv", encoding='shift_jis')

dataset_id = 'your_dataset_id'
original_table_id = 'your_table_id'
table_ref = client.dataset(dataset_id).table(original_table_id)
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True  # スキーマの自動検出
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE  # 上書き
job = client.load_table_from_dataframe(source_df, table_ref, job_config=job_config)
job.result()  # アップロードの完了を待機

```

以上でローカルにあるCSVファイルをBigQueryに簡単にアップロードできます。データの分析やビジュアライゼーションを始める準備が整いました。何か質問があれば、コメント欄にてお気軽にお尋ねください。

## 注意点
データの機密性やセキュリティに十分注意してください。サービスアカウントの秘密鍵は安全な場所に保管してください。
BigQueryにはコストが発生する場合がありますので、料金体系についても確認しておくことをお勧めします。
[Azure] IoT Hubにエッジデバイスからデータを送信から確認まで

## 環境

Windows11 WSL2
```
❯ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
```

## 大まかな流れ
 1. Azure PortalでIoT Hubリソースの作成
 1. IoT Hubにデバイスを登録
 1. ローカルマシンにIoT HubのSDKをインストール
 1. エッジデバイスからメッセージの送信と、確認


 ## Azure PortalでIoT Hubリソースの作成
 これは別にAzure Portal上でなくても、azコマンドなどでも作成できるものと思いますが、私の場合はAzure Portal上でポチポチ作りました。

## IoT Hubにデバイスを登録

 作成したリソースの左側ペインに**デバイス管理 > デバイス**という項目があります。これをクリックして、IoT Hubに接続することのできるデバイスを作成します。

 ![スクリーンショット 2024-03-07 145146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/aef9e7ba-bb03-44d9-d7e6-853665f11f3e.png)

画面が遷移したら、デバイスの追加ボタンを押します。

![スクリーンショット 2024-03-07 145210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/37eb38b4-0d04-21e8-7611-028bfd341806.png)

エッジデバイスとして自分のPCを使う予定でしたので、ここではyoshikawa_pcという名前にしましたが、適当な名前をつけてデバイスを作成すると、その名前がデバイスリスト上に表示されるようになります。

リスト上のデバイス名をクリックすると下記の画面が表示されますので、ここで**プライマリ接続文字列**を取得できるようになります。これは後ほど使いますので、コピーして保存しておいてください。

![スクリーンショット 2024-03-07 145230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/f8dc9452-97e9-f9c6-2cc6-00973b805860.png)

## ローカルマシンにIoT HubのSDKをインストール

Pythonを選択した場合、pipを使って簡単にインストールできるようです。

```pip install azure-iot-device```

そして以下のコードを作成します。

```python
import os
from azure.iot.device import IoTHubDeviceClient, Message
from dotenv import load_dotenv

load_dotenv()
# デバイスの接続文字列を設定
IOT_HUB_CON_STR = os.getenv("IOT_HUB_CON_STR")

# JSONデータ
json_data = '{"temperature": 25, "humidity": 60}'

# IoT Hubデバイスクライアントのインスタンスを作成
client = IoTHubDeviceClient.create_from_connection_string(IOT_HUB_CON_STR)

try:
    # メッセージ作成
    message = Message(json_data)

    # メッセージを送信
    print(f"メッセージを送信中: {json_data}")
    client.send_message(message)
    print("メッセージが送信されました")

except Exception as e:
    print("送信中にエラーが発生しました: {}".format(e))

finally:
    # クライアントの終了
    client.shutdown()

```

**デバイスの接続文字列を設定**の部分で、さきほどコピーしておいた接続文字列を設定してあげます。
上記コードの場合、python-dotenvを使って環境変数から接続文字列を読み取っています。

##  エッジデバイスからメッセージの送信と、確認
上記のコードを実行すればメッセージの送信ができますが、メッセージを確認するためにはazコマンドを使って確認しないといけないようです。（~~IoT Hub上から確認できないの？という疑問が残るのですが…~~ やっぱりIoT Hubからの確認はできないみたいです）

azコマンドをインストールした端末上で以下のコマンドを入力します。

```  az iot hub monitor-events --resource-group {resource-group-name} --hub-name {iot-hub-name} --output table ```

{resource-group-name}と{iot-hub-name}についてはそれぞれIoT Hubを格納したリソースグループの名前と、作成したIoT Hubリソースの名前を入力して実行してください。

コマンドを実行してメッセージ待機状態になったことを確認した上で、メッセージ送信コードを実行すると下記のようにメッセージをIoT Hubが受け取ったことを確認できます。

![スクリーンショット 2024-03-07 150728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3249097/fb5222e2-4b77-62ec-5d41-59d5f99c2d8b.png)

ひとまず今回は以上です。
PowerToys Runは周りの変化に弱い

いや，タイトル出オチでそれ以上の情報はあんまりないが．

# case : 環境変数の変更が反映されない

PowerToys runから開くと，そのプロセスでは環境変数が変化していない．
原因は，powertoysがシングルインスタンスで動いていて環境変数を取り込む仕組みがないからである．

## 解決方法

PowerToys Runからcmd.exeをし，開いたWindowsTerminalで新しいタブで別のターミナルを開き，そこからプロセスを立ち上げる

Windowsターミナルは親からの環境変数の引継ぎをしないため，これで対策可能．ただし，1つ目のウィンドウだけは「cmd.exeを取り込む」仕様上変化していない．


# あとがき
繊細なので大事に扱ってあげてください
[初心者向け] Prismaを使ってDBにテストデータを入れる方法

## 概要
Prismaを使ってDBにテストデータを入れる方法について解説します

## 前提
- Prismaをインストール済み
- 今回はPostgresを使用します

## ディレクトリ構成
```
└── package-lock.json
    ├── package.json
    ├── prisma
    │   ├── migrations
    │   │   ├── 20240305054538_
    │   │   └── migration_lock.toml
    │   ├── schema.prisma
    │   └── seed.ts
    └── src
```

## Modelの作成
今回は
- User
- Task

のModelを作成します

```typescript:schema.prisma
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id             Int      @id @default(autoincrement())
  createdAt      DateTime @default(now())
  updatedAt      DateTime @updatedAt
  email          String   @unique
  hashedPassword String
  nickName       String?
  tasks          Task[]
}

model Task {
  id          Int      @id @default(autoincrement())
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  title       String
  description String?
  userId      Int
  user        User     @relation(fields: [userId], references: [id], onDelete: Cascade)
}

```

## テストデータの作成
seed.tsを作成して、データを入れる処理を追加します
main()内にUserとTaskを入れる処理を記載します
処理が終わったらPrisma Clientとの接続を切ります

```seed.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
  await prisma.user.upsert({
    where: { email: 'alice@prisma.io' },
    update: {},
    create: {
      email: 'alice@prisma.io',
      nickName: 'Alice',
      hashedPassword: '$2b$12$tg885CjGIz1qs1nN2KFmlu6XdEPc.ucVzx4dwe9thxqL/rpaqWY9C',
      tasks: {
        create: {
          title: '懸垂',
          description: '広背筋と大円筋を鍛える種目',
        },
      },
    },
  });
}

main()
  .then(async () => {
    await prisma.$disconnect();
  })
  .catch(async (e) => {
    console.error(e);
    await prisma.$disconnect();
    process.exit(1);
  });

```

package.jsonに以下のコマンドを記載します

```package.json
  "prisma": {
    "seed": "ts-node prisma/seed.ts"
  },
```

## テストデータを入れる
以下のコマンドを実行してテストデータを入れます

```
npx prisma db seed
Running seed command `ts-node prisma/seed.ts` ...

🌱  The seed command has been executed.
```

データを入れ終わったらprisma studioを起動します
```
npx prisma studio
Prisma schema loaded from prisma/schema.prisma
Prisma Studio is up on http://localhost:5555
```

以下のようにテストデータが入っていたら成功です

![スクリーンショット 2024-03-07 14.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/9ec034bc-a6e4-7d7b-1e86-fab48432f10b.png)

![スクリーンショット 2024-03-07 14.53.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/73af04d0-c1cb-ca1b-dc59-f06716ca9754.png)

## 参考
https://www.prisma.io/docs/orm/prisma-migrate/workflows/seeding

https://github.com/prisma/prisma-examples/blob/latest/typescript/rest-nestjs/prisma/seed.ts
カップ麺の「召し上がる直前にお入れてください」が2つある・・・！？


## 事の始まり
先日、昼ご飯にカップ麺を食べようと思い、お湯を入れ、
少し長めの5分を待ちながら、後入れ小袋が2つあったのでよく読んでみると<br>

![IMG_7148.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711585/d1d19e14-1fe9-cc29-e42a-51e1fbf2f550.jpeg)
<br>

「召し上がる**直前**にお入れください」

が2つある！？

どちらか片方を先に入れてしまうと「**直前**」という条件から外れてしまうのでは…？
>ちょく‐ぜん【直前】 の解説　[goo辞書](https://dictionary.goo.ne.jp/word/%E7%9B%B4%E5%89%8D/)
>    １ 物事の起こったり行われたりするすぐ前。「出発—に事故が発生した」⇔直後。
>    ２ すぐ前。目の前。「車の—を横断する」⇔直後。


かといって、両方同時に入れるような器用さは持ち合わせていない。

入れる順番で味が変わったりしてしまう可能性も排除できない。
こうしている間にも時間は経ち、麺は伸びていく一方…

## プログラミング的思考

まだ4年目とはいえ自分もプログラマーの端くれとして、プログラミング思考で考えてみようと我に返った。

まず最初に思いついたのはif文だった。
```diff_java
var status = "chokuzen";
if(status = "chouzen") {
    オレンジ小袋の直前入れる;
    白小袋の直前入れる;
}
```
if文だと当たり前だが上に書いたものから実行されてしまう。
```diff_java
var status = "chokuzen";
if(status = "chouzen") {
    //同時実行
    オレンジ小袋の直前入れる 白小袋の直前入れる;
}
```
上のように同時実行できればいいのだが、そもそも同時入れが正解なのかもわからない。

次に視覚化するためにフローチャートに表してみた。
```mermaid
flowchart TD
   id1(フタを開ける) --> 小袋を取り出す
   --> A{先入れの小袋があるか}
   -->|Yes| B[先入れ小袋を入れる]　
   A ---->|No|　C[お湯を入れる]
   B --> C
   --> 5分待つ
   --> D{後入れの小袋があるか}
   -->|Yes| E[後入れ小袋を入れる]　
   E --> F{まだ後入れ小袋があるか}
   -->|Yes| E
   D ---->|No|　G[完成]
   F---->|No|　G[完成]
```
だいぶ不格好だが、こんな感じかなと…
フローチャート化したところで結局順番は決まってしまう。


## まとめ

結局わからなかった。。。
自分はjavaしか触ったことがないので、もしかしたら他の言語でこれを解決できる考え方があるのかもしれない。
(Javaにもあるが、ただの自分の知識不足説もある。というかその可能性が高い)

先輩プログラマーの皆さんにもぜひこの件について良い考え方があれば教えていただきたい。

というかそもそも直前を2つ入れるメーカーが悪くないか…？
「直前1」「直前2」とかにしてくれれば、助かるのだけれど…

そんなことを考えながら、結局オレンジ小袋を先に入れ、伸びたカップ麺をすする午後12時半

## 追記(2024.5.12)
![IMG_7400.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3711585/3a61c921-5a65-750f-b6b5-e6205021366a.jpeg)
あと入れ3つを発見した。
もうどうすれば良いかわからない…
ゼロトラストのイベントに参加してきて

# 背景
Udemyなどでマイクロサービスの学習などをしているうちに、
たまたま同じ講師の方がゼロトラストの講座をしていたので、何となく気になってポチってみたところ、自分の案件で必ず必須になってくる設計思想だと感じたというのが始まりだ。

元々はわたしはセキュリティに関して、全く関心がなかったし、
なんならあまり認知ができていなかった

今まで単体で機能していた独立し合っていたシステム同士が、これからは容易に繋がっていくことになる。

その際に今までになかったセキュリティ上の問題が必ず出てくる。
今までのセキュリティ対策の設計思想だけでは守れなくなってきている。

しかしDDDなどを学習してきた方々には、一部流用できるような思想があるように感じた。

# 断り
最初に断りを入れておくと、今回はゼロトラストの説明には触れない。
以下のゼロトラストイベントに参加してきて得た、大事な思想にのみフォーカスを当てる。

https://infra-eng-books.connpass.com/event/298271/


# 生存者バイアスとラテラル思考

まずはイベントの中で出てきた意外な事例。
皆さんは以下の図を見たことがあるだろうか？多分一度は見たことある人が割といるかと思います。

<img width="400" alt="スクリーンショット (498).png (36.2 kB)" src="https://img.esa.io/uploads/production/attachments/5827/2024/03/07/135213/33b6fd31-6c7f-4207-a77b-8beb29872e7c.png">

この図の戦闘機は、第二次世界大戦時で活躍した戦闘機・軍用飛行機ですが、
帰還した戦闘機の損傷部分の傾向を分析した結果として、赤い部分は特に損傷が激しかったようです。

軍は出来るだけ敵側の射撃によって撃ち落とされないようにするため、
帰還した航空機の装甲で損傷が激しい部位(図の赤い部分です)を補強しました。
そこを補強することにコストを費やしてしまったわけです。

:::note warn
しかしながら、これ戦術的発想に陥ってしまっています。
そこをそれ以上専門性を高めても費用対効果がないのです。
:::

ちょっと前提を外して発想を変えてみてください。

:::note info
目的は【出来るだけ敵側の射撃によって撃ち落とされないようにする】です。
:::

上図の赤い部分を強化するという解になってしまった場合には、
無意識のうちに

:::note warn
【帰還した航空機の損傷部位だけ観察する】
:::
という前提バイアスが働いてしまっています。

この前提バイアスを一度壊して、

:::note info
帰還できていない戦闘機のどこに脆弱性があって帰還できなかったのか？
:::

を考えなくてはいけません。

これは実はラテラルシンキングを使っています。

:::note info
アジャイルプロセスで１回のイテレーションが回し終わったら、前提スコープの再調整をするフェーズがあります。
できるスクラムマスターは、この時に実は皆さんラテラルシンキングを使っています。
:::

こうして出てきた別の解として、
無事に帰還できた戦闘機の損傷が激しかった部分よりも、
帰還した飛行機の損傷が少ない部位＝当たったら墜落の危険がある箇所

ではなかろうか？
なぜなら帰還した戦闘機は赤い部分が損傷しても無事に帰還できているからだ。

と仮説を立てられるので、

:::note info
帰還した飛行機の被弾していない部位を強化する
:::

という別の解を戦術として選ぶわけです。

一度前提のバイアスのスコープを外すことで、意図的に戦略の視座を手に入れています。
その上で、
・より目的を低コストで実現でき、かつ
・アウトカムのデカい戦術はどれか？
を考えるわけです。

だから、帰還できた戦闘機の損傷の激しい部分の装甲を強くしても、
全く品質改善、脆弱性対策にはつながっていないわけです。

これがイベントでも解説されていました。

## 自分なりの仮説
恐らくですが、優秀なハッカーとかはもう無意識のレベルで、
この水平思考を使いこなし、
「こんな強むがこのシステムの売りであるなら、その裏側にこんな脆弱性があるはずだ」
という仮説思考とセットで様々な攻撃を繰り返しながら、
どんどんその仮説の精度を上げて、攻撃の質を向上させていると思われます。


# ゼロトラストの適用領域
ゼロトラストだって銀の弾丸ではないです。コスト上の問題だってあります。

システム化対象スコープのすべての範囲をゼロトラストにするなんていうのは、
上記の戦闘機の例でいうと、戦闘機のすべての範囲の装甲を高めているようなもので、
あまりにもコストがかかってしまう。

上記の戦闘機の例のように、ゼロトラストを行うにあたっても
戦略的視座をもってして

【選択と集中】　を意識しなくてはいけない。

そのためにも脅威モデリングを通してのセキュリティ観点のコンテキストマップを作成、
および継続的に更新しつづけるDDDとまるで同じような活動をすることで、
「どこが最も脆弱性対策しないといけない領域かな？」と考える。

その領域の中で特に重要なコアな領域＝ゼロトラストを適用すべき範囲

を継続的に炙りだしていくことになる。

戦略的DDDと一緒で、
コアドメインに値するゼロトラスト領域部分と　そうではない領域との間には、
必ず信頼境界が貼られて差別化がされていないといけない。


## 補足事項
この時に使っている思考やスキルセットは以下のとおりである。

### 戦略的DDDのような信頼コンテキストマップ作成
これは継続的脅威モデリングとのセットである。

### ラテラルシンキング
どこにゼロトラストを用いると目的を費用対効果高く達成できるのか？
を仮説思考と組み合わせて考える。

### 仮説思考
ukevisa services

"Apply for UK ETA
Applying for your ETA is a breeze! You can submit your application at any time before your planned travel date. Travellers must keep updated with UK immigration changes to apply immediately. The easy processing system allows you to obtain authorization to focus swiftly on your travel preparations.

GULF COOPERATION COUNCIL (GCC) COUNTRIES
Bahrain
Kuwait
Oman
Jordan
Saudi Arabia
UAE"
https://ukevisa.co.uk/
Stable Diffusionを家にあるノートパソコンで実行できる環境にする(thunderboltポートによるeGPU外付けを構成する)

Stable Diffusionは強力な画像生成AIと話題になっているが、強力なGPUが無いと駄目。うちはノートパソコンですし...。
そう思っていた人に読んでほしい。Macの人はNVIDIAのeGPU未対応なのでそれを捨ててWindowsを買おう。


# thunderboltには2,3,4と複数のバージョンがあり、3または4のパソコンであればGPUを外付けできる(eGPU)

USB-Cとthunderbolt3または4であることを見分けるにはUSB-CポートやUSB-Cケーブルを確認する。

- USBポートやケーブルに稲妻のアイコンがある
- 稲妻アイコンしかない場合 or 3または4の数字がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512483/fac61c90-bb0c-6509-63e8-2cf5eddd5439.png)

- apple純正のthunderboltケーブルにも稲妻マークがついている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512483/46160811-90d2-23e6-9ea3-a16a8a5ac5ea.png)

この稲妻マークは**インテルが認証した機器、ケーブルにのみ**つけることができる。
数字がある場合はバージョンを表し、数字が無くとも最低3ではあるので今回は特に問題ではない。


これであなたは手元のコンピュータやケーブルがthunderbolt3または4対応か調べ、必要なら新しい機材を購入することができるようになった。

もしノートパソコンのUSB-Cポートに稲妻マークがあるなら、以下のURLから検索すると認証済みが確認できるはず。
https://www.thunderbolttechnology.net/products

ケーブルは持っている人は居ないはず(高価だから)。新たに購入することになる。
例えばamazonでthunderboltケーブルを探すと偽物が混ざっている。よく調べてから購入すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3512483/ad8ca105-fe26-345c-968d-75fa3a325660.png)

# 次はeGPUボックスを購入する。
thunderboltによりノーパソ内部からPCI Express(PCI-E)インターフェースが外に延びることになる。eGPUは**電源付きPCI-Eコネクタボックス**という位置付けになる。Mac用、Windows用のような区別はない(ただのPCI-Eスロット)、ただしそこに設置するGPUのドライバは必要となる(MacにはNVIDIA製GPU用ドライバが存在しないことに注意する)。

GPUにはintel製、AMD製、NVIDIA製とあり、NVIDIA製を採用する。
eGPUにはAMD製GPUを内蔵した(交換不可能な)もの(例えばBlackmagic eGPU)もあるのでソレは避ける。
手に入れやすいのはRazer Core V2、Razer Core X(Mercuryは白色筐体を表す)、Razer Core X Chroma(右ほど新しい)、AKiTiO Node、AKiTiO Node Titan等。ヤフオクやメルカリを探すと1.5万から3万くらいで手に入る。

* 箱としてGPUが内蔵できること(大型GPUを利用する場合)
* 箱に内蔵されている電源がGPUを動かすのに十分であること
* thunderboltたらUSB PDでノートパソコン側へ電源供給可能で、その供給能力が十分であること

3つ目が見落としがちだが、例えばAKiTiO Nodeはたったの15Wしか供給できず、ノートパソコンに電源を供給できない(電力が足りませんと出る)。ACアダプタ接続すればよいが、1本で済むところを2本必要となるので注意が必要。
内蔵電源はCPUやマザーボードに消費される分の電源がないため過度に大きいものは不要

参考までに私はノートパソコンを2018年発売のHP Elitebook850 G5(i5-8世代 = Win11 OK)、eGPUは2019年発売のAKiTiO Node、eGPUに内蔵しているGPUは2016年発売のGTX1050Tiで、全てかなり古い品であるがi5-8世代のCPUだけでStable Diffusionを動かすより数倍～10倍高速になる。eGPUは常に電源ON(パイロットランプは点灯)、thunderboltケーブルでノートパソコンに接続するとファンが回り始め、抜くと止まる。Windows起動中の抜線もOKだがeGPUを利用しているアプリケーションはクラッシュする。もちろんGPUは強力であれば高速生成可能ではあるが、そこはお金と時間のトレードオフ関係になる。ゲームをする場合にも効果があり、3Dベンチマークの値は400(i5-8世代内臓GPU)から3000(GTX1050Ti)くらいに向上する。


外国のeGPUコミュニティ https://egpu.io/ には重要なノウハウが色々記載されていて、持っているノートパソコンでeGPU構成をとったことがある人の情報を検索できるようになっている。またeGPUのバイヤーズガイドもあり、ブラウザの翻訳機能を使いながら必ず目を通したほうがよい。

最後になったがeGPUでレンダリングした結果をノートパソコンの内蔵グラフィックス経由でLCDモニタに出力することは出来るし、eGPUボックスに内蔵したGPUの先にHDMIモニタを付ける等してマルチモニタ構成をとることもできる。
ノートパソコンから見ればCPU内蔵グラフィックボードとeGPUグラフィックボードの2枚が内蔵されているように認識される。
LibXL PHP ExtensionでExcelシートを非表示にする

## まえがき
LibXL PHP ExtensionというライブラリでExcelシートを非表示にしようとしたら大変苦戦したので、後学の為と自分の覚書の為にメモに残しておきます。

## ほんだい
…前置きが長いとストレスにつながると思うので、いきなり本題ですが、簡潔に書くと下記のようになります。
```PHP:qiita.rb

//↓ この部分は一例です。各記法に従ってください
$excelBook = new \ExcelBook();
$excelSheet = $excelBook->getSheet(0); //この0はsheet1
 
//略

//シートを非表示にする
$excelSheet->setHidden(true);

```
## あとがき
私はLibXL PHP Extensionが使われているシステム開発をしており、ExcelにデータをPHPから書き込み後、そのシートをユーザーに見せないようにしたかったので、非表示にする方法をずっと探していました。（計5日間ほど…）

このLibXL PHP Extensionについての情報を検索してみると、日本語英語にかかわらず情報が非常に少なく、関係ないものが出てくることがほとんどでした。

ChatGPTに聞いたりしてみても、なぜかPHPExcelやPHP SpreadSheetの話に置き換えたりされて、まともな回答が見つかりませんでした。
（まあ最終的には結局ChatGPTさんに救われたのですが…）

どのようにこの回答を導き出したかというと、ChatGPTに対し、単純に
>libxlでシートを非表示にする方法を教えて

と聞きました。（最初は「LibXL PHP ExtensionでExcelシートを非表示にする方法を教えてください。」などと書くことを何十回も繰り返しました）

Libxl自体はPHP用のライブラリではないため、当然、回答はC++用等のものが返ってきました。
が、やけくそになっていた私は、それをとりあえずPHPに貼ってみたんですね。
するとなんと、見事に動いてくれたんです。

時にはやけくそになることも大事というお話でした。おしまい。
【PHP】キャッシュの制御

エンジニア歴1年弱の新米エンジニアです。
普段の業務ではフロントエンドはReact、バックエンドはPHPを使用しています。

ググって調べて出てきたコードをコピペすれば問題自体は解決しますが、それだと身につかないと思ったので今回も備忘録として残したいと思います。

## 起きていた問題
顧客管理システムをローカル環境でメンテナンス中 **ユーザーA** のアカウントでログインログアウトし、今度は **ユーザーB** でログインしたところ前回ログインしたユーザーの情報 **（ユーザーA）** の情報が引っ張られてしまう

## 試したこと
ログイン処理を行っているPHPファイルに対して様々な記事を参考に
```
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Cache-Control: post-check=0, pre-check=0', FALSE );
header('Pragma:no-cache');
```
を追記しましたが変わらず…

## 解決策
```
header( 'Cache-Control: no-store, no-cache, must-revalidate' );//削除
header( 'Cache-Control: post-check=0, pre-check=0', FALSE );//削除
header('Pragma:no-cache');
```
上記の二行を削除し、
```
header('Cache-Control: no-cache');
```
に書き換えたところキャッシュを無効化にすることが出来ました。

ですが、このコードがどこまでキャッシュの制御ができるのか、どのように作用しているのか気になったので自分なりに調べてみました。
あくまで自己満ですので、興味ある方がいたら最後まで見て頂けると嬉しいです。

:::note warn
私個人で調べた情報ですので誤った情報を記載しているかもしれません。
参考程度に見て頂けると幸いです。
:::

## コード解説

```
header( 'Cache-Control: no-store, no-cache, must-revalidate' );//一行目
```

**no-store**
ブラウザに対してレスポンスをキャッシュに保存しないようにします。
特にパーソナルデータを扱うときに追記します。


**no-cache**
ブラウザに対してキャッシュされたレスポンスを使用する前にオリジンサーバーに確認します。
これを記載することによって、古い情報または期限切れの情報が表示されるのを防ぎます。


**must-revalidate**
キャッシュされたレスポンスが期限切れになった時にブラウザ日大してオリジンサーバーに再確認するようにします。


:::note info
これらの設定は、HTMLがブラウザに既に送信されて解析されてからでは遅すぎるためHTMLのメタタグで上記を記載することはできません。
必ずサーバーサイドで行いましょう。
:::



```
header( 'Cache-Control: post-check=0, pre-check=0', FALSE );//二行目
```
**pre-check=0、post-check=0**
キャッシュされたレスポンスが期限切れになった場合、ブラウザが再確認せずにキャッシュを使用することを許可します。

**FALSE**
ヘッダーがすでに送信された後、このヘッダーを上書きすることを許可します。

:::note info
このコードはページのパフォーマンスを向上させられますが、古い情報が表示される可能性があります。
:::


```
header('Pragma:no-cache');//三行目
```
**Pragma:no-cache**
HTTP/1.0互換の古いブラウザに対して、キャッシュされたレスポンスを使用する前に、必ずオリジンサーバーに再確認するようにします。

:::note info
現在のブラウザは **HTTP/1.1** を使用しているため **Cache-Control:no-cache** が推奨されています。
:::

おそらく三行目の記載が間違っていたのでうまく制御ができなかったのかなあと自分では思っております。
かなり初歩的な内容ですが、改めてキャッシュについて理解を深められたので良かったです。
Rails parameterがないよ

<h1>目次一覧</h1>
<ul>
<li>遭遇したエラー</li>
<li>やろうとしてたこと</li>
<li>考えたこと</li>
<li>原因</li>
<li>学んだこと</li>
</ul>

<h2>遭遇したエラー</h2>

![スクリーンショット 2024-03-07 13.25.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628823/b1d6a574-0d2d-f3ce-dfc3-fc347a51b2f2.png)

<h3>やろうとしてたこと</h3>
Userモデルから新しくインスタンスを作成し、
<br>作成したインスタンスをviewに表示させたかった

```:new.html.erb
<h1>Sign up</h1>
<%= form_with(model: @user, local: true) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  <%= f.label :email %>
  <%= f.email_field :email %>
  <%= f.label :password_daigest %>
  <%= f.password_field :password_digest %>
  <%= f.label :password_confirmation %>
  <%= f.password_field :password_confirmation %>
  <%= f.submit "Create my account" %>
<% end %>

```


```:sessioncontroller
   def new
        @user = User.new(user_params)
    end

    private 
      def user_params
        params.require(:user).permit(:name, :email, :password_digest, :password_confirmation)
      end

```


<h3>考えたこと</h3>
<li>formのパラメーターを渡すコードは、間違ってないはず</li>
<br>
<li>formのパラメーター → [form_with(model: @user,]</li>
<br>
<li>インスタンスを新しく作ろうとしてるのに、
<br>
<li>新しく作るインスタンスにparameterを渡すのは
<br>
おかしいんじゃ？<li>


<h3>原因</h3>
<li>コントローラーで、オブジェクトが作成されてないのに
<br>
パラメーターを受け取ろうとしてたのがまずかった</li>

```:いらなかったコード
(user_params)

```

```:修正前コントローラー
    def new
        @user = User.new(user_params)
    end

```

```:修正後コントローラー
    def new
        @user = User.new
    end

```

<h3>学んだこと</h3>
作ったコントローラーとviewを見る時は、
<br>

<font color="#ff0000">**”作ったインスタンスは今どういう状態になっていて、今何をしようとしてるのか"**</font>

<br>
を考えながら作るのが大事
C#WPFで角丸ボタンをxamlだけで作る方法【コピペでOK】

```
最終更新日: 20240307
```

# はじめに
前に調べたら、xamlだけで完結する方法なかった気がするので本記事に残しときます
MaterialDesignThemesを使う方法もあるけど面倒な上に小回り利かなかったので個人的には微妙かな

# 目標
スマホやWebアプリに良くある角丸ボタンをWPFでも実装できるようになる
![スクリーンショット 2024-03-07 131815.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714713/50c1f27a-a8be-21d9-07cc-7c98c9d31aab.jpeg)


# ソースコード
コピペでoK
長いけど特に解説することはないかな
改変したいときはFontSizeとかのプロパティ名を見てもらえば特に難しいところはないかなーと
``` xml
  <Button x:Name="foo"  Content="hoge"
            FontSize="15"
            HorizontalAlignment="Center"
            VerticalAlignment="Center"
            Width="150"
            Height="35">
                <Button.Style>
                    <Style TargetType="Button">
                        <Setter Property="Background" Value="#1877f2" />
                        <Setter Property="Foreground" Value="#EEEEEE" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="Button">
                                    <Border x:Name="border" CornerRadius="15" Background="{TemplateBinding Background}">
                                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                    </Border>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter TargetName="border" Property="Background" Value="#13529c" />
                                            <!-- マウスオーバー時の背景色を変更 -->
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </Button.Style>
            </Button>
```

# おわりに
C#WPFで作ったアプリって殺風景になりがちですけど
こういうボタン1個置いとけば印象変わりますよねー

WebやスマホアプリのUiに慣れている人が過半数だと思うので
PCアプリを作るとなってもPCアプリだけ参考にしてたんじゃダメだなーとは個人的に思ってます

vscodeとかの開発環境・エディタをカジュアルよりのデザインにしても違和感あると思うので作るアプリによりけりですが
JQueryとは？

# JQuery
JavaScriptのライブラリです。

「ライブラリ」とは、ある程度まとまったプログラムをあらかじめ作ってくれている
ファイルのこと。
つまり、jQueryは、JavaScriptを使いやすいように拡張してくれているもの。

javascriptで１０行→JQueryでは３行で済む。

# HTML&CSSの操作
HTMLのheadタグ内にjQueryライブラリーを読み込む。詳細は「スライドショープラグイン」で。

https://jquery.com/

```html
<script src=”js/jquery-3.x.x.min.js”></script>
```

# JQueryCDNプラグイン

### JQueryをCDNで読み込む方法
CDNとは・・・
「CDN」はContent Delivery Networkの略で、簡単に言うとインターネット経由でファイルを配信
する仕組みのこと。
特にjQueryなどで利用する場合は、ソースファイルをネット経由で使えるためファイルをダウンロードする必要がない。「JQuery CDN」と検索すれば出てくる。
![JQuery1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/293df6ca-eb12-ad53-fa9c-eea21d94011e.png)

![JQuery2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/81dbeaed-097d-d082-f236-a8eef28af46d.png)

### JQuery CDNでハンバーガーメニューを作る
「jQueryをCDNで読み込む方法」でコピーしたものをhead内にペースト＆指示を記述
```html
<head>

    <script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous">
    </script>

    <script type="text/javascript">
        $(function () {
        
        $('ハンバーガーメニューのアイコンのclassなどを記述').on('click', function () {
        
        $('body').toggleClass('open');
        
        });
        
        });
    </script> 
    
</head>

```


## スライドショープラグイン


#### ①JQueryを記述する前に・・・
HTMLのheadタグ内にjQueryライブラリーを読み込む。

https://jquery.com/

![JQuery bxslider url1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/fc802e6b-33c3-9526-3e7c-ce309843e38a.png)
![JQuery bxslider url2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/0cef07de-0aaf-e7bf-a1ce-894d810585c3.png)

```html
<head>
    <script src=”js/jquery-3.x.x.min.js”></script>
</head>
```

#### ②bxSliderの公式HPでファイルをダウンロードする。

https://bxslider.com/

![bxSlider1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/ff90b8eb-0854-4495-bff9-244a12b22f5a.png)

![bxSlider2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/b40b4461-c0aa-065d-a148-6e32cc215148.png)

cssファイルとJSファイル「min」がついているのは圧縮系 →軽いが編集できない。
編集したい場合は「min」がついていないものを選ぶ。

#### ③ダウンロードしたbxsilderファイルを使いたいフォルダーに移す。
![JQuery-bxslider2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/52775a52-bb10-5d54-8f08-23b756a6ada4.png)


#### ④自分で作成したscriptファイルにスライドショーの指示を記述。

```javascript
$(function(){
	$('.slider').bxSlider({
auto: true,
pause: 3000,
speed: 3000,
pager: true,
controls: false,
mode:'fade',
});
});
```
#### ⑤設置場所
htmlファイルのheadの中にlinkやscript要素を追加。body内にスライドさせたい画像などを記述。
```html
<head>
	<link rel="stylesheet" href="js/jquery.bxslider.css">
    
    <script src="js/jquery-3.7.1.min.js"></script>
    <script src="js/jquery.bxslider.min.js"></script>
	<script src="js/script.js"></script>
</head>

<body>
    <div class="slider">
    <div>画像１</div>
    <div>画像２</div>
    <div>画像３</div>
</body>
```

↓①と④を飛ばしたやり方。①でダウンロードせずにCDNで読み込ませる。④のscriptファイルは用意せず、html内に記述。

![bxSlider2 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717619/ebd6d54c-ccd3-0729-a0b7-86a59076b4c2.png)
なぜかmatchの型があっているのにもかかわらずコンパイルエラーになった

`match` arms have incompatible types
distinct uses of `impl Trait` result in different opaque types
とでていた。

## 問題のコード

```rust
async fn foo() -> i32 { 0 }
async fn bar() -> i32 { 1 }
async fn qux(x:bool)  { 
  match x {
    True => foo(),
    False => bar(),
  }
}
```
すると先のエラーが出る。

> `match` arms have incompatible types
distinct uses of `impl Trait` result in different opaque types

## 原因
asyncにしていることが問題だった。
非同期の中ではopaque typeになるらしい。


https://users.rust-lang.org/t/distinct-uses-of-impl-trait-result-in-different-opaque-types/79932/2
別のリストの共有設定を変える

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)


承認申請用の共通リストから、実際に申請した内容を保存しているリストの共有設定を変えたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/295ec039-aeba-7481-917e-757df9ae0192.png)

まずは、アイテムまたはファイルの共有を停止したいのだけど...

標準のアクションからは、上記の項目が選べませんね。相変わらず使いにくなぁ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/74d6f715-a0b0-ecac-fd0a-a5e58f97ba44.png)

もしかして、試しに使っている「選択したアイテムの場合」のアクションの問題？

このIDを使ってリストのアイテムを取ってみるか。

リスト名は適用できたけど、リストのIDが表示されないです。OrgId(数値)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/badf827e-1ab8-a6c3-fe56-d81139b9643f.png)


# Jsonの解析がエラー

どんな入力を使っても... 意味が分からん

:::note alert
Unable to process template language expressions in action 'JSON_の解析' inputs at line '0' and column '0': 'Required property 'content' expects a value but got null. Path ''.'.
:::


今度は何をしてもこんな画面だな。
ほんとうに売り物のツールなのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fe39ca23-3ccf-ac86-7d53-1a8e4b49e9fd.png)

**仕方ないので、このエラーになるフローは削除して再度作り直しました**


# 405error

間違ってPOSTの代わりにGETを使ったため

```
{
  "status": 405,
  "message": "HTTP メソッド 'GET' は、リソース 'AddRoleAssignment' へのアクセスのために使用できません。リソースの操作の種類は 'Default' として指定されています。正しい HTTP メソッドを使用してリソースを呼び出してください。\r\nclientRequestId: 38ca796f-d059-4322-a441-be7ba4c852de\r\nserviceRequestId: 42e912a1-2040-3000-0c1a-6c49345423e9",
  "source": "https://xxxxxxom/sites/sandbox_approval/_api/lists/getByTitle('019%E4%BD%8F%E6%89%80%E5%A4%89%E6%9B%B4%E5%B1%8A')/items(17)/roleassignments/addroleassignment(PrincipalId=17,roleDefId=1073741827)",
  "errors": [
    "-1",
    "Microsoft.SharePoint.Client.ClientServiceException"
  ]
}
```


# 最終的なフロー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d94866f8-9e5c-9228-76b8-fe9b51fc7aa0.png)

ポイントとしてはIDがうまくパラメータとして渡せないので、JSONの解析を使って取得する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/566197e2-bea8-73f8-7095-f2d48a65dc19.png)

コンテンツ

```
@{body('グループ情報の取得_HTTP_要求')?['d']}
```

スキーマ

```JSON
{
    "type": "object",
    "properties": {
        "Id": {
            "type": "integer"
        }
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4d293b6b-a9a1-32d9-bae9-276d15486a54.png)


コンテンツ

```
@{body('項目の取得')}
```

スキーマ

```JSON
{
    "type": "object",
    "properties": {
        "OrgId": {
            "type": "integer"
        }
    }
}
```
テキストはダイレクトに使えるんだけど数値型がうまくいかないかな？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/36d190fc-31d1-aab1-58c0-6e2cc40d5b52.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/17bf52a2-7975-3d58-9106-a5a6445793df.png)
C#WPFで画面を3分割するグリッドレイアウトの作り方【コピペでOK】

```
最終更新日: 20240307
```

# 目標
このような画面を作れるようになる
![スクリーンショット 2024-03-07 124133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714713/886d0f82-d7be-7c8e-462b-23083e6103b4.jpeg)

# ソースコード
xamlのソースコードです
コピペでOK
``` xml
   <Grid>
       <!-- グリッドレイアウト定義 -->
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="2" />
            <RowDefinition Height="260" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <!-- GridSplitterを使ってパネルの移動が可能 -->
        <GridSplitter Grid.Row="1" HorizontalAlignment="Stretch" />


        <!-- 上部の画面領域 -->
        <Grid Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="2" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            
            <GridSplitter Grid.Column="1" HorizontalAlignment="Stretch" />
            
            
            <!-- 上部左側の画面 -->
            <Border Background="LightGray">
                <!-- 上部左側の画面のコンテンツをここに配置 -->
                
            
            </Border>
            
            <!-- 上部右側の画面 -->
            <Border Grid.Column="2" Background="LightBlue" >
                <!-- 上部右側の画面のコンテンツをここに配置 -->


            </Border>
        </Grid>

        <!-- 下部の画面領域 -->
        <Border Grid.Row="2" Background="LightGreen">
            <!-- 下部の画面のコンテンツをここに配置 -->

        </Border>
        
    </Grid>
```

# おわりに
画面を分割するUiをグリッドレイアウトって呼称するのは
記事を書こうと思って初めて知りました
覚えとかないとなあ
【備忘録】VSCodeでPythonをデバッグ起動するときのメモ

# はじめに
VSCodeのデバッガを利用して、poetryの処理を追いたいです。
デバッガの設定で少し手間取ったので、自分用のメモとして残しておきます。

# 環境
* VSCode 1.87.0


```
Version: 1.87.0 (user setup)
Commit: 019f4d1419fbc8219a181fab7892ebccf7ee29a2
Date: 2024-02-27T23:41:44.469Z
Electron: 27.3.2
ElectronBuildId: 26836302
Chromium: 118.0.5993.159
Node.js: 18.17.1
V8: 11.8.172.18-electron.0
OS: Windows_NT x64 10.0.22631
```

# poetry 1.9の処理をデバッグ実行で確認する
## 事前準備

```
$ git clone https://github.com/python-poetry/poetry.git

$ poetry install

$ poetry env info

Virtualenv
Python:         3.12.1
Implementation: CPython
Path:           /home/yuji/.cache/pypoetry/virtualenvs/poetry-T2B_RS4e-py3.12
Executable:     /home/yuji/.cache/pypoetry/virtualenvs/poetry-T2B_RS4e-py3.12/bin/python
Valid:          True

Base
Platform:   linux
OS:         posix
Python:     3.12.1
Path:       /home/yuji/.pyenv/versions/3.12.1
Executable: /home/yuji/.pyenv/versions/3.12.1/bin/python3.12

```


## 手順
1. VSCodeでPythonのInterpreterで、poetryが生成した`poetry-T2B_RS4e-py3.12/bin/python`を選択する
2. 以下のような`launch.json`を使ってデバッガを起動する。以下の`launch.json`は`poetry run poetry show --all`を実行する。

```json:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "test1",
            "type": "debugpy",
            "request": "launch",
            "module": "src.poetry.__main__",
            "args": [
                "show",
                "--all"
            ],

        }
    ]
}
```

## ハマったこと
* `launch.json`で、`module`ではなく`"program": "src/property/__main__.py"`を指定してしまった。実行時にエラーが発生した。
* Pythonのinterpreterに、poetryが生成していない仮想環境を選択してしまった。実行はできるが、ブレークポイントで停止しなかった。


# pandas 2.2.1の処理をデバッグ実行で確認

## 実行するコード
```python:sample.py
import pandas
df1=pandas.DataFrame({"A":[1,2,3]},index=["x","y","z"])
df2=pandas.DataFrame({"B":[11,12,13]},index=["x","y","z"])
df3 = df1.join(df2)
```

## 手順
1. `launch.json`に`"justMyCode": false`を追加して、デバッガを起動する。`justMyCode`のデフォルト値は`true`。


```json:.vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python Debugger: Current File",
            "type": "debugpy",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            // 追加
            "justMyCode": false
        }
    ]
}
```

https://code.visualstudio.com/docs/python/debugging#_justmycode

>When omitted or set to true (the default), restricts debugging to user-written code only. Set to false to also enable debugging of standard library functions.


## ハマったこと
* `justMyCode`プロパティの存在を知らず、pandasの内のコードにブレークポイントを置いても、処理が止まらなかった