OmniAICreator/Qiita-1.07M huggingface dataset:
Watson Studio(Cloud Pak for Data)からサービスを作成

Watson Studio(Cloud Pak for Data)からサービスを作成する方法を説明します。
ここではAutoAIに欠かせない`Machine Learning`サービスを作成してみます。

#1. 左上のナビゲーションメニューから`サービス`→`サービス・カタログ`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b9cf3982-768e-3ec8-4162-c016dc21a653.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/7873a6af-8c98-7258-9485-a5eea254a6f0.png)

サービスカタログが表示されます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/76e92afd-9e5c-4564-e672-4973aae6f84f.png)

#2.　サービスカタログから自分の作成したいサービスを選択します。
一覧表示からスクロールして探すか、サービスの検索で検索するか、カテゴリーにチェックを入れて一覧を絞るかして、自分の作成したいサービスをクリックします。
ここでは例として`Machine Learning`サービスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/c502b223-876e-6dcc-4dbe-4343002e0d7e.png)

#3. リージョン、プランを確認して、作成をクリック
**`Machine Learning`サービスの場合はWatson Studioと同じリージョンを選択してください。**
その他のサービスの場合もも選択できるのであれば、Watson Studioから使用する場合は同じリージョンの方がよいです。
無料のプランを使用したい場合は、`ライト`プランが選択されていることを確認してください。
確認ができたら、`作成`ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/6f78553f-c313-8555-0769-20a3310edcce.png)

作成が完了すると自分のサービス・インスタンス一覧画面が表示されるので、先ほど作成したサービスが表示されていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/8f30c56f-ce7a-ed7a-b056-a7ecada65712.png)

#参考1：ホームに戻る
ホームページを表示したい場合は、　左上の角にある4本線、「ナビゲーションメニュー」をクリックして、ホームをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/a08dbda4-1174-8295-baf0-e2ad35b9c447.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/12a04213-3d0e-fca8-3750-7da651fe1819.png)

あるいは右上の製品ロゴ「IBM Watson Studio」または「IBM Cloud Pak for Data」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/e420af30-8c30-fd6e-f35f-4549e8fddb98.png)

#参考2: 自分のサービス・インスタンス一覧の表示
左上のナビゲーションメニューから`サービス`→`マイ・サービス`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/b9cf3982-768e-3ec8-4162-c016dc21a653.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/06d34182-2fa9-c2be-74c3-9b4466494dfc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294516/785afd78-6d1b-8bcd-09fb-cca6a93fef10.png)

以上です。
ランダムなパスワードをシェルのコマンドラインで生成する

完全に自分用のメモ。
いつも履歴からやってるけど別PCなどで使えないとき用。

```bash
cat /dev/urandom | tr -dc "[:graph:]" | tr -d "1Il|/0O~^[](){}'\`\":;" | fold -w 12 | head -n 10
```

結果

```
mUEKZwZ3G5\X
wWTR+Z!Sw,Ky
qkEHxDDuPFTj
*D*F@4&%E2f*
pHFYW>s8yQi%
N+JYSdGg&ksV
>&,bPbLfxo!T
@2dphRt6v%Kt
!B#t>4,7isph
zPWnFCZFP!Sy
```

ある程度記号を入れつつ、分かりづらい記号をや文字を削除して、いい感じにバラつきのある見た目のパスワードを選ぶ。
ここから更にパイプしてgrepで大文字小文字記号数字が全て入っているものを機械的に出力してもいいけどね。
たまに記号は`._-`だけとかの入力フォームがあるので、そのときは `head -n 50`とかで目grepしてやってる。
【Go】一体いつからappendの引数に与えた変数が不変だと錯覚していた？

# 結論

```go
slice =  append(slice[:idx], slice[idx+1:]...)
```

上記のようにできない場合で、どうしても元のスライスを保持したいときはmake&copyしましょう

```go
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
newSlice := make([]int, len(slice))
copy(newSlice, slice)
```

https://play.golang.org/p/T9su3lB5xi5

# はじめに
スライスを使うときに無意識でappendを使うかと思います。
単純に追加するだけであれば、至って普通の挙動を示しますが、とある条件の時に
想定しない挙動になることがあります。


# 実験内容
配列の中から特定のインデックスにある値を削除する処理です。
例えば以下のようなコードがあった場合はどうでしょうか？

```go:main.go
package main

import "fmt"

func main() {
	slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	fmt.Println(slice)
	idx := 5
	for k, v := range slice {
		if k == idx {
			fmt.Println("before:", slice[k], v) //5 5
			fmt.Println("append", append(slice[:idx], slice[idx+1:]...)) //特定の配列を削除する
			fmt.Println("original slice", slice)
			fmt.Println("after", slice[k], v) // この出力は?
		}
	}
}

```
https://play.golang.org/p/v3gXZ9bFb-A

普通は

```go
slice = append(slice[:idx], slice[idx+1:]...)
```

のようにするところですが、例えば以下のようなケースが想定されます。
1. 共通化するべく、別メソッドで作る
2. 削除する前と後を両方保持しておきたい

感覚的にはbeforeとafterは全く同じになると思うかもしれません。


#実験結果
実際に実行してみます

```
[0 1 2 3 4 5 6 7 8 9]
before: 5 5
append [0 1 2 3 4 6 7 8 9]
original slice [0 1 2 3 4 6 7 8 9 9]
after 6 5
```

afterの値が「5 5」ではなく「6 5」となります。元のスライスもおかしくなっていることがわかります。

# なぜ普遍だと錯覚していた？

