OmniAICreator/Qiita-1.07M huggingface dataset:
STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版(16) モーターを回そう

STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (15) TimerでLチカしようの続きです。
https://qiita.com/usashirou/items/59410a385ac930e0f5b2
今回は、PWMを使用してモーターを回してみましょう。
##使用機材
マイコンでモーターを直接駆動させることは難しく、モータードライバーやMOSFETなどを使用します。
今回は、AlieExpressで売っていたMX1508を使用しました。
ただし、MX1508は1枚50円以下ですが、10Vまでの電圧にしか対応していないので今回はUSBの５Vで動作させます。
MX1508は入力電圧を調整することで回転数を変更することができます。
NucleのDAC（PWM)をそれぞれの入力に入れて動かします。
（モータードライバーによっては出力調整のピンが各方向1個のものと、それぞれのものなどがあります）
![DSC_0936 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/20f13ce5-84eb-9f34-8505-289b851f9430.jpeg)
今回使用するモーターは、エンコーダーモーターを使用しました。
定格が12Vですが5Vで使用します。
DCモーター等でも使用可能です。
6本の端子がありますが、今回は、モーター駆動用の2ピンのみ使用します。
##設定
プログラムを作ってみましょう。
今回は、Timer1のCH1とCH2を使いモーターを駆動させます。
使用する周波数はServoモーターと同じ50Hzとします。

STM32CubeIDEを使ってみよう How To STM32CubeIDE 日本語版 (13) PWMでサーボモーター（SERVO)を動かしてみよう
を参考に設定しましょう。
https://qiita.com/usashirou/items/2d0fedf59a3cef083b87
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3b25b9d2-6450-642d-4481-67788ed9dfaa.png)
___ClockSource:InternalClock___
___Channel1:PWM　Generation CH1___
___Channel2:PWM　Generation CH2___
___Count Settings___
___Prescaler:840___
___Count Perioad:1000___
___クロック周波数:42MHz___
![image.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F285344%2F3b1c569c-98ff-9e9f-5c24-d5a2e9a88d19.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=060cb4ee0dffb85b631c17601f40d41f)
これでPA8とPA9がPWM出力として使えるようになります。
##プログラム
プログラムです。
PWMスタート

```
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
```
停止

```
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
```
回転

```
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,200);
__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
```

##メインプログラム
```
  /* USER CODE BEGIN 2 */
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      /*Add Code*/
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,300);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,500);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,0);
      HAL_Delay(2000);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,0);
      __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,300);
      HAL_Delay(2000);
  }
```
##接続
それでは、最後に、マイコンとモータドライバ、モーター、電源を繋いでみましょう。
STM32Nuleoの５VとGNDを＋－に
PA8とPA9をIN1、IN2に接続
Out1、Out2をモーターにつなぎます。
![DSC_0942 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/e88e7fd8-9771-6469-21c8-8268a5581172.jpeg)
プログラムを実行するとモーターが回転すると思います。
以上でモーターを回す事が出来ました。
物理Macを購入せずにMacInCloudでmacOSを使いたい話

　（はじめに断っておきます。MacInCloudを使いこなせているわけではないのであしからず）

　Mac高いですよね。動作確認などのためにMacを利用するだけで、1ヶ月に1回も起動しないよ、っていう場合には物理Macはなかなか所有したくならないと思います。（誤解を防ぐために言っておくと、私はMacユーザーであった時期もあり、決してMacは嫌いではありません。）

　そんな時に、クラウドでMacをレンタルできるサービス、[MacInCloud](https://www.macincloud.com/)があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/96faca6e-a0e9-f385-3976-3365da967c79.png)

　このサービスは、 RDP 【Remote Desktop Protocol】 リモートデスクトッププロトコルを使って、リモートでMacを操作することができます。手元のスクリーンショットはこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/1e743489-456a-6627-cd07-0b2f41c5c06c.png)


プランは３種類あるのですが、個人的には一番左側のPay-As-You-Goがいいかなと思っています。1時間毎に1ドルという非常にわかりやすい料金設定でして、たとえば、1ヶ月に8時間Macを使うとしてだいたい1000円以内におさまります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/0d96c5e6-0c70-ce33-4724-65c1e8ba26b8.png)

## Homebrew

ところが、このプランでは`sudo`が使えないという問題がありまして、homebrewなどのパッケージマネージャを気持ちよく利用することができません。
これについて、

https://superuser.com/questions/619498/can-i-install-homebrew-without-sudo-privileges
https://www.scivision.dev/macos-homebrew-non-sudo/

を見ると

```sh
mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

のコマンドで任意の場所にhomebrewをインストールできるようです。そして、`bin/brew` をパスに追加すれば良いようです。

```sh
export PATH=$HOME/homebrew/bin:$PATH
```

　~~しかし元々インストールされているhomebrewとバッティングしないか、どこかで動作がおかしくならないかというようなことは不安ですね。~~　この分野について知見が有る方はぜひコメント欄などで情報を教えてください。

 その後特に問題なく使えていますのであんまり気にせず使っていけば大丈夫なようです。設定は  `.zshrc` に書いておけば、ログイン時に自動に上書きされます。こんな感じで好きなツールを割と自由に入れていけることがわかりました。

この記事は以上です。


## Pay-As-You-Go プランは60日間ログインしないと消える

Pay-As-You-Go プランは従量制だからといって、60日間ログインしないでいると、サブスクリプションの表示は残っていてもログインできなくなってしまうようです。その場合は既存のプランのサブスクリプションを解約して、あたらしくサブスクリプションを取り直す必要があるようです。

Macをリモートで使えるだけでも便利なサービスですが、実際に利用するのはなかなか面倒くさいですね。
Qiita記事のテンプレート

Qiitaの記事を書くためのテンプレート例ですが、自分が利用しているものです。
このテンプレートをコピペして利用すれば、記事の構成が統一して書きやすくなります。

# ポイント、結論
結論ありき。まず最初に一番重要な点を書いておきます。
ここを読んだだけで、何を言いたいのかがすぐにわかるように簡潔な記載とします。
箇条書きが望ましい。

```:言いたいこと

- あれはこれです
- これはあれです

```

# 前提・目的
前提知識や条件を箇条書き。なしでもいい。

例）

- Markdown記法について理解していること
- 

※ 前提知識はことらが参考になります。xxxxx


# 詳細
結論の内容を説明する詳細な内容を説明します。
番号付き見出しでまとめます。

## 1. Windowsのカット・ペーストのショートカットを利用
かくかくしかじかの説明 xxxxxxxx

## 2. ステータスラインの表示
かくかくしかじかの説明 xxxxxxxx


# 参考文献
参考にした、参考になるドキュメントや記事のリンクを貼っておきます。


---
（上記テンプレートのマークダウンのフォーマット）
---
```
Qiitaの記事を書くためのテンプレート例ですが、自分が利用しているものです。
このテンプレートをコピペして利用すれば、記事の構成が統一して書きやすくなります。

# ポイント、結論
結論ありき。まず最初に一番重要な点を書いておきます。
ここを読んだだけで、何を言いたいのかがすぐにわかるように簡潔な記載とします。
箇条書きが望ましい。

```:言いたいこと

- あれはこれです
- これはあれです

```:
# 前提・目的
前提知識や条件を箇条書き。なしでもいい。

例）
- Markdown記法について理解していること
- 

※ 前提知識はことらが参考になります。xxxxx


# 詳細
結論の内容を説明する詳細な内容を説明します。
番号付き見出しでまとめます。

## 1. Windowsのカット・ペーストのショートカットを利用
かくかくしかじかの説明 xxxxxxxx

## 2. ステータスラインの表示
かくかくしかじかの説明 xxxxxxxx


# 参考文献
参考にした、参考になるドキュメントや記事のリンクを貼っておきます。

