OmniAICreator/Qiita-1.07M huggingface dataset:
electron-forgeのビルドプロセスに割り込む

## はじめに

この記事は、electron-forgeのビルドプロセスに、hooksで割り込む方法を記録、共有するためのものです。

electron-forgeには、Electronアプリケーションのビルドに割り込む方法が用意されています。これがhooksです。この割り込み処理をつかえば、任意のnodeモジュールや静的ファイルをElectronアプリケーションパッケージに挿入できます。

electron-forgeには、ビルドプロセスにwebpackを使うテンプレートがあります。しかしnodeモジュールの中には、webpackでバンドルされることを想定していないものがあります。こうしたwebpackと相性の悪いパッケージはwebpackの対象から外し、割り込み処理でパッケージにコピーします。

### 想定する読者

この記事はすでにElectronで開発をしているユーザーに向けて書かれています。そのため、Electron自体の解説やインストール、開発環境構築に関する内容は取り扱いません。

### 想定する環境

- node.js : 14.15.0
- yarn : 1.22.5
- electron : 11.1.1
- electron-forge : 6.0.0-beta.54

バージョンが異なる場合、この記事の内容はそのまま適用できない場合があります。お手元の環境のバージョンを確かめてからお読みください。

## electron-forgeの構成

electron-forgeは以下のパッケージで構成されています。

