OmniAICreator/Qiita-1.07M huggingface dataset:
【PowerPoint】pdfとして保存する【VBA】


https://qiita.com/taleau/items/202a9aef8485b9e0280e

これのppt版

``` vb
Call ppShape非表示にする("shp余白", False)
```

これは↓のものがある前提なので、ない時はこの行をコメントアウトして下さい。

https://qiita.com/taleau/items/71839bc240eb0d7052af


``` vb
Option Explicit

Sub PDF化()
  
  On Error GoTo Err
  With ActivePresentation
    Dim ppPath: ppPath = .Path
    Dim ppName: ppName = .Name
    
    
    Dim pdfPath
    pdfPath = ppPath & "\" & 拡張子変換(ppName, "pdf")
    
    Do Until ファイル存在確認(pdfPath) = False
      pdfPath = 追番付与(pdfPath)
    Loop
    
    'pdfタブに表示されるppt詳細プロパティの値をファイル名に変更する
    .BuiltInDocumentProperties.Item(1).Value = 拡張子変換(ppName, "pdf")
    
    Call ppShape非表示にする("shp余白", False)
    
    .SaveAs _
      FileName:=pdfPath, _
      FileFormat:=ppSaveAsPDF
      
'      https://docs.microsoft.com/ja-jp/office/vba/api/powerpoint.presentation.exportasfixedformat
'    こっちの方法でやると詳細プロパティ問題は起こらないが画像がぼやけることがある
'    .ExportAsFixedFormat _
'      Path:=pdfPath, _
'      FixedFormatType:=ppFixedFormatTypePDF, _
'      PrintHiddenSlides:=msoFalse

  End With
  
  Call ppShape非表示にする("shp余白", True)
  
  ' pdf保存する時に付随して開くオプションがわからないのでWSで開く
  Call FileOpen_WScriptShell(pdfPath)
Err:
  Select Case Err.Number
    Case Is = 1004: MsgBox "プレゼンテーションを保存後実行してください。"
  End Select
End Sub

Private Function 追番付与(TargetPath)
  Dim buf1, ub, buf2
  buf1 = Split(TargetPath, ".")
  ub = UBound(buf1)
  
  buf2 = buf1(ub - 1)
  If InStr(buf2, "▲") = 0 Then   'すでに▲があるか否かで分岐
    buf2 = buf2 & "▲1"           'なければ▲1を付与
  Else
    buf2 = Split(buf2, "▲")      'あるなら▲までで区切ってその後をインクリメントする
    buf2(1) = buf2(1) + 1
    buf2 = Join(buf2, "▲")       '分割したものを戻す
  End If
  
  buf1(ub - 1) = buf2             '拡張子以前を元の形にまとめ直す
  追番付与 = Join(buf1, ".")      '分割したものを戻す
End Function

Private Function 拡張子変換(Target, 指定拡張子)
  Dim buf, ub
  buf = Split(Target, ".")
  ub = UBound(buf)
  buf(ub) = 指定拡張子
  拡張子変換 = Join(buf, ".")
End Function

Private Function ファイル存在確認(TargetPath) As Boolean
  Dim flg As Boolean
  If Dir(TargetPath) <> "" Then
    flg = True
  Else
    flg = False
  End If
  ファイル存在確認 = flg
End Function

Sub FileOpen_WScriptShell(ByVal strFile As String)
    Dim wsh As Object
    Set wsh = CreateObject("Wscript.Shell")
    strFile = """" & strFile & """"
    wsh.Run strFile, 1
    Set wsh = Nothing
End Sub



```
Firebase Analytics実装方法

# 初めに
今回は、楽にAnalyticsでlogEventを実装できる様にするやり方を備忘録として書いていこうと思います

### 実装方法
まず、イベントを渡す用のクラスを作成します
```kotlin:
abstract class TrackingEvent(
    val key: String,
    val parameters: Map<String, Any> = emptyMap(),
)
```

次に、logEventを実装するためのInterfaceと本実装用のクラスを実装します

```kotlin:
class TrackingService @Inject constructor(
    private val firebaseAnalytics: FirebaseAnalytics
) : TrackingServiceInterface {
    override fun track(trackingEvent: TrackingEvent) {
        firebaseAnalytics.logEvent(
            trackingEvent.key,
            trackingEvent.parameters.toBundle(),
        )
    }
}

// TrackingEventのパラメータをBundleに詰め替える拡張関数
fun Map<String, Any>.toBundle(): Bundle = Bundle().apply {
    this@toBundle.forEach { (key, value) ->
        when (value) {
            is String -> this.putString(key, value)
            is Int -> this.putInt(key, value)
            is Boolean -> this.putBoolean(key, value)
            else -> throw IllegalArgumentException()
        }
    }
}
```

最後にこれらを共通して使える様にDI用のModuleを実装します

```kotlin:
// logEvent用
    @Provides
    @Singleton
    fun provideEventTrackingService(
        impl: TrackingServiceImpl
    ): TrackingService = impl
// firebaseAnalytics用
    @Provides
    @Singleton
    fun provideFirebaseAnalytics(
        @ApplicationContext context: Context
    ): FirebaseAnalytics = FirebaseAnalytics.getInstance(context)
```
ダイクストラ法

[最短経路問題](https://qiita.com/sibata_yuna/items/9d3f03288422c96af632)

[問題](https://atcoder.jp/contests/joi2008yo/tasks/joi2008yo_f)　:　[動作確認済み](https://atcoder.jp/contests/joi2008yo/submissions/30760538)

(条件) 負の重みを持たない無向性グラフ

最短距離が更新されたときのみ、その頂点に隣接する辺の更新を行う

```c++

vector<vector<ll>> h(150, vector<ll>(150));//a,b間の距離
vector<ll> edge[108000]; // i 番目の島と繋がっている島すべて
ll dist[108000]; // 最短距離
ll n, m, k, s, x, a, b, c, j;

//ダイクストラ法
void dijkstra(ll start) {

	// 最短距離のみをifに通過させて、それ以外は余分な計算をしないため
	priority_queue<Pl, vector<Pl>, greater<Pl> > pq;
	fill(dist, dist + 108000, INF);

	dist[start] = 0;
	pq.push(Pl(0, start)); //最短距離、最初の島

	while (!pq.empty()) {
		Pl tmp = pq.top();pq.pop();
		ll from = tmp.second; // 島
		ll d = tmp.first;     // 最短距離

		if (dist[from] < d)continue; // 最短距離でない


		// ある島の最短距離と隣接する島をすべて探す
		for (ll i = 0;i < edge[from].size();i++) {
			ll to = edge[from][i];


			// ある島の仮の最短距離
			if (dist[to] > dist[from] + h[to][from]) {
				dist[to] = dist[from] + h[to][from];
				pq.push(Pl(dist[to], to));
				//cout << "p   " << h[to][from] << endl;
			}
		}
	}
}


int main() {

	cin >> n >> k; //島の数、クエリの数

	rep(i, 0, 150)rep(j, 0, 150) h[i][j] = INF;

	rep(i,0,k)
	{
	
		cin >> j;//判定

		if (j == 1)//追加
		{
			cin >> a >> b >> c;
			a--;b--;
			edge[a].push_back(b);//繋がり
			edge[b].push_back(a);

			h[a][b] = min(h[a][b], c);//距離
			h[b][a] = min(h[b][a], c);
			
			
		}
		else//計算
		{
			cin >> a >> b;//aからbまでを計算
			a--;b--;

			dijkstra(a);//aからの距離を計算

			if (dist[b] == INF) cout << "-1" << endl;//bまで行けない
			else cout << dist[b] << endl;
		}
		
	}
	

	return 0;
}
```
【Windows】GPOでWindows10のスタートメニューのレイアウトを固定する

GPOでWindows10のスタートメニューのレイアウトを固定する方法について記載しています。
GPOでスタートメニューのレイアウトを固定すると、ユーザー側で変更ができません。

## 検証環境
・クライアント：Windows10
・ADサーバー：Windows Server 2012 R2

## 手順
##### 1.　クライアント環境で、テンプレート用にスタートメニューのレイアウトを整える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602028/72a4f896-e952-1252-7674-81a1f2e560a1.png)


#####  2.　テンプレート用に整えたレイアウトをPowerShellで抽出する
```Powershell
Export-StartLayout -path StartLayout.xml
```


##### 3.　GPOに設定する
　①抽出したxmlファイルをクライアントが参照できる場所に保存
　　例：\\\ドメイン名\SysVol\ドメイン名\scripts

　②以下GPOに設定する
　　[コンピューターの構成] または [ユーザーの構成]
　　　　- [管理テンプレート] - [タスクバーと[スタート]メニュー]
　　　　　　　- [スタート画面のレイアウト]
　　**※スタート画面のレイアウトファイルに抽出したxmlファイルのパスを設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602028/9701250a-4e4a-c4ad-ed34-7c898b264f38.png)
AWS Compute Optimizerを利用したコスト・パフォーマンス最適化

## はじめに
まず、AWS Compute Optimizerというサービスをご存知でしょうか？
AWS Compute Optimizerは簡単に言うとAWSコンピューティングサービスのメトリクスから
パフォーマンス及びコストを最適化の提案をしてくれるサービスです。

```
AWS Compute Optimizer は、 AWS リソースの設定と使用率のメトリクスを分析するサービスです。
リソースが最適かどうかを報告します。また、コストを削減し、ワークロードのパフォーマンスを向上させるための最適化に関する推奨事項を生成します。
```
https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/what-is-compute-optimizer.html

## 対象リソース

AWS Compute Optimizerでは以下のリソースをサポートしています。

- Amazon Elastic Compute Cloud (Amazon EC2) インスタンス
- Amazon EC2 Auto Scaling グループ
- Amazon Elastic Block Store (Amazon EBS) ボリューム
- AWS Lambda 関数

## 使い方

AWS Compute Optimizerコンソールからオプトインを実行する、またはAWS CLIで有効化する事で利用が開始されます。
オプトインを開始すると自動的に過去14日分のコンピューティングリソースのメトリクスが取得され、対象リソースのレコメンデーションを表示してくれます。

AWS Compute Optimizerコンソールでは以下の様に各リソースのレコメンデーションを割合で表示してくれます。
![cost01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/2238c6fd-c598-21d4-acbb-ebf1b7108b6d.png)

例えばLambdaでは現在設定されているメモリではパフォーマンスが低いので
メモリを増加するようにレコメンデーションされています。
![cost02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/e06fe318-49f4-15da-5c20-378e31e6cf71.png)

表示されているレコメンデーションはCSV形式でエクスポートもできますので、他人と共有するのも楽です。
![cost03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/426486c5-a38d-7933-62a4-b0a937a70195.png)

https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/getting-started.html

## 料金

AWS Compute Optimizerではレコメンデーションを計算する為の拡張メトリクスが使われており
その拡張メトリクスに対して1時間単位で料金がかかる仕組みなってます。

- 1 リソース1 時間あたり 0.0003360215 USD
- 1 リソースあたり月額 0.25 USD

```
各リソースにつき 1 時間あたり 0.0003360215 USD で、リソースが実行されている 1 か月あたりの時間数に基づいて請求されます。
この機能のコストは、1 か月間 31 日フルで稼働するリソースに対して、1 リソースあたり月額 0.25 USD となります。
```

https://aws.amazon.com/jp/compute-optimizer/pricing/

## まとめ
コンピューティングリソースのサイジングの見直しはCPUやメモリのDiskの利用状況、トラフィックパターン等複数の要素とニラメッコしながら実施する
比較的大変な作業ですがこのサービスを利用する事によって簡単に安価に推奨事項を取得する事ができるので便利だと思います。
いいなと思った方は有効化（オプトイン）してみてはいかがでしょうか。
EC2を使用して、別アカウントのS3バケットからオブジェクトを移行する方法

# はじめに
S3間で40TB以上のデータ移行が必要になり、普通にやると約2日かかる。
そこで、tmuxを使用しセッションが切れても実行し続ける環境をEC2インスタンス上で構築しました。
その時の学習をアウトプットできればと思います。

# 手順

- 前提
  - EC2インスタンスにSSM接続ができるように設定する
  - EC2を起動するサブネットへS3用のエンドポイントを作成

- 手順
　1. 【targetアカウント】EC2用のIAMロールを作成
　2. 【sourceアカウント】バケットポリシーを作成
　3. 【targetアカウント】EC2インスタンスにtmuxをインストール
　4. 【targetアカウント】tmuxで新規シェルを作成し、移行コマンドの実行


# 今回の構成図

![コメント 2022-02-25 152932.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515983/3ebd61b7-b168-d471-b296-c245dcc802be.jpeg)


# 手順1 【targetアカウント】EC2用のIAMロールを作成

#### 1.1 下記カスタマ管理ポリシーを作成 
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<sourceのS3バケット名>",
                "arn:aws:s3:::<sourceのS3バケット名>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::<targetのS3バケット名>",
                "arn:aws:s3:::<targetのS3バケット名>/*"
            ]
        }
    ]
}