```
【Jest】Deprecation Warning: Option "mapCoverage" has been removedが出た時

## エラー内容

```bash:エラー内容
● Deprecation Warning:
Option "mapCoverage" has been removed, as it's no longer necessary.
```

## 対応方法

`jest.conf.js` の `mapCoverage: true` を削除

```diff:jest.conf.js
-  mapCoverage: true,
```
【Unityインターハイ:1】現役高校生の金賞道



**コロナ禍**で高校の練習がなくなり、代わりにゲーム作りを始めてみました。
調べてみて**Unityインターハイ**という学生のゲーム作り大会があったので
金賞獲得に向けて頑張っていくのでそれを記録していきます。



![Unityインターハイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178661/d4e4c687-0a00-2de9-0f5d-8f99fb8898e8.png)

___
とはいえ、実は年始からゲーム作りは始めていたので拙いながら一応形はできています。
作っているゲームは大きな部屋の中で**スタート地点からゴール地点に向かう**タイプの**アクションゲーム**で、
部屋の中にある**時計を視界の中央に捉える**と**自分以外のオブジェクトが止まる**というシステムを
上手く使って進んでいく、という形式です。まだステージが１つしかないですがプレイ映像を載せときます。

<iframe src="https://www.youtube.com/embed/lHpPHHZwFXU" frameborder="0" width="790" height="450" />

ひとまず今回はここら辺で終わります。次は他のステージ作るかゲームクリアとかのシーン遷移をもっと滑らかにするかもです。
テスト

#結局テストはいつ行えばよいのか

それではいつ、どんなふうにテストを行えばよいのでしょうか。この点を理解するために、テストを行う目的をもう一度確認してみましょう。著者は、テストには次の3つのメリットがあると考えます。

テストが揃っていれば、機能停止に陥るような回帰バグ（Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること）を防止できる。
テストが揃っていれば、コードを安全にリファクタリング（機能を変更せずにコードを改善）できる。
テストコードは、アプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ。
上の3つのメリットは、テストを先に書かなくても得ることができますが、それでもテスト駆動開発（TDD）という手法をいつでも使えるようにしておけば、間違いなく多くの場面で役に立ちます。テストの手法やタイミングは、ある意味テストをどのぐらいすらすら書けるかで決まると言ってよいでしょう。たいていの開発者は、テストを書くのに慣れてくるとテストを先に書くようになります。その他にも、アプリケーションのコードと比べてテストがどのぐらい書きにくいか、必要な機能をどのぐらい正確に把握しているか、その機能が将来廃止される可能性がどのぐらいあるかによっても異なってくるでしょう。

こういうときのために、「テスト駆動」にするか「一括テスト」にするかを決める目安となるガイドラインがあると便利です。著者の経験を元に、次のようにまとめてみました。

アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる（=簡単に書ける）のであれば、「先に」書く
動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を「後で」書く
セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合、テストを「先に」書く
バグを見つけたら、そのバグを再現するテストを「先に」書き、回帰バグを防ぐ体制を整えてから修正に取りかかる
すぐにまた変更しそうなコード（HTML構造の細部など）に対するテストは「後で」書く
リファクタリングするときは「先に」テストを書く。特に、エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする
上のガイドラインに従う場合、現実には最初にコントローラやモデルのテストを書き、続いて統合テスト（モデル/ビュー/コントローラにまたがる機能テスト）を書く、ということになります。また、不安定な要素が特に見当たらないアプリケーションや、（主にビューが）頻繁に改定される可能性の高いアプリケーションのコードを書くときには、思い切ってテストを省略してしまうこともあります。

https://railstutorial.jp/chapters/static_pages?version=6.0#cha-static_pages
【Qiita】カードスタイルリンクの表示をどうにかした方がいい

https://github.com/NurseAngel/javascript-risingstars

http://nurseangel.sakura.ne.jp/qiita/dummy

https://github.com/NurseAngel/javascript-risingstars

ふたつめはフィッシングサイトです。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/36ba2e86-32e7-e92c-8293-232d39de498d.png)


全く区別できませんね。

先日<a href="https://qiita.com/release-notes#%E8%A8%98%E4%BA%8B%E3%83%9A%E3%83%BC%E3%82%B8%E5%86%85%E3%81%AEurl%E3%82%92%E3%82%AB%E3%83%BC%E3%83%89%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F">記事ページ内のURLをカードスタイルで表示するようにしました</a>という変更がありましたが、全ての表示項目を操作可能で、元URLも表示されないため、完全に見分けのつかないフィッシングリンクを作ることが可能です。

テキストリンクであればリンク先URLが表示されないので閲覧者側で気を付けることもできるのですが、カードスタイルはリンク先URLの捏造が可能なので、これ間違いなく騙されますよね。
本来のURLを常に表示するとかしたほうがいいと思います。
vimrc設定の簡単な説明

vimを便利に利用するには自分の好みに合わせてvimrcへの設定が必要になりますが、私がよく利用する内容について初心者にもわかるような説明を記録しておきます

# ポイント
- Windowsのクリップボートとの連携をWindowsの標準のショートカットキー(CNTL + c , CNTL + v)で利用できるようにする
- ステータスラインを利用し編集中の文章の基本情報(文字コードなど)を常に表示する

# vimrc設定例
```:.vimrc
source $VIMRUNTIME/mswin.vim
behave mswin
" yでコピーした時にクリップボードに入る
set guioptions+=a
set clipboard+=unnamed

inoremap <S-CR> <Esc>

syntax enable
set number
colorscheme darkblue

set guifont=ＭＳ_ゴシック:h14:cSHIFTJIS


" search related settings .........................
set tabstop=4
set autoindent
set cursorline
set hlsearch
" Escの2回押しでハイライト消去
nnoremap <Esc><Esc> :nohlsearch<CR><ESC>
set incsearch
set ignorecase
set scrolloff=10
" 対応する括弧を強調表示
set showmatch

" ツールバーを非表示
set guioptions-=T

" vim の矩形選択で文字が無くても右へ進める
set virtualedit=block
" 挿入モードでバックスペースで削除できるようにする
set backspace=indent,eol,start

" ステータスラインに候補を表示
set wildmenu

set laststatus=2  "常に Status Line を表示する 
set statusline=%F%m%h%w\ %<[ENC=%{&fenc!=''?&fenc:&enc}]\ [FMT=%{&ff}]\ [TYPE=%Y]\ %=[CODE=0x%02B]\ [POS=%l/%L(%02v)]
```
AWS Organizations とは？

## 勉強前イメージ

Organizationsは組織だから、
IAM的なまとめるやつ？

## 調査

### AWS Organizations とは？

複数のAWSアカウントを統合し、ポリシーベースで一元管理できるアカウント管理サービスです。
アカウントグループに複数のアカウントを参加させることで、グループ単位でのポリシー集中管理をすることができ、
複数アカウントに対する一括請求も行えます。

### AWS Organizations の特徴

- AWSアカウントの一元管理

複数アカウントに適用するポリシーを管理できます。
グループを作成し、そのグループに対してポリシーを適応することでサービスへの使用を制限できます

- サービスのアクセス制御

OU(組織単位) や SCP(サービスコントロールポリシー) を使用ことで
複数のアカウントで使用できるAサービスを管理することが出来ます。

- アカウント作成・管理

アカウントの作成・管理を行うことが出来ます。
APIを使用することで新規アカウント発行・グループに追加を行い、すぐに使用することが出来ます。

- 複数アカウントへの一括請求

マスターアカウントを使用して、組織で使用したAWSの費用を統合して支払うことが出来ます。

### イメージ図

イメージとしては以下です。
rootアカウント配下にOUの組織があり、その中に個別のAWSアカウントがいる。
また、OUごとにポリシーを適応している感じです。

![1AWS Organizations とは - diagrams.net - Google Chrom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5079bcf7-5878-cfbe-fe7a-fd32f7177d31.png)


### よく使われる言葉

- 管理アカウント

↑のイメージ図でいうとrootアカウントのことです、きちんと書けてなくてすみません。

- メンバーアカウント

個別のAWSアカウントのこと。

- OU

組織単位のグループのことで、ネストすることも出来るので
複数のOUのグループが入ってるOUを作ることも出来ます(ネストは最大5つまで)。

- SCP

サービスコントロールポリシーのことで
組織のアカウントでプリンシパル(アカウントルート, IAMユーザー, IAM ロール)にアクセスできるサービスアクションを管理することが出来ます。

## 勉強後イメージ

一括請求とアカウントの一元管理が素直にわかりやすい。
管理してる側からすると、個別のAWSアカウントの請求が別個で来るとめちゃくちゃめんどくさいやろし
会社で使うなら必要なサービスだと思う。

## 参考

- [AWS Organizationsとは?](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_introduction.html)
- [Amazon Web Services／AWS Organizationsとは](https://www.ossnews.jp/oss_info/AWS_Organizations)
Windows7 をインストール後、Windows Update が 80072EFE エラーでできない場合の対処方法

Windows7 をインストール後、Windows Update が 80072EFE エラーでできない場合の対処方法です。

おそらく Windows Update する際のダウンロード先の署名が切れているので直接アップデーターファイルをダウンロードしてインストールします。
ダウンロードには IE では心細いので IE を使って Chrome をインストールしておきます。

次のリンクからダウンロードできます。

32bit 版か 64bit 版かはご利用の環境から選んでください。

- [Windows6.1-KB3138612-x64.msu](https://www.catalog.update.microsoft.com/Search.aspx?q=KB3138612)
- [windows6.1-kb976932-x64_74865ef2562006e51d7f9333b4a8d45b7a749dab.exe](https://www.catalog.update.microsoft.com/Search.aspx?q=kb976932)
- [windows6.1-kb2533552-x64_0ba5ac38d4e1c9588a1e53ad390d23c1e4ecd04d.msu](https://www.catalog.update.microsoft.com/Search.aspx?q=kb2533552)
- [windows6.1-kb3020369-x64_5393066469758e619f21731fc31ff2d109595445.msu](https://www.catalog.update.microsoft.com/Search.aspx?q=kb3020369)
- [windows6.1-kb3125574-v4-x64_2dafb1d203c8964239af3048b5dd4b1264cd93b9.msu](https://www.catalog.update.microsoft.com/Search.aspx?q=kb3125574)

ちなみに Vmware などで Windows7 でライセンス認証を行ったにもかかわらず、Windows10 へアップグレードする際にプロダクトキーが見つかりませんって出る場合はフロッピーディスクの接続をオフにして起動してみてください

[Windows、VMware PlayerにWindows8を入れようとしたら「無人応答ファイルから productkey 設定を読み取れません。」エラー｜マコトのおもちゃ箱　～ぼへぼへ自営業者の技術メモ～ ](http://piyopiyocs.blog115.fc2.com/blog-entry-406.html)
PyTorchを使ったアプリをHerokuにディプロイする際の注意点

#はじめに
PyTorchで予測モデルを作成し、WEBインターフェースを作成してHerokuにディプロイする際に軽くハマったのでメモ

# 環境
- Heroku (無料枠)
- PyTorch 1.7.1 (CPU版)

#現象
## ERROR: Could not find a version that satisfies...が発生

pytorch(GPU版)を使うため、requiments.txtに```torch==1.7.1+cpu```を入れたのだが、以下のエラーが表示されビルドできない。

```sh