+ Electron
+ [electron-packager](https://github.com/electron/electron-packager) : 指定されたプラットフォームごとにElectronアプリケーションをパッケージングする
+ [electron-rebuild](https://github.com/electron/electron-rebuild) : native nodeモジュールをElectronのバージョンに合わせてリビルドする

### hooks

electron-forgeの[hooks](https://www.electronforge.io/configuration#hooks)は、electron-packagerのビルドプロセス割り込み処理ラッパーです。hooksを設定すると、ビルドプロセスの任意のタイミングでnode.jsのスクリプトを呼び出せます。

hooksの設定は`package.json`のconfig.forgeオブジェクト内か、config.forgeに設定したjsファイルに記述します。この記事では`config.forge.js`というファイルで設定します。

*▼package.json*

```json
{
  "config": {
    "forge": "./config.forge.js"
  }
}
```


*▼config.forge.js*

```js
module.exports = {
  packagerConfig: {},
  hooks: {
    packageAfterCopy: async (forgeOption, resourcePath, electronVersion, platform, arch) => {
       ...ここに処理を書く...
    }
  ...
}
```

electron-forgeのhooks関数はasyncでなければいけません。

### packageAfterCopyにhookを設定する

hooksに設定する関数は、node.js上で実行されます。そのため、必要に応じてnodeモジュールを導入できます。

*▼config.forge.js*

```js
const path = require("path");
const cpx = require("cpx");

module.exports = {
  hooks: {
    packageAfterCopy: async (forgeOption, resourcePath, electronVersion, platform, arch) => {
      //pathモジュールを使ったパス解決
      const resourceModulePath = path.join(resourcePath, "node_modules");
      //cpxモジュールを使って、nodeモジュールをリソースディレクトリにコピー
      cpx.copySync("./node_modules/iconv/**/*",  path.join(resourceModulePath, "iconv"));
    },
  },
```

モジュールの導入は`package.json`では難しいため、hooksを利用する場合は設定をjsファイルに切り分けるべきです。

packageAfterCopyの第二引数にはパス`./out/{アプリケーション名}/resources/app`が渡されます。このディレクトリはElectronアプリケーションから呼び出せますので、静的ファイルが格納できます。また、`./out/{アプリケーション名}/resources/app/node_modules`にnodeモジュールを格納すると、Electron内のnode.jsがモジュールとして認識し、メインプロセスから呼び出せます。

以上、ありがとうございました。
【AutoHotKey】PowerPointのショートカットを作りたい！

#注意
この記事はMS Office PowerPointの既存機能では賄えないショートカットをAutoHotKeyを用いて作ろうという趣旨になっています。

PowerPointをいじっている時にAltを多用するような、"変態に片足突っ込んでいる方"を対象とした内容となっており、決してCtrl+A,S,C,Vとかを使える"正常な人"は対象としていませんのでご注意ください。

#AutoHotKeyとは？
簡潔に言うとキーボード改造ツールで、キーにいろんな役割を持たせることができます。
ゲーミングキーボードのマクロ機能みたいなものですね(ゲームやらないので詳しく知りませんが)。

例えば私のPCはAppsKey + H,J,K,Lに方向キーが割り当てられており、いちいち方向キーに指を伸ばさなくても上下左右への移動ができるようになっています。

AutoHotKeyについては先人が分かりやすく説明されているので、以下ご参照ください。

[Windows 10] 矢印キーに指を伸ばすエンジニアはザコ！とバカにされた（Change KeyとAutoHotkeyの導入）
https://qiita.com/riekure/items/49b941fa5159f9948313

#PowerPointのショートカットキーを作る
扨、今回は以下3つのショートカットキーを作ります。

・無変換 + N：「図形内でテキストを折り返す」のOn/Off
・無変換 + M：枠線の実線/破線の変更
・無変換 + < >：枠線を細くする/太くする

因みに2個目と3個目は既存ショートカット(Alt + H + S + O + S/W)がありますが、よく使うのでショートカットが欲しいと思った次第。

それではどうぞ

```{AutoHotKey.ahk}
#SingleInstance, force
#NoEnv
SetTitleMatchMode 1
DetectHiddenWindows, On
SetBatchLines -1
SetControlDelay, -1
SetWinDelay, -1
SetMouseDelay, -1
SendMode Input
ListLines Off

vk1D & N::
WinActivate, ahk_class screenClass ahk_exe POWERPNT.EXE
Try
	{
	Tooltip
	ppt := ComObjActive("PowerPoint.Application")
	SetFormat, FloatFast, 0.2
	Current_WordWrap := ppt.ActiveWindow.Selection.ShapeRange.TextFrame2.WordWrap
	if (Current_WordWrap = 0){
		ppt.ActiveWindow.Selection.ShapeRange.TextFrame2.WordWrap := -1
	}
	else if (Current_WordWrap = -1){
		ppt.ActiveWindow.Selection.ShapeRange.TextFrame2.WordWrap := 0
	}

	}
Return

vk1D & M::
WinActivate, ahk_class screenClass ahk_exe POWERPNT.EXE
Try
	{
	Tooltip
	ppt := ComObjActive("PowerPoint.Application")
	SetFormat, FloatFast, 0.2
	Current_DashStyle := ppt.ActiveWindow.Selection.ShapeRange.Line.DashStyle
	if (Current_DashStyle = 1){
		ppt.ActiveWindow.Selection.ShapeRange.Line.DashStyle := 4
	}
	else if (Current_DashStyle = 4){
		ppt.ActiveWindow.Selection.ShapeRange.Line.DashStyle := 1
	}

	}
Return

vk1D & ,::
WinActivate, ahk_class screenClass ahk_exe POWERPNT.EXE
Try
	{
	Tooltip
	ppt := ComObjActive("PowerPoint.Application")
	SetFormat, FloatFast, 0.2
	Current_Thickness := ppt.ActiveWindow.Selection.ShapeRange.Line.Weight
	ppt.ActiveWindow.Selection.ShapeRange.Line.Weight:= Current_Thickness - 0.25
	Tooltip, % "Width: " Current_Thickness - 0.25
	SetTimer, RemoveToolTip, 1000
	}
Return


vk1D & .::
WinActivate, ahk_class screenClass ahk_exe POWERPNT.EXE
Try
	{
	Tooltip
	ppt := ComObjActive("PowerPoint.Application")
	SetFormat, FloatFast, 0.2
	Current_Thickness := ppt.ActiveWindow.Selection.ShapeRange.Line.Weight
	ppt.ActiveWindow.Selection.ShapeRange.Line.Weight:= Current_Thickness + 0.25
	Tooltip, % "Width: " Current_Thickness + 0.25
	SetTimer, RemoveToolTip, 1000
	}
Return


```

#結論
これであなたも変態の仲間入り
[AtCoder] ABC 201 C - Secret Number

https://atcoder.jp/contests/abc201/tasks/abc201_c

昨日のABC 201のC問題です。
解説では0000から9999までループで回して探索してましたが、自分はそれが思いつかなかった。。。
それがいちばん簡単なのに、、不覚です。
自分は"o"と"?"の数に応じて暗証番号を計算しました。

"o"が0個、"?"が0個は、$A0 = 0$ 通り
"o"が1個、"?"が0個は、$A1 = 1$ 通り
"o"が2個、"?"が0個は、$A2 = 2^4 - {}_2 C_1 * A1 = 14$ 通り
"o"が3個、"?"が0個は、$A3 = 3^4 - {}_3 C_1 * A1 - {}_3 C_2 * A2 = 36$ 通り
"o"が4個、"?"が0個は、$A4 = 4! = 24$ 通り

ここで、"o"が2個、"?"が2個の場合を考えます。
この時、"o"が2個で"?"の数字から0個1個2個選ばれる場合があります。
したがって、
${}_2 C_0 * A2 + {}_2 C_1 * A3 + {}_2 C_2 * A4$
となります。
これを他の"o"の個数についても適用させると、

"o"が0個、"?"がn個は、$B0 = n^4$ 通り(これは特別)
"o"が1個、"?"がn個は、$B1 = {}_n C_0 * A1 + {}_n C_1 * A2 + {}_n C_2 * A3 + {}_n C_3 * A4$ 通り
"o"が2個、"?"がn個は、$B2 = {}_n C_0 * A2 + {}_n C_1 * A3 + {}_n C_2 * A4$ 通り
"o"が3個、"?"がn個は、$B3 = {}_n C_0 * A3 + {}_n C_1 * A4$ 通り
"o"が4個、"?"がn個は、$B4 = {}_n C_0 * A4$ 通り

ソースコードに落とし込んだのが以下です。
言語はC++(GCC 9.2.1)でAtCoderのコードテストで確認しています。

```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  int P = 0, Q = 0, result = 0;
  int A1, A2, A3, A4;

  cin >> S;
  
  for (int i = 0; i < 10; i++) {
    if (S[i] == 'o') {
      P++;
    } else if (S[i] == '?') {
      Q++;
    }
  }

  A1 = 1;
  A2 = 14;
  A3 = 36;
  A4 = 24;

  if (P == 0) {
    result = Q*Q*Q*Q;
  } else if (P == 1) {
    result = A1 + Q*A2 + Q*(Q-1)*A3/2 + Q*(Q-1)*(Q-2)*A4/6;
  } else if (P == 2) {
    result = A2 + Q*A3 + Q*(Q-1)*A4/2;
  } else if (P == 3) {
    result = A3 + Q*A4;
  } else if (P == 4) {
    result = A4;
  }

  cout << result << endl;
}
```
Ruby on Railsのform_withでのインスタンス変数(model)とname属性の関係

※プログラミング学習中の私がアップロードしてます。理解が浅いです。
この記事は厳密な仕様に関するものではなく、考え方理解のまとめとして受け取ってください。

Ruby on Railsのform_withとは
form_withとは、Railでフォームタグを簡単に作成するためのヘルパーです。使い方をマスターすれば、コーディングがずっと楽になります。RailsでWebアプリケーションを作成する際に、ほぼ必須のヘルパーです。
**input 要素 では， フォームのデータが送信されるときに，name 属性 の値が付加されており，対象とする要素のデータに簡単にアクセスできます。**

```rb：rails
<%= form_with model: @user do |f| %>
  <%= f.label :name, '名前' %>
  <%= f.text_field :name %>
  <%= f.submit "送信" %>
<% end %>
```

```rb:生成タグ
<form action="/users" accept-charset="UTF-8" data-remote="true" method="post">
  <label for="user_name">名前</label>
  <input type="text" name="user[name]" id="user_name" />
  <input type="submit" name="commit" value="送信" data-disable-with="送信" />
</form>
```
name=>user_name
name=>user[name]

###モデル名のuserが追加されます
Rudi-NXにnvidia-docker2をインストールする

## 概要
[Connect Tech社のRudi-NX](https://connecttech.com/product/rudi-nx-embedded-system-nvidia-jetson-xavier-nx/)は，Jetson Xavier NXを搭載した組み込み用ボードです．豊富な端子類と何よりファンレス構造が特徴の製品ですね．これでにDockerを入れてROSを動かそうと思ったときに，rvizがうまく起動しませんでした．諸々調べたところ，JetsonのcudaにDocker内からアクセスする際にはnvidia-docker2を使うのが主流らしいのですが，なぜかRudi-NXにプリインストールされているJetpackにはこれが入っていなかったので頑張ってインストールしてみよう，という記事です．

## 問題点
通常のJetsonシリーズであれば，[公式サイト](https://developer.nvidia.com/embedded/jetpack)から自前でJetpackのイメージを落としてきてMicro SDに入れるわけですが，この場合は特別な手順を踏むことなく自動的にnvidia-docker2がインストールされた環境が出来上がります．

Rudi-NXの場合は工場出荷状態でOSが入っていますが，これにnvidia-docker2はインストールされていませんでした．更に調べたところ，Rudi-NXの場合は工場出荷時点でaptのsourceslistが変更されているため，`apt install nvidia-docker2`してもパッケージが見つからず自前でインストールもできません．そこで，以下のように修正し，通常のJetpackと同じものをインストールできるようにします．

## 手順
まずは設定ファイルを開きます．

```
sudo vim /etc/apt/sources.list.d/nvidia-l4t-apt-source.list
```

続いて，中身を以下の状態に変更し保存します．

```/etc/apt/sources.list.d/nvidia-l4t-apt-source.list
deb https://repo.download.nvidia.com/jetson/common r32.4 main 
deb https://repo.download.nvidia.com/jetson/t194 r32.4 main
```
出荷状態ではこれらがコメントアウトされていたので，それを解除しました．


次にこれらの認証キーを取得します．

```
sudo apt-key adv --fetch-key http://repo.download.nvidia.com/jetson/jetson-ota-public.asc
```

最後にupdateをかければ，aptでnvidi-docker2をインストールできます．

```
sudo apt update
sudo apt install nvidia-docker2
```

これでdocker内からcudaコアにアクセスするアプリケーションが走ります．お疲れ様でした．

## 参考

sourcelistの編集と認証キーの取得についてはここを参考にしました．
https://forums.balena.io/t/getting-linux-for-tegra-into-a-container-on-balena-os/179421/18
spigotプラグインを作る (1)

すごいお久しぶりです。beatbox4108です。
今回からは、spigotプラグインの作り方をやっていきたいと思います。
#まずspigotって?
**spigot**は、minecraftのサーバーです。
もともとは、**bukkit**というものが主流でしたが、現在は**bukkit**との互換性がある**spigot**が主流です。
**bukkit**や**spigot**はプラグインというものを導入して、minecraftの機能を追加したり変更したりできます。
###プラグインでできること/できないこと
| 機能 | できるかどうか |
|:-:|:-:|
| UIの追加 |  X |
| ブロックの追加 | X |
| AIの変更 | O |
| UIの表示、機能追加 | O |
| Javaとの連携 | O |
上に挙げたのはほんの少しで、他にもいろいろな機能があります。
~~*思いつかなかったなんて言えない*~~
#実際にやってみる
###前提条件
IntelliJ IDEAがインストールされている。
JDKがインストールされている
###筆者の環境
OS---linux mint 20.1 64bit
Java---openjdk 11.0.9.1/OpenJDK Runtime Environment (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04)/OpenJDK 64-Bit Server VM (build 11.0.9.1+1-Ubuntu-0ubuntu1.20.04, mixed mode)
###IntelliJ IDEA のプラグインを導入
**IntelliJの、Minecraftプラグインを導入します。もう入っているなら、適当に読み飛ばしてください**
IntelliJを起動したら、下の画像に示した四角の部分=プラグインをクリックしてください。
![プラグイン追加1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/4419fd15-7cdd-9966-8ec9-06086cd00916.png)
次に、赤の検索バーに`minecraft`と入力し、緑の部分が`Minecraft Dev`となっているのを確認したら、青のインストールを押してください。次に出てくるダイアログでは、`同意します`を押してください
![プラグイン追加2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/1cc543b0-3dd8-8347-eaca-7503ed86a29e.png)
インストールが完了したら、サイドバーのプロジェクト(赤で示した部分)を押して、新規プロジェクト(青で示した部分)を押してください。
![プラグイン追加3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/72d60aa6-0dc2-b8c3-d320-f24ea8ce6f06.png)
赤枠で示した`Minecraft`を押し、青枠で示した`SpigotPlugin`を押して、次へ進みます。
![プラグイン追加4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/64d32d8a-5626-f449-dde8-5c16ade37939.png)
赤枠を自由に設定し、青枠を`Maven`から`Gradle`に変更します。
![プラグイン追加5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/954609fe-cc29-7d85-a451-ebe8170025fc.png)
画面が変わったら、今度は好きなように設定してください。
![プラグイン追加6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/ab7c4a1e-97ee-b799-2b7e-018f42d6964d.png)
設定項目と、意味、内容を表に示しました。

| 項目 | 内容、意味 |
|:-:|:-:|
| Plugin Name | その名の通り、プラグインの名前です。半角英数字のみでお願いします。 |
| Main Class Name | メインクラスの名前を設定します。よくドメイン名を反対にした名前が用いられます。例:`com.beatbox4108.tutorial` |
| MinecraftVersion | 開発するバージョンを指定します。ここでは1.16.5で進めます。 |
| Description | 名前の通り説明です。 |
| Authors | 作成者です。複数人いる場合は、`,`で区切ります。 |
| Website | サイトのURLです。多分任意 |
| Log Prefix | ログに使う接頭辞です。空にすると、プラグイン名が使われるようです。 |
| Load at | プラグインが読み込まれるタイミングを設定します。Post Worldは、ワールド読み込み後、Startupは、サーバー起動後=ワールド読み込み前です。 |
| Load Before | プラグイン名を指定します。指定したプラグインより先に読み込むように設定できます。複数ある場合は`,`で区切ります。 |
| Depend | 依存するプラグインを指定します。ここで指定したプラグインはこのプラグインより先に読み込まれます。 |
| Soft Depend | 依存するプラグインを指定します。Dependとの違いは、指定したプラグインが導入されていなくても、エラーが発生しません。 |
![プラグイン追加7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/4201c8da-0e96-34c4-0e2d-5ead53b58299.png)
赤枠で示したところを入力します。好きなように入れてください。青枠で示したところを押せば、保存場所を選択できます。
#完了です!
![プラグイン追加8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672153/8cdf2df1-27d6-130d-988e-1f9437981022.png)
お疲れ様です。次回はいよいよコードを書いていきたいと思います。


[目次](https://qiita.com/beatbox4108/items/47d5217de8a04e089d20/)
~~[前回](#)~~  今回  ~~[次回](#)~~
最新バージョンのJavaをmacにインストールするところでハマったのでメモ

最新バージョンのJDKをmacにインストールする流れでハマったので忘れないようにメモ

#環境
Mac Os catalina 10.15.7


#概要

※調べるとcaskを使う記事が複数でてきましたが使わなくてよかったので以下で実施

```
% brew install java

==> Downloading https://ghcr.io/v2/homebrew/core/openjdk/manifests/15.0.2
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/openjdk/blobs/sha256:fca110fb6caad1228156b587a3ca9fa9ab5a
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:fca110fb6caad1228156b
######################################################################## 100.0%
==> Pouring openjdk--15.0.2.catalina.bottle.tar.gz
==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

openjdk is keg-only, which means it was not symlinked into /usr/local,
because macOS provides similar software and installing this software in
parallel can cause all kinds of trouble.

If you need to have openjdk first in your PATH, run:
  echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc

For compilers to find openjdk you may need to set:
  export CPPFLAGS="-I/usr/local/opt/openjdk/include"

==> Summary
🍺  /usr/local/Cellar/openjdk/15.0.2: 614 files, 324.9MB

```


よく見ると上記の文章内に全部記載されているんですが、、、
インストールされたか確認してみると以下

```
% java --version
No Java runtime present, requesting install.

```

どないなっとんねんと思いましたが、シンボリックリンクを貼って解消（インストール時のログにも出てますね）

```
% sudo ln -sfn $(brew --prefix)/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
```

再度確認すると問題なくjavaのバージョンが確認できました。

```
%  java --version
openjdk 15.0.2 2021-01-19
OpenJDK Runtime Environment (build 15.0.2+7)
OpenJDK 64-Bit Server VM (build 15.0.2+7, mixed mode, sharing)
```
Host 'IPアドレス' is not allowed to connect to this MySQL serverの対処

DockerfileにImageMagicをインストールする記述を入れてコンテナイメージをビルドしました。
そこでDocker-composeを再起動してリロードをしてみた所、以下のエラーが出てきてしまいました。

```
Host 'IPアドレス' is not allowed to connect to this MySQL server
```
そこで色々と考えてみたのですが、原因はおそらくいままでDocker、Docker−composeを使ってきた時に出てきたキャッシュが影響してしまっているのではないかと考えました。
幸いdocker-compose は起動することができていたので、以下のコマンドをやってみました。

```
docker-compose down --rmi all --volumes --remove-orphans
```

というコマンドをやってみて、コンテナイメージとコンテナとネットワークなどをすべて削除しました。
そして、もう一度

```
docker-compose build
```

をしてみました。
そうしたら無事起動しました。

キャッシュが影響することってよくあるんですね。
知らなかったです。
指摘や間違っているところがありましたらご指摘お願いします。

#出典

https://qiita.com/suin/items/19d65e191b96a0079417
VBAをこれから始める方へ

####VBA【 Visual Basic for Applications 】 とは
Microsoft Officeに含まれるアプリケーションソフトの拡張機能で、利用者が簡易なプログラムを記述して実行することで複雑な処理の自動化などを行なうことができるものです。VBAもプログラミング言語のひとつになります。

###[VBAの始め方](https://www.sejuku.net/blog/93012)

##マクロとは
VBAで作成した便利な道具のことで、作成し記録しておくことで何度でも使用することができます。

##プロシージャとは
VBAでは「Sub 〇〇() ~ End Sub」で囲まれた範囲をプロシージャと呼びます。マクロという道具に付ける名前のことだと思ってください。

```
Sub プロシージャ名()
   '処理の内容
End Sub
```

##functionとは
VBAの関数のように自分で処理内容を定義して関数を作ることができます。function関数とは処理のひとかたまりのことです。Subプロシージャが自動車だとすればfunctionプロシージャとはカーナビのように取り付けられた道具のことだとイメージしてもらえれば分かりやすいかもしれません。

```
Function プロシージャ名()
    '処理の内容
End Function
```

```:functionの呼び出し方
Call Functionプロシージャ名
```

```:functionの使用例
Sub macro1()
    Call func1
End Sub

Function func1() As String
    MsgBox "Hello VBA!"
End Function
```

上記のコードでfunctionに書かれた処理を実行できたかと思います。

##PublicとPrivateの違い
Privateで宣言された変数は、宣言したモジュールの中でのみ、どこからでも使えます。
これに対し、Publicで宣言された変数は、プロジェクト全体の中で、どこからでも使えます。

###[モジュールとは？](https://wa3.i-3-i.info/word12243.html)

##変数とは
変数といろんなものを入れたり出したりして使用する箱のことです。
VBAでは変数を宣言する際に「Dim 〇〇」と書くことでセットすることができます。
![hennsuu_0_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/8729dce5-2d12-7f8e-7a8b-d1b4f0466bb4.png)

##オブジェクトとは
私たちは現実で見えるものを**「もの」**として認識することができます。プログラムの世界でもパソコンに命令を出すためには、操作する**「もの」**を教えてあげないといけません。この「もの」をパソコンに教えることを**オブジェクト化**と言います。
![excel-vba-object4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/d8cf09d7-2e52-6424-542d-aabdfb3f2582.png)

###マクロが保存できるファイルの形式について
通常エクセルデータを保存する場合は「エクセル名.xlsx」と拡張子が**xlsx**となっていますが、このままではマクロを使用できないため、拡張子を**xlsm**としてあげてください。
＊拡張子とはファイルが持つ属性のこと.txtでテキスト属性といったイメージです。
![スクリーンショット (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/0098e52d-0f5f-783d-3880-5c92e02b533a.png)


さて、ではさっそくVBAでいろいろなコードを書いてみましょう！
・[VBAの基本操作(セル)](https://qiita.com/borubo/items/060656df209841eae246)
・[VBAの基本操作(ワークシート)](https://qiita.com/borubo/items/2f9934ede516d917ec23)
・[VBAの基本操作(ワークブック)](https://qiita.com/borubo/items/d0035f9579ac7269a67e)
・[VBAの基本操作(プログラム制御)](https://qiita.com/borubo/items/1f10dea59ad0fbda49e9)
・[VBAの基本操作(関数)](https://qiita.com/borubo/items/d4b7ad085dbd53408183)
・[VBAの基本操作(ファイル)](https://qiita.com/borubo/items/3abc65e025d936e66713)
・[VBAの基本操作(応用1)](https://qiita.com/borubo/items/ab773f6d738258d4fe87)
・[VBAの基本操作(応用2)](https://qiita.com/borubo/items/709a06df3518efcaf13d)
[AtCoder] ABC 173 C - H and V

最近競技プログラミングのAtCoderを始めました。
まだまだ初心者です。
問題の点数的に300まではなんとか解けるのですが、400を越えてくると途端にわからなくなる。
今はとにかく過去問を解いて、解法を体に覚えさせています。
解いた記録を残していこうと、今後Qiitaに書いていこうと思います。
初回はこちらの問題。

https://atcoder.jp/contests/abc173/tasks/abc173_c

最大でも6行×6列、それぞれの行と列に対して選択か未選択の2通りとして2^12=4096通り。全探索しても問題ないと考えました。
再帰関数を作って、1行もしく1列を選んで選択か未選択で次の行か列に再帰します。
全ての行と列が終わったら黒いマスを数えてKと等しいなら数え上げます。
自分はbitsetを使い、黒マスなら1、それ以外なら0として計算しました。

https://atcoder.jp/contests/apg4b/tasks/APG4b_ac

黒マスを数え上げるのにbitsetならcount()で一発なので楽です。
自分のソースコードは以下となります。
言語はC++(GCC 9.2.1)でAtCoderのコードテストで確認しています。

```c++
#include <bits/stdc++.h>
using namespace std;

int H, W, K;

int count(bitset<36> c, int h, int w) {
  int result = 0;
  if (h == H && w == W) {
    result = c.count() == K ? 1 : 0;
  } else if (h == H) {
    result += count(c, h, w+1);
    for (int i = 0; i < H; i++) {
      c.reset(i * W  + w);
    }
    result += count(c, h, w+1);
  } else {
    result += count(c, h+1, w);
    for (int i = 0; i < W; i++) {
      c.reset(h * W + i);
    }
    result += count(c, h+1, w);
  }
  
  return result;
}

int main() {
  cin >> H >> W >> K;
  string s;
  bitset<36> c;
  for (int i = 0; i < H; i++) {
    cin >> s;
    for (int j = 0; j < W; j++) {
      if (s[j] == '#') c.set(i * W + j);
    }
  }

  cout << count(c, 0, 0) << endl;
}
```
VisualStudioCodeの少しのtips (コードリーディング)

# メソッド一覧を表示する

`⌘ + Shift + o`


<img width="480" alt="スクリーンショット 2020-08-02 22.38.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152284/1efb2e62-1ae5-86f3-8a50-14d136d8bf14.png">

# ドキュメントを表示
デフォルトではマウスオーバーで表示するが、マウスを触りたくないとき。

`⌘ + k + ⌘ + i`



# ブレークポイント

- F9：ブレークポイント
- F5:デバッグ実行

Dockerで作った新しい環境へRemote-Containerを使った際、".run"などの拡張機能がないため備え付けのキーマップを覚える必要がある。
【git/github】GitコマンドやGithubの基礎用語まとめ

GitコマンドやGithubについて、よく使われるらしい用語をまとめます。
適宜追記したり、今後別途切り出して記事にするものもあるかもしれません。

## リポジトリ -Repository
データを管理する場所。
2種類のリポジトリが存在する。

ローカルリポジトリ: 自分のPC上（ローカル環境）に置かれるリポジトリ。
リモートリポジトリ: 外部サーバーやネットワーク上に置かれるリポジトリ。

## クローン -Clone
ローカル環境で使用するためにリモートリポジトリのコピーを作成する機能。

## ブランチ -Branch
主流（マスターブランチと呼ぶ）から分岐させ、並行作業を行うため機能ごとに作成する。
分岐させたブランチでの修正内容は他のブランチの影響を受けない。

## コミット -Commit
おこなった作業内容をローカルリポジトリに反映する操作。

## プッシュ -Push
コミットされた内容をリモートリポジトリに反映する操作。

## プル -Pull
リモートリポジトリの内容をローカルリポジトリに反映する操作。

## プルリクエスト（プルリク） -Pull request
Githubに備わっているレビュー機能。
おこなった作業内容を基のブランチに取り込む際に、第三者に内容を確認してもらう。

## マージ -Merge
異なるブランチの作業内容を反映すること。マージ先とマージ元双方に履歴が残る。

## コンフリクト -Conflict
マージした際に、同じファイルの同じ箇所に対して変更がなされていると、変更同士が衝突する。
自動で反映されないため、手動で修正が必要になる。


## 参考にした資料
[エンジニアhub](https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000#Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E6%BA%96%E5%82%99)
【Vue】VueRouterでページ遷移時に、URL履歴を残さない方法

##はじめに
VueRouterでページ遷移時に、URL履歴が残ってしまうことで少し困ってしまったのでメモを残します。

##経緯

先日、Vueを使ってSPAで開発中にページからページCに遷移させる間にローディングページBを挟んで、ローディングページBでいろいろ処理をさせる形で開発をしていました。

その中でページCで、**ブラウザバックしたらローディングページBに遷移できてしまう**と気付きました。
さらに、**ブラウザバック時はクエリパラメータを維持しているURLのままブラウザバック**できてしまう...

##方法

結論：VueRouterのpushではなくreplaceを使用すること

```Example.vue
<template>
  ...
</template>

<script>
  ...
  push () {
    // VueRouterのHistoryに追加して遷移する
    this.$router.push('Next')
  },
  replace () {
    // VueRouterのHistoryに追加しないまま遷移する
    this.$router.replace('Next')
  }
  ...
</script>
```

##参照

https://router.vuejs.org/ja/guide/essentials/navigation.html
【git/github】SSHベースでの認証設定について

昨年12月、Github公式ブログより以下の通達がされました。（要約）

* 2021年8月13日以降、GitHub.comでGit操作を認証する際にアカウントパスワードを受け付けなくなる
* 認証には、tokenやsshベースによる認証が必要となる

つまり、パスワードベースからSSHベースへ認証ベースを変更する必要があり、
変更していないと・・・

* コマンドラインでのgitアクセス
* パスワードを利用した、githubリポジトリへのアクセス

が使用できなくなってしまうそうです。


https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/

方法自体は各所に書かれており、何番煎じかもよくわからないものになりますが
以下、私が行った設定をメモ的に残します。
（*Mac環境にてiTerm2を使用）

# 1. ローカルにSSHキーを作成する


## SSHキーを生成
```zsh
 ssh-keygen -t ed25519 -C "<Githubに登録しているemail>"
```
ターミナルを開き、上記のコードを入力。
SSHキーがユーザーディレクトリ直下の隠しフォルダ内に作成される。
（~/.ssh/id_ed25519とid_ed25519.pub）

.pubは公開鍵。付いていない方は秘密鍵。**もちろん他人に共有してはいけません**


## ssh-agentを起動させる

```zsh
eval "$(ssh-agent -s)"
```

## ~/.ssh/configを編集する

```zsh
Host *
  AddKeysToAgent yes
  UseKeyChain yes
  Identifyfile ~/.ssh/id_ed25519
```
をファイル内に追記。

## SSHキーをssh-agentに登録する

```zsh
ssh-add -K ~/.ssh/id_ed25519
```

Identity added: が出たら終了。

# 2. SSHキー（公開鍵）をGithubに登録

## 公開鍵をクリップボードにコピー

```zsh
pbcopy <~/.ssh/id_ed25519.pub
```

Github上でSettings -> SSH and GPG keys -> New SSH key -> 上記でコピーした公開鍵をペーストして
"Add SSH key"をクリックして、終了。
CircleCIのSlack orb 4.4の一番シンプルな使い方


以下の記事にて、AndroidアプリのCIにCircleCIを使った例の記事を書きました。
https://qiita.com/kasa_le/items/fab191326b42f5adb82d

[Slack orb](https://circleci.com/developer/orbs/orb/circleci/slack)がかなりバージョンアップしていて変わっていたので対応してみました。

# 環境など
ビルドしているのはAndroidアプリですが、Slack orbを使っている部分はどんなプロジェクトでも参考になるかと思います。

| ツールなど | バージョンなど |
|:--|:--|
|Circle CI |2.0|
|Docker size | Medium|
|Slack orb| 4.4|


## 注意事項
本記事の内容は、Slack Orb 4.4で動きます。
4.1や4.1.1では動かないので注意してください。理由は分かりませんが、私も動かなくてハマっていました。

# Slack Appの作り方
基本的には以下のページの通りです。

https://github.com/CircleCI-Public/slack-orb/wiki/Setup

[Create a Context on CircleCI](https://github.com/CircleCI-Public/slack-orb/wiki/Setup#4-create-a-context-on-circleci)のセクションにある内容は、Organizationで環境を共有したい場合以外は、**Project Settings**の**Environment variables**で追加すればOKです。


# Slack orbの使い方

## コマンドの設定

一番シンプルな使い方は、テンプレートをそのまま使うことだと思います。
テンプレートを使ったときの見た目は、以下のページで確認出来ます。

https://github.com/CircleCI-Public/slack-orb/wiki

```config.yaml
version: 2.1

orbs:
  android: circleci/android@0.2.0
  slack: circleci/slack@4.4
 
commands:
  notify_slack_pass:
    steps:
      - slack/notify:
          event: pass
          template: basic_success_1
          
  notify_slack_fail:
    steps:
      - slack/notify:
          event: fail
          template: basic_fail_1
```

成功時はテンプレート**basic_success_1**を使い、失敗時は**basic_fail_1**を使うコマンドをこんな風に用意しておくと、後でカスタマイズしたときにも1箇所に固まっていて見やすいです。

## Jobの最後に使う

各ジョブの最後にそれぞれ呼びます。
複数のジョブを実行する場合で順列に実行し、途中の成功は通知が不要の場合の例になります。


```config.yaml
jobs:
  debug-build-test:
    executor: android/android

    steps:
      - checkout
      - run:
          name: Debug build
          command: ./gradlew assembleDebug
       - notify_slack_fail
          
  release-build:
    executor: android/android

    steps:
      - checkout
      - run:
          name: Release build
          command: ./gradlew assembleRelease
      - notify_slack_fail
      - notify_slack_pass
```

この後のワークフロー設定で出てきますが、debug-buildのあとにrelease-buildジョブを呼ぶので、debug-buildは失敗したときだけ通知しています。成功したときは通知しません。
release-buildは、失敗または成功したときどちらかが通知されます。

## ワークフローの設定

```config.yaml
workflows:
  version: 2
  build-and-test:
    jobs:
      - debug-build-test
      - release-build:
          requires:
            - debug-build-test
```

始めにdebug-buildジョブを実行し、成功したらrelase-buildが実行されます。

## 通知結果
それぞれの実際の通知です。

### 成功時

|![スクリーンショット 2021-04-21 23.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/740f6036-71e1-6126-270e-89ab4526ef27.png)|
|--|


### 失敗時

|![スクリーンショット 2021-04-21 23.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/bf1b54cb-3c6b-e1ef-f547-bf4c1ced7502.png)|
|--|

パラメータ`mentions`を指定してないのですが、項目がなくなるわけじゃ無くて空白になるだけみたいですね。


# configファイルの全容

以下で、実際のconfigファイルの全容が見られます。

https://github.com/le-kamba/qiita_pedometer/blob/feature/circleci/.circleci/config.yml

# 感想など

正直以前使っていたバージョンよりずっと使いやすくなった気がします。
が、orbの公式ページのexampleがorb4.1だったりして、そのままコピペしていると動かないという罠があり、何時間も費やしてしまいました・・・

最終的に、以下のIssuesで同じ現象の方のコメントを読み、4.4なら動くと書いてあってそれで上げてみたら何のことは無く動作したというオチでした。

https://github.com/CircleCI-Public/slack-orb/issues/255
MacでEC2インスタンスにSSH接続する方法

1.Ec2インスタンス起動

2.sshフォルダ作成

3.下記コマンドで権限を600に変更
```chmod 600 ○○.pemのパス名```

4.ssh接続
```ssh -i ○○.pemのパス名 ec2-user@パブリックIPアドレス```

下記のような表示が出ればログイン成功です

``` 
__|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
15 package(s) needed for security, out of 22 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-54 ~]$
```

参考
>AWSのEC2にmacからSSHする方法
https://qiita.com/nakm/items/695e41d8e71d0d281ac4
【jQuery】jQueryで、隣り合うセルの色が異なる九九表を作成せよ。

１・全ての九九の計算式にセルをつける
２・答えが奇数の行には色をつける
３・CSSについては以下を使うこと

```
table, tr, td {
    border: solid 1px;
}

td {
    padding: 5px;
}

.even {
    background-color: #F5F5F5;
}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/b2aa1867-00fa-8bb2-3bf5-8355e87cf6d2.png)

```javascript
<!DOCTYPE html>
<html>
<head>
<title>九九表</title>
<style>
table, tr, td {
    border: solid 1px;
}
td {
    padding: 5px;
}
.even {
    background-color: #F5F5F5;
}


</style>
<script src="jquery-3.6.0.min.js"></script>
<script>
  $(function(){
      for(var j=1; j<=9; j++){
        $('#table').append('<tr></tr>');
        for(var i=1; i<=9; i++){
            if ( i <= 9 ) {
              $('tr:last-child').append('<td>' +  i + '*' + j + '=' + i*j + '</td>' );
            }else {
              $('tr:last-child').append('<td>' +  i + '*' + j + '=' + i*j + '</td>');
            }
          }
      }
      $('td:even').addClass('even');
});
</script>
</head>
<body>
  <table id="table">
  <caption>九九表</caption>
  </table>
</body>
</html>
```

・補足

１・【td:even】では、0からはじまる連番でかぞえて偶数番目のtd要素がすべてマッチする。
２・【tr:last-child】では、trの子供（td）を最後に追加するってこと
LaravelでAPIを作成する

## 前提
LaravelでAPIを作成していきます
今回は一覧取得/新規登録/更新/削除を実装します。

前提としてはhogeコントローラーとhogeモデル、hogeテーブルが作成されている前提です

### controllerで個々にインポートしなくても良くなる設定
app/Providers/RouteServiceProvider.phpへ以下のコメントアウトを解除する

```
protected $namespace = 'App\\Http\\Controllers';
```

### DBは下記のマイグレーションファイルで作成しておきデータも数件入れておく

```
Schema::create('hoges', function (Blueprint $table) {
            $table->id();
            $table->string('hoge');
            $table->boolean('fuga')->default(false);
            $table->timestamps();
        });
```

## コントローラーの編集
app/Http/Controllers/HogeController.phpへ以下を追記する

```
<?php

namespace App\Http\Controllers;

use App\Models\Task;
use App\Http\Requests\HogeRequest;
use Illuminate\Http\Request;

class HogeController extends Controller
{
    /**
     * Display a listing of the resource.
     * 一覧取得
     * @return \Illuminate\Support\Collection
     */
    public function index()
    {
        return Task::orderByDesc('id')->get();
    }

    /**
     * Store a newly created resource in storage.
     * 新規登録
     * @param  HogeRequest  $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(HogeRequest $request)
    {
        $task = Hoge::create($request->all());

        return $task
            ? response()->json($task, 201)
            : response()->json([], 500);
    }

    /**
     * Update the specified resource in storage.
     * 更新
     * @param  \Illuminate\Http\TaskRequest  $request
     * @param  \App\Models\Hoge  $hoge
     * @return \Illuminate\Http\JsonResponse
     */
    public function update(HogeRequest $request, Hoge $hoge)
    {
        $hoge->title = $request->title;

        return $hoge->update()
            ? response()->json($hoge)
            : response()->json([], 500);
    }

    /**
     * Remove the specified resource from storage.
     * 削除
     * @param  \App\Models\Hoge  $hoge
     * @return \Illuminate\Http\JsonResponse
     */
    public function destroy(Hoge $hoge)
    {
        return $hoge->delete()
            ? response()->json($hoge)
            : response()->json([], 500);
    }

}
```


## モデルの編集
app/Models/Hoge.phpへ以下を追記する。

```
# fillable内にはDBのデータを触るカラムを記述する。
protected $fillable = [
        'hoge',
        'fuga',
    ];
```
## ルートの編集
routes/api.phpへ以下を追記する。

```
Route::apiResource('hoges', 'HogeController');
```



下記のURLにアクセスすると一覧取得のAPIが表示されます！
localhost:8000/api/hoges
有効数字の設定の仕方

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 　有効数字のところを適当にやってきた人生
#リンク
実測値とソフトウェアを組み合わせる場合のちょっとしたルールのメモです。
下記の記事を教えていただき参考にしました。

-[有効数字について](
https://www.mmlab.mech.tuat.ac.jp/mmlab/lect_murata/significant_figure.shtml?fbclid=IwAR1eX6AQOdDI6cWOVl1Fl7rB4yIr4QiActAwQObc8ai7uZu4wjGtxav6Z8A)


#有効数字を設定するルールの概要
- 有効数字は計算上意味のある数字のこと。
- 同じ1でも、1と1.00では意味が違い、**後者は0.01mmの精度で測定している**という意味。
- 加算・減算では、小数点を揃えて計算し，結果を精度がもっとも甘い項に合わて有効数字にする。
- 乗算・除算では、結果を最も精度が甘い項に合わせて有効数字にする。
- 最終的に必要な有効桁数よりも一桁多くとって計算するとよい。
- 測定値ではない**円周率**などの正確な数値は、有効桁数をとらずに使う。
- 減算では途中で有効数字が減ることがあるので取り扱いに注意。

詳しくはさきほどの[「有効数字について」](
https://www.mmlab.mech.tuat.ac.jp/mmlab/lect_murata/significant_figure.shtml?fbclid=IwAR1eX6AQOdDI6cWOVl1Fl7rB4yIr4QiActAwQObc8ai7uZu4wjGtxav6Z8A)などをご参照ください。


#実物が計算通りにうごかない時
実物を動かす際には、有効数字とは別の概念として、
実測値と真値が違う、真値と有効値も違う、と考えて、
調整用のパラメータも準備しておくとよいらしいです。
（と教えていただきました。）
データベースを設計する前に

#データベースを設計する前に
データベースは多くの場合、アプリケーション本体よりも長く付き合っていくものになります。(開発している段階から使用する+他のアプリケーションでもそのデータベースを使う可能性があるため)
適当な名前をつけたり、一貫性のない名前の付け方をすると、読みづらくなるだけではなくトラブルの温床になります。自分だけしか利用しない場合であっても、以下の点を最低限考慮して設計すると良いでしょう。

##予約語
データベースのテーブル名やカラム名などを決める際にまず考えなくてはいけないのは、使用したい言葉が予約語にないものかどうかを確認をすることです。予約語にその単語がある場合、SQLコマンドが正常に動作しない場合があります。
例えば、PHPだと使用するmigrationやseedingをartisanコマンドで実行した場合には、うまくいくけれど、その時発行されるSQL文を直接コンソールから入力すると予約語のエラーになるなどして、トラブルの原因特定が難しくなります。そのため、設計の段階から予約語は使わないように心がけましょう。

実際に使ってしまった予約語
`column` `order`

**[こちら](https://dev.mysql.com/doc/refman/5.6/ja/reserved-words.html)でMySQL公式サイトから予約語の確認ができます
ページ内検索をかけて確認しましょう**

##テーブル名は複数形
基本的にはテーブルに複数のカラムが入ることになるので、入る名称の複数形をつけることが一般的です。
例えばPHPでLaravelを使用しているとき、Modelクラスで定義したクラス名(単数形)とデータベース側のテーブル名の複数形が紐づくようになっているため、特別な理由がなければそのルールに従いましょう。

例)`Model:Userクラス→Database:usersテーブル`

※余談ですがLaravelの場合、「複数形」は英語のルールに則ったものになります。
例) `box->boxes`


##単語と単語の間は「_」で区切ろう
**データベース内では大文字小文字が基本的に区別されません**。
そのため、単語と単語の間は「_」で区切るような名前をつけると良いでしょう。この形式を「**スネークケース**」という。

例) `user_id`

##外部キーを設定するときには、「テーブル名+_+id」で指定しよう
テーブル同士に関連性を持たせる場合、外部キーなどを設定することがあります。多くの場合、外部キーの制約はPRIMARY KEYとなるidに対する制約をすることが多いでしょう。カラム名をみただけでどのテーブルの何カラムに対する外部キーなのかがわかるようにしましょう。

例) usersテーブルのidカラムに対する外部キーをuser_infoテーブルに設定する場合

| usersテーブル | user_infoテーブル |
|:-----------|:------------|
| id         | id          |
| account    | name        |
| password   | address     |
|            | **users_id**|
Herokuを用いたデプロイの流れ

Herokuによるデプロイまでをメモ的に残していきます。
*学習環境*
macOS
Ruby (2.6.5)
mySQL

# Herokuについて
Herokuとは簡単にアプリケーションをデプロイできるクラウドサービス（PaaS）の一つで、インフラの環境構築をしなくても、作成したアプリケーションをgitの仕組みを利用して公開できるサービスを提供してくれています。

# デプロイまでの流れ
１　アカウントを作成
２　HerokuCLIの導入
３　Herokuにログイン
４　`Heroku create アプリ名`でHeroku上にアプリを作成する
５　DBについて設定する
６　環境変数の設定
７　バージョンに合ったStackの設定
８　`git push heroku メインリポジトリ名`でherokuのリポジトリにプッシュ
９　`Heroku run`コマンドを使用してマイグレーションを実行する
10　`Heroku config`で設定状況を確認`heroku apps:info`でアプリにアクセスするためのURLを
　確認して、ちゃんとアクセスできるかどうか確認してみる

# 主に使用したHerokuCLIコマンド
ターミナルからログインする際に使用するコマンド
`heroku login --interactive`
Heroku上にアプリケーションを作成する際に使用するコマンド
`heroku create アプリ名`
Heroku上の設定を確認する（環境変数の設定状況等を確認する）
`heroku config`
Heroku上に環境変数を設定する際に使用するコマンド
`heroku condfig:set 変数名`
設定した変数を削除する際に使用するコマンド
`heroku condfig:unset　変数名`
Herokuにアドオンする際に使用するコマンド
`heroku addons:add clearDB（アドオン名）`
*HerokuはデフォルトでPostgreSQLが設定されており、これを自分が使っているDBに変更しなければならず、今回私が使用したDBはｍｙSQLなので、これをHeroku上で使用できるようにするためのツール(clearDBアドオン)を設定する必要があります。*
stackを設定する際に使用するコマンド
`heroku stack:set heroku-18 -a アプリ名`
*stackとは、アプリケーションの作業場所であり、バージョンによって、設定が異なります。今回私が使用した環境では、Rubyのバージョン2.6.5が動作するStack（heroku-18）を指定しています。*
デバッグの際に使用するコマンド
`heroku logs`
ログの末尾１０行からリアルタイムで確認できるコマンド、終了する際は`ctr + c`を入力
`heroku logs アプリ名　--tail --app アプリ名`


# 環境変数を設定するタイミング
Herokuでデプロイする際に環境変数の設定を行う場合は、`git push heroku master（メインリポジトリ）`を行う前に設定しておかないと設定が反映されません。
環境変数を設定せずにpushしてしまった場合は、以下のパターンに分けて設定を反映させます。
**gitに変更履歴が残っている場合**
そのまま変更履歴をpushして、herokuにもpushすれば設定が反映されます。
**gitに変更履歴がない場合**
空の変更履歴を作成して、コミットし、pushしてあげます。
空のコミットを作成する場合は、
`git commit --allow-empty -m "空のcommit" `
を実行して、空のコミットを作成してからpushすることで設定が反映されます。

環境変数の設定は設定しただけでは、本番環境に反映されないので、きちんとHerokuにプッシュすることが必要であることに気をつけなければなりません。
Action Textで画像が投稿されない問題を解決した話。

本番環境でActionTextで投稿された画像をAWSのEC2煮上げた画像をS3のバケットの中に保存しておくようにしたのですが、そこで本番環境でS3の方に保存されないというもんだいがおきました。
慌てて検証ツールを見てみるとそこでCROSの処理の問題であるというエラーメッセージが出てきました。
私その時CROSについて全く知らなかったので改めてググって調べてみました。

#CROSとはなにか

ブラウザがオリジン(HTMLを読み込んだサーバのこと)以外のサーバからデータを取得する仕組みです。
今回で言うところの、EC2でHTMLLを読み込まれていますが、画像に関してはS3にあるのでS3からHTMLとして画像を持ってくるといったことが必要になってきます。
その時に役に立つのがCROS処理です。

##出典
https://dev.classmethod.jp/articles/cors-cross-origin-resource-sharing-cross-domain/

#今回の失敗

S3のCROS処理のポリシーを書いておくべき所が空欄だったので、保存ができませんでした。

#解決策

CROS処理を許可できるようにポリシーを書いていった所保存することができました。

私は以下のようにして書きました。

```
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]
```
そうした所、無事保存ができました。

いやー良かったよかった。


##出典

https://teratail.com/questions/325524

お役に立てれば幸いです。
会社のITインフラをゼロから試行錯誤してみる

# はじめに
ゼロから会社を立ち上げるとしてITインフラを考えるのって楽しいですよね。
特に制約がなければ幅が広がって収集つかなくなったりしますが、今回は安価に運用手離れがいい構成を考えてみたいと思います。

# 要件
- 従業員:20人くらい
- 情シス:1名
- 予算:従業員一人あたり10,000円/月くらい

# 細かい状況
- 働く場所は最初は各自宅、そのうち拠点ができる予定
- 従業員のITリテラシーは低い人が大半。MicrosoftのOffice製品には馴染みがある。社内にIT系の相談ができる人が2,3人くらいいる
- キャッシュアウトは抑える必要があるため月額利用前提
- テレワークだけど固定IPでインターネットアクセスできる環境がほしい


あとで追加するかもしれないですが、とりあえずこんな感じで作っていきます。

# 全体概要
![ZerobaseInfra_Overview (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/902999/1e45dc60-baac-6c5e-3423-71010976f332.png)

# ステップ
|#|手順|関連リソース|
|:--:|:--|:--|
|1|AWSアカウント作成|AWS Account|
|2| [ドメイン取得](https://qiita.com/qz75ha/items/0489bf3452a195939c3d)|AWS Route53|
|3|Microsoft365セットアップ|Microsoft365/AWS Route53|
|4|User/Group設定|AzureAD|
|5|会社の代表電話構築|Microsoft Teams|
|6|複数AWSアカウント管理|AWS Organizations/AWS Control Tower|
|7|SSO設定|AWS SSO/AzureAD|
|8|ClientVPN|AWS VPN|
|9|公式HP開設|CloudFront/S3/AWS Route53|
|10|外部とのファイル共有構築|Amazon WorkDocs|
|11|PoC環境構築|AWS Control Tower|

とりあえずこんな感じですかね。
これだけあれば、普通に業務が回るようになると思います。
セキュリティ関連とかゆるゆるですが、スモールスタートなんてかんなもんでしょう。

# 費用概算

|#|サービス名|プラン・リソース|利用料計算|小計|
|:--:|:--|:--|:--|:--|
|1|Microsoft365|Business Premium|¥2,180/user*20user|¥43,600|
|2|AmazonWebService|AWS VPN設定|$0.15/h*24h*30day*¥110為替|¥11,800|
|3|AmazonWebService|AWS VPN接続|$0.05/h*7h*20user*20day*¥110為替|¥15,400|
|4|AmazonWebService|NatGateway設定|$0.062/h*24h*30day*¥110為替|¥4,910|
|5|AmazonWebService|NatGateway接続|$0.062/GB*3GB*20user*20day*¥110為替|¥8,184|
|6|AmazonWebService|WorkDocs|$7/user*20user*¥110為替|¥15,400|
|7|AmazonWebService|Route53(.com想定)|$12/year*¥110為替/12month|¥110|
|8|Softbank Unitalk|0AB-J番号|¥800/番号*1番号|¥800|
|9|Microsoft365|Business Voice|¥870/user * 10user|¥8,700|
|-|小計|||¥108,904円|
|-|ユーザー単位|||¥5,445円|

端数切り捨て
為替計算($1=110円)

他にも細かい費用が発生しますが、S3やCloudFrontなどは微々たる費用なので計算を省略しました。CloudTrailやConfigも最低限の設定だったら同様に微々たる費用なので同じく省略です。
もうちょっとセキュリティ系ツールが乗ってくることを考えると少し不安な予算感。代表電話を全社員で取ろうとするとBusinessVoiceライセンスが高くつくので半分のユーザーにで受電するように設計にしました。受電にライセンスが必要なだけで転送したのを受けるのにはライセンスが必要ありません。ここら辺は運用供状況によってライセンス数を追加していく感じでもいいかもしれません。
あと実際のユーザビリティは作ってみないとわからないですね。プライベートでどこまでできるかわかりませんが、やってみたいと思います。
WikipediaのXMLダンプファイルを解析する方法

下記からlibwiki.plをダウンロードする。
https://github.com/jones937/libwiki

解析対象のXMLダンプファイル「jawiki-XXXXXXXX-pages-articles.xml」を下記から落とす。
https://dumps.wikimedia.org/jawiki/

unbzip2 で 拡張子を.xml.bz2から.xmlに変換して、

```
perl sample1_main.pl jawiki-XXXXXXXX-pages-articles.xml
```

を実行する。

以上でxmlダンプファイルが解析されてページタイトルなどが表示される。

後は、`sample1_main.pl`を自分の好きなように改造して、解析してください。
MySQLでクエリーの実行時間を計測する

# コマンド

```bash
SQL_FILE=<sql_file>
DB_USER=<db_user>
DB_NAME=<db_name>
DB_PORT=<db_port>

$ cat $SQL_FILE | mysql -u $DB_USER -p $DB_NAME --port=$DB_PORT --protocol=TCP -vvv | tail -n 3 | head -1
```

# 出力結果例

```
332 rows in set (0.03 sec)
```
Gitコマンド 基本的なコマンド

#Gitコマンドを忘れてしまった時の見直し　~> その1 <~

gitに関係ないコマンドもあるけど、基本的にgitを使う中で必要なコマンドも
載せておく
- - -
####記載コマンドの種類一覧

1. `clone` リポジトリからワークツリーへデータを持ってくる
1. `add` ステージに追加する
1. `commit` ステージにある変更を反映させる
1. `status` gitの状態を表示してくれる
1. `diff` 変更差分を表示する
1. `log` コミットの履歴や変更差分の詳細を表示
1. `rm` ファイルやディレクトリの削除が行える
1. `mv` ファイル名やディレクトリ名などを変更する
1. `push` ステージの変更差分をリポジトリに上げる

- - -

##基本中の基本コマンド

```ruby:移動コマンドとディレクトリ作成
cd ~ #ディレクトリを移動する
mkdir ~ #ディレクトリを新規作成する

ls ~ #指定したディレクトリ内やファイルの中身を表示
ls -a #ディレクトリ内全てを表示

rm ~ #ファイルを削除する
cp ~ #ファイルをコピーする
mv ~ #ファイルの移動とファイル名の変更を行う

cat ~ #ファイルの中身を表示する
```
- - -

#Gitコマンドについて

いつも忘れがちなコマンドが多く、使っていかないと
覚えないので、日々使ってみる。

###初歩的なgitコマンド達
```ruby:init
git init
```
.gitディレクトリが作成され、gitを使う際に必要なファイルなども作られる

###git hubからプロジェクトなどをcloneする時に使う
```ruby:clone
git clone <リポジトリ名>
```
リモートリポジトリをローカルリポジトリにダウンロードする

###プロジェクト内の変更をステージに追加するコマンド
```ruby:add
git add <ディレクトリ名>
git add <ファイル名>
git add . 
#現在いるディレクトリ内の全てをステージに追加してくれるので、注意も必要
```
###ステージに上がっている変更を反映させるコマンド
```ruby:commit
git commit
#gitのエディタが立ち上がる、欠点としては何を変更したのかの中身は見れない。ちょっとめんどい
git commit -m "<メッセージ>"
#一番使いやすい。自分だけでやってる時はよく使う
git commit -v
#変更内容の詳細が見れるので、間違ったコミットをしないようにするため、正式にチームにコミットする時は使うべき
```
**add**する時もそうだけど、**commit**する時は変更内容をしっかりと確認する癖をつけないと
**大変なこと**になることもあるので、よく使うコマンドではあるけど気をつけること。

###変更がないか確認したい時のコマンド
```ruby:status
git status
```
注意することとしては、ちょっとした違いがあること
ステージに変更されているものと、
addする前のものは分けて表示される。

###変更分の中身を見れるコマンド
```ruby:diff
git diff
#git addする前の変更分を見れるコマンド
#要するにワークツリーとステージとの差分を表示している

git diff --staged
#git addした後の変更分を確認したい時に使うコマンド
#要するにリポジトリとステージとの差分を表示している
```
###コミットした履歴を追ったり、見れるコマンド
```ruby:log
git log
#よく使うコマンド

git log --online
#一行で表示してくれる

git log -p <ファイル名>
#ファイルの変更差分を表示してくれる

git log -n <コミット数>
#表示するコミット数を制限する
```
###ファイルを削除できるコマンド
```ruby:rm
git rm <ファイル名>

git rm -r <ディレクトリ名>
#ファイルごと削除したい場合
#ワークツリーからもリポジトリからも削除される

git rm --cached <ファイル名>
#リポジトリからは削除したいけど、ワークツリーにはファイルを残したい時は
```
###ファイル名を変更したい時
```ruby:mv
git mv <旧ファイル名> <新ファイル名>
#ファイル名を変更したい時に使用する

※以下のコマンドでも代替ができる
mv <旧ファイル名> <新ファイル名>
git rm <旧ファイル名>
git add <新ファイル名>
```
コマンドをいちいち覚えるのが面倒であれば下の3ステップを使うのが良さそう

###ステージに上がっている変更をリポジトリにも反映させる
```ruby:push
git push <リモート名> <ブランチ名>

#例： git push origin master

git push -u origin master
#↑の様にコマンドを打つと次回からgit pushと打つだけでよくなるオプション
```

よく使うけど、注意が必要なコマンドも多い、
特に変更をpushする時は、本当に上げていい変更なのかや
変更したものだけをpushするのが安全な気がする。
Dockerを嗜む（１）

# 経緯など
そろそろ一回ぐらいDockerを嗜んでおこうと思っていろいろと整理してみた。

## 前提
+ コンテナの大枠はなんとなく知っている

## やりたいこと
+ コンテナを作成して、AWS上でpythonの処理を定期実行させたい

# 知識の整理
いろいろと検索して調べたが、数年前のAWS Summitの講演/資料が概念を理解するのによかった。

【初級】AWS コンテナサービス入門 | AWS Summit Tokyo 2019
https://www.youtube.com/watch?v=L4bLDNRSYC8
https://pages.awscloud.com/rs/112-TZM-766/images/C3-01.pdf


# やってみる
### 環境
+ Windows10 home

## ０．もろもろセットアップ
Windowsの場合
Docker Desktop for Windowsをインストール
https://hub.docker.com/editions/community/docker-ce-desktop-windows

Power Shellのバージョンを上げろと言ってくるかもしれないので、必要に応じてアップデート

※準備はこれでOK
以前はWindowsHomeでやろうと思ったらいろいろとめんどくさかった記憶があるのだが、WSL2がリリースされたのでこれでOKらしい。

### 確認：超シンプルなubuntuを使って確認してみる

+ イメージを読み込む
Power Shellを管理者モードで起動して以下を実行

```powershell
docker pull ubuntu
```
これでイメージがDLされる

+ 実行（コンテナを起動してログイン）

```powershell
docker run -it ubuntu
```

※別の入り方。
Docker Desktopで起動させ、コンテナ名（コンテナ識別子）を確認して下記を実行（起動中のコンテナにログイン）

```powershell
docker exec -it -u root <コンテナ名> bash
```

+ コンテナの削除

```powershell
docker rm happy_stonebraker
```

+ イメージの削除

```powershell
docker rmi ubuntu
```

これで消えているのが確認できるはず。
ただ、コンテナやイメージの削除についてはDocker Desktopから操作したほうがわかりやすいかもしれない。


※また、Windows Homeを使用している場合は全部がきれいに消えているわけではないので、
別途きれいにしてあげないと容量が減ったままとなってしまう。
以下を参考に作業をするとちゃんと削除することができる
https://www.curict.com/item/f4/f46da60.html

# このあと
とりあえずこれでローカルでコンテナを作成することができたので、次回以降はいろいろと加工して自分がやりたい処理ができるコンテナを作成して、どこかで定期実行させよう
Active Storageで投稿した画像をS3に入れようとしたら権限関係で詰まった話。

AWSのS3に投稿された画像を保存できるようにしよとした時にかなり苦戦したのでそのお話をさせていただければと思います。
S3の権限については学習したはずなのにそのことについてすっかり忘れてしまっていたのでそのお話をさせていただければと思います。

まず、どうやってアクセス権限を得ることができるのかというと、

1つ目として、

```
EDITOR="vi" bin/rails credentials:edit
```
コマンドを使用してシークレットアクセスキーとアクセスキーを入れて環境変数を有効にするコマンドである

```
source ~/.zshrc
```

コマンドを打って環境変数を有効化します。

2つめは、S3のコンソールに行って

バケットからアクセス許可の項目に行っていただいて、そこにあるバケットポリシーにJSON形式でコードを書いて許可するやり方です。
私は以下のようにしてアクセスを許可しました。

それは、

```
{
    "Version": "2012-10-17",
    "Id": "Policy1544152951996",
    "Statement": [
        {
            "Sid": "Stmt1544152948221",
            "Effect": "Allow",
            "Principal": {
                "AWS": "IAMユーザーのARN"
            },
            "Action": [
                "s3:*",
                "s3:PutObjectAcl",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": "バケットのARN/*"
        }
    ]
```

といった感じです。

ひとつひとつ見ていくと、Actionの項目に、PutとGetとDeleteの項目を許可するようにアクセス制限が組まれています。
これをしてあげることで、S3に対して投稿やその投稿されている画像等のファイルをWeb上に表示できる仕組みができました。
私はこれでつまずいていました。
なので、このようなことがないように備忘録として保存しておきます。
ありがとうございました。今回AWSがより一層好きになりました。
PHP・Laravelで検索機能を実装（備忘録）

###概要
PHP・Laravelで簡単な記事投稿アプリを作成してます。
検索機能を実装したので、備忘録として残しておきます。
###ビュー

```PHP:index.blade.php(formタグのみ記載)
<form method="GET" action="{{ route('articles.index') }}" class="d-flex">
    <input class="form-control me-2" name="search" type="search" placeholder="検索" aria-label="Search">
    <button class="btn btn-outline-success" type="submit">検索する</button>
</form>
```
[bootstrapのナビバー](https://getbootstrap.jp/docs/5.0/components/navbar/)に検索フォームがあるので、該当箇所をコピペしてください。
データを渡すにはname属性が必要になるので、`name="search"`を追記します。
また、formでキーワードを取得するので、formタグの中にmethod（データベースに保存はしないので"GET"でOK）とaction（ルートを指定）を追記します。
###コントローラー

```PHP:ArticleController.php(indexアクションのみ記載)
public function index(Request $request)
{
    $search = $request->input('search');
    $query = Article::query();

    if (!empty($search)) {
        $query->where('title', 'LIKE', "%{$search}%")
        ->orWhere('body', 'LIKE', "%{$search}%");
    }

    $articles = $query->get()->sortByDesc('created_at');

    return view('articles.index', ['articles' => $articles]);
}
```
formの値を持ってくるために、Requestクラスのインスタンスをindexアクションの引数に渡しています。
`$search = $request->input('search');`では、index.blade.phpに書いた`name="search"`からデータを持ってきて、変数に代入します。

```PHP:(indexアクションの一部を抜粋)
$query = Article::query();

if (!empty($search)) {
    $query->where('title', 'LIKE', "%{$search}%")
    ->orWhere('body', 'LIKE', "%{$search}%");
}

$articles = $query->get()->sortByDesc('created_at');
```
ここでクエリビルダでクエリを組み立てています。
$searchが空ではない場合は、whereメソッドを実行します。
　・第1引数・・・検索するテーブル名を指定する。
　・第2引数・・・曖昧検索をするためにオペレーターとしてLIKEを使用する。
　・第3引数・・・変数の前後に%を入れて部分一致を行う。%は曖昧検索を指示する記号のことで、0文字以上の任意の文字列を表す。
最後にgetメソッドで構成してきたクエリによるデータを取得し、作成日時が新しい順に並べています。
###参考記事
[Laravelで検索機能の実装 [基本]](https://noumenon-th.net/programming/2020/03/01/laravel-search/)
[Laravel 6.x データベース：クエリビルダ](https://readouble.com/laravel/6.x/ja/queries.html)
[【SQL】意外と簡単!これならわかるLIKE句でのあいまい検索](https://www.sejuku.net/blog/73619)
[【Laravel】検索機能の実装](https://qiita.com/JUM22676603/items/ea1f53579acad1da29d3)
[laravelで検索機能を実装する](https://qiita.com/banku/items/4ac99f9a48d2fc862255)
###補足情報
PHP 7.4.1
Laravel 6.20.26
C# - AForge.NETを使って動画を生成する（画像のみ）

※VisualStudio不使用の環境であるため、VisualStudioを使用する場合は参考サイト等を参照ください。

# やったこと

画像を生成し、AForge.NETを使って動画（.avi ファイル）を作成しました。
※音声はAForge.NETでは結合できないようなので、AviUtlなどのツールを使って別途合成が必要です。

# 動的リンクの注意点

exeと<b>同じフォルダ階層</b>に dll (今回はAForge.dll と AForge.Video.dll と AForge.Video.VFW.dll) をおいてください。

そうしないと実行時に下記のエラーがでます。

> ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'AForge.Video.VFW, Version=2.2.4.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

# ソースコード

```csharp:AviEnc.cs

using System;
using System.Drawing;

class AviEnc
{
    static readonly int FrameRate = 15; // 1秒あたりのフレーム数を指定する
    static readonly int MovieWidth = 800;
    static readonly int MovieHeight = 600;

    [STAThread]
    static void Main(string[] args)
    {
        var writer = new AForge.Video.VFW.AVIWriter();
        writer.Codec = "MSVC";
        writer.FrameRate = FrameRate;
        writer.Open("out.avi", MovieWidth, MovieHeight);

        var font = new Font("Arial", 72.0f);
        var bmp = new Bitmap(MovieWidth, MovieHeight);

        var g = Graphics.FromImage(bmp);

        // 60秒分のフレームを作成
        for ( int i=0; i<60*FrameRate; i++ ) {
            g.FillRectangle(Brushes.Black, 0, 0, MovieWidth, MovieHeight);
            g.DrawString(i.ToString(), font, Brushes.White, 10, 100);
            writer.AddFrame(bmp); // フレームを追加
        }
        g.Dispose();

        writer.Close();
    }
}
```

# cscでのコンパイル方法

```text
csc /r:AForge.Video.VFW.dll AviEnc.cs
```

# Aviファイルに関する注意点

動画再生ソフトによってはAviファイルをうまく再生できないケースがあるため、AviUtlなどのツールを使って別のフォーマット(mp4など)への変換が必要となる場合があります。



# 参考サイト

 - [［VB/C#］ Bitmap から動画生成 – プログラミング生放送](https://pronama.jp/2015/06/11/bitmap-avi/)
 - [AForge.NET ：： Framework Downloads](http://www.aforgenet.com/framework/downloads.html)
 - [AVIファイルフォーマット](https://makiuchi-d.github.io/mksoft/doc/avifileformat.html)

# 参考サイト(AviUtl関連)

 - [AviUtlのお部屋](http://spring-fragrance.mints.ne.jp/aviutl/)
 - [AviUtl初心者が最初に読むべきページ【導入から使い方まで】 | AviUtlの易しい使い方](https://aviutl.info/intro/)
Azureの自己学習の記録

目的：Azureの資格取得
目標：AZ-104 Microsoft Azure Administratorの資格取得
前提知識：昔ちょっと個人的にAzureを使っていたことがある。最近は触っていない。AWSの知識は少しある。IT関係の仕事をしている。

# 1.日記
## 2021/5/14 
6月末までにAZ-104の資格を取得しようと思い立ち、6/5に試験申し込み。
いきなりは難しいと考え、とりあえずAZ-900も受けることにする。
AZ-900の試験日は2021/5/22にした。

## 2021/5/15
病院に行ったり、教材を探したり、あまり勉強しなかった。

## 2021/5/16
本格的にAZ-900の勉強を開始。

## 2021/5/17
ポイントを速習！「Azureの基礎（AZ900）」をみんなで学ぶ を見ながら手を動かした。

## 2021/5/18
ポイントを速習！「Azureの基礎（AZ900）」をみんなで学ぶ を見終わったので、次にどうしようか考えていたらUdemyのセールが始まっていたので、
もご問題集を購入。

### 2021/5/19
Udemyの問題をやりこむ。

### 2021/5/22
AZ-900の試験受けてきた。とりあえず合格。再来週のAZ-104の勉強を開始する。

### 2021/5/31
Udemyをベースに一通り学習を進める。
この後は手を動かして勉強を進めることにする。

### 2021/6/2
とりあえず今週末試験だが、このままではちょっと自信が無いので、WHIZLABSの問題を購入。
ついでに来週末(6/12)はAZ-204を申し込んでみた。

### 2021/6/5
WHIZLABSの問題で自身も付き、受験。とりあえず807点で合格。問題数は59問。
あまり詳しく書けないが、最後に戻れない問題が固まっていた。
一番最後に、戻れない問題で、ミスったことが判明。
時間が30分以上余ったので見直しを使用かと思ったが、力尽き、終了ボタンを・・・。
受かってよかった。AZ-204の勉強を開始する。

### 2021/6/12
AZ-204を受けてきたが見たことが無い問題が多く、687点で不合格。
弱点をMS Learnで学習して、再受験しなくては。

#2. 学習教材

最近は学習する際に、Udemyを使うことが多いが、セール期間外だったので、書籍やネットの情報を調べた。

## 2-1.書籍
### 2-1-1.[速習Azure Administrator 【技術の泉シリーズ（NextPublishing）】](https://www.amazon.co.jp/%E9%80%9F%E7%BF%92Azure-Administrator-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E5%9C%9F%E7%94%B0-%E6%99%83%E4%BB%A4-ebook/dp/B088ZCW8QM/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=az-104&qid=1621129779&sr=8-1)

内容は薄く、詳細はネットのリンクを貼っている。2000円はちょっと高いかな。


## 2-2.ネット
### 2-2-1.ポイントを速習！「Azureの基礎（AZ900）」をみんなで学ぶ 
https://ascii.jp/elem/000/004/010/4010427/

第3回の演習のリンクが死んでいる？
とりあえずサンドボックスは諦め無料枠で学習した。

# 3.学習した内容

## 3-0.はじめに
リソースグループを作り、その下にリソースを追加していく。
削除する際はリソースグループを削除する。
リソースグループのリージョンは東日本ではなく、西日本にする。
リージョンによってVMを作成するときに選択できるスペックが異なる。
西日本の方が性能が低い（安い）のを選択できた。

## 3-1.コンピューティング
### 3-1-1.Azure Virtual Machines（Azure VM）
簡単な操作で、LinuxやWindowsの仮想マシンを作成したり、スケールさせたりすることができます。
AWSのEC2

#### 1.ディスクを追加した場合の確認方法
Linuxの場合は、「lsblk」コマンドで確認できる。「sdc」に追加されていた。

## 3-2.ネットワーク
### 3-2-1.Azure Virtual Network（Azure VNet）
仮想マシンが他のリソースと安全に通信するためのネットワークを提供します。

### 3-2-2.Azure VPN Gateway
VPNを使って、オンプレミスや他のクラウド環境のネットワークとAzure上のネットワーク（Azure Virtual Network）を安全に相互接続するサービスです。
Notion APIライブラリまとめ

## Ruby

https://github.com/katsumata-ryo/notionar

## Laravel

https://github.com/5am-code/laravel-notion-api

## Swift

https://github.com/noppefoxwolf/notion

## JS

https://github.com/makenotion/notion-sdk-js

## go

https://github.com/dstotijn/go-notion

https://github.com/ketion-so/go-notion

## python

https://github.com/Blue-Hope/notion-sdk-py

## vue

https://github.com/64robots/vue-notion-api

## PHP

https://github.com/64robots/php-notion

## React

https://github.com/mkalvas/notion-react