```

#### 1.2 カスタマー管理ポリシーを、EC2へアタッチするIAMロールへ追加


# 手順2　【sourceアカウント】バケットポリシーを作成


下記バケットポリシーを``sorceアカウント``の対象S3バケットのバケットポリシーに記入します。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddCannedAcl",
      "Effect": "Allow",
      "Principal": {
        "AWS": "<EC2へアタッチしたIAMロールのARN>"
      },
      "Action": [
        "s3:ListBucket",
        "s3:GetObject",
        "s3:GetObjectTagging"
      ],
      "Resource": [
        "arn:aws:s3:::<targetのS3バケット名>",
        "arn:aws:s3:::<targetのS3バケット名>/*"
      ]
    }
  ]
}
```

ここまでで、EC2へSSM接続し``sorceアカウント``の対象のS3バケットのオブジェクト名など取得できることを確認する。

```
# 下記コマンドで、オブジェクト名が表示されたら成功
$ aws s3 ls s3://<sourceのS3バケット名>
```

オブジェクト名が取得できなければ、
・バケットポリシーの内容
・S3用のエンドポンとがあるか
など確認する。


# 手順3　【targetアカウント】EC2インスタンスにtmuxをインストール

### tmuxとは
端末多重化ソフトウェア（ターミナル画面を複数開くことで、同時作業が可能になる）

### tmuxを使用する背景：

セッションマネージャーにはセッション維持の制限時間があるが、tmuxで作成したターミナルは明示的にセッションを終了しなければ維持され続ける。
冒頭でも書いたように、今回は40TB以上のデータを移行するので最低でも2日間はセッションを維持しておく必要がある。
  
```
# 下記コマンドでインストール
$ sudo yum install -y tmux
```

# 手順4　【targetアカウント】tmuxで新規シェルを作成し、移行コマンドの実行

#### 4.1 新規セッションの起動

```
# 下記コマンドで新規セッションの開始
$ tmux new -s <セッション名>
```

### 4.2 起動したセッションで、コマンドを実行

```
# 下記コマンドでデータ移行
aws s3 sync s3://<sourceバケット名> s3://<targetバケット名>/ --acl bucket-owner-full-control
```

無事データが移行できていることを確認！

#### 4.3 【番外】tmuxのセッションから抜ける方法

``ctrl + b``を押した後に ``d``を入力



# 参考
[Amazon S3 の VPC エンドポイントのタイプ](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/privatelink-interface-endpoints.html)
[とほほのtmux入門](https://www.tohoho-web.com/ex/tmux.html)
buttonがdisabled時にtitle属性を表示させる方法

## 問題
ある条件の時にbuttonをdisabledして使用不可にした際に, 使用不可である理由をtitle属性を用いたtooltipで表示したい時がある. しかし, bottonをdisabledさせると, マウスホバー時のイベントが無効になってしまうため, マウスホバーをさせてもtooltipが表示されないことがある. 

## 解決法
### 1. pointer-events: autoを与える

```html
<button disabled style='pointer-events: auto' 
title='ツールチップの内容' >
  ボタン
</button>
```

### 2. 対象をdivタグでくくり, それにtitle属性を与える
```html
<div title='ツールチップの内容'>
  <button disabled >ボタン</button>
</div>
```

## 参考
- https://developer.mozilla.org/ja/docs/Web/CSS/pointer-events
Google IMEの変換候補の位置ずれを一瞬で直す(windows)

# なにこれ？

WindowsでGoogle日本語入力を使っていると変換候補位置がずれることがあります。
ノートPCの画面から外部ディスプレイに切り替えた時には頻繁に起こり、日本語入力時にはとてもストレスです。この原因は画面dpiの変化にGoogle IMEが対応していない事ですが、数年間の間修正されずに放置されています。
![2022-02-25_17h04_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2543470/26b45718-3c3b-04ae-50aa-fd7ad3223f2c.png)


# 変換候補の位置ずれの直し方
「Google 日本語入力レンダラー」プロセスを落とせば、表示位置がリセットされて直ります。
タスクマネージャーを立ち上げてこのプロセスを探して終了させるのもありますが、少々手間です。
windowsのコマンドプロンプトで下記コマンドで強制終了すれば簡単に直ります。

```
 taskkill /im GoogleIMEJaRenderer.exe /F 
```

ファイルを指定して実行からでもOKなので、最速手順はこれかなと思います。
Win+R →　taskkill /im GoogleIMEJaRenderer.exe /F　

その他、画面の左上端に変換候補がずれた時にも有効ですので変換位置が変な場合は一度お試しください。
PythonでのAPI Key管理方法

## PythonのAPI Key管理方法
複数のAPIを使用するとAPI Keyの管理が大変になる。また明示的にAPI Keyをファイルに記述することはセキュリティの問題でできない。今回はpythonによるAPI Key管理方法の一つであるdotenvやmodule化を紹介する。
## 1. dotenv
.envファイルに環境変数を記述することで、複数の変数を一つのファイルで管理することができる。

```python:lib/.env
VALUE_NAME = value
```

```python:main.py
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), 'lib/.env')
load_dotenv(dotenv_path)
```

## 2. from *** import ( var1, var2 )
特定のpython code(lib/key.py)に環境変数(var1, var2)を記述して、from lib.key import ( var1, var2 )で環境変数を一つのPython fileにまとめることができる。以下ではos.environで既に登録された環境変数(DEFINEDVAR1,DEFINEDVAR2)を読み込み割り当てている。

```python:lib/key.py
import os
import sys

VAR1 = os.environ.get('DEFINEDVAR1', None)
VAR2 = os.environ.get('DEFINEDVAR2', None)

if VAR1 is None:
    print('Specify VAR1 as environment variable.')
    sys.exit(1)
if VAR2 is None:
    print('Specify VAR2 as environment variable.')
    sys.exit(1)
```

```python:python
from lib.key import (
    VAR1, VAR2
)
```
デスクトップアイコン位置を保存・元に戻すKeyboardMaestroマクロ

Finderアイコン表示とリスト表示で、Cmd+プラスマイナスを押すとアイコンサイズが変えられます。

…ところがDesktopを選択した状態でこのキーボードショートカットを押すと、デスクトップに置いたボリューム、フォルダなどのアイコン類が配置されなおされてしまうのですよね…
Preview.app等でCmd+プラスしているとき、うっかりデスクトップがアクティブな状態でキーを押してしまうと、きれいに配置したアイコンがあああ、ということに。

なのでこれを元に戻すマクロを作りました。

# 現在の位置を保存する
![225661559580.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/c607bfa6-2627-97c6-6d50-0647db6c0aac.png)

AppleScript部は↓

```applescript
tell application "Finder"
	set myItems to {}
	set a to every item of desktop
	repeat with i in a
		set idp to desktop position of i
		set dp to item 1 of idp & "," & item 2 of idp
		set nm to name of i as text
		set nk to kind of i as text
		if nk is "ボリューム" or nk is "フォルダ" then set end of myItems to nm & "," & nk & "," & dp & return
	end repeat
	return myItems as text
end tell
```

ファイルの書き出しや（後でやる）読み込みは、AppleScriptのみで行うとお片付けミスのコストがきついので、Keyboard Maestroに全て任せます。

書き出したファイルはボリューム名、種類（あまり意味なさげ）、デスクトップのxy+改行のcsvファイルになります。

csvなので、1pxズレなどを気の済むように揃えてください。

# 位置を戻す

![225661802837.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/c5d8b1d8-988f-47e7-ebcb-9bd0446a45dd.png)

csvを読み込んで、正規表現で変数に分け、AppleScriptでそれぞれ読み込んで処理します。
毎回every itemを取得して一個ずつKMで回しているので目に見えて遅いです。

AppleScript部は↓

```applescript
tell application "Keyboard Maestro Engine"
	set myN to getvariable "kmN"
	set myK to getvariable "kmK"
	set myP to {getvariable "kmPx", getvariable "kmPy"}
	tell application "Finder"
		repeat with i in every item of desktop as list
			set flK to kind of i
			set flN to name of i
			if flK = myK and flN = myN then
				set i's desktop position to myP
			end if
		end repeat
	end tell
end tell
```
Unity Inspectorの配列変数に複数ファイル一度で登録する

# 初めに
配列変数で一度にスプライトを登録したい。
けど。一つずつ登録してはめんどうだ。。
って事で色々調べてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/1b3ce639-329a-48bf-f329-02a464013119.png)


