OmniAICreator/Qiita-1.07M huggingface dataset:
[備忘録]sikulixでライブラリを作成し、利用する場合、同一階層でなければ読み込めないエラーに直面した話

# 前書き
タイトルの通りです。
SikuliXでライブラリを作成し、利用しようとしたところ利用できなかったり利用できたりと意味不明だったので、
記事にしたためてメモ書きとして残します。

実行環境は
windows10
SikulixIDE-2.0.5
となります

#### 2023年8月18日 追記 解決しました
sys.path.appendの書き方が悪かっただけでした。
os.pathを使って書くべきなので下記の書き方が良いです。

```
sys.path.append(os.path.dirname(os.path.abspath('__file__')) + '/mylib.sikuli')
import mylib
```

１つ気を付けることが、
IDEで直接Sikulixを再生している場合、
```
os.path.dirname(os.path.abspath('__file__'))
```
上記の値が示す場所がjarのある場所となるので、jarはモジュールと同一階層に配置する必要があります。


# 内容
SikuliXは使いまわしたいコードはライブラリにまとめることで再利用しやすくすることが出来ます。
例:
```python: test.sikuli
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
sys.path.append("C:\Users\sakak\Documents\tool\sikulix\qiita記事ネタ\mylib.sikuli")
import mylib

def main():
    mylib.init()


main()
```

```python: mylib.sikuli
# -*- coding: utf-8 -*-
# 更新したらIDEを再起動すること
import sys
sys.setdefaultencoding('utf-8')
from sikuli import *

def init():
    print('init処理')
    Settings.MoveMouseDelay = 0

def waitClick(img, time):
    wait(img, time)
    click(img)
```

上記コードの場合、再利用したいコードをmylib.sikuliに格納し、
それをtest.sikuliで読み込んで利用しています。

この時、mylib.sikuliとtest.sikuliが同一階層でなければ、import出来ないという問題に直面しました。


### 実行結果
同一階層時
フォルダ構成
```shell-session
C:\Users\sakak\Documents\tool\sikulix\qiita記事ネタ>tree
フォルダー パスの一覧
ボリューム シリアル番号は 5821-FA46 です
C:.
├─mylib.sikuli
└─test.sikuli
```

同一階層時の実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/a89c3ca3-7f57-83b0-f339-3e7db4673820.png)


別階層時
フォルダ構成
```shell-session
C:\Users\sakak\Documents\tool\sikulix\qiita記事ネタ>tree
フォルダー パスの一覧
ボリューム シリアル番号は 5821-FA46 です
C:.
├─mylib.sikuli
└─test
    └─test.sikuli
```

別階層時の実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/f733d20e-1b1e-add0-c9be-0e9a06f00468.png)


このように同一階層に無い場合、
定義したライブラリを見つけることが出来ず、Importエラーが発生する。


この事象について、ネットで解決策を探したんですが、
解決に至れる内容がありませんでした。（sikulixについて誰か記事書いて。。。）

何故ImportErrorが発生するか結構謎なんですが、
備忘録を兼ねて、この段階で投稿します。
また情報が見つかり次第、記事を更新します。
LATCH法について


LATCH法は、データや情報を整理するための方法としても使われることがあります。以下に、LATCH法を用いたデータ整理の手順を示します。

1. Latch On（取りつける）：データを収集し、最初の段階で整理します。データのソースを特定し、適切に文書化することが重要です。
1. Audible Swallowing（聞こえる飲み込む音）：データを分類するための基準を確立します。データを関連するカテゴリに分類し、それらが明確に定義されるようにします。
1. Type（タイプ）：データを分析する方法を選択します。適切なデータ分析方法を選択し、データがどのように分類されたかを確認します。
1. Comfort（快適）：分析されたデータが分かりやすいかどうかを確認します。データが意味を持ち、分かりやすい方法で提示されることを確認します。
1. Hold（保持する）：データを報告する前に、十分に検討し、整理します。データの重要な洞察をまとめ、結果を説明するためにグラフや表を用いて分かりやすく提示します。
LATCH法を用いることで、データを整理するプロセスを容易にし、データ分析の正確性やデータの理解を向上させることができます。

また、LATCH法には、情報を整理するための別の手順もあります。以下に、LATCH法を用いた情報整理の手順を示します。

1. Location（場所）：情報のソースを特定し、整理します。情報がどこから来たのか、どのようにアクセスできるのか、また情報がどの程度信頼できるのかを確認します。
1. Alphabet（アルファベット）：情報を関連するテーマに基づいてアルファベット順に整理します。関連するテーマを見つけ、アルファベット順に情報を整理することで、検索が容易になります。
1. Time（時間）：情報を時系列に整理します。情報が発生した時期に基づいて情報を整理することで、特定の出来事に関連する情報を見つけることができます。
1. Category（カテゴリ）：情報を関連するカテゴリに分類します。情報をどのように分類するかを決定し、関連するカテゴリに情報を整理します。
1. Hierarchy（階層）：情報を親子関係に基づいて階層的に整理します。情報を階層的に整理することで、より複雑な情報を分かりやすく整理することができます。

これらの手順を用いることで、情報を整理するプロセスを簡素化し、情報の検索や分析を容易にすることができます。


【使用例1】
ある企業が、顧客満足度に関するデータを整理することを考えているとします。以下にLATCH法に基づいたデータ整理の手順を示します。

Latch On（取りつける）：顧客満足度調査の結果を収集し、データを整理します。
Audible Swallowing（聞こえる飲み込む音）：顧客満足度を以下のカテゴリに分類します。
製品に関する満足度
サービスに関する満足度
価格に関する満足度
顧客サポートに関する満足度
Type（タイプ）：各カテゴリにおける顧客満足度の平均値を計算します。
Comfort（快適）：グラフや表を用いて、各カテゴリにおける顧客満足度を分かりやすく示します。
Hold（保持する）：データをまとめ、報告書を作成します。
【使用例2】
ある学生が、複数のウェブサイトから集めた環境問題に関する情報を整理することを考えているとします。以下にLATCH法に基づいた情報整理の手順を示します。

Location（場所）：各ウェブサイトのURLを記録し、情報源を特定します。
Alphabet（アルファベット）：情報を以下のテーマに基づいてアルファベット順に整理します。
空気汚染
水質汚染
土壌汚染
Time（時間）：情報を以下のように時系列に整理します。
過去の環境問題
現在の環境問題
将来の環境問題
Category（カテゴリ）：情報を以下のカテゴリに分類します。
原因
影響
解決策
Hierarchy（階層）：情報を以下のように階層的に整理します。
原因
人為的要因
自然的要因
影響
生物多様性
健康被害
地球温暖化
解決策
消費者行動
政策改革



おまけ：LATCH法:授乳の手順編
1. Latch On（乳首を口に含む）：赤ちゃんが口を開けて乳首を含むように誘導します。
1. Audible swallowing（吸い込む音が聞こえる）：赤ちゃんが吸い込む音が聞こえるように、乳首が口にしっかりと密着していることを確認します。
1. Type（乳房を適切に含む）：赤ちゃんが乳房を適切に含んでいることを確認します。
Comfort（快適である）：母親と赤ちゃんが快適であることを確認します。
1. Hold（抱き方が正しい）：母親が赤ちゃんを適切に抱くことができていることを確認します。
これらの要素を意識しながら授乳することで、赤ちゃんと母親の両方が快適で、効果的な授乳を行うことができます。LATCH法は、特に初めての母親や乳房に問題のある母親にとって、非常に役立つ方法となります。

ソース
MedlinePlus: LATCH評価法:https://llli.org/breastfeeding-info/latch/
La Leche League International: LATCH - https://www.llli.org/breastfeeding-info/latch/
(当然ながら)chatGPTはUMLも作図できます