$git push heroku master
(中略)
remote:          Downloading tensorboard_plugin_wit-1.8.0-py3-none-any.whl (781 kB)
remote:        ERROR: Could not find a version that satisfies the requirement torch==1.7.1+cpu (from -r /tmp/build_5a7f1f2b/requirements.txt (line 37)) (from versions: 0.1.2, 0.1.2.post1, 0.1.2.post2, 1.4.0, 1.5.0, 1.5.1, 1.6.0, 1.7.0, 1.7.1, 1.8.0)
remote:        ERROR: No matching distribution found for torch==1.7.1+cpu (from -r /tmp/build_5a7f1f2b/requirements.txt (line 37))
remote:  !     Push rejected, failed to compile Python app.
・・・
```

恐らく```+cpu```という指定の仕方に対応していないものと思われる。

##Compiled slug size: XXX M is too large (max is 500M).　が発生

気をとりなおして、```torch==1.7.1+cpu```　から ```+cpu``` を除外し、```torch==1.7.1```　にしてやってみる。すると、今度は圧縮時に以下のエラーが。

```sh
$git push heroku master
(中略)
remote: -----> Compressing...
remote:  !     Compiled slug size: 866M is too large (max is 500M).
remote:  !     See: http://devcenter.heroku.com/articles/slug-size
・・・
```

何がこんなに容量を食っているのかと思ってメッセージを遡ってみると...

```sh
(中略)
remote:        Collecting tensorboard==2.4.1
remote:          Downloading tensorboard-2.4.1-py3-none-any.whl (10.6 MB)
remote:        Collecting tensorboard-plugin-wit==1.8.0
remote:          Downloading tensorboard_plugin_wit-1.8.0-py3-none-any.whl (781 kB)
remote:        Collecting torch==1.7.1
remote:          Downloading torch-1.7.1-cp38-cp38-manylinux1_x86_64.whl (776.8 MB)
remote:        Collecting torchaudio==0.7.2
remote:          Downloading torchaudio-0.7.2-cp38-cp38-manylinux1_x86_64.whl (7.6 MB)
remote:        Collecting torchvision==0.8.2
remote:          Downloading torchvision-0.8.2-cp38-cp38-manylinux1_x86_64.whl (12.8 MB)
remote:        Collecting tqdm==4.59.0
・・・
```

なんとPyTorchが**776.8MB**も使っているではないか。

#対策
恐らくGPU版だからデカいのだろうと思い、CPU版を指定する方法を色々調べたところ、requiments.txtのPyTorchの行に前に以下のような記載をすることでCPU版がインストールされ、サイズも600M近く縮小され、無事ディプロイされた。

```requirements.txt
--find-links https://download.pytorch.org/whl/torch_stable.html
torch==1.7.1+cpu
```

つーか、Herokuについてもっと勉強せなあかん! サイズ制限なんて知らなかったよ。

#参考

- [Install PyTorch from requirements.txt](https://stackoverflow.com/questions/60912744/install-pytorch-from-requirements-txt)
Rubyの分割代入ってどうやるんだっけ

# これ何

最近Javascriptの勉強をしていて、Rubyの分割代入ってどうするんだっけ...? と気になったので、まとめる。

Javascriptの分割代入とは次のようなコードです。

```javascript
[a, b, ...c] = [1, 2, 3, 4]
a
// => 1
c
// => [3, 4]
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

# 答え
rubyでは多重代入と呼ぶらしい。

```ruby
a, b, *c = [1, 2, 3, 4]
a
# => 1
c
# => [3, 4]
```

https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html#multiassign

## 参考文献
https://qiita.com/yancya/items/c557864f307d429bbde4
Microsoft PL-900(Microsoft Power Platform Fundamentals)試験

##この記事について
・PL-900試験に合格したので、備忘録的なメモです。
・今回ははじめて自宅での受験を行ったので、あわせて記載します。


##受験した理由
・先月、たまたま時間があったので、Microsoft Power Platform Virtual Training Dayに参加しました。
　これは4時間くらい動画を見るだけで、PL-900試験を無料で受講できるという、超おススメセミナーです。
　MSは定期的にこういったセミナーがあるので素敵です。

・また、先日のMicrosoft Igniteで、Power Automate Desktop　Windows10の全ユーザーで利用可能となるといった記事もありました。
　ということは、早めに基礎をしっかり身につけておけばよいかと思いました。


##勉強の仕方
・さすがにMicrosoft Power Platform Virtual Training Day のメモだけでは合格できないと思いましたので、以下を利用して勉強しました。

### MS Learn
・ まずはこれが基本ですよね。「Microsoft Power Platform の基本」を読みました。
　 いくつかは英語のページしかなかったので、Googleさんに助けてもらいました。
　 ただし問題が少なく、ちょっと不安が残りました。


###Youtube
・MS Learnだけでは心もとなかったのと、実際の画面イメージを見たかったことから
　Youtubeで動画を探したら、沢山ありました。とくに以下の２つ役に立ちました

　①Japan Power Platform User Group　はじめてのPower Apps 2020
　　https://youtu.be/q7f1zNjRnRc
　　イチからアプリの作り方を説明してくれる、素晴らしい動画です。
　　PowerAppsとPower Automate については、この動画でほぼ理解できます。
　　（第1回～第4回くらいまで見ればOK）

　②App in a Day@Home Power Apps ハンズオン概要
　　https://youtu.be/VtshHNXUn6c?list=PL1RqQ3kddIpa0plPbFZ2ExF-hCnazx-Rd
　　こちらもイチから作り方を説明してくれる動画です。
　　CDSやモデル駆動型アプリ、ビジネスフローについてよくわかりました。


##試験申し込み＆試験
・Microsoft Power Platform Virtual Training Day に参加していたので、無料でした。
・ピアソンまで移動するのが面倒だったので、今回はじめて自宅で受験しました。

###自宅で受験する時
・前日までに環境のテストをするようにと表示されました。
　カメラやスピーカーが動作するか、ネットワーク帯域が十分かなど、手順にしたがって
　確認することで、10分程度で完了しました。

・当日は10時からの試験開始でしたが、30分前にログインするようにとのことでした。
　顔写真や身分証明書の写真、PC周りの写真などをとってアップロードすると、
　監督者とのチャットになります。
　PCをぐるっと一周させて机周りを確認したり、腕時計がないことをチェックされます。
　私の場合、机の左前にあるものは何か？といわれ、しっかりカメラで映すように
　求められました（クローゼットだったのですが、本棚と間違えられたようです）。

・各ツールで何ができるのか、とくにPowerAppsのキャンパス・モデル駆動型・ポータルの違いはしっかり覚えておいたほうが良いと思いました


##結果
・終了ボタンを押したらすぐに「合格」が表示されました。
・770点くらいでしたが、結果オーライということで。

##今後について
・Microsoft Ignite challenge に参加すると、また無料試験枠をもらえるようのなので
　そのあたりを狙おうかと思っています。
・これから試験受ける方、頑張ってください！！
一度Vueで作ったwebpack.config.jsをReactに切り替える

一度Rails + Vue + Webpackで環境構築をしたものの、Reactに切り替える必要が出てきた。
そのときにやったことをまとめましたので良かったら参考にしてください。


# VueからReactへの切り替え

## ①package.jsonの切り替え

### vueに関する設定をいくつか削除

```
npm uninstall vue vue-loader vue-template-compiler
```

### reactを動かすための設定を読み込む

```
npm install -D webpack babel babel-loader babel-core @babel/core
```

これでまずはbabelを動かせるようにする。

次にbabelでreactを動かせるようにする

```
npm install @babel/preset-react @babel/preset-env
```

この2つ入れたら解決した。

結果的にpackage.jsonはこんな感じになる

```json
"devDependencies": {
    "babel": "^6.23.0",
    "babel-core": "^6.26.3",
    "babel-loader": "^8.2.2",
    "css-loader": "^5.0.1",
    "style-loader": "^2.0.0",
    "vue-loader": "^15.9.6",
    "vue-template-compiler": "^2.6.12",
    "webpack": "^5.11.1",
    "webpack-cli": "^4.3.1"
  },
  "dependencies": {
    "axios": "^0.21.1",
    "vue": "^2.6.12",
    "vue-axios": "^3.2.2",
    "vue-router": "^3.4.9"
  }
```

## ②webpack.config.jsを設定

ここはbabel.config.jsというのを設定するやり方もあるらしい。

両者の区別は以下の記事が参考になった。webpack.configで設定するやり方もあるよーって感じらしい。

https://karuta-kayituka.hatenablog.com/entry/2018/09/06/175701