## Unity Editor機能がすげ。。。（結論）
元から機能がありました。
簡単に言うと、登録したいものを複数選択してドラックアンドドロップするだけでした。。

### ただ、ちょっと面倒なので。。。ちょっと説明

Projectウィンドウでオブジェクトを選択すると、インスペクタが変わってしまいます。
![Animation01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/393a9437-3e85-eb1a-56ec-7a20ecf1619d.gif)

なので、スクリプトが設定されているオブジェクトををロックします。
![Animation02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/165931cd-9c78-0d9e-104a-10315b1ce82e.gif)


ロックされたオブジェクトにスプライト複数選択して、ドラックアンドドロップ！
![Animation03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37068/6841da61-05ac-58b7-d40b-6593cf8ed913.gif)


#### 最後に
今回は、何かプログラムも組むまでも無く、Unity Editorの機能をうまく使う方法でした。
まだ、知らない機能がたくさんありそうです。。
Vue.js（Nuxt.js）で動的に外部のjsファイルを読み込む方法

Vue.js（Nuxt.js）で動的に外部のjsファイルを読み込む方法になります。

## Vue.js（Nuxt.js）で動的に外部のjsファイルを読み込む方法

```vue
<template>
  <button @click="importScript">click</button>
</template>

<script lang="ts">
import Vue from 'vue'

export default Vue.extend({
  methods: {
    importScript() {
      const script = document.createElement('script')
      script.setAttribute('src', 'https://www.youtube.com/iframe_api')
      script.setAttribute('id', 'script_id')
      document.head.appendChild(script)
    }
  }
})
</script>
```
上記のコードではボタンをクリックをしたら外部のjsファイルを読み込みます。

読み込んだjsファイルの関数には`window`でアクセスすることができます。

### 読み込んだjsファイルを削除する例
ページを離脱する時などに読み込んだjsファイルを削除する方法です。

```vue
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
  beforeDestroy() {
    const script = document.getElementById('script_id')
    if (script) {
      script.parentNode.removeChild(script)
    }
  },
  methods: {
    importScript() {
      const script = document.createElement('script')
      script.setAttribute('src', 'https://www.youtube.com/iframe_api')
      script.setAttribute('id', 'script_id')
      document.head.appendChild(script)
    }
  }
})
</script>
```

## 外部ファイルを読み込むだけならheadの中に記述すればOK
普通に外部のファイルを読み込む場合は、headの中に記述することで可能です。

```vue
<script lang="ts">
export default Vue.extend{
  head() {
    return {
      script: [
        {
          src: 'https://www.youtube.com/iframe_api'
        }
      ],
      link: [
        {
          rel: 'stylesheet',
          href: 'https://fonts.googleapis.com/css?family=Roboto'
        }
      ]
    }
  }
}
</script>
```
下記の記事でも解説しています。

https://qiita.com/TK-C/items/afaef4a4f0477c3be1e7
最短経路問題

[幅優先探索](https://qiita.com/sibata_yuna/items/f5ecd03e503559937b7f)　(重みなし)
計算量: O(|E| + |V|)

[ダイクストラ法](https://qiita.com/sibata_yuna/items/93131e410195d8f9b8b7)　(正の重みのみ) 
計算量: O(|E|log|V|)

[ベルマンフォード法](https://qiita.com/sibata_yuna/items/f8a0110e1c66a2b9e854)　(負の重みも含む)
計算量: O(|E|×|V|)

[ワーシャルフロイド法](https://qiita.com/sibata_yuna/items/2a8429eefaec263e4e26)　(実装が簡単、負の閉路に気づけない)
計算量: O(V^3)

( V: 頂点集合 )
( E: 辺の集合 ) 

( Point ) 負の重みがある場合、ある点で最短でなくても、さらに進んだ点で最短となる場合がある。
(例) 重み -5 の場合、合計 -10 のアドバンテージ

最短経路なので何度同じ場所を通ってもよい
m1 macだとdotnet使えないの？3.1は？5は？

## intel mac → m1 macへ移行した
intelバイナリも動くと聞いていたので、何も考えずに旧intel macからデータ移行させた。
rubyとかそのへんはまぁ問題なかったが、dotnetは動かなくなった…

## 公式
https://docs.microsoft.com/ja-jp/dotnet/core/install/macos#arm-based-macs
このページなんだが、正直わかりにくい…
結局使えるの？使えないの？

## 結論
指定のSDKを入れれば使える。3.1も5も6も。

## 手順
https://docs.microsoft.com/ja-jp/visualstudio/mac/uninstall-net-2019?view=vsmac-2019
上記参考に一旦全部消す。
で、再度3.1や5のSDK入れ直す。
(brewで入れ直すとまたややこしくなるので公式から入れたほうが良かった)
【Power Automate 業務効率化】 teams 活用術 その一

## Microsoft teams bot（簡易版）を作成

現在、Power Automate Cloud を利用し、業務効率化を進めています。
今回は備忘録も兼ねて記事を書こうかと思います。

アイディア次第で誰でも簡単に実装できるので、興味のある方は色々調べてみるといいかと思います。

※Power Automateには、Desktop版（無料）とCloud版（ライセンスが必要）があります。
お勤め先で契約しているのであれば、Cloud版も使用できるかと思います。
Desktop版とCloud版では、できることも微妙に違います。

参考記事（Cloud版）
https://powerplatformnikki.com/powerautomateforcloud/#toc3

## 作成手順　

1.Office 365 のサイトよりPower Automate のアイコンをClickする
2.画面左にあるメニューの作成から、スケジュール済クラウドフローをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/e4f32b1c-32c7-e17d-9e9b-c80781b68816.png)

3.スケジュール済クラウドフローを構築するというウィンドが開くので情報を入力する。

フロー名：任意の名前

フローを実行するDateとTimeを入力し、繰り返す間隔を入力し作成をClickする
※繰り返す間隔は後でも変更可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/115a1468-3c18-cb2c-2f31-db23cd7a3202.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/ba583203-39db-7244-f37e-1e32451ca633.png)

上記は平日の月～金で17:00に通知する例

4.新しいステップを追加する

5.MicrosoftTeamsのアイコンをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/dd916ccc-9d06-372d-ff10-f6c6e70c1b3d.png)

アイコンをClickすると色々なトリガーの一覧が表示されますが、今回は既存のGroupchatに投稿する場合で説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/25fca8f3-01bf-d4e4-5a38-53ea4a81ce9d.png)

6.上記のチャットまたはチャネルでメッセージを投稿するをClickする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/50e5fbec-4628-be9c-a9c2-b056d4347d41.png)

投稿者：フローボットのままでいいです

投稿先：グループチャットにします（ご自身で作成したチャネルにも投稿は可能です）