[こちらに投稿した記事の転載です。](https://sirkus.co.jp/2023/07/26/chatgpt%e3%81%a7uml%e3%82%92%e4%bd%9c%e5%9b%b3%e3%81%99%e3%82%8b/)

UMLとは処理の流れや関係性を図示するためのモデリング手法で、エンジニアでなくとも使うことがあると思います。
例えばユースケース図、シーケンス図、アクティビティ図、クラス図などです。

基本的には画像になるのでchatGPTに作図してもらうのは出来ないんじゃないか、となるかもしれませんが・・・

それPlantUMLなら出来ます！

## PlantUMLとは

詳細は省きますが、UMLをテキストデータで作図する方法です。
[公式サイト](https://plantuml.com/ja/)が広告だらけなのでいまいちオフィシャル感がないのですが
テキストでUMLを作図する仕様としてはデファクトスタンダードであると思います。

テキストで書くことにより、バージョン管理ソフトなどで差分管理することが可能となりメンテナンス性があがります。
また、記法が直観的なので習熟コストも低いです。
例えば以下のような形です。
```text
@startuml
Alice -> Bob: 認証リクエスト
Bob --> Alice: 認証返答

Alice -> Bob: 他の認証リクエスト
Alice <-- Bob: 他の認証返答
@enduml
```
```plantuml
@startuml
Alice -> Bob: 認証リクエスト
Bob --> Alice: 認証返答

Alice -> Bob: 他の認証リクエスト
Alice <-- Bob: 他の認証返答
@enduml
```

テキストから画像への変換ソフト/プラグインも充実しており、実際このQiitaのマークダウンも画像化に対応しています。(上記は画像貼り付けではなく、markdownにテキストを記載)

VSCodeでの設定方法は他の方の記事を参照（多分今はPlantUMLプラグイン入れるだけでGraphvizは勝手に入るんじゃないかな)
https://qiita.com/couzie/items/9dedb834c5aff09ea7b2

## chatGPTで作図

いよいよ本番です。ここまで言えば、もうなんとなくわかっていると思いますが・・・
以下の様なプロンプトを要求するだけです。

```text
車修理会社と保険会社、車の所有者、警察など
車の事故が発生した際の処理の流れをシーケンス図でpuml形式で記載してください。
```
と以下の様な返答が帰ってきます。
```text
以下に車の事故が発生した際の処理の流れを示すPlantUMLのシーケンス図のコードを示します。シーケンス図は、参加者間のメッセージの交換を時間順に描画することで、プロセスのフローを視覚化します。

puml
Copy code
@startuml
participant "車の所有者" as A
participant "警察" as B
participant "保険会社" as C
participant "車修理会社" as D

A -> B: 事故報告
activate B
B -> A: 事故情報を取り、報告書を作成
deactivate B

A -> C: 保険申請と警察の報告書を提出
activate C
C -> A: 保険申請の確認
C -> D: 修理の承認を通知
deactivate C

activate D
D -> A: 車を修理
D -> C: 修理の請求書を送る
deactivate D

activate C
C -> A: 保険申請の決済（請求書の支払いまたは請求書への異議申し立て）
deactivate C

@enduml
このシーケンス図では、以下のような処理の流れを示しています：

車の所有者が警察に事故を報告します。
警察は事故の報告を受け、事故報告書を作成します。
車の所有者は保険会社に対して保険申請と警察の報告書を提出します。
保険会社は保険申請を確認し、修理の承認を車修理会社に通知します。
車修理会社は車を修理し、修理の請求書を保険会社に送ります。
保険会社は保険申請の決済を行います（請求書を支払うか、請求書に異議を申し立てます）。
このコードをPlantUMLでレンダリングすることで、シーケンス図を作成できます。
```
これをPlantUMLに画像化できるソフトに入力する形になります。
(私はVSCodeのPlantUMLプラグインを使用しています。)
```plantuml
@startuml
participant "車の所有者" as A
participant "警察" as B
participant "保険会社" as C
participant "車修理会社" as D

A -> B: 事故報告
activate B
B -> A: 事故情報を取り、報告書を作成
deactivate B

A -> C: 保険申請と警察の報告書を提出
activate C
C -> A: 保険申請の確認
C -> D: 修理の承認を通知
deactivate C

activate D
D -> A: 車を修理
D -> C: 修理の請求書を送る
deactivate D

activate C
C -> A: 保険申請の決済（請求書の支払いまたは請求書への異議申し立て）
deactivate C

@enduml
```

他にもPlantUMLで作図可能なものはなんでもいけます。以下はユースケース図です。

```text
車修理会社と保険会社、車の所有者、警察など
車の事故が発生した際の関連をユースケース図で表してください
```
```plantuml
@startuml
left to right direction
actor "車の所有者" as A
actor "警察" as B
actor "保険会社" as C
actor "車修理会社" as D

package "事故処理" {
  usecase "事故報告" as UC1
  usecase "保険申請" as UC2
  usecase "修理の承認" as UC3
  usecase "車の修理" as UC4
  usecase "修理の請求" as UC5
  usecase "保険申請の決済" as UC6

  A -- UC1 : 警察に事故を報告
  A -- UC2 : 保険会社に保険申請を行う

  B -- UC1 : 事故報告を受ける
  C -- UC2 : 保険申請を受ける
  C -- UC3 : 修理の承認を行う
  D -- UC4 : 車を修理する
  D -- UC5 : 修理の請求を行う
  C -- UC6 : 保険申請の決済を行う
}
@enduml
```

# Mermaidもあるよ

Mermaidもやはりクラス図、シーケンス図等をテキストでできる記法です。

上記指示でPlantUMLの部分をMermaidに変えればMermaidでも同様のことが出来ます。

PlantUMLはUMLに特化しているのに対して、Mermaidはガントチャートやグラフなんかも書けたりします。
【Chrome】VSCodeでのデバッグ

## はじめに

Vue3のプロジェクトを、VSCode+Chromeデバッグする方法を知ったので、備忘録として残します。

### 環境

- Intel Mac 13.4.1(c)
- Chrome 114.0.5735.198
- VSCode 1.80.1


## 設定
### 1. `create a launch.json`リンククリック

デバッグビューから`create a launch.json file`リンクをクリックします。

![01_デバッグビュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519083/d602c26b-e9ef-428c-6b0a-ee6b11d2f56e.png)

### 2. Web App(Chrome)デバッガー選択

デバッガーの候補から「Web App(Chrome)」を選択します。

![02_Chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519083/f0bbd9e8-039e-87ea-e906-07fb7baf9b89.png)

### 3. `launch.json`修正

`launch.json`が作成されるので、環境に合わせて修正します。
今回はポート番号を変更しました。

```diff:launch.json
    {
      "version": "0.2.0",
      "configurations": [
        {
          "type": "chrome",
          "request": "launch",
          "name": "Launch Chrome against localhost",
-         "url": "http://localhost:8000",
+         "url": "http://localhost:5173",
          "webRoot": "${workspaceFolder}"
        }
      ]
    }
```

## デバッグ

VSCodeでブレイクポイントを設定し、デバッガを起動(Cmd+F5)するとブラウザが起動します。
その起動したブラウザで、操作するとVSCodeのブレイクポイントの場所で処理が止まります。

![03_デバッグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519083/d686a96e-7313-bedc-51d6-dd44dfdf0d37.png)
複数のjpgファイルをまとめたpdfファイルを作成するワンライナー

# 複数のjpgファイルをまとめたpdfファイルを作成するワンライナー

## 良い方法
```
convert *.jpg -background white -page a4 output.pdf
```
サイズを指定しないと印刷する際に大変ことになります (n = 1)
## 無駄の多い方法
処理に時間がかかるし、容量も大きくなるのでいいことなし
```
for i in $(ls) ;do convert ${i} ${i%.*}.pdf; done; convert *.pdf output.pdf
```

pdfをまとめるのはもっといい方法があるかも

## 感想
imagemagick便利すぎ

## 参考リンク
https://qiita.com/mriho/items/b30b3a33e8d2e25e94a8
【Swift】viewDidLoad時の画面遷移

## はじめに
UIViewControllerの``viewDidLoad``で画面遷移したい！と思って色々調べたのでメモします。

## 結論
**結論から言うと、`viewDidLoad()`内での画面遷移はできません！**
じゃあどうすればいいのかというと、`viewDidAppear(_ animated: Bool)`を使用します。
そもそもviewDidLoadとは、``画面の読み込みが完了した後``に呼ばれるメソッドなので、そこで画面遷移をしようとしても遷移する画面が無いのでできないわけです。
そこで、viewDidAppearの登場です！
viewDidAppearとは、``画面が表示された後``に呼ばれるメソッドです。
そのため、以下のようにメソッドを追加して画面遷移の処理を書くことで、既に遷移される画面は存在した状態で処理が走るので遷移可能というわけです！
```Swift:viewDidAppear追加
override func viewDidLoad() {
    super.viewDidLoad()

}
override func viewDidAppear(_ animated: Bool) {
    //ここに画面遷移する処理を記述する。
}
```
Session ManagerでEC2に接続しようとしたらError発生 2023/07/26

# 今回のエラー内容
EC2にSSM経由で接続しようとコマンドを入力した結果エラーが発生しました。
```bash
aws ssm start-session --target {インスタンス-ID} --profile {プロファイル名}
An error occurred (TargetNotConnected) when calling the StartSession operation: {インスタンス-ID} is not connected.
```

# 結論
VPCエンドポイントのインバウンドルールにHTTPSがなかったことが原因でした。

# 調査の過程
### EC2にEC2 Instance Connectを使用して接続して、SSM Clientのログを確認
上記注意点として、EC2にいったんSSH接続可能なインバウンドルールを適用する必要があります。
SSH接続ができたら、`sudo ls /var/log/amazon/ssm`でファイルを確認して、`sudo tail /var/log/amazon/ssm/errors.log`でログを確認します。
```bash
caused by: Post {URL}: dial tcp {IPアドレス}:443: i/o timeout
```
そしたら、上記エラーログを確認できました。
知らないIPのHTTPSポートにPOSTしようとしてtimeoutになっていることは理解できたのですが、どこに投げているのかのさっぱりわかりませんでした。

### とりあえずログと状況でググる
ググると下記URLがヒットしたので、見てみると、3番目の状況が似ていると思い、VPCのネットワークACLとEC2のセキュリティールールを確認しました。しかし、両方とも適切に設定されていました。
> https://repost.aws/knowledge-center/ssm-tcp-timeout-error

### さらにググる
すると下記URLがヒットしました。見てみると、VPCエンドポイントを通り、Session Managerとのやり取りをするみたいです。ならばと思い、VPCエンドポイントのインバウンドルールを見てみるとHTTPSのルールがありませんでした。
> https://www.guri2o1667.work/entry/2020/05/01/AWS_SessionManager%28%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%EF%BC%89%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86

### まとめ
VPCエンドポイントやAWS System Manager Session Managerについての理解がまだ浅いと感じました。まだまだ、凡事徹底やな。
【ChatGPT無】物理式も。LaTeX記法その２

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　昨日のLaTeX記法
[【ChatGPT無】で数式・化学式を表示。LaTeX記法その１](https://qiita.com/kabumira/items/927f494d9c868fa86549)
　　　の続きです。

　アップしたあと、
　　そういえば、物理も式は
　　　あったよなぁ、と気付き、
　　　　ちょっと調べてみました。

　ありました、物理式。

　ChatGPTさんに、
　　出してもらいました。
***
　ということで、
　　サンプルです。
　　　Qiitaに表示するために
　　　「\\[」式「\\]」の
　　　　式の前後を削り、
　　　　　式の前後に「$」を
　　　　　　入れています。

　引用は、プロンプト。
　　そのあとは、ChatGPTさんです。
***
>高校で習う物理式を教えてください。
コードではなく、物理式（LaTeX）で表示してください。

以下は高校で一般的に習う物理式をいくつかLaTeXで表示したものです：

1. $速度 (\(v\) は物体の速度、\(d\) は物体の変位、\(t\) は時間)：$
$ v = \frac{d}{t} $

2. $加速度 (\(a\) は物体の加速度、\(v_0\) は初速度、\(v\) は最終速度、\(t\) は時間)：$
$ a = \frac{v - v_0}{t} $

3. $運動エネルギー (\(m\) は物体の質量、\(v\) は物体の速度)：$
$ \text{運動エネルギー} = \frac{1}{2} m v^2 $

4. $力 (\(F\) は物体に作用する力、\(m\) は物体の質量、\(a\) は物体の加速度)：$
$ F = m \cdot a $

5. $ニュートンの運動方程式 (\(F\) は物体に作用する力、\(m\) は物体の質量、\(a\) は物体の加速度)：$
$ F = m \cdot a $

6. $万有引力 (\(F\) は物体にかかる万有引力、\(G\) は万有引力定数、\(m_1\) と \(m_2\) は物体の質量、\(r\) は物体間の距離)：$
$ F = \frac{G \cdot m_1 \cdot m_2}{r^2} $

7. $単位変換 (\(c\) は光速、\(E\) はエネルギー、\(m\) は質量)：$
$ E = m \cdot c^2 $

これらは高校の物理学で学ぶ基本的な式の一部です。これらの式は物体の運動、力、エネルギーに関連しており、物理学の基礎を形成します。
***
>大学で習う物理式を教えてください。
コードではなく、物理式（LaTeX）で表示してください。

以下は大学で習う物理学の一部の式をLaTeXで表示したものです：

1. $波動関数 (\(\Psi\) は量子力学における波動関数、\(x\) は位置、\(t\) は時間)：$
$ i\hbar \frac{\partial \Psi}{\partial t} = -\frac{\hbar^2}{2m} \frac{\partial^2 \Psi}{\partial x^2} + V \Psi $

2. $シュレディンガー方程式 (\(\Psi\) は波動関数、\(H\) はハミルトニアン演算子)：$
$ H \Psi = i\hbar \frac{\partial \Psi}{\partial t} $

3. $マクスウェルの方程式 (自由空間における電磁気学の基本的な方程式):$
  (アンペールの法則)
  $ \nabla \times \mathbf{B} = \mu_0 \mathbf{J} + \mu_0 \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} $

  (ガウスの法則（電場）)
  $ \nabla \cdot \mathbf{E} = \frac{\rho}{\varepsilon_0} $

  (ガウスの法則（磁場）)
  $ \nabla \cdot \mathbf{B} = 0 $

  (ファラデーの法則)
  $ \nabla \times \mathbf{E} = -\frac{\partial \mathbf{B}}{\partial t} $

4. $ローレンツ力 (\(\mathbf{F}\) は物体にかかるローレンツ力、\(q\) は電荷、\(\mathbf{v}\) は速度、\(\mathbf{B}\) は磁場、\(\mathbf{E}\) は電場):$
$ \mathbf{F} = q(\mathbf{E} + \mathbf{v} \times \mathbf{B}) $

5. $熱力学第一法則（エネルギー保存の法則）:$
$ \Delta U = Q - W $

6. $熱力学第二法則 (カルノーサイクルの効率):$
$ \eta = 1 - \frac{T_C}{T_H} $

7. $ブラッグの法則 (X線回折における結晶格子の角度):$
$ n\lambda = 2d\sin\theta $

これらは大学の物理学で学ぶより高度な概念や理論を表す式の一部です。これらの式は量子力学、電磁気学、熱力学などの分野で重要な役割を果たします。
***
　ここから自分です。
　次回は、文系です。
　一気に書けなかったw

　なお、追記です。

　　LaTeX記法その１
[【ChatGPT無】で数式・化学式を表示。LaTeX記法その１](https://qiita.com/kabumira/items/927f494d9c868fa86549)

　　LaTeX記法その３
[【ChatGPT無】を文系も使おう。LaTeX記法その３](https://qiita.com/kabumira/items/95e2e21d5c35bcb08f85)
vue.jsで、「事前に指定した特定のhtml」の要素を、「methodsで定義した関数内」で取得する

# 結論
事前に取得したい要素に対して`ref`属性を設定しておきます。「methodsで定義した関数内」で使用するときは`this.$refs.{refに設定した属性名}`で要素を取得できます。

# 前提
- この記事ではCDN の Vue を使用しています。
- vue@3.3.4を使用しています

# サンプルコード
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="LYXJwxo" data-user="kabuto64425" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kabuto64425/pen/LYXJwxo">
  vue.jsで、特定のhtmlの要素を取得する</a> by kabuto64425 (<a href="https://codepen.io/kabuto64425">@kabuto64425</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 補足
もし自分で定義したコンポーネントでも`ref`を指定することで取得することができます。
ただし、コンポートネントを取得した場合とHTMLを取得した場合は型が異なるようです。
もし、コンポーネント内の要素を取得したい場合、取得したコンポーネントに`.$el`を使用することで取得できます。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="VwVEZLm" data-user="kabuto64425" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kabuto64425/pen/VwVEZLm">
  vue.jsで、「事前に指定した特定のhtml」の要素を、「methodsで定義した関数内」で取得する(コンポーネント)</a> by kabuto64425 (<a href="https://codepen.io/kabuto64425">@kabuto64425</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

以上です。
Terraformでplanやapplyが実行されない場合の対処法

概要
===

WSLでterraformを使おうとした際に、`terraform plan` や `terraform apply` がいつまで経っても完了しなかったのでその調査結果と対処法です。

環境
===

- Windows 10
- WSL2
- Ubuntu 22.04

原因
===

詳しくはわからないのですが、どうも（WSL）Ubuntuのデフォルトで設定されているネームサーバーからの応答が適切に処理できていないことが原因のようです。
`/etc/resolv.conf` に記載されているネームサーバーを8.8.8.8に変更したところ問題なく　`terraform plan`　や　`terraform apply` が実行されるようになりました。
ただ、WSLのUbuntuでは単純に `/etc/resolv.conf` を修正しただけだと、次回起動時に自動生成されてしまいます。
以下は `/ect/resolv.conf` の永続化 の手順です。

# 手順


## /ect/resolv.confの自動生成の停止

`/etc/wsl.conf` に以下の設定を追記します。

```
[network]
generateResolvConf = false
```

`/etc/wsl.conf` を開きます。

```
sudo vi /etc/wsl.conf
```


私の環境では以下が最初から記載されていたので続きに追記しています。

```/etc/wsl.conf
[automount]
options = "metadata"

[network]
generateResolvConf = false
```

## /etc/resolv.confの設定

WSLでは `/etc/resolv.conf` が `/run/resolvconf/resolv.conf` のシンボリックリンクになっています。
また、起動時・終了時には以下の様な処理が実行されているようです。

**起動時**

- IPv4アドレスを取得
- `/run/resolvconf/resolv.conf` に上記アドレスを nameserver の値として設定
- `/run/resolvconf/resolv.conf` `/etc/resolv.conf` にシンボリックリンクを張る

**終了時**

- `/etc/resolv.conf` を unlink する
- `/run/resolvconf/resolv.conf` を削除

generateResolvConf を false に設定したので、起動時の処理は行われなくなりましたが、終了時の処理は実行されてしまうので、起動時に `/etc/resolv.conf` を作成する方法をとります。

まずは、`/etc/resolv.conf.dist` を作成します

```
sudo vi /etc/resolv.conf.dist
```
`/etc/resolv.conf.dist` に以下を追記

```/etc/resolv.conf.dist
nameserver 8.8.8.8
```

続いて再度 `/etc/wsl.conf` を開き、下記を追記します。

```
[boot]
command = "cp -rup /etc/resolv.conf.dist /etc/resolv.conf"
```

最終的に `/etc/wsl.conf` は以下のようになります。

```/etc/wsl.conf
[automount]
options = "metadata"

[boot]
command = "cp -rup /etc/resolv.conf.dist /etc/resolv.conf"

[network]
generateResolvConf = false
```

あとは、Windows PowerShellからWSLを再起動して `/etc/resolv.conf` に `nameserver 8.8.8.8` が設定されていることを確認し、 `terraform plan` コマンドが正常に実行されればOKです。
私たち「組込屋（エンジニア）」はどこへ行く？（その２）

前回（https://qiita.com/Cente_mw/items/e3cec7e4bc9a39ea1c29 ）からの続きです。


＞　すべてを自社で開発できた時代ならよいのですが、、、やっぱり長期に信頼できるパートナーと組むんですかね。

問題となるのは「長期に信頼できる」という点です。何も「長期供給」「10年保証」と謳っている会社・製品を探す訳ではないのです。前回のFree沼に陥ることなく、つまり、自社の技術レベルを落とすことなく、限られたリソースの中で、開発を継続できる環境を準備したいですね。

はい。そこで問題なのは<b>「自社の技術レベルを落とすことなく」</b>という条件です。

前回書いた様に、部品の代替を考えると「この部品の代替パーツはどれでしょう？」ってSNSで聞いても的確な回答が得られるはずもありません。無責任な情報なら得られるかも。結局はデータシートが読めないと、どんなコントローラが代替にマッチして、代替試験に値するのか判断もできません。

この例で言うと、「データシートが読める事」という技術レベルは落としたくないですね。データシートには、データアクセス幅が書いてあったり、アクセス速度が書いてあったり、DMAの条件が書いてあったり、、、ソフト屋、ハード屋のそれぞれの知識が必要ですよね。そうです、もう「ソフト屋」「ハード屋」という垣根を取り払った「組込屋」である必要があるんです。

さて、一方で、TCP/IPって細部まで知っている、開発できる必要あるでしょうか？　もちろんそのスキルがあれば越したことはありません。が、RFCを理解してTCP/IPをバグなく動かすところまで勉強する労力は必要でしょうか？　
逆に、そんなもの（TCP/IP）はもう枯れてるから、どこかに転がってるFreeや安い製品を組み込めば良いのでは？っと考える考え方もあるでしょう。本当にそれでよいでしょうか？

対極的な2つのスタンスを示しましたが、どちらも問題だと思います。
「組込屋」がフォーカスすべき技術は「本業」の部分です。「餅屋は餅屋」です。キャパが大きいエンジニアであれば守備範囲を広げていくことは良い事ですが、やはり限界があります。自分の本業を「餅屋」にするとした場合、それ以外の部分、今回の場合TCP/IPはどうしたらよいか？
ミドルウェア屋が言うのだから、眉唾モノではありますが、「実績のある【ソースコード】を手に入れる」という事だと思います。そして、【サポートが確実なメーカーを選ぶ】ことだと思います。更に【そのソースコードは改変権、所有権、二次配布権が（ライセンスとして）提供される事】が必須だと思います。
実績のあるソースコードがあり、サポートを受けながら中身を少しでも理解できる（可能性のある）契約条件を選ぶ事が、その後の（最初はパートナー会社のソースコードを購入するという形になりますが）自らの開発工数を「購入」という形でお金で解決することにより、実績に裏打ちされた「安心感」と、早期の開発成果の製品化を実現するのだと思います。ですから、ライセンスは「実績の使用権」を買ったので、その後、そのソースを自分のモノにしていく必要があります。動いているコードがあるので、後から追いつくことは可能ですよね？

そしてもし、そのメーカーが販売を止めてしまっても、改変権を持ってさえいれば、そのソースを何とか解析して自社の製品のサポートを続けること（バグ修正）は可能と思います。全くのブラックボックスで扱う様な、例えばライブラリで提供されるような形で製品化していたら、もう手が出せなくなるのです。なかなか安定的な製品を見つけ、見極めることは難しいですが、開発のパートナーとして実績のあるメーカーの選択をお勧めします。

「ソースコード」「技術サポート」（できれば、動きを追える技術力のあるサポート）、そして「使用権の確認」でしょうか。　

あれ、、、、ミドルウェア屋の記事でした。(笑)


<h3>■今日の閑話</h3>
さて、なんでこんな話をしてきたか、、と言いますと、やはり「技術の空洞化」が進んできたと肌で感じるからなのです。若手のエンジニアに「基板」を渡すと、「動くソフト環境はどこにありますか？」と聞かれることがあります。「この基板で動いているソフトがどこかにあるはずだ」が基本なんですね。
では、そのソフトが無かったら、どうやって動かす？どうするの？っという答えを持っていない、見積もりすらできない、、という状況に陥っていると感じます。ですから、「動くソフトが乗っている基板を買う」という行動になってしまい、「自分で世の中にない基板を作ろう」なんて、思う事もないわけです。ん十年前からの「組込屋」としては、少し悲しい現実です。
<br><br>
嘆いていても何も前進しないので、経験を積むこと、チャレンジしてみる事はとても大切です。自ら調べて苦労して施策したコードが動いた瞬間の感動をバネに、どんどん実績を積んでください。ただ、全方向を同時に埋めていくことは難しいですので、どこから空洞化した技術を埋めていくか？っと考えたときに、ミドルウェア屋の私からの助言としては、ミドルウェアを組み込んだ部分は「安心感」を持てる製品を選んで後回しにしても良いと思っています。既に代替が世にあるわけですから。
<br><br>
（本文中にも書きましたが）後から中身を見てみて、ここどう動いているの？っとサポート質問が来ることを楽しみに待っています。そんな中身の質問、実装の質問もウェルカムです。そんな皆様の隙間を埋められる安心感を与えられるミドルウェア屋でありたいと思っています。
<br>
<br>

Cente：
https://www.cente.jp/

お問合せはこちら：
https://www.cente.jp/otoiawase/

# ■次回
私たち「組込屋（エンジニア）」はどこへ行く？（その３）
https://qiita.com/Cente_mw/items/5646277edd1c912568ce
【Ruby】お金を最小限の枚数の紙幣・硬貨で支払う式

Rubyを使ったアルゴリズムについて学習しています。

今回は、特定の金額を与えられたときに、どのようにそれを最小の枚数の紙幣と硬貨に分けるかを求めていきます。

# 完成コード

```ruby
money = 7468
currencies = [10000, 5000, 1000, 500, 100, 50, 10, 5, 1]
result = {}

currencies.each do |currency|
  count = money / currency
  money %= currency
  result[currency] = count
end

puts result
```

このコードは各紙幣・硬貨で金額を割ってその商（枚数）を得て、それをresultハッシュに保存している。そして、その紙幣・硬貨で金額を割った余りを次の紙幣・硬貨の計算のための金額とする。これを最小の紙幣・硬貨まで繰り返すことで、最小の枚数で金額を分けることができる。


# コードの解説

このコードは、ある金額を最小の紙幣と硬貨の枚数で 表すためのプログラム。 
1. 最初に `money = 6498` と定義して、分解したい金額を設定してる。
1. 次に `currencies = [10000, 5000,1000,500, 100, 50, 10, 5, 1]`と定義して、利用できる紙幣と硬貨の種類を設定してる。 
1. `result = {}`で、各紙幣と硬貨ごとの枚数を 保存するためのハッシュを初期化してる。 
1. `currencies.each do |currency`で、 `currencies`配列の各要素(紙幣や硬貨の額面) に対して以下の処理を行う。 
1. `count = money/currency` で、 現在の金額を 現在の紙幣・硬貨の額面で割った商 (いくつ該当の紙 幣・硬貨が使えるか) を計算してる。
1. `money %= currency`で、 現在の金額を現在の紙幣・硬貨の額面で割った余り(次の紙幣・硬貨を使うための残りの金額)を計算してる。
1. `result[currency] = count`で、現在の紙幣・硬貨の額面とその枚数をハッシュに保存してる。
1. 最後に `puts result` で、各紙幣・硬貨の枚数を出力してる。 






# ポイント

- `each文`を使い、配列の値を一つずつ代入してその下の計算を実施している。

https://udemy.benesse.co.jp/development/system/ruby-each.html

- `a %= b` は代入演算子である。 ` a = a % b` と同じ意味。

https://www.tohoho-web.com/ruby/operators.html
【Ruby】 コロン：の使い方３選

参考：ちゃんるび！さんのudemy動画がとても分かりやすかったです
https://www.udemy.com/course/ruby-on-rails-c/learn/lecture/24901088#reviews

## シンボル　ex) :name, :sbl
- (誤解を恐れずにいうと)Stringの上位互換
- 最初に`：`があったらシンボルと思ってよし
- `不変で重複がない`ため、一意の識別子として頻繁に使用される


## シンボルをキーとしたハッシュ
**定義**
<font color='darkorange'>※どちらもまったく同じハッシュが作成される</font>
```ruby
hash = { :id => 1, :name =>  'saku' }
hash = { id: 1, name: 'saku' }　#(省略系)
```


**参照**
```ruby 
# 'saku' を取り出す)
hash[ :name ]
```

ハッシュは Key の重複を許さないため、同じく重複がないシンボルと相性がよい。
そのためハッシュの Key としてシンボルが多様される。
<font color='darkorange'>シンボルのほうがメモリ効率が良いが、パフォーマンスを気にするレベルの差ではないため、Strig" "表現のほうが可読性がよい等の理由があるときは、Stringを使ってもまったく問題ない。</font>

## メソッドのキーワード引数
```ruby 
#定義
def sum_number( arg1, arg2:)
  arg1 + arg2
end

#呼び出し
sum_number 3, arg2: 4
==> 4
```
- 引数に見出し(キーワード)をつけることができる
- 引数が多い場合にキーワードを指定することで可読性が向上する。
キーワード引数は<font color='darkorange'>順番を問わない</font>のも便利
- 通常引数とキーワード引数は混在できる
  その場合は、通常引数は<font color='darkorange'>キーワード引数より前</font>に定義される必要がある
- キーワード引数がある場合は、呼び出し時に必ずキーワード付きで指定する必要がある
```ruby
#OK
sum_number 3, arg2: 4

#NG
sum_number 3, 4
```
【JavaScript】【Jquery】配列操作 map文 eachよりも優れてる？

```javascript

//varを使用すると再宣言、初期化によるバグを起こしやすくなるため、今は非推奨だから使わないほうが良い

let results = [
    {'name' : '田中',  'japanese' : 83, 'math' : 57, 'science' : 43,  'social' : 72, 'english' : 78},
    {'name' : '渡部',  'japanese' : 62, 'math' : 88, 'science' : 70,  'social' : 66, 'english' : 38},
    {'name' : '品川',  'japanese' : 23, 'math' : 33, 'science' : 53,  'social' : 17, 'english' : 07},
    {'name' : '滝谷',  'japanese' : 93, 'math' : 89, 'science' : 79,  'social' : 96, 'english' : 91},
    {'name' : '川原田','japanese' : 55, 'math' : 56, 'science' : 60,  'social' : 54, 'english' : 66},
    {'name' : '一色',  'japanese' : 27, 'math' : 47, 'science' : 100, 'social' : 42, 'english' : 38},
];

let result = $.map(results, function(e) {
  return e.name;
});

console.log(result);

let array = [100, 110, 120, 130, 140, 150];
let new_array = $.map(array, function(num) {
  return num + 10;
});

console.log(new_array);
```

# 結果
```
[ "田中" , "渡部" , "品川" , "滝谷" , "川原田" , "一色" ]

[110, 120, 130, 140, 150, 160]
```


# DOM操作の場合

```html
<input type="checkbox" name="sports" value="野球">野球
<input type="checkbox" name="sports" value="サッカー">サッカー
<input type="checkbox" name="sports" value="バスケットボール">バスケットボール
```

```javascript
let sports = $('input[type="checkbox"]').map(function(){
    return this.value;
}).get();

let sports = $('input[type="checkbox"]').map((_,e) => e.value).get();

console.log(sports);
```

# 結果
```
["野球", "サッカー", "バスケットボール"]
```
【読み物／前編】StandFM #032 より「トラブル発生…イベント当日に現地へ行けない！」

この記事は、ドーナツ部長のホールナイトニッポン[「#032 NFT ART TOKYOの振り返りと、私にとっての「NFTとは？」」](https://stand.fm/episodes/647cb6018e80262569439a53)の内容を、自動化ツールを組み合わせてテキスト化したものです。テキスト化に際して、一部言い回しのカットや、文末の変更と要約を行っています。

### イントロダクション
ドーナツ部長の「ホールナイトニッポン」、これが32回目の放送となります。さきほどまで、スタンドFMでの前回放送を見直してみたんですけれども、前回の放送が5月22日…ということで、ずいぶん時間が空いてしまったなという感じがしています。

今日は、無事に、そして盛大に終わりました「NFT ART TOKYO」についての報告と、個人的な感想。そして、今現在、私が固定ツイートの方に記載をしている[「2071年のドーナツ部長」](https://app.manifold.xyz/c/2071donuts )というNFTについて、語りたいと思います。

### 本編➀「NFT ART TOKYOに出展するはずでした」
今これを取っているのは、6月4日の深夜になります。ですので、ちょうど昨日！6月3日の12時から、渋谷のパルコ、そしてパルコの向かいの会場では「NFT ART TOKYO 3rd」が開催されていましたね。

前回はね、1回目・2回目と渋谷の「トランクホテル」で。木曜日の開催ということで、平日の夜に行われていたイベントでした。今回は、初めての「土曜日開催」ということで、非常に盛り上がっていましたね。

私もタイムラインで見ていて、「よかったなぁ…」と思ってます。すでにお気づきの方も、いるかも…しれないんですけど。私は今回、「NFT ART TOKYO」の方に、「部長のブース」を出す予定だったんです。

パルコ6階のGG CAFEという場所「51番のブース」でした。 結論から申し上げますと…会場には、行けなかったんです。前日からもう、とんでもなく雨が非常に降っていましてね。「線状降水帯」だったようです。私が住んでいる東海エリアでは、前日6月2日の午前中から午後にかけて、非常に雨が強くなっていて。その日、私は会社に出社してたんですけど。JRの方が、計画運休に入るだろう…ということで。

昼にはもう仕事を切り上げて、自宅に戻ったわけです。で、翌日は朝7時38分の新幹線を予約していたので、十分に間に合うだろう…と考えていたんですね。

### 本編➁「まさかの…新幹線運休」
ところが、まさかの「新幹線運休」ということで。ちょっと…いや相当に凹みましたね。

さすがに会場の方に行けないなんて、思ってもみなかったですから。当日に持っていくものも、たくさん準備していて。実はね、当日の朝未明まで、本当にギリギリまで、いろんなものを作ってたんです。今回、会場で販売する予定だった「2071年のドーナツ部長」のチューニングも、ギリギリまでやっていたので。

私の活動の中間報告、すべてを「6月3日」にかけて、1ヶ月の間、がむしゃらに準備をしてきたんです。…で、当然のトラブル。悪いのはね、私なんですよ。結局、当日の朝に会場入りしようと考えたのがいけなかった。今までは、たまたまトラブルがなかっただけで、やっぱり、こういうリスクを考えるのであれば、当然「前乗り」をすべきなんです。

結果論として、前日まで仕事があったということで、前日の2日に出発するとしても、夜でしたので。結果その時間には、新幹線が運休していたので…2日の夜から出発しようとしても、会場には行けなかっただろうということが、予想されるんですけど。でも、分かったのが夜でしたら、車を飛ばして行くという方法も取れましたよね。夜通し運転すれば、当然車で行けたでしょうし。

この日にかけて、めちゃくちゃ準備をしていたので、見せられる場所を失ってしまうということの辛さ、虚しさは相当なもので。どうしたって、悲しかったですね。同時に、やっぱり「当日の早朝に行こう」と決めた自分が、非常に悔しかったです。


### 本編➂「空っぽのブースにならなくて済んだワケ」
ということで、イベント当日の私は、気分がかなり滅入っていたんですけど。その中でも、あのトミーさん（[@TMR_DAO](https://twitter.com/TMR_DAO)）や、私が今一緒にWeb3の活動をしている「D株式会社」というギルド型の組織があるんですけど。その方たちが、空っぽのブースに、事前に発送しておいた箱が、ポツンと置いてあるわけですね。

そこから、ポストカードやステッカーといった展示できるものや、皆さんに持って行っていただけるものを出してくれて、机の上に並べて展示をしてくれたんです。特に、「D株式会社」の方たちっていうのは、会場入りしてからですね、イベントが終わるまで、ずっといてくれたみたいなんです。

![img_6512.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/a6afd12c-cea6-16f8-c1f4-43aa0b0e4ff2.jpeg)


これがね、本当にありがたかったです。こうやって、Web3の活動で関われている方たちに支えられて、なんとか空っぽのブースが12時から17時まで、ずっと続くような状況にはならなかったんですね。何度も言いますが、本当にありがたかったです。ご本人には、直接俺を申し上げさせていただいたんですけど、改めてこの場でもお礼を言わせてください。

本当にありがとうございました。

![IMG_8185.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416622/6169e9be-1482-dbce-01f2-93ab10f490e3.jpeg)


※この放送回の後編は、「読むアーカイブス」後編として、次回に続きます。

この記事は、著者が運営するメディア「ぬるぺでぃあ」でも読むことができます（記事は[コチラ](https://miuradonuts.com/2023/07/26/fm-010/)）
![](https://miuradonuts.com/wp-content/uploads/2023/06/ヘッダーエリア画像作成.png)
Mac（M1） + Unity + joycon　JoyconLibエラーについて

めちゃくちゃ参考になる記事
https://nn-hokuson.hatenablog.com/entry/2023/02/27/164608

１点私の環境では修正が必要だったので、
書き残しておきます。

M1macだと、hidapiのリビルドが必要になります。

参考ページをもとにビルドしようとすると以下のエラーが出ます。

mac/hid.c:1532:10 Implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'int'

'size_t' (unsigned long) 型から 'int' 型への変換により、整数の精度情報が失われているようです。

hid.cファイルの1532行目を
return (int)copy_len;

と書き換えます。
これでビルドするとエラーが解消されるはずです。
[備忘録]Docker HUBにPushする手順

## 目的
Docker HUBにpushする手順を毎回忘れてしまうので、今回は備忘録として手順を残しておく

## TL;DL
### 既にイメージがある場合
```bash
root@shoma:/home/shoma/rasp# docker image ls
REPOSITORY           TAG               IMAGE ID       CREATED          SIZE
raspios_lite_arm64   2023-08-30        80d8608a6897   3 minutes ago    1.12GB
<none>               <none>            b891f9aacdad   30 minutes ago   1.12GB
shomaigu/ubuntu      latest            b902fc608e64   3 weeks ago      55.3MB
<none>               <none>            0fc35c5cfea4   3 weeks ago      55.3MB
ubuntu               latest            01f29b872827   3 weeks ago      77.8MB
moby/buildkit        buildx-stable-1   4730994867e3   3 weeks ago      157MB
shomaigu/nagios      latest            1f7ed18d4478   9 months ago     794MB
jasonrivers/nagios   latest            35a80d248559   9 months ago     794MB
```
タグ付け＋push
```bash
docker tag raspios_lite_arm64:2023-08-30 shomaigu/raspios_lite_arm64:2023-08-30
docker push shomaigu/raspios_lite_arm64:2023-08-30
```


### dockerでビルドする場合
```bash
docker build ./ubpy -t shomaigu/sotsuken-python:latest
docker login
docker push shomaigu/sotsuken-python:latest
```
```./ubpy```で、ビルドコンテキストを指定する。
```-t```でタグ付けを行う。

### docker-composeでビルドする場合
docker-compose.yml
```docker-compose.yml
version: "3.9"
services:
  dhcp4sv:
    build: ./v4
    image: shomaigu/dhcp4:1.0.0
```

```build```の下に```image```の行を入れる事でビルドしたイメージにタグ付けを行う事が出来る。

```bash
docker login
docker push shomaigu/dhcp4:1.0.0
```
テクニカルライティング検定3級受験しました

受験日：2023-02-19

受験会場：中野サンプラザ



## はじめに

業務でユーザーマニュアル等を書くことが増えたので、テクニカルライティングスキル向上を目的に「テクニカルライティング検定3級」を受験しました。



## 結果

とりあえず合格しました。

選択問題：84点

記述式問題：89点

という結果でした。

全体の合格率は4割程度の意外と難易度高めの検定だったんだと・・



## 勉強方法

検定を主催しているテクニカル～～協会が出している日本語スタイルガイドのみ使用して勉強しました。

その他有力な勉強方法は見つけることができませんでした。



## 出題内容

覚えている範囲で出題されたであろう内容を書き起こしてみました。



## 第一部：選択問題

### 形式

- 試験時間：50分

- 試験問題数：50問

  > なので、1問にかけられる時間は1分となり時間的には余裕

- 形式：4択問題 → 解答用紙に○



## 第二部：記述問題

### 形式

- 試験時間：50分

- 試験問題数：4問

  > なので、1問にかけられる時間は10分強ぐらいだが、問題が難しいため、時間読みが重要となる。
  >
  > まずは、最初の5分ぐらいで3問の問題をすべて読んでから、答える順番に優先順位をつけたほうがよい。
  >
  > また、受験者の多くが余裕なく答えているので、空白で提出しても気にしない。

- 形式：4問とも回答形式が異なる

## 最後に

詳しい問題の内容も個人的にメモしていますので、気になるかたはコメントしてください。
aws cdkとは？

AWS CDKは、Amazon Web Services（AWS）のリソースを管理、プロビジョニングするためのオープンソースソフトウェア開発キットです。CDKを使用すると、高レベルの抽象化を使用してクラウドアプリケーションをモデル化し、プログラムによってリソースを定義できます。JavaScriptやTypeScript、Python、Java、C#など、一般的なプログラミング言語を使用してAWSのリソースを定義することが可能です。

CDKの利点は以下のようなものがあります。

- 高レベルの抽象化: CDKは、複雑なリソースやリソースの組み合わせを扱うための高レベルの抽象化（コンストラクト）を提供しています。
- プログラム可能: CDKを使用すれば、AWSリソースをコードで定義できます。これにより、リソースのプロビジョニングと管理を自動化できます。
- 言語選択の自由: CDKは複数のプログラミング言語をサポートしています。開発チームは最も慣れ親しんだ言語を使用してAWSリソースを定義できます。
具体的な使用例としては、例えば以下のようなものが考えられます。

- スタックの作成: TypeScriptを使用してAWSリソースのスタックを定義し、それらのリソースをプロビジョニングするためのスクリプトを書くことができます。これには、CDKのStackクラスとAWSリソース（例えば、S3バケットやLambda関数など）を表すクラスを使用します。
```typescript
import * as s3 from '@aws-cdk/aws-s3';
import * as cdk from '@aws-cdk/core';

class MyStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    new s3.Bucket(this, 'MyFirstBucket', {
      versioned: true
    });
  }
}
```
- リソース間の依存関係の管理: CDKを使用すると、リソース間の依存関係をコードで定義できます。例えば、あるLambda関数が特定のDynamoDBテーブルにアクセスする必要がある場合、これをCDKで定義することができます。
【翻訳】Swift Code Review Checklist

![](https://storage.googleapis.com/zenn-user-upload/b45e78e21393-20230721.png)

コードレビューでは、1人または複数のチームメンバーが、他のチームメイトの書いたコードをチェックします。コードレビューの主な目的は、新しいバグやエラーがないかコードを評価し、プロジェクトのコードの品質を向上させることです。

#### コード・レビュー・チェックリスト

コードレビューチェックリストは、レビュアーが構造化されたアプローチを作成し、コードをコードベースに承認するために実行する必要がある全ての品質チェックを思い出させるのに役立ちます。

チェックリストを使用することで、レビュアーは重要なことに固執し、重要なことを忘れないようにすることができます。チェックリストは、レビューのためにコードを書いているコーダーと、レビューを行う人が使うことができます。

![](https://storage.googleapis.com/zenn-user-upload/01b579b9bd87-20230721.png)

コードレビューチェックリストは、ドメイン、ソフトウェア言語、プロジェクト、チーム、技術、コードの決定、コーディングのベストプラクティスに基づいて拡張することができます。この記事では、 iOS の Swift 開発に共通のチェックリストに焦点を当てています。

✅ PR にマージ競合はありますか？

✅ コードはコーディング標準/ガイドラインに従って書かれています。

✅ ハードコードされた値はありません、定数値を使用してください。

✅ enum を優先し、 else なら切り替えます。

✅ 巨大な view controller は避け、代わりに manager 、 helper 、 util を追加します。

✅ 空、未使用の変数、関数、インポートを削除します。

✅ インスタンス化されないクラスは、代わりに列挙型を使います。

✅ 類似した種類の値を列挙の下にグループ化します。

✅ 名前付けは明確で一貫性があるか？名前付けは、自己文書化されたコードを書くために重要です！

✅ クロージャは weak self を使います。

✅ Delegate は weak であるべき。

✅ retain サイクルをチェックします。

✅ 全ての文字列がローカライズされているか確認します。

✅ == nil の代わりに isEmpty を使用します。

✅ == falseの代わりに ! を使用します。

✅ コードに　print　を使うべきではありません。

✅ Any や AnyObject の使用は最小限に。特定の型やプロトコルを使うか、ジェネリクスを使うのが良いでしょう。

✅ 重い操作はメインスレッドで行うべきではありません。メインスレッドは主に UI 操作のために設計されています。

✅ Final clase は注意して使うべきです。

✅ 文字列の連結は + の代わりに /() で行います。

✅ 新しい Xcode の警告はありますか？

✅ Apple が提供する API で、物事を簡単にできるものがないか確認してください。

✅ スタティックコードアナライザ( Swiftlint )。

✅ 強制アンラップは避けるべきで、 guard let 、 if let をもっと頻繁に使うべき。

✅ computed property よりも静的定数を優先。
Prefer: static let language: String = “swift”
Over: static var language: String { return “swift” }

✅ 型とプロトコルには UpperCamelCase を使い、それ以外には lowerCamelCase を使います。

✅ 継承よりもプロトコルによる合成を優先します。

✅ エラー処理 例: サーバーダウン、インターネット接続なし、遅いインターネット接続。

✅ テストケース - 新しいコードのコードカバレッジ。

![](https://storage.googleapis.com/zenn-user-upload/e31928c23237-20230721.png)

コードレビューの目的は、実施される環境と同様に多様です。全てのコードレビューには、ほぼ次の共通目標があります。

欠陥のない、文書化されたソフトウェアであること。
組織が設定した品質基準に準拠。
開発者間の知識の教授と共有。
パフォーマンスを向上させるためにコードを最適化。

レビュアーは技術者でなければならず、コードレビューに対して、建設的で、文書による、公平なフィードバックを提供しなければなりません。コードレビューは、コードを書いた人だけが行うことはできません。

## 結論

これは iOS の Swift 開発のための一般的なチェックリストであり、多くの拡張が可能です。もしあなたが貢献したいのであれば、 GitHub のレポに PR を投稿してください。この記事では、コードレビュー、ツール、ベストプラクティスを読むことができます。

読んでくれてありがとう、更新された記事は Medium でフォローできます。

コメント、質問、推奨事項があれば、遠慮なく下のコメント欄に投稿してください！この投稿が気に入ったら、シェアと拍手👏をお願いします。

# 【翻訳元の記事】
Swift Code Review Checklist
https://medium.com/@ashokrawat086/code-review-checklist-483614b91821
IBM DataPower Gateway の操作コマンド

# IBM DataPower Gatewayの操作

IBM DataPower Gatewayの構成、操作は、ブラウザによるGUI画面での管理、sshでリモートログインしてのコマンドで実行できます。（ハードウェア・アプライアンスのDataPowerの場合、ネットワーク構成されてない初期セットアップ時は、パソコンと直接シリアル接続してネットワーク構成をします）

製品マニュアルにコマンド・リファレンスがあります。
https://www.ibm.com/docs/en/datapower-gateway/10.5.x?topic=reference-commands


コマンドの実行例を紹介します。

## コマンドの実行例
sshでログイン後、ユーザー名、パスワードを指定するとログインできます。
#### login
```
 % ssh 192.168.1.xxx
idg
Unauthorized access prohibited.
login: admin
Password: ********

Welcome to IBM DataPower Gateway console configuration. 
Copyright IBM Corporation 1999, 2022 

Version: IDG.10.0.1.6 build 339213 on Feb 14, 2022 10:03:18 PM
Delivery type: LTS
Serial number: 0000000

idg# 
```



DataPowerの各種情報を参照する場合はshow コマンドを使って各種リソースのモニタリングができます。

https://www.ibm.com/docs/en/datapower-gateway/10.5.x?topic=commands-status-monitoring


#### show version (バージョンの表示)
```
idg# show version

         Serial: 0000000
        Version: IDG.10.0.1.6
          Build: 339213
     Build date: 2022/02/14 22:03:18
 Watchdog build: IDG.10.0.1.6
 Installed DPOS: IDG.10.0.1.6
   Running DPOS: IDG.10.0.1.6
XML accelerator: embedded
   Machine type: 5725
     Model type: T09
    Tenant name: 
 Access Manager: all
         Coproc: 1.2
            DCO: 5.14
     DCO Oracle: 1.0
            JMS: 2.0.3
             MQ: 8.0.0.0
         MQ v9+: 9.1.0.6
           ODBC: 8.02
            ODR: ODRLIBX.ODRLIB_a2030.04

idg# 
```

#### show virtual-paltform (virtual editionの表示)
```
idg# show virtual-platform  

          Product: nonproduction 
       Hypervisor: VMware Virtual Platform 
Virtual CPU count: 4 
           Memory: 7.562 Gigabytes
             UUID: 564D5C34-CEEE-45D1-CEBC-57EAF20951EB 
         Platform: vmware 
               OS:  
        CPU cores: 4 


idg# 
```
【DX】ChatGPTを社内Slackから使えるようにしてみた

# ChatGPT使ってみた

皆さんの会社でもChatGPT活用されていますでしょうか
今回はChatGPTの活用促進に向けて社内で取り組んだ事例の紹介になります。

::: note
今回の事例はWeb画面からのChatGPTにおいてAI学習への活用可否Optionスイッチが実装されておらず、API経由でのGPT利用しか選択肢が無かった時点での事例となります
:::

### 導入背景
ChatGPTはその登場から非常に注目され、色々な利用事例があがっており、弊社としても活用していきたいと考えています。しかし、事業会社のシステム部門としては業務利用にあたって情報漏洩がやはり気になるところです。
そんな中、4月頃にOpenAI社よりAPIが公開され、API経由であればAIの学習目的利用をせず、30日間でデータ削除する事を選択できる（≒情報漏洩リスクを軽減できると考えられる）事から、APIを介してChatGPTを業務活用する為の機能開発ができないか。という議論がスタートしました


### Slack連携を選んだ理由
社内でChatGPTを利用するにあたって「いかに社員が使いやすいインターフェースを設けるか」をメンバーで議論した結果、以下の仮説によりSlackを選択しました。
 - 社内でSlack利用が活発であり、使いやすいのではないか
 - SlackであればChatGPTの活用事例が共有化しやすいのではないか

### 実装について
前述の通り、インタフェースとしてはSlackを利用しています。
仕組みとしてはSlackAPIを活用してSlackBotを作成し、SlackBotにメンションされたメッセージをLambdaに連携、更にそのメッセージをOpenAIのAPIに渡す形となっています。

![ChatGPT Bot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1734719/68634dd9-7653-5efb-0386-6ab7c49c237e.png)



このやり取りの際、一度連携し応答を得るだけでは Web画面のChatGPTで使っているような会話の連続性が得られません。
この為、LambdaでOpenAPIと送受信しているメッセージなどをDynamoDBに一時保存する形をとっています。

また、この仕組みのデプロイには AWS CodeCatalystを活用していますが、その活用事例はまた別の機会で記事にさせて頂きます。



### 現状と今後
現状、リリースから2ヶ月経っていますがSlackを通じたChatGPTの活用はまだまだ途上です。
利用方法の周知や、プロンプトの研究や共有を通じて社内での活用促進を図っています。

また、現段階ではChatGPTをSlackを介して利用しているに過ぎず、今後も生成系AIの活用に向けて取り組んでいきます。
Laravel サブディレクトリにあるseederの実行

# サブディレクトリに配置したseederの実行

database/seeders/ 以下にサブディレクトリを作った場合、どうやってseederを実行するのか？

## 対応

database/seeders/Test/ 以下に置かれたseederを実行する場合

⭐ `シングルクォーテーションで囲って、namespaceを指定する`

```sh
php artisan db:seed --class='Database\Seeders\Test\ExampleSeeder'
```

---

### おまけ（通常のseeder実行）

```sh
php artisan db:seed --class=ExampleSeeder
```
もしくは

```sh
php artisan db:seed --class='Database\Seeders\ExampleSeeder'
```
Python環境構築チートシート



# pyコマンド
```python:environment_py.py
# 起動バージョン確認１
> py --list-paths
Installed Pythons found by C:\Windows\py.exe Launcher for Windows
 -3.10-64       C:\Python310\python.exe *
 -3.7-64        C:\Python37\python.exe

# ※C:\Windows に py.ini を配置
# 起動バージョン確認２
> py --list-paths
Installed Pythons found by C:\Windows\py.exe Launcher for Windows
 -3.10-64       C:\Python310\python.exe
 -3.7-64        C:\Python37\python.exe *

# 仮想環境の作成
> py -3.10 -m venv wakasama

# 仮想環境の有効化
> .\wakasama\Scripts\activate
(wakasama) >

# 仮想環境の無効化
(wakasama) > deactivate
> 

# 仮想環境の削除 → wakasamaフォルダを消せばよい！！

# 仮想環境の構築
py -3.11 -m venv wakasama311
# 仮想環境の有効化
.\wakasama311\Scripts\activate
# パッケージインストール
python -m pip install --upgrade pip
pip install ipywidgets
---
from ipywidgets import IntProgress
IntProgress(50,max=100)
---
pip install ipywidgets-toggle-buttons
pip install numpy matplotlib
# うまく描画されないときは[Restart Kernel]


C:\wakasama\Python> py -3.11 -m venv wakasama311
.\wakasama311\Scripts\activate


pip install --no-index --find-links=./downloadFiles selenium
pip install --no-index --find-links=./downloadFiles flake8
pip install --no-index --find-links=./downloadFiles autopep8


pip download tzdata --dest pipPackage4 --verbose --log download4.log
pip download mypy --dest pipPackage5 --verbose --log download5.log

pip install pip-licenses

pip-licenses

```
```ini:py.ini
[defaults]
python=3.7
```

# pipコマンド
```python:environment_pip.py

# 初期インストール状態
> pip list
Package    Version
---------- -------
pip        22.2.2
setuptools 63.2.0

# ヘルプ表示
> pip help download
※割愛(ヘルプ内容が表示)

# seleniumダウンロード(依存関係パッケージも含む)
> pip download selenium --dest pipPackage --verbose --log download.log

# パッケージ情報表示　※ライセンスや依存関係パッケージ等
> pip show selenium

# 一括アンインストール
> pip freeze > uninstall.txt
> pip uninstall -y -r uninstall.txt

```


## 参考サイト
◆Pythonの複数バージョンの扱い方（Windowsの場合）
　https://gammasoft.jp/python/python-version-management/
◆py コマンドの規定 Python バージョンの設定方法
　https://itpc.blog.fc2.com/blog-entry-225.html
◆オフライン環境でPythonパッケージをpipインストール
　https://densan-hoshigumi.com/develop/python-pip-offline-install
ESP8266とADS1115とSCT013-XXXを使ってAC電源の電流計を作成します

最近ESP-NOWを使って独自のホームネットワークを検討用に作っており、ヌルい独自仕様で推し
進めているので「ホームネットワークで何が出来るか？」の準備が主な作業になっています。
主な作業とは言っても、コレといった指標は持っていないのでイロンナ機器を作り倒す感じです。

そういった状況ではありますが家庭用コンセントで流れる電流値を測定するユニットを検討しました。
これに時間あたりの積算機能を付けたら簡易な電力計が作れますが、電流計で終わらせときます。

#ESP8266環境で必要なリソース
　I2Cが使えるESP8266機　（ESP-01Sでも良いですね。
　ACクランプ　　SCT013-XXX
　ADコンバータ　ADS1115 （差動入力で利用します
　AdafruitのADS1115関係のソースファイル（Adafrutがお勧めな訳じゃないですが・・・

#配線
　ESP8266とADS1115はI2CのSCL/SDAをVcc/GND繋いでください。
　ADS1115のA2/A3とSCT013の配線を繋いで下さい。
　あとは電源を繋ぐだけです

#機能
　関数getRMSでサンプルあたりのRMS値を求めます。
　サンプル数を増やすと測定に時間を要しますが、安定した値になる様です。



```ino:ADS1115_clump.ino:
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1115 ADS0; 
float   ADCmultiplier;            // ADS1115のADCの1bitあたりの電圧値(Gain設定で変化)

// SCT013でRMSを求める処理　：　SCT013の仕様に合わせて1V辺り？Ａ測定できるか設定する
const float SCT013CURRENT = 50;   // SCT013-050　（50A-1V仕様）
float getRMS( int samples=100 ){
  float sum = 0;
  for( int cnt=0 ; cnt<samples ; cnt++ ){
    float voltage = ADS0.readADC_Differential_2_3() * ADCmultiplier;
    sum += sq( voltage * SCT013CURRENT / 1000.0 );
  }
  return sqrt(sum / samples);
}
//
void setup(void){
  Serial.begin(115200);
  Wire.begin();
  // ADS1115の設定（SCT013で100A程測定できる程度の電圧は想定してGAIN設定する事
  ADS0.setGain(GAIN_TWO);         // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  ADCmultiplier = 0.0625f;        // 2x gain   +/- 2.048V  1 bit = 1mV      0.0625mV
  if (!ADS0.begin()) {    Serial.println("Failed to initialize ADS0.");    while (1);  }
  ADS0.setDataRate( RATE_ADS1115_860SPS );  // 860Sample per Second(チップ性能)
}

void loop(void){
  int sta = millis();
  float rms = getRMS( 300 );
  int tim = millis()-sta;
  Serial.printf("%0.2fA , %dmSec \n", rms ,  tim );
}
```

あとがき
　　クランプ式の電流計は今更って感じがしますが、簡単な作り方が見つからずにイロイロ調べた末に
　　差動入力ADCにST013を直結するだけの回路と上記のソースで上手く動きそうだったので紹介しました。
　　実際にはエアコンの消費電力を測定する事を考えており、電源ＯＮ～電源ＯＦＦ迄の累積消費電力を
　　(Ｗｈ)でGoogleSpreadSheetに時間ごとに報告できないかと考えています。
Astroとは🚀

Astroは、コンテンツにフォーカスした高速なWebサイトを構築するためのオールインワンWebフレームワークです(SSG: Static Site Generator)。ブログやコーポレートサイト等のコンテンツを重視したWebサイトを生成することに特化しており、ビルド時に不要なJavascriptを排除することで高速かつ高パフォーマンスなWebサイトを生成することができます。
※ページ移動はaタグで遷移するのでMPAとしての動作に近い

## 通信方法
サーバー側でレンダリング(MPA)手法を取る。

1. クライアント・・・Webサイトを表示するためのGETリクエストをサーバーに送る。
2. サーバー・・・内部でHTMLを組み上げる。
3. サーバー・・・POSTレスポンスとして生成したHTMLとCSSを返す(※JavaScriptは基本返さない)
4. クライアント・・・ブラウザでHTMLファイルをパース
5. クライアント・・・CSSファイルの解析
6. クライアント・・・HTMLのパース後、DOMツリーを生成
7. クライアント・・・CSSのパース後、[CSSOMツリー](https://developer.mozilla.org/ja/docs/Glossary/CSSOM)を生成
8. クライアント・・・スタイルをDOMに適用する

## メリット
- ビルド時に可能な限りJavaScriptを排除して、HTMLとCSSを生成するため、Webサイトにおける高いパフォーマンスを担保。
- ReactやVueといった、UIフレームワークをごちゃまぜにできる。(ビルド時にJavaScriptは排除される)
- Astro Islandとよばれるコンポーネント単位JavaScriptを利用するか選択できる。(好きなフレームワーク/ライブラリをコンポーネント単位で使える)

## デメリット
- Reactのようなコンポーネントベースの書き方なので学習コストがかかる
- 比較的新しいので情報が少ない

## Astroが採用されたサイト
https://about.createmyvote.com/

https://newpeace.jp/

## 参照
https://astro.build/

https://cwt.jp/category/619/1
Stoplight StudioでWSL上のファイルを参照できない問題

## 前提

- 普段の開発で、WSLを使っている
- WSL上にあるOpenAPIファイルを、Stoplight Studioで編集したい

## 課題

- WSL上にあるOpenAPIファイルを、Stoplight Studioで開くことができない
- `WSLからファイルを読み込むのは ×`🙅‍♂️

## 対応

- `Windowsのパスで、改めてリポジトリをcloneするのが 〇`🙆‍♂️

### つまり

- 開発時 → `WSL上にcloneしてきたファイルを使う`
- Stoplight StudioでOpenAPIを編集する時 → `Windows上にcloneしてきたファイルを使う`

という使い分けをするのがよさそう
WEBページのリンク一覧を取得するスクリプト【備忘録】

# コンソールにリンク一覧を表示する
Javascriptを使ってWebページのリンクをコンソールに表示するためスクリプト
```js
// 現在のページ上のすべてのリンクを表示するコンソールスクリプト
(function () {
  // ページ上のすべてのリンク要素を取得
  const links = document.querySelectorAll("a");

  // 取得したリンク要素をループしてリンクを表示
  links.forEach((link) => {
    const linkText = link.textContent;
    const linkURL = link.href;
    console.log(`${linkText} - ${linkURL}`);
  });
})();
```
ブラウザのデベロッパーコンソール（通常はF12キーで開きます）にこのスクリプトを貼り付けて実行すると、ページ上のすべてのリンクがコンソールに表示されます。
【PHP】FPDFを使ってPDFを作成する

## はじめに

PDFファイルは、ビジネスの現場やウェブアプリケーションで頻繁に利用されています。一方で、その動的な生成は一筋縄ではいかない作業で、しっかりとしたライブラリが必要となります。そこで今回は、PHPでPDFを簡単に生成できるライブラリ、「FPDF」の使い方について解説します。

## FPDFとは？

FPDFは、無料で利用できるオープンソースのPHPライブラリで、動的にPDFを生成するための機能が豊富に備わっています。また、使いやすいAPIを提供しているため、PDF生成を必要とする多くのPHP開発者にとって有用なツールとなっています。

## FPDFのインストール

FPDFの公式サイト(http://www.fpdf.org/) からダウンロードできます。ダウンロード後、解凍して得られた `fpdf.php` をプロジェクトの適切なディレクトリに配置します。

## FPDFの基本的な使い方

以下に、基本的なPDFの作成手順を示します。

```php
<?php
require('fpdf.php');

$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World!');
$pdf->Output();
?>
```

ここでは `fpdf.php` を読み込み、FPDFのインスタンスを作成しています。`AddPage`メソッドで新しいページを追加し、`SetFont`メソッドでフォントを設定します。`Cell`メソッドでテキストのブロックを追加し、`Output`メソッドでPDFを出力しています。

このコードを実行すると、「Hello World!」というテキストが含まれたPDFがブラウザで開きます。

## まとめ

FPDFは、PHPでPDFを生成するための強力なライブラリです。この記事では基本的な使い方を解説しましたが、FPDFにはさらに高度な機能が数多く用意されています。例えば、画像の挿入、マルチセル、色の設定、リンクの追加など、詳しくは公式ドキュメンテーションをご覧ください。

## 参考リンク

- [FPDF公式サイト](http://www.fpdf.org/)
【Mac】仮想カメラのアンインストール後もカメラ切り替えから消えない問題を解決しよう

## やりたいこと
Macにて、OBSなどの仮想カメラを追加するアプリを使っていたが、必要なくなったからアプリをアンインストールしたのに、GoogleMeetやZoomなどのカメラ切り換えの選択肢から仮想カメラが消えていない問題の対処法です。

![1F85E662-1FEA-425A-8E1E-F30E08E36E69_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/3b4d7c6f-8afc-fe67-36c7-42c1770e34e9.jpeg)

## 結論（急いでいる方）
ターミナルで以下を叩く
```zsh
sudo rm -rf /Library/CoreMediaIO/Plug-Ins/DAL/obs-mac-virtualcam.plugin
```

# 解説

#### なぜ仮想カメラが消えていないのか
DALプラグインが削除されていないから（`/Library/CoreMediaIO/Plug-Ins/DAL/`）

:::note
DAL（Device Abstraction Layer）プラグインは、仮想カメラや外部のビデオキャプチャーデバイスをMac上のアプリケーションから利用できるようにするのに使用されます。
:::

## 対処法
#### 1.確認
ターミナルで以下を叩く
```zsh
ls -l /Library/CoreMediaIO/Plug-Ins/DAL
```
すると`obs-mac-virtualcam.plugin`が残っていることがわかります。　
![CD86D2C3-C5BC-4A38-AE65-E85CF6465EA3_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2658262/2c90d8f2-e2db-9458-b01a-837067990e08.jpeg)

#### 2.削除
ターミナルで以下を叩く
```zsh
sudo rm -rf /Library/CoreMediaIO/Plug-Ins/DAL/obs-mac-virtualcam.plugin
```

#### 3.再度確認
ターミナルで以下を叩くと削除できているかと思います。
```zsh
ls -l /Library/CoreMediaIO/Plug-Ins/DAL
```



[参考：GitHub](https://github.com/johnboiles/obs-mac-virtualcam#uninstalling)
【新卒・教育者向け】文系プログラミング初心者による学習マインドセット3つ

# はじめに
こんにちは。タイトル通り文系出身新卒未経験エンジニアのほしななです。
今年の6月からで開発部門に配属されて、本配属前の基礎研修を今週で終えるため、プログラミングにおける学習マインドをふりかえりがてら記録していきたいと思います。

# こんな人におすすめ
・エンジニア初心者/新卒で学習面に悩みを感じている人
・新卒の教育者として新卒の考えや悩みを知りたい人

# 自己紹介
    学部：教育(教員免許を4つ(小学・中学国語・高校国語・高校書道)持っています) つまりド文系
    研修期間：AWSCloudQuestやJava、基本情報の勉強を少し

# 学習におけるマインドセット3つ

2か月間プログラミング・ITを勉強してきて大事だと思った学習におけるマインドは、以下の3つです。

1\.理解度0の「ほぇ～～そうなんだ～～」でOK
2\.遠慮しないで人に聞く
3\.毎日コードを人と書く

では、1つずつ解説していきます。

## 1.理解度0の「ほぇ～～そうなんだ～～」でOK
学校の問題は「1つわからないと次もわからない、おいて行かれる」ことがほとんどですよね。でもIT界隈は全く別です。「わからないけど頭に入れて、それが後になってわかる」ことがほとんどです。

学校の勉強が線だとすると、ITの勉強は点です。あとになって点と点がつながってくるので、**わからなくてもとりあえず触れて、こんなのやったなぁだけ覚えておいてください。**

個人的にITの学習って進〇の巨人並に伏線回収が多いので結構面白いです。本当です。

:::note alert
完璧に理解しようとする
:::
:::note info
「よくわからんが、ほぇ～～そうなんだ～～」程度でOK
:::
## 2.遠慮しないで人に聞く
受験生の時や全体研修期間のときに、「質問するときは仮説を立てて質問しろ！」と言われませんでしたか？私はよく言われていました。

もちろん仮説を立てて質問することはとても大事ですが、プログラミング・IT学習初期においてはいったん取っ払ってしまって良いと思います。(配属後の補足ですが、あくまでも**初期**においてはの話で、感覚として学習し始めて2か月目以降は、仮説を立てて人に聞くほうが成長スピードが上がると思います)

なぜなら「よくわからんが、ほぇ～～そうなんだ～～」程度の理解度のまま仮説を立てて質問するのは、かなり難しいからです。

一生懸命仮説を立てようとして意味を理解しようとする→何時間も時間が溶ける、これじゃもったいないです。そんなときは「調べてみましたが、それでもわかりませんでした」という魔法の言葉で、教える人も勉強になるのでわかる人に聞いてしまいましょう。


:::note alert
1人で何時間も調べて考える
:::
:::note info
いったん5分考えてみてわからなかったら「調べたけどわかりませんでした」で人に聞く
:::
## 3.毎日コードを人と書く
これ、めちゃめちゃ効果あります。一度もJavaを勉強したことがなくても、やってみてほしいです。
実際私は、Javaを一度も触ったことがなかった時に、社内でCoding Batを触る会に参加したのですが、教材すら読んでなかったので当たり前ですが何もわからなくて。

その時ただひたすら正解のコードを写すことをしていたのですが、「Javaってこういう書き方するんだ」という**Javaを見たことある状態**に持っていくことができました。(もちろんコードの意味は全くわかりませんが)

そこから本格的に教材でJavaを学んだ時に、「あ、初日によくわからないで書いてたコードってこんな意味だったんだ」と後発的に分かるようになり、理解度が2倍になったのを感じました。

「まだJava習ってないからコード書くのは無理だ…」と思わず、「わからないけどとりあえず書いてみよう」マインドで取り組んでみてください。

そしてできれば **「人と」** コードを書くのをおすすめします。理由は以下の2つです。

1\.多くのコードの書き方を知ることができる
2\.話し合うことで理解が進む

コードの書き方はたくさんあるため、人と書くほうがいろいろな書き方を知ることができるうえ、話し合って書くことで理解も進むのでおすすめです。

:::note alert
勉強するまでコード書くのやめよう
:::
:::note info
勉強したことなくてもとりあえず書いてみる
:::

# 人によって成長速度は異なる

はじめは新しい知識のインプットばかりでできることが少なく、嫌になるかもしれません。でも、学んだ分だけ人によって成長速度は異なりますが、必ず成果は出るので、疲れない程度にたくさんインプットしてみてください。私もまだまだぺーぺーなので、一緒に頑張りましょう！
オーバーライド

# オーバーライド

:::note
オブジェクト指向言語において、**サブクラス（派生クラス）が親クラスのメソッドを再定義して上書きすること
→サブクラスは親クラスのメソッドの振る舞いを変更したり、新しい機能を追加したりできる**
:::

## オーバーライドで重要な点

- **メソッドのシグネチャが親クラスと一致していること**
シグネチャ : メソッド名、引数の型、戻り値の型

- **サブクラスでオーバーライドするメソッドは、親クラスのメソッドと同じメソッド名と引数を持ち、戻り値の型も同じである**必要がある
→メソッドの処理内容や振る舞いはサブクラスで変更可能

## オーバーライドの例

```java
class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound.");
    }
}

class Cat extends Animal {
    // 親クラスのmakeSoundメソッドをオーバーライド
    @Override
    void makeSound() {
        System.out.println("Meow!");
    }
}

class Dog extends Animal {
    // 親クラスのmakeSoundメソッドをオーバーライド
    @Override
    void makeSound() {
        System.out.println("Woof!");
    }
}
```

**Animalクラスを継承してCatクラスとDogクラスを作成
↓
CatクラスとDogクラスはそれぞれmakeSoundメソッドをオーバーライドしている
↓
CatクラスのmakeSoundメソッドは"Meow!"を表示
DogクラスのmakeSoundメソッドは"Woof!"を表示**

親クラスのAnimalクラスにあるmakeSoundメソッドの振る舞いは、それぞれのサブクラスによって変更されている
インターネットの基礎知識

#### インターネットとは（世界中)
複数のコンピュータをケーブルや無線で繋ぎ、お互いの情報のやり取りをできるようにした仕組み

#### ネットワークとは(限られた地理的範囲,会社など）
複数のデバイスやコンピュータを相互に接続してデータの交換や通信を可能にした仕組み

#### ホストとは
インターネット上に接続されたコンピューターやデバイスのこと

### ドメイン名とは
ネットワーク上のホストを人間が理解しやすい名前にしたもの(www.example)

#### IPアドレスとは
インターネット上でコンピューターやデバイスを一意に特定するための識別番号
インターネットで接続されているデバイスは全てIPアドレスを持っている

#### IPアドレスの作られ方

1: 動的なIPアドレスの割り当て: 一般的な家庭用インターネットルーターや企業のネットワークでは、DHCP（Dynamic Host Configuration Protocol）と呼ばれるプロトコルが使用されています。デバイスがネットワークに接続すると、DHCPサーバーが利用可能なIPアドレスのプールから空いているIPアドレスを割り当てます。デバイスがネットワークから切断されると、そのIPアドレスはプールに戻され、他のデバイスに再利用されることがあります。

例　家のWifiでスマホを接続するとき

2: 静的なIPアドレスの割り当て: 一部のデバイスやネットワークは、固定のIPアドレスを割り当てられる場合があります。これらのIPアドレスは手動で設定され、デバイスがネットワークに接続されるときに変更されることはありません。サーバーやネットワーク機器など、常に特定のIPアドレスを持つ必要があるデバイスに静的なIPアドレスが使用されます。

例 サーバー、ネットワーク機器

##### IPアドレスの割り当ては誰がしているのか
DHCPサーバー:ネットワーク上のデバイスに動的なIPアドレスを割り当てる役割がある
ルーター:家庭用のWifiルーターはそのルーター自体がDHCPサーバーの役割をする
ネットワーク管理者:手動でIPアドレスを割り当てる

#### DNSとは
インターネット上のコンピュータやデバイスのドメイン名(example.com)をIPアドレス(192.118.2.1)に変換するシステム
変換することによってインターネットのwebページなどを見ることができる

##### DNSとはどこにあるのか？

インターネット上に分散して配置されている,会社や組織にも置いている場合があり、
自分のPCにも設置することができる

#### 　自宅PC(windows)でGoogle Chromeで検索した場合の仕組み
windowsにすでにデフォルトでDNSサーバーの設定がされており、ネットワーク接続を行う際にDNSサーバーのアドレスを自動的に取得してくる
↓

#### ホスティングとは
サーバーを貸してもらうこと（VPS,レンタルサーバーを借りるイメージ)AWSは含まれない

#### HTTPとは
webブラウザとwebサーバー間で情報のやり取りをするするためのプロコトルでHTML形式で表示される
 ##### HTTPの役割
1 リクエストの送信:ユーザーがurlに入力するとwebサーバーに情報を情報を要求するリクエストを送信する
2 リクエスト処理:受け取ったリクエストを処理して要求された情報(画像、ページ,データ)をwebブラウザに返す
3 レスポンス受信 ブラウザはwebサーバーから受け取った情報をサイトに表示したり,リンク先のページに移動したりする

見ていただき、ありがとうございます！