OmniAICreator/Qiita-1.07M huggingface dataset:
Symbol Node運用における設定反映方法（委任ハーベスタ数変更など）

Symbol Node運用にてカスタム設定変更をする際の手順を整理します。

#１．直接コンフィグ修正方法
直接的で理解しやすい。が更新頻度が高いと面倒。

## ①設定項目をGrep
設定すべき項目がもれないようにSymbol-bootstrapの作業ディレクトリにてGrep

```shell
grep 設定項目（正規表現使っても良いよ） . -r
```
例）委任ハーベスターさんの許容人数の変更

```shell
grep maxUnlockedAccounts . -r
```
## ②設定変更
viやら使って変更してください。

## ③設定変更内容の反映
```shell
symbol-bootstrap stop
symbol-bootstrap compose --upgrade
symbol-bootstarp run -d
```
## ④ヘルスチェック
```shell
symbol-bootstrap healthCheck
```

ほら、簡単でしょう？でももっと簡単な方法は・・・下記参照のこと。

#２．カスタム設定ファイルを使う修正方法
ちょっと準備と理解が必要だけど、2回目以降は簡単なのでおススメ。
いちいち個別のコンフィグファイルを弄らずに、カスタム設定ファイルを準備して一挙に反映させる手法です。

## ①設定項目をcustom.ymlにまとめて定義
Symbol-bootstrapの作業ディレクトリにてcustom.ymlを作成・更新する。
### 入力内容例
もちろん以下以外の設定内容も指定できるよ。

```shell
nodes:
    -
        host: IPアドレスとか、ホスト名
        friendlyName: Node Listに表示される文字列。愛称とかMAX委任ハーベスト数とか書くといい。
        voting: true
        beneficiaryAddress: 委任ハーベスタがハーベストした時のノード収益を受けるアカウントのアドレス。外部のウォレットがイイ。
        maxUnlockedAccounts: 委任ハーベタの受入数。数字で設定。
        mainPrivateKey:（空だとレジュームされて現設定のまま採用される）
        transportPrivateKey:（空だとレジュームされて現設定のまま採用される）
        remotePrivateKey:（空だとレジュームされて現設定のまま採用される）
        votingPrivateKey:（空だとレジュームされて現設定のまま採用される）
        vrfPrivateKey:（空だとレジュームされて現設定のまま採用される）
```
### サンプル
```shell
nodes:
    -
        host: 160.251.23.234
        friendlyName: Harvester KoiKoi Max25
        ##voting: true
        beneficiaryAddress: NDWJEGAVM22DOZH36MMRYE3VE6JNBGWC7BCKEDY
        maxUnlockedAccounts: 26
        mainPrivateKey:
        transportPrivateKey:
        remotePrivateKey:
        votingPrivateKey:
        vrfPrivateKey:
```

## ②設定変更内容の反映
```shell
symbol-bootstrap stop
symbol-bootstrap config -p mainnet -a dual -c custom.yml --upgrade
symbol-bootstrap compose --upgrade
symbol-bootstarp run -d
```
## ③ヘルスチェック
```shell
symbol-bootstrap healthCheck
```

## ④設定内容が適用されたがGrepで確認
```shell
grep 設定内容 . -r
```
### サンプル
```shell
grep friendlyName . -r
```
こんな感じです。委任ハーベスター様を招く環境整備がんばってください。
【Laravel】migrateコマンド一覧

#概要
データベースにテーブルを作成するための`マイグレーション`ですが、テーブルの構造を定義、更新、削除するためのコマンドがいくつもあります。
ここでは`migrateコマンド`として一覧でまとめてみました。

#migrateコマンド一覧
* マイグレーションファイルを作成する

```
$ php artisan make:migration create_テーブル名_table
```
<br>

* マイグレーションファイルを実行する

```
$ php artisan migrate
```
<br>

* migrationsテーブルを作成する

```
$ php artisan migrate:install
```
<br>

* マイグレーションを再実行してテーブルを再構築する。テーブルとデータの初期化

```
$ php artisan migrate:refresh
```
<br>

* すべてのマイグレーション操作を元に戻す（全削除）

```
$ php artisan migrate:reset
```
<br>

* 1つ前のマイグレーション操作した情報に戻す

```
$ php artisan migrate:rollback
```
<br>

* マイグレーションファイルと実行状態を確認できる

```
$ php artisan migrate:status
```
Raspberry Pi Picoのビルドをスクリプト化

#はじめに
Raspberry Pi PicoのプロジェクトをLinux上でビルドして書き込む場合、以下のコマンドを実行します。

```
$mkdir build
$cd build
$cmake ..
$make
$cp *.uf2 /media/user/RPI-RP2
```
しかし、毎回このコマンドを入力するのは面倒なのでスクリプトを作ってみました。

#開発環境
PC側のOSはLinux Mint 20で確認しました。
Debian系のOSならば同じように動作すると思います。

SDKの設定はすでに多くの情報があるので割愛します。
当方も3分の動画にまとめてyoutubeにあげてますので不明な方はご覧ください。
https://youtu.be/cNXF0r2jdXA

#スクリプト
スクリプトです。
2行目のRaspicoMPは各自の環境に合わせて書き換えて下さい。
「CMakeLists.txt」が無ければ終了します。
「pico_sdk_import.cmake」が無ければダウンロードするか確認します。
「Build-年月日時分秒」フォルダを作成し、その中でbuildします。
Raspberry Pi Picoがマウントされている場合、uf2ファイルを書き込みます。

```
#!/bin/bash
RaspicoMP="/media/pione/RPI-RP2/"

if [ ! -f ./CMakeLists.txt ] ;then
    echo '"CMakeLists.txt" file is missing.'
    echo "exit"
    exit
fi

if [ ! -f ./pico_sdk_import.cmake ] ;then
    echo '"pico_sdk_import.cmake" file is missing.'
    echo -e "Do you want to download it?"
    echo -n "[Y/n]:"
    read ans
    if [ $ans = "Y" ] || [ $ans = "y" ] ;then
        wget https://github.com/raspberrypi/pico-sdk/raw/master/external/pico_sdk_import.cmake
    else
        echo "exit"
        exit
    fi
fi

BuildDir="build-"`date '+%y%m%d%H%M%S'`
mkdir $BuildDir
cd $BuildDir
cmake .. && make

mountpoint "$RaspicoMP" >/dev/null 2>&1
mpcheck=$?
if [ -f ./*.uf2 ] && [ $? -eq $mpcheck ] ; then
    cp *.uf2 "$RaspicoMP"
    echo "Completed"
fi
```

#実行方法
ビルドするプロジェクトのディレクトリ内でこのスクリプトを実行して下さい。
このスクリプトをパスの通ったところに保存してコマンド化しておくと便利です。
【Nuxt.js + Vuetify】フラッシュメッセージ表示機能実装

# 概要
ポートフォリオ作成の為、nuxt.js＋Vuetifyでフラッシュメッセージ
（vuexとvuetifyのsnackbarを使用）
の表示機能を作成したので備忘録までに残します。

## 完成物
右上にフェードしながらsnackbarが表示される
（下記参考動画は作成したポートフォリオ上での挙動）
![flashmessage.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/724787/bcf46ece-2fcf-caba-61d5-4ed493ba4a34.gif)

## コード
フラシュメッセージ表示用

```vue:/components/FlashMessage.vue
<template>
  <v-snackbar
    v-model="status"
    transition="slide-x-reverse-transition"
    right
    top
    :color="type"
  >
    <div class="ml-5 font-weight-bold white--text">
      {{ message }}
    </div>
  </v-snackbar>
</template>

<script>
import { mapGetters } from "vuex"
export default {
  computed: {
    ...mapGetters({
      message: "flashMessage/message",
      type: "flashMessage/type",
      status: "flashMessage/status",
    }),
  },
}
</script>
```

```javascript:/store/flashMessage.js
export const state = () => ({
  message: "",
  type: "",
  status: false,
})

export const getters = {
  message: (state) => state.message,
  type: (state) => state.type,
  status: (state) => state.status,
}

export const mutations = {
  setMessage(state, message) {
    state.message = message
  },
  setType(state, type) {
    state.type = type
  },
  setStatus(state, bool) {
    state.status = bool
  },
}

export const actions = {
  showMessage({ commit }, { message, type, status }) {
    commit("setMessage", message)
    commit("setType", type)
    commit("setStatus", status)
    setTimeout(() => {
      commit("setStatus", !status)
    }, 1000)
  },
}
```

コンポーネント側で表示する場合

```vue:/components/login.vue
<script>
export default {
  methods: {
  /* 表示したい処理中に以下を記述 */
    this.$store.dispatch(
      "flashMessage/showMessage",
      {
        message: "ログインしました.",
        type: "sucess",
        status: true,
      },
      { root: true }
    )
  },
}
</script>
```


別vuexストアで表示する場合

```javascript:/store/login.js
export const actions = {
  login({ dispatch }, payload) {
    /* 表示したい処理中に以下を記述 */
    dispatch(
      "flashMessage/showMessage",
      {
        message: "ログインしました.",
        type: "sucess",
        status: true,
      },
      { root: true }
    )
  },
}
```

messageには表示したいメッセージを記述。
typeにはvuetifyのcolorを記述して好きな色で表示が可能。
Javaアクセス修飾子表

##アクセス修飾子表