[A Tour of Go ](https://go-tour-jp.appspot.com/moretypes/15)より
> もし、元の配列 s が、変数群を追加する際に容量が小さい場合は、より大きいサイズの配列を割り当て直します。 その場合、戻り値となるスライスは、新しい割当先を示すようになります。

つまり言い換えるとappendの引数にあるスライスの容量が新たに割り当てるまでもなく大きい場合は割り当て直さない。

append にで指定した元の配列が変更されてしまい、
感覚と反する結果になっています
【備忘録】公開鍵・秘密鍵の作成手順メモ

#公開鍵・秘密鍵を作る手順メモ
初めて公開鍵と秘密鍵を作るので備忘録としてメモします。
自分が忘れそうなので備忘録として書こうと思います。
公開鍵・秘密鍵を作成後、Githubへの登録の流れまでを書きました。

##読んで欲しい方
・初めて鍵を作る方
・Macユーザー
・公開鍵・秘密鍵の作り方を忘れてしまった方

##使用環境
PC ： MacBook Pro (13-inch, 2017)
OS ： macOS Big Sur (Version11.1)
Shell Soft ： Terminal

##sshキー(公開鍵・秘密鍵）を作成
###1.sshディレクトリに移動

```
$ cd ~/.ssh 
```

 * ```/.ssh: No such file or directory```と表示された方
 * sshディレクトリがない方は、↓コマンドで新しく作成してください。

```
$ mkdir .ssh
```


###2.sshディレクトリの内容を確認
ディレクトリに何もないことを確認します。

```
$ ls
```

###3.クライアント(Mac)に秘密鍵・公開鍵を作成
下記のコマンドで鍵を作成します。

```
$ $ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [パスフレーズを設定（任意です）］
Enter same passphrase again: [再度パスフレーズを入力］
Your identification has been saved in /Users/###/.ssh/id_rsa.
Your public key has been saved in /Users/###/.ssh/id_rsa.pub.
The key fingerprint is:###
The key's randomart image is:###

```

 * -t : 鍵のタイプを指定
 * -b : ビット数を指定 
 * -f : 鍵ファイルを作成
 * id_rsa（秘密鍵）     : クライアントPCに配置される
 * id_rsa.pub（公開鍵） : 接続対象サーバに登録される
 * 参考 : 
[ssh-keygenコマンド オプション一覧](https://gist.github.com/gushernobindsme/58ddb4d7d190686ba6b5a28fdda077f4)


ここまでで、公開鍵と秘密鍵を作成できていると思います。
コマンドを入力して確認してみましょう。
####- 公開鍵を確認する
このコマンドで公開鍵がターミナルに表示されるので、
必要に応じてコピーし使用します。

```
$ cat ~/.ssh/id_rsa.pub
ssh-rsa ~~~ hoge@example.com
```

なお、Githubに登録する際には
```Githubユーザーアイコン > Settings > SSH and GPG keys```
から、コメント欄に公開鍵を入力後、下記コマンドを実行して登録しました。

```
$  ssh -T git@github.com
Are you sure you want to continue connecting (yes/no/[fingerprint])? --> yes　と入力
Enter passphrase for key '/Users/###/.ssh/id_rsa': （設定していれば）パスフレーズを入力
Hi ###! You've successfully authenticated　-->　こう表示されたら完了です。
```
VSCodeでRemote-WSLの接続に失敗する

## はじめに

普段Windows10でVSCodeからWSLに接続して開発しているのですが，
急に以下のログが表示されRemote-WSLに失敗するようになったので解決策を残します

```log
リモート拡張ホスト サーバーへの接続に失敗しました (エラー: WebSocket close with status code 1006)
```

> VSCodeのバージョンを1.53.2に更新してから事象が発生したと記憶してます

## 環境

以下の環境で事象を確認しました

- Windows10: 2004
- WSL: Ubuntu-20.04
- VSCode: 1.53.2

## 解決策

私の環境では以下の手順で事象を解決しました

1. VSCodeの拡張機能**Remote-WSL**のバージョンを0.53.3以上に上げる
2. VSCodeの設定から**remote.WSL.server.connectThroughLocalhost**のパラメータを**true**に変更
3. Windowsのサービス一覧から**LxssManager**を再起動
4. VSCodeを再起動し，**Remote-WSL: New Window**を押下

## 参考

[Failed to connect to the remote extension host server (Error: WebSocket close with status code 1006) #115818](https://github.com/microsoft/vscode/issues/115818)
【Unity】SRPとBuilt-in Render Pipelineをランタイムで切り替える

# はじめに
以前，Scriptable Render Pipelineを自作する記事を書きました．
[【Unity】SRPを自作して独自の描画フローを構築する](
https://qiita.com/togucchi/items/88a5c252da63dda73859)

この記事を書いている際に，Bilt-in Render Pipeline（以降Built-in）で作られている既存のプロジェクトの一部（インゲーム部分とか）にのみ自作SRPを適用することができれば便利だと思い方法を調べました．

# 方法
https://gist.github.com/togucchi/1b562b457482d4593c50f52ae75a84fa

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class RuntimePipelineSwitcher : MonoBehaviour
{
    [SerializeField]
    private RenderPipelineAsset pipelineAsset;

    private RenderPipelineAsset renderPipelineAsset;

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.S))
        {
            if (renderPipelineAsset == null)
            {
                renderPipelineAsset = pipelineAsset;
            }
            else
            {
                renderPipelineAsset = null;
            }

            GraphicsSettings.renderPipelineAsset = renderPipelineAsset;
        }
    }
}
```

結論， `UnityEngine.Rendering` 名前空間の `GraphicsSettings.renderPipelineAsset` を変更することで実現できます．
`RenderPipelineAsset` を継承した自作のPipelineAssetをセットします．また，nullを代入するとBuilt-in Render Pipelineに切り替わります．

```C#
// 独自のSRPに変更する
GraphicsSettings.renderPipelineAsset = renderPipelineAsset;

// Built-in に戻す
GraphicsSettings.renderPipelineAsset = null;
```

# 最後に
短くなりましたが以上です．簡単に描画フローを切り替えられるので，使い方によってはすごく便利かと思います．
Nuxt.jsとTypescriptとSCSSでかんたんなページ作成入門

[公式ドキュメント](https://ja.nuxtjs.org/)に沿ってNuxt.jsでページを作成していきます。
日本語版があるのはありがたいですね。

テキストエディタはおすすめされているVS Codeを利用します。OSはMacOS Big Surです。

# プロジェクトの作成

対話式で各種設定が行われます。
UI frameworkは少し悩みましたが無しにしてみました。

```
# yarn create nuxt-app nuxt-practice
yarn create v1.22.10
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 🔨  Building fresh packages...

success Installed "create-nuxt-app@3.5.2" with binaries:
      - create-nuxt-app
[#######################################################################################################################################] 342/342
create-nuxt-app v3.5.2
✨  Generating Nuxt.js project in nuxt-practice
? Project name: nuxt-practice
? Programming language: TypeScript
? Package manager: Yarn
? UI framework: None
```


# 開発サーバーの起動

```
# cd nuxt-practice
# yarn dev
? Are you interested in participating? No
```

これで、 http://localhost:3000/ にサーバーが立ち上がって、Nuxt.jsの空ページが表示されます。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74622/17184687-e973-0df0-f382-9207aa6c1937.png)|
|:--|


# ページの作成

codeコマンドで、カレントディレクトリをVS Codeで開けるようにしておくと便利です。

```
# code .
```

NuxtLinkでルーティングも出来ます。

```vue:pages/about.vue
<template>
  <NuxtLink to="/">Home page</NuxtLink>
</template>
```

```vue:pages/index.vue
<template>
  <main>
    <h1>Home page</h1>
    <NuxtLink to="/about">
      About Page
    </NuxtLink>
  </main>
</template>
```


# scssの追加

sassパッケージのインストール

```
yarn add -D sass sass-loader@10 fibers
```

グローバルに読み込ませたいcssを設定しておきます。

```
  // Global CSS: https://go.nuxtjs.dev/config-css
  css: [
    { src: '~/assets/style.scss', lang: 'scss' },
  ],
```

SCSSぽい入れ子のCSSを作成します。

```css:assets/style.scss
main {
    margin: 20px;
    h1 {
        color: red;
    }
}
```
無事CSSが反映されました。

| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74622/5f4ca384-1cf5-a5b0-bb8c-6b3e80319ff4.png)|
|:--|

# 機能追加
少しVueぽい書き方で動きをつけてみます。

```vue:pages/index.vue
<template>
  <main>
    <h1>Home page</h1>
    <NuxtLink to="/about">
      About Page
    </NuxtLink>
    <br><br>
    <button v-on:click="counter += 1">Click!</button>
    <p>The button above has been clicked {{ counter }} times.</p>
  </main>
</template>

<script>
export default {
  data() {
    return{
      counter: 0
    }
  },
  mounted() {
    alert('mounted!');
  }
}
</script>
```

ボタンをクリックするとカウントアップするようになりました。

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74622/670f6fd8-dd98-165f-acf3-82ad00161dde.png)|
|:--|
ECCメモリ（Error-correcting code memory)のエラー発生頻度やエラーに対する対処

#ECCメモリ（Error-correcting code memory)のエラー発生頻度
##エラー発生頻度情報１

https://japan.cnet.com/article/20401367/2/
の記事から引用

>　以前の研究では、例えば300台規模のコンピュータクラスタからのデータで、メモリモジュールでの訂正可能なエラーの発生率が、稼働時間10億時間当たり200回から5000回であることが示されていた。しかしGoogleは、10億時間当たりのエラーが2万5000回から7万5000回と、発生率がはるかに高いことを発見した。

⇒　「メモリモジュールでの」の単位がちょっとわからないので、自分のPCでどの頻度かが、ちょっと、わからない。

##エラー発生頻度情報2

https://ja.wikipedia.org/wiki/ECC%E3%83%A1%E3%83%A2%E3%83%AA
の記事から引用すると

>実際に観測されたエラー発生率は小規模な研究よりも数桁高く、1メガビットあたり10億時間ごとに 25,000〜70,000回だった (およそ 2.5〜7 × 10−11 エラー/ビット・時、つまり8ギガバイトのRAMで1時間に5ビットのエラー)。 毎年8%以上の DIMM がエラーの影響を受けていた。

⇒結論：**8ギガバイトのRAMで1時間に5ビットのエラー**


#ECCメモリ（Error-correcting code memory)のエラーに対する対処
##ちょっとおもしろい記事

https://japan.cnet.com/article/20401367/2/
の以下の部分を引用する。
>　メモリエラーは深刻な問題を引き起こすことがあるが、PCではサーバよりも深刻度がずっと低いと、Glaskowsky氏は述べている。その理由は、サーバはメモリに多くのデータを保存して、それを比較的安全な保管場所であるハードドライブに定期的に書き込んでいるのに対し、PCのメモリのほとんどは、アプリケーションやOSのファイル、あるいは表示されるが編集されない内容しか保存していないためだ。

⇒意訳になるが、**PCで、そもそも、大したことしてないでしょ！　ちょっと、表示とかさせてるぐらいでしょ**　と読める。（使用メモリ量の観点からは、**傾聴に値する！**）

#ECCで治せないエラーも知りたい

#中性子によるFlashへの影響とかも知りたい

#2021年の今の状況も知りたい

#なんで、1ビットエラーになるのか？そのサイズ感

#あとがき
特になし。
普通のエンジニアとしては、メモリでエラーが発生すると言われると、少し、混乱する！
この記事は、下記はじめです。
Lighthouseの評価を上げたくてCDN(CloudFlare)で静的コンテンツの配信をしてみたんだけど逆に評価が下がった話

# はじめに
こんにちは。AdSenseの審査を送り始めて2カ月、まだ審査が通りません、筆者です:sob:

ウェブサイトの品質を評価してくれるツールの**Lighthouse**をご存知でしょうか。

先日、自身のブログを評価したところ、もうちょっといけるぞという値でしたので、ほったらかしにしていたCloudFlareの設定を見直してみました。

参考になれば幸いです。

# 結論: **記事ページのLighthouse**の評価は下がりました
嘘ではないですがタイトルで煽ってしまってすみません:bow:
記事ページは下がりましたが、<font color="red"><b>トップページ</b></font>は改善しました！

原因は追求できていないですが、画像のサイズやフォーマットなど、いろんな項目を見直す必要があると思います。

とりあえず、記事ページの評価が下がってしまったのは悲しいですが、<font color="red"><b>表示スピードは速くなった</b></font>みたいです。

# 前提
1. ブログはWordPressでできてます
2. DNSの設定等は済んでいます
3. ブログのURLは`https://example.com`の想定で行っています

# 見直した設定
## 1. WordPressの管理画面はキャッシュを無効化
### 方法
1. CloudFlareの`ページ ルール`画面で`ページ ルールを追加`ボタンを押下
2. 以下スクリーンショットを参考にルールを適用する**URL**を入力
3. 以下スクリーンショットを参考に`その後の設定は:`下部のプルダウンメニューから**セキュリティ レベル**を選択し、右側の追加で表示されたプルダウンメニューから**基本的にオフにする**を選択する
4. 保存を押下

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/89b673a2-67e8-e285-6bec-578875ccf28f.png)

## 2. Webサイト全体に対して静的コンテンツとしてのキャッシュを有効化
1. CloudFlareの`ページ ルール`画面で`ページ ルールを追加`ボタンを押下
2. 以下スクリーンショットを参考にルールを適用する**URL**を入力
3. 以下スクリーンショットを参考に`その後の設定は:`下部のプルダウンメニューから**セキュリティ レベル**を選択し、右側の追加で表示されたプルダウンメニューから**Cache Everything**を選択する
4. 保存を押下

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/f8738a6b-85c0-afcb-64be-602bd59e5bc8.png)