グループチャット：投稿したいChat名を選択する（参加しているchatが一覧表示されます）
出てこない場合は、検索機能もあります。
※自分が作成した時は、一覧表示で出てきました。

メッセージは投稿内容とリンクの設定などができます。

7.設定が完了したら、保存しテストをClickしてフローのテストを行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/41d47427-e3c0-5e42-12e2-4a1e0119fe06.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/5657fc1f-15e4-7927-65c3-276d4f036af7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/0034acb4-d307-cf8e-ae25-e20af2941da4.png)

chatに通知されればOKです。

塗りつぶされた箇所には、作成者の名前が表示されます。
ハッカソンのやる事リスト

# はじめに
ハッカソンとは、同じテーマに興味を持った開発者が集まり、協議・協力しながら集中的にコーディングを行う催しです。
ハッカソンという言葉は、ハック（hack）とマラソン（marathon）を組み合わせた造語とされています。

ハッカソンは、プログラマーの個人作業になりやすいプログラミングを、大人数で賑やかに行う点に特徴があります。短時間で集中して開発を進めることで、スキルの向上が促されたり、意見を出し合いながら進めることで、新しいアイデアや発見が得られたりといったことが期待できます。ハッカソンはプログラマーの祭典として、あるいは、研修活動などとして行われます。

今回、自分がハッカソンを体験して勉強になった事を備忘録としてまとめます。
また、次回参加する機会があった場合の為に **「やることリスト」** を用意しました。

## ハッカソンを体験して勉強になった事

### 参加したハッカソンの内容
* 企業の開発中のSDKを使用して、サービスを2週間で作成する
* 一緒に開発するメンバーはほぼ初対面、年齢も所在地もバラバラ
* 技術レベルは初心者から中級者、職種もさまざまな人が参加
* ハッカソンの成果物は、アプリケーションと発表スピーチ

企業がハッカソンを主催する目的は多々ありますが、新しいサービスや機能に関するアイデアやヒントを発掘できることが大きな目的としてあります。
内容によっては、製品化を目指して本格的なプロジェクトになることもありえます。例えば、Facebookで有名な「いいね！」機能も、もともとは同社のハッカソンを通じて誕生したものだそうです。

:::note alert
警告！
企業と秘密保持契約を結んだ場合は、情報の取り扱いに注意してください！
:::

### ハッカソンのイベント事例
官公庁や大学、企業がさまざまなハッカソンイベントを実施しています。
参考にイベント記事などを見てみると発表の方法など勉強になります。
* 国土交通省「アイデアソン・ハッカソン」
* 東京大学「JPHACKS（ジャパンハックス）」
* Yahoo! JAPAN「Hack Day」
* ソニー「GO FOR IT～Home Hacker's Workshop～」

### ハッカソンに参加して感じたメリット
* **最新技術・テーマに触れる絶好の機会になった**
最先端のテクノロジーを利用して開発を行うハッカソンに参加した為、新しい技術に触れるだけでなくその活用の可能性をさまざまな人と協力しながら模索する経験は、とって大きな財産になりました。

* **コミュニケーション活性化**
普段個人作業の多い自分にとって、担当外の業務について知る機会となりました。一つのゴールに向かってコミュニケーションを重ねることで、互いの理解が進み、あまり接点のない人とも信頼関係を育むきっかけとなりました。

* **ゼロから完成まで作り上げる達成感と経験値の獲得**
ゼロから完成まで一貫して作り上げたときの達成感は格別なものがありました。また、作り上げた成果物に対して、きちんと評価を受けることで、開発のモチベーションも高まりました。

# 事前準備
スムーズに作業を開始する為にいろいろな事前準備を行う必要があります。