時々忘れてしまうことがあるのでメモ。

|アクセス修飾子 |同じクラスからのアクセス |同じパッケージからのアクセス |サブクラスからのアクセス |その他のアクセス |
|:-:|:-:|:-:|:-:|:-:|
|public|〇|〇|〇|〇|
|protected|〇|〇|〇|×|
|記述なし|〇|〇|×|×|
|private|〇|×|×|×|
動的IPでもGoogle Analyticsの内部トラフィックを除外する

# はじめに
こんにちは。ソファカバーを新調したく、先走ってはがして捨てちゃってそのままなので、ソファに座れずフローリングに正座してPC叩いてます、筆者です:frowning2:

**GoogleAnalytics**の**内部トラフィックを除外**するには、**IPアドレス**を指定することでできますが、私は**Rakuten Mobile Unlimit**をモバイルルータとして使用しているため、IPアドレスが動的になっています。

いやー、これはもうしょうがないな、と思って除外できていなかったのですが、動的IPアドレスになってしまう、モバイルルータでも内部トラフィックを除外できる拡張機能を見つけたので共有します。


# Google Analytics オプトアウト アドオン (by Google)
こちらです。

https://chrome.google.com/webstore/detail/google-analytics-opt-out/fllaojicojecljbmefodhfapmkghcbnh?hl=ja

使い方は簡単で、**インストールするだけ**です。
ただ、**モバイル実機端末**では拡張機能がインストールできないため、**内部トラフィックの除外はできません**:pray:

# おわりに
GoogleAdsenseの審査に落ちまくってるので、これでどの記事が問題なのかの場合分けがしやすくなりました:smile:

それでは！
Google Colabでpip installしたものを消えないようにする

n番煎じですが，毎回`!pip install hoge`をやるのはうっとうしく, コードが汚くなるので，パッケージはGoogle Driveにダウンロードしそれを読み込みに行くようにする．

## メリット
- コードがきれいになる
- 時間短縮
- プロジェクトごとに`my-site-packages`(名前はなんでもよい)を作成することで，パッケージ管理（に近い何か）ができる

## デメリット
- パッケージの読み込みが自分のGoogle Driveのディレクトリ構成に依存するので，コードの可搬性が下がる
    - 共同研究者にコードを共有する際などにやや面倒かも

## 手順
(1). Google Driveにコードを置くプロジェクトディレクトリを作成し，その配下に`my-site-packages`なるディレクトリ(パッケージ置き場)を作成

(2). いつものコードを.ipynbファイルに書いて，Google Driveをマウント

``` python
# Google Colabでの処理
from google.colab import drive
drive.mount('/content/gdrive')
```

ついでに，先の`my-site-packages`のパスを変数に入れておく．

``` python
package_path = '/content/gdrive/MyDrive/Colab\ Notebooks/<dir_name>/my-site-packages/'
package_path_str = '/content/gdrive/MyDrive/Colab Notebooks/<dir_name>/my-site-packages/'
```

(3). `pip install` する際に，`--target` (`-t`)オプションで，インストール先を`my-site-packages`に指定する.

``` python
!pip install <package_name> -t $package_path
```

(4). importする際に，`sys.append`する

この際，`sys.path`にはスペースをエスケープしていないものを引数として与える.

``` python
import sys
sys.path.append(package_path_str)  
```

(5). あとは普通にimportすればよい

## 参照
1. [Install pip on Google Colab / Drive: This won't go away😃](https://ggcs.io/2020/06/22/google-colab-pip-install/)
Git~add~

今回はGit addについて学習していきます。

#git addとは
そもそも、gitには、作業エリアがあります。今回大切になるのが、ステージングエリアになります。
これはファイルを一時的に置いとくエリアになります。
ここに保存しなくてはどんなに頑張ってターミナルをたたいても、リモートリポジトリにあげることはできません。
そこで使うのがgit addです。
いくつか種類があります。

#git add .
こちらは変更、削除、追加したカレントディレクトリー以下のすべてのディレクトリを追加することができます。
(カレントディレクトリーとは、現在の位置ディレクトリのことです)

#git add -u (update)
変更、削除されたファイルが追加されます。しかし、新規作成されたファイルはaddされません。

#git add -A (all)
変更、削除、追加されたファイルすべてが追加されます。

#間違えてaddしてしまった

```
git reset HEAD ファイル名
```

とします。

addしてアップしたあとcommitでメモを残して、Pushまでつなげます。
「数理計画法　～線形計画法～」を参考にmatplotlibとWolframAlphaでやってみたい。

(オリジナルポスト)
https://qiita.com/momo10/items/824c2fd8a0f432a676f4

(参考)線形計画法超入門
https://qiita.com/Dason08/items/e1bafb9ddc766d1c8fd0

作業中です。整数にしか対応してません。勉強中。簡単に3D表示できますか？
アドバイスもらえると助かります。
完成形?を探しています。よろしくお願いします。

#matplotlibでやってみたい
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/50d469fb-1377-b514-d544-445a1c864e75.png)

```python
from sympy import *
import numpy as np
import matplotlib.pyplot as plt

var('problem x y')
var('x1 x2')
problem = -5 * x1 - 4 * x2
mymax = 10
x = np.linspace(0, mymax, mymax + 1)
y1 = (30 - 5 * x) / 2
y2 = (14 - x) / 2
y3 = np.zeros_like(x)
y4 = np.minimum(y1, y2)
plt.figure()
plt.plot(x, y1, label="mikannsei")
plt.plot(x, y1, label="5*x1 + 2*x2 <=30")
plt.plot(x, y2, label="1*x1 + 2*x2 <=14")
plt.plot(x, y2, label=str(problem) + " GOKEI")
plt.fill_between(x, y3, y4, where=y4 >= y3, facecolor='yellow', alpha=0.3)
plt.ylim(0, 8.5)
plt.xlim(0, 4.5)
plt.legend(loc=0)
plt.xticks(np.arange(0, mymax + 2, 1))
plt.yticks(np.arange(0, mymax + 2, 1))
plt.gca().set_aspect('equal')
plt.grid()
for i in range(8):
    for j in range(8):
        if 5 * i + 2 * j <= 30 and i + 2 * j <= 14:
            plt.text(i, j, -5 * i - 4 * j)
plt.show()
```


#WolframAlphaでやってみたい
https://www.wolframalpha.com/input/?i=5*x+%2B+2*y+%3C%3D30%2C1*x+%2B+2*y+%3C%3D14%2Cx+%3E%3D0%2Cy+%3E%3D0&lang=ja

整数解:
{{x == 0, y == 0}, {x == 0, y == 1}, {x == 0, y == 2}, {x == 0, y == 3}, {x == 0, y == 4}, {x == 0, y == 5}, {x == 0, y == 6}, {x == 0, y == 7}, {x == 1, y == 0}, {x == 1, y == 1}, {x == 1, y == 2}, {x == 1, y == 3}, {x == 1, y == 4}, {x == 1, y == 5}, {x == 1, y == 6}, {x == 2, y == 0}, {x == 2, y == 1}, {x == 2, y == 2}, {x == 2, y == 3}, {x == 2, y == 4}, {x == 2, y == 5}, {x == 2, y == 6}, {x == 3, y == 0}, {x == 3, y == 1}, {x == 3, y == 2}, {x == 3, y == 3}, {x == 3, y == 4}, {x == 3, y == 5}, {x == 4, y == 0}, {x == 4, y == 1}, {x == 4, y == 2}, {x == 4, y == 3}, {x == 4, y == 4}, {x == 4, y == 5}, {x == 5, y == 0}, {x == 5, y == 1}, {x == 5, y == 2}}

整数解の数:
38




https://www.wolframalpha.com/input/?i=5*x+%2B+2*y+%3C%3D30%2C1*x+%2B+2*y+%3C%3D14&lang=ja
要素の間に幅を作る

本日記事にしたいこと。
・要素の境界線の設定方法を理解すること
・要素の外側の余白の設定方法を理解すること
・要素の内側の余白の設定方法を理解すること

HTML/CSSでは、ブロックレベル要素を積み木や箱として考えている。
このことをCSSのボックスモデルと言いう。

■ボックスモデル
ボックスは「content」、枠をつける「border」と、内側の余白「padding」、外側の余白「margin」から成り立っている。それぞれ、上下左右の４辺に分けることができ、個別にCSSを適用し、幅や色などを指定できる。

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

### borderについて

■borderプロパティ
要素の境界線の幅や色を変更できる。
border: 太さ スタイル 色;とすることで、ボーダーの太さ・スタイル・色をまとめて指定できる。スタイルには、solid（1本線）やdouble（2本線）などがある。

### paddingについて

■paddingプロパティ
箱の内側に余白を作成赤る。余白の大きさは、pxで指定できる。

|指定方法|説明                                                        |
|-------|-----------------------------------------------------------|
|padding: 1px;|[上下左右]の内側の余白をまとめて1pxに指定                  |
|padding: 1px 1px;|[上下][左右]の内側の余白をそれぞれ1pxに指定            |
|padding: 1px 1px 1px;|[上][左右][下]の内側の余白をそれぞれ1pxに指定      |
|padding: 1px 1px 1px 1px;|[上][右][下][左]の内側の余白をそれぞれ1pxに指定|

### marginについて

■marginプロパティ
箱の外側に余白を作成する。