# 設定の確認方法
実際にキャッシュが効いているかどうかの確認を行います。
ブログにアクセスし、レスポンスヘッダーに`cf-cache-status: HIT`があればOKです:ok_hand:

# 実施結果
## トップページ
### Before
![before_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/fb15643a-3d8e-91d6-7342-1c06d0b34f1c.png)

### After
![after_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/e9574400-e79e-39e1-0534-005aab631ae4.png)

## 記事ページ
### Before
![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/729f1fe9-f5a1-c39c-0977-89b4800510bc.png)

### After
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/3dc8bad3-a3f9-af72-cddd-51cf2d918fae.png)

# おわりに
記事ページの評価が下がってしまったのがやはり悲しいです。
ただ、両方のページで表示速度が上がっているので、やってよかったです :smile: 
今後は他の項目を改善していこうと思います :pray:
Proxy配下のDocker_備忘録

<h1>はじめに</h1>
最近は全く設計や構築ができず、ストレスのたまる毎日です。
休みの日くらい自分の好きなことをしようと思い、基礎学習を兼ねて構築を。
とりあえず、思いついたProxyとDocker環境の構築をやりました。

目的：ProxyとDockerの導入。Proxyを介した通信の確認。

<h1>Proxy</h1>
```java:Proxyとは(Wikipedia抜粋)
プロキシ（Proxy）とは「代理」の意味である。
インターネット関連で用いられる場合は、特に内部ネットワークからインターネット接続を
行う際、高速なアクセスや安全な通信などを確保するための中継サーバ「プロキシサーバ」を
指す。
```

インターネットに直接接続させたくないサーバやPCのために、代わりに通信のやり取りします。
これによって、サーバ自身が直接外部アクセスすることがなくなり、セキュリティリスクを抑えることができます。
※Web業界には「リバースプロキシ」ってのも存在するらしいがここでは割愛

<h1>Docker</h1>
```java:Dockerとは(Wikipedia抜粋)
コンテナ仮想化を用いてアプリケーションを開発・配置・実行するための
オープンソースソフトウェアあるいはオープンプラットフォームである
```

これだけ読んで理解できる人は相当頭が良い。。。。

とりあえず検索してみた。
<a href=https://knowledge.sakura.ad.jp/13265/>Docker入門（第一回）～Dockerとは何か、何が良いのか～</a>
![docker01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639874/e4d5c787-b4ad-05b7-d20b-31429d0a12cb.jpeg)

OS上に環境を準備し、その上にアプリが稼働するための環境を提供。
仮想マシンとの違いはゲストOS領域。コンテナではOS領域が無い分動作が軽いようです。


<h1>とりあえずやってみた</h1>
環境をざっくりと整理
![proxy_docker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639874/dd44ccfb-47a9-8b65-8c2a-fc22b9f8d189.png)
①３台のサーバを用意
②１台はVPN用に準備（今回は説明省略）
③１台はProxy用。この子は外部アクセスの役目を持つので外部ネットワークと、クライアント用の内部ネットワークを持たせる
④今回クライアントはDockerの役割を持つ

※すべてCentOS8を採用。理由は単純、無償かつLinuxなので軽いし不要なリソース確保しなくすむ。

<h3>◆Proxy導入手順</h3>
いつもお世話になっているサイトから手順を拝借
<a href=https://www.server-world.info/query?os=CentOS_8&p=squid&f=1>Proxy/ロードバランサ [Squid : インストール]</a>

<h3>◆Docker導入手順</h3>
せっかくなので、Proxyを介して導入。もちろん手順はいつもの。
<a href=https://www.server-world.info/query?os=CentOS_8&p=docker&f=1>コンテナ基盤 [Docker : インストール]</a>

導入が終わったので、さっそくイメージデータをダウンロードしようとしたところ、トラブル発生しました。

```java:エラーメッセージ1
Using default tag: latest                                                                                                                                                              
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on [::1]:53: read udp [::1]:54586->[::1]:53: read: connection refused   
```
何てことはない。
Proxyのクライアント側の設定が間違っていたようです。（ネットワークアドレス間違い＆設定リロード）
修正してリトライ。


```java:エラーメッセージ2
Using default tag: latest                                                                                                                                                              
Error response from daemon: Get https://registry-1.docker.io/v2/: proxyconnect tcp: tls: first record does not look like a TLS handshake                                               

```
まだ駄目なようです。
調べてみると、どうやらDocker用のProxy設定が漏れていたようなので、下記を参考に設定します。
<a href=https://qiita.com/daichannel/items/08e074a01e8ab41d52f7>VagrantをProxy経由で利用する [Dcoker]</a>

無事イメージデータのダウンロード確認まで終わりました。
目的達成したので備忘録として残します。

<h1>おわりに</h1>
相変わらずProyxは厄介だなと痛感。ファイアウォールと同等に深く考えたくない理由もわかります。
しかし、セキュリティを意識する上では重要だし、案外Proxyを介した通信のトラフィックを見るのも面白いものだと感じます。
次は、コンテナ環境で何か試してみようと思います。

<h1>参考</h1>
https://www.server-world.info/query?os=CentOS_8&p=squid&f=1
https://www.server-world.info/query?os=CentOS_8&p=docker&f=1
https://qiita.com/daichannel/items/08e074a01e8ab41d52f7
https://cybersecurity-jp.com/security-measures/32171
https://knowledge.sakura.ad.jp/13265/
値型シーケンスをCast<T>, OfType<T>でキャスト出来ない

# 結論
LINQ自体の実装に問題がある。
`Select`クエリを使う。
自分用にメモ。

#いきさつ
`int[]`を`double[]`にキャストしたい時に`Cast<double>()`を使ったらエラーになってしまった。
要素のアップキャストなのになぜか失敗する。

``` csharp
int[] hoge = { 1, 2, 3 };
// InvalidCastExceptionが発生する
var fuga = hoge.Cast<double>();
// 結果は空（すなわちキャスト出来ていない）
var piyo = hoge.OfType<double>();
```

# なんで
内部実装ではシーケンス要素を一旦`object`型にキャストしてから`T`型にキャストしている模様。