こちらの本を読むとアイデアの出し方やタスクの進行管理などがスムーズに行えます。
* [アイデアのつくり方](https://amzn.to/3ysq8vq)
* [アジャイルサムライ――達人開発者への道](https://amzn.to/39UMdsp)
* [イシューからはじめよ ― 知的生産の「シンプルな本質」](https://amzn.to/37zPo7Y)

## 心構えと把握すること
* 仕事をしながらハッカソンで開発する為の時間管理
  * ハッカソン期間中、仕事を定時に終えれるようになっているか
  * 仕事後、ハッカソンの作業をするメンタルやモチベーションを保てるか
  * 体調などのコンディションを整えているか

:::note warn
注意！
作業時間を1日2~3時間確保すること
:::

* チームメンバーに関する情報を把握する
  * チームメンバーが何を目的に参加したのか
  * チームメンバーのやりたい事と出来る事は何か
  * チームメンバーとしっかりミーティングが出来る時間があるか

:::note warn
注意！
作業時間には、他のメンバーの作業を助けることもあります。
また、作業を助けてもらう事もあるので、何に詳しいかを把握するとスムーズに作業が出来ます。
:::

# やることリスト
1. テーマに対して問題点をチーム内で洗い出す。
2. 問題点を1つに絞りこみ、ペルソナを設定して解決策（サービス）を検討する。
3. 実装する機能を決めて、必要となるタスクを洗い出して工数を見積り、担当者を割り振る。
4. 開発をする。
5. プレゼン準備と練習をする。

## プレゼン準備で考えること
* テーマの問題点をどのように解決するサービスなのか
* どの部分をデモで見せるのか
* 自分たちのこだわりはどこか

# まとめ
ハッカソンは短期間で企画から開発まで行うので、まったく楽なイベントではありません。
しかし、参加して得られるメリットは多いので、少しでも気になった方は参加を検討してみてはいかがでしょうか。
エンジニアとしてのキャリアアップを加速させるきっかけとなるはずです。
Geant4 install 手順

# Geatn4　環境構築＆インストール
## はじめに
本記事は研究室の引き継ぎ作業のために書いた記事となります
## システム環境
1. Pop!_OS 20.04 LTS
[Pop!_OS download link](https://pop.system76.com/)

2. Ubuntu 18.04.6 LTS も🉑
[Ubuntu 18.04.6 download link](https://releases.ubuntu.com/18.04/)

## 環境構築　library

- Geant4 実行するための環境構築
 ```bash
$ sudo apt-get install git dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev \
         libxft-dev libxext-dev
         gfortran libssl-dev libpcre3-dev \
         xlibmesa-glu-dev libglew1.5-dev libftgl-dev \
         libmysqlclient-dev libfftw3-dev libcfitsio-dev \
         graphviz-dev libavahi-compat-libdnssd-dev \
         libldap2-dev python-dev libxml2-dev libkrb5-dev \
         libgsl0-dev libqt4-dev
```

- インストール完了したら，cmakeバージョンを確認
必要条件：　cmake version > 3.3　



```bash
$ cmake --version
```

## Geant4 ダウンロード　＆ インストール
### Geant４　main program ダウンロード，展開
``` bash
$ wget http://geant4.web.cern.ch/geant4/support/source/geant4.10.06.p02.tar.gz -O  $HOME/geant4.10.06.p02.tar.gz 
$ cd $HOME
$ tar xvzf geant4.10.06.p02.tar.gz
```

### Geant4 data ダウンロード
[data download link](https://geant4.web.cern.ch/support/download_archive?page=1)
![Screenshot from 2022-02-25 15-21-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1440519/827c8278-3f7a-5e6c-5b19-7b86d57262bc.png)

- ＄Homeで"data" のフォルダを作る
すべてのデータファイルをダウンロード，dataフォルダに入れる

### Geant４　インストール
- qtインストール (Geant4 application 用)
```bash
$ sudo apt-get install qt4*
```

- Geant4 インストール　手順
```bash
$ cd
$ mkidr geant4-build && cd geant4-build
$ cmake  -DCMAKE_INSTALL_PREFIX=$HOME/geant4-install/  -DGEANT4_USE_OPENGL_X11=ON 
\ -DGEANT4_USE_RAYTRACER_X11=ON -DGEANT4_USE_QT=ON 
\ GEANT4_BUILD_MULTITHREADED=ON $HOME/geant4.10.03.p01
$ make -j8
$ make install -j8
```
***Note***: j8はスレッドの数，８以上のスレッドがあればその以上指定すると早くなる

インストールが成功すると，以下のメッセージが表示される
```bash
--Configuring done
--Generating done
--Build files have been written to: /home/xxx
```

## 実行してみる
- 上記のステップを全部踏んだら，＄HOMEに　geant4.10.06.p02, geant4-build, geant4-install，の３つのフォルダが確認できるはず


- 先程作ったdataフォルダをgeant4-install/share/Geant4-10.06のフォルダに移動する．ここで，同フォルダ内にgeant4makeというフォルダがあるはず

- Geant4を実行するたびに，geant4makeフォルダにあるgeant4make.shのファイルを実行しなければならない．効率化するために，.bashrcをつくる
```bash
$ echo 'source $HOME/geant4-install/share/Geant4-10.06.p02/geant4make/geant4make.sh' >> $HOME/.bashrc
```

- 次に，実際に例を実行してみよう
```bash
$ cd $HOME/geant4.10.03.p01/examples/basic/B1
$ make -j8
```
下記のメッセージが出たらコンパイル成功

```bash
LinkingexampleB1
...Done!
```
- Applicationを起動する

```bash
$ exampleB1

```

以上
【RSpec】テストコードはループを使わない方がベター

# なぜループ処理を使わない方がいいのか

テストコードは仕様がひと目でわかることが大事なため、可読性が下がるループはしない方がベター

```ruby
  describe '#format_date_of_birth' do
    it '生年月日を和暦で表示すること' do
      %w(1977-06-06 1988-06-06 1989-06-06 2016-06-06).each do |date_text|
        date = Date.parse(date_text)
        person = Person.new('Taro', date)
        jp_year = date.year >= 1989 ? "平成#{date.year - 1988}年" : "昭和#{date.year - 1925}年"
        expected = "#{jp_year}#{date.month}月#{date.day}日"
        expect(person.format_date_of_birth).to eq expected
      end
    end
  end
```


ただ、テストデータを作成するときだけはループ処理で書いてしまった方が見やすい気がする。
「テストはループ処理を使わない方がいい」という言葉だけだとデータ作成までベタ書きするのかなと勘違いしそうになったので。


```ruby
(Date.new(2021, 1, 1)..Date.new(2021, 1, 15)).each do |date|
  create(:post, date: date, user: user)
end
```

# さいごに

記事の中で伊藤さんがおっしゃっていた言葉が印象的だった。
>何事も機械的に適用しない。目的を考えて最適な選択肢を選ぶ

コードの書き方に絶対はなく、一個人がより良いと思う方を自分で考えて自分なりの信念を持って選択していくことが大事だと思う。




https://qiita.com/jnchito/items/eb3cfa9f7db752dcb796

https://zenn.dev/yuji_developer/articles/52cc0e356b3748#9.-%E5%88%86%E5%B2%90%E3%82%84%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E6%9B%B8%E3%81%8B%E3%81%AA%E3%81%84
Data Portal: NATO を可視化した

NATO の加盟国増加の様子を可視化してみました。
https://datastudio.google.com/s/sYiqJlPZKRc

加盟日と加盟国の情報から、
- 時系列グラフ
- 表
- Google Map

で表してみました。

Google Map 上で加盟年に基づいて加盟国を塗り分けています。
表や時系列グラフをクリックしたりドラッグする事で、Google Map に表示する国を切り替えられます。

年々 NATO が東側に展開している様子がわかりました。
ここにウクライナが加わり、バルト三国やポーランド、ウクライナにNATO軍を展開したとすると、今回ロシアが仕掛けたウクライナへの侵攻と逆の事が、モスクワに対してできるのだろうなという気になりました。
【JavaScript】カスタム例外の書き方

JavaScriptにおけるカスタム例外の書き方をメモしておく。

# カスタム例外の書き方
カスタム例外を作成することで、例外処理でどのようなエラーが発生したか細かく判別できるようになる。カスタム例外は、組み込みの``Error``クラスを継承して、その中にコンストラクタを定義する。サンプルが以下のようになる。

```javascript:カスタム例外クラス
class MyError extends Error {
	constructor(message) {
		super(message);
		this.name = "MyError";
	}
}
```
ここで、``this.name = "MyError";``を記述して``name``プロパティを正しい名前に上書きしている。これを記述しないと``error.name``は``Error``のままになってします。ただし、``instanceof``でのエラー判別は正常に動作する。これを使って例外処理を書いてみると以下のようになる。

```javascript:例外処理
try {
	throw new MyError("カスタム例外が発生しました。");
} catch (error) {
	if (error instanceof MyError) {
		console.log(error);            // MyError: カスタム例外が発生しました。
		console.log(error.message);    // カスタム例外が発生しました。
		console.log(error.name);       // MyError
	} else {
		console.log(error);
	}
}
```
raspberryPi sshの基礎編 ラズパイのsshを許可する

Qiitaの皆さんには本当に有益な記事をいつも頂いて早１年、自分も誰かの役に立ちたいと思い記事を書く練習がてら、忘備録がてら...

ラズパイをssh接続したい場合、まずラズパイでssh接続ができるよう設定します。これをしないと
Connection refused
と拒否されてしまいます。

１ラズパイのコンソールを開いて下記入力

```Linux
sudo raspi-config
```

2　③のInterface Optionsを選択

3 SSHを選択して　はいを選択


これでOK!再起動の必要はありません。
m1 macでazure function tool kitが動かない（dotnet sdk is required for dotnet based functions.）とき

## 事象
m1 mac移行後にいつも通り、
`func host start`
と叩くと、
`dotnet sdk is required for dotnet based functions. Please install https://microsoft.com/net`
dotnet sdkはインストールされていたはずだが…

## 解決
超絶単純な理由だった。
m1 mac移行後にdotnetコマンドへのパスが通っていなかった。
`/usr/local/share/dotnet/x64/`
にパス通してエラーが無くなった。

### ちなみに
riderから実行するときもdotnetへのパスが通ってないと同じエラーが出る。
あと、azure-functions-core-toolsもbrewから再インストールしたほうがいいかもしれない。
Homebrewでインストールした不要なファイルを確認する

# 溜まっていくHomebrewの入れ物

macで開発環境を作成する場合、Homebrewを使うと楽できる。
でもいつの間にやら色々入れすぎて、不要なものでいっぱいになっていたりする。


# まずHomebrewのフォルダを確認。
```
brew --prefix
```

このフォルダに移動する。
Finderなんかで開くとわかりやすい。
いらないものをフォルダごと削除します。

```
open homebrewのフォルダ
```
AWSのEC2の環境構築で参考にしたサイト(rails,docker,nginx)

以下のインフラ環境を構築するまでに参考にしたサイトをご紹介します。

# 1,AWSの全体的な知識を付けるために参考にしたもの
＜動画教材＞
WEBエンジニアの山浦さんのUdemyの動画教材です。
解説が初心者に優しく、わかりやすいのでおすすめです。

https://www.udemy.com/course/aws-and-infra/

＜書籍＞
解説がわかりやすいです。
イラスト使って説明してくれるので、なにをやっているのかイメージしやすく、すぐに読み終えることができました。

https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=sr_1_15?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2E1DBF4SBKC7A&keywords=AWS&qid=1644936004&sprefix=awss%2Caps%2C177&sr=8-15


補足：
ご紹介した２点は内容が共通している部分が多いです。
山浦さんの動画教材の方が、内容が濃いので、そちら１点だけでも良いかもしれません。

# 2,VPC作成からEC2にデプロイするまで

有料の教材です。
買っても良いと思いますが、chapter3まで無料なのでそこまでやって、その後は次にご紹介する記事を参考にすると良いと思います。

https://zenn.dev/naoki_mochizuki/books/1471ce20222227

この記事にはかなり助けられました。
これを進めれば、RDSの作成やdocker環境でwebサーバーがnginxのrailsアプリをEC2にデプロイまでできます。

https://qiita.com/sho_U/items/a1b5e4ddf13f3c42a722

# 3,ALBを使用してHTTPからHTTPSでサイトにアクセスできるようにする

サイトのHTTPS化には次のサイトを参考にしました。
chapter6でHTTPS化、
chapter7でHTTPでアクセスしてもHTTPSになるように設定できるようになります。
ちなみにサイトのドメインの取得方法は、最初にご紹介した山浦さんの動画で、「お名前.com」でドメインを購入し、Route53と連携する所まで紹介されています。

https://zenn.dev/shota_imazeki/books/7a0f8e2f4cccd846fb16/viewer/728ee2

# 4,SESを使ったメール送信

AWSのSESを使用してメール送信は以下のサイトを参考にしました。
SES導入はエラーがでまくり、かなり苦戦したので、一応自分のエラーが出なかったproduction.rbを貼っておきます。

https://qiita.com/4ma9147/items/2b5fc6fa775b6efe8aaa

```ruby:config/enviroments/production.rb
creds = Aws::Credentials.new(
    ENV['AWS_ACCESS_KEY_ID'],
    ENV['AWS_SECRET_ACESS_KEY']
  )

  Aws::Rails.add_action_mailer_delivery_method(
    :aws_sdk,
    credentials: creds,
    region: ENV['AWS_REGION']
  )

  config.action_mailer.default_url_options = { host: 'あなたが取得したドメイン名' }
  config.action_mailer.delivery_method = :aws_sdk
  config.action_mailer.perform_deliveries = true
  config.action_mailer.perform_caching = false
  config.action_mailer.raise_delivery_errors = true
```

ポイントは、

```ruby
config.action_mailer.delivery_method = :aws_sdk
```

の部分です。
rails aws sesで検索すると、ここが「:ses」になっている記事が多いですが、「:aws_sdk」にしないとエラーが出たので、よかったら参考にしてください。

# 4,S3に画像をアップロードする

S3はRailsチュートリアルを参考に実装しました。

https://railstutorial.jp/


## 最後に

山浦さんのUdemyの講座が全体を網羅しているので、山浦さんの教材を軸にご紹介した記事などを参考に進めれば、環境構築はできると思います。
AWS セキュリティグループとネットワークACLの主な違い

# セキュリティグループ
* EC2インスタンスなどに適用するファイアウォール機能。
* 許可するルールのみ定義する。
* デフォルトの設定値の場合、アウトバウンド通信はすべて許可、インバウンド通信はすべて拒否する。
* EC2インスタンスに複数のセキュリティグループの適用が可能で、設定の追加・変更は即座に反映される。
* ステートフルな制御が可能。(ルールで許可された通信の戻り通信も自動的に許可される)
# ネットワークACL
* サブネット単位で設定するファイアウォール機能。
* 各ルールに番号を割り当て、番号順に許可または拒否のルールを適用する。
* VPC作成時に、デフォルトのネットワークACLがひとつ準備されており、初期設定ではすべてのトラフィックを許可。
* VPC内に作成したサブネットごとにひとつのネットワークACLを設定可能。
* 新規に作成することもでき、その場合はすべてのトラフィックを拒否。
* インバウンド、アウトバウンドそれぞれに対して、許可または拒否を明示した通信制御が可能。
* ステートレス(インバウンドとアウトバウンドに対する通信制御が必要)
# 参照
[AWS認定ソリューションアーキテクトアソシエイト教科書](https://book.impress.co.jp/books/1120101067)
へんすう（変数）「こども向けのSnap!かいせつ」

<h2>へんすうと繰り返し</h2>
こんなスクリプトがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/671164/bc025e25-fcb5-6efe-b0a8-ea9f34f1046b.png)
forブロックの中の、オレンジ色のiと書かれたまるいブロックは、forブロックの中で動かすことができます。
このオレンジ色のまるいブロックが「へんすう」です。へんすうには名前があって、ここでは「i」という名前がついています。へんすうはなにかのあたい（数字や文字など）をあらわしています。
このforブロックは、くりかえしブロックと同じで、ブロックの最後まで行くとブロックの最初に戻ります。くりかえしの一回目には、iに「1」が入っていて、二回目のくりかえしのときはiには「2」が入ります。そしてそのあとはくりかえすたびにiの中の数が3,4,5,6,7...というふうに1ずつ増えます。そして、iに50が入ってforブロックの最後まで行くと、そこでくりかえしは終わります。
このスクリプトでは、まわるかずがだんだん増えていくので、だんだんと小さい円を書くことになります。
このiというへんすうは、forブロックの中だけで使うことができます。iの上で右クリックすると、iという名前を別の名前に変えることができます。iという名前はわかりにくいので、「くりかえしの長さ」などのわかりやすい名前をつけてあげるのもいいですね。

<h2><a href="https://qiita.com/wordplugin/items/4726e310f61eaa06b8cb">グローバルへんすう</a></h2>
<h2><a href="https://qiita.com/wordplugin/items/ebbd7dc3d82dab8049e1">スクリプトへんすう</a></h2>
<h2><a href="https://qiita.com/wordplugin/items/da83f4fdb42a1d46d2c1">へんすうの名前を変える</a></h2>
<h2><a href="https://qiita.com/wordplugin/items/6fcd7089322eeb564223">一時的へんすう</a></h2>


<a href="https://qiita.com/wordplugin/items/4158def39e181110c5bb">戻る</a>
nRF52 SDK で Printf() / NRF_LOG_INFO() で分かったこと

---
***はじめに***
Nordic nRF5x シリーズにて SDK に収められている サンプルコードで記載されている　printf() / NRF_LOG_INFO() についての覚書

---

1. nRF5x シリーズに 収められている
   Lチカ： C:\nRF5_SDK_xx.x.x_xxx\examples\peripheral\blinky  のソースコードに printf() を追記すれば
   Build -> Debug で printf() の内容が <Debug Terminal> に表示される


2. nRF5x シリーズに 収められている
   UAART： C:\nRF5_SDK_xx.x.x_xxx\examples\peripheral\uart において 何もしなければ printf() は 
   UART に接続されたデバイス (ex. 仮想シリアルを通して TeraTerm) に出力される

   sdk_config.h に記述されている

~~~
// <q> RETARGET_ENABLED  - retarget - Retargeting stdio functions

#ifndef RETARGET_ENABLED
#define RETARGET_ENABLED 1
#endif
~~~

で、 パラメータを 1->0 に書き換えることで printf() が <Debug Terminal> に表示される
~~~
// <q> RETARGET_ENABLED  - retarget - Retargeting stdio functions

#ifndef RETARGET_ENABLED
#define RETARGET_ENABLED 1
#endif
~~~

3. nRF5x シリーズに 収められている
   twi_sensor：C:\nRF5_SDK_xx.x.x_xxx\examples\peripheral\twi_sensor において
   NRF_LOG_INFO() を用いて UART出力を行う場合で UART の Tx Pin が標準でない場合

   sdk_config.h に記述されている下記で TX_PIN 番号を実際の Pin 番号に書き換える必要がある
~~~
// <o> NRF_LOG_BACKEND_UART_TX_PIN - UART TX pin 
#ifndef NRF_LOG_BACKEND_UART_TX_PIN
#define NRF_LOG_BACKEND_UART_TX_PIN 6
#endif
~~~

4. 上記の twi_sensor において NRF_LOG_ENABLED or NRF_LOG_BACKEND_UART_ENABLED を 0 にすると
   NRF_LOG_INFO() は、出力されなくなる
~~~
// <e> NRF_LOG_BACKEND_UART_ENABLED - nrf_log_backend_uart - Log UART backend
//==========================================================
// <e> NRF_LOG_ENABLED - nrf_log - Logger
//==========================================================
#ifndef NRF_LOG_ENABLED
#define NRF_LOG_ENABLED 1
#endif
-- 略 --
#ifndef NRF_LOG_BACKEND_UART_ENABLED
#define NRF_LOG_BACKEND_UART_ENABLED 1
~~~

---
☆2022年 2月25日(金) 午後 3時25分 初版(Ver1.00) 作成
私が作ったオリジナルアプリを公開します！

はじめに
-
スクール卒業後に、独学で完成させました。
まだまだ未熟ですが、誰かの参考や希望になればと思い、投稿します。

①「冷蔵庫の中身がわかるアプリ」
-
https://reizoko-app.herokuapp.com/
(ユーザー名：　reizoko /パスワード：　11770)

[GitHubコード：https://github.com/mina153/reizoko-app ]

冷蔵庫の中身を記録するアプリです。
同年代の方と「どんなアプリが欲しいか」というテーマで討論したときに、出た意見を参考にして、このアプリを作りました。

工夫した点は、
　・ユーザーが飽きないように、CSSを使ったアニメーションを追加した
　・hoverを使うなどして、アプリに動きをつけた
　・テストコードも書き、より実務に近づけた
　・Basic認証でセキュリティを考慮した (今回は誰でも触れるように公開してます。）
です。


②「自分の好きなものについて投稿できるインスタ風のアプリ」
-
オリジナルアプリ：https://ramen-app-3.herokuapp.com/
(ユーザー名：　hoge /パスワード：　3333)

[GitHubコード：https://github.com/mina153/ramen-app ]

Ruby on Rails を軸に、インスタ風のアプリケーションを１から作りました。
工夫した点は、
 　・カレンダー機能
 　・いいね機能
 　・その他投稿機能
 　・Basic認証でセキュリティ配慮(今回は誰でも触れるように公開してます。）
です。


最後に
-
このアプリは、TECHCAMPプログラミングスクール卒業後に、独学で完成させました。

「ここの実装気になる」「どうやったらこれができるの！」と思った方がいましたら、ぜひ質問ください　！🙇‍♀️
Python ログの重複が出たときに確認すること

モジュールが増えてくるとロガーも必要に応じて追加しますよね。そのに落とし穴があって、ルートロガー以外にハンドラーを設定するとログの重複が発生するのです。

```
{
    'root': {
        'level': 'DEBUG',
        'handlers': ['console', 'file'],
        'propagate': True
    },
    'mod1': {
        'level': 'DEBUG',
        'handlers': ['console', 'file'],
    },
    'mod2': {
        'level': 'DEBUG',
        'handlers': ['console', 'file'],
    },
}
```

こんな感じにやると、ログの重複が起こります。

ドキュメントの一番上にこのような注釈があります。

>注釈 ハンドラを、あるロガー と その祖先のロガーに接続した場合、同一レコードが複数回発行される場合があります。一般的に、ハンドラを複数のロガーに接続する必要はありません。propagate 設定が True のままになっていれば、ロガーの階層において最上位にある適切なロガーにハンドラを接続するだけで、そのハンドラは全ての子孫ロガーが記録する全てのイベントを確認することができます。一般的なシナリオでは、ハンドラをルートロガーに対してのみ接続し、残りは propagate にすべて委ねます。

https://docs.python.org/ja/3/library/logging.html#logging.Logger

# 正しい書き方

```
{
    'root': {
        'level': 'DEBUG',
        'handlers': ['console', 'file'],
        'propagate': False # 推奨
    },
    'mod1': {
        'level': 'DEBUG',
    },
    'mod2': {
        'level': 'DEBUG',
    },
}
```

# 結論

最上位のロガー（この例だとroot)に１つhandlersをセットすればよい。
【I18n】ブラウザの設定言語を変えても表示言語が変わらない問題

# やりたいこと
- ブラウザの設定言語に合わせて表示言語を変更する

# 問題・再現手順
1. ブラウザの設定言語を `日本語` に設定する
2. 対象のサイトをブラウザで表示する（ `日本語` で表示される）
3. ブラウザの設定言語を `英語` に変更する
4. 2の画面をリロードする
    ・期待する表示: `英語`
    ・実際の表示: `日本語`

# 原因
- 初回表示時は、ブラウザの設定言語を検出しLocalStorageに保存する
  （ブラウザの設定言語で表示される）
- 2回目以降は、LocalStorageに保存された言語で表示される
  （ブラウザの設定言語は見ない）

**-> ブラウザの設定言語を変更しても表示言語が変わらない**

# 対応策
- ブラウザの設定言語の優先度を上げる
```ts
import LanguageDetector from 'i18next-browser-languagedetector';

const detector = new LanguageDetector(null, {
  order: ['navigator', 'localStorage']
});
```
連想配列（オブジェクト）のキーと値を入れ替える。【javascript】

解決に時間がかかったためメモ。
# 連想配列のキーを値に、値をキーにしたかった
```
const obj = {
  a : 'aaa',
  b : 'bbb',
  c : 'ccc'
}
```
これを
```
const obj = {
  aaa : 'a',
  bbb : 'b',
  ccc : 'c'
}
```
こうしたい
# Object.entries, Object.fromEntries を使う
```
const array = Object.fromEntries(
  Object.entries(tmp).map(function (value) {
    return [value[1], value[0]];
  })
);
console.log(array);
```
```
array => {
  aaa : 'a',
  bbb : 'b',
  ccc : 'c'
}
```
できた。
Object.fromEntries が ES2019 から追加されたとのこと。

# 参考
・https://qiita.com/c-shiraga/items/33812799e4dc17d89b44
HTMLとは何か？

## HTML(HyperText Markup Language)
### ハイパーテキスト・マークアップ・ランゲージ

**HTML**は、ウェブページを作成するために開発された言語です。現在、インターネット上で公開されているウェブページのほとんどは、HTMLで作成されています

 HyperText Markup Languageを日本語で表すなら、「ハイパーテキストに目印をつける言語」くらいの意味になります。


### ハイパーテキスト（HyperText）とは

ハイパーリンクを埋め込む事ができる高機能なテキストです。ハイパーリンクとはウェブページで下線の付いたテキストなどクリックすると別ページへ移動するリンクの事です

例
[Qiita](http://qiita.com)押すとリンク先に移動します


ハイパーテキストでは、ウェブページから別のウェブページにリンクをはったり、 ウェブページ内に画像・動画・音声などのデータファイルをリンクで埋め込むことができます。 HTMLには、このハイパーリンク機能で関連する情報同士を結びつけて、情報を整理するという特徴があります。


### マークアップ(Markup)とは

 また、目印をつける（Markup）というのは、文書の各部分が、どのような役割を持っているのかを示すということです。 例えば、見出し・段落・表・リストなど、文書の中で各部分が果たしている役割が分かるように目印をつけます。 こうした見出し・段落・表・リストなどの文書内の各部分を要素（element）と呼びます。
【macOS】ウィンドウメニューにタブ関連のメニューを出なくしたい

XcodeでmacOSアプリを作成する際、タブを使用しないアプリなのに、ウィンドウメニューにタブ関連のメニューが出てしまうので、これを出ないようにする方法です。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/b6b7edb8-af95-3acd-55a2-69ff30cc33f9.png)
Xcodeでstoryboardやxibファイルを開き、ウィンドウのプロパティで"Tabbing Mode"を"Disallowed"に設定します。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1772485/6e7082e0-b50a-4de6-95d2-e4a484a5dce4.png)
リストであそぼう

# リストの諸々

## リストに突っ込む

```Python
a = "123abc"
l = list(a)
l
```
```
['1', '2', '3', 'a', 'b', 'c']
```

## リストから文字列へ
```Python
print("".join(l))
```
```
123abc
```

## 一部を取り出す
### スライス
```Python
l[1:3]
```
```
['2', '3']
```
### 条件を付ける
```Python
[x for x in l if x == "2"]
```
```
['2']
```

## リストに要素を追加

### 一番後ろに追加　list.append()
```Python
l.append("d")
print(l)
```
```
['1', '2', '3', 'a', 'b', 'c', 'd']
```

### 指定したインデックスに追加　list.insert(index, 追加したい要素)
```Python
l.insert(3, 4)
print(l)
```
```
['1', '2', '3', 4, 'a', 'b', 'c', 'd']
```

## リストの要素を削除する

### すべて削除　list.clear()

```Python
a = "123abc"
l = list(a)
l.clear()
print(l)
```
```
[]
```

### 指定した位置の要素を削除し、削除した要素を取得　list.pop()

```Python
l = list("123abc")
print(l.pop(1))
print(l)
```
```
2
['1', '3', 'a', 'b', 'c']
```


### 指定した要素の最初の要素を削除　list.remove()

```Python
l = list("123abc123")
l.remove("1")
print(l)
```
```
['2', '3', 'a', 'b', 'c', '1', '2', '3']
```

### 指定した範囲を削除　del

```Python
l = list("123abc")
del l[2:4]
print(l)
```
```
['1', '2', 'b', 'c']
```
新卒エンジニアが１週間で、AWS CLFを取得した方法

# はじめに
<!-- 発端や概要を記載 -->
初めてブログを書くため緊張してます。。
こんなやり方でもいけるんだなーっていう軽い気持ちで読んで頂けたら幸いです:whale2:

資格名：AWS クラウドプラクティショナー (AWS CLF)
合格日：2021年9月10日(金)
学習期間：2021年9月3(金)~9月10日(金) 1日 30分~2時間

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [学習手順](#学習手順)
1. [使用した教材](#使用した教材)
1. [参考文献](#参考文献)
1. [所感](#所感)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 学習手順
1. 出題範囲を理解する。(勉強量の削減)
2. 疑似問題をさらっと確認し、どの程度の内容が問われるかをなんとなく把握する。 (Udemy講座①)
4. Udemy講座①の疑似問題を解いていく。
   (正解/不正解にこだわらず、なぜその回答になるのかを自分で説明できるようになるまで復習する)

:star: [『Maruchin tech chさんのAWS SAA対策動画』](https://youtu.be/fsz6G45A4H4/)
→ 通勤時間や移動の際にラジオの要領で聴きまくってました。
※正直、この動画が無ければ落ちてたと思います。

<a id="#Chapter2"></a>
# 使用した教材
 - [Udemy講座① 『【2022年版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）』](https://www.udemy.com/course/aws-knan/)
 - [Maruchin tech ch『AWS ソリューションアーキテクト アソシエイト試験 対策動画』](https://youtu.be/fsz6G45A4H4/)
 
<a id="#reference"></a>
# 参考文献
- [AWS公式ドキュメント](https://docs.aws.amazon.com/)

<a id="#Chapter3"></a>
# 所感
前回の[AWS CLF対策記事](https://qiita.com/me_beginner/items/b01868f541d1d7b60dbf)と同じように試験勉強を進めていきました。
Laravel8 Localhostリダイレクトエラーの解決方法が意外と簡単だった件について

### エラー内容
![スクリーンショット 2022-02-25 13.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525372/9c8a35cf-b861-6482-a8db-00647deb3aad.png)

https://reffect.co.jp/laravel/laravel-multi-authentication-understand#i-9

Laravelでマルチ認証を追加しようと思い、上記の記事を見ながら
作成していたところ
登録ボタンを押すと、リダイレクトエラーになってしまいました。

初めは、ルーティングやコントローラーなどでコーディングミスをしているのかと
色々調べて、試してみたのですが
一向に解決せず、正直絶望していました。

### 解決方法
ある時、エラー画面に出ている「Cookieを消去してみてください」という言葉に
従ってCookieを削除してみました。
（以前、同じようなエラーでCookieを消去しても変化がなかったので、試してませんでした）

すると、なんとエラーが解決したのです。

### 考察
おそらく、今回の原因は一つのサーバーから複数アカウントを作成しようと
していたからなのかもしれない。
正直、ここは「たぶん」でしかない。

ただ、もう少し原因ドリブンで探ってみようと思います。

検索ワードとしては
・「ユーザー認証　複数　アカウント作成　エラー　Laravel」などかなと。

### 自戒を込めて
まず、エラーが出たらエラー文をしっかり読み
その通りに実行することを第一とする。
ケースコメントレポートのあるケースには、すべてのコメントが表示されません

スレッド形式で表示されるコメントがレポートでは全て表示されるわけでない。

多分、元のケース（親のケース）のコメントがレポートには出ないとのことかな。

残念がらSOQLで確認するしかないみたい。

feedItmeみたいですね。

[Cases with Case Comments report does not display all comments](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000FSKPN)
WSL2に切り替えたけど、Gitが「Permission denied (publickey).」する時

## 現象
WSL2のUbuntuからGithubにSSH接続を試みるも。。。？
```
$ ssh -T git@github.com
```
```
git@github.com: Permission denied (publickey).
```

Username/Password入力しても、
秘密鍵を作成して、githubに登録しても、
`~/.ssh/config`に接続情報設定しても、

```
git@github.com: Permission denied (publickey).
```

## 対象
👆WSL2を使用せずにDockerを使用していたが、 **WSL2に切り替えたユーザー**


## 解決策
WSL2のUbuntuで👇
```
$ git config --global credential.helper "/mnt/c/Program\ Files/Git/mingw64/libexec/git-core/git-credential-manager.exe"
```

## 参考
https://stackoverflow.com/questions/66503781/git-asks-for-password-to-push-on-wsl-2-ubuntu-but-not-on-windows-why-is-that
「Herokuで画像表示できない」を解決

# はじめに
　現在オリジナルアプリの開発中です。Heroku環境でアプリをアップロードしているのですが、assetsに配置した画像が表示されないという問題がありました。解決方法がわかったのでまとめておきます。


# 問題
　app/assets/images 配下に設置した画像が表示されない。（ローカル環境では表示されている）

ローカル環境では表示されているため、本番環境では追加の設定がいるのかもしれない。と思い調べると解決方法が出てきました。

# 解決方法
　解決方法は　image_tagのファイルの指定方法を修正することでした。


```qiita.rb
 <%= image_tag "/assets/top.png" ,class:"img-fluid" %>
```

image_tagに渡す画像のバスの指定方法を間違えていました。
この書き方では、ローカルだと表示されるのですが、本番環境だと表示されません。

以下に修正しました。

```qiita.rb
 <%= image_tag "top.png" ,class:"img-fluid" %>
```

結果無事に本番環境でも画像を表示する事ができました。


# 追記　以下の方法は間違いでした

最初自分が採用した以下の解決方法は間違いでした。（画像は表示されるけど推奨されない）
編集リクエストありがとうございます。

```production.rb
config.assets.compile = false
```

という記述があるので、

```production.rb
config.assets.compile = true
```

に変更するやり方です。
この方法でも画像を表示できるのですが、本番環境でのパフォーマンスに悪影響を及ぼすため推奨しないとのことです。

以下を参考にしました。
https://qiita.com/jnchito/items/3d225112a3ac95379b1d


# まとめ
　本番環境でのエラーだったため、最初何が原因か特定できなかったのですが、調べたらすぐに出てきました。

分からなくても焦らず、まずは冷静になる。→状況を整理する。→ググる

という習慣を身につけたいと思います。

また、解決方法にも様々あるので、精査できるようになりたいです。
CloudEndureメモ

# 前準備
まずcoudendureのアカウントを作成
https://console.cloudendure.com/#/register/register
vagrantとかで適当にサーバたてる
今回はcentos7で使用できるサーバの条件などは下記参照
https://docs.cloudendure.com/Content/Getting_Started_with_CloudEndure/Supported_Operating_Systems/Supported_Operating_Systems.htm

aws側でcloudendure用の
IAMユーザ、ポリシー、VPC、サブネット、ルートテーブル、IGW作成設定

ポリシー には画像のリンクのJSONを張り付け![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409164/2f0279af-6587-b405-90da-4d7a7e58d5dd.png)



ポリシーが作成できたら新規で作成したIAMユーザに既存のポリシーを直接アタッチ
アクセスキーなど払い出されるので CloudEndureのAWS CREDENTIALSに登録

# レプリケーション設定
ソースにはOther Infrastructure
ターゲットは今回はオレゴン
レプリケーションサーバの設定は要件に合わせて設定
今回はインスタンスタイプがt2.micro
VPCは前準備で作成したもの
他はデフォルト
![13-1024x559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409164/ee902177-54e8-0242-ac7a-b829e300eaa0.png)


# cloudendureのAgentをインストール
適当に作ったサーバにログインして
wgetとpythonのコマンドを打つ
![14-1024x754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409164/69c104cf-e4e3-68c7-091e-7aa9f11f56fa.png)


インストールが終わったらCloudEndureのMachinesタブにサーバが出てくる
![15-1024x302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409164/c1186854-34f4-af09-1c81-df0fa366c859.png)
AWS上にもレプリケーションサーバが立ち上がる


同期が終了したらBLUEPRINTの設定を行う
EC2の設定のようなものをcloudendure上で行う
ストレージタイプがデフォルトだとPIOPSなので注意
設定を保存後ランチターゲットマシーンからテストモードでサーバ起動


しばらくするとAWS上にコンバータサーバが立ち上がる
EC2インスタンスも自動で立ち上がる
コンバータサーバはEC2インスタンスが作成されると自動で削除される
teratermとかでSSHログインして確認
セキュリティグループを設定していない場合インバウンドルールからポート22、マイIPで設定しておく
![18-1024x537.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409164/59ea4d66-c608-dcf7-22e5-fbc2ad56553b.png)

# カットオーバー
テストが問題なければカットオーバーモードで起動
テストで作成されたEC2とコンバータサーバは自動削除される

cloudendure上でオプションから移行元サーバをリムーブすると
レプリケーションサーバも自動で削除される
【Swift】swiftlintでUIImageの「Force Unwrapping Violation」どうするか

# はじめに
Swiftlintの警告でコードが綺麗になっていくのは大変楽しく感謝しているのですが、UIImageの「Force Unwrapping Violation」の対応方法に少し悩みました。

# 環境
Xcode 13.2.1
Swift 5.5.2
SwiftLint 0.46.2

# 警告内容
コレデス
![スクリーンショット 2022-01-22 9.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/3fc2640a-5bb2-5e5c-183b-6a14b36650c5.png)

`強制アンラップは使用しない方がいい`ということですね。

丁寧に

```swift
guard let image = UIIMage(systemName: "gearshape") else { return }
```

としても良いのですが、都度やるのは大変なのでどうしようかと

# 対応策
最初に思いついたのが、UIImageのExtensionで
swiftlint:disable　にする方法です。
(微妙ですね。。。）

```swift

extension UIImage {
    // swiftlint:disable force_unwrapping
    static let gearshape = UIImage(systemName: "gearshape")!
    // swiftlint:enable force_unwrapping
}

```

そんなことせずに
こんな形にした方が良いのかも

```swift
extension UIImage {
    static func named(_ name: String) -> UIImage {
        if let image = UIImage(systemName: name) {
            return image
        } else {
            fatalError("Could not initialize \(UIImage.self) named \(name).")
        }
    }
}
```

`UIImage.named("gearshape")`これで警告されずに使えます👏

# 感想
これでほんとに良いのだろう。
別に大した問題でもないので、無視して良いことではありますが。。。

# 参考
https://realm.github.io/SwiftLint/force_unwrapping.html
Node.jsの通常関数のthisに関して

## 初めに
普段Node.jsを使用しており、通常関数のthisの基本的な仕様を勉強したためアウトプットのために記事を投稿する。

## 開発環境
■ Node.jsのバージョン
v11.1.0
■ 使用OS
Amazon Lunux 2

## ① 基本的な例

```js
const o = {
  name: 'taro',
  introduce() { return `My name is ${this.name}`; }
}

console.log(o); 
console.log(o.introduce()); 
```

上記コードでは、oという定数にオブジェクトが格納されている。
以下は参考文献[1]より抽出したもの。

> メソッドが呼び出されるときthisは、そのメソッドがプロパティとなっているオブジェクトを指しています。

こちらを拝借すると、ここで指しているメソッドとは以下にあたる。
```js
introduce()
```


そして、メソッドがプロパティとなっているオブジェクトとは定数oである。
そのため、thisはoをバインドするため以下に置き換えられる。

```
this.name
↓
o.name
```

よって出力結果は以下となる。
```
{ name: 'taro', introduce: [Function: introduce] }
My name is taro
```

## ②オブジェクトのプロパティを代入した例

```js
const o = {
  name: 'taro',
  introduce() { return `My name is ${this.name}`; }
}
const introduce= o.introduce;
console.log(introduce=== o.introduce);
console.log(introduce()); 
console.log(o.introduce()); 
```

今回は、オブジェクトのプロパティを定数introduceに代入している。
出力結果は以下となる。

```
true
My name is undefined
My name is taro
```

代入した定数では、結果がundefinedとなっている。
これは、プロパティとなっているオブジェクトを特定できないため、thisがundefinedになっている。

## ③ 関数が入れ子になっている場合

```js
const o = {
  name: 'taro',
  external() {
    console.log(this.name);
    function internal() {
      console.log(this.name);
    }
    internal();
  },
};

o.external();
```

出力結果
```
taro
undefined
```

この場合、externalメソッドのthisは定数oをバインドしているが、internal関数内のthisは何もバインドしていない。

以下は参考文献[2]より抽出したもの。

> ほとんどの場合、this の値はどのように関数が呼ばれたかによって決定されます (実行時結合)。これは実行時に代入によって設定することはできず、関数が呼び出されるたびに異なる可能性があります。

通常の関数では呼び出し方によってthisのバインド先が変わることが分かる。
internal関数の呼び出しはexternalメソッドで行っているため、thisがundefinedとなっている。

この問題は以下のような解決策がある。

```js
const o = {
  name: 'taro',
  external () {
    let self = this;
    console.log(this.name);
    function internal() {
      console.log(self.name);
    }
    internal();
  },
};

o.external();
```

externalメソッドのthisをselfという変数に代入して、undefinedとなっていたinternal関数内で使用している。
参考文献を確認すると、bind() メソッドやアロー関数等でthisのバインド先を変更できるようだが、上記コードのような解決方法も使用できる。

## 参考文献
[1] [初めてのJavaScript 第3版――ES2015以降の最新ウェブ開発](https://www.oreilly.co.jp/books/9784873117836/)
[2] [MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/this)
Python pytestでcaplogがログをキャッチできないとき

# 結論

:::note info
loggersのconfigでpropagateを**True**にする
:::

```python:dictConfigの例
{
    'loggers': {
        'logger_name': {
            'level': 'DEBUG',
            'handlers': [],
            'propagate': True  # ここです
        }
    }
}
```


# 参考

https://docs.python.org/ja/3/library/logging.config.html#module-logging.config

> loggers - 対応する値は辞書で、そのそれぞれのキーがロガー名になり、それぞれの値が対応する Logger インスタンスをどのように環境設定するかを記述する辞書になります。
>環境設定辞書は、以下のキーを検索されます:
> propagate (任意)。ロガーの伝播の設定です。