|指定方法|説明                                                  |
|-------|-----------------------------------------------------|
|margin: 1px;|[上下左右]の余白をまとめて1pxに指定                  |
|margin: 1px 1px;|[上下][左右]の余白をそれぞれ1pxに指定            |
|margin: 1px 1px 1px;|[上][左右][下]の余白をそれぞれ1pxに指定      |
|margin: 1px 1px 1px 1px;|[上][右][下][左]の余白をそれぞれ1pxに指定|

ちなみに、padding、marginは上下左右一定方向だけ指定することが可能。
margin-top、margin-bottom、margin-left、margin-right
autoという値を用いると、余白を自動で算出することもできる。

ボックスモデルの考え方を用いることで、枠線・内側の余白・外側の余白を設定することができる。
これらは全てブロックレベル要素のみ設定できる。インライン要素には、設定できない。
厳密には、インライン要素をボックスモデルとして扱う手段はあるが、ここでは触れないようにする。

### margin, paddingの2つはどのように使い分け方

端的に言えば、要素の背景色を含めて余白を取りたいときはpadding, 背景色を含めたくない場合はmarginを利用する。デザインによってどちらを使うかは変わってくる。
【エラー備忘録】npmをインストールする際のEACCESエラー

##状況

npmをバージョン指定してインストールする為、以下のコマンドを実行。その際にエラー発生。

```コマンド:コマンド
$ npm install -g @vue/cli@3.5.0
```


```コマンド:エラー内容
npm ERR! code EACCES
　　以下続く．．．
```
エラー文末では以下のように表示されている。

```
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.
```
##解決策

sudoをつけて再度実行すると、無事インストールできた。

```
$ sudo npm install -g @vue/cli@3.5.0
```

念のためバージョンを確認すると、3.5.0と表示される。

```
$ vue -V
3.5.0
```
linuxで管理者にユーザーをスイッチするコマンド

# 目的

- linux系OSのターミナルで管理者ユーザーに切り替えるコマンドをメモ的に紹介する

# 条件

- 紹介するコマンドを実行するユーザーもsudoコマンド実行権限があること。

# 方法

1. 下記コマンドを実行して管理者ユーザーに切り替える。

    ```termianl
    $ sudo su - root
    ```

1. 下記コマンドを実行しても管理者ユーザーに切り替える事ができる。

    ```terminal
    $ sudo -s
    ```

# 超ざっくりとしたコマンドの解説

1. `su ユーザー名`コマンドは「ユーザー名」で指定したユーザーにスイッチするコマンドである。
2. `su - ユーザー名`コマンドは「ユーザー名」で指定したユーザーにスイッチし、スイッチ後にスイッチしたユーザーのホームディレクトリに移動するコマンドである。（`-`はオプションということ。）
3. `sudo`コマンドは言わずもがな管理者権限で後述するコマンドを実行するということである。
4. 当該コマンドを日本語で表現すると「管理者権限で管理者ユーザーにユーザースイッチしますよ。スイッチ後は管理者ユーザーのホームディレクトリに移動してください。」ということになる。
【注意】Laravelで常時SSL化するときの「forceSchema」でのエラー：forceSchema does not exist


#バージョン
`PHP:7.2.34`
`Laravel:6.20.19`
`Composer:2.0.11`

#概要

```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        URL::forceSchema('https');
    }
}
```
上の状態で`artisan`コマンドを打つと、 

```
BadMethodCallException : Method Illuminate\Routing\UrlGenerator::forceSchema does not exist.
```
とエラーが表示される。

##こんな人、必見です↓
* AWS Cloud9を使用する際にhttpsでのブラウザ確認が必要になったため設定ファイルを変更したい。
 * 参考図書：`『動かして学ぶ！ Laravel開発入門（著：山崎大助 翔泳社）』P.72`<font color="Red">←私はこの本で進行中に上のエラーが出ました！</font>


* PHP Laravelで常時SSL化を設定したい。<br>（https://webplus8.com/laravel-always-ssl/）

* Laravel5.3から5.4にバージョンアップしたときにhttps強制でエラーが出た。<br>（https://qiita.com/sawadashota/items/79b74592b7d9800868f8）

#解決方法
```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        URL::forceScheme('https');
    }
}
```
何が違うかというと、`URL::forceSchema('https');`ではなく、
`URL::forceScheme('https');`に変更。

`Schema`の<font color="Red">a</font>を<font color="Red">e</font>に変更しました。

#エラーの原因
Laravel5.3までは`forceSchema()`で、Laravel5.4以降は`forceScheme()`を使うように変更があったようです。

詳しくはこちら↓

https://readouble.com/laravel/5.4/ja/upgrade.html
駆け出しエンジニアがもくもく会に参加するべき理由

#もくもく会とは？

もくもく会とは、エンジニア同士が集まり一緒に作業をする所です。
始まる前に**今日何をするかの報告**
終わる時に**今日何をしたかの報告**
をするのが一般的です。

##なんで参加すべきなの？

###エンジニアの知り合いが増えるから

エンジニアの知り合いが増える事によって分からない所であったり、悩んでる所を相談出来ます。

Twitterやオンラインで会うよりも話しやすく、気軽に話しかられます。

転職の相談なども出来るので、是非エンジニアの知り合いを増やしてほしいです！

###集中して作業出来る。

もくもく会の種類にもよりますが、凄く集中することが出来ます。
タスク報告でしっかり自分がする事を明確にすることによって、もくもく会の時間の中でしっかり作業が可能です。

カフェでもくもく会をする場合はコーヒーやカフェオレも飲めるので、おすすめです。

###楽しみが増える

同じ悩みを持つ仲間と作業が出来るので、結構楽しいです。

休み時間に他愛もない話をしたり、もくもく会後に食事会などもある場合があるのでそこでIT系の話をするのも楽しいです。

##最後に

自分がここまで４ヶ月間勉強出来ていたのは絶対にもくもく会に参加してたからだと思ってます。

コミュニティや仲間を作る事がプログラミング学習において一番大事だと思っていて、一人でやっているとどうしても挫折率が上がってしまうので仲間を見つけてモチベーションをアップさせましょう。
bootstrap-webpack -express-mysql-dockerの環境構築について

###expressの環境設定
expressを用いたバックエンド環境を構築

```
npm install express-generator -g
```


###webpackの環境設定
css style-loaderと
Bootstrapを動かすための必要なライブラリをインストール

```
npm i -D webpack webpack-cli css-loader style-loader autoprefixer
npm i -S bootstrap jquery popper.js
```