参考:
[C# IEnumerable.Castメソッドでint→longはできない](https://oita.oika.me/2013/11/03/linq_cast/)
[OfType<T>メソッドとCast<T>メソッド](http://outside6.wp.xdomain.jp/2016/08/11/post-615/)
[Enumerable.Cast<TResult>メソッドの罠](http://www.kondoah.com/blog/2015/06/enumerablecast-1155081.html)

``` csharp
// 要素に対する等価式（当然例外になる）
var element = (double)((object)1);
```

#どうする
上記リンク通りこれでOK。

``` csharp
var fuga = hoge.Select(a => (double)a);
```

#終わりに
アカウントがあるのに何も書かないのはアレなので。
【2021年版】オススメターミナルソフトは teraterm でも RLogin でもなくて vscode + Remote - SSH

## はじめに

teraterm から rlogin に乗り換えて快適に使っていたんですが、vscode の方が快適に思えたので記事書きます。

(メリット)

- ssh コマンドを普通に使える
- リモートのファイルを普通にvs code で編集できる
- フォルダエクスプローラも普通に使える
- ドラッグ＆ドロップでファイルのアップロードができる
- ファイルのダウンロードもできる


(デメリット)

- 巨大なログファイルなどは開けない

viとヒュージョンされているエキスパートな方にはあまりメリットを感じないかもしれませんが、ライトユーザーには魅力的な環境かと思います。

（接続画面）
![remote-ssh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/1effe4e4-588d-a7b6-7c20-0104c0a524cc.png)


## インストール

- [Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
サイトでインストーラーを入手してインストール

- [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh)
vscode の拡張機能よりインストール

インストールは以上です。

## 接続

手頃なVMをお持ちならそちらに接続してみてください。
手頃なVMがなかったのであまり意味がないですが Vagrant の VMに接続してます。

### 事前準備

```
# 手頃な VM 起動
vagrant init generic/ubuntu2004
vagrant up

# 設定確認
vagrant ssh-config
```

※ssh-config で表示される以下の内容を、Remote - SSH に設定します

```
  HostName 127.0.0.1
  User vagrant
  Port 2200
  IdentityFile remote-ssh/.vagrant/machines/default/virtualbox/private_key
```

### 接続設定

1. ウィンドウ左下の Remote - SSH アイコンをクリック
2. Remote-SSH: Open Configuration File... を選択
3. c:\Users\{ユーザー名}\.ssh\config に設定を記述

![ssh設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/f50ca1e3-a0ec-a6fc-e953-ca55e0b412c9.png)

```
Host Local VM # 設定名
  HostName 127.0.0.1  # IP
  Port 2200 # Port
  User vagrant # ユーザー名
  IdentityFile absolute-path/to/ssh-private-key # ssh 鍵パス
```

### 接続

1. ウィンドウ左下の Remote - SSH アイコンをクリック
2. 以下いずれかを選択
    - Remote-SSH: Connect Current Window to Host... (このウィンドウで接続)
    - Remote-SSH: Connect to Host... (別のウィンドウで接続)
3. 接続設定で作成した設定を選択

以上となります。

## おわりに

RLogin と WinScp に VS Code がくっついたような快適さです。
導入もさほど難しくありませんので、よろしければ使ってみてください。

個人的には、仕様書や手順書も vs code で書いていたりしていまして、ほぼすべての業務が vs code で完結する日が来たらいいなと妄想しています。
Outlookアプリの通知来ない問題をPowerAutomateで無理やりなんとかした話

#概要
フリーメールとしてoutlook.comを利用している方は多いと思いますが、ルール機能を使って受信メールをフォルダに振り分けるとiPhoneやandroidのOutlookアプリに受信通知が来なくなるUXを損なう考えられない仕様になっているので、outlook.comの振り分けルールを使用せずPowerAutomateでメールを振り分けることにしてみた。

#やり方
1. まずPowerAutomateの左メニューから作成を選択
2. 私は1日1回振り分け処理を実施したかったので、空白から開始の「スケジュール済みクラウド フロー」を選択した。各自で使いたいトリガーに合わせて選択してもらいたい。フロー名を入れて「作成」していく。
3. フローの作成画面に移るので、「新しいステップ」をクリックして、検索窓に「outlook.com」と入れてみよう。
4. アクションを下にスクロールしていくと、「メールの取得(V2)」があるので、これを選択する。ちなみに初めてPowerAutomateからOutlook.comへのアクセスとするときにはアクセスを許可するためにOutlook.comへログインする必要がある。画面の指示通りに操作すれば大丈夫なはずだ。
5. メールの取得(V2)では下図のようなメールの抽出条件を設定できる。今回は振り分け対象にする3つのメールアドレスを指定してみた。ちなみに上という項目に10と入っているが、これは上から10件取得するという意味である。![メールの取得.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479395/ac8a8efa-e163-adde-5e5f-82fe49093ac7.jpeg)
6. 条件に合致したメールの情報が取得できるので、次はフォルダに振り分けるために条件分岐を設定していく。
7. 取得した情報の個数分のループを実現するためにコントロールからApply to eachを選択した。すると下図のように分岐に使用するパラメータを指定するポップアップが出てくるので指定する。宛先を指定したが自動的にメールのbodyをjson形式で取得してくれるようだ。![each.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479395/90360947-231d-2c95-435f-2e057882d054.jpeg)
8. 条件分岐は様々あるがSwitch-Caseを使ってみた。今回は宛先で振り分けたかったのでオンに判定条件の宛先を指定する。ケースには宛先メールアドレスと合致した場合の動作を指定していく。![スイッチ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479395/e5e77ccf-c3e6-3169-d39c-b52123782f59.jpeg)
9. アクションの追加を押して出てくる検索窓に「メールの移動」を入れてみよう。するとoutlook.comのメールの移動が出てくるので選択して、下図のようにメッセージIDと移動先のフォルダを選択しよう。この例では、hogehoge@outlook.com宛に送られたメールは時間起動で迷惑メールフォルダに振り分けられることになる。![メールの移動.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479395/527f5ee2-4b87-3a07-b23a-ae7303e5b847.jpeg)
10. ここまでできたら、あとは振り分けたい条件のバリエーションに応じてケースを増やしていけばいい。

#まとめ
このようにPowerAutomateを使うことにより、一旦受信トレイで受信をしてiPhoneやandroidのOutlookアプリに受信通知が来るようにして、後からフォルダに振り分けるようにした。こうすることでメールの見逃しを大幅に減らすことに成功した。
sshpassを使って、リモートシャットダウン

# 初めに
sshpassで、別端末をシャットダウンしたいといったときに使用。
気が向いたら、ループして複数端末対応も書く予定

# フォルダ構成
c:\test\
 ├ shutdown.sh
 └ passfile(パスワードを記載)

# ソースファイル
``` text:passfile
hogehoge
```

``` Shell:shutdown.sh
password=$(<passfile)
sshpass -f passfile ssh -o "StrictHostKeyChecking no" user@hostname "echo ${password} | sudo -S poweroff"
``` 
※userはsshでログインするユーザーを記載
※hostnameは接続先を記載
※ユーザーはroot特権もちのやつを使う

# 参考
<a href="https://keens.github.io/blog/2015/06/17/shell_scriptwokakutokinikiwotsuketaikoto/">Shell Scriptを書くときのテクニック10選</a>
npmについて

知識を整理するための個人的な備忘録です。

#npmとは
`npm`とは`Node Package Manager`の略で、`Node.js`のパッケージ（Package ）を管理する（Manager）ツールのこと。

##Node.jsとは
本来ブラウザ上という限られた環境でしか動けなかった`JavaScript`を、`Ruby`や`PHP`の様にサーバーサイド側で動かせるようにしてくれるもの。

##Node.jsのパッケージ
パッケージ（Package）とは、予め用意された便利な機能をまとめたもの。

###例
* [Express](https://techacademy.jp/magazine/16119)
* [promise](https://techacademy.jp/magazine/16127)
* [async](https://techacademy.jp/magazine/16133)
* Socket.io

#参考
* [便利なパッケージ管理ツール！npmとは【初心者向け】](https://techacademy.jp/magazine/16105#sec1)
Unity ゲーム実行中に任意のMeshFilterからNavMeshを生成する

## 目的
Unity実行中にシーン内に存在するMeshFilterからNavMeshを動的に生成し、NavMeshAgentに経路探索させます

とにかくコードが見たい人はこちら
https://github.com/lisearcheleeds/SimpleNavMesh/tree/master/Assets/Scripts/SimpleNavMesh

## 動機
UnityではNavMeshという経路探索AIが機能として実装されていますが、あまり使い勝手が良くないと思われてます。
シーンにBakeする必要があったり、GameObjectをstaticにする必要があったり、NavMeshAgentは速度と回転率を設定する必要があったり、デフォルトで勝手に移動し始めたり、まぁやっぱりなんか使い勝手悪い気がしてきました。使い勝手悪いです。
ただ、今回はその中の大きな要素の一つである「動的にNavMeshを生成するのがめんどくさい」という思い込みを取り除けると思います。

ちなみに、[テラシュールブログ](http://tsubakit1.hateblo.jp/entry/2018/01/06/003209)や[公式のリファレンス](https://docs.unity3d.com/ja/2018.4/Manual/NavMesh-BuildingComponents.html)などで「高レベルのコンポーネントを入手する」と称して同コンポーネントが紹介されているので、
「このUnity公式の拡張コンポーネントがないと実行時にベイク出来ないんだ」とちょっと前まで思ってましたがそんなことは無かったです。
煩雑な上にstatic変数で探索対象を管理していて、宗教上私には使えなかったので倦厭してましたが、ちゃんと読み解けばシンプルな使い勝手で良い感じになります。

Unity-Technologies/NavMeshComponents
https://github.com/Unity-Technologies/NavMeshComponents

## 解説
#### UnityEngine.AI
- [NavMeshBuildSource](https://docs.unity3d.com/ScriptReference/AI.NavMeshBuildSource.html)
    - ナビメッシュを生成する最小単位
    - shapeとかsizeとかtransformとか渡す。 `MeshFilter` と1:1
- [NavMeshData](https://docs.unity3d.com/ScriptReference/AI.NavMeshData.html)
    - 複数の `NavMeshBuildSource` を持つデータ
    - `NavMesh` に `AddNavMeshData()` で渡す
        - ナビメッシュを実際に生成する
    - `NavMeshBuilder` に `UpdateNavMeshDataAsync()`で渡す
        - ナビメッシュを実際に生成する
        - 前回の `AddNavMeshData()` もしくは `UpdateNavMeshData()` からの差分だけ更新する
- [NavMeshDataInstance](https://docs.unity3d.com/ScriptReference/AI.NavMeshDataInstance.html)
    - `NavMeshData` のInstance。そのナビメッシュが不要になったときにRemove()を呼ぶ
    - `NavMesh` に `AddNavMeshData()` の返り値で渡される

#### SimpleNavMesh

https://github.com/lisearcheleeds/SimpleNavMesh/tree/master/Assets/Scripts/SimpleNavMesh
`NavMeshController` コンポーネントの `IEnumerator GenerateNavMesh()` を実行すると、
`navMeshTargetParent` 以下の全ての `INavMeshTarget` に対してNavMeshを生成します

- INavMeshTarget
    - `NavMeshTargetData` と `UpdateNavMeshTargetData()` を持つインターフェイス
- MeshFilterTarget
    - `MeshFilter` から `NavMeshBuildSource` を作るコンポーネント
    - `INavMeshTarget` を実装する
- NavMeshController
    - 指定されたGameObjectのHierarchy配下の `INavMeshTarget` を集めてBoundsを計算して `NavMeshBuilder.UpdateNavMeshDataAsync()` とか叩くコンポーネント
- NavMeshTargetData
    - `NavMeshBuildSource` とBoundsを持つデータ

## 出来なかったもの
高台から落下してショートカットするためにOffmeshLinkも動的に生成したかったんですがどうやるんですかね？
まぁそもそもあまり使わないほうが良い気がする
【Window限定】Rubyのコードをexe形式で出力する

【追記２はじめ】

コメントにて、記事の補足を頂戴しております。
情報誠にありがとうございました🙇‍♂️
https://qiita.com/yoneapp/items/d0e5a341e134ac569a4c#comment-e76719520cbe306a2101

【追記２おわり】

【追記はじめ】

> http://openssl.so がないと怒られる
どうも .rb や .dll はバンドルするオプションがあるのに .so についてはオプションが存在しないっぽい
> http://aligach.net/diary/201910.html

この記事は最終的に、上記の記事のとおりにハマって活用できない可能性が高いです。

【追記おわり】

調べてみたところ、あまり活発ではない手法のようです。

Mac用に書き出せたりもしないので
JavaScriptでElectonとかを使ったほうがスムーズかもしれませんね。

ただ、Rubyを使うだけでexe形式の何かを作れるのは良いと思いました。

```
> ocra .\sample.rb
```

さて、雑に上記のようにしますとexe生成には成功しますが次のようなエラーが発生して起動しません。

![スクリーンショット 2021-02-13 14.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6678/f0c1b9c0-30c7-9e78-ab8a-6490e633bd69.png)

> ruby_buiktin_dlls\libssp-0.dll was not found

これを解消しなくてはなりません。

```
> ocra .\sample.rb --dll ruby_builtin_dlls\libssp-0.dll
```

これで解決です。

次に ocra は sample.rb 実行して依存関係を調べているような気がします。
なので終了しないスプリクトだと処理が終わらないような気がします。

そこで --no-dep-run (実行しない) を入れます。
公式に --no-dep-run は --gem-full セットでと書いてあったのでそうします。

```
> ocra .\sample.rb --no-dep-run --gem-full --dll ruby_builtin_dlls\libssp-0.dll
```

最終的な実行コマンドはこちらです。
これで Windows で実行可能な exe形式のruby製プログラムの作成に成功しました。
【導入編】Vue.js、Vuetifyをvue-cliでAmazon Linux2にインストール


#はじめに
VuejsとVuetifyをEC2(Amazon Linux２)で利用する機会があったのでインストールまでの手順を備忘録として残しました。
同様のケースがある方にも参考になればと思います。

#前提条件
EC2の構築までは完了していることが前提です。
まだの方は下記URLを参考にして構築してみてください\:smiley:
・[チュートリアル: Amazon EC2 Linux インスタンスの開始方法](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/EC2_GetStarted.html)


#インストール手順
4ステップです。

1. Node.jsのインストール（vue-cliの利用に必要）
2. vue-cliのインストール
3. Vue.jsのプロジェクト作成
4. Vuetifyのインストール


##1. Node.jsのインストール（vue-cliの利用に必要）
ダウンロードして、

```
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
```
インストール。

```
sudo yum install --enablerepo=nodesource nodejs
```

##2. vue-cliのインストール
Vuejsの環境を構築する際にはvue-cliを利用するととても便利なのでvue-cliをインストールします。

```
npm install -g @vue/cli
```

##3. Vue.jsのプロジェクト作成
my-app にはプロジェクト名を記入。

```
vue create my-app
```

2022年2月時点ではVuetifyはVuejs3をサポートしていなため、[Vue 2]を選択し、[Enter(return)]。
![スクリーンショット 2021-02-13 13.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/72df97bd-e37a-9809-2972-396d1f8aa1a7.png)

「Successfully」と表示されればプロジェク作成は完了です。
![スクリーンショット 2021-02-13 14.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/09e6ce77-a4a9-92e1-df14-eecd40282a9b.png)

念の為Vuejsを起動し、ブラウザから確認してみましょう。

①先ほど作成したプロジェクトのディレクトリに移動。

```
cd my-app
```
②Vuejsの起動

```
npm run serve
```
③ブラウザにアクセス
・EC2で構築した場合は、「パブリック IPv4 DNS」または「パブリック IPv4 アドレス」を利用。
※アクセスできない場合はセキュリティグループの設定がされていない可能性があるので、セキュリティグループでhttpの8080を許可されているか確認してみてください。
http://「パブリック IPv4 DNS」または「パブリック IPv4 アドレス」:8080/

・ローカル環境で構築した方は下記にURL。
http://localhost:8080/

このようなページが表示されたら成功です！
次はVuetifyをインストールしますので、ターミナルから「control + c」で一度サーバーを停止しましょう。
![スクリーンショット 2021-02-13 14.34.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/931771c1-de6e-4871-a72b-7a291dc7e7d4.png)


##4. Vuetifyのインストール
```
vue add vuetify
```

今回はそのまま「Default」を選択。
![スクリーンショット 2021-02-13 14.40.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/f59f641c-b3f4-85bb-2842-b4af9959b65c.png)

「Successfully」と表示されればVuetifyのインストールはが完了です。
![スクリーンショット 2021-02-13 14.43.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/da3d0789-a655-254b-0908-18abbd301f8a.png)

ブラウザからもVuetifyがインストールされていることを確認しましょう。
先程と同様 npm run serve　で起動し、ブラウザからアクセスするとページのデザインがVuetifyになっていればVuetifyが正常にインストールされ利用できる状態になっています。お疲れさまでした\:+1:
![スクリーンショット 2021-02-13 14.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237056/5a201dd9-7abb-dc56-842e-ffee911fba1d.png)
M1 MacでLINE botをVS Codeで開発してAzure Functionsへデプロイする環境構築メモ (Node.js版)

# はじめに
M1 MacでLINE botをVS Codeで開発してAzure Functionsへデプロイするための環境構築メモです。

macOS Big Sur
バージョン: 11.2.1

### 1. VS Codeのインストール
バージョン: 1.53.2

### 2. VS CodeのAzure Functions extensionのインストール

### 3. Node.jsのインストール

Node.jsをインストールするためにnvmをインストールします。

ターミナルを開く(Rosettaは使用しない)

```zsh
% curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
```

.zshrcファイルに以下を追加する。(.zshrcファイルが無ければ作成する)

```text
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
```

.zshrcファイルを読み込む。

```zsh
% source .zshrc
```

Node.js v14.15.4のインストール

```zsh
% nvm i v14.15.4
```

(ビルドに時間が掛かります)

```zsh
% npm -v
6.14.10
% node -v
v14.15.4
```

VS Codeでサンプルコードを動かそうとするとAzure Functions Core Toolsをインストールするようにエラーが表示される。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f9a2036b-c90d-1cd2-123b-8056376072d6.png)

Azure Functions Core ToolsをインストールするためにはHomebrew (brewコマンド)を使用する必要がある。

### 4. Xcodeのインストール

### 5. Command Line Tools for Xcodeのインストール

### 6. Homebrewのインストール

```zsh
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

brewコマンドが使用できるようにPATHを追加します。

```zsh
% echo 'eval $(/opt/homebrew/bin/brew shellenv)' >> ~/.zprofile
% eval $(/opt/homebrew/bin/brew shellenv)
```

/opt以下はrootユーザーの管理下にあるので、/opt/homebrew以下にログインユーザーへ所有権設定を行います。

```zsh
% sudo chown -R $USER $(brew --prefix)
```

### 7. Azure Functions Core Toolsのインストール

```zsh
% brew tap azure/functions
% brew install azure-functions-core-tools@3
```

Start Debugging[F5]で実行するとgrpc関連でエラーが出力されます。
対処方法はこちら。
https://qiita.com/kitazaki/items/daf9f028e84415985ca7
Windowsで仮想サーバー構築（VM）する時の注意点

（個人の忘備録ベースです。読みづらいと思いますがご容赦ください。）

Windows10ユーザーの環境開発は初心者にはかなりハードル高すぎて諦める人も多い中、私のようなド素人でもなんとかやり切ったので同じくWindows環境だけどRubyやってみたい初心者の方に参考になればと思います。

###結論：自分じゃできないので、人の力を借りよう。


唖然とされるかもしれませんが、色々自分でもやってみてダメだったので「自分で解決できないなら、人の手を借りる」のも作戦かなと割り切り仕様です。

というわけで大変ありがたいことに、初心者をWindows環境でUbuntu+vagrant+Railsの起動まで導いて下さるというコースがUdemyにあったので、利用させていただきました。

しかし、それでも私はすぐには環境できませんでした。

ありがたいことにこちらの先生、辛抱強く親切に付き合ってくださいました。


私が上手くいかなかったのはHyper-V周りをとにかく影響させないこと、VMとWindowsのポートが繋がっていない事が問題だったようです。
以下が概ねの主要ポイントの記録です。



------------------------------------



###1.とにかくHyper-Vを消す



1：コントロールパネル > プログラムと機能 > Windows の機能の有効化または無効化より
　Hyper-V と virtual machine platform (仮想マシンプラットフォーム)
　のチェックを外す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472469/f4955cdb-7eb5-e018-e261-50faca2d2690.png)

2：Hyper-V Virtual Ethernet Adapterアンインストール
https://note.com/muroy/n/n0e4a47bf610c
ムロさんのnoteより

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472469/a8530326-b2ef-3442-35a3-35572dfa97ae.png)

3:PowerShellの管理者権限で、以下のコマンドを実行
@reefIrvingさんの記事より
https://qiita.com/reefIrving/items/e760b6e4078dedc0b434


```ruby:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```
4:ubuntu1810フォルダ内に
ubuntu-bionic-18.04-cloudimg-console.logファイルがあるか確認（なければ作成）



###2.VMとWindowsのポートを繋げる

5:シリアルポートパスがWindowsパスに繋がっていないゆえにVM VirtualBoxに到達しない問題
@geliefan さんの記事より
https://qiita.com/geliefan/items/5c42d9443273e0c73feb
またGit-hubで英文ですが同様のコード
https://github.com/hashicorp/vagrant/issues/8604#issuecomment-303259512


```ruby:vagrantfile
config.vm.provider "virtualbox" do |vb|
  vb.customize [ "modifyvm", :id, "--uartmode1", "disconnected" ]
end
```

と、たくさんの方々の記録が解決策となりました。ありがとうございました。



__一人で抱え込まなくてよかったー。（ほっ）__


依存もよくないですが自分一人ではできないことも多いので、方々に頭を下げながら勉強を続けていきます。
【無線LAN】無線LAN規格一覧

#はじめに
本記事は無線LANの各規格について、個人的に「あれ、この規格の仕様どんなだっけ？」ってなった時に
見返す用に作成したものです。（新しい規格が出るたびに更新する。予定。）


#そもそも無線LANの規格はどうやって決められている？
無線LANは、IEEE802.11ワーキンググループによって標準化されています。
IEEE802.11ワーキンググループはアメリカの本部を置く電気・情報工学分野の学術研究団体（学会）、
技術標準化機関の一部というイメージです。
※一部Wikipedia参考
https://ja.wikipedia.org/wiki/IEEE


#各規格について
無線LANには、バージョンのようなイメージでいくつかの規格があります。
それぞれの規格については以下の通り。

|無線LAN規格名称|最高通信速度|周波数帯(2.4GHz)|周波数帯(5GHz)|最大チャネル幅|策定年|
|:---|:---|:---|:---|:---|:---|
|IEEE802.11ax|9.6Gbps|◯|◯|160MHz|2019年|
|IEEE802.11ac|6.93Gbps|◯|-|160MHz|2014年|
|IEEE802.11n|600Mbps|◯|◯|40MHz|2009年|
|IEEE802.11a|54Mbps|◯|-|20MHz|2003年|
|IEEE802.11g|54Mbps|-|◯|20MHz|1999年|
|IEEE802.11b|11Mbps|-|◯|22MHz|1999年|

周波数帯は、規格によって2.4GHzと5GHzがあるもの、ないものがあります。
最新の規格であるIEEE802.11axはWi-Fi6と呼ばれたりします。
acはWi-Fi5、nはWi-Fi４、それ以前は、、Wi-Fiなんちゃらって呼ばれているのは
聞いたことがないです。（私が知らないだけで呼ばれているのかも）

［参考文献］
　[次世代高効率無線LAN規格IEEE 802.11axに関する国内外の動向](https://www.tele.soumu.go.jp/resource/j/equ/mra/pdf/30/j/15.pdf)
　[無線LAN｜基礎知識 - アライドテレシス](https://www.allied-telesis.co.jp/products/list/wireless/knowl.html)
間違えて消してしまったブランチをgit reflogで復活させる

間違えて必要なブランチを消してしまった....
又は間違えてresetする箇所を間違えた...
というときに使えるコマンド

## 何が起こったか

commitだけして、pushしたと完全に思い込んで、マスターブランチにマージされたからいらないやと思ってブランチを消してしまった

（``git branch -d``で消せば良かったのにそのときは雑に``git branch -D``で消してしまったのでマスターにpushしてない部分があることに気が付かなかった...orz）

一瞬焦ったけど、そんなときこそ``git reflog``

## ブランチを復活させる

```
$ git reflog
f5f6828 (HEAD -> dev, origin/dev, origin/HEAD) HEAD@{0}: pull origin dev: Fast-forward
c3983b8 HEAD@{1}: ...
b94cda4 HEAD@{2}: ...
```

復活させたいHEADを見つけたら

```
$ git branch <ブランチ名> HEAD@{2}
```

復活できた〜〜良かった。

## 感想
ブランチ消す前にちゃんとdiffで差分確認するとかしないとだめですね。笑
一瞬ヒヤッとしたけどコミットは忘れずにしてたおかげでちゃんと戻せました。良かった〜〜。
CentOSのfreeコマンドの見方

# freeコマンドの見方

Centos8でfreeコマンド使った時の出力。実メモリを青、スワップを赤で表示。
利用可能なメモリは「available」の値であって「free」ではない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/eb81ad48-cdee-950a-16f3-aced40f9b354.png)

freeの結果を図示。sharedは共有メモリに割り当てられたメモリだがひとまず無視。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218194/303126da-1350-0607-527e-a21c7cdfbcb5.png)

### バッファ/キャッシュ
通常キャッシュと呼ばれ、バッファキャッシュとページキャッシュがあり、それぞれbuffers,casheと表現される。IOの高速化のために利用され、空きメモリがあるとOSがキャッシュとして利用するので、「空きメモリ(free)」の数値だけを見ていると、空きメモリがジワジワと減っているように見えるのは、OSがキャッシュ用に空きメモリを使うため。
メモリを多く必要とするアプリケーションなどを動かす場合は、OSがうまいことやってくれて、キャッシュとして利用中のメモリから開放可能な部分を開放し空きメモリを確保する。

### available
実際に利用可能なメモリ領域。「空きメモリ(free) + 開放可能なバッファ/キャッシュ」の値。

### バッファ(buffers)
バッファキャッシュ。ブロックデバイスを直接アクセスするときに利用。

### キャッシュ(cashe)
ページキャッシュ。ファイル単位でのアクセスするときに使用。
VSCode　設定メモ　20210513

C:\Users\sano\AppData\Roaming\Code\User\setting.json

```json:setting.json
{
    "workbench.startupEditor": "newUntitledFile",
    "editor.minimap.enabled": false,
    "explorer.confirmDelete": false,
    "files.autoSave": "afterDelay",
    "python.showStartPage": false,
    "update.showReleaseNotes": false,
    "editor.renderWhitespace": "none",
    "files.eol": "\n",
    "workbench.editorAssociations": [
        {
            "viewType": "jupyter.notebook.ipynb",
            "filenamePattern": "*.ipynb"
        }
    ],
    "breadcrumbs.enabled": false,
    "editor.parameterHints.enabled": false,
    "editor.lightbulb.enabled": false,
    "editor.hover.enabled": false,
}


```

C:\Users\sano\AppData\Roaming\Code\User\keybindings.json

```json:keybindings.json
{
// 既定値を上書きするには、このファイル内にキー バインドを挿入しますauto[]
[
    {
        "key": "ctrl+shift+delete",
        "command": "workbench.debug.viewlet.action.removeAllBreakpoints"
    }
]
}
```

C:\Users\sano\AppData\Roaming\Code\User\snippets\python.json

```json:python.json
{
	// Place your snippets for python here. Each snippet is defined under a snippet name and has a prefix, body and 
	// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
	// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the 
	// same ids are connected.
	// Example:
	// "Print to console": {
	// 	"prefix": "log",
	// 	"body": [
	// 		"console.log('$1');",
	// 		"$2"
	// 	],
	// 	"description": "Log output to console"
	// }
	"fori": {
		"prefix": "fori",
		"body": [
			"for i in range($1):$2",
		],
		"description": ""
	}
	"forj": {
		"prefix": "forj",
		"body": [
			"for j in range($1):",
		],
		"description": ""
	}
	"nstr": {
		"prefix": "nstr",
		"body": [
			"$1=input()",
		],
		"description": ""
	}
	"nint": {
		"prefix": "nint",
		"body": [
			"$1=int(input())",
		],
		"description": ""
	}
	"nmap": {
		"prefix": "nmap",
		"body": [
			"$1=map(int, input().split())",
		],
		"description": ""
	}
	"nlist": {
		"prefix": "nlist",
		"body": [
			"$1=list(map(int, input().split()))",
		],
		"description": ""
	}
	"pri": {
		"prefix": "pri",
		"body": [
			"print($1)",
		],
		"description": ""
	}
}
EmoPy Challenge

# machine
- 64bit ubuntu 18.04LTS
- VMWare Workstation 15 Player

# installing pyenv(2021/2/11)
- refer the steps of https://github.com/thoughtworksarts/EmoPy/blob/master/README.md#environment-setup

- update and upgrade apt before starting

```
sudo apt update
sudo apt upgrade
```

- installing required libs and then you must reboot your machine.

```
sudo apt install -y build-essential libffi-dev libssl-dev zlib1g-dev liblzma-dev libbz2-dev libreadline-dev libsqlite3-dev git
```


- install package of pyenv

```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv`
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc`
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc`
echo 'eval "$(pyenv init -)"' >> ~/.bashrc`

source ~/.bashrc`
```

- check the version of installed pyenv.

```
pyenv -v
```

- install python into virtual environment.

```
pyenv install 3.6.10
```

# set up for EmoPy

- install required lib.

```
sudo apt-get install graphviz`
sudo pip3 install virtualenv`
sudo apt-get install python3-venv`
```

- Create and activate the virtual environment. Run:

```
pyenv exec python3.6 -m venv venv
```

- activate virtual environment.

```
source venv/bin/activate
```

# installing EmoPy

- install via pip or from git

```
# in case of pip

sudo pip3 install -U pip
sudo pip3 install EmoPy

# in case of git

git clone https://github.com/thoughtworksarts/EmoPy.git
cd EmoPy/
sudo pip3 install -r requirements.txt
```

# run programs

- run `run_all.py` as a test

```
sudo python3 EmoPy/tests/run_all.py
```

# prog for webcam. 

```
cd EmoPy/EmoPy/examples/
sudo python3 fermodel_example_webcam.py
```

- you may need to unintall h5py and install other-version

```
sudo pip3 uninstall h5py
sudo pip3 install h5py==2.10.0
```
- output is shown.

```
Capturing image ...
Image written to:  image_data/image.jpg
Initializing FER model parameters for target emotions: ['calm', 'anger', 'happiness']
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/op_def_library.py:263: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
2021-02-12 20:40:55.266811: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2021-02-12 20:40:55.330783: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2111995000 Hz
2021-02-12 20:40:55.335114: I tensorflow/compiler/xla/service/service.cc:150] XLA service 0x1f22ed0 executing computations on platform Host. Devices:
2021-02-12 20:40:55.335376: I tensorflow/compiler/xla/service/service.cc:158]   StreamExecutor device (0): <undefined>, <undefined>
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
anger: 62.6%
calm: 28.7%
happiness: 8.8%
```
同値分割と境界値分析について(初学者向け)

#どんな人に向けた記事なのか
**▶︎プログラミング初学者** (勉強はじめてから3-6ヶ月くらいまで)
**▶︎そもそもテストって何？って調べ始めたばかりの人**
**▶︎「同値分割」「境界値分析」ってざっくり何か知りたい人**

#背景
テストについて調べていると、「同値分割」や「境界値分析」といった言葉がよく出てくるが、パッと見いまいち何かよくわからなかったため、自分なりにまとめてみようと思ったのがきっかけ。

#「同値分割」「境界値分析」とは？(一般的な説明)
下記、IT用語辞典より

○同値分割・・・ソフトウェアテストで適切なテストケースを作成する手法の一つ。出力が同じになるような入力をそれぞれグループにまとめ、グループの中から代表を選んでテストを行なう方式。

○境界値分析・・・ソフトウェアテストで適切なテストケースを作成する手法の１つ。出力が同じになるような入力をそれぞれグループにまとめ、グループが隣接する境界やその前後の値を入力としてテストを行なう方式。

「なるほど！」とはならず、この説明では正直私みたいな初学者にはよくわかりませでした笑

という事で自分の言葉で噛み砕いていきます。

#「同値分割」とは？


そもそもテストを書く目的の１つに、「コードに欠陥があるかどうかの確認」があります。仕様通りにちゃんと動くか、計算式が誤っていないかとか。それをチェックするためにテストコードを書きます。

例えば、プログラムの振る舞いとして、「10歳」と入力したら「未成年」と出て欲しいのに、「成年」と出力されちゃったら、困りますからね。

すごくシンプルな例で考えていきます。現在(2021年)の日本に置いて、「年齢20歳以上は成年、20歳未満は未成年」と定義されています(2022年から民法改正が施行される話は置いといて)

では、「テストケースを考える」という視点に戻します。
0歳から19歳までだったら「未成年」、20歳以降であれば「成年」という出力になることを確認したい場合、一番間違いないのは、「0歳」を使ったときのテストケース、「１歳」を使ったときのテストケース、・・・・から100歳まで(さらにそれ以上)の**全てのテストケースを1つずつ記述すれば、間違いなくバグが出ていないか確認できるわけですが、そんな面倒くさいことできませんし、非現実的ですよね。**

そこで**「同値分割」**というやり方(手法)を活用します。
「同値分割」とは、ざっくりした言い方にはなりますが、
**「同じ結果になるグループ・範囲に分けて、その中からどれか適当に選んだ１つのデータをテストケースに使う」**
ということです。

先の例で当てはめると、結果が「未成年」と出力されるのは「0歳から19歳」までのグループ、「成年」と出力される「20歳〜以降」の２つのグループに分けられます。「0歳から19歳」のグループからは適当(代表値)に「10歳」の値、「20歳〜以降」のグループからは適当(代表値)に「75歳」の値を使ってテストコードを書くだけとなります。

「同値分割」というやり方を使わなった時は、100個以上のテストコードを書かなくてはいけなかったのに、「同値分割」を使ったらテストコードは２つで良くなりました。

このことから、「同値分割」は、**テストケースを合理的に減らす**メリットがある言えます。

ただ、ちょっと気になるのが、グループに分けるのはわかったけど、その中から「適当に」値を決めるのはなんかしっくりきません。

そこで**合理的に値を決める手法(考え方)が「境界値分析」**となります。

#「境界値分析」とは？

「境界値分析」とは先ほどの同値分割で分けたグループ同士の境界の値をテストケースとして使います。

理由は、**境界では問題(バグ)が起きやすいから**

先ほどの例で行けば、「20歳」が境界値となりますが、もし仕様として
本来「20歳未満の値であれば未成年」と出力されるべきところを、誤って「20歳以下 の値で未成年」というコードを書いていた場合、20歳という値を入力したら「未成年」と誤った出力されることになります。これは不等号の向きの誤りや、=をつけ忘れていたりといったよくありそうな話です(私です)

だから、同値分割した後は、問題が起きそうな境界値を使ってテストデータを作ろうね、って話です。


#終わりに
上記の説明では、同値分割の際に「有効同値クラス」「無効同値クラス」に分類する過程が書いてなかったり、同値分割や境界値分析の活用時に出てくる問題、といったものには触れておりません。
自分もそうですが、初学者にとって、大まかな全体像を把握していないまま、細部について意識が行ってしまうと、結局自分は何を学んでるんだっけ？という迷子状態によくなります。ですから「テスト」という大まかな目的を記した上で「同値分割」「境界値分析」はどんな意味を持つか、という視点で記事を書きました。
railsアプリをcapsitranoでdeployする時に自動でseedを実行する。けど必要な時だけする。

# 本記事のサマリ
capistranoでrailsアプリをdeployする際に、自動的にseedを流すようにすると、deployの運用的には楽になるが、seedの実行時間が待たされるので、seedファイルが描き変わった時だけ動くように工夫するといいかもという話です。

### 対象読者
- capistranoをつかって、railsアプリをデプロイしており、seedの実行は手動でやっているような方
- seedの実行をcapに任せているが、毎回時間かかっているような方

### 動作確認バージョン
```
Capistrano Version: 3.11.2 (Rake Version: 10.3.2)
Rails 5.1.6
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin18]
```

### 経緯
capistranoでデプロイする際に、seedの実行は変更があったときに、手で実行するのは、面倒です。
なので、そういったものは、自動的にやるようにしたいというのが、怠惰なプログラマな正常な欲求です。
でも、自動的にやってみたのはいいものの、毎回実行していると、seedの肥大化に伴って、実行時間の待ち時間がもったいない。
ならば、seedの変更が会った時だけ実行するようにしようというのが敬意です。

### 方針
やり方はいろいろあると思いますが、seedファイルの変更を検知するために、seedファイルのmd5のハッシュ値をとっておいて、それが切り替わったら実行するというやり方で実現してみました。


### 実物
以下のように、独自で定義したcapistranoのタスクを、`deploy:migrate`の後で実行するようにします。

```deploy.rb
# 〜中略〜
# deploy用のスクリプトで、migrateの後にdeploy:seedタスクを実行させる
after 'deploy:migrate', 'deploy:seed'
# 〜中略〜
```

実際に、seedを実行するタスクは以下のようにして、seedファイルのmd5を保持しておき、それを比較して違っていたらseedを実行するような形で実現します。

```deploy.cap
# 〜中略〜
  # seedの実行タスクは以下の通り
  # 前提となる情報
  #  release_path： deployされたアプリのパス
  #  shared_path: 別のリリース時でも共有できる共有ディレクトリのパス
  #  seedファイルは、実行されるたびに、トランザクションを貼って洗い替え(delete & insert)することで、冪等性を担保している。
  desc 'Load seed data into database'
  task :seed do
    on roles(:db) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          command = 'db:seed'
          # rakeのコマンドを元に、seedファイルの相対パスを組み立て
          seed_filepath = 'db/seed.rb'
          new_digest_filepath = shared_path.join("new_#{seed_filepath.gsub('/', '_')}.md5")
          digest_filepath     = shared_path.join("#{seed_filepath.gsub('/', '_')}.md5")
          # digestがなかった時にエラーにしないために、事前にtouch
          execute :touch, digest_filepath
          execute :md5sum, "#{seed_filepath} > #{new_digest_filepath}"
          # md5が違っていたらseedを反映するコマンドを実行する
          execute "if [ \"`cat #{new_digest_filepath}`\" != \"`cat #{digest_filepath}`\" ]; then cd #{release_path}; RAILS_ENV=#{ fetch(:rails_env) } bundle exec rake #{command}; mv #{new_digest_filepath} #{digest_filepath}; fi"
          end
        end
      end
    end
  end
```
credential.ymlを理解する（デプロイの練習）

## これはなに？
awsでデプロイの練習をしています。`credentials.yml`についてわからないことが多かったので、ノートにまとめてみました。

主に、以下の２つの記事から学習した内容をまとめています。

- [Rails セキュリティガイド - 10.1 独自のcredential](https://railsguides.jp/security.html#%E7%8B%AC%E8%87%AA%E3%81%AEcredential)
- [Rails5.2から追加された credentials.yml.enc のキホン](https://qiita.com/NaokiIshimura/items/2a179f2ab910992c4d39)

## credential.yml.enc とは？
一言でいうと、**環境変数を一つにまとめて書いておく場所**。
Rails5.1までは、環境変数を複数の場所に書いておかなくてはいけなかった（らしい）。

それらをyml形式で書いて、暗号化してまとめてある。言わば機密情報の**集約ファイル**。

### 暗号化されていて、直接編集はできない。
`credentialw.yml.enc`は、以下のコマンドで生成され、編集できます。

```
bin/rails credentials:edit
```

生成された`credentials.yml.enc`は暗号化されているので、直接編集はできません。

```config/credentials.yml.enc
MABIeuyDFIyrzi6BM2....
```

### editorを指定しないと、編集できない。

また、`credentialw.yml.enc`は**環境変数：EDITOR**を指定しないと編集できません。

```sh
$ export EDITOR="vi"
$ echo $EDITOR
  #=> vi
```

#### 余談
こんな風にして、`export EDITOR="vi"` を `.bash_profile` に登録して、ターミナルが起動するたびに環境変数が登録されるようにすると、毎回`EDITOR`を指定しないでよくなります。

```sh
$ echo 'export EDITOR="vi"' >> ~/.bash_profile
$ source ~/.bash_profile
$ echo $EDITOR
  #=> vi
```

### config/master.keyとの関係

`credentials.yml.enc`は`master key`を利用して暗号化・復号されます。

`master.key`がない状態で、`credentials:edit`を実行すると、`master.key`が生成されます。

```sh
$ EDITOR="vi" bin/rails credentials:edit
create  config/master.key
```
### 書き込むもの

今回は、AWSにアプリのデプロイを行ったのですが、書いた内容は「**本番環境の**データベースのパスワード」（ローカルとは違う）

また、ローカルの`credential.yml.enc`と`master.key`の組み合わせが、本番環境のそれと一致していないといけなかったのが、なかなかハマりどころだった。
innerHTML()で作成した要素へのクリックイベントを追加するには(jQuery)

```javascript:main.js
 $("#update_profile").html("<input type='button' id='update' value='更新'>")
```
```index.html
    <div id="update_profile"></div>
```
```javascript:main.js
$("#update").click(function() { 
      console.log("click");
 })
```

 #updateに対して直接Clickイベントを発生させても上手くいきません
これはjsファイル読み込み時には#updateが存在していないからですね
この場合はon()を使ってclickイベントを追加していきます。

```javascript:main.js
$("#update_profile").on("click","#update", function() { 
      console.log("click");
});
```

on()には第一引数にはイベントを第二引数には実際にclickイベントを追加したい要素を間接的に指定しております。
もちろんですが親要素の#update_profileはjsファイルを読み込む前に存在していないといけないです。
lineno.styで一部の行に行番号がつかない

LaTeXで行番号を振るときには`lieno.sty`が使われます。一部の行に番号が振られないことがあります。ググると[解法](https://lambtani.hatenablog.jp/entry/2016/04/26/193817)がすぐに見つかります。確かに行番号がないと査読者をイラつかせるかも。式番号のない式や、番号のないスライドもしかり。

原因や解法の出所を調べたところ、`lineno.sty`の古いバージョンを想定していると思われる記述がありました。

# なんで行番号が付かないの

テキストの後に段落を分けずに別行立ての数式があると行番号が振られないことがあります。別行立ての数式があるために段落が続いているのに、改行されているためとのことです。`lineno.sty`には`linenomath`環境があり、`equation`と`equation*`環境を再定義しているため、`amsmath`を使わない場合、問題は発生しません。

`amsmath`を使う場合は、`align`環境などで問題が発生します。後述の通り`equation`環境で発生する場合もあります。

# 解決法

## 手動

`lineno.sty`の`linenomath`環境で数式を囲みます。

```latex
\documentclass{article}

\usepackage{amsmath}
\usepackage{lineno}
\usepackage{lipsum}

\linenumbers

\begin{document}

\lipsum[1]
\begin{linenomath}
  \begin{align}
    a & = 6.371\times 10^{6}\,\mathrm{m} \\
    \Omega &= 7.292\times 10^{-5}\,\mathrm{s}^{-1}
  \end{align}
\end{lienomath}

\end{document}
```

![linenomath.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/7853280b-b029-7ed9-82dc-b1b058079c4c.png)


## aligned

`align`環境ではなく`equation`環境の中で`aligned`を使うという方法もあります。ただしこの場合式番号は全体に一つだけつきます。また、`amsmath`でも`equation`が再定義されているので、`amsmath`を`lineno`よりも前に書く必要があります。

```latex
\lipsum[1]
\begin{equation}
  \begin{aligned}
    a & = 6.371\times 10^{6}\,\mathrm{m} \\
    \Omega &= 7.292\times 10^{-5}\,\mathrm{s}^{-1}
  \end{aligned}
\end{equation}
```

![equation-aligned.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/ab77b0d8-6516-2dfb-10d9-4137df22a268.png)


## amsmathにパッチ

冒頭の[ブログ](https://lambtani.hatenablog.jp/entry/2016/04/26/193817)に掲載されていたもののオリジナルは [こちら](https://phaseportrait.blogspot.com/2007/08/lineno-and-amsmath-compatibility.html)のようです。改訂版はネットニュースでやり取りする中で提案されたものですが、若い人は[usenet](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9)知らないだろうな。

[etoolboxを使う方法](https://tex.stackexchange.com/questions/461186/how-to-use-lineno-with-amsmath-align)がきれいです。

# 参考
* [lineno](https://ctan.org/tex-archive/macros/latex/contrib/lineno)
* Stack Exchange [How to use lineno with amsmath align?](https://tex.stackexchange.com/questions/461186/how-to-use-lineno-with-amsmath-align)
* [lineno and amsmath compatibility](https://phaseportrait.blogspot.com/2007/08/lineno-and-amsmath-compatibility.html)