OmniAICreator/Qiita-1.07M huggingface dataset:
LPIC Level 1(1日目)

#初めに

LPICの試験の勉強をしていて、勉強したものをまとめています。
ご指摘等ございましたらご教授下さい。

#Linuxとオープンソース

1-1 OSとは？

OSとはオペレーションシステムの略で、基本ソフトウェアで、人間でいう脳にあたる部分です。
アプリケーションは応用ソフトウェアで、ソフトウェアとはOSとアプリケーションに分かれます。
普段使っているブラウザや音楽プレーヤなどはアプリケーションです。
しかし、OSはアプリケーションとハードウェアとの間で様々な仕事をしてくれます。
代表的なOSはLinux、Windows,macOS,UNIXなどがあります。

1-2 Linuxについて

OSの中核の部分のことをカーネルと言います。
カーネルはプログラムのプロセス処理、メモリ処理、ファイルシステム処理、ネットワーク処理、デバイス処理などを担当する車で言うところのエンジンのようなものです。しかし、車がエンジンだけでは動かないのと同じようにOSもカーネルだけでは上手く動きません。なので、他のサポートを組み込むことで、OSが成り立っています。これをディストリビューションと言います。

代表的なディストリビューションとしてはRed Hat系ディストリビューション、Debian系ディストリビューション、とその他に分かれます。

**Red Hat系**

Red Hat Linuxをベースに開発されています。


・Fedora 

これは元々のRed Hat Linuxという無償のディストリビューションを公開していましたが、
その後継となるディストリビューションです。
半年に１度新版がリリースしています。

・Red Hat Enterprise Linux

Fedoraの成果を取り入れたものです。有償であり、安価ではないが、
レッドハット社のサポートを受けることができます。

・CentOS

RHELのオープンソースソフトウェアを元に作られた無償ディストリビューションをRHELクローンOSと言うが、その中でも有名なのがCentOSです。RHELと100%の互換性を持っていて、人気があります。

**Debian系ディストリビューション**

主に開発しているのが、Debian GNU/Linuxです。これをベースに開発されています。

・Ubuntu

これは個人ユーザの間で高い人気の無償ディストリビューションです。
初心者に配慮もしています。

・Linux Mint

Ubuntuから派生したディストリビューションで、使いやすいOSを目指して開発されています。

・Raspbian

ラズベリーパイなどで有名なDebian GNU/Linuxをベースに作られたものです。

● Linuxの特徴

・　UNIXライクなOS

UNIXと似ているが、同等の動作をするようにゼロから作り上げられた独自のOSです。

・　多彩なディストリビューション

多くのディストリビューションがあるが、その反面、初心者は混乱を招く場合もあります。

・　多彩なプラットフォーム

OSが動作するハードウェアをプラットフォームと言います。
Linuxはとても幅広いハードウェア上で動作します。

・無償で利用可能

無償で利用できるOSはLinuxだけではないが、最も人気があります。

・最適なシステム構成が可能

システムに合わせて機能を細かく調整できます。
また、自由度の高いカスタマイズができます。

● Linuxを利用できる領域

・　ネットワークサーバ
・　組み込み機器
・　パソコン
・　大規模システム

● オープンソース

Linuxはソースコードが完全に公開されていて、誰でも読むことができ、
修正したり、機能を追加したり、開発に参加したりできます。
これをオープンソースと言います。
パケットトレーサーでネットワーク1105

※ルーターのスタティックルートで設定したIPアドレスを消すコマンド
（例）
Router#en
Router#
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#
Router(config)#no ip route 192.168.6.0 255.255.255.0 192.168.3.254
Router(config)#
Router(config)#end

※ダイナミックルーティングプロトコルとは、万が一通信に障害が発生した際に管理者が設定する必要はない。


※OSPFとは（オープン　ショーテスト　パス　ファースト）
　リンクステート型
　　　リンク・・・隣との接続
　　　ステート・・・状態
　隣との状態を見て経路を決める。
　宛先までのコスト値が最小の経路を選択する。

※OSPFの設定コマンド
（例）
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#
Router(config)#router ospf 1
Router(config-router)#
Router(config-router)#network 192.168.1.0 0.0.0.255 area 0
Router(config-router)#
Router(config-router)#network 192.168.2.0 0.0.0.255 area 0
Router(config-router)#
Router(config-router)#network 192.168.3.0 0.0.0.255 area 0
Router(config-router)#
Router(config-router)#end
Router#
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#
Router(config)#interface fastEthernet 0/1
Router(config-if)#
Router(config-if)#ip ospf cost 10
Router(config-if)#
Router(config-if)#end
★コスト１０にすることによって通信の優先順位が下がる。



※OSPFで全部設定して、Show ip routeでルーティングテーブルを確認すると。。。
（例）
Router#show ip route
C    192.168.1.0/24 is directly connected, FastEthernet1/0
C    192.168.2.0/24 is directly connected, FastEthernet0/0
C    192.168.3.0/24 is directly connected, FastEthernet0/1
O    192.168.4.0/24 [110/2] via 192.168.2.254, 00:04:26, FastEthernet0/0
O    192.168.5.0/24 [110/11] via 192.168.3.254, 00:02:06, FastEthernet0/1
O    192.168.6.0/24 [110/3] via 192.168.2.254, 00:01:08, FastEthernet0/0
★OはOSPFで学んだ経路情報を表している。


※連続してPingを打つ場合は-tと打つ。
（例）
ping -t 192.168.6.1


