OmniAICreator/Qiita-1.07M huggingface dataset:
gitのコミットを取り消したい時に使う3つの方法

間違ってコミットしてしまった、コミットしたらデグレしてしまった。。
こういう時にコミットを取り消すコマンドがあります。
3つほど紹介したいと思います。

## gitのリポジトリ

![Screen Shot 2021-01-14 at 23.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/3d4029e0-af71-b8cd-e11c-14eb5c959328.png)

working treeが手元のコード。一番新しいです。
```git add ファイル名```するとindexというコミット準備段階になります。
index上のファイルに```git commit -m "comment"```するとメッセージとともにlocal repositoryに保存されます。最新のlocal repositoryのことを**HEAD**と呼びます。
最後に```git push```すると、GitHubなどチームで管理するrepositoryに移ります。

## reset

remoteにpushする前ならこの方法で楽に任意のコミット履歴まで**巻き戻せます**。
pushしたあとresetするとリモートとの履歴に不整合が起き、```git push -f```する必要が出てきますので注意。
もし自分のpushの前に誰かがpushした状態で、**フォースプッシュするとその人のコミットを消し飛ばす**ので極力避けましょう。

```cmd
// 1つ前のコミットに戻りworking treeもリセット
git reset --hard HEAD^

// 4つ前のコミットに戻りworking treeもリセット
git reset --hard HEAD~4

// add を取り消す
git reset --mixed

// 4つ前のコミットに戻りworking treeはそのまま
// つまりコミットのHEAD任意の履歴まで戻り、コード自体は残ったままになる。
git reset --soft HEAD~4

// 誤ってgit resetをした際に元に戻す
git reset --hard ORIG_HEAD
```

## revert

```git rest --hard```した際に他の人がpushした履歴（コミットログ）が消し飛ぶ危険性を避けるには、新たに打ち消し用コミットを作成する方法があります。
これなら履歴も消えないのでフォースコミットする必要はありません！

```
git revert <対象のコミットID>
```

## rebase

無駄にコミットをしてしまい、醜くなってしまった時にまとめることができます。
あとで履歴を見たときに見やすく、レビューしてもらうときに余計な手間をかけさせないために使いましょう。

```
git rebase -i HEAD~3

// こんな画面がviで表示されます。
// pickで残す履歴、sでまとめてしまう履歴を選びます。
// この場合はe331898だけ残し、あとはまとめてしまいます。

pick e331898 wip
s c45e0bf test 6
s 042074b wip

# Rebase 8ac1025..042074b onto 8ac1025 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
```

## JetBrainのEditorを使っている方
ちなみにIdeaやPhpStormなどJetBrainのEditorを使っている方はここからもrevert, resetできて便利ですよ！
Gitのタブを開く>Log>特定のコミットをクリック> revert commit
![Screen Shot 2021-01-14 at 23.25.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/060ca4f4-c472-2d7e-9733-e7a3a19ba00b.png)
【Tailwind + React】NavLinkを使ってactiveクラスをスタイリングする方法


#### NavLink利用時の問題点


・通常時のテキストカラーは黒
・アクティブ時はテキストカラーが白、背景色は黒

以上のようにスタイリングを行いたい場合、`activeClassName`を使用てもスタイリングが**上書きされない**。

```react.jsx
          <NavLink
            className={`inline-block px-4 py-2 rounded-full font-semibold text-sm text-black`}
            activeClassName={`bg-black text-white`}
            to={`/blogs/${user.uid}`}
          >
            ブログ
          </NavLink>
```




#### 解決方法： @applyを使用してスタイリングを行う

Tailwind導入の際に作成した`index.css`内で@applyを作成してスタイリングをあてる。

```css:index.css
/* ./src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;

a.active {
  @apply bg-black text-white;
}

```

（参考画像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378452/96f12778-7811-560b-536e-d95937705da0.png)

以上のように`aタグ`のclass内にactiveが付与される。
`a.active`と指定することで、activeが付与された際のスタイリングを当てることが可能。

また、その際は`NavLink`の`activeClassName`は使用しないので削除してOK。

```react.jsx
　// 通常時（inactive）のスタイリングがベースとなる
          <NavLink
            className={`inline-block px-4 py-2 rounded-full font-semibold text-sm text-black`}
            to={`/blogs/${user.uid}`}
          >
            ブログ
          </NavLink>
```

---
**参考リンク**

[Conflicting className precedence rules #1010
](https://github.com/tailwindlabs/tailwindcss/issues/1010) [Tailwindドキュメントのindex.css](https://tailwindcss.com/docs/guides/create-react-app#include-tailwind-in-your-css)
GoogleAppsScriptで自動インデントのショートカットキーが変更になってたのでメモ

#Google apps scriptのIDEの改定
2020年12月頃、改定されました。僕の環境には翌年1月頃使えるようになり、便利になってとても嬉しかったのですが、**「Shortcut key:Tab で選択した行のインデントの自動揃えができる」**という機能が無くなってしまったようで、結構不便になってしまいました。
　慣れないながら英文記事を探してみたら解決策が見つかったのですが、twitter/Google検索結果からは日本語での解決策が見つからなかったため、今後誰かが無駄な時間を使わないようにここに示しておきます。



#結果
**[Tabから、Shift + Alt +F]へと**変更になってました。
なんてことはないですね。でも僕の30分を返して。
後、右クリックからでも行けるようになってた。
![アニメーション.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205043/147f3a25-05b8-b543-e0fd-327652787a91.gif)
【自分用】NoMethodError:        undefined method `set_encoding' for

```
Failures:

  1) Product POST #create ログインしているユーザー productの数が一つ増えていること
     Failure/Error: expect {post products_path, params: product_params }.to change(Product, :count).by(1)
     
     NoMethodError:
       undefined method `set_encoding' for #<Product:0x0000000007fe4988>
```

ここからが改善策。まずは直す前

```
describe 'POST #create' do
🌟🌟let(:product_params) { FactoryBot.create(:product,title: '新規投稿',user: user) }
    context 'ログインしているユーザー' do
      it 'productの数が一つ増えていること' do
        #ログインする
        sign_in_as(user)
        #POSTで投稿の新規作成,数が一つ増えているかexpect
        expect {post products_path, params: product_params }.to change(Product, :count).by(1)
      end
    end
```
改善策

```
describe 'POST #create' do
    #新しいproductを作る
    🌟🌟let(:product_params) do 
      { product: {
        title: "四皇",
        language: "PHP",
        detail: "ウオウオの実",
        period: "8年",
        user: user
       }
      }
    end
    context 'ログインしているユーザー' do
      it 'productの数が一つ増えていること' do
        #ログインする
        sign_in_as(user)
        #POSTで投稿の新規作成,数が一つ増えているかexpect
        expect {post products_path, params: product_params }.to change(Product, :count).by(1)
      end
    end
```
Azure Functions のアラート設定調査（備忘録）

# 

## 概要