```js
const path = require('path');
module.exports = {
  
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
        options: {
          presets: ['@babel/preset-env', '@babel/preset-react']
      }
      }
    ]
  },
} 
```

いじったのはmoduleのrules

やったこと
- jsxを読み込めるように拡張子を追加
- loaderをbabel-loaderに変更
- options>presetsを記述。これでbabelでreactを読み込む

## ③エントリーファイルの記述の変更

エントリーファイルのmain.jsをvueではなくreactの記述に変える。

```js
import React, { Component } from 'react';
import ReactDOM from 'react-dom'
import App from './App.jsx';

ReactDOM.render(
  <App/>,
  document.getElementById('app')
)
```



reactをimportしてReactDOM.renderでコンポーネントを読み込む。

## ④App.jsxの作成

コンポーネントの親としてApp.jsxを作る。
ポイントはReactをインポートすることとexport defaultを記述すること。

```jsx
import React, { Component } from 'react';
class App extends React.Component {
  render () {
    return (
      <div className="container">
        <header>

        </header>

        <h1>Hello! React</h1>
      </div>
    )
  } 
}

export default App;
```



あとはコンパイルするだけ。

```
webpack
```

これで無事compileできた。
[jq] TrelloからエクスポートしたJSONファイルを整形・集計する

JSONファイルは `cat example.json` なり第二引数に渡すなり適当に。

## 環境

- MacOSX 10.15.7
- jq 1.6

## プロパティの絞り込み

```
.cards | map({id, name})
```

## 閉じていないカードの一覧

```
.cards | map(select(.closed|not))
```

## 閉じていないリストの一覧

```
.lists | map(select(.closed|not))
```

## 閉じていないリストを { [id]: name } 形式にする

```
.lists |
map(select(.closed|not)) |
map({key: .id, value: .name}) |
from_entries
```

## カスタムフィールドのドロップダウンリストの一覧

名前が `Size` のカスタムフィールドから、ドロップダウンの値を数値として取得する。

```
.customFields[] |
select(.name == "Size") |
.options |
map({key: .id, value: .value.text | tonumber}) |
from_entries
```

## カードとリストの連結

カード一覧にリストの名前を連結する。

```
(
    .lists |
    map(select(.closed|not)) |
    map({key: .id, value: .name}) |
    from_entries
) as $lists |

.cards |
map(select(.closed|not)) |
map({id, name, idList, nameList: $lists[.idList]})
```

## カスタムフィールドの集計

各リストのカードに紐づけられている `Size` カスタムフィールドの値を集計する。

```
(
    .lists |
    map(select(.closed|not)) |
    map({key: .id, value: .name}) |
    from_entries
) as $lists |

(
    .customFields[] |
    select(.name == "Size")
) as $sizeCustomField |

(
    $sizeCustomField.options |
    map({key: .id, value: .value.text | tonumber}) |
    from_entries
) as $sizeCustomFieldOptions |

.cards |
map(select(.closed|not)) |
map({
    id,
    name,
    idList,
    nameList: $lists[.idList],
    size: (
        .customFieldItems[] |
        select(.idCustomField == $sizeCustomField.id) |
        $sizeCustomFieldOptions[.idValue]
    )
}) |
group_by(.idList) |
map({
    idList: .[0].idList,
    nameList: .[0].nameList,
    size: ([.[].size]|add)
})
```
QIIME2のメタデータにAlpha多様性を追加して解析を楽にする