※ルーターのシャットダウンコマンド
(例）
Router#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Router(config)#interface fastEthernet 0/0
Router(config-if)#shutdown 
★通信断が発生する。
既存のプロダクトLPをサクッとCMS化させる話

こんにちは！
Another worksでフロントエンドエンジニアを担当しているみやぞんです！
今回は弊社のプロダクトLPをヘッドレスCMSに移行改善に関する取り組みをご紹介します！

## 弊社LPの導入事例記事の現在
弊社サービスLPの導入事例記事ページは記事内容をコード内に直書きする方法で実装されています。
リリースまでは最小工数でたどり着けるのはよかったものの、やはり記事追加や更新などのメンテンナンスで工数が地味に発生します。
このボディブローのようにじわじわと効いてくる作業の工数を減らせないかと色々考えてみました。(ボディブローは受けたことがありません)

## 前提条件
- 投稿するのは開発チームではない

## 解決策の候補たち
- 管理画面から投稿できる仕組みを作る
- noteなどに投稿しRSSで情報取得する
- スプレッドシートにデータ入力しS3(AWS)を使用して情報取得
- **ヘッドレスCMS化** (結論)

結論と書いてあるとおり選ばれたのは「ヘッドレスCMS」なのですが、それ以外の選択肢は何がだめだったのかというところを簡単に説明していきます。

### 管理画面から投稿できる仕組みを作る
記事投稿UIを自前で作成しなければならないことに加え、当然DB設計やデータベースそのものも用意する必要があり、結構大きな工数がかかります。
外部サービスに依存せず、長く使えることは確実ではあるのですが、工数とインパクトを考えたときに「よしやろう」とはなりませんでした...。

### noteなどに投稿しRSSで情報取得する
みんな書き慣れてるし、投稿UXも最高やん！これでええやん！と思ったのですがこの案が一番論外でした。
SEOの観点でデメリットは沢山あります。
- 離脱率が上がる
- 回遊率が下がる
- コンバージョンのための導線が減る
他のサービスLPを見てもやはりこういうやり方をしていないのは上記の理由からなのかなと。
というわけで、却下となりました。

### スプレッドシートにデータ入力しS3(AWS)を使用して情報取得
弊社システム内で似たようなことをしている部分があるので真似しようとしましたが、入力UXが最悪です。
おそらく入力文言のセルの隣にHTMLタグの種別を設定するプルダウンを用意したり...。
ちょっと想像しただけでよろしくないなと🤢

## 選ばれたのは「ヘッドレスCMS」でした
CMSってWordpressとかに代表されるWebサイトの構築から更新まで、管理画面でめっちゃ簡単にできるシステムだよね？
というのは知っていましたし、なんなら開発経験もありました。
しかし「ヘッドレスCMS」となると、聞いたことはあるけど何なのかはわかっていませんでした。
ただ、APIだけを提供するCMSじゃなかったけ？というごく浅い知識はあったので、ダメ元で少し調べてみたのでした。

## ヘッドレスCMSとは？
![Decoupled.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386799/3da083d8-84b9-6eb2-de97-19fac77c5452.jpeg)
https://wk-partners.co.jp/homepage/blog/hpseisaku/htmlcss/headless-cms/

ビューの部分を持たないCMSで、Wordpressは見た目までをセットで提供しているのに対して、
「ヘッドレス」なCMSはその画面上の見た目以外の「管理画面」と入力したデータを引っ張り出す「APIとデータベース」のみを提供します。
つまり、表示のための画面は自前で用意しているものをそのまま使用できるのです！

## でもきっと、導入は難しいんでしょう？
いいえ、ヘッドレスCMSの導入は**朝起きて歯を磨くことよりも簡単**です。

ここでは国産ヘッドレスCMSである「microCMS」を使用して説明します。(当然日本語に対応しています！)

1. まずアカウントを作成し管理画面にアクセスします。(https://microcms.io/)
1. あとは登録したいAPIのフィールドを自分でカスタムして、投稿するだけです。
![スクリーンショット 2021-11-05 11.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386799/8fece8e5-aff8-a222-afa5-f42ed0e7c9ff.png)
![スクリーンショット 2021-10-29 14.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386799/3c07352c-51b9-00f6-56ca-bb6eb947b9af.png)

サムネイルを追加したければ画像登録フィールドを簡単に作れますし、キー名も自分で決められます。
記事投稿であればリッチテキストエディタも必須ですね！というような構成も簡単に組めます。

あとは、Next.jsで書いた自前のページに組み込むだけです。
これもSDKが用意されており、たった少しのコードで世界を変えることができます。

### SDKをインポートするだけで簡単にAPIへのアクセス可能

```typescript
import { createClient } from 'microcms-js-sdk';

const client = createClient({
  serviceDomain: 'service-domain',
  apiKey: process.env.API_KEY,
});

const data = await client.get({ endpoint: "blog" });
```
あらすごい。簡単に一覧情報が取得できます。
詳細情報の取得はもちろん、前後の記事取得なども情報がたくさん出ているので簡単に実装可能です。

## ヘッドレスCMS最高！
「既存のページをCMS化したい」というニーズのある方はぜひ一度使ってみてください！Hobbyプランであれば多少の制限があるものの無料で使用できるのでおすすめです！
コマンド一つでディレクトリに紐づいているリモートリポジトリをブラウザで開く

## はじめに

普段頭の体操がてらterminalの使用感Upのためにあれこれ弄り回しているので、過去に作成したものをここで晒してみます🐕


特に困ってはいないけど、ググってツールをインストールしたりするほどでもないので、個人的な需要を満たすためにザックリと作成してみました。


## コード内容

下記を`.bashrc`や`.zshrc`などaliasを書いているファイルに貼り付ければ `$ github`でブラウザ上にカレントディレクトリのリモートリポジトリが表示されます。

```sh:.zshrcとか.bashrc
function github() {
  git="https://github.com/"
  hub=$(git remote -v | head -n 1 | cut -f 2 -d ":" | rev | cut -c 8- | rev)
  echo "opening repository ..."
  echo $hub
  open $git$hub
}
```

## 詳細


泥臭い書き方をしていますが、以下の通りです。

```shell
$ git remote -v

origin  git@github.com:user_name/repository_name.git (fetch)
origin  git@github.com:user_name/repository_name.git (push)
```

上記の`$ git remote -v`の出力を使用していきます。

- `git`にGitHubのドメインをである`"https://github.com/"`を用意。

```sh
hub=$(git remote -v | head -n 1 | cut -f 2 -d ":" | rev | cut -c 8- | rev)
```

続いて`hub`の中身ですが、`$ git remote -v`の出力内容から`origin  git@github.com:user_name/repository_name.git (fetch)`を取り出し、
githubのドメインの後に連結するために下記の手順で加工しています。


- **`head - 1`**：出力結果の1行目を指定

- **`cut -f 2 -d ":"`**：cutコマンドの`-f(--fields)オプション`で必要な項目が二番目であることを指定し、さらに`-d(--delimiter)`のオプションによって区切り文字が`":"`であることを指定。

- 上記headとcutを使用して得た結果をreverseして先頭から8文字削除することで、` (fetch)`と前にあるスペースを削除し再度reverseする。最終的に`user_name/repository_name.git`の形にして`hub`に格納。

最後に`$git`と`$hub`を連結してリポジトリのurlにし、openコマンドに渡してあげればデフォルトブラウザでgithubのリポジトリが表示されます。

## まとめ

こんな感じで動いてくれると思います。
reverseしているとこなどかなり改善できる内容だと思いますがとりあえず使えればいいやで書いたものです🐕

![qiita1](https://user-images.githubusercontent.com/31815244/140506129-7a848d34-b6a8-4d6a-afe7-21404fa1d4c1.gif)
Modelとデータベース作成の手順解説についてのメモ


RubyonRails5速習実践ガイドの本を参考しました。
##モデルとマイグレーションファイルの作成
モデルとマイグレーションファイルを作成する。

```
bin/rails g model モデル名 属性:データ型 name:string
```
上記のコマンドで**モデルクラスを定義したファイル**と、**データ構造を定義したマイグレーションファイル**が作られる。

generatorで指定するモデル名は頭文字が大文字の単数形で指定します。
なぜかというとrailsのモデルとデータベースには二つの命名規則がある。

1.データベースのテーブル名はモデルのクラス名を複数形にしたもの。
2.モデルのクラス名はキャメルケース、テーブル名はスネークケース。

###マイグレーションファイルの中身を見てみる

自動で作られたマイグレーションファイルはこんな感じ↓

```ruby
class Create複数形のテーブル名 < ActiveRecord::Migration[5.2]
  def change
    create_table :小文字のテーブル名 do |t|
      t.データ型 :カラム名
      t.string :name

      t.timestamps
    end
  end
end
```

ちゃんとgeneratorで指定したモデル名の複数形がテーブル名にはず。。。

###modelのファイルを見る

モデルの定義したファイルには

```
class モデル名（例Task） < ApplicationRecord
end
```

こんな感じで作成されています。
ここにいろんなコードを書くことでデータを登録する前にチェックしてくれます。

###マイグレーションファイルをデータベースに適用する

モデルを扱うにはそれに対応したデータのテーブルが必要なんですが、このままではまだテーブルは作成されていません。
マイグレーションファイルに書かれたテーブルを作成するには下記のコマンドを使います↓

```
$ bin/rails db:migrate
```
これを行うとマイグレーションファイルに書かれた定義をもとにテーブルの作成を行います。
（新しくマイグレーションファイルを作成してデータベースを変更したりもできます）

エラーが出ていなければ成功です。

###schema.rbとマイグレーションファイルについて
無事に作成されるとschema.rbが作成され、そこに作成もしくは変更内容が記述されます。
そこを見ることで現在のデータベースの状態を確認できます。

この機能はテーブルを変更したり追加したりするとその履歴がschema.rbに記載されマイグレーションする前の**バージョンを戻したり最新のデータベースのバージョンにすることができバージョン管理を簡単にしてくれます。**

###まとめ

これでmodelとマイグレーションファイルの作成は終わりです。
generatorで自動で二つを一気に作ってくれるのでめっちゃ便利！
１つ注意点としては
**modelとデータベースのテーブルには命名規則がある**
この点はしっかり確認してアプリを作ってかないといけない
[liveview] ** (UndefinedFunctionError) function Phoenix.LiveView.Helpers.__component__/3 is undefined or privateに対する対応


phoenix_live_viewを0.16.4から0.17.5にアップデートしたところ、

```
** (UndefinedFunctionError) function Phoenix.LiveView.Helpers.__component__/3 is undefined or private
```

というエラーが出現。

_buildディレクトリを消して、ビルドし直したら解決。
【Vue.js】インラインメソッドハンドラ

#はじめに
こんにちは！
今回は【Vue.js】インラインメソッドハンドラについてアウトプットしていきます！

#インラインメソッドハンドラについて
v-onを使用することでDOMイベントの購読、イベント発火時のJavaScriptの実行が可能になる。

#書き方・解説
クリック数をカウントする機能を例題にアウトプットしていきます。

```HTML:HTML
<div id="app">
  <p>
    {{ counter }}
  </p>
  <button v-on:click="counter++">
    Click!　　　　　　　　　　　　　　　　<!--⏫インラインメソッドハンドラ-->
  </button>
</div>
```
```Vue.js
 var app = new Vue({
   el: "#app",
   data: {
     counter: 0
   }
 })
```

カウント数を保持する`data`のプロパティ`counter`を記述。初期値は`0`。
＜テンプレート側＞
カウント数の表示部分`{{ counter }}`とボタン部分`Click!`を用意します。
ボタンの属性には`v-on:click`を用意し、カウント数を管理するプロパティ（`counter`）をインクリメントする。

※インクリメント＝変数の値を１増やす演算のこと。

以上を記述し、`Click!`ボタンをクリックすると、


![スクリーンショット 2021-10-25 21.03.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/5d38ba50-7763-b9ba-2359-d890920e5acc.png)

![スクリーンショット 2021-10-25 21.04.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/0b553899-a8d1-3e89-3e0d-f38b1ddf72e2.png)

![スクリーンショット 2021-10-25 21.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2114750/4dbab24a-e9ca-8804-f19c-9958a4daf4f8.png)

このように数字は１ずつ増えていく処理を実行し表示されるようになります。



#まとめ
今回ように一行で（`<button v-on:click="counter++">`）イベントハンドラで記述することは稀で、v-on属性の値にJavascript式を記述していく方法には限界がある。
なので、次回の記事にはv-on属性の値にイベントハンドラのメソッド名を書く方法をアウトプットしていきます！


#最後に
今回はインラインメソッドハンドラについてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
ros ネットワーク周りの調査コマンド

```
ネットワーク周りの使ったらいいツール：

レイテンシを測る -> ping (at )
転送速度を測る -> iperf -s (at ) / iperf -c (at )
現状の通信状況 -> iftop -i eth0 (IP毎の通信量が分かる)/ nethogs (プロセス毎の通信量が分かる)/ dstat
ネットワークの設定 -> ethtool -i eth0
```

以下より引用

https://github.com/jsk-ros-pkg/jsk_common/issues/64
4-1 CSS基礎　補足

## スタイルを指定するときの詳細度について

詳細度とは、どの CSS プロパティが要素に最も関係があるか、すなわち適用されるかをブラウザーが決定する手段です。
https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

**基本的に詳細度は以下のような優先度があります**

- 親要素　＜　子要素
- 属性`class`　＜　属性`id`

例えば、親要素の属性`class`にスタイルを指定して、子要素の属性`class`にもスタイルを指定すると、子要素の属性`class`のスタイルが適用されます。

:::note warn
スタイルシートに同じセレクタを定義してしまうと、後に定義されたセレクタが適用されます
:::

### 実際にスタイルをあてて確認してみましょう

<details>
<summary>index.html</summary>
<div>

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div class="parent">
      <span id="first" class="cls">おはよう！　こんにちは！　１</span>
      <span>おはよう！　こんにちは！　２</span>
      <span>おはよう！　こんにちは！　３</span>
      <span>おはよう！　こんにちは！　４</span>
    </div>
  </body>
</html>
```
</div>
</details>


<details>
<summary>style.css</summary>
<div>

```css
.parent {
  color: blue;
  font-weight: 600;
}

span {
  color: purple;
}

.cls {
  color: orange;
}

#first {
  color: magenta;
}

.parent span {
  color: red;
}

.parent span {
  color: black;
}
```
</div>
</details>
YouTube広告によく出てくる、在宅で月に30万稼いでいるエンジニアの生活は本当に幸せなのか、真面目に考えてみる。

僕がYouTubeを見ていて最近よく出てくる広告の人について、本当に幸せなのか僕の感覚で考え直してみる。

# 在宅で月30万円稼いでいるみたい
　まぁこれはそんな人もおるやろという感覚ですけど、おそらく個人事業主ですよね？会社勤めで月30万はそこそこの稼ぎかもしれないけど、いつ需要がなくなるかわからない個人事業主の収入が月30万円はちょっと少なくない？1件で30万ならわかるけど、病気して数ヶ月入院したらどうすんの？数ヶ月間収入ゼロやで？リスク考えや。

# 最初に現在のある日のスケジュールを紹介しています
## 朝はゆっくり11時に起きるらしい
　11時に起きることがゆっくりに該当するのかどうかは個人の価値観だし、遅く起きられることが幸せというのはちょっと共感できないな〜。1日を数時間無駄にしてるぞ。

## のんびり起きた後にカフェに行って優雅にお仕事をするらしい
　のんびり起きたことがあたかも統一された幸せの価値の一つであるかのように謳っているけど、さっきも述べたように私はそう思わない。
　その後のカフェに行くことも優雅にお仕事することもひどい脚色。まずカフェのようなかなり公な場所でPCを広げてできる仕事って、機密漏洩などのセキュリティがあまりない作業的な仕事ってことでしょうか？もちろんそういう方も世の中に必要なのですが、エンジニア冥利に尽きる仕事なのかなぁ。(ここでいうエンジニアはテクノロジストやテクニシャンの意ではない。)
　テクノロジストやテクニシャンとしてなら外注として請け負ったコードを書き書きするってことですけど、それでも公の場所でできる仕事なんでしょうか。不安です。

　あと、優雅にってのは誰と比べているんでしょうね？私は会社でも家でも優雅に技術開発してますよ。

## 夜はおいしい料理を作るらしい
　おいしいというのも脚色がすぎる。みんな飯は食うだろ。それがおいしいかどうかはあなたの腕にかかっている。この人みたいな仕事をすれば人類みな須く料理が上手くなるのか？

## そのあとは友達とZOOMでお話するらしい
　さっきと同じでこの人みたいな仕事をすれば人類みな須く友達とZOOMでお話するのか？

## 明日のことも気にせず、夜遅くまで飲んだりもできるらしい
　そんなことしてるから朝11時に起きちゃうんだろうけど、まあ許そう。

## 本当に楽しくて毎日が充実しているらしい
　あなた昼前に起きて作業的な仕事を数時間やって夜ご飯食べて友達と喋って飲んだだけだよ？充実してんのそれ？

# この仕事になる前の話もしてくれています
## 毎日行きたくもない会社に行ってたらしい
行きたくもない会社に入ったのか。残念だったね。僕は共感できない。

## 合わない上司に嫌味を言われたらしい
上司の教育もなってない会社だったんだね。残念でした。僕は共感できない。

## パワハラされたりセクハラされたり
これはひどいね。

## 給料も低くて月17万円
それは低いね。

# でもプログラミングができるようになってからは。。。
## 家で一人でお仕事できるのでストレスがなくなったらしい
あなたさっきまでカフェに行くって言ってたやんか。
公の場所でやっても問題のない、プログラミングさえできれば誰でもできる仕事でストレスも不安もないのか。。。幸せ者だね。

# 一回整理する。
この人の1日はあくまで例であって、毎日そういう生活だとは一言も言ってないので、内容を要約すると、「1日5時間くらいの仕事で月30万円稼げますよ。後の時間は好きに過ごせます。」ということだろう。仕事以外の時間を勉強とかに使えば、より価値の高い仕事も受けられるようになって月30万円以上も目指せるだろうに、会社勤めの時の感覚と安易に比較し、個人事業主というリスクも鑑みず、月30万円に安住しているあなたに不安さえ感じる。その幸せが続けばいいね。

お遊びでこんな戯言を書いてしまいましたが、プログラミング人口が増えれば増えるほど、僕みたいに技術開発がメインでプログラムは手段って人間の価値が上がるのでありがたいです。
4-3.3 CSS演習3

## ボタンにホバーを付けてみよう
ホバーとはカーソルを当てた時の動作

### 完成イメージ

![hover.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/762bf19c-34a7-2286-0eb8-985dc7ffcb6e.gif)

（gif作ってみたのでが、見づらいですね、、、）

通常
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/13693dd2-e689-0603-4add-e2545b127c71.png)

ホバー時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1888749/c0bed384-d49c-bc80-8092-ccba48df84e7.png)


#### 要件
・ボタンの位置：`中央`

・ボタンの詳細（通常）
　・背景色：`白`
　・文字の色：`黒`
　・枠の色：`黒`
　・枠の太さ：`1px`
　・枠の形状：`実線`
　・パディング：`上下10px、左右40px`
　・マージン：`上50px、左右0`
　・文字の太さ：`600`
　・カーソル：`pointer（指のマーク）`
　・ホバーされて表示が変わる速度：`0.3s`

・ボタンの詳細（ホバー時）
　・背景色：`黒`
　・文字の色：`白`


##### 手順
いつも通り`index.html`、`style.css`ファイルを作成します。

※今回はCSSの話なのでHTMLの説明は省略します。`index.html`は以下を使用してください。

<details>
<summary>index.html</summary>
<div>

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
    <link rel="stylesheet" href="style.css" />
  </head>

  <body>
    <div id="container">
      <button class="btn">Button</button>
    </div>
  </body>
</html>
```
</div>
</details>

### ソース
```CSS
#container {
  text-align: center;
}

.btn {
  background-color: white;
  color: black;
  border: 1px solid black;
  padding: 10px 40px;
  margin: 50px 0;
  font-weight: 600;
  cursor: pointer;
  transition: all 0.3s;
}

.btn:hover {
  background-color: black;
  color: white;
}
```
Cloud9からCloudFormationにデプロイするときに発生したエラー

#エラーコード

```
Error: Failed to create/update the stack: {スタック名}, Waiter
StackCreateComplete failed: Waiter encountered a terminal failure state: For
expression "Stacks[].StackStatus" we matched expected path: "ROLLBACK_COMPLETE" at least once

```
このエラーコードの上には、エラー発生原因がある。そこのエラーコードは

```
CREATE_FAILED              AWS::IAM::Role             ServerlessFunctionRole     Syntax errors in policy. 
                                                                                 (Service: AmazonIdentity 
                                                                                 Management; Status Code: 
                                                                                 400; Error Code:         
                                                                                 MalformedPolicyDocument; 
                                                                                 Request ID: {リクエストID} 
                                                                                 ; Proxy: null)          

```
Qiitaではスクロールする必要があるが、このレイアウトでエラーが出る。どうやらRoleの設定がうまくいっていないらしい。さらにその原因は`template.yaml`がどこかおかしいことにある。
それではどこがおかしかったか。

#エラー原因
```template.yaml
Policies:
        Statement:
          Action:['s3:*']
          Effect:Allow
          Resource:'*'
```
エラーの原因はここである。何がおかしいのか？それは
`:`の後ろにスペースがないからである。色を見ればわかるが全てブルーになっている。正しくは

```template.yaml
Policies:
        Statement:
          Action: ['s3:*']
          Effect: Allow
          Resource: '*'
```
こうである。
#エラー解決方法
スペースを入れる。
集合の相等

>※達人に学ぶSQL徹底指南書 第2版 のまとめノートです。


- シチュエーション
    - DB環境のバックアップの際に集合が等しいか調べる


- ①かっちょよく言うと、unionの冪等性「S UNION S = S」を利用する。
- 結合する前の行数と結合後の行数が一致しているので等しい集合といえる。

```
SELECT count(*)
from(
SELECT *
from tbl_a
UNION
SELECT *
from tbl_b) as uni
```

- ②(A∩B) = (A∪B) = A = Bを利用する

```
SELECT case WHEN count(*) = 0 then '集合は等しい'
else '集合は等しくない' end as 集合の相等判定
from
((SELECT * from tbl_a
UNION
SELECT * from tbl_b)
EXCEPT
(SELECT * from tbl_a
INTERSECT
SELECT * from tbl_b)) as tmp;
```

- 排他的和集合を求めることで2つの集合の異なる部分を取得できる
- A⊂Bのような包含関係があっても片方が空集合になるだけで機能する
 
```
(SELECT * from tbl_a
EXCEPT
SELECT * from tbl_b)
UNION ALL
(SELECT * from tbl_b
EXCEPT
SELECT * from tbl_a)
```
LIFE WILL Emodiversity APIを使うときに参考になりそうな記事まとめ

# はじめに
Twitterの投稿内容から感情を解析し、「ユーザーに⾜りていない感情」を診断。その結果から⾃分がよりWell-beingになるための場所や街、物件情報を全国約1800市区町村の中からレコメンドするサービスのプロトタイプ「LIFE WILL」。
https://lab.lifull.com/lifewill/

その心臓部である感情解析エンジンが「Emodiversity API」としてAPI化されました。
他とは少し毛の違うテキスト感情解析APIとして、ご自身の作品制作などにご利用ください。

# デモサイト
まずはここでどういうことができそうかお試しください。
https://lab.lifull.com/lifewill/emodiversity/

# APIドキュメント
使い方はこのページをご覧ください。
APIトークンの申請方法も書いてあります。
https://lab.lifull.com/lifewill/emodiversity/api-docs/

# LIFE WILL Emodiversity APIについて
LIFE WILLの開発経緯やEmodiversity（エモダイバーシティ）という概念、エンジンのロジックなどについてまとめた資料です。理解を深めていただくためにお読みになっていただけるとうれしいです。

# さっそく使ってくれた方
Emodiversity APIに関する記事を見つけたら、勝手にアップしてゆきます。

## 株式会社LIFULLさんのEmodiversityAPIをPostmanでためしてみた｜デジタルライト(Digital-light.jp)
https://digital-light.jp/2021/10/28/tested-lifull-emodiversityapi-by-postman/

## Node-REDからLIFEWILL-EmodiversityAPIにテキスト文書を送る方法｜デジタルライト(Digital-light.jp)
https://digital-light.jp/2021/10/28/how-to-use-emodiversityapi-by-node-red/

## LIFE WILL Emodiversity APIのemotion_analyzeを使ってみたメモ
https://qiita.com/wakasamasao/items/4cafcd75cfa2b8a821d0

## LIFE WILL Emodiversity APIのemotion_mapを使ってみたメモ
https://qiita.com/wakasamasao/items/902da791e99764086904

# 何か作ったら「ヒーローズリーグ」にエントリーしよう！
Emodiversity APIを使って何かができら、このイベントに是非エントリーしてください！（締切：2021年11月15日）
https://heroes-league.net/

## できたもの
https://protopedia.net/material/712
リリース／デプロイ方法の色々

よく聞くけど言葉としては整理してなかった運用についてメモしてみる。

# ブルーグリーンデプロイメント

2つの本番環境をブルー／グリーンとして、
本番環境を交互に切り替える方法。

ブルー環境がアクティブな本番環境とき、
グリーン環境に新機能をリリース後に
ロードバランサーなどによってアクティブ本番環境を切り替えることで
スムーズな本番切り替えができる。

[Red Hatのブルーグリーン・デプロイメントとは](https://www.redhat.com/ja/topics/devops/what-is-blue-green-deployment)の図がわかりやすい。

※切り替えの一瞬だけがどのサーバーにも接続しない時間となり、ダウンタイムはほぼゼロ。

# カナリアデプロイ

一部のユーザーのみ利用できるようにリリースして、
新機能のテストを行って問題がなければ公開する方法。

2つの本番環境があれば、
1つのサーバーに新機能をリリースしてテストを行う。
ここで問題が発生すれば前のバージョンに戻す。

### 気になっている部分

テストを行うところがブルーグリーンとの違い。
デプロイ後の軽い動作確認ではなく、
一部のユーザーが利用できる状態の本番環境で
念入りにテストする期間を一定期間つくると計画するところが違うのだろうか。

# ローリングデプロイメント

複数のサーバーがある状態で、
サーバーをロードバランサーから1台ずつ切り離して順にデプロイ方法。

常にいずれかのサーバーには割り振られる状態を作ることができる。

※デプロイ中もいずれかのサーバーには接続できるので、ダウンタイムゼロ。
【Power Apps】困った時にどこを調べるかを自分の場合をまとめてみた

####先ずはGoogle検索
　　私のような初心者が躓くところ、すぐにわからなくなるところ、
　　めったに触らないところの疑問はこの段階で解決できるように感じます。
　　先人のみなさんが記事を書いてくださった（くださっている）おかげです。

　　よくやってしまうのは、日本語で検索して終わりにしてしまうことです。
　　社内でこの記事は見た？と英語の記事を共有してもらうことがあり
　　その度に「お恥ずかしい」となっています。。
　　英単語でキーワードがHITしないか確認する習慣付けが大事だと思っています。

####Docs
　　各プロパティの設定要領などはDocsを参照します。これは他の365のサービスでも同じですね。

####Learn
　　実はLearnの教材にもヒントがありました。初学時はLearnを見ていましたが
　　Appsのアプリを触ってばかりで学習を疎かにしていたな、という気づきがありました。

https://qiita.com/negimijin/items/6d189cdb6d861e33b018

####コミュニティの投稿
　　これまでに挙げたところで解決の糸口が見つからなければ
　　Power Apps（https://powerapps.microsoft.com/ja-jp/ ）のコミュニティから、
　　フォーラムの投稿を探すという手段も教わりました。（こちらも英単語で検索必須）

![ヘッダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1469675/a449231e-31ec-69fa-68ee-abe44bc21c66.png)

####（これから）Youtubeも見る習慣をつけたい
　　MVPの石川さんの勉強会で教わって実践できていないのですがYoutubeの動画が豊富なのだそうです！
　　チャンネル登録をしてそのままなので視聴していきたいと思ってます。

https://www.youtube.com/watch?v=7ZlXrbsahH0&t=2s
【Java】BigDecimal

# BigDecimalとは
- 誤差が出ないように正確に計算するためのクラス
- 四捨五入などの丸め処理ができる
- 桁数の指定ができる

## BigDecimalを使わない場合にどのような誤差が出るのか
```.java
import java.math.BigDecimal;

public class Main {
  public static void main(String[] args) {
    // BigDecimalを使わない場合
    System.out.println(1 - 0.9); // 0.09999999999999998

    // BigDecimalを使う場合
    BigDecimal number1 = BigDecimal.valueOf(1);
    BigDecimal number2 = BigDecimal.valueOf(0.9);
    System.out.println(number1.subtract(number2)); // 0.1
  }
}
```
iOS(Swift)リンク集

個人的な雑多リンク集です。

## 画像

https://qiita.com/MaShunzhe/items/ca0fa7874b1744d1218f

## API

https://qiita.com/shiz/items/09523baf7d1cd37f6dee

https://developers.google.com/calendar/api

https://developers.google.com/workspace/guides/ios?hl=ja

## AppStore

https://qiita.com/Labi/items/033631ecb6b8d99c73cd

https://qiita.com/Labi/items/3b71b8f5ef065904c1de

https://zenn.dev/moutend/articles/feebf0120dce6e6426fa

https://www.bravesoft.co.jp/blog/archives/4838

https://itblogdsi.blog.fc2.com/blog-entry-190.html

## UI

https://www.youtube.com/watch?v=oobm2y-d17E

https://developer.apple.com/jp/design/tips/

# Data

https://qiita.com/Takarkiz/items/0670fb4b9298cb328f6a

https://qiita.com/uhooi/items/429cac9b798b9c0937ae


## CollectoinView

https://stackoverflow.com/questions/39080807/drag-and-reorder-uicollectionview-with-sections/39088025#39088025

[Supporting Drag and Drop in Collection Views](
https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/supporting_drag_and_drop_in_collection_views)

https://phosphor-bronze.blogspot.com/2018/07/uicollectionviewios11.html

※配列の要素の交換は`swapAt(i, j)`で可能

https://qiita.com/takehilo/items/06a9ec7ec634d86bd734

https://naoya-ono.com/swift/swift-collection-view-basic/?utm_source=pocket_mylist

https://developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40012334-CH1-SW1

https://qiita.com/tosh_3/items/cf69712776077c7f2558

https://techlife.cookpad.com/entry/2019/08/16/090000

https://rara-world.com/swift-collection-view-programming/

https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/layouts/customizing_collection_view_layouts

https://techlife.cookpad.com/entry/2017/06/29/190000

https://qiita.com/takehilo/items/d49069572c848df9258a

https://developer.apple.com/documentation/uikit/uicollectionview/

https://developer.apple.com/videos/play/wwdc2018/225

## Modal / Unwind Segue

https://www.youtube.com/watch?v=-glB-2fV_z4&t=4s

https://www.youtube.com/watch?v=pclvkBlv5pA&t=192s

## UIScrollView

https://qiita.com/Swift-User/items/67a5dd3d9eabf513aa2c

## Tool

https://qiita.com/uhooi/items/bf888b53b4b8210108aa



## Job

https://qiita.com/lovee/items/d76c68341ec3e7beb611

https://note.com/sakiyamak/n/n83edf2a3f7bf

## Xcode

https://qiita.com/water_bath/items/ca2934918f238f915abd

https://shtnkgm.com/blog/2021-08-18-ios15.html

https://dev.classmethod.jp/articles/xcode-trim-whitespace-only-lines/

https://swift-ios.keicode.com/devenv/xcode-how-to-build-for-12-with-xcode11.php
ユーザーフォームの各フォームのフォーカス切替で色を変える

これの最後に添えてたフォーカス切り替えで着色するやつ

https://qiita.com/taleau/items/6b63e3eb1d8ae7926446



## ユーザーフォーム

1. `〆切日`というフォームが選択されたら`Focus`という着色プロシージャを呼び
1. 選択が外れたら`UnFocus`を呼ぶ
1. 入力無しで離れようとしたら`ErrFocus`という別の着色プロシージャを呼ぶ

というもの

``` vb
Private Sub 〆切日_Enter()
  Call Focus(〆切日)
End Sub
Private Sub 〆切日_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  Call UnFocus(〆切日)
  With 〆切日
    If .Text = "" Then
      MsgBox "仮でもいいので選択してください。"
      Call ErrFocus(〆切日)
      Cancel = True
    End If
  End With
End Sub
```

## 標準モジュール
`BackColor`と`ForeColor`に好きな色を置いておくだけで
すべてのユーザーフォーム、すべてのフォームで統一感のある着色が簡単にできる

``` vb
' 入力フォームのフォーカス切り替え
Sub Focus(ByVal obj As Object)
  With obj
    .BackColor = rgbPaleGoldenrod
    .ForeColor = vbBlack
  End With
End Sub

Sub UnFocus(ByVal obj As Object)
  With obj
   .BackColor = rgbGray
   .ForeColor = vbWhite
  End With
End Sub

Sub ErrFocus(ByVal obj As Object)
  With obj
   .BackColor = rgbRed
   .ForeColor = vbWhite
  End With
End Sub

```
ExecJSが自動で選択するランタイムはどのように決まるのか

ExecJSはRubyからJavaScriptのプログラムを実行できるようにしてくれますが、プログラムを実行するランタイムは以下のようにベストなものを自動で選択してくれるようです。

> It automatically picks the best runtime available to evaluate your JavaScript program

逆に自分が意図したランタイムを設定したいときにはどうしたらいいのか、どう自動で選択してくれているのかが気になったので確認してみました。

https://github.com/rails/execjs

## version

execjs v2.8.1

## 結論

意図したものを選択させるには以下のどちらかを行う

:::note
* 環境変数 (`EXECJS_RUNTIME`) を設定する
* 自動読み込みの優先順位を確認し、他に優先度が高いランタイムが存在しないか確認する
:::

## ランタイムの読み込み部分のコードを読んでいく

ExecJSのコードはとてもシンプルなので、コードを読むのが早いです。

```rb:lib/execjs.rb
module ExecJS
  self.runtime ||= Runtimes.autodetect
end
```

まず`lib/execjs.rb`を見て、Runtimes.autodetect で自動検出していそうなので、[lib/execjs/runtimes.rb#L56](https://github.com/rails/execjs/blob/v2.8.1/lib/execjs/runtimes.rb#L56)を見てみます。

```rb:lib/execjs/runtimes.rb
  from_environment || best_available ||
```

すると`from_environment`で環境変数(`ENV["EXECJS_RUNTIME"]`)が設定されていたらそれを参照し、適切なランタイムが見つからなかったらその後有効なもの見ているようです。

```rb
    def self.best_available
      runtimes.reject(&:deprecated?).find(&:available?)
    end

    def self.runtimes
      @runtimes ||= [
        RubyRhino,
        Duktape,
        MiniRacer,
        Node,
        JavaScriptCore,
        SpiderMonkey,
        JScript,
        V8
      ]
    end
```

`best_available`はシンプルにランタイムが配列で一覧化されていて、順に有効なものを探しているようです。
そのため、例えばNodeのランタイムが有効だったとしても、MiniRacerが有効であれば、MiniRacerが優先されるようです。
最新のcommitに入れ忘れた変更を入れ直すコマンド

# はじめに

皆さんはGitを使う際、一部変更を入れ忘れてcommitしてしまうことはありますか？私は比較的よくあります。
私はこれまで変更を入れ直す際、`git log`してコミットメッセージを取得して、`git add`して(実際はVSCodeの機能を使うことが殆どなのですが…)、`git commit --amend -m ...`としていたのですが、よく考えればそれ用のコマンドを作れば楽なのでは？と思い、コマンドを作成してみました。

# コマンド
```bash
git log --oneline -n 1 | sed -r 's/^[0-9a-f]+ //' | xargs -I message git commit --amend -m message
```

# 解説

## `git log --oneline -n 1`

`git log`でgitのコミットログを見ることができます。
`--oneline`オプションで、各commitが1行で表示されるようになります。
`-n 1`で最新の1コミットのみを表示させることができます。
これによって、最新のコミット1つ1行を取得でき、これを次のコマンドに送り処理する下準備ができます。

## `sed -r 's/^[0-9a-f]+ //'`

先のコマンドで取得した文字列は、`1a2b3c4 コミットメッセージ`のように、ハッシュ値が付いたコミットメッセージになっています。今回コミットメッセージ(+その直後のスペース)を取り除きたいので、更に処理を加えます。
`sed`はストリームエディタで、複数行の入力に対し処理を行う際に重宝するコマンドです。今回は文字列の一部削除に利用しています。詳しくは他に良い記事があるのでそちらに譲ります。
`-r`オプションはsedのコマンドで正規表現を使うという意味になります。
`'s/^[0-9a-f]+ //'`は、ざっくり説明すると「行先頭の0-9a-fでできた文字列と、その次の半角スペースを、空文字列で置換する」というコマンドです。
これによって、純粋な最新のコミットメッセージを次のコマンドに送ることができるようになりました。

## `xargs -I message git commit --amend -m message`

先のコマンドで生成した純粋なコミットメッセージを使って、`git commit --amend`を行います。
`xargs -I message`は、パイプで送られてきた文字列を以降のコマンドの`message`の箇所で利用するというものになります。
なので、以降の`git commit --amend -m message`は実行され、そのコミットメッセージはここまでの処理で作られている最新のコミットメッセージになります。

# 最後に

このコマンドは`alias`にもできるので、宜しければご利用下さい。
【個人開発】日常で生まれる悩みや不安を全て筋トレで解決するアプリを作ってみた。

# はじめに
いきなりですが、普段の生活の中で悩みや不安を抱えていませんか？
金銭的な悩みや友人などとの人間関係の悩み、将来のことなど、悩みは人様々だと思います。

そんな悩みや不安を解消したい、または少しでも軽くしたい思ったことはありませんか？

そこで、悩みや不安の解決方法を提示するアプリ**MUKINATOR（ムキネイター）**を作りました。

https://mukinator.com/


# アプリの概要
悩みのカテゴリー→悩みの順に選択すると、その悩みの解決方法とその理由を提示します。

# 機能
### 解決策の提示
悩みを選択するとその悩みに対する解決方法と、その解決方法である理由が出てくるようになっています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1629690/e70226cd-1f25-4116-6f0d-a3a0b17fcfeb.png">

### 筋トレ名言の表示
結果ページの前のローディングページではランダムで筋トレ名言を表示させています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1629690/a8ba9a79-a89b-61c3-9856-365e67c1033e.png">

### YouTube動画の表示
rakeタスクの中でYouTube Data APIを使ってYouTubeから動画を取得し、結果ページで表示しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1629690/e509d307-4020-a4a8-fb90-18ffb28dbe46.png">

### Twitterシェア
悩みの解決方法が分かったら他の人にシェアできるようにtwitterシェアもつけています。

https://twitter.com/takemuu_pote/status/1456172680701362179?s=21

# 使用技術
### バックエンド
- Ruby 2.6.6
- Rails 6.0.3

### フロントエンド
- HTML
- CSS
- jQuery
- BULMA

### 主要なgem
- rubocop
- seed_fu
- google-api-client
- meta_tags
- better_errors
- pry-byebug

### デプロイ
Heroku

### データベース
MySQL 8.0.26



# 工夫した点
### 世界観
ユーザーに**「筋トレ」**のインパクトを与えるための工夫をしました。
背景を暗くして、画像もイラストではなく実物のものを使い迫力が出るようにしました。
フォントはGoogle Fontsを使っています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1629690/158731f1-1b56-37bd-bff3-db64a75ca29f.png">



### 悩み選択ページの実装
悩み選択ページでは、カテゴリー選択ページで選択したカテゴリーの悩みが表示されます。
（例：カテゴリーがキャリアならキャリアの悩み）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1629690/24b30127-a45d-2555-d52b-9b33a765e118.png"">

このページは選択肢を１つずつ書くことはせず、またカテゴリーごとにファイルを作らずに１つのviewファイルで表示させています。
選択肢はseed_fuを使って初期データとしてDBに格納しています。また、悩みはそれぞれどのカテゴリーに属するかの情報を持っています。
<br>

```results_controller.rb
  def trouble_select
    # params[:kind]にはユーザーが選択した悩みのカテゴリーのデータが入っている
    if params[:kind].present?
      # 渡ってきたパラメータを使いDBからそのカテゴリーの悩みを取得
      @troubles = Trouble.where(kind: params[:kind])
    else
       略
    end
  end

```
<br>

```trouble_select.html.erb
<%= form_with url: results_path, local: true do |f| %>
    <!-- @troublesに特定の毛テゴりーの悩みが入っていて、１つずつ取り出して表示 -->
 　　　　　　<% @troubles.each do |trouble| %>
     　　　　　　　　　　<%= f.radio_button :trouble_id, trouble.id %>
          <%= f.label :trouble_id, trouble.name, value: trouble.id %>
  　 <% end %>
<% end %>

```
<br>

選択されたカテゴリーの悩みを全て取得してviewに渡しています。
それらをeach文で表示させています。

こうしておけば、viewファイルのコード量が減るのと、悩みを追加するときにseedにデータに追記して読み込ませるだけで済みます。

# 最後に
開発する過程で多くの方からフィードバックをいただき、このアプリを作り終えることができました。
アプリを最初から作るのは今回が初めてでしたが、楽しみながら作れたこと、たくさんの方に使っていただけたことを大変嬉しく思います。

日常生活の中で何かに取り組めば必ずと言っていいほど悩みや不安が生まれてくると思います。
そんなときは考え込まず、「MUKINATOR」と「筋トレ」を活用してみてください。
悩みや不安が少しでも軽減され、みなさんの日々がより良いものになることを願っています。

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

##### それでは、素敵な筋肉ライフを！💪

https://mukinator.com/

Twitter
https://twitter.com/takemuu_pote
Canvas LMSのクイズを一部の履修者に再受験させる

# 背景・目的
* Canvas LMSで１回しか受験できないクイズを、別のクイズと誤って受験してしまった履修者が発生した。
* 不正行為などの疑いはないので、再受験を許可したい。
* ただし、問題を見てしまっているので、他の受験生との不公平を解消するため、一部、別の問題に差し替えたい。
    * 差し替えなくて良い問題もある。例えば、別途提供しているクイズから再出題している問題など。

# 考え方
* Canvas には、クイズを複製する機能はない。
* 任意の科目Ａの内容を、Ａ自身にインポートすることは可能なので、複製に使える。（項目によっては上書きされてしまうかもしれないので、注意深くやる必要はある）

# 対応方法
* インポート機能で、同じ科目の該当するクイズをインポートする（結果以外がそのままコピーされる）。
    * インポートを繰り返すと、２回目からは、前回インポートしたコンテンツを上書きする。
        * **前回インポートしたページを編集したり、タイトルを変えたりしても、確認なく上書きされるので要注意！**
            * 原本の内容に上書きされ、前回インポート後の更新内容はどこにも記録されることなく失われる。
        * ３つ目のコピーを作りたいときは、元のページではなく、コピーしたページをインポートすれば、新たに３番目のページが生成される。
* 受験者の割り当てを、再受験を許可する学生だけに設定。
* 問題を編集
* 公開する
UnityTimeline関連のコードがストリップされ、正常に再生されなくなる現象

# タイムラインが正常に再生されなくなる現象が発生する条件
- タイムラインアセットをビルドインに含めていない
- AssetBundleをダウンロードしてタイムラインアセットを利用している
- IL2CPPでビルドしている

# 原因
タイムライン内部で使用しているクラスが、UnityEngine.Timelineモジュール外で呼び出されることがなく、
ビルド時に不要なコードと判定されコンパイルされなくなる。
そのため、タイムライン再生時にスクリプトがmissingになってしまう。

# 対策にあたって
公式ドキュメント
・ [IL2CPP を使ったマネージバイトコードストリッピング](https://docs.unity3d.com/ja/2018.4/Manual/IL2CPP-BytecodeStripping.html)
・ [link.xml指定方法](https://docs.unity3d.com/ja/2019.4/Manual/ManagedCodeStripping.html)

link.xmlにタイムライン関連のクラスを記述してビルド時にストリップされないようにする。

以下の記事を参考にして、アセットから使用しているスクリプトを取得して自動でlink.xmlを作成するようにもともと設定していた。
>テラシュールブログ様
>[【Unity】AssetBundleが使用しているアセット一覧を渡してlink.xmlを生成する](https://tsubakit1.hateblo.jp/entry/2019/11/02/205745)

しかし、タイムラインアセットで使用しているタイプは上記で紹介されているコードで取得できなかった。

手動でUnityEngine.Timelineをlink.xmlに追加してビルドして確認したところ正常に再生できた。

```
<assembly fullname="Unity.Timeline, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
```

手動で追加してしまうと、テラシュールブログ様が紹介しているlink.xml自動生成の方法を用いたときに、
消えてしまうので、コードをお借りしてアセンブリを丸々指定する処理を追加。
[オリジナル](https://gist.github.com/tsubaki/2ce4ed3ef178f5030b55439d9a10caf3)
[処理を追加したもの](https://gist.github.com/k-okawa/fda0da9bf9c557388b54c226e761b6a6)

## サンプル
```csharp
var generator = new LinkXmlGenerator();
// UnityEditor.Animations.AnimatorControllerを取得してしまうので、RuntimeAnimatorControllerに変更
generator.SetTypeConversion(typeof(UnityEditor.Animations.AnimatorController), typeof(RuntimeAnimatorController));

// AssetBundleNameを持つアセットを全て取得して、LinkXmlGeneratorに登録する。
foreach (var bundleName in AssetDatabase.GetAllAssetBundleNames()) {
    var assetPaths = AssetDatabase.GetAssetPathsFromAssetBundle(bundleName);
    generator.AddAssets(assetPaths);
}

// タイムライン関連を追加
Assembly asm = Assembly.Load("Unity.Timeline");
generator.AddAssembly(asm);

// link.xmlファイルを保存
generator.Save("Assets/link.xml");
AssetDatabase.Refresh();
```
コンボボックスを使って簡易カレンダーフォームを作成する




## ユーザーフォーム
こんなコンボボックスを入れておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/70cead84-4992-76d2-a318-cec2f88fd12b.png)

コンボボックスの名前は「〆切日」としておき、`カレンダーリスト作成`の引数にぶち込む
あと２つの引数は

- 今日から数えた日数
- 土日を含むか否か

``` vb
Private Sub UserForm_Initialize()
  ' その他処理
  Call カレンダーリスト作成(〆切日, 180, False)
End Sub
```

### 標準モジュール

``` vb
Option Explicit

Sub カレンダーリスト作成(ByVal obj As Object, 日数, 土日を含むか As Boolean)
  Dim myDate, i
  With obj
      For i = 0 To 日数
        myDate = DateAdd("d", i, Date)
        If 土日判定(myDate) = True Then
          .AddItem 曜日付与(myDate)
        End If
      Next
  End With
End Sub

Private Function 曜日付与(myDate) As String
  Dim 曜日
  曜日 = WeekdayName(Weekday(myDate), True)
  曜日 = "(" & 曜日 & ")"
  曜日付与 = myDate & 曜日
End Function

Private Function 土日判定(myDate) As Boolean
  Dim 曜日
  Dim flg As Boolean
  曜日 = WeekdayName(Weekday(myDate), True)
  Select Case 曜日
    Case "土", "日": flg = False
    Case Else: flg = True
  End Select
  土日判定 = flg
End Function
``` 

## おまけ 日付の形式変換関数

``` vb
Function Date2yymmdd(myDate)
  Dim myDt As String
  myDate = Split(myDate, "(")(0)
  myDt = Format(myDate, "yymmdd")
  Date2yymmdd = myDt
  
End Function

Function yymmdd2Date(yymmdd)
  Dim myDt As Date
  myDt = Format(yymmdd, "@@@@/@@/@@")
  yymmdd2Date = 曜日付与(myDt)

End Function
```

## 実行するとこんな感じ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/cf631d06-4ba9-bcd1-2006-cfd223ddf502.png)

背景が黄色っぽくなってるのは、フォーカス時のみ色を変える別のコード使ってます

https://qiita.com/taleau/items/b35f784bac1e94279d0f



リストボックスと比べてコンボボックスだといちいち開きにいかなきゃなのが面倒だけど、
ユーザーフォーム全体のサイズ感はコンパクトになるという利点はあるので好き好きで。
TypeScript Playgroundでimportが使える、ATAって何？

10月に[Type or Treat Challenges](https://devblogs.microsoft.com/typescript/type-treat-2021-day-1/)というのがありました。これはこれで面白いと思うので、やってみてください。

今回のテーマはその時に見つけたATAというものです。

[Day 1 Challenges](https://www.typescriptlang.org/play?#gist/927ccc66ae3022dc64c4f650109b937a-1)の課題を開くと、

```ts
import {typeifyAPI} from "type-or-treat"
```

というimport文があります。おおお、importって使えるのか、と今さらながら知りました。

consoleを覗いてみると、

```
ATA start
...
ATA done
```

というのを見つけました。ATAって何でしょう？

色々検索したところ、

https://github.com/microsoft/TypeScript-Website/tree/v2/packages/ata

これを見つけました。"Automatic Type Acquisition"の略のようです。なんとnpm上のバージョンやタグも指定することができるようです。

何か具体的なもので試してみましょう。jotaiを題材にしてみましょう。

https://jotai.pmnd.rs

まず、import。できちゃいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63327/859e71bb-e65c-8785-e1c2-5352c96296d3.png)

`countAtom`を定義してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63327/e908aaad-077f-7a06-c3f9-172b6bd48155.png)

マウスオーバーすると、ちゃんと型が取れてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63327/240b57b6-8fa4-07bc-0d03-233fd8100462.png)

この型は、PrimitiveAtomなのですが、そう表示はされないんですね。改善の余地ありです。

続いて`doubledCountAtom`を定義してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63327/6e457ede-d0b5-f86a-1240-f23ea928e126.png)

read-only atomとしてちゃんと型推論できていることが確認できます。

これは便利ですね。今までコピペしていたりしたのが不要になり、楽です。

jsdeliverを使っているらしいですが、欲を言えば、npm packageをURLで直接指定できると、publishしなくても使えてより便利かも。

以上、小ネタでした。
JScriptでサウンド再生

#wavファイルの再生

```wmp.js
wmp = new ActiveXObject("WMPlayer.OCX");
wmp.URL = "C:\\Windows\\Media\\tada.wav";
wmp.Controls.play();
WScript.Sleep(2000);
```

#wavファイルを作成して再生
wavファイルのイメージをメモリに作っても直接再生する手段は無さそうなので、wavファイルを作成して再生する。
##pipo

```pipo.js
adTypeBinary = 1
adTypeText = 2
adSaveCreateNotExist = 1
adSaveCreateOverWrite = 2

function word(x) { return num_le(x, 2); }
function dword(x) { return num_le(x, 4); }
function num_le(x, n) {
	b = "";
	for (var i = 0; i < n; i++) {
		b += String.fromCharCode(x & 0xff);
		x >>>= 8;
	}
	return b;
}

function main() {
	b = "";
	b += "RIFF";
	b += dword(36 + 4000);
	b += "WAVE";
	b += "fmt ";
	b += dword(16);
	b += word(1);
	b += word(1);
	b += dword(8000);
	b += dword(8000);
	b += word(1);
	b += word(8);
	b += "data";
	b += dword(4000);
	for (var i = 0; i < 500; i++) b += "\x90\x90\x70\x70";
	for (var i = 0; i < 250; i++) b += "\x90\x90\x90\x90\x70\x70\x70\x70";

	st = new ActiveXObject("ADODB.Stream");
	st.Charset = "iso-8859-1";
	st.Type = adTypeText;
	st.Open();
	st.WriteText(b);
	st.SaveToFile("pipo.wav", adSaveCreateOverWrite);
	st.Close();

	wmp = new ActiveXObject("WMPlayer.OCX");
	wmp.URL = "pipo.wav";
	wmp.Controls.play();
	WScript.Sleep(1000);
}

main();
```

##coin

```coin.js
adTypeBinary = 1;
adTypeText = 2;
adSaveCreateNotExist = 1;
adSaveCreateOverWrite = 2;

SAMPLE_RATE = 48000;
DATA_LEN = Math.floor(SAMPLE_RATE * 1.1);

function main() {
    b = "";
    b += "RIFF";
    b += dword(36 + DATA_LEN);
    b += "WAVE";
    b += "fmt ";
    b += dword(16);
    b += word(1);
    b += word(1);
    b += dword(SAMPLE_RATE);
    b += dword(SAMPLE_RATE);
    b += word(1);
    b += word(8);
    b += "data";
    b += dword(DATA_LEN);
    b += tone(83, .1);
    b += tone(88, 1);

    st = new ActiveXObject("ADODB.Stream");
    st.Charset = "iso-8859-1";
    st.Type = adTypeText;
    st.Open();
    st.WriteText(b);
    st.SaveToFile("coin.wav", adSaveCreateOverWrite);
    st.Close();

    wmp = new ActiveXObject("WMPlayer.OCX");
    wmp.URL = "coin.wav";
    wmp.Controls.play();
    WScript.Sleep(1500);
}

function word(x) { return num_le(x, 2); }
function dword(x) { return num_le(x, 4); }
function num_le(x, n) {
    b = "";
    for (i = 0; i < n; i++) {
        b += String.fromCharCode(x & 0xff);
        x >>>= 8;
    }
    return b;
}

function tone(note, sec) {
    freq = 440 * Math.pow(2, (note - 69) / 12);
    len = SAMPLE_RATE * sec;
    t = 0;
    lv = SAMPLE_RATE * 16;
    b = "";
    for (i = 0; i < len; i++) {
        h = Math.floor(lv / SAMPLE_RATE);
        lv -= 16;
        c = 0x80 + ((t < SAMPLE_RATE/2) ? h : -h);
        b += String.fromCharCode(c);
        t = (t + freq) % SAMPLE_RATE;
    }
    return b;
}

main();
```
【Rails】いいね一覧について

## はじめに
いいね機能を非同期通信で実装して、いいね一覧を作成した際に、
いいね一覧でいいねをはずしたときは、一覧から消えて欲しいなーと思い実装を試みたので、備忘録です。
色々話を聞いて完成に持っていくことができました。一部抜粋して今回の記事にしています。
いいね機能、いいねの非同期通信、いいね一覧表示については他にも記事が多くあるので、割愛します。
割愛した部分、下記を参考にして実装しました。実装完了後に今回の実装を行います。

https://qiita.com/ki_87/items/d0cf341aac9c0f1fd73a

https://qiita.com/ki_87/items/ba7de81d637aaf85e561

## 実装完成形

現在がこちら
![Qiitaいいね.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1994509/9ab62fc3-9c62-250c-8e1c-01a52705d71f.gif)

完成形がこちら
![Qiitaいいね2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1994509/3e4248ac-d5f8-3c32-c3fd-1ac5233ec0bd.gif)


## 実装

まずは、一覧の表示方法を変えます。

```app/views/users/favorites.html.erb
<h1>いいね一覧</h1>
<div>
  <% @favorite_posts.each do |post| %>
    <div><%=post.title %></div>
    <div id="post_<%= post.id %>"><%= render "favorites/favorite", post: post %>
  <% end %>
</div>

↓

<h1>いいね一覧</h1>
<div>
  <% @favorite_posts.each do |post| %>
    <%= render 'users/favorite_content', post: post %>
  <% end %>
</div>
```
eachの中を部分テンプレートで作成しています。
「users」のフォルダの中に「favorite_content」というファイルを作成しているので
ファイル名はなんでも大丈夫です。
そして「favorite_content」の中身がこちら

```app/views/users/_favorites_content.html.erb
<div id="favorite_list_<%= post.id %>">
  <div><%=post.title %></div>
  <div id="post_<%= post.id %>"><%= render "favorites/favorite", post: post %></div>
</div>
```
ここで「id="favorite_list_<%= post.id %>"」を追記していますが、関連する記述がこちら

```app/views/favorites/destroy.js.erb
$("#favorite_list_<%= @post.id %>").remove();  ・・・追記
$("#post_<%= @post.id %>").html("<%= j(render "favorites/favorite", post: @post) %>");
```

removeメソッドは、いいねが「destroy」されたときに「favorite_list_<%= @post.id %>」を削除する記述です。
今回の場合、eachの中身一つ一つに設定されてため、いいねをはずしたときにその一つを削除しているイメージだと思っています。

これで最初にあげた完成形になりました。
私はユーザー一覧に自分の投稿、フォロワーの投稿、いいね一覧をタブで切り替えれるようにしていたので、いいねしたとき、はずしたときの動きがなかなかうまくいきませんでした。（その記事は時間があるときに書けたら書きます。）
記述するところは少ないのですが、理解が足りなかったため、結構時間がかかってしまいましたが、これをきっかけに理解が深まった気がするので、結果的にはよかったということにしましょう。
仮想化環境のクラスタ

## ESXiのクラスタ
ESXiホストを冗長化構成し、論理化すること
ESXiホストの停止などの障害に対応できないため、クラスタ構成にし、耐障害性を担保する
WSFCとは異なり、コンピューティングリソースをホスト同士で共有する形で耐障害性を担保している

## vSphere HA
自動で（障害を検知する）ESXiホストがダウンしたことを検知して、障害が発生したホスト上にある仮想マシンを別のESXiホストにフェイルオーバーする
ダウンタイムは発生してしまう、ただし最小限のダウンタイム

### 障害を検知する仕組み

![スクリーンショット 2021-11-05 15.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/60f0161a-23fa-ec62-849a-02517996751d.png)

#### ネットワークハートビート
クラスタに1台マスタノードとスレーブノードの間で疎通確認が行われる
疎通確認が取れなくなった時点で検知ということになる
この検知方法をネットワークハートビートと呼ぶ

#### データストアハートビート
ネットワークハートビートで障害を検知した際に、データストア上のファイルに各ホストがアクセスし、障害を検知する方法

②死活監視アドレス
デフォルトではデフォルトゲートウェイに対して疎通確認を行いネットワーク障害を検知する方法
※デフォルトゲートウェイは通常ルーターのアドレス

デフォルトでは①,③を使用して死活監視を行ってます
でもこれではアイソレーション(孤立状態)を検知できない
②も追加設定して誤検知も防ぐ

フェイルオーバー：障害が発生した際に切り替えること
HA(High Availability)高可用性：ダウンタイムを最小限にする(障害対策)システム

### アドミッションコントロール
フェイルオーバーに必要な計算リソースを予約する機能

![スクリーンショット 2021-11-08 13.37.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/7133fee5-6cbd-b81e-f937-37cd366c6d18.png)

フェイルオーバー先の計算リソースを予約することで、フェイルオーバー時に計算リソース不足を回避する

CPU,メモリを総じて計算リソースと呼ぶ
vSphere HA
ESXiホストがダウンした際に正常なホストにて仮想マシンを再起動(フェイルオーバー)する機能
仮想マシン起動させるために使用するのが計算リソース

CPUは割り当て200～300%でもパフォーマンス低下につながりにくい(オーバーコミット可能)
メモリは使用率100%超えて使用するオーバーコミットができない(大幅なパフォーマンス低下を招く)

### vSphere FT
ダウンタイム無しで復旧、停止することなくフェイルオーバーする
　※vSphere環境で制限あり（使えない機能が出てくる、代表例スナップショット）
　※vSphere HAが有効であること(前提)

HAかFTを使用して仮想マシンを保護する

仮想マシンをプライマリ,セカンダリの2台構成で稼働させることによってダウンタイムをなしにする機能
セカンダリがプライマリに昇格することでダウンタイムはゼロ
ただし、ハードウェアリソース(CPU,メモリ,HDD)を2倍消費

![スクリーンショット 2021-11-05 15.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/56446070-6332-e69b-5f4b-bfe67c5012f7.png)

FTはONOFFの設定は自由にできる

例えば、年末に業務システムが一番使われるとしたら、その時期だけFTにして可用性を向上させるという使い方

## メンテナンスモード
クラスタとして構成していてもコンピューティングリソースの共有を外すことができる
デメリットとしてはメンテナンスモードを適用したホスト上では仮想マシンを起動することはできない

## クラスタの設定
![スクリーンショット 2021-11-08 13.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/d7ad0349-6368-0dd9-3ebc-3d9dbaeb035e.png)

障害発生時の対応方法を選択することができる
Reactがv17のうちはReact.FCではなくVFCを使おう

## これはなに？
Reactでコンポーネントを定義するときによく出てくる`React.FC`とか`React.VFC`ってなんぞや？と思っていて、最近その答えがわかったので共有がてら書こうと思います。

## 結論
結論を先に書きます。

- `React.FC`ではpropsに暗黙的にchildrenが含まれ、`React.VFC`ではchildrenが含まれない
- 暗黙的にchildrenが含まれることでコンポーネントを外から見たときにchildrenを渡す必要があるかどうかの判断がつかない
- `@types/react`の18以降では`React.FC`にchildrenが含まれない(現在のVFCの)ようになるのでその期間はVFCをVFCを使用する方が安全である

## FCとVFC型定義の比較
型定義をしているファイルがあったので比較してみます。

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f4f453b018d0d512cde50efb6db35fd3f8a001ab/types/react/index.d.ts#L541-L559

### FC
```ts:FunctionComponent
type FC<P = {}> = FunctionComponent<P>;

interface FunctionComponent<P = {}> {
    (props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
    propTypes?: WeakValidationMap<P>;
    contextTypes?: ValidationMap<any>;
    defaultProps?: Partial<P>;
    displayName?: string;
}
```

### VFC

```ts:VoidFunctionComponent
type VFC<P = {}> = VoidFunctionComponent<P>;

interface VoidFunctionComponent<P = {}> {
    (props: P, context?: any): ReactElement<any, any> | null;
    propTypes?: WeakValidationMap<P>;
    contextTypes?: ValidationMap<any>;
    defaultProps?: Partial<P>;
    displayName?: string;
}
```

FCの方はpropsの部分で`PropsWithChildren`が含まれていることが分かります。
これによって暗黙的にpropsにchildrenが含まれていることになります。



## まとめ
FCは暗黙的にPropsにchildrenが含まれているので、他者が読む際にわかりやすいVFCで明示的に宣言してあげましょうということでした。
v18からはFCにもchildrenが含まれなくなる & VFCが非推奨になるようなので(一次情報が見つからなかった)VFCを設定した場合は再度FCに直す対応も発生しそうです。

ちょっとしたモヤモヤが解決してスッキリしました！


**--余談--**
ちなみに今回このテーマを調べていて、`DefinitelyTyped`というのが`@types/react`とかのTypescriptの型定義を集めたリポジトリのことだっていうのは初めて知りました。

~~v18から含まれなくなるよっていうものをいろんなブログや記事で見たんですけどその情報ってどこに書かれてるんでしょう？~~
見つけた。

https://github.com/DefinitelyTyped/DefinitelyTyped/issues/46691



## 参考記事
https://ikesyo.hatenablog.com/entry/2020/12/18/141737

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/f4f453b018d0d512cde50efb6db35fd3f8a001ab/types/react/index.d.ts

https://dev.to/aurora2500/don-t-use-function-components-use-void-function-components-493p

## 2022/05/24追記

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts

React v18がリリースされましたね！

型定義ファイルを見るとわかるように`React.VFC`がdeprecatedになりました。

なのでこれからは安心して`React.FC`を使いましょう！
VMware ESXi7 スタンドアローンでUPS連動

# VMware ESXi7 スタンドアローンでUPS連動

## 前提
- お金がない

## 要件

- **電源喪失時**に稼働している仮想環境上のシステム全体を**クリーンシャットダウン**したい

## 環境
- 対象システムの物理マシンは無停電電源装置(UPS)から給電している
- 物理マシン上には無料で使える仮想化ハイパーバイザー`VMware ESXi 7.0 Update 2`(ESXiホスト)が稼働している
- UPSは電源状況をUSB経由で通知する機能を有している
- ESXiホストのUSBパススルー機能を用いてゲスト仮想マシンがUPSからの通知を受信できる<br/>
  (仮想環境関係ないので詳しくは『apcupsd』の設定記事を参照のこと)
- 全てのゲスト仮想マシンには`VMWare Tools`がインストールされており、ESXiホストからのシャットダウン通知を受信できる

## 電源異常検出時のトリガー

ゲスト仮想マシン`linux-1`は、UPSからの電源喪失通知を受けて下記スクリプトを実行する。

```shell
#!/bin/sh
sync
ssh root@192.168.1.2 poweroff
```

- 電源喪失状態でもssh通信できるようにvSwitchを構成しておく:
   * `192.168.1.2` → 管理ネットワーク用ポートグループ`Management Network`に属するVMkernelポートに割り当てられたIPアドレス
   * ゲスト仮想マシン`linux-1`はポートグループ`VM Network 1`に属している
   * `Management Network`と`VM Network 1`ポートグループが同一vSwitchトポロジ内に属している
- ゲスト仮想マシン`linux-1`からESXiホストにsshログインできるように設定しておく:
  1. `linux-1`のスクリプト実行ユーザーで鍵ペアを作成<br/>
     スクリプト実行ユーザーのホームディレクトリがない場合は`ssh -i <id_rsaファイル>`を活用
  2. VMware Host Client 上の`ナビゲータ>ホスト>アクション>サービス>SSHを有効化`
  3. ESXiホストの`/etc/ssh/keys-root/authorized_keys`に公開鍵を追加

## `poweroff`の挙動

ゲスト仮想マシンに対して『ナビゲータ>ホスト>管理>システム>自動起動>停止アクション』を実行した後、『停止遅延待機』に指定された時間だけ、『シャットダウン』にしておく(『パワーオフ』だとクリーンシャットダウンにならない)。

| 項目 | 値 |
|--|--|
| 有効 | はい |
| 起動遅延時間 | 0s |
| 停止遅延時間 | 120s |
| 停止アクション | **シャットダウン** |
| ハートビートを待機 | いいえ |

## 電源回復後の挙動

1. UPSから給電が再開
2. BIOSの通電時自動起動する設定に従って物理マシンが起動
3. ESXiが起動
4. 各ゲスト仮想マシンが『自動起動』設定の内容に従ってお行儀よく起動


以上
【SwiftUI】文字列Stringの任意の場所を抽出する

####SwiftUIの文字列抽出方法の結論。

```swift
extension String {
    func pickupString(sNum:Int,eNum:Int) -> String{
        let startIndex = self.index(self.startIndex, offsetBy: sNum)
        let endIndex = self.index(self.endIndex, offsetBy: -(self.count - eNum + 1))
        return String(self[startIndex...endIndex])
    }
}
```