Azure Monitor ([Azure Application Insights](https://docs.microsoft.com/ja-jp/azure/azure-monitor/app/app-insights-overview#how-does-application-insights-work)) を使った、Azure Functions の監視方法について記述する。

## Azure Monitor ログを使用した Azure Functions の監視について

- 同じワークスペース内の異なるリソースのログを統合可能。
- それらを、クエリを使用して分析、収集など可能。
- Azure Portal で Log Analytics などで分析も可能で、それらを視覚化・アラートるるーに利用することが可能。

> 本記事執筆時点において、Azure Monitor Logs との統合は、Windows Consumption、Premium、Dedicated ホスティング プランで実行されている v2 および v3 の関数アプリについては、プレビュー段階との記述あり。

## 設定方法

1. Azure portal で関数アプリの[監視]セクションから、[診断設定]を選択し、[診断設定を追加する]をクリック。

    ![diagnostic-settings-add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/9971ccbb-6c06-eff8-72aa-0549824e1d2e.png)


1. [診断設定] ページの [カテゴリの詳細] と [ログ] で、FunctionAppLogs を選択（[FunctionAppLogs] テーブルには、目的のログが含まれている。）。

1. [宛先の詳細] で、 [Log Analytics への送信] を選択して、Log Analytics ワークスペース を選択。

1. 診断設定名 を入力して、 [保存] を選択。

    ![choose-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/c6525ae6-c95d-efd1-97b6-f5ae87058bcb.png)


## ユーザー生成ログ（カスタムログ）

カスタムログを生成するには、以下のようなステートメントを使用する。

- C#

      log.LogInformation("My app logs here.");

- Java

      context.getLogger().info("My app logs here.");

- JavaScript

      context.log('My app logs here.');

- PowerShell

      Write-Host "My app logs here."

- Python

      logging.info('My app logs here.')

## ログのクエリ

生成されたログをクエリするには、以下の操作を行う。

1. 関数アプリから、[診断設定]を選択する。

1. [診断設定]から、関数ログの送信先として構成した Log Analytics ワークスペースを選択する。

1. [Log Anaytics ワークスペース]ページで、[ログ]を選択する。

    ![querying.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/93895d6b-fbbf-88b6-066a-a8686bc86a9a.png)


Azure Functions によって、すべてのログは、[LogManagement] の FunctionAppLogs テーブルに書き込まれる。

以下に、いくつかのサンプルクエリを示す。

### すべてのログ

    FunctionAppLogs
    | order by TimeGenerated desc

### 特定の関数のログ

    FunctionAppLogs
    | where FunctionName == "<Function name>"

### 例外

    FunctionAppLogs
    | where ExceptionDetails != ""
    | order by TimeGenerated asc

## 参考資料

- [Azure Functions を監視する](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-monitoring)
- [Azure Monitor ログを使用した Azure Functions の監視](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-monitor-log-analytics?tabs=csharp)
[ruby]別のハッシュの値とキーを参照して、ハッシュに値を代入する方法

大したネタじゃないが、自分は最初結構こまったので。

例えば次のようなハッシュがあったとする。

| key | value |
|:-:|:-:|
| 太郎 | 宮城  |
| 次郎 |  青森 |
| 花子 | 沖縄 |

これは単純に`hash = {"太郎" => "宮城", "次郎" => "青森","花子" => "沖縄"}`みたいに書けばいいだけだが、それと別にこんなハッシュもあるとする。

| key | value |
|:-:|:-:|
| 宮城  | 400円  |
| 青森  | 700円 |
| 沖縄  | 1200円 |

各県送料がこのくらいなのかはよくわからないのでデタラメな数字なのは勘弁して欲しいが、まぁ各地の送料みたいな表のようなイメージだ。これも`ref = {"宮城" => 400 ,"青森" => 700 ,"沖縄" => 1200}`みたいにかくとする。

これで名前と送料の組のハッシュに変換したいみたいな場合の記述が案外調べても出てこなかったので、備忘録的に。

##コメントで頂いた方法

自分は一旦二次元配列になおしてもう一回ハッシュに戻すなんて面倒臭いことをやっていたが、ハッシュの値をすべて直接変更できるメソッドである`transform_values`を使ったほうが全然よかった。お教え頂きありがとうございます。

```ruby
list = hash.transform_values{ |x| ref[x] }

p list
# { "太郎" => 400 , "次郎" => 700, "花子" => 1200 }
```

もしくは

```ruby
hash.transform_values(&ref)
```

でもいいらしい。スマート！


##自分でやってた方法

```ruby
list = hash.to_a.each{|x| x[1] = ref[x[1]]}.to_h 

p list
# { "太郎" => 400 , "次郎" => 700, "花子" => 1200 }
```

順番に処理したいので、一旦`to_a`で二次元配列になおして、順番に二番目（x[1]）に、refのハッシュのバリューを入れていって、最後はハッシュになおすだけ。

シゴク単純だが、意外とこれ迷うんだよね。ていうかもっと簡単な方法あったりしそうな気がする（ありました）。
【Unity】Display Resolution Dialog廃止以降でも解像度指定したい

## はじめに
ProjectSettingsのPlayerにあった`Display Resolution Dialog`がUnity 2019.3あたりからいなくなりました。

- 2018.4 Manual  
https://docs.unity3d.com/ja/2018.4/Manual/class-PlayerSettingsStandalone.html
- 2019.4 Manual  
https://docs.unity3d.com/ja/2019.4/Manual/class-PlayerSettingsStandalone.html


デバッグとかちょっと解像度変えたい時が個人的によくあるので、今後は各自で対応する必要がありそうです。
以下は思いあたる対応となります。

## 環境
- Windows10  
(macOSでも同様なことができると思います)
- Unity 2019.4  

## 方法①
#### UnityのScene内で解像度指定するUIと機能を実装する。
`UnityEngine.Screen.SetResolution`を実行中に呼び出せば変更されます。
ただ実装が大変。

https://docs.unity3d.com/ja/current/ScriptReference/Screen.SetResolution.html

## 方法②
#### Display Resolution Dialog(Launcher)を作る。
Unityで書き出したexeにコマンドライン引数を渡すようなGUIを用意すれば、今まで同様に指定解像度で起動してくれます。
アプリを起動する前に指定できるので画面切り替えがなくてスムーズです。
配布物とかだとユーザー側は扱いやすいと思います。

このあたりを引数に渡せばよしなにしてくれそうです。

- **-screen-fullscreen**
- **-screen-height**
- **-screen-width**
- **-screen-quality**

`~~.exe -screen-width 1280 -screen-height 720`

ただ、GUI組むとなるとこれも少し大変。

https://docs.unity3d.com/ja/2019.4/Manual/CommandLineArguments.html

## 方法③
#### 直接コマンドライン引数を渡す。
方法②はGUI実装が大変なので、Windowsのコマンドプロンプトやショートカットなどで引数を渡してさっくり起動しようという話です。
外見はいいのでとにかくすぐ設定を変えて見たい時はこれでいい気がします。

ショートカットだと以下の感じ。

1. Unityで書き出したexeを対象にショートカットを作成。
1. プロパティを開いてリンク先の後ろに引数を付け足す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228487/282adafc-99c3-8f9c-c82c-6647539bb352.png)

##参考
https://forum.unity.com/threads/display-resolution-dialog-deprecation.793611/
AWS Lightsail 入門2 SSH接続（RLogin）

## 本記事の内容
- Windows 10 PCにSSHクライアント「RLogin」を導入し、Lightsailインスタンス（Linux）に接続する。

## 前提条件
- Windows PC（本記事はWindows 10 Pro バージョン 20H2で作成）
- Lightsailインスタンスを作成済み。

[AWS Lightsail 入門1 インスタンス作成](https://qiita.com/s8ta/items/fd274b05b083bcf36dba)

## SSHクライアント接続のメリット
Lightsailはブラウザ版のターミナルでも接続できるが、SSHクライアントを使用することで次のメリットがある。

- 一度設定すれば、必要なときにすぐ接続できる。（ブラウザ版ではAWSへのサインインや2段階認証、画面遷移が必要）
- 各SSHクライアントの便利な機能が使える。
- 細かな設定が行える。

## RLoginとは
Windows用のSSHクライアントは複数あるが、今回は「RLogin」を導入する。
RLoginには次のようなメリットがある。

- 単一の実行ファイル「RLogin.exe」で動作。「RLogin.ini」を作成すればレジストリを使用せずに設定を管理できるため、導入や複数PCでの設定共有がしやすい。
- 接続先をタブでグループ分けできるため、多くのサーバーを扱う場合でも探しやすい。
- SFTPのファイル転送機能がある。WinSCPやFFFTPのように、GUIでファイルのアップロード・ダウンロードが行える。
- 歴史が長く、現在も開発が継続されている。（1998年～2021年1月現在）

## 接続情報の取得
SSHクライアントからの接続に必要な以下の情報を、Lightsail管理画面で確認・取得する。

- インスタンスのパブリックIP
- インスタンスのOSユーザー名
- SSHプライベートキー（秘密鍵）

### パブリックIPとOSユーザー名の確認
Lightsail管理画面を開き、接続対象のインスタンスを選択する。
[接続]タブの下に、パブリックIPとOSユーザー名が表示される。

<img width="80%" alt="aws-lightsail-02-001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/615b5539-c37c-e481-bf63-06becfa1ed2b.png">

※パブリックIPが分かれば、世界中のどこからでも接続や攻撃を試みることができてしまうので、必要なければ公開しない。

### SSHプライベートキーのダウンロード
Lightsail管理画面右上の[アカウント]よりアカウントページを表示。
[SSH キー]タブを選択し、対象リージョン（今回は東京）の[ダウンロード]を選択。
「LightsailDefaultKey-ap-northeast-1.pem」がダウンロードされる。

<img width="80%" alt="aws-lightsail-02-002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/86a365d2-1707-35f8-543e-21e75b6c59b5.png">

※SSHプライベートキーは、パスワードと同様に自身であることを証明する重要なファイルのため、他人に配布しないよう注意。

## RLoginの導入・起動
下記サイトよりRLoginをダウンロードし、PCに導入する。
[RLogin > 1.3 インストールおよびアンインストール](http://nanno.dip.jp/softlib/man/rlogin/#INSTALL)

1. [実行プログラム(64bit)]より「rlogin_x64.zip」をダウンロードし、任意の場所に展開。
2. 「RLogin.exe」と同じフォルダにファイル「RLogin.ini」を作成。（内容は空で良い）
3. 「RLogin.exe」を実行。

<img width="30%" alt="aws-lightsail-02-003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/d08500c1-8153-63bf-c2ab-934cde3bd4ab.png">

※「RLogin.ini」を作成すると設定をレジストリに保存しなくなるため、設定のバックアップや複数PCでの共有が容易になる。
ただし、ファイル破損のリスクや動作が遅くなるデメリットもあるとのこと。

## RLoginからLightsailインスタンスへの接続
RLoginを起動後、接続一覧で[新規]を選択。

<img width="50%" alt="aws-lightsail-02-004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/655588f8-d981-f14d-a4f6-7946792de6a0.png">

下記項目を入力後、[OK]を選択。

- [エントリー]: インスタンス名（表示用のため値は任意）
- [タブ]: 接続一覧のグループ名（任意）
- [ホスト名]: インスタンスのパブリックIP
- [ログインユーザー名]: インスタンスのOSユーザー名
- [SSH認証鍵]: ダウンロード済みのSSHプライベートキーを選択。

<img width="80%" alt="aws-lightsail-02-005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/cc8af495-d97e-b0fa-027f-5bb9ace70ffb.png">

接続一覧より上記で登録した行を選択し、[OK]を選択。
※初回は確認ダイアログが表示されるが、[接続する]、[はい]を選択。
<img width="50%" alt="aws-lightsail-02-006.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/f7c52a34-6d85-0ace-3a71-01a5fe8315a3.png">

インスタンスにSSH接続され、コマンド入力が可能になる。
<img width="80%" alt="aws-lightsail-02-007.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010477/b08de606-f7ae-7a23-0cb3-2a625d8bf197.png">
Markdown記法

# はじめに
初投稿です。
これからQiitaに記事を投稿するにあたり、個人的に使いそうなMarkdownの書き方をまとめます。

#見出し
__文頭に【#】__
__【#】の数でh1〜h6まで__
>
#\#見出し (h1)
##\##見出し (h2)
######\######見出し (h6)

#引用
__【>】をつける__
__〜空行が開くまで__
>
\>
ここに引用文
(空行)

#太字
__アンダーバー2つ【\__】で囲む__
>
\_\_太字__

__太字__

#コードの挿入
__バッククオート【```】で囲む__
>
>
\`\`\`
puts "Hello World!"
```

```
puts "Hello World!"
```


__最初のバッククオートの横に言語名をつけるとハイライト__
>
\`\`\`ruby
puts "Hello World!"
```

```ruby
puts "Hello World!"
```

__コロンで仕切るとファイル名も入る__
>
\`\`\`ruby:hoge.rb
puts "Hello World!"
```

```ruby:hoge.rb
puts "Hello World!"
```

#エスケープ
__【\】をMarkdownの前につけることでMarkdownを無効化できる__
>
\\#見出し

\#見出し

#リスト
__文頭に【*】or【+】or【-】を入れる__

>
\* 順序なしリスト

* 順序なしリスト

__文頭に【数字.】を入れる__
>
1. 順序つきリスト
2. 順序つきリスト

1. 順序つきリスト
2. 順序つきリスト
JupyterLab3.0 デバッガ インストール方法 for Windows


##Jupyter Lab3.0リリース
待望のビジュアルデバッガーが付属し使いやすくなった！
https://blog.jupyter.org/jupyterlab-3-0-is-out-4f58385e25bb

単純にバージョンをあげるだけでは、デバッガ機能が有効になるわけではなく、
意外とインストールが面倒臭かったのでまとめてみる。

##インストールフロー
①minicondaのインストール
　↓
②xeus-python(デバッガ)のインストール
　↓
③Jupyter labのアップデート
　↓
④インストール確認
　↓
⑤ライブラリの再インストール



##①minicondaのインストール
xeus-pythonは、condaパッケージマネージャー用にパッケージ化されているため
conda系の環境をインストールする必要がある。
Anacondaでは競合する機能があるため、ここでは機能制限されたminicondaを使用する。
（Anacondaをインストールしていたらアンインストールする）

######↓各々の環境のソフトをDLインストール
https://docs.conda.io/en/latest/miniconda.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998045/e075ea2e-acb4-6e8b-1249-fd55c591621b.png)

######PATHを通す(不要
システム環境変数のPathに追加
C:\Users\(ユーザー名)\Miniconda3\Scripts
コマンドプロンプト上で作業をするわけでなければ必須ではなさそう。



##②xeus-python(デバッガ)のインストール
以降の作業はインストールした
Anaconda Prompt(miniconda3)で行う


https://xeus-python.readthedocs.io/en/latest/installation.html
With condaのコードを順番に実行していく

```python:xeus-python_install.py
conda create -n xeus-python
conda activate xeus-python # Or `source activate xeus-python` for conda < 4.6
conda install xeus-python jupyterlab -c conda-forge
```


##③Jupyter labのアップデート
②で最新の物になっているかもしれないが…念のため

```python:Jupyterlab_update.py
conda install -c conda-forge jupyterlab = 3
```

##④インストール確認
Anaconda Prompt上でJupyter labを起動。
Xpythonの記載があればインストール成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/998045/6105a301-6b47-7aef-e520-9c335201367b.png)

##⑤ライブラリの再インストール
環境が変わるため、使いたいライブラリ(pandas、numpy…)は再インストールする。
conda install pandas（pipではなくcondaでインストール）



以上。

追記）起動させるたびに②xeus-python(デバッガ)のコードを事項しないとデバッガが立ち上がらない問題アリ

※デバッガのチュートリアルはこちら
https://jupyterlab.readthedocs.io/en/stable/user/debugger.html
マジョカアイリスの画像抜き出しと更新

SDカードに入っているファイル AB565.bin から画像を抜き出して更新して戻します。環境はUbuntu20です。

画像の変換に ffmpeg が必要ですので先にインストールしておきます。

~~~~bash
sudo apt install -y ffmpeg ;
~~~~

AB565.bin からヘッダー部、フッター部切り分け

~~~~bash
dd if=AB565.bin of=AB565_head.bin bs=2 skip=0       count=2457600 ; # (640px*48px)*80pics
dd if=AB565.bin of=AB565_foot.bin bs=2 skip=2457600 count=4620288 ; # (128px*128px)*282pics 
~~~~

ヘッダー部から画像640x48を切り出し

~~~~bash
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 640x48 -i AB565_head.bin -f image2 -vcodec bmp AB565_head_%3d.bmp ;
~~~~

フッター部から画像128x128を切り出し

~~~~bash
ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb565 -s 128x128 -i AB565_foot.bin -f image2 -vcodec bmp AB565_foot_%3d.bmp ;
~~~~

これで以下のような画像群が抜き出せます

![Screenshot from 2021-01-14 21-48-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115935/5ea6d6e8-8fcc-0066-7ddc-b2874a09101d.png)

画像を変更後、また、１つのファイルにしていきます。

ヘッダーとフッターの画像群をそれぞれbin化

~~~~bash
ffmpeg -vcodec bmp -i AB565_head_%3d.bmp -vcodec rawvideo -f rawvideo -pix_fmt rgb565 AB565_head_updated.bin ;
ffmpeg -vcodec bmp -i AB565_foot_%3d.bmp -vcodec rawvideo -f rawvideo -pix_fmt rgb565 AB565_foot_updated.bin ;
~~~~

１つのbinファイル化

~~~~bash
cat AB565_head_updated.bin AB565_foot_updated.bin > AB565_updated.bin ;
~~~~

差分確認

~~~~bash
diff AB565.bin AB565_updated.bin ;
~~~~
OpenAIGymの学習用コンテナのDockerイメージを作成しました

# 概要
使い慣れたローカルのVSCodeで、Dockerコンテナの機械学習環境を作りたいと思い作成しました。
Dockerイメージを作成するのは始めてだったので、いろいろなエラーに泣きながらもGymの動作が確認できたので
リリースしました。

[OpenAIGym_noVNC](https://github.com/yossyKee/OpenAIGym_noVNC)



  
Visual Studio CODEを用いて、コマンドベースでgym環境を動かし、動作の様子をブラウザで確認するために作りました。  

## 機能
- sshでコンテナ（Ubuntu18.04)に接続し,GUIをnoVNCを使ってブラウザで確認することができます。  
- `root`と`user`の2つのユーザーが設定されます。  
- `run.sh`でローカルのとコンテナ上のボリュームを共有する設定ができます。  

## Build
```bash:build.sh
docker build --build-arg ROOT_PASSWORD=password -t gym_container:dev .
```  

`ROOT_PASSWORD`にssh接続時に使用するパスワードを設定してください。  

ターミナルで`build.sh`を実行します。

```bash:実行コマンド
$ sh build.sh
```

## Run
`run.sh`を実行します。

```bash:実行コマンド
$ sh run.sh
```

## ssh経由でコンテナに接続
sshのポートは`run.sh`で`2222`に設定しています。
 
```bash:sshで接続
$ ssh user@localhost -p 2222
```
## ブラウザ上での確認
vncのポートは`run.sh`で`6081`に設定しています。
HTML5対応ブラウザで `localhost:6081` に接続します。
Effective Python 学習備忘録 13日目 【13/100】

# はじめに

Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです！

# 今回学習する教材

- [Effective Python](https://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Effective+python&qid=1609408832&sr=8-3)

    - 8章構成
    - 本章216ページ

# 今日の進捗

- 進行状況：79-86ページ
- 第3章：クラスと継承
- 本日学んだことの中で、よく忘れるところ、知らなかったところを書いていきます。

## プライベート属性よりはパブリック属性が好ましい

Pythonのクラスの属性の可視性にはパブリックとプライベートがあります。
アンダーバーを2つ付けることでプライベートとして扱われます。
**classブロックの内部で宣言されるもののみ、プライベートにアクセスできます。**
例えば、サブクラスからは親クラスのプライベートにアクセスできません。

```python
class MyObject(object):
    def __init__(self):
        # パブリック
        self.public_field = 2
        # プライベート
        self.__private_field = 4

    def get_private_field(self):
        return self.__private_field
```

パブリックはどこからでもドット演算子でアクセスできます。

```python
obj = MyObject()
print(obj.public_field)
# 2
```

プライベートは.演算子でアクセスしようとすると例外が発生します。

```python
print(obj.__private_field)
```

出力結果

```result
AttributeError: 'MyObject' object has no attribute '__private_field'
```

`__dict__`を用いてオブジェクトの属性を確認してみます。

```python
print(obj.__dict__)
# {'public_field': 2, '_MyObject__private_field': 4}
```

パブリックは同じ属性名ですが、プライベートは `__private_field` ではなく、`_MyObject__private_field` になっています。
Pythonでは、プライベート属性の振る舞いを単純な属性名の変換で行っているためおきています。
そのため、以下のようにすればプライベートにも簡単にアクセスできます。

```python
print(obj._MyObject__private_field)
# 4
```

しかし、この方法を用いても親の親のプライベートクラスにはアクセスできないです。
Pythonのプライベートは無理やり外部からアクセスできる点、多重継承になるとアクセスできなくなる点からそもそも、サブクラスを締め出すのではなく、
内部APIと属性を利用できるように考慮すべきであり、保護フィールドについてドキュメンテーションで説明した方がいいようです。
サブクラスとの名前の衝突を避けるときのみプライベートの使用を考慮すべきなようです。

## カスタムコンテナ型は collections.abc を継承する

カスタムコンテナ型を正しく実装するには多数のメソッドが必要になります。
そのため、自分のコンテナ型を定義するのはかなり困難です。
それらを解消するために存在するモジュールが collections.abc です。
このモジュールはコンテナ型の典型的なメソッドをすべて提供す抽象基底クラスを定義しています。
この抽象基底クラスを作って、必要なメソッドを実装し忘れていると、モジュールが指摘してくれます。

```python
from collections.abc import Sequence

class BadType(Sequence):
    pass

foo = BadType()
# TypeError: Can't instantiate abstract class BadType with abstract methods __getitem__, __len__
```
Railsで別モデルのデータを使って親データのフィルタリングをする方法

#はじめに
Railsで別モデルや、アソシエーションが遠いモデルのデータ情報を元にフィルタリングしたい時があり、書き方が分からなかったのでメモさせていただきます。

##モデルとアソシエーション
状況のイメージは下記図になります。
下記図でいうと、Topicテーブルのカラムである**`week_id`**でArticleテーブルのデータをフィルタリングしたい・・・
![スクリーンショット 2021-01-14 22.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493982/31c537c8-07a1-4336-5e0b-b411d2b1bc98.png)

モデルとアソシエーションは以下になります。

```ruby:article.rb
class Article < ApplicationRecord
    has_many :article_items, dependent: :destroy
end
```

```ruby:article_item.rb
class ArticleItem < ApplicationRecord
    belongs_to :article
    belongs_to :topic_item
end
```

```ruby:topic_item.rb
class TopicItem < ApplicationRecord
    has_one :article_item
    belongs_to :topic
end
```

```ruby:topic.rb
class Topic < ApplicationRecord
    has_many :topic_items, dependent: :destroy
end
```
『ArticleモデルとTopicモデルにアソシエーションを持たせれば？』と考えましたが、あまりデータ構造はいじらないでくれ、と言われたことがあったので、アソシエーションはいじらない前提です。

## 結論
```ruby:articles_controller.rb
class ArticlesController < ApplicationController
    def index
        @articles = Article.filter_week(params[:week_id_in])
    end
end
```

```ruby:article.rb
def filter_week(week_id_in)
    joins(article_items: {topic_item: :topic}).where(topics: {week_id: week_id_in})
end
```
多くの場合indexコントローラーで表示するデータは別モデルのパラメーターがある場合にみ表示されることはないかと思いますが、今回は説明用ということでフィルターの該当部分のみ記載しております。

ここでは**`articles_controller`**で**`filter_week`**というメソッドを定義し、引数にパラメーターの**`week_id_in`**を渡します。
パラメーターの**`week_id_in`**は以下のような想定です。

```
Parameters: {"week_id_in"=>["1", "3", "5"]}
```

**`filter_week`**メソッドは**`article.rb`**に記載し、**`joins`**を用いて目的のテーブル（ここではtopicsテーブル）まで結合し、whereでパラメーターの**`week_id_in`**を用いて**`week_id`**をフィルターすることができました。
## 最後に
『実現したい処理』はハッキリしてても今回のような**『書き方が分からないだけで闇雲に時間を費してしまう』**ことは減らしていきたいです。
同じ状況の方がいれば本記事がお役に立てれば幸いです！
React使う際の始動手順

この記事はZennに書いてましたが、難易度的にはQiita向けっぽく思えてきたため、こっちにもも同じもの投稿してちょっと反応見させてもらいます

やるときいつも「あーなんだっけ」となるので、後で見返したりうっかり忘れたりした時のためにまとめておきます

## TL;DR
React使ってプロダクト作ったりする際の、サーバ起動あたりのコマンド軽くまとめ

## 前提条件（環境）
・Windows10
・npm

### 結論だけ
PowerShell開いて、プロジェクトのディレクトリ置きたいディレクトリに`cd`とかで入って以下のコマンド

```
npx create-react-app プロダクト名
cd 今作ったプロダクト名
npm start
```
これを実行することで、 `http://localhost:3000/` （環境により違うかも）で作ったページが見れる

## 詳細な過程

### Windows PowerShellを起動
コマンド叩いて実行する必要があるので、Windows環境ゆえWindows PowerShellを起動する必要があります
（Macだったらコマンドプロンプト、また使用するIDEによってはIDE上でできることも）
なので、検索欄なりスタートメニューなりからWindows PowerShellを起動します

### 対象のディレクトリに移動
起動コマンドについては、~~`create-react-app プロダクト名` で用意し、~~ [Ver5](https://create-react-app.dev/docs/getting-started/)の登場により、コマンドは `npx create-react-app プロダクト名` に代わりました。今まで使っていた場合は `npm uninstall -g create-react-app` で前のcreate-react-appを消してからこのコマンドを実行するようにしましょう
このコマンドでディレクトリを作成＋初期化してから、作ったReactプロダクトのあるディレクトリで起動する必要があります
そのため、まずcdコマンドで対象のディレクトリ（ `package.json` のあるところ）に移動します

```
cd Reactプロダクト置いてるディレクトリ
```

~~環境によりますが、PowerShell開いたときのドライブ（たいていCドライブのはず）と別のドライブにディレクトリ置いてあるなら先にドライブ移動の必要もある（自分はDドライブに置いている）ので、その場合は以下の例のようなドライブ移動コマンドを先に打ってドライブを移る過程が必要です~~

```
D:
```

試してみたら、ドライブまたぐ場合であってもこれ無しにcdで普通に飛べました

### コマンド実行制限の部分解除（場合による）
セキュリティのために、Set-ExecutionPolicyコマンドレットによってスクリプト実行の制限がなされていることがあります（「~ cannot be loaded because running scripts
is disabled on this system.」「このシステムではスクリプトの実行が無効になっているため、～を読み込むことができません」とか出てきたらこれ）
その場合は、以下のコマンド叩いてスクリプト実行の制限を、とりあえずローカルのファイルからは許可するように「RemoteSigned」に設定し、制限を部分解除すれば実行できるようになります

```
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process
```
やり終えたら

```
Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope Process
```
あたりで戻しておくと安全かもしれません
（状態に関しては `Get-ExecutionPolicy` コマンドで確認可能。今回の本題とは外れるので詳しく調べたい場合はググって）

### サーバ起動
頻出なのでわざわざ言うことは無いと思う以下のコマンドで起動します

```
npm start
```
yarn使ってる場合はまた変わってきます（ `yarn run` とか）

### ページ確認
ここまでやれば `http://localhost:3000/` （環境により違うかも）で、対象Reactプロダクトのページが標準ブラウザに設定しているブラウザで自動的に開きます
あとは確認しながらReactいじってください



素のHTMLなら特に前準備なくてもHTMLファイルをブラウザにドラッグするとかで見れるので、最初の頃はやや面倒に感じました（たまに今でも）
多分自動化する手段とかはありそう
Zohoの便利アプリ紹介

こんにちは、まめぞうです。

本日は私、まめぞうが日常の業務で使い倒しているZohoのアプリケーションを厳選して紹介します。特にZohoOneを利用している方は、無料で使えるので是非チャレンジしてみてくださいね。

# ZohoCRM
これなくなったら死んでしまうんとちゃうか、というくらい使ってます。
ワークフローの構築やカスタム関数などを組み合わせて業務の自動化を進めています。
普段カスタマーサポートもしているのですが、メール送信や対応履歴、追いかけタスクの管理などなど、ほとんどCRM完結で対応しています。
めっちゃ便利です。

# ZohoAnalytics
BIツール。主に分析で活用しています。
年月ごとの売上推移はもちろん、売上の詳細分析もバッチリこなせます。
Google広告やGoogleAnalytics、facebook広告などとも連携ができるので、一元管理できます。
マクロの視点とミクロの視点で、目指せつよつよマーケッター！

# ZohoFlow
あまり日本語対応はしていませんが、この子ホントにできる子です。
カンタンにShopifyとZohoCRMを連携したり、SlackとZohoCliqを連携したりできます。
こんなにカンタンにAPI連携できると、「何で俺今コード書いてるんやろ」ってなります。
それくらい便利です。

# ZohoPageSence
わぁ、ヒートマップが見れるぞ！

# ZohoConnect
社内情報連携アプリ？グループごとの連絡やマニュアルの整備、ボードでのタスク管理など多機能なツールです。

# ZohoCliq
Slackみたいなチャットツールです。GIF画像が豊富にあるので、コミュニケーションが楽しくなるでしょう。

# ZohoCampaigns
メルマガ配信からの顧客のアクションに応じたステップメールまで充実しています。この上位互換がMarketingHubです。
カンタンにメルマガ配信できるのでいいですよ。


いかがでしょうか。
他にも私は様々なZohoアプリケーションを利用しているのですが、厳選してご紹介しました。
無料で試すこともできると思うので是非お試しくださいね。
GitHubでプロジェクト管理方法　（自分用のメモ）

僕のような初学者がGitHubを使って個人的なプロジェクト（ポートフォリオ作りなど）を管理するために、とりあえずタスクを書き貯めておくための場所づくりです。

1.New projectを選択。
2.Project board nameで自分で決めたプロジェクト名を入力。
3/Descriptionでこのプロジェクトの説明を書く。
Project templateはBasic kanbanを選択。（Noneだとただのリストになるため、より見やすいkanbanにしたいから。）
VisibilityはとりあえずPrivateにしておく。アプリの公開のときにはPublicにする予定。
Linked repositoriesはまだリポジトリを作っていないので、作った段階で結びつける。
4.Create Projectを押す。
+Add columnでタスクの状況の種類を自分で増やせる。とりあえずただタスクを貯めておく場所として現段階は使用するので、今することはない。


5.To DoとIn progressとDoneというカラムが元々存在しているので、とりあえずのタスクをTo doに書き込んでいく。
各カラム右上の「＋･･･」と表示されている＋を押すと、Enter a note欄が出てくるので、タスクの名前を入力し、Addを押せばタスクが新しく作られる。（画像ではログイン機能と書かれたものが新しく作ったタスクです）また、カラムの並んでいる順番を変えたければ、カラムをドラック＆ドロップすれば順番を入れ替えられます。

また、✨Welcome to GitHub projects ✨と書かれたタスクは、カード右上の･･･からDelete noteで消去できます。（カラム右上ではないことに注意！）


これでGItHubでのタスク管理をできるようになりました。
x番目の素数をP(x)と表記するとき、任意の自然数nについて、2*P(n)>P(n+1)は真か？

# ことの発端

https://twitter.com/U_F_D_/status/1326755217136758784?s=20

https://twitter.com/yuyake_monster/status/1327355369211928577?s=20

このへんのツイートを見ていて、
「P(n+1)-P(n)>P(n)を満たすようなnってなくね？」みたいな発想に至った。
これが正しいかはよくわからんので、検証していきたい次第である。

# 連続性数列の性質

最小値が2以上の、連続する整数列
(すなわち、{3}や、{4,5,6,7}や、{14,15,16}などである)
について、最小公倍数や素数、互いに素であることとの関連を考える。

## 要素数が1個
まず、要素の個数が1個の場合、
最小公倍数は、含まれている数そのものとなる。

## 要素数が2個
この場合について、今回は考える必要はあまりなかったりするが、記載する。
差が1である2整数について、
最大公約数は1となり、互いに素(1は定義より含まれない)。
このため、最小公倍数は、2整数の積となる。

## 要素数が3個以上
要素数が3個以上ということは、
数列中の最大値と最小値の差は2以上である。
ここで、最小値が偶数である場合と、奇数である場合に分けて考えることができる。

今回は、最小値が偶数である場合について考える。


# P(n-1)、P(n)、P(n+1)の大小関係
`P(n)<P(n-1)*2` と仮定したとき
P(n)とP(n+1)の大小関係?

``P(n-1) ～ 全部合成数 ～ P(n) ～ 全部合成数 ～ 2*P(n-1)(←合成数) ～ ``**???**`` ～ P(n+1)``

# この記事について
気が向いたら更新するかもしれない。
方向性とか考えずにしっちゃかめっちゃかすすめるので、期待はしないこと
不完全性定理、その最短の証明

スマリヤン先生の『ゲーデルの不完全性定理』という本に、第一不完全性定理の証明とタルスキの真理述語の定義不可能性定理が極めて一般的かつ明瞭かつ簡潔に説明されていて感動したのでメモを残します。

**natの世界とUの世界**: nat型である自然数の世界と、U型である記号列の世界があり、U→natな全単射な写像$g$が存在することを要請します[^1]。記号列の世界に $\mathcal S$ と呼ばれる集合、および$\mathcal P, \mathcal T$という2つの$\mathcal S$の部分集合の存在を要請します。$\mathcal S$の要素を文、$\mathcal P$の要素を証明可能な文、$\mathcal T$の要素を真な文と呼称します。健全性のため$\mathcal P$が $\mathcal T$の部分集合であることを要請します。なお、$g$で作られた数をゲーデル数と呼称します。

[^1]: 記号列の他に数の存在や数概念を措定している、ということでは**ありません**。算術や集合論でやるように記号列の集合として数に相当する部分（＝数項の集合）を構成しうるからです。

**述語と名前**: U×nat→Uな写像$\Phi$の存在を要請します。「$H$が述語である」を「任意の数nにおいて $\Phi(H,n) \in \mathcal S$」で定義します[^2]。以降 $\Phi(H,n)$を $H(n)$ と略記します。さて、Set nat型の$A$ に対してある述語$H$が存在して $n \in A ⇔ H(n) \in\mathcal T$ を満たす時、$A$は名を持つと定義し、$H$を$A$の名前と呼称します。

[^2]: Φがあまりに抽象的なので例を挙げます。記号列$H$, 数$n$ に対して、$∀ x(x=\bar n ⊃H)$ という記号列を作る操作は、$H$がill-formedであっても純統語的な操作として定義できます。$H$ が（いわゆる算術の言語における）xを自由変数に持つ1項述語である場合にはこの操作で文ができるので、この操作はΦの一例です。その際$H(n)$は $H$に$\bar n$を代入した文と意味論的同値になるのでΦの非形式的な説明「$H$ に $n$ を代入する」という説明を正当化します。

**対角化関数とその逆像**: 述語$H$に対して $H(g(H))$ なる文を作る操作を対角化といいます。これを踏まえ対角化関数$d(n)$を$g(g^{-1}(n) (n))$で定義します。そして Set nat型の$A$に対しSet nat型の$A^\*$を対角化関数の逆像で定義します。つまり任意の数$n$に対し $n∈A^\*⇔d(n)∈A$ で定義します。

**定理GT（不完全性定理）**: $P$を$g(\mathcal P)$、補集合を$A^{c}$ のように表記すると「$P^{c*}$が名を持つなら真だが証明可能でない文が存在します」（証明）名前を$H$、そのゲーデル数を$h$とおくと、名前の定義から「$h∈P^{c*}⇔H(h)∈\mathcal T$」この左辺は\*の定義よりさらに同値変形できて「$h∈P^{c*}⇔d(h)∈P^c⇔d(h)∉P⇔H(h)\not\in\mathcal P$」となります。よって「$H(h)$が真である」⇔「$H(h)$は証明可能でない」。これは「$H(h)$が真かつ証明可能でない」もしくは「$H(h)$が偽かつ証明可能である」のどちらかのケースだと示しますが、後者のケースは健全性から排除されるので結局$H(h)$が真であるが証明可能でないことが示せます（証明終）

**定理GTの3つの前提**: 定理GTの前提「$P^{c*}$が名を持つ」は以下の3つの前提から直ちに従います。

- $G_1$: 任意の$A$について$A$が名を持つなら$A^*$も名を持つ
- $G_2$: 任意の$A$について$A$が名を持つなら$A^c$も名を持つ
- $G_3$: $P$は名を持つ

具体的な理論においてGTの前提が成立するかはこれらを満たすかを調べます[^3]。

[^3]: 算術の言語での例を記載します。$A$の定義式を$Ψ(x)$とおくと $A^c$の定義式は $¬Ψ(x)$、$A^*$の定義式は対角化関数の定義式を$D$とおくと $∀y(D(x,y)⊃Ψ(y))$、$P$は算術における可証性述語です。よって算術においては$G_1,G_2,G_3$はすべて満たせます。

**ゲーデル文と真理述語**: Set nat型の$A$に対してそのゲーデル文$G$を「$G∈\mathcal T ⇔ g(G)∈A$」を満たす文として定義します。$A^\*$が$H$という名を持つなら$H(g(H))$が$A$のゲーデル文になることは簡単に示せます。さて、$g(\mathcal T)$を$T$と定義し、$A$として$T^{c\*}$を考えてみます。名を持つと仮定した場合$T^c$のゲーデル文が存在することになりますが、$T$の定義よりそれはあり得ないので、$T^{c\*}$は名を持てないとわかります。

**定理T（タルスキの定理）**:「$G_1$,$G_2$の前提下で$T$は名を持てない」（証明）前述のように$T^{c*}$は名を持てません。よって$G_1$の対偶より$T^c$も名を持てず、$G_2$の対偶より$T$も名を持てないことが分かります（証明終）
[Ruby] 予約語




[![Image from Gyazo](https://i.gyazo.com/46469c8b1a1eedcba94f0ad005798020.png)](https://gyazo.com/46469c8b1a1eedcba94f0ad005798020)

予約語はクラス名、変数名などに用いることはできません。
ただし接頭辞$, @、@@が先頭についたものは予約語とは見なされません。
また、def のあとやメソッド呼び出しのピリオドのあとなど、メソッド名であるとはっきり分かる場所ではメソッド名として用いることができます。

参照
<a href="https://docs.ruby-lang.org/ja/latest/doc/spec=2flexical.html#reserved">Ruby 3.0.0 リファレンスマニュアル </a>

---
最近、rails g model func
でfuncモデルを作成しようとしたところ、失敗しました。
エラーメッセージは下記です。
[![Image from Gyazo](https://i.gyazo.com/e1ebc48a852eea03213c46d07b4d4953.png)](https://gyazo.com/e1ebc48a852eea03213c46d07b4d4953)

仮説検証は行っていないのですが、別サイトに「予約語: Function」とあったことと
別名に変更すると解決したのでおそらくこれが原因です。

知識は毎日増やしていきます。
【Ruby】各桁の和を求める方法

## 目的

例えば、1,234という数値。この数値の各桁の和は、`1 + 2 + 3 + 4`で、答えは`10`になります。
これをRubyを使用して出力する方法が二通りあります。

- [演算子を使用する方法](#演算子を使用する方法)
- [split等のメソッドを使用する方法](#メソッドを使用する方法)

## 演算子を使用する方法

一つは演算子を使用し、それぞれの桁の値を抽出し、全て足す方法です。

```ruby

num = 1234

thousand = (num / 1000) % 10   # => 1
hundred = (num / 100) % 10     # => 2
ten = (num / 10) % 10          # => 3
one = num % 10                 # => 4

answer = thousand + hundred + ten + one

p answer
# => 10
```

### 使用した演算子
| 演算子 | 意味 |
|:---:|:---|
| [+](https://docs.ruby-lang.org/ja/latest/class/Integer.html#I_--2B) | 加算（足し算） |
| [/](https://docs.ruby-lang.org/ja/latest/class/Integer.html#I_--2F) | 除算（割り算） |
| [%](https://docs.ruby-lang.org/ja/latest/class/Integer.html#I_--25) | 剰余（余り） |

### 解説
まず、**一の位の値を出す方法**。
`1234`という数値の中の`4`だけが欲しい時、
`1234`から`4`を取り出す方法は、`1234`を`10`で割れば、その余りが一の位の`4`になります。

```sh

1234 ÷ 10 = 123.4   ===>    123 ・・・4
```
この余りを求める方法は、演算子の`%`を使用すれば可能です。

```ruby

1234 % 10
# => 4
```
`%`は、商の整数部分を取り除き、余りのみを返してくれます。

<br>

次に、**二桁以上の位の値を出す方法**。
十の位、百の位、それ以上の位の値を求めるには、求めたい値の位を一の位に持って来ることができれば、上記の一の位の値を出す方法で求めることができます。
つまり、`1234`の

- 十の位が欲しい時、 => `123.4` =小数点以下を切り捨て=> `123`
- 百の位が欲しい時、 => `12.34` =小数点以下を切り捨て=> `12`
- 千の位が欲しい時、 => `1.234` =小数点以下を切り捨て=> `1`

このようにするには数値を求めたい桁の位で割れば可能です。

```sh

# 十の位
1234 ÷ 10 = 123.4
# 百の位
1234 ÷ 100 = 12.34
# 千の位
1234 ÷ 1000 = 1.234
```
演算子の除算は`/`を使用します。

```ruby

# 十の位
1234 / 10
# => 123

# 百の位
1234 / 100
# => 12

# 千の位
1234 / 1000
# => 1
```
`/`は商の小数点以下を取り除き、整数部分のみ返してくれます。

これに上記の一の位の値を出す方法を組み合わせると、求めたい位の値を出すことができます。

```ruby

# 百の位
(1234 / 100) % 10
# => 3
```
あとは計算で出た値を全て足すだけです。

<br>
<br>

## メソッドを使用する方法
もう一つはメソッドを使用し、数値を配列にして合わせる方法です。

```ruby
num = 1234
answer = num.digits.sum

p answer
# => 10
```
### 使用したメソッド

| メソッド | 役割 |
|:---:|:---|
| [digits](https://docs.ruby-lang.org/ja/2.7.0/method/Integer/i/digits.html)| 数値を位ごとにバラバラにする |
| [sum](https://docs.ruby-lang.org/ja/latest/method/Array/i/sum.html) | 配列の要素を合計する |

### 解説
まず、`digits`メソッドを使用して、位ごとに分割します。
`digits`メソッドは位ごとに分割し、一の位から並べた配列を返してくれます。

```ruby
1234.digits
# => [4, 3, 2, 1]
```

そして、`sum`メソッドで配列の各要素を足します。

```ruby

[4, 3, 2, 1].sum
# => 10
```

<br>
<br>

## 最後に
各桁の値を出すのみであれば演算子で計算をすれば良いのですが、和を求める場合はメソッドを使用した方が簡単です。

ご覧いただき、ありがとうございました。
AWS初学者こそ受講すべき「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」

こんにちは、らっとです。

本日は、現在私が受講中のUdemyの講座、<a href="https://www.udemy.com/course/aws-associate/?utm_source=adwords&utm_medium=udemyads&utm_campaign=LongTail_la.JA_cc.JP&utm_content=deal4584&utm_term=_._ag_107181210924_._ad_452531407125_._kw__._de_c_._dm__._pl__._ti_dsa-930814701079_._li_1009094_._pd__._&matchtype=b&gclid=Cj0KCQiA9P__BRC0ARIsAEZ6iriwistkqcFBajjWBmVzp2MTnTYX0pm7zC4mZZgp1HIpWSvQzKqwLoIaArhcEALw_wcB">「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」</a>について記事にしようと思います。

<h1>受講の背景</h1>
転職を機に、職場でAWSを使うようになりまして。昨年8月にAWSのクラウドプラクティショナーを受験して合格しました。しかし、教科書レベルでの理解は深まったのですが、実際にAWSの画面はその時点では全く触ったことがなく、実務で使えるようになるにはまだ勉強が必要だなと思っていました。

AWS試験の上位資格であるアソシエイト三冠（AWS Certified Solutions Architect - Associate、AWS Certified Developer - Associate、AWS Certified SysOps Administrator - Associate）を目指すべく、教材を探している中でこのUdemyの講座に出会いました。

<h1>なぜ初学者におすすめなのか</h1>
このUdemyの講座を初学者にオススメする理由は、<B>圧倒的な解説の丁寧さ</B>です。
AWSのログインの方法から何から、全てが動画になっており、手取り足取り教えてもらえます。

なので、これからクラウドプラクティショナーを取るよー、って方でも全然見て理解できる内容ですし、AWSの設定間違いで無料枠を超えて請求されちゃうのが怖くてAWSのアカウント作って使ってみるのが怖いと思っている人にとっても、AWSの画面操作がチェック出来たり、<B>何をしたら課金されるのかが細かく解説されていて</B>安心できる内容になっています。

また、仮にAWS資格の取得を目指していなくても、AWSの基礎編として受講する価値あると思います。正直私は、クラウドプラクティショナー試験を受ける前にこれに出会いたかったという感想です。（ある程度知っている人にとってはクドイかもしれません）

動画はトータルで16時間もあるので、確実にお腹いっぱいになることは間違いないです。

<h1>実務で使えるようになった</h1>
実際AWSクラウドプラクティショナー試験に合格した時点では、怖くて会社のAWSは触れなかったです。（操作ミスで障害の原因になったらシャレにならないですし）しかし、Udemyの詳しい解説記事を見て事前に画面を確認しておくことで、恐怖心なくAWSの画面を触れるようになりました。実際に現在では実務で使っており。会社でも新基盤のインフラ設定や障害対応の検討を任せてもらえるようになりました！

<h1>スキマ時間活用に効果的</h1>
Udemyの動画教材がいいところは、<B>タブレットにダウンロードできる</B>ところです。
私は自分のiPadにUdemyのアプリを入れて、ダウンロードして、通勤時間に見たりしています。ダウンロードしてあるので、通信の上限も気にならないですし、通信速度の影響も受けません。

動画を見るだけなので、額に汗して勉強するって感じでもなく、ハードル低く学習に取り組めます。

<h1>購入は底値で</h1>
Udemyはしょっちゅうセールをしていますが、底値が1600円くらいなので、その値段のセールが来たときに買っておくのが良いと思います。

短いですが以上です。クラウドは、システムエンジニアをやっていくのであれば必須科目と言っても過言ではないのではないでしょうか。その初学者にぴったりのコースだと思いますので、オススメさせていただきます。
【Rails】マイグレーション up,downをchangeと比較して理解する

##記事の対象者
・Railsのマイグレーションにおけるchangeメソッドは知っているが、up,downメソッドが出てきて違いがよくわからない初学者
・マイグレーションを追加して、適用(マイグレファイル作成、rails db:migrate)はしたことがあるが、適用の取り消しをしたことがない方

※Railsガイド、書籍「現場で使えるRuby on Rails5速習実践ガイド」を基に解釈して書いております。
解釈が間違っていたら、指摘頂ければ幸いです。(もしくは、書籍やRailsガイドを参照下さい。)

##前提知識(マイグレーションは、適用だけでなく適用を取り消せるよ)
マイグレーションにおいては、1つのマイグレーション(ファイル)が1つのバージョンとして扱われます。つまるところ、1つのマイグレーションを適用することでデータベースのバージョンを1つあげることができ、適用済のマイグレーションを1つ取り消すことでバージョンを1つ下げることができる。
→バージョンの上げ下げ(適用、適用を取り消す)を意識できていないとup,downメソッドが理解できません!!

##changeメソッドについて(自動で適用を取り消す処理をしてくれるよ)
以下のようにマイグレーションファイルでは、changeというメソッドの中でtasksテーブルを作成しています。
一見すると、バージョンをあげる(テーブルを作成する)時のコードだけが書かれているように見えますが、実はバージョンを下げる(テーブルを削除する)処理も適切に行なってくれます。

```rb:マイグレーション

class CreateTasks < ActiveRecord::Migration[5.2]
  def change
    create_table :tasks do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end

```

##changeでサポートされているマイグレーション定義(これらならchangeの中で使えるよ)

以下は、Railsガイドに掲載されている<changeでサポートされているマイグレーション定義の一覧>です。
(上記の例で挙げたcreate_tableは、一覧に入っているのでchangeメソッドを利用します。)

>add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table （ブロックを渡さなければならない）
enable_extension
remove_column（型を指定しなければならない）
remove_foreign_key（2番目のテーブルを指定しなければならない）
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table

#up,downについて(自動で適用を取り消す処理をしてくれないよ)
上記、changeでサポートされているマイグレーション定義以外のもの(以下の例だと「change_column」)については、自動でバージョンを下げる(テーブルを削除する)処理を行ってくれないので、upでバージョンをあげる処理に加え、downでバージョンを下げる処理を記述する必要があります。

```rb:マイグレーション
class ChangeTasksNameLimit30 < ActiveRecord::Migration[5.2]
 def up
  change_column :tasks, :name, :string, limit: 30
 end

 def down
  change_column :tasks, :name, :string
 end
end

```
もし、上記のdownの部分を書かずに、バージョンを下げようと適用済のマイグレーションを取り消そうとする場合、automatically reversible（自動的に戻せない）であるという例外が発生します。

##まとめ
changeがサポートしているマイグレーション定義なら、バージョンを下げる記述をしなくてもバージョンを下げられる。
changeがサポートしてないマイグレーション定義（上の例だとchange_column）で記述する場合は、downを書かないとバージョンを下げられない。

また、この記事で雰囲気がわかったら、Railsガイドの固めの表現も理解できると思います。

##参考
・Railsガイド
https://railsguides.jp/active_record_migrations.html#up-down%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%86

・書籍「現場で使えるRuby on Rails5速習実践ガイド」
ProgateでHTML,CSSを学んでみた（2日目）

#概要
Web開発に興味が出てきたのでとりあえず一通り必要そうなものを触ってみることにしました。
ただ触るだけだと忘れてしまいそうなのでメモとして学んだことを書いてみます。
ここにあるコードはほぼ全てProgateで出てきたものです。

##CSSによるタグ付け
ある特定の要素にのみCSSを適用したい場合はタグをつける。
例えば以下のように書くと、hogeとmogeのみが赤色になる。
CSSでタグ付けするときはドットをつける点に注意する。

```test.html
    <ul>
        <li=class="selected">hoge</li>
        <li>fuga</li>
        <li=class="selected">moge</li>
    </ul>
```

```test.css
    .selected{
        color:red;
    }
```

##HTMLの全体構造
HTMLには\<html>、\<head>、\<body>の3つの要素が必要。
\<head>にはページに関する情報、\<body>にはブラウザに表示したい内容を書く。
\<html>に関しては特に説明がなかったから飾りみたいなものだと思っておく。
さらに、\<!DOCTYPE html>でHTMLのバージョンを宣言する。
まとめると以下のようになる。

```hoge.html
    <!DOCTYPE html>
    <html>
      <head>
      </head>
      <body>
      </body>
    </html>
```
kaggle:「Maximum interactive GPU session count of 1 reached.」と出たときの対処法v.2

# はじめに
こんにちは😀
kaggleってると、↓ のようなエラーによく遭遇します
![スクリーンショット 2021-01-14 0.13.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343913/359515a3-b606-6811-fa21-74a57ec8aea7.png)
対処法を忘れてしまうので、メモ

# 対処法
1. 右上の自分のアカウントをクリックします (Your Profileとかsign outとか)
2. `Your accelerator quota` の `GPU`をクリックします
3. 動いているGPUをstopできます！
Go + Air でホットリロード

# はじめに
Goでファイル変更したときにホットリロードさせるツールとして、
[cosmtrek/air](https://github.com/cosmtrek/air)を使ってみたいと思います。

# 環境
go: v1.15.3

# プロジェクト作成
```zsh
% mkdir sample && cd sample
% go mod init sample
```

特にここはなんでも良いですが、フレームワークとして[gin](https://github.com/gin-gonic/gin)を使います。

```zsh
% go get -u github.com/gin-gonic/gin
% vi main.go
```

```go
package main

import "github.com/gin-gonic/gin"

func main()  {
  r := gin.Default()
  r.GET("/", func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "レスポンス",
    })
  })

  r.Run()
}

```


## go run
go runで起動してみます。

```zsh
% go run main.go
```

立ち上がったら別のウィンドウで、

```zsh
% curl http://localhost:8080
{"message":"レスポンス"}
```

# airで動かす
## 導入
```zsh
go get -u github.com/cosmtrek/air
```

```zsh
% which air
<GOPATH>/go/bin/air

% air -v
  __    _   ___
 / /\  | | | |_)
/_/--\ |_| |_| \_ v1.12.1 // live reload for Go apps, with Go1.14.0
```
airが入ったら、go runのかわりにairコマンドで動かします。

```zsh
$ air
```
起動したところでmain.goを書き換えます。

```go
package main

import "github.com/gin-gonic/gin"

func main()  {
  r := gin.Default()
  r.GET("/", func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "レスポンスだよ",
    })
  })

  r.Run()
}
```

```zsh
% curl http://localhost:8080
{"message":"レスポンスだよ"}
```

ホットリロードできていました。
Vue.js オプション 属性 の順序


## コンポーネント/インスタンス オプションの順序

よく使うのだけ抜粋。

``` js
export default {
  name: '',
  components: {},
  filters: {},
  mixins: {},
  props: {},
  data() {
    return {}
  },
  computed: {},
  watch: {},
  created() {},
  mounted() {},
  beforeDestroy() {},
  methods: {},
}
```

他のも詳しく知りたい場合はこちら、
参照：[コンポーネント/インスタンス オプション順序]('https://jp.vuejs.org/v2/style-guide/#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88-%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E9%A0%86%E5%BA%8F-%E6%8E%A8%E5%A5%A8')

## 要素の属性の順序

- is
- v-for
- v-if, v-else-if, v-else
- v-show
- v-cloak
- v-pre
- v-once
- id
- ref
- key
- v-model
- v-on
- v-html
- v-text

参照：[要素の属性の順序]('https://jp.vuejs.org/v2/style-guide/#%E8%A6%81%E7%B4%A0%E3%81%AE%E5%B1%9E%E6%80%A7%E3%81%AE%E9%A0%86%E5%BA%8F-%E6%8E%A8%E5%A5%A8')
Azure Bastion接続時のAPP.DIALOG_HEADER_CONNECTION_ERROR

[Azure Bastion](https://docs.microsoft.com/ja-jp/azure/bastion/bastion-overview) を構成した後、対象のVMに接続しようとしたところ以下のようなエラーが出力されました。

APP.DIALOG_HEADER_CONNECTION_ERROR
  CLIENT.TEXT_CLIENT_STATUS_DEFAULT

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/112db63a-de45-8d5d-c0a3-ca2765a11c86.png)

# 原因
Bastionリソース配置先のリソースグループ名に日本語を使用していることが原因でした。
リソースグループに日本語名を付けれちゃうが、その後不具合が発生する可能性があるので気を付けたいところです。

[リソースグループ名の制限について](https://jpaztech1.z11.web.core.windows.net/%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E5%90%8D%E3%81%AE%E5%88%B6%E9%99%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html)

# 対処
Azureリソースグループの名前変更はできないので、新しくリソースグループを作成してリソース移動する必要があります。

[リソースを新しいリソース グループまたはサブスクリプションに移動する](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/move-resource-group-and-subscription#use-the-portal)

Bastionに関しては残念ながら執筆時点でリソース移動に対応していないため作り直しが必要です。
Bastionのみ削除してリソースの移動は問題なくできました。仮想ネットワークにAzureBastionSubnetを作っていますが、Subnetの削除は不要でした。
リソース移動のサポート状況は以下に纏まっています。
[リソースの操作のサポートの移動](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/move-support-resources)
【初心者でもわかる】ふきだしでアピールしてくるボタンの作りかた

# どうも7noteです。ただのボタンじゃなくアピール強めのボタンを作ります。

ボタンの作り方はいろいろありますが、ここで紹介するボタンはこのような動きのあるボタンです。

**見本**

![sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/49c10a3b-57af-03a8-0509-f0819f8fd9e9.gif)



## ふきだしがふわふわしてアピールするボタンの作り方

```index.html
<div class="btn">
  <a href="#"><img src="button.png" alt="ボタン"></a>
  <div class="fukidashi"><img src="fukidashi.png"></div>
</div>
```

```style.css
.btn {
  width: 500px;          /* ボタンの幅 */
  position: relative;    /* 基準値とする */
}
.fukidashi {
  width: 400px;          /* 吹き出しの幅 */
  position: absolute;    /* 相対位置に指定 */
  left: 50%;             /* 表示位置を左から50%の位置に指定 */
  top: 0;                /* 表示位置を上から0の位置に指定 */
  transform: translate(-50%, -90%); /* 指定した位置から要素の半分分左に、要素の9割分上にずらす */
  animation: fuwafuwa 2s infinite;  /* アニメーションfuwafuwaを2秒間隔で実行 */
}

@keyframes fuwafuwa {
  0% {
    top: 0px;
  }
  10% {
    top: 3px;
  }
  20% {
    top: 0px;
  }
  30% {
    top: 3px;
  }
  40% {
    top: 0px;
  }
}
```


## 解説

CSSの紹介をする上で、ボタンもふきだしも画像で作成していますがCSSで作ったボタンやふきだしでも同じことができます。

position指定でふきだしの要素を浮かせて、好きな位置にもってきます。
その後、アニメーションの設定ですが、2秒の内0.2秒・0.4秒のタイミングで少し下に下がるように指定することでふわふわした動きを再現しています。

## まとめ

ボタンの作り方は本当に様々あるので、調べてみて好きなものを導入したらいいかなと思います。
ボタン1つでクリック率が大幅に変わるとも言われていますので、丁寧な作りこみをしていきたいポイントですね。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)



参考：https://haugenic.com/
AWSマネジメントコンソールで Unified search service is unavailable Try your search again later. が出たときの対応

## 問題
統合検索機能にキーワードを打ち込んでもエラーが出ることがあります。

![スクリーンショット 2021-01-14 21.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229446/48fd2b54-ff00-8dee-9eab-ba081daccc9a.png)

```
Unified search service is unavailable
Try your search again later.
```

## 原因と対応
一見サーバ側の問題にも見えますがadblockが悪さしてる可能性があります。僕の環境ではamazon.comドメインをadblockの対象から除外すると正しく表示されるようになりました。

![スクリーンショット 2021-01-14 21.18.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229446/1bdee171-cb1c-117d-6c07-e6ebc65aeca3.png)


最近統合検索機能のアップデートがあったのでその影響でしょうか。
AWS CDK with Python

※適時更新

# CDK環境の構築

CDK version: 1.83.0 (build 827c5f4)

## 事前準備
Python3とAWS CLIをインストールする。
AWS CLIは、プロファイルを使って、CDKを実行するAWSアカウントを切り変えるために必要（でなくもないけど）なのでインストールする。
インストール後は必要な分、プロファイルを設定しておく。

```
brew install python3 awscli
aws configure --profile プロファイル名
```


## CDKのインストールとテンプレートプロジェクトの作成

```
brew install aws-cdk
```

ブランクディレクトリ上でコマンドを実行する。

```
cdk init sample-app --language python
```

セットアップ

```
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install -r requirements.txt
```

### テンプレートの細かい修正（2021/01/12時点）

TODO



# サンプル

## ECRへのリポジトリ追加

```py
from aws_cdk import (
    aws_iam as iam,
    aws_ecr as ecr,
    core
)


class RepositoryStack(core.Stack):

    def __init__(self, scope: core.Construct, construct_id: str, stage: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # ECRにリポジトリ作成し、ライフサイクルとパーミッションを設定（devアカウントのみ）
        if stage == 'dev':
            lifecycle_rules = [
                ecr.LifecycleRule(
                    description='Delete old images',
                    max_image_count=5,
                    rule_priority=1,
                    tag_status=ecr.TagStatus.UNTAGGED
                )
            ]
            repository = ecr.Repository(
                self,
                'EcrRepository',
                lifecycle_rules=lifecycle_rules,
                repository_name='seriwb/nanika'
            )
            repository.grant_pull(iam.AccountPrincipal('staging account'))
            repository.grant_pull(iam.AccountPrincipal('production account'))
```



# 関連情報
## CDK関連
- https://cdkworkshop.com/
- https://github.com/aws/aws-cdk
- https://github.com/aws-samples/aws-cdk-examples
- https://docs.aws.amazon.com/ja_jp/cdk/latest/guide/work-with-cdk-python.html
- https://docs.aws.amazon.com/ja_jp/cdk/latest/guide/tagging.html

### テクニック
- https://qiita.com/mira_cocoa/items/0435cf1cfabaabeb7027
- https://qiita.com/akiraabe/items/86c995496d5ee2786088


# TBD
- EC2インスタンスの作成
    - AMI
    - IAM
    - 既存VPC
    - 既存サブネット
    - セキュリティグループ
- ターゲットグループ
- タグ
jsライブラリの学習を始めてから出てきた横文字いろいろ

####DOM（Document Object Model）
HTMLの各タグ（要素）をNodeとみなして、階層構造で表現するモデルに変換することで、HTMLをJavaScript等で扱えるようにした技術。

####仮想DOM
実際のDOMを構築する前に、バーチャルなDOMを構築するワンクッションを入れることで、プログラマがDOMを意識ないで済む。
さらに、バーチャルなDOMを構築する際に差分更新する仕組みをとることで画面更新を高速化できる。

この仮想DOMを取り入れたJavaScriptフレームワークが、REACTとかVue.js

####バンドル
多くの React アプリケーションは、Webpackなどのツールを使ってファイルを「バンドル」している。バンドルはインポートされたファイルをたどって、それらを 1 つのファイルにまとめるプロセスです。このバンドルされたファイルを Web ページ内に置くことによって、アプリ全体を一度に読み込むことができます。
↓
コーディングを行う際に、複数のファイルを１つのファイルに出力すること。コードをまとめるみたいな意味。

####コード分割
必要なコードだけを読み込み、初期ロードの際に読む込むコード量を削減する。つまり高速。
例えば、トップページを呼び出すと、トップページに必要なjsだけが読み込まれる。
トップページに必要なコードが読み込まれた後に、Linkコンポーネントによってリンク先のページのコードをバックグラウンドでプリフェッチングする。
リンクを押す頃には読み込みが終わっているため、ページ遷移も高速。すごい。。。

####プリフェッチング
コードを先に読み込んでおくこと。
preがあらかじめみたいな意味。

####コンポーネント
何かの部品。
Reactでは、見た目を機能ごとにコンポーネント化して、コンポーネントを組み合わせることでWebサイトの見た目を作る。


####CSS-in-JS
JSの中でCSSを書ける。
styled-jsxは、CSS-in-JSのライブラリ。
１ファイルで書ける。
react.componentとして提供されてる分、楽。
例）styled-components、　emotion、　MATERIAL-UI

####CSS Modules
CSS-in-JSとは別に、CSSを生で書くこともできる。
CSSファイルをReactコンポーネントの中でインポートすることができる。
CSS Modulesは自動的に一意のクラス名を生成するため、クラス名の衝突が起こらない。（CSS-in-JSも）
Next.jsのコード分割は、CSSモジュールに対しても機能する。
例）テイルウィンド、　
チュートリアルした感じ、CSS Modulesの方が地道だけど分かりやすそう。
どっちを使うにしろ、アプリごとでどっちかに統一した方が良さそう。
Tailwindは、CSSModulesではなくグローバルに読み込んでpurgecss （使われてない CSS を削除するものです）と合わせて使うのが基本。なのでパフォーマンスいい。

####プリレンダリング
レンダリング:何らかのデータをもとにして表示内容を作る。HTMLをもとにページを生成する。みたいな

Next.js はすべてのページをHTMLでプリレンダリングする。DOMにするということ？？
まず各ページのHTMLを生成する。その後、そのページに必要な最小限のJSを関連付ける。（このプロセスはハイドレーションと呼ばれる）。

####ビルド
ソースコードを実行可能な状態にすること。
ソースコードを実際に動くプログラムに変換するコンピュータ上で実行されるプロセス。

####静的生成（SSG）

ISR:SSGを何秒間隔でするみたいな機能。

####サーバサイドレンダリング（SSR）
リアルタイム性が求められるアプリはこっちが向いてる。

####クライアントサイドレンダリング（CSR）
外部データを必要としないページの部分を静的生成（プリレンダリング）して、
ページが読み込まれたら、クライアント側で JavaScript を使って外部データを取得し、残る部分にデータを埋め込む

####フェッチ
データベースなど外部データの取得

####getStaticProps 
ビルド時にデータを取得するメソッド？
関数内部では、外部データを取得（フェッチ）して、取得したデータを props としてページに渡す。

props
任意の入力を受け取り、画面上に表示すべきものを記述するReact要素を返します。

####動的、静的
動的（dynamic）
最初からなかったり、最初からあるけど途中で変わったりする
静的（static）
最初から用意してある、変わらない
pytestのテストクラスの全メソッドにmonkeypatchを適用する

## 失敗
```python
class TestHoge():
    def setup_class(cls, monkeypatch):
        monkeypatch.setattr(target, 'TargetObj', MockObj)
```
以下のエラーを返す。
`TypeError: setup_class() missing 1 required positional argument: 'monkeypatch'`

## 成功
```python
class TestHoge():
    @pytest.fixture(autouse=True)
    def patch(self, monkeypatch):
        monkeypatch.setattr(target, 'TargetCls', MockCls)

    def test_some_func(self):
        ret = target.TargetCls().some_func()
```
テストクラス内にfixtureを定義し、`autouse=True`とすることでmonkeypatchがクラス内の全メソッドに適用される。