###expressとwebpackの連動
参考：
[Typescript + Express + Webpackで作る、node.jsサーバー環境構築入門](https://qiita.com/isihigameKoudai/items/4b790b5b2256dec27d1f)

[webpackのメモ](https://qiita.com/hrloca/items/61ced4d16d6c257ada02)

webpackの実行　＞＞　expressの起動の順番になるように
package.jsonの記述を追加
1行目：ファイル名に縛られたくない場合や、rootに置きたくないなどの場合にはwebpackコマンド実行時に場所を指定して実行
2行目：npm run startでwebpackのビルドが実行されつつ、そのファイルを元にnodeサーバーが立ち上がるように設定
（※webpackの実行時のアウトプットファイルの出力先の指定も必ずしておく）

```
  "scripts": {
    "build": "webpack --config webpack.config.js",
    "start": "npm run build && node ./bin/www"
  },
```

###Dockerへの移行
アプリケーション側への環境としては準備が出来たので、一旦Dcokerへ移行を行う
アプリケーション側DockerFile

```
# node.js の環境変数を定義する
FROM node:12      　　　//イメージの指定
ENV TZ=Asia/Tokyo
ENV DEBUG=app:*
WORKDIR /app　　　　　　
//命令はワークディレクトリを設定します。 
//Dockerfile 内にてその後に続く RUN、CMD、ENTRYPOINT、COPY、ADD の各命令において利用することができます。 
//WORKDIR が存在しないときは生成されます。 これはたとえ、この後にワークディレクトリが利用されていなくても生成されます。

COPY ./ ./
//COPY <src>... <dest>
//COPY ["<src>",... "<dest>"] （パスにホワイトスペースを含む場合にこの書式が必要）
//COPY 命令は <src> からファイルやディレクトリを新たにコピーして、コンテナ内のファイルシステムのパス <dest> に追加します。

RUN npm install
EXPOSE 3000
```

Docker composeファイル

適用する前に
イメージをビルドする[参照](http://docs.docker.jp/v1.11/compose/reference/overview.html)
build:            サービスの構築または再構築

```
docker-compose up -d --build   
docker-compose up -d
```

メモ書きではあるが、
[docker-compose コンテナの停止、ネットワーク・名前付きボリューム・コンテナイメージ・未定義サービスコンテナを削除](https://qiita.com/ucan-lab/items/6ac5c24142bbd3a02a7d)
dockerの停止はこちらを活用している。
細かく理解が必要であるが、一部のボリュームを残していたりすると作業が増えたり、ゴミファイルが貯まるので、、、一旦、全リセットという意味で

```
docker-compose down --volumes --rmi all --remove-orphans
```
scope使い方（Rails）

#modelの中にscopeを書く

複数使う場合はスコープで書いた方がコードが読みやすくなりますし、
単体テスト書くことが可能になるため積極的に使った方がいいです。

```ruby:item.rb
 scope :published, -> { where(private: true) }
```

```ruby:users_controller.rb
 def show
    if !@user.me?(current_user)
      @items = @user.items.published
    else
      @items = @user.items
    end
  end
```

モデルで` { where(private: true) }`定義することで
コントローラの記述が少なくなります。


#おまけ

```ruby:user.rb
def me?(user_id)
  id == user_id
end
```
`current_user`と`@user`が一致しているか
モデルに書くことで可能になります。

```ruby:users_controll.rb
if !@user.me?(current_user)
```
wgetで特定のディレクトリだけダウンロードしたい場合

## はじめに
書籍をもとにコードを書いている際、GitHub等にあるデータを読み込みたい場合がある.
例えば、"Deep Learning with PyTorch"の"2.2.2 CycleGAN"において馬の画像をシマウマの画像に変換するために、"https://github.com/deep-learning-with-pytorch/dlwpt-code/tree/master/data/p1ch2/horse2zebra_0.4.0.pth" をダウンロードする必要がある.

この際、Google Colabなどで作業している場合、愚直にやれば上記ファイルをローカルでダウンロードし、それをGoogle Drive等にアップロードするという手順を踏むことになると思うが、面倒&時間がかかるためGoogle Colab内で完結させたい.

先に結論:

``` sh
> wget -nH --cut-dirs=4 -r --no-parent <URL>
```

## wget
当然、wgetで以下のようにダウンロードすることができる.

``` sh
> wget https://github.com/deep-learning-with-pytorch/dlwpt-code/tree/master/data/p1ch2/horse2zebra_0.4.0.pth
```

だが、毎回これをするのは面倒なので、当該リポジトリの`data`フォルダごとGoogle Driveにダウンロードし、以下のようにデータへのアクセスを省力化することを考える.

``` python
# Google Colabでの処理
from google.colab import drive
drive.mount('/content/gdrive')

data_path = './gdrive/My Drive/Colab Notebooks/<dir_name>/data/'
```

### 問題
1. 普通に`wget -r` すると、親ディレクトリのファイル等も含む関係ないものまでダウンロードしてしまう
    - -> `--no-parent`オプションを用いる
2. 最後の`data/`だけダウンロードしたいのに、`github.com`フォルダからの階層を維持してダウンロードされる（ディレクトリ構成の例: `github/deep-learning-with-pytorch/dlwpt-code/tree/master/data/`）
    - -> `-nH`オプションと`--cut-dirs`オプションの組み合わせ
        - `-nH`オプション: ホストを無視（github.com）
        - `--cut-dirs`オプション: `--cut-dirs=n`の形式でcutする階層数を`n`で指定する(上の例で`-nH`オプションと組み合わせた場合、`n=2`とすると、`github/deep-learning-with-pytorch/dlwpt-code/`までcutできる)

よって、以下のコマンドをたたけばよい.

``` sh
> wget -nH --cut-dirs=4 -r --no-parent \
https://github.com/deep-learning-with-pytorch/dlwpt-code/tree/master/data/ (-P ./<dir_name>/)
```
必要であれば、`-P`でダウンロード先のディレクトリを指定する.
自律カスタム要素の使い方

##自律カスタム要素の使い方
自律カスタム要素とは、`<app-custom-element>`のようなこのままページにおける自作HTML要素のことです。組み込み要素から継承するものと違って、前者は継承元の動きを受け継いだうえで、ページには`<p is="app-custom-element">`のように`is`属性の指定が必要であるに対して、自律カスタム要素は完全に0から作り上げたものです。中身の構築はshadow domをつけるのが一般的な手法です。

```js

// 基礎の組み込みhtml要素からではなく、大本となるHTMLElementから継承する
class PopUpInfo extends HTMLElement {
  constructor() {
    // Always call super first in constructor
    super();

    // 自律カスタム要素にshadow domをつけるのが一般的な手法
    const shadow = this.attachShadow({ mode: 'open' });

    const info = document.createElement('span');
    info.setAttribute('class', 'info');

    // 自身に渡してきた属性をアクセスすることが可能
    const text = this.getAttribute('data-text');
    info.textContent = text;

    // Create some CSS to apply to the shadow dom
    const style = document.createElement('style');

    style.textContent = `
      .info {
        font-size: 0.8rem;
      }
    `;

    // Attach the created elements to the shadow dom
    shadow.appendChild(style);
    shadow.appendChild(info);
  }
}

// カスタム要素を登録する
customElements.define('pop-up-info', PopUpInfo);
```

ページでの使い方は以下のようです。

```html
<pop-up-info data-text="Your card"></pop-up-info>
```

dev toolsで見たイメージは大体こんな感じです：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107459/70329701-0dbe-c65e-fd88-a1eae2a5de38.png)

## 参考記事
https://developer.mozilla.org/ja/docs/Web/Web_Components/Using_custom_elements
【Git】Untracked filesをまとめて削除する方法

#プログラミング勉強日記
2021年3月21日

#エラーの内容
　`git checkout .`したのだが、まだ不要なファイル(未追跡ファイル)が残ってしまっていて以下のようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/5ef31e7d-765b-9e93-5a80-5a122a1d75d0.png)


```git
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        path...
        path...
nothing added to commit but untracked files present (use "git add" to track)
```


#削除するファイルを確認して削除する
　事前にどのファイルが削除されるか確認してから、削除するときはいかのコマンドを使う。

```
$ git clean -dfn
```

　それぞれのコマンドオプションの意味↓

-d：ディレクトリも含めて削除する
-f：強制的に削除する
-n：確認を行う

#参考文献
[git cleanでUntracked files(未追跡ファイル)をまとめて削除したい時](https://awesome-linus.com/2019/05/13/git-clean-untracked-files-delete/)
血圧管理ソフトウェアの設計書を作りました

血圧管理ソフトウェアの
①外部設計書
②UML図
③詳細設計書
を作成いたしました。
画像を添付いたします。

①外部設計書

![フロー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/7d9e2396-0c08-402b-4309-6d2707782d30.jpeg)

②UML図

![UML.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/914b418a-6d4d-a1cd-e338-c5607e252df7.jpeg)

③詳細設計書

![詳細設計書.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055346/c91bdaa5-5f29-c47b-a4c4-0dc6c7b3fdc5.jpeg)
インタープリタを作る その13

#概要

インタープリタを作ってみた。
pythonで俺言語インタープリター書いてみた。


#zundokoのソースと実行結果

```
>0
10  a=0
30  b=$
50  #=b<5*100
60  ?="zun "
70  a=a+1
80  #=a>4*130
90  #=30
100  ?="doko "
110  a=0
120  #=30
130  ?="doko "
140  ?="kiyosi!"

>#=1
zun doko zun doko zun zun doko zun doko doko zun zun zun doko zun zun doko doko
zun doko zun doko zun zun zun zun doko kiyosi!
>

```

以上。
インタープリタを作る その12

#概要

インタープリタを作ってみた。
pythonで俺言語インタープリター書いてみた。

#fizzbuzzのソースと実行結果

```
>0
10  a=0
20  a=a+1
30  #=a>100*255
40  b=a%15
50  #=b=0*120
60  b=a%5
70  #=b=0*140
80  b=a%3
90  #=b=0*160
100  ?=a
110  #=20
120  ?="fizzbuzz "
130  #=20
140  ?="buzz "
150  #=20
160  ?="fizz "
170  #=20

>#=1
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fiz
z 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz
 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fi
zzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz
 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97
98 fizz
>
```

以上。
BluePill で invalid conversion を fpermissive で回避

多分一部のライブラリがver upしたからと思いますが、以前通ったはずのサンプルコードが今日は通らない。

コンパイラのメッセージを見ると
invalid conversion from 'const uint8_t* {aka const unsigned char*}' to 'uint8* {aka unsigned char*}' [-fpermissive]
　と出ている。
うーん、細けぇこというなよ、、と思いつつ、ネットを調べると、コンパイラのオプションは
C:\Program Files (x86)\Arduino\hardware
下にあるそれぞれのハードウェアの、つまり例えばnanoなら
C:\Program Files (x86)\Arduino\hardware\arduino\avr
にある platform.txt
に記述されているとのこと。　nanoではエラーにならないので、こっちを見てみると
compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive 以降略
と -fpermissive  が指定されている。

一方　
C:\Program Files (x86)\Arduino\hardware\Arduino_STM32-master\STM32F1
にある BluePill 用のそれには
compiler.cpp.flags の項に -fpermissive が指定されていないので追記してみたところ
問題無くコンパイルされ期待通りの動きをしてくれました。

自分向け備忘録的ではありますが、
エラーメッセージがでると、従来はめげてしまっていましたが、今回は読解して対処してみた結果うまくいったので、他にもはまる人いるのかも、、ということで書いておきまする。
Wordpressで自作のコンポーネントを作って変数付きで呼び出す方法

# どうも7noteです。Wordpress5.5からget_template_part()の第三引数に変数を持たせることができるようになったらしい！

ちょっと出遅れたのですが、get_template_part()を使って第三引数に変数を持たせて、呼び出し元で設定した変数をもとにインクルードさせて実行できるようになったようです！

**つまり、**

**「自作コンポーネントを作って呼び出すときに追加オプションが設定できるようなもの」**

（いろんなページで使うから、1つのファイルとして管理したいけど、TOPページと下層ページでは1か所だけ違うんだけどどうしよう・・・）なんてことがあっても大丈夫！
呼び出すときに呼び出し元によって異なる箇所だけ変数として設定しておくことで1ファイルで管理でき、コンポーネントとして使えるのです。こうしてパーツ化させておけば管理や修正がとても楽になります。

## どう変わったのか？

**【過去】Wordpress5.4以前**

```hogehoge-a.php
例）「あいうえおかきくけこ」
```

```hogehoge-b.php
例）「あいうえおかきくけコ」
```
（↑ 内容がほぼ一緒なのに1部だけ違うから別ファイルにしないといけなかった　↑）


```home.php
<?php 
  get_template_part(hogehoge,a);
?>
```

```single.php
<?php
  get_template_part(hogehoge,b);
?>
```


### 【現在】Wordpress5.5以降

```hogehoge.php
 <?php $text = $args; ?>
「あいうえおかきくけ<?php echo $text; ?>」
```
`$args`に値が格納されているので、引っ張り出す。

```home.php
<?php
  $text = "こ";
  get_template_part('hogehoge',null,$text);
?>
```

```single.php
<?php
  $text = "コ";
  get_template_part('hogehoge',null,$text);
?>
```

**結果**

〇TOPページ
→「あいうえおかきくけ**こ**」

〇記事(single)ページ
→「あいうえおかきくけ**コ**」

## 解説

パット見ではそこまで差がないように思えるが、テンプレートファイルの差異のパターンが3つ4つ5つ・・・と増えていく可能性を考えたり、**共通の修正が1ファイルの修正で済む事を考えれば圧倒的にget_template_part()を使う方法の方がメンテナンス性が高い**です。


## おまけ

～他にも第三引数に変数を入れて渡すことができるようになった関数たち～

- get_header()
- get_footer()
- get_sidebar()
- get_template_part()
- locate_template()
- load_template()



## まとめ

wordpress5.4以前でも変数を渡す方法があったのでご紹介。

```hogehoge.php
<?php
  $text = get_query_var('text');
?>

「あいうえおかきくけ<?php echo $text; ?>」
```

```home.php
<?php
  set_query_var('text', 'ko');
  get_template_part('hogehoge');
?>
```

**結果**

〇トップページ
→「あいうえおかきくけ**ko**」



#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Ubuntuのデュアルブートから1つ消去したらgrubが壊れた件

#始めに
これは、ubuntuの20.04と18.04そしてwindows10をデュアルブートにしていたものを18.04を削除したときにgrubの修復に少しはまったので、自分へのメモです。

#参考サイト

このサイトのやり方はraidの修復だったので、このやり方のraid部分を抜いたものになります。
[grub rescueで'grub_file_filters' not foundが出るときの対処方](https://keens.github.io/blog/2019/10/21/grub_rescuede_grub_file_filters__not_foundgaderutokinotaishohou/)

#必要なもの

- ubuntu 20.04のインストールUSBメモリ（多分インストールCDでも行けると思います）

#手順

1. インストールUSBを立ち上げます。そして「Ubuntuを試す」を選択し、起動したら端末を開きます。基本rootの操作で面倒なので、rootになります。

2.次に復旧したいubuntu（この場合20.04）のデバイス名を確認します。今回はubuntn 20.04が/sdaに入っていることを想定します。つまり/dev/sda1がbootで/dev/sda2がrootになります。fdiskなどで確認します。

```
$ sudo su
# fdisk -l
```

3.utuntu 20.04が入っているディスクをマウントします。まずrootを/mntにマウントし、その後/mnt/bootにbootをマウンンとします。

```
# mount /dev/sda2 /mnt
# mount /dev/sda1 /mnt/boot
```

4.その他の疑似ファイルシステムをマウントします。（すみません、ここは受け売りです・・・。）そしてchrootします。

```
# cd /mnt
# mount -t proc proc /mnt/proc
# mount --rbind /sys sys/
# mount --rbind /dev/ dev/
# chroot /mnt /bin/bash
```

5.grubの再インストールをします。そして再起動するとgrubが立ち上がります。

```
# grub-install /dev/sda
# update-grub
# reboot
```

今回確かめられていないのですが、grub-installでsecure関係のエラーが出る場合は、uefiのsecure bootをオフして試してみてください。

#終わりに
今回はメモのため、感想なしです。
エラー解決（メモ）An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.と、Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

# 状況

```bash
$ bundle install
```

を実行しようとしたらエラーが発生


#### ①下記を入力

```bash

$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

#### ②Gemfileに

```bash
gem 'mysql2', '~>0.5.3'
```

を書いて、

```bash
bundle install
```

を実行する










#####参照記事
https://qiita.com/KKDDD/items/0ec0a4d11c1ff8330f3d
Android ナビゲーションバー透過


```xml:app/res/values/themers/themes.xml
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
```
```kotlin:MyActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        window.setFlags(
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        )
    }
}
```
ハーバード大のWEB講座でRを使ったデータサイエンス入門をやってみる Part.6 グラフ作成

過去の投稿

[第一回](https://qiita.com/Wataru-Tanada/items/6c201d59d03ce3ea31d9)
[第二回](https://qiita.com/Wataru-Tanada/items/f80bb564f08696e6fbe6)
[第三回](https://qiita.com/Wataru-Tanada/items/68d122a408221ad53223)
[第四回](https://qiita.com/Wataru-Tanada/items/b15ff469a87d02304072)
[第五回](https://qiita.com/Wataru-Tanada/items/f69904bdb437f3e22496)

データサイエンスといえばデータの可視化、つまりグラフ作成が重要になってきます。まずは単純に殺人件数と人口のグラフを作ってみます。

```
> poplation_in_millions <- murders$population/10^6
> total_gun_murders <- murders$total
> plot(poplation_in_millions, total_gun_murders)
```

![2021-03-21 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479726/b0be0db8-9537-4837-5885-c1b6cf17152d.png)


素早くグラフが出てきました。人口と殺人件数に正の相関があることが見て取れます。
ここで気になったのは殺人件数って一件当たりの人数数えてますか？とか事故と事件、正当防衛とかどうやって区別してますか？ってところですが、そういった点も含めて可視化して検証をすることが
必要なのでしょう。（マイケル・ムーアの映画で年間1万数千人とか言ってたような気がする。）

次にヒストグラムを作ってみます。どんな意味だっけ...。
（「ヒストグラムとは、縦軸に度数、横軸に階級をとった統計グラフの一種で、データの分布状況を視覚的に認識するために主に統計学や数学、画像処理等で用いられる。柱状図、柱状グラフ、度数分布図ともいう。 」 wiki より参照）
こちらについては別の講座で詳しくやるよ、とのことでした。
シンプルにhist でプロット（作図）することができます。rateをmurdersの中に追加した状態じゃないといけないので、これ読んでやってくれている人の中で日が開いた人は注意しましょう

```
hist(murders$rate)
```

![2021-03-21 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479726/b2e4bc79-cb83-e5b4-5080-7473851698aa.png)


一個だけイレギュラーなデータがあるので調べてみましょう。

```
> murders$state[which.max(murders$rate)]
[1] "District of Columbia"
```

District of Columbia（ワシントンD.C.）が飛びぬけて危険...。不安はぬぐえませんでした。

もう一つ、boxplot という機能もあります。google翻訳では箱ひげ図と訳されました。株でよくあるロウソク足みたいなやつですかね？

```
> boxplot(rate~region, data =murders)
```

![2021-03-21 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479726/c40c36c4-bbea-2fff-3a98-489cac7d18a4.png)

これについてはどんな意味があるのか説明はされませんでした。最大値、最小値と平均値みたいなのかなとも思いましたが、Southの飛び出た点はそれだと説明できないし...。
でも4つの地域にまとめたグラフが一瞬で出てくるのは便利ですね。
この操作はggplotというパッケージをインストールして使えるものになりますが、便利なので初心者にはマストな機能なのでしょう。

このあとのグラフの小テストとアセスメントはまあまあ簡単なような気がします。ただ、例によって問題が何言っているのかつかめないと何していいのかわからず途方にくれます。簡単にできる問題の簡単さからすると難易度は結構低めのような気がするんですけどね...。
これで3章が終わって次回最終章ではプログラミング要素の入った使い方を学びます。

[第七回](https://qiita.com/Wataru-Tanada/items/b9c5b746dcf3f37fcfb4)へ続く
【SAA試験対策】EC2 物理ホストについてまとめてみた

#概要
SAAの模擬試験対策の自分用のメモ
EC2は仮想サーバであるが、種類によっては物理ホスト（インスタンス）と関連づけることができる
種類は、以下の2つ

・Deticated Instatnce
・Deticated Hosts

#特徴
どちらも**お客様専用**の物理サーバにEC2インスタンスを起動できるオプション

#Deticated Instatnce
物理ホストをアカウントに割り当て、その物理ホスト内でインスタンスを起動できる

**■ユースケース**
・コンプライアンス要件などで他のAWSアカウントと異なるサーバで起動する必要がある場合

#Deticated Hosts
物理インスタンスがデプロイされる物理ホスト自体を固定できる
Deticated Instatnceの特徴＋αの管理機能がある
※Dedicated Instatnceの機能の不足を補うために後に公開されたサービスらしい

**■＋αの管理機能**
・インスタンスの詳細コントロール
・リソース可視性
・CPUコアごとまたはソケットごとにライセンスが消費されるソフトウェア管理ツール

**■ユースケース**
・動作させるソフトウェアのライセンス上ハードウェアを専有することが条件であることが必要な場合
・保有するライセンスをインストールに持ち込む場合（＝BYOL(Bring Your Own License)と呼ぶらしい）
・同じAWSアカウントでもIAMによるアクセス権限を制御をしたい場合



ちなみにEC2起動時の「ステップ3.インスタンスの詳細の設定」にあるテナンシーより選択することができる
![EC2専有ホストについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079008/ebe55433-09b8-aef5-d175-fdd2738931d5.png)





また同じ問題の選択肢によく出てくるベアメタルについても補足。。

#ベアメタル
物理サーバを直接操作可能でありハードウェアへのダイレクトアクセスを提供される

**■ユースケース**
・仮想化環境上からは利用できないワークロードを実装したい場合
・独自にハイパーバイザ（仮想環境を作ってうごかすためのソフトウェア）を導入・管理し、CPU/メモリをより柔軟に仮想サーバに割り当てたりしたい場合
※専有ホストにはハイパーバイザが事前にインストールされている

#参考
詳細は公式サイトをご確認ください

[Dedicated Hosts](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html)
[Amazon EC2 専有ホストのよくある質問](https://aws.amazon.com/jp/ec2/dedicated-hosts/faqs/)
関数どれ使う？JavaScript


JavaScriptには関数の定義方法がいくつかありますね。

##関数宣言
```javascript:kansuSengen.js
function echo() {
  console.log("hello");
}

echo(); // helloと出力される
```

一番ベターなやつです。これが書ければもう何も困ることはないかなと言う感じです。

##関数式
```javascript:kansuSiki.js
const echo = function () {
  console.log("hello");
};

echo(); // helloと出力される
```
関数宣言と同じ挙動をしますが、ちょっと長い記述になっています。


##アロー関数
```javascript:kansuSiki.js
const echo = () => {
  alert("hello");
};

echo(); // helloと出力される
```
簡単に言うと関数式の略版ですね！
今風でとてもかっこいいです。積極的にこれを使いましょう。
違いもありますが、当記事では(関数式 = アロー関数)としておきます。 

##関数宣言と関数式はどっちを使うのが良いのか？
僕的には、どれでも良いと思います。プロジェクトのコーディング規約に従えば良い。
関数定義法の細かい仕様を考えだすとめんどくさそうなので、少しだけ説明します。

###関数宣言には巻き上げがある

```javascript:kansuSengen.js
echo(); // helloと出力される

function echo() { // 呼び出しより後の記述だが実行できる。
  console.log("hello");
}
```
このコードは正常に実行されます。呼び出しより後に宣言されているのに。
これが巻き上げというものです。
プログラムは基本上から下に実行されますが、宣言は実行時に全て上に移動します。
<font color="Red">※変数宣言も同様です。(変数の場合、宣言のみで初期化はされない)</font>

###関数式は巻き上げがない
```javascript:kansuSiki.js
echo(); // 呼び出しより後に定義されている為エラーとなり、出力出来ない。

const echo = function () {
  console.log("hello");
};
```
これは実行出来ません。なぜなら巻き上げられるのは宣言のみだからです。
>const echo

のみが巻き上げられ、echo( )時点では処理の代入がされていないのです。
じゃあ記述場所を問わない関数宣言の方が良さそう！と思いますが、大体はこんな処理が一般的な気がします。

```javascript:kansuSiki.js
window.addEventListener('load', function () {
  echo(); // helloと出力される。
});

const echo = function () { 
  console.log("hello");
};
```
これは画面表示されたタイミングでecho( )を呼んでいる単純なプログラムです。
そもそもスコープが違うので実行出来ます。やっぱり関数宣言、関数式(アロー関数)どちらでも良さそうですね。スコープについても少しだけ触れます。
##グローバルスコープとローカルスコープ
変数の参照範囲はどのプログラム言語でもあります。
###グローバルスコープ
- トップレベル（関数の外）に記述されている変数や関数はグローバルスコープとなる。
- ここに宣言されている変数はプログラム中のどこからでも参照可能。（ただし、同じグローバルスコープ内では記述順によっては先ほどの関数式の例のようにエラーとなる）
- varで宣言した場合、グローバル変数となる。

**補足**
<details><summary><font color="Blue">グローバル変数とは</font></summary>プログラム中のどこからでも参照する事が出来る変数の事です。
例えば、HTML要素を取得するときにdocument.get〜みたいに書くと思います。
このdocumentもグローバル変数の1つなのです。ちなみに、letやconstで定義した場合グローバルスコープにはなりますが、グローバル変数にはなりません。</details>

###ローカルスコープ
ローカルスコープには関数スコープとブロックスコープというものがあります。
####関数スコープ
- 関数内に宣言された変数は、その関数内でのみ参照可能。

####ブロックスコープ
- ブロック内に宣言された変数は、そのブロック内のみ参照可能<br>
<font color="Red">※ブロックスコープが適用されるのはlet、constで宣言されたもの</font>



##結局どれ使うか
やっぱり自分の書きやすい方法で良いと思います。
注意点があるとすれば、関数宣言は上書きされます。

```javascript:kansuSengen.js
window.addEventListener('load', function () {
  echo(); // おはようと出力される。
});

function echo() {
  console.log("hello");
}

function echo() { // こっちが勝つ！！
  console.log("おはよう");
}
```
javaみたいにエラーなんて出してくれません。
当たり前ですが、関数式をvarで定義した場合も上書きされます。

```javascript:kansuSiki.js
window.addEventListener('load', function () {
  echo(); // おはようと出力される。
});

var echo = function () {
  console.log("hello");
};

var echo = function () { // こっちが勝つ！！
  console.log("おはよう");
};
```
varは再代入、再定義が可能なので関数式使うのであればconstが無難かと思います。
つまり同じ関数名をつけなければどちらでも良いですね。
結論、好きな方、プロジェクトに添った方を使用しましょう。
ABC196 振り返りメモ(C問題まで)

#結果
ABCまでの3完で, レート変化は<font color="Maroon">695</font>→<font color="Maroon">722</font>(+27)

#[A問題 ( Difference Max )](https://atcoder.jp/contests/abc196/tasks/abc196_a)
###概要
> a <= x <= b, c <= y <= d の時の, x - y の最大値

###方針
x は大きく, y は小さくすれば良いので, b - c で OK.
コンテスト中は思いつかず, 全探索してしまった.

C++ での実装例は以下のようになる.

```cpp:a.cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
int main() {
    ll a, b, c, d; cin >> a >> b >> c >> d;
    cout << b - c << endl;
} 
```

#[B問題 ( Round Down )](https://atcoder.jp/contests/abc196/tasks/abc196_b) 
###概要
> N の小数点以下を切り捨てて出力する.

入力を文字列で受け取り, ピリオドより前の数字を出力すれば良い.
このような問題は Python だと簡潔に書ける.

### 方針

Python での実装例は以下のようになる.

```py:b.py
x = input()
x = x.split('.')[0]
print(x)
```

#[C問題 ( Doubled )](https://atcoder.jp/contests/abc196/tasks/abc196_c)
###概要
> 1 以上 N 以下の整数で, 十進表記は偶数桁であり, その前半と後半は文字列として等しいものの個数を求める.

### 方針
6桁の数字を全探索して, それと同じものをくっつけた数字が N 以下になるものを数えれば良い.
(例) i = 345 のときは, 345345 が N 以下になるかを考える.
また, N を越すような i が出てきたら, それ以降は全部 N を越すので, その時点で break して良い.

C++ での実装例は以下のようになる.

```cpp:c.cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
 
int main() {
    ll n; cin >> n;
    ll ans = 0;
    for (ll i = 1; i <= 1000000; i++) {
        if (stoll(to_string(i) + to_string(i)) <= n) ans++;
        else break;
    }
    cout << ans << endl;
} 
```
Azure ADユーザーにパスワード変更を強制させる

# はじめに
Azureポータル上ではパスワードのリセットは可能ですが、次回サインイン時にパスワードの変更を強制させるボタンが見当たりませんので、PowerShellで設定したいと思いました。

# 環境
``` PowerShell
> $PSVersionTable.PSVersion


Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      19041  868


> Get-InstalledModule -Name AzureADPreview


Version              Name                                Repository           Description
-------              ----                                ----------           -----------
2.0.2.129            AzureADPreview                      PSGallery            Azure Active Directory V2 Preview Module. ...
```

# 注意点
## 使用するモジュールについて
詳しくはよくわかりませんが、（将来改善されるかもしれない）
``AzureAD``モジュール、``AzureADPreview``モジュールはPowerShell 7以降では``Connect-AzureAD``コマンドが動作しないようなのでPowerShell 5.1で実行する必要があります。

## スクリプトを実行するユーザーのロールについて
少なくともユーザー情報を更新することが可能なロールを割り当てられたユーザーとして実行する必要があります。
私は検証環境でグローバル管理者を持ったユーザーから実行していますが、実際の現場では割り当てられたロールに注意をする必要があります。



# スクリプト
スクリプト自体はとてもシンプルで、
ユーザーの``PasswordProfile.ForceChangePasswordNextLogin``に``$true``を代入するだけです。

``` PowerShell
Connect-AzureAD -TenantId <TenantId>

$PasswordProfile = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordProfile
$PasswordProfile.ForceChangePasswordNextLogin = $true

Set-AzureADUser -ObjectId <UPN> -PasswordProfile $PasswordProfile
```


# ユーザーのプロパティを確認する
## スクリプト実行前のプロパティ
``PasswordProfile``が``$null``になっています。

``` PowerShell
> (Get-AzureADUser -ObjectId <UPN>).PasswordProfile -eq $null                  

True
```

## スクリプト実行後のプロパティ
``PasswordProfile``にコマンドで作成したオブジェクトが代入されています。
``PasswordProfile.ForceChangePasswordNextLogin``が``$true``になっていれば成功です。

``` PowerShell
> (Get-AzureADUser -ObjectId <UPN>).PasswordProfile


Password ForceChangePasswordNextLogin EnforceChangePasswordPolicy
-------- ---------------------------- ---------------------------
                                 True                       False
```


# ユーザー視点
これまでのパスワードを入力し、サインインすると。。
![スクリーンショット 2021-03-20 191122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689062/cefc1fc0-9eee-93d7-4d44-fa0299b36766.png)



パスワードの更新画面が表示されますね。成功です。
![スクリーンショット 2021-03-20 191216.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689062/284ac6d0-55d2-c4db-4200-d26f372e73a0.png)



# おわりに
パスワード変更を強制する場面は新規でユーザーを作成した際に多いと思いますが、
Microsoftは気が利いているのでAzureポータルで新規に作成したユーザーは規定で``PasswordProfile.ForceChangePasswordNextLogin``が``$true``になっています。

また、セキュリティ的に危険なコンディションでのサインイン試行時にパスワード変更を強制したい場合、AzureADの条件付きアクセスポリシーで制御する方が良いと思われます。

なので実際のところこのスクリプトを実行する場面は限られると思いますが私の現場では必要になりましたので備忘録としてまとめました。
Preloadでブラウザにリソースを前もってFetch させる

**01 HTMLタグ**  

```
<link rel="preload" href="script.js" as="script">
```

**02 Preload（上記） ＋　リソースを通常読み込み処理**  

```
// script
let pl = document.createElement('script');
pl.src"xxx.js";
document.body.appendChild(pl);

// StyleSheet
let plStyle = document.createElement('link');
plStyle.href="xxx.css";
plStyle.rel="stylesheet";
document.head.appendChild(plStyle);
```

**03 CSSファイルが先読みできたらすぐ実行**  

```
<link rel="preload" href="style.css" as="style" onload="this.onload=null;this.rel="stylesheet">
```

**04 スクリプト　先読み** 

```
// ブラウザはxxx.js　リソースを先読み込み、実行しない
ar preloadLink = document.createElement("link");
preloadLink.href = "xxx.js";
preloadLink.rel = "preload";
preloadLink.as = "script";
document.head.appendChild(preloadLink);

// ブラウザで xxx.js リソースを実行
var preloadedScript = document.createElement("script");
preloadedScript.src = "xxx.js";
document.body.appendChild(preloadedScript);
```

**05 as属性の値**  

```

// as属性の値

audio: オーディオファイル, as typically used in <audio>  

document: HTML ドキュメント  <frame> or <iframe>　埋め込み  

embed: <embed> エレメント　に埋め込みリソース  

fetch: fetchによるアクセスリソース もしくは XHR リクエスト（ArrayBuffer or JSONファイル）  

font: Fontファイル

image: Imageファイル

object: <object> エレメントに埋め込みリソース  

script: JavaScriptファイル

style: CSS stylesheet

track: WebVTTファイル

worker: JavaScript web worker もしくは shared worker

video: Videoファイル <video>タグ
```


参照元：[MDN rel="preload" によるコンテンツの先読み](https://developer.mozilla.org/ja/docs/Web/HTML/Preloading_content)
https://developer.mozilla.org/ja/docs/Web/HTML/Preloading_content

参照元：[rel=”preload” によってリソースを先読みさせる](https://laboradian.com/rel-preload/)
https://laboradian.com/rel-preload/
サービスの設計思想に関する知識

#本記事について
プログラミング初心者がサービスの設計思想に関する知識を学んだので、その備忘録として載せております。

どうかお手柔らかにお願いいたしますm (- -)(_ _)ペコリ

##アーキテクチャ（構造）
webサービスや設計を形作る構造や構成のこと

例） Ruby on railsで言うMVCアーキテクチャ

##アーキテクチャスタイル（設計指針）
webサービスの構造や構成を決めるアーキテクチャを決める際の設計指針

お客様ユーザーがより使いやすく、アプリケーションへの負荷を低減できたり、より効率的な開発ができるうような設計方針

##RESET(Representational State Transfer)
webのアーキテクチャスタイルのこと

##RESETのメリット
書き方が統一化されているので他のRESETのシステムと連携し機能を広げることが可能である

入力が少ない情報配信サービスや検索サービスなどに向いている

##RESETのデメリット
構成のルールが決まっているので単体では拡張性に乏しい

RESETはクライアント/サーバーから派生したもので、クライアント/サーバーに構成を加えることでRESETが成立

##クライアント/サーバー
サービス提供コンピュータ（サーバ）とそのサービス利用するコンピュータ（クライアント）がネットワークでつながった構成になっているシステムのこと

サーバのコンピュータとクライアントのコンピュータがつながっている仕組みのこと

クライアント側とサーバー側で処理を分ける仕組み

クライアントとサーバー間でリソースをやり取りする時、クライアントからURLにHTTPメソッドを加えた情報でリクエストする

##リソース（RESETに関連する言葉）
web上で名前を持ったあらゆる情報のこと

すなわち情報のこと

無数のリソースはURLで場所を特定できる

URLを用いることでリソースの閲覧ができる

##URL
リソースがどこにあるのかを指し示すもの

##RESETを使うべき理由
簡単でシンプル
すべての情報はリソース（URL）で表現されそれを４つのHTTPメソッド（GET,POST,PUT,DELETE）のみで使用するので非常にシンプルな設計になる

システムが単純なのでサーバー側の負荷が少ない

ステートレスなのでサーバーはクライアントの情報を保存しない

クライアントからの全ての情報をはじめから送信するので、複数のリクエストが集中しても別々のサーバーで処理できるなど、サーバーの負担を減らしやすくなる

##RESTful
RESETの考え方や原則に従って実装されていること

RESETの構成やルールを守ることでよりシンプルで連携のしやすいWebサービスの実装が可能

ステートレスサーバー（ステートで状態　ステートレスで状態がない）
クライアントの状態を保持しないサーバー

サーバー側で状態を管理しないため、クライアントはリクエストごとに全ての情報を送信する

メリットはサーバー側の実装が簡単になること

サーバー資源をすぐに解放できるという利点があり、利用者に機能性能において恩恵を与えれるし負荷の低減も行える。

##キャッシュ
一度得たリソースをクライアント側で保存し、そのリソースを使い回す仕組み

よく使うデータを取り出しやすいところに予め準備しておく仕組み

メリット
クライアントとサーバー間の通信を減らすことで処理の時間の短縮と効率化につながる

デメリット
古いキャッシュを使うことで情報の信頼度が下がる

##統一インターフェース
使用するメソッドを固定すること

##インターフェース
２つの物ののくっついている部分

##階層化システム
システムを階層ごとに分けること

クライアントとサーバーの間に階層を分割するものを設け、負担を分散する

統一インターフェースにより受けられる恩恵

##コードオンデマンド（JavaScript）
プログラムをクライアント側で実行すること

メリット
クライアントは後から新しい機能を追加していける

デメリット
クライアント側での実行が増えるので、サーバーとやり取りされるリソースの内容が明確ではなくなる

##RESETに従って実行すると全体としてより良いwebサービスとなる。
RESETだけではないし、６つのうち選択的に除外しても問題ない

##SOAP（Simple Object Access Protocol）
通信する上でのルールでリクエスト及びレスポンスともにコンピューターが読み取りやすいように形成されたデータでやり取りを行う

複雑な処理を必要としたりセキュリティの設定を必要とするようなサービスに向いている

高機能で拡張性がある

##RESETとSOAPの簡単な違い
RESETはシンプルで簡単、SOAPは高機能で複雑
(Note)ゼロから作るDeepLearning2 ２～４章


# ■**「単語の意味」をコンピュータに理解させる3通りの方法 (p59～)**

## **1. シソーラス**

-   同義語と上位・下位の関係性をピラミッドのように定義した辞書

-   WordNet(1985~) 20万語以上

    -   メンテナンスが大変！


 
## **2. カウントベース**

-   **コーパス**

    -   大量のテキストデータ(＋品詞やラベル)）を使う

<!-- -->

-   **単語の分散表現**

    -   色の3次元の分散表現＝(255,255,255)

        -   カウントベースや、推論ベース（NN）がある

<!-- -->

-   **分布仮説**

    -   単語の意味は、周囲の単語（コンテキスト）によって形成される

-   **共起行列**

    -   ウインドウサイズ１の共起行列、などと言う

-   **コサイン類似度**

    -   ２つの単語ベクトルの類似度を表現

-   **相互情報量**

    -   高頻度な単語との関連性を低く調整する式

    -   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177815/83e2f7b5-e10c-b89c-6022-95854ffac109.png)


        -   <https://www.zenknow.tokyo/entry/2018/09/14/085411>

        -   Pointwise Mutual Information

    -   PMIを使ってPPMI行列に変換！（元の共起行列の重みが0or1から変わる）

-   **次元削減(dimensionality reduction)**

    -   重要な情報を残しつつ次元削減をして、ノイズに強くする。頑健性を高める。

    -   特異値分解 (SVD : singular value decomposition)

        -   普通にやるとO(n^3)のオーダー！(n=単語数)

        -   計算オーダーの小さいTruncated SVDもある

    -   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177815/a74b7792-4e6e-a248-9ba7-8c41b9bc6974.png)



## **3. 推論ベース（word2vec）**

-   **ニューラルネットワークのメリット**

    -   SVDではコーパス全体を1度に学習するが、NNはミニバッチ学習が可能

-   **推論ベースから単語の分散表現を作るには？**

    -   コンテキストを入力→モデル→単語を推測

        -   モデル自体が各単語の分散表現になっている（らしい）

### **CBOWモデル**(Continuous bag-of-words)

-   コンテキストからターゲットを推測するNN

-   中間層＝単語の分散表現

-   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177815/40cf2925-c666-b1c1-dc91-5427e9619cf3.png)



    -   (引用)https://qiita.com/To\_Murakami/items/6bd5638689166ec4821c

-   ソフトマックス＋クロスエントロピー誤差→負の対数尤度

    -   これを最小化する＝誤差が0になる

### **skip-gram**モデル

-   こちらの方が、単語の分散表現の精度が高い

    -   低頻出の単語や、類推問題の性能が比較的良い

  

-   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177815/6dd98626-31d9-7d11-95af-9aae28dd6383.png)


---
カウントベースも推論ベースも類似性の精度の定量評価は変わらない。
推論ベースは追加学習出来るのがメリット
  


# ■**word2vecの深堀**

## **word2vecの高速化**

###  **Embedding layer**

 -   **one-hotベクトル（入力ベクトル）と重みとの積ではなく、ハッシュ化する**。

### **Negative Sampling**

-   多値分類から二値分類へ

    -   ソフトマックス関数からシグモイド関数へ

-   ここで想定される問題は、推論時に「say」に該当する単語を、全単語数当てはめないといけないように感じる。

    -   ただ、目的は分散表現を作成（学習まで）してそこから、意味を足し算引き算したり、クラスタリングしたり、なので推論にかかる時間はあまり重要ではない。

-   もう一つの問題は、負例の問題を学習していないことにある。

    -   そこで、**負例データを少数（５～１０）サンプリングする。**(p153)

    -   コーパスの統計データに基づいてサンプリングするのが良い。

        -   ただ、単語の確率分布の0.75乗したものの方が推奨されている。

            -   低頻度の単語のサンプリング確率を微増させるため。

  

## **改良版word2vecの学習(p164)**

-   ウインドウサイズは2～10が良い

-   分散表現の次元数は50～500が良い

  

## **word2vec（分散表現）の他のメリット**

-   転移学習ができること。

-   文章を固定長の単語ベクトルに変換できること。

    -   単語ベクトルの総和による文章のベクトル表現化（bag-of-words)

    -   RNNによる文章の固定長ベクトルへの変換

  

## **単語ベクトルの評価方法(p172)**

-   Semantics…単語の意味の類推問題の正解率

-   Syntax…単語の形態情報の問題の正解率

  

# ■**まとめ**

単語をベクトル化すると、様々な問題を解くための「入力値」として使える！
XORでの交換

### 結論
読みにくいし、たいして速くもならないしので無理に使う必要もない。 
ただし、書き方は理解しておくべきであり、非常に短く書けるので、競技プログラミングや自分だけが使うテストコードなど、いわゆる「捨てコード」では使えた方が良い。開発現場であれば周囲の環境に合わせるべきである。例えば頻繁に人が入れ替わる場合はたいてい初心者が来るので書くべきではないが、特に入れ替わりもなく、実力者ぞろいの環境であればどんどん使うべきである。

## 概要
変数を交換する際には一般的には以下のように変数を新たに一つ用意して交換を行う。

```cpp
void swap(int& a, int& b) {
	int c = a;
	a = b;
	b = c;
}
```
これをXORを使用することで、以下のように短く書くことができる。

```cpp
void swap_xor(int& a, int& b) {
    a = a^b;
    b = a^b;
    a = a^b;
}

//さらに短くするとこうなる
void swap_xor(int& a, int& b) {
    a ^= b ^= a ^= b;
}
```
これはXORの以下の２つの性質を利用している

1.x^x＝0　ある同一の変数xのXORを取ると0となる  
2.(a^b)^c = a^(b^c)  XORを取る順番は結果に無関係である。つまり、順番を変えても同一になる。 （代数学では「結合律を満たす」という）

このうち、1.は定義なので自明とする。
2.において、ある変数a,b,cがあったとして、cにaとbのXORの結果を代入したとする。

```cpp
int c = a^b
```

この時cに対してさらにaのXORを取れば結果はbになり(a^b^a => b)、  
逆にこの時cに対してさらにbのXORを取れば結果はaになる(a^b^b => a)。  
これらのことをを利用する。

```cpp
c = a^bの時、
c^a ＝a^b^aであり、
a^a=0であるから
結局c^a = 0^b=bとなる
```

これらの性質を用いて説明する。実際にはcという変数を用意せず、aという変数にa^bの結果を代入しているため、わかりにくくなっている。ポイントはa,bという変数に格納されている値が何かを丁寧にみていくと理解できる。

```cpp
void swap_xor(int& a, int& b) {
    a ^= b; //a^bの結果をaに代入
    b ^= a; //a(ここでは中身はa^b)とbのXORを取る。bにはb^a^bの結果、つまりa(0^a)を代入している。b^b=0を使用する。
    a ^= b; //a(同じく中身はa^b)とb(中身はa)なので、a^b^aの結果、つまりb(0^a)をaに代入している。a^a=0を使用する。
}
```

## 速度比較
各５回ずつ実行して比較したのだが、ほぼ同じ。

```cpp
swap by XOR = 1.876sec.
swap by XOR = 1.833sec.
swap by XOR = 1.826sec.
swap by XOR = 1.8sec.
swap by XOR = 1.82sec.
swap by variable = 1.803sec.
swap by variable = 1.811sec.
swap by variable = 1.81sec.
swap by variable = 1.827sec.
swap by variable = 1.86sec.
```

以下比較用コード

```cpp
#include <iostream>
#include <time.h>
using namespace std;
#define rep(i,s,n)for(ll i = s;i<n;i++)

void swap(int& a, int& b) {
	int c = a;
	a = b;
	b = c;
}

void swap_xor(int& a, int& b) {
    a ^= b ^= a ^= b;
}

int main() {
    int a = 10;
    int b = 20;

    clock_t start,end;

    for (int k = 0; k < 5; k++) {
        start = clock();
        for (int i = 0; i < 1e8; ++i) {
            swap_xor(a, b);
        }
        end = clock();
        std::cout << "swap by XOR = " << (double)(end - start) / CLOCKS_PER_SEC << "sec.\n";
    }
    for (int k = 0; k < 5; k++) {
        start = clock();
        for (int i = 0; i < 1e8; ++i) {
            swap(a, b);
        }
        end = clock();
        std::cout << "swap by variable = " << (double)(end - start) / CLOCKS_PER_SEC << "sec.\n";
    }
}
```
Pythonモジュール別の画像読み込み方法比較

目的
--

様々なPythonモジュールにおける画像ファイルの読み込み方法、および読み込まれた画像の状態についてまとめる

ラインナップ
--

* pillow
* openCV
* torchvision (PyTorchのサブモジュール)
* keras.preprocessing.image
* scikit-image
* imageio (画像入出力に特化したシンプルなライブラリ)
* imgaug (画像前処理ライブラリ)

比較
--

### 前提

```python:
import numpy as np
import pathlib

from PIL import Image
import cv2 as cv
import skimage
import imageio
import imgaug as ia
from keras.preprocessing import image as k_prep_img
import torchvision

path = pathlib.Path("path/to/the/image/file")

```
### 比較表

| |  pillow  |  openCV  | torchvision | keras.preprocessing| skimage | imageio | imgaug |
|---| ----     | ----     | ----       | ----     | ----    | ----    | ---    |
| 画像読み込み |  `Image.open(path)`  | `cv.imread(path.name)` | `torchvision.io.read_image(path)` | `k_prep_img.load_img(path)`   | `skimage.io.imread(path)` | `cv.imageio(path)` | `ia.imageio.imread(path)` |
| 画像の状態 |  Imageオブジェクト  | numpy配列 | tensor | numpy配列  | numpy配列 | numpy配列| numpy配列|
| チャネル順 | RGB | BGR | BGR | 調査中 | RGB | RGB | RGB |

### 補足

* openCVではpathlibのPathオブジェクトをそのまま引数に与えることができなかったので`.name`としてファイル名を取り出している。
* pillowで読み込んだ画像をnumpy変換するには`np.asarray(image)`とするが、元のImageオブジェクトの保有するデータへの参照としてのnumpy配列が作られるので、デフォルトで`flags.writable = False`になっている。処理する前提でnumpyにしたい場合は`np.array(image)`とすればいい。


### 所感
imageioが一番シンプルに書ける。

### TODO
処理速度の観点での比較をする