## はじめに
QIIME2では、データがqzaに格納されて、qzvに変換することで可視化できるようになる。
qzaからqzvにすると、[QIIME2 view](https://view.qiime2.org/)内で可視化できて、インタラクティブに図表を確認したりできる。

だけど、QIIME2のデフォルトのグラフはダサいし、結局のところみんな「Download raw data as TSV」とかで出力して、Rのggplot とかPythonのmatplotlib とかにデータを入れ直して、図表や統計解析をやり直しているような気がしている。

なので、多様性指数1個1個のqzaファイルをqzvファイルに変換するのと、QIIME2 Viewにそれぞれ投げるのも面倒なのでその手間を省きたい。
QIIME2 公式ドキュメントにあった[Metadata in QIIME 2](https://docs.qiime2.org/2021.2/tutorials/metadata/)というページを参考にして、のちの多様性解析が少し楽にできた。

## メタデータにAlpha多様性を追加する
多様性解析が少し楽にするためにも、Alpha多様性指数みたいな1サンプルにつき1つの値と決まっているカテゴリは、メタデータに結合したほうがいい。

これは、Rだと[qiime2r](https://github.com/jbisanz/qiime2R)パッケージを用いてできるが、せっかくなら全部QIIME2内で作成したいなあと思っていたところ、以下のコマンドを実行したらalpha多様性指数をメタデータに結合できた。

```bash
qiime metadata tabulate \
--m-input-file metadata.tsv \
--m-input-file faith_pd_vector.qza \
--m-input-file shannon_vector.qza \
--m-input-file observed_features_vector.qza \
--m-input-file evenness_vector.qza \
--o-visualization metadata-combined-adiv.qzv
```

ちなみに、[“Moving Pictures” tutorial](https://docs.qiime2.org/2021.2/tutorials/moving-pictures/)に則って解析していると、`core-metrics-results`というディレクトリに、多様性解析に関わる各種.qzaファイルが格納されている。今回記事内で取り上げているデータも“Moving Pictures” tutorialから取ってきた。

## 可視化して確認してみる

[QIIME2 view](https://view.qiime2.org/)に`metadata-combined-adiv.qzv`を読み込ませる。
赤線で囲った範囲に、列に各種Alpha多様性指数が追加されている。

![スクリーンショット 2021-03-07 8.02.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222325/62956f9c-08b7-6953-7e4c-ae7d2f5e9cb7.png)

ここで、まさかの手動作業が入ってしまうが、QIIME2 viewの画面左上の「**Download metadata TSV file**」で出力する。

あとは`metadata.tsv`を、PythonやRでもう煮るなり焼くなり、好きにしてくれっ！！
【タスクスケジューラ】日時を指定してプログラムを実行する

pythonを使用してExcelファイルの操作を勉強しています。
本日の気づきは、厳密にはPythonの復習ではなくWindowsのタスクスケジューラに関してです。
pythonでExcelを操作しているので、openpyxlというパッケージを使用しています。

定時で行っていることがあるならミスを避けるためにも自動でしてほしかったりします。

Pythonの機能でも出来るそうなのですが私には敷居が高い気がしましたので
Windowsのタスクスケジューラを使って実装してみます。

# タスクスケジューラ
スタートメニューを表示して検索フォームに「タスクスケジューラ」と入力すると出てきます。
私は今後もお世話になりそうだったのでタスクバーにピン留めました。

## タスクを作成
タスクスケジューラを起動し上部、もしくは右部の「操作」から「タスク作成」をクリック。

### 全般の設定
先ずは作成画面の「全般」タブにタスクの名前や説明を入力します。
特に説明はどのようなことをするのか、詳しく記述した方がよさそうです。
(忘れっぽいのでここは個人的に注意です。)

###### セキュリティオプション
同じく「全般」のタブ下部です。
初期値は「ユーザーがログオンしているときのみ実行する」にチェックが入っているのですが
今回のタスクはシャットダウン時でも行ってほしかったので
(私の場合、そもそも電源を入れ忘れていることが多いので・・・。)

- 「ユーザーがログオンしているかどうかにかかわらず実行」と
- 「最上位の特権で実行する」

の二か所にチェックを入れなおしました。

※本来は「ユーザーがログオンしているかどうかにかかわらず実行」のみ、チェックを入れれば良いようなのですが
これだと、私のＰＣでは実行エラーが出てしまいました。（0x800710E0）
やはりＰＣは自分で初期設定した方が知識も付きますし、応用力も上がりますね。
今回はいい経験になりました。

###　トリガーの設定
次に、何時そのタスクを実行するのか「トリガー」を設定します。
タブ下部にある「新規」をクリックしてトリガーの内容を決めて行きます。
私の場合は毎月20日の朝9時に実行してほしかったので

- 「毎月」にチェック
- 　開始のカレンダーはそのまま。
- 　時間を「9:00:00」に設定。

こちらだけ設定し、「ＯＫ」ボタンをクリック。

### 操作設定
お次はどのような内容を行うのか「操作」を設定します。
タブ下部にある「新規」をクリックしてトリガーの内容を決めて行きます。
ここがちょこっと初心者には敷居が高かったように感じました。

###### プログラム/スクリプト
今回はPythonを使用するので「pythonw.exe」のパスを入力します。
どこに入れたか忘れた場合は(私がそうでした)
スタートメニューを表示して検索フォームに「pythonw.exe」と入力すると出てきますので
アイコンを右クリックして「プロパティ」を選択。
表示された内容の中の「場所」が絶対パスなのでこちらをコピーし貼り付けます。
あくまでもそのアイコンがある場所なので語尾に「\pythonw.exe」を付けるのを忘れずに。

###### 引数の追加
こちらは実行させたいプログラムのファイル名を記述
コマンドライン引数を渡したい場合は半角スペースを開けて入力します。

###### 開始
上部のファイルがある場所のパスを記述。
こちらもスタートメニューから検索をかけてもいいですし
VScodeであればファイル名を右クリックでパスをコピーできるのでこちらの方が手軽かもしれません。
(こちらの場合はパスの中にファイル名も記述されるので、ファイル名は削除する必要があります。)

### 条件
タスクを実行するかどうかを判断する「条件」を設定します。
個人的にバッテリー電源の時には実行してほしくなかったので、初期値のままにしています。

### 設定
上記以外の追加設定を「設定」で行います。
が、特に変更するものもなかったので、初期値のままにしています。

### パスワード設定と念のための確認
ログオフ時もタスク実行を選んだので最後にパスワードを入力してタスクの作成は完了です。
これで、タスクスケジューラウインドウ中央上部のタスク一覧に作成したタスクが表示されているはずなので
念のため右クリックから「実行する」をクリックして動作するか確認します。
エラーが起きたりした場合は
同様に右クリックから「プロパティ」をクリックするとタスク設定の上書き修正が行えます。

一応、タスクを実行できたかどうかはタスク一覧から確認できるのですが
個人的にはプログラムファイルの方にもログを出力できるようにしておいた方がよいと感じました。

今回のタスクスケジューラは今後も利用していく頻度が高そうなので
色んな状況を考えて設定をするためにも要勉強だなと感じます。
また、ＰＣ購入時に初期設定をお願いしていたのでどのような設定をされていたのかもわかり
そちらも大変有意義でした。

初期設定をしてくれた方、ありがとうございました！
RESTアーキテクチャ

#REpresentational State Transfer（REST）

Rails関連の書籍を読んでいると “REST” という略語をよく見かけます。これはREpresentational State Transferの略です。RESTは、インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャのスタイルの1つです。REST理論そのものはかなり抽象的ですが、RailsアプリケーションにおけるRESTとは、アプリケーションを構成するコンポーネント（ユーザーやマイクロポストなど）を「リソース」としてモデル化することを指します。これらのリソースは、リレーショナルデータベースの作成/取得/更新/削除（Create/Read/Update/Delete: CRUD）操作と、4つの基本的なHTTP requestメソッド（POST/GET/PATCH/DELETE）の両方に対応しています。（HTTP requestメソッドの詳細については3.3で、具体的にはコラム 3.2で説明します）。

Rails開発者にとっては、RESTfulなスタイルを採用することで、作成すべきコントローラやアクションの決定が楽になります。作成（C）・取得（R）・更新（U）・削除（D）を行うリソースだけでアプリケーション全体を構成してしまうことすら可能です。ユーザーやマイクロポストなどに関しては自然にリソース化できるので問題ありません。第14章では、「ユーザーをフォローする」というやや複雑な課題について、REST理論を用いた自然で効率的なモデリングを披露します。

https://railstutorial.jp/chapters/toy_app?version=6.0#sec-exercises_demo_user_has_many_microposts
RailsとjQueryでalert表示を自動で消える様にしてみた

こんにちは、たにーです。

railsを学習中に、ふと
「alertメッセージをリロードで消すのも面倒だなー」と思い、
<h4>自動的に消える(フェードアウトする)</h4>
効果を実装しました。

意外と簡単でしたので、よかったら試してください。

#手順は簡単
①alertコードを部分テンプレート化する
②viewにrenderの記載
③jQueryを使用する為にjsファイルに記載する。

これだけです。

#①alertコードを部分テンプレート化する
application.html.erbに基本、alertを表示するコードを記載しているかと思います。
※下記では、コードを見やすくする為にrbファイルで記載。注意してください。

記載する場所は、
app/views/layouts/application.html.erb になります。

```application.rb
#実際は、「~.html.erb」ファイルです。

  <body>
  <% if flash[:notice] %>
   <div class="alert alert-success alert-dismissible fade show" role="alert">
    <p class="notice"><%= notice %></p>
    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
    <span aria-hidden="true">&times;</span>
    </button>
    </div>
   <% end %>
    :
    :
    <%= yield %>
  </body>
```

次に、上記のファイルがあるディレクトリに
　_　をつけて新しくファイルを作成してください。

格納先及びファイル名は、
app/views/layouts/_application.html.erb になります。

```_application.html.rb
#実際は、「~.html.erb」ファイルです。

  <% if flash[:notice] %>
  <div class="alert alert-success alert-dismissible fade show" role="alert">
   <p class="notice"><%= notice %></p>
   <button type="button" class="close" data-dismiss="alert" aria-label="Close">
   <span aria-hidden="true">&times;</span>
   </button>
  </div>
  <% end %>
```

#②viewファイルにrenderを記載。
①で使用したファイルにrenderを記載します。
rederを記載することによって、先ほど部分テンプレート化したファイルを表示させることが出来ます。

```application.rb
 <body>
  <% if flash[:notice] %>
   <%= render partial: "layouts/application" %>
    :
    :
    <%= yield %>
  </body>
```

#③jQueryを使用する為にjsファイルに記載する。
 
記載する場所は、
app/assests/javascripts/application.js になります。

```application.js

 $(function(){
  setTimeout("$('.alert').fadeOut('slow')", 3000) 
})
```

こうしてみたいなーって思った時に
試しにやってみるってのが一番効率よく覚えられる気がする！！！

簡単な事だけど、案外できない事だと思ってます。

以上、たにーでした。


#参考文献

RemoNote
https://remonote.jp/rails-flash-settimeout
MX LinuxにMariaDBをインストールする

# はじめに
この記事ではMX LinuxというDebianベースのLinuxにデータベース管理システムの一つであるMariaDBを[LAMP setup](https://mxlinux.org/wiki/networking/lamp-setup/)をもとに、インストールする方法を紹介します。

環境
MX Linux: MX 19.3 patito feo
Maridb: Ver 15.1(x86_64)

####そもそもMariaDBとは
MariaDBはMySQLというオープンソースなデータベース管理システムの親戚です。MySQLは世界で最も多く使われているデータベースのうちの一つです。
ではなぜ今回MySQLではなく、MariaDBを選択したかというとMySQLがMX Linuxでは利用することができない（と思われる）ためです。また上記の公式ページではMariaDBをMySQLの代替として紹介しているので、それに従います。

####MariaDBの導入
ターミナルを起動し、rootユーザになりましょう。

    su - 
MariaDBのサーバをインストールします。

    apt install mariadb-server

serviceコマンドでmysqlを起動します。

    service mysql start
停止したいときはstartの代わりにstopを指定してください。
boot時に起動するようにします。

    update-rc.d mysql defaults
セキュリティを高めるため以下のコマンドを実行し、パスワードを設定してください。

    mysql_secure_installation
ここで最初はエンターを押して、y/nで質問されたところはｙを入力してください。パスワードは各自好きなものを入力しましょう。設定し終えたら、再起動してください。
再起動後、ターミナルを起動し、

    mysql -u root -p
でサーバにログインすることができるようになります。パスワードは先程設定したものを使用してください。


以上です。

####終わりに
お疲れさまでした!!
良いデータベースライフを送ってください!!
AcronisCyberBackup12.5の制約

##1. AcronisCyberBackup12.5について

Acronisは商用製品のバックアップソフトの中でも、かなり安く購入できて、ユーザインタフェースが優秀なので、使いやすいですが、その分細かいところで制約がいくつかあるため、選定する際には気を付けなればなりません。
とはいえ、ほとんどのバックアップソフトで実施可能な機能は備わっているため、難しいことをしなければ、Acronisで良いかと。

##2. AcronisCyberBackup 12.5ができないこと
自分の経験で困ったAcronisの制約について紹介します。
(バージョンアップにより制約がなくなる可能性があります。)

####2.1. ESXi6.7以上のバックアップはできない
 
vCenterServerでHAクラスタを組む場合は、バックアップをとらなくても問題ないことが多いです。（障害発生していないサーバに仮想マシンを移行し、その間に再構築をするため）それでも災害発生などで全滅したときに備、バックアップを取りたい場合があります。しかし、AcronisではESXi6.7以上はバックアップできません。7.0がすでにリリースされ、また、2年後ぐらいにはサポート対象外となるため、早くバックアップ可能なようにしてもらいたいものです。

####2.2. テープへxfsファイルシステムをディスク単位でバックアップすると、ファイル単位でのリストアができない

ディスク単位バックアップをストレージにとる場合は、ファイル単位でのリストアが可能ですが、テープへxfsディスクをバックアップした場合は、ファイル単位でリストアすることができません。ファイル単位でバックアップしましょう。(xsf以外のファイルシステムの場合は、ディスク単位でバックアップをとってもファイル単位でリストア可能ですが、オプション設定が必要なので注意です。)

####2.3. LVMの場合は、Acronis Web　コンソールからのリストができない
LVMでパーティションを切る場合は、ブータブルメディアからしか、リストアできません。

####2.4. スナップショットが実行できない場合はエージェンレスは不可能
AcronisでVMware ESXi上の仮想マシンをエージェントレスでバックアップするときは、一時的にスナップショットを採取してバックアップを実行します。そのため、スナップショットが取れない環境だと、バックアップできません。エージェントバックアップを実行しましょう。
(Acronisに限った話ではないが・・・)

####2.5. バックアップ先メディアがWindowsにマウントされたディスク出ない場合は、重複排除がきかない
AcronisはWindowsにマウントされたメディアをStorageNodeというタイプで登録をします。、StorageNodeへバックアップを採取する場合に限り、重複排除の制御が可能です。
テープやNSF経由の共有領域やLinuxなどにマウントされたメディアについては重複排除は不可能です。

####2.6. 重複排除を有効化すると、高速バックアップが不可能
高速バックアップはバージョン12形式というバックアップ形式で実行できます。重複排除はバージョン１１形式でのみ可能なため、重複排除を有効化すると、高速バックアップは実行できません。


##3. ライセンス
AcronisCyberBackupのライセンスは非常に簡単です。
仮想環境であれば、仮想ホスト用で**VirtualHostライセンス**、物理サーバであれば、**Serverライセンス**を購入します。オプションは**Standard**か**Advanced**のみです。

特にVirtualHostライセンスでは、仮想マシンに対し、エージェントバックアップ、エージェントレスバックアップをどちらも有効化するため、仮想マシンの数を気にせずライセンスを購入することができます。

バックアップ対象/バックアップ先がシンプルな構成で、リストアもマシン全体のみ復元する（データ飲み復元は考慮しない）など、難しいことしない場合は、他のバックアップ製品より安いので、選定しても良いかと。

###4. 参考URL
https://www.acronis.com/ja-jp/support/documentation/AcronisCyberBackup_12.5/index.html#36537.html
ログインの仕組みの一例

前提条件
認証したいテーブルにデータが一件以上入っていること

1. select * from 認証テーブル where email=? and password=? を実行した際にデータが一件取得できるかどうか
2. 取得できたらそのユーザーのemail(ユーザー名やでもよい、乱数文字列(トークン)がセキュリティー的に安全)をセッションに保存します。
3. ブラウザのクッキーのセッションIDとサーバ側のセッションIDが同じであるか調べる。
3. 同じであれば認証成立、アクセスできないページではそのセッションがあるかないかで条件分岐します。
NginxでのIPアドレスキャッシュ対策をしたら、hostsファイルが読めなくなった話

# 初めに
この記事はNginxのresolverにローカルホスト（127.0.0.1）のdnsmasqで構築したDNSを指定したことにより起きたインシデントについて書いていますので、resolverにローカルホスト以外を設定しようとしている方にはほぼ関係のない内容となっています。

# NginxのIPアドレスキャッシュについて
他のブログなどで散々説明されているので簡単に説明すると、Nginxは起動したタイミングでproxy_passに記載されているURLの名前解決を行い、それをTTLに関係なく再起動もしくは設定更新までキャッシュするというものです。DNS側でIPアドレスが変わったとしても、古い情報で通信を行ってしまいます。
キャッシュしないようにする解決策としてはresolverを設定し、proxy_passに変数を使用するというものです。対策法方が悪かったわけではないのですが、今回の事件はこの対策を行ったために起こってしまいました。

# 対策前の環境
上記対策をとる前の環境として、Nginxは/etc/hostsを参照して他のサーバのドメイン名を解決し、そこに存在しないドメイン名は別サーバの上位DNSに問い合わせていました。

# 対策後の環境
対策をした結果、Nginxと同じサーバにdnsmasqを用いたDNSを構築し、新たに追加されたresolverの設定には、これまた新たに構築したDNSで名前解決を行うよう127.0.0.1を設定しました。そうすることで、Nginxはhostsファイルを直接参照せずにdnsmasqを通してhostsファイルを参照することになります。上位DNSのくだりは対策前と変わりません。

# 何がダメだったのか
対策前後で違う点はNginxがhostsファイルをdnsmasq経由で参照するようになったことです。お恥ずかしい話ですが、dnsmasqを用いてDNSを構築するのは初めてのことであったため、hostsファイルの内容が更新された際にdnsmasqの再起動が必要だということを知らなかったのです。
hostsファイルとは、自分の中では編集したら即時反映のイメージであったがためにdnsmasqを通した途端に再起動が必要になるとは思ってもいませんでした。
dnsmasq自体は今回の対応以前からサーバにインストールされており、しかし使用されてなかったため再起動したことなど一度もありません。そのため今日まで更新されてきたhostsファイルがdnsmasqに反映されておらず、対策反映後にdnsmasqを通したhostsファイルの参照で名前解決ができずに通信エラーとなってしまいました。
たとえ今回のデプロイのタイミングでdnsmasqのインストールから起動までを行ったとしても、結局後にhostsファイルに変更が加わることがあれば、その変更を参照することができずに通信エラーとなっていたでしょう。

# まとめ
dnsmasqでhostsファイルを参照している場合は、編集した際の再起動を徹底しなければなりませんね。
NUC10でもNICが認識する最新のESXiイメージを作る

# きっかけ
後輩がNUC10を購入したが、NICが認識しないとのこと。
[こちら](https://www.virtuallyghetto.com/2020/09/esxi-7-0-update-1-now-includes-nic-driver-for-intel-nuc-10.html)によると、ESXi 7.0u1からは認識する模様。
ところが、[前の記事](https://qiita.com/air-gh/items/bac1dd333ca429416867)みたいに、最新版のISOイメージは何故かダウンロードできず。
また、[前の記事](https://qiita.com/air-gh/items/bac1dd333ca429416867)みたいに、[ESXi-Customizer-PS](https://www.v-front.de/p/esxi-customizer-ps.html)でISOイメージを作るしかないのか。

# ESXi 7.0対応ESXi-Customizer-PS
[こちら](https://blog.eztown.org/2020/06/e495%E3%81%A7esxi7-0%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%9F%E8%A9%B1/)によると、[githubにある最新版](https://github.com/VFrontDe/ESXi-Customizer-PS)は、ESXi 7.0対応とのこと。[確かに](https://github.com/VFrontDe/ESXi-Customizer-PS/commits/master/ESXi-Customizer-PS.ps1)。
これを実行しようとして、はまった点、3点。

## スクリプトの実行が無効
ダウンロードしたスクリプトの実行時に発生。

```powershell
.\ESXi-Customizer-PS.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\hogehoge\Downloads
\ESXi-Customizer-PS-master\ESXi-Customizer-PS.ps1 を読み込むことができません。詳細については、「about_Execution_Policie
s」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\ESXi-Customizer-PS.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

[こちら](https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f)によると、ポリシーの設定スコープをプロセス内に限定できるらしい。これはすてき。
`RemoteSigned`で実行できなかったので、`Bypass`を設定。`Unrestricted`のほうが正しいか。
[本家](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-7.1)によると、`-ExecutionPolicy`は省略可能かも。

```powershell
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
```


## HTMLへのリンクをダウンロードして実行

ダウンロードしたスクリプトの実行時に発生。

```
+ <html lang="en" >
+                  ~
リダイレクト演算子の後にファイルが指定されていません。
```

そりゃそうだ、HTMLは実行できない。大勘違い。

- CodeからClone
- CodeからDownload ZIP
- Rawで保存

などで、PowerShellスクリプトの状態で保存して、実行。

## Could not find a trusted signer
ダウンロードしたスクリプト実行中に発生。
[こちら](https://qiita.com/readomly/items/47a66d496c44d0c9da10)によると、`Export-EsxImageprofile`に`-NoSignatureCheck`を付けるとよさそう。

# 結果
以上対応して`ESXi-Customizer-PS.ps1`を実行し、長めに待つと、期待通り最新7.0u1のISOイメージが完成。
めでたく、NUC10でNICを認識。

# 謝辞
実験台になってくれた後輩に圧倒的感謝。
gitでcommitしたあとemailを変更する

[githubで"Keep my email addresses private"をONにしている](https://docs.github.com/en/github/setting-up-and-managing-your-github-user-account/blocking-command-line-pushes-that-expose-your-personal-email-address)と、

```
git config --local user.email "12345678+xxxxxxxx@users.noreply.github.com"
```

のようにダミーのメールアドレスを設定して、運用することになる。
`--global`していれば問題ないのだろうが、localに設定していると、git cloneした時に設定し忘れて、git pushした時にエラーになって気がつく。
直前のcommitで気がつけば比較的簡単に、

```
git commit --amend --author="NAMAE <12345678+xxxxxxxx@users.noreply.github.com>"
```
とすれば修正できる。
複数commitしてからpushする時に気がついたら、["Git-のさまざまなツール-歴史の書き換え"](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)にあるように、rebaseを使うか、filter-branchを使う。
tor + proxychains4のメモ

初めてやったのでメモ



# 最終的にやりたいこと

+ `firefox <--> pc <--> proxy <--> tor <--> proxy <--> web`的な感じ
    + 多段プロキシ，多段串
    + `tor`の前後で踏み台したい
        + 出口ノードが諸々のサービスに弾かれすぎですことよ！
        + 入口ノード前のproxyは`tor`提供のbridgeか
+ なるべくCLIで完結する
    + `tor browser`単体では不自由だった
+ VPNは使わない
    + ISP側やサービス側からの検知の対策のために本来なら優秀なVPNを使うべき
    + VPN over (Tor over VPN)ほどの硬さは要らないしクソ重いとは聞く
    + というかVPNがよくわからん，まぁ別に悪いことしないしヘビーユーザになる気もないし…
+ `VB`上の`Linux`で完結させる
    + `VB`はまったくわからないが頑張りたいなぁ
+ 完全な興味本位





# 今回やったこと
Big Surでやってる，`VB` + `Linux`はやってない，本当はその方がいいに決まっているのに…
CLIでちょっとしたプロセスの通信を`proxychains`を使って`tor -> proxy`の順番で通す


## Tor側

### 導入
```shell
brew install tor
# => /usr/local/Cellar/tor/0.4.5.6
# => As alias, /usr/local/bin/tor
# => As config file example, /usr/local/etc/tor/torrc.sample
```

### 設定
`torrec.sample`を複製して`torrec`を同じ場所に置く，それがconfigとして読み込まれる
デフォルトに手を加える必要は特になし，下手にいじると自分が中継点として使われることになるらしい
`localhost:9050`で公開されるのでブラウザのプロキシをそこに合わせるとtorでブラウジングできる

もしbridgeを使いたい場合は`obfs4proxy`ライブラリを別途で入手した上で再度`torrec`を弄る必要がある，tor browserとは異なりtorにはデフォルトでは入っていない
（そして`obfs4proxy`はhomebrew未登録なので面倒になった）


## proxychains側

### 導入
```shell
brew install proxychains-ng
# => /usr/local/Cellar/proxychains-ng/4.14
# => As alias, /usr/local/bin/proxychains4
# => As config file, /usr/local/etc/proxychains.conf
```

### 設定
デフォルトで`proxychains.conf`があるのでちょっと編集する

```shell
vim /usr/local/etc/proxychains.conf
```

最後の方の`[proxy list]`を

+ `socks5 127:0:0:1 9050`
+ `socks5 <出口ノード先の串IP> <出口ノード先の串ポート>`

にする

プロトコル的には`http`でも`https`でも`socks4`でもなく`socks5`対応の串の方が良さそう
[ここの無料プロキシリスト](https://spys.one/en/socks-proxy-list/)で割とヒットできたのでおすすめ



## その他
`curl`や`traceroute`などは`homebrew`等から別途に落としたものを使う
macOSのデフォルトのコマンドだとなぜか`proxychains`の恩恵を受けられない

`homebrew`は`tcptraceroute`になってたし，`curl`は`/usr/local/bin/curl`のエイリアスができなかった
エイリアスを作って`/usr/local/bin/`にはっつけてPATHの優先順位を変えてみたり`bash`のプロファイルに直でエイリアスを作ってみたりしたけど，なぜか呼び出しを上書きできなかった…



## 動作

試しにipを掘ってみる

```shell

$ brew services start tor
# homebrewでinstallしたものはこれで管理できるらしい

$ proxychains4 /usr/local/Cellar/curl/7.75.0/bin/curl inet-ip.info
# curlは /usr/local/Cellar/curl/7.75.0/bin/curl みたいな場所にあるはず
# 成功したら串のipが表示される

$ proxychains4 tcptraceroute google.com
# こんな事は出来なかった

```


これができただけだった…


# 今後かんがえたいこと

+ `VB`ってどうやって使うのだ？
    + これ，メモリとか通信とかどうすればいいのだ…
+ `proxychains`は後のタスクを抱え込んでるだけでは？
    + つまり`tor + proxychain`への入口として働く汎用な`localhost`は立てられないか？
    + `macOS`で`proxychains4 open -a FireFox`しても`proxychains`が効かないが，linuxで`proxychains4 firefox`すると[どうも効くっぽい（動画参考）](https://www.youtube.com/watch?v=Llw3QijK8m4)，しかし`VB`上となるとこれができるかどうか想像がつかん，やってみなければわからない
+ **これは本当に正しく効率的に`proxychains over Tor`を実現しているのか？**
    + `tor`を落として`curl`するとエラーを吐くしレイテンシ的にもそれっぽい…
    + そういえば`ping`系コマンドは`icmp`の民なので`proxychains`というかプロキシ自体に[従わない](https://superuser.com/questions/442995/is-ping-not-supposed-to-work-via-proxychains)そう，もしレイテンシをプロキシ込みで測りたいなら，webベースでスクリプトを提供しているものを使うことがおすすめ…
たった数行でオブジェクト指向を飛躍的に理解する


## 目的

たった数行のコードをこねくり回すことで、オブジェクト指向を飛躍的に理解できる(といいな)という記事です。

## こんな人に良いかも

* オブジェクト指向プログラミングが何ってのはだいたいわかってる。
* 継承よりも移譲が良いとか知ってるが、なんかまだ腑に落ちない。
* サービスがいけないとかきくけど良くわからない。

## よくある元のコード

```java
   // データを読み込みむ
   List<Data> dataList = readDataList()
   for( data : dataList ){
        // 対象のステータスなら
        if( data.status == 2 ) {
             // フィールドを変更
             data.updatedFiled = hoge
             // 更新する
             updateData( data )
        }
   }
```

## 1. サービスを使ってリファクタ!?

```java
  // データを読み込みむ
  List<Data> dataList = readDataList()
  // データを更新する
  dataUpdateService.updateData( dataList ) // むしろ何してるのか、わからん感じになったような・・・
```

サービス"クラス"を作って"移譲"しました。よくあるリファクタですね。
でも、これはあまりよろしくないのです。その理由を探っていきましょう。


## 2. クラスなど使わずにリファクタ

```java
  // データを読み込みむ
  List<Data> dataList = readDataList()
  // 対象のステータスで絞り込む
  targetList = findByTargetStatus( dataList )
  // フィールドを変更
  changedDataList = changeUpdateFileds( targetList )
  // 更新する
  updateData( changedDataList )
```

オブジェクト指向を理解する記事なのにクラスを使わずリファクタ。
そして、この変更こそが、もっとも重要でメインな内容です。元のコードと比べてみましょう。

サービスのリファクタに比べて、処理の流れは追いやすいと感じませんか。

## 3. オブジェクト指向プログラミングに

言うても、どこがオブジェクト指向の記事なんだよ。となってしまうので
オブジェクト指向プログラミングとしてオブジェクトを色々導入してみましょう。

### するをサービスオブジェクトにする

```java
  // データを読み込みむ
  List<Data> dataList = readDataList()
  // 対象のステータスで絞り込む
  targetList = findService.findByTargetStatus( dataList )
  // フィールドを変更
  changedDataList = changeService.changeUpdateFileds( targetList )
  // 更新する
  updateServce.udapteData( changedDataList )
```


### データをオブジェクトにする

```java
  // データを読み込みむ
  DataList dataList = readDataList()
  // 対象のステータスで絞り込む
  dataList.findByTargetStatus()
  // フィールドを変更
  dataList.changeUpdateFileds()
  // 更新する
  updateData(dataList)
```
扱うデータからDataListというオブジェクトを作りました。
ステータスの絞り込みや変更すると、オブジェクトの状態が変わっていきます。

近年は、イミュータブル積を極的に利用して、状態をオブジェクトとして定義して副作用を排除したりする方が多いかも。


## 4. 関数型プログラミングに

```java
   updateFunc = ()-> updateData( changeUpdateFileds( findByTargetStatus( readDataList() ) ) )

   updateFunc()
```

```java
   updateFunc= (reader, updater)-> updater( changeUpdateFileds( findByTargetStatus( reader() ) ) )

   updateFunc( rreadDataList  updateData )
```
とかとか

オブジェクト指向の記事を読んでいたら、なぜか関数型プログラミングという言葉まで。
2のリファクタをすると、このような形にも変えやすいのです。

オブジェクト指向を適切に勉強していくと、関数型言語でもプログラミングでもこれ出来るな。となります。
オブジェクト指向の理解が進んでいくと、処理構造ではなく表現手段の違いだと気付くためです。

## 本題 2のリファクタって何なの？

2の正体は
「対象がやりたいことは何かに注目して、そのやりたいことを中心にして処理そのものも見直す。」
です。

1のサービスクラス導入は、処理をそのままに、クラスに分けて構造だけを変更しました。
比べて、2のリファクタは、厳密に言えば、処理そのものは変えています。
鋭い方には、リファクタか？これと、感じていたかもしれません。

## それってオブジェクト指向なの

2って、全然クラスとか使ってないけど、これがオブジェクト指向なの？と思いますよね。
前述の「対象がやりたいこは何かに注目」というは「オブジェクト指向分析設計」の中で洗練されてきたものなのです。
※究極それにフォーカスしたのが、ドメイン駆動設計だったりもします。

その辺りは略。

## まとめ

オブジェクト指向プログラミングは、関数型言語等の宣言型スタイルに押されて、人への親和性以外は一歩引くことが増えてきました。
モダンな言語では、オブジェクト指向なのに継承が無かったり、オブジェクト指向を継承やクラスありきのプログラミングだけと考えていると混乱しやすいかと思います。

「オブジェクト指向」には、ソフトウェア開発方法論と繋がるような広い世界があること。
さらに、その方法論を学習すると、コードも洗練されていく。ことを何となく知ってもらえると良いかなと思いました。

言ってることは、前に書いた、だいたい下の記事と同じですが、シンプルにしてみました。
https://qiita.com/saitofjp/items/118ba38489b368b6c30c
【C#】文字列の中で"（ダブルクォーテーション）を使う

C#は文字列を使う場合、"（ダブルクォーテーション）で囲む必要があります。

しかし、""の中で"を文字として使いたい場合、普通に"を入れるだけではエラーになってしまいます。


```c#
string str = "Hello"World"; //これはエラー
```

そこで使うのが**エスケープ文字**です。

"の前に\（バックスラッシュ）を入れてみます。

```c#
string str = "Hello\"World"; // Hello"World
```

すると、"が文字として出力できました！

C#での"（ダブルクォーテーション）は文字としてではなく、「文字列を表すもの」として扱われるので、文字として扱いたい場合は\（エスケープ文字）が必要になります。





#参考
https://www.atmarkit.co.jp/ait/articles/1709/27/news017.html
WordPressのカスタマイズ画面でのフォーム項目の出し分け active_callback

これからはFSEの時代ですがまだカスタマイザも2年くらいは現役だろうなという事で覚書。

```
add_action( 'customize_register', 'lightning_customize_register_basic' );
function lightning_customize_register_basic( $wp_customize ) {

	$wp_customize->add_section(
		'lightning_basic',
		array(
			'title'    => __( 'Basic settings', 'lightning' ),
		)
	);
	$wp_customize->add_setting( 'demo_radio_control', array(
		'default'        => 'a',
	 ) );
	  
	 $wp_customize->add_control( 'demo_radio_control', array(
		'label'      => 'radio_control',
		'section'    => 'lightning_basic',
		'settings'   => 'demo_radio_control',
		'type'       => 'radio',
		'choices'    => array(
		'a' => 'Choice A',
		'b' => 'Choice B',
		),
	 ) );

	 $wp_customize->add_setting( 'choice_a_text', array(
		'default' => '',
	 ) );
	  
	 $wp_customize->add_control( 'choice_a_text', array(
		'label'      => 'Choice A: ',
		'section'    => 'lightning_basic',
		'type'       => 'text',
		'active_callback' => 'choice_a_callback',
	 ) );
	 function choice_a_callback( $control ) {
		if ( $control->manager->get_setting('demo_radio_control')->value() == 'a' ) {
		   return true;
		} else {
		   return false;
		}
	 }
}
```

参照
http://ottopress.com/2015/whats-new-with-the-customizer/

Special Thanks
@Toro_Unit
環境構築　5　Railsの導入


#1. bundlerをインストール
Rubyの拡張機能（gem）を管理するためのbundler（バンドラー）をインストール。
ターミナルに入力

```
% gem install bundler --version='2.1.4'
```


#2. Railsをインストール

```
% gem install rails --version='6.0.0'
```


#3. rbenvを再読み込み
rbenvを読み込んで、変更を反映させる。

```
% rbenv rehash
```

#4. Railsが導入できたか確認
Rails 6.0.0のような表示がされれば問題なくインストールが完了。

```
% rails -v
Rails 6.0.0  # 「Rails」のあとに続く数字は変わる可能性があります
```
UnityでListを使ってみよう

今回はUnityでListを使ってみたいと思います。

Listは配列と近いイメージですが、
要素数を気にすることなく、要素の追加、削除など配列ではできない処理ができます。

動的に値を変更できるので「動的配列」とも言われます。
では早速見ていきましょう。



#Listの定義
まずはListの定義からです。

例えば、int型の要素を格納するListを作りたい場合、以下の様に定義します。

```c#

List<int> list = new List<int>(); //int型のListを定義
```
配列では、定義時に長さを指定する必要がありますが、Listはその必要がありません。

Listは最初このように宣言し、後から要素の出し入れをします。

どの型を指定するかは、<>の中に記述します。

配列型も指定することができます。

```c#

List<int[]> list = new List<int[]>(); 
```


#Listに要素を追加する
Listに要素を追加していく方法です。

##Addメソッドを使う
シンプルに要素を1つずつ入れていく方法です。

```c#
List<int> list = new List<int>();

list.Add(10); 
list.Add(20);
list.Add(40);
```


##AddRangeメソッドで配列の要素を入れる
配列の中身を全て追加することができます。

```c#
List<int> list = new List<int>();

int[] a = {10,20,340}; //int型配列

list.AddRange(a); 
```


#Listの要素を取得
正しく値が追加できたか確認するために、Listの中身の取得します。

```c#
List<int> list = new List<int>();

list.Add(3);
list.Add(2);
list.Add(4);

int[] a = { 10, 20, 340 };
list.AddRange(a);

Debug.Log("Listの0番目の値は"+ list[0]); // 0番目の値は3
Debug.Log("Listの長さは" + list.Count); //　長さは6
```

list[0]とするとListの0番目の値を取得できます。これは配列と同じですね。

list.Countとすることで、要素数を取得できます。

またListの全ての要素を順番に取得したい場合は、ループ文を使えばできます。

```c#
for(int i = 0; i < list.Count; i++)
{
    Debug.Log(list[i]);
}
```

#Listから要素を削除
Listから要素を削除するやり方についてです。

##Removeメソッド
特定の要素をListから削除します。

```c#
List<int> list = new List<int>();

list.Add(3);
list.Add(10);
list.Add(4);

int[] a = { 10, 20, 340 };
list.AddRange(a);

list.Remove(10); //10があればListから削除
//3,4,10,20,340
```
##RemoveAllメソッド
Removeメソッドでは該当する値が複数あった場合、削除されるのは最初に見つかった値だけです。

なので、例えば10という値が複数Listに格納されている場合、全てのを削除するにはRemoveAllメソッドを使います。

```c#
List<int> list = new List<int>();

list.Add(3);
list.Add(10);
list.Add(4);

int[] a = { 10, 20, 10 };
list.AddRange(a);

list.RemoveAll(num => num == 10); //全ての10をListから削除

Debug.Log("Listの長さは" + list.Count); //長さは3
//3,4,20
```

##RemoveAtメソッド
Listのインデックス番号を指定して削除ができます。

```c#
List<int> list = new List<int>();

list.Add(3);
list.Add(10);
list.Add(4);

int[] a = { 40, 20, 30 };

list.AddRange(a);
list.RemoveAt(2); // Listの2番目の要素を削除する 
//3,10,40,20,30
```

#おわり
Listを使うことで値を自由に出し入れすることができました。
ということで、Listの基本的な使い方でした。
PHPをherokuでデプロイする！(2)herokuでMySQLを利用する

#はじめに・・・
前回に引き続きPHPとMySQLを使ったアプリのデプロイをherokuを使って行なっていきます。前の記事ではherokuで環境変数の設定について書いてきましたが、今回は前回よりも前の段階であるherokuでMySQLを使う方法について詳しくお伝えします。

##herokuの仕様とは？
そもそもherokuは基本的にpostgreSQLを使用しています。postgreSQLはテーブルの継承、関数のオーバーロードなどの機能を備えており、大規模なシステムやアプリに用いられることが多いそうです。一方MySQLは設定や管理が比較的簡単で、ウェブサイトに適しているとされています。MySQLで作ったアプリをpostgreSQLに移していくのはなかなか段階を踏むことが必要です。

一方、herokuではcleardbというアドオンがあり、これを利用するとMySQLをそのまま使うことができます。ここではこのcleardbの使い方を説明します。

#herokuの基本設定
まずはherokuに登録することが必須となります。アクセスすると新規登録ボタンがあるので登録してしまいましょう。登録自体は無料です。
登録を終えると画像のような画面がヘッダー部分に表示されると思います。

![heroku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891157/e70653fc-bc0f-5880-eec5-6261576b26d1.png)

cleardbを使用するためにはクレジットカードの登録が必要なので、ここで登録してしまいましょう。この画面がでたら、右上の忍者マークをクリックしましょう。そうすると名前と共にメニューが出てくると思うので、Account settingsを選択しましょう。

![heroku2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891157/8e1b8ef5-eb49-b07f-0249-80ede86287c3.png)

そうするとこんな画面が出ていると思うので、Billingを選択すると、クレジットカード登録画面になります。

#MySQLを使えるようにする設定
ここからはMySQLを作成したwebアプリで使えるようにする手順です。まずは前提として、作成したアプリはgit管理しておきましょう。そしてherokuのCLI(コマンドラインインタフェース)をインストールするため、ターミナルに以下のコマンドを入れましょう。

```
$ brew tap heroku/brew && brew install heroku
```

これでPC上でherokuを扱うことができるようになります。

```
$ heroku login
```

ターミナルでこのコマンドを入れると、q以外のボタンを押すとログイン画面にジャンプします。そして、ターミナルでアプリを指定している状態でアプリ作成をしましょう。

```
$ heroku create (アプリ名)
```

アプリ名はアルファベットとハイフンしか使えない(アンダーバーは使用できない)ので注意してください。アンダーバーを使うとエラーが出ます。

いよいよcleardbのアドオンを使えるようにします。以下のように入力します。

```
$ heroku addons:add cleardb:ignite
```

これでcleardbのアドオンを使用可能となります。ちなみに最後にigniteとありますが、igniteプランであれば低容量ながら無料で利用できます。(料金は自分でプランを変更しない限りかからないようです）

これでMySQLの準備ができました。次回はデプロイに必要な他の作業について書いていきます！
なお、初学者であり理解が不足している部分もあるかと思います。何かあればご指摘